Subversion Repositories Applications.annuaire

Compare Revisions

No changes between revisions

Regard whitespace Rev 208 → Rev 209

/tags/v1.1-andromede/initialisation.php
New file
0,0 → 1,39
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
// La fonction autolad doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
require_once '/home/aurelien/web/framework/framework/autoload.inc.php';
Application::setChemin(__FILE__);
Application::setInfo(Config::get('info'));
mb_internal_encoding(Config::get('appli_encodage'));
date_default_timezone_set(Config::get('fw_timezone'));
 
// Autoload pour cette application
function __autoload($nom_classe) {
// Tableau des chemins à inclure pour trouver une classe relative à ce fichier
$chemins = array(
'composants',
'composants'.DS.'cartographie',
'composants'.DS.'openid');
foreach ($chemins as $chemin) {
$fichier_a_inclure = dirname(__FILE__).DS.$chemin.DS.$nom_classe.'.php';
 
if (file_exists($fichier_a_inclure)) {
include_once $fichier_a_inclure;
return null;
}
}
}
 
?>
/tags/v1.1-andromede/.settings/org.eclipse.core.resources.prefs
New file
0,0 → 1,20
#Thu Mar 25 17:30:01 CET 2010
eclipse.preferences.version=1
encoding//doc/bdd/annuaire_vocabulaire.ini=UTF-8
encoding//squelettes/annuaire.tpl.html=UTF-8
encoding//squelettes/annuaire_inscription_reussie.tpl.html=UTF-8
encoding//squelettes/annuaire_tela_inscrits_fiche.tpl.html=UTF-8
encoding//squelettes/annuaire_tela_inscrits_inscription.tpl.html=UTF-8
encoding//squelettes/checkbox.tpl.html=UTF-8
encoding//squelettes/index_annuaire.tpl.html=UTF-8
encoding//squelettes/liste_annu.tpl.html=UTF-8
encoding//squelettes/liste_ontologie.tpl.html=UTF-8
encoding//squelettes/liste_ontologie_ajout.tpl.html=UTF-8
encoding//squelettes/liste_ontologie_modification.tpl.html=UTF-8
encoding//squelettes/mail_confirmation_inscription.tpl.html=UTF-8
encoding//squelettes/metadonnee_ajout.tpl.html=UTF-8
encoding//squelettes/metadonnee_modification.tpl.html=UTF-8
encoding//squelettes/select.tpl.html=UTF-8
encoding//squelettes/text.tpl.html=UTF-8
encoding//squelettes/textearea.tpl.html=UTF-8
encoding/<project>=UTF-8
/tags/v1.1-andromede/controleurs/ApplicationExterneControleur.php
New file
0,0 → 1,204
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
/**
* Controleur chargé de la propagation et le rassemblement d'informations extérieures
* lors dce la consultation et modification des fiches utilisateurs
*/
Class ApplicationExterneControleur extends AppControleur {
 
private $applications_resume = null;
private $applications_gestion = null;
private $mode_reponse = 'json';
 
public function ApplicationExterneControleur() {
 
$this->__construct();
 
// on charge les variables de classes à partir du fichier de configuration
if(Config::get('url_services_applications_inscription') != null) {
 
$application_str = Config::get('url_services_applications_inscription');
$this->applications_inscription = explode('##',$application_str);
} else {
$this->applications_inscription = array();
}
 
// on charge les variables de classes à partir du fichier de configuration
if(Config::get('url_services_applications_resume') != null) {
 
$application_str = Config::get('url_services_applications_resume');
$this->applications_resume = explode('##',$application_str);
} else {
$this->applications_resume = array();
}
 
// on charge les variables de classes à partir du fichier de configuration
if(Config::get('url_services_applications_gestion') != null) {
 
$application_str = Config::get('url_services_applications_gestion');
$this->applications_gestion = explode('##',$application_str);
} else {
$this->applications_gestion = array();
}
}
 
/**
* parcourt la liste des applications et appelle une adresse spécifique pour l'inscription
* et l'inclut, le cas échéant.
* @param l'identifiant de l'utilisateur
* @param le mail de l'utilisateur
*/
public function ajouterInscription($id_utilisateur, $params) {
 
if(count($this->applications_inscription) > 0) {
foreach($this->applications_inscription as $application) {
 
$inscription = @file_get_contents($application.'Inscription/'.$this->fabriquerRequete($id_utilisateur, $params));
$inscription = json_decode($inscription);
 
if($inscription && $inscription == "OK") {
 
} else {
//echo 'Erreur d\'inscription à l\'application '.$application;
}
}
}
 
return true;
}
 
 
/**
* parcourt la liste des applications et appelle une adresse spécifique pour la modification
* et l'inclut, le cas échéant.
* @param l'identifiant de l'utilisateur
* @param le mail de l'utilisateur
*/
public function modifierInscription($id_utilisateur,$params) {
 
if(count($this->applications_inscription) > 0) {
foreach($this->applications_inscription as $application) {
 
$modification = @file_get_contents($application.'Modification/'.$this->fabriquerRequete($id_utilisateur, $params));
$modification = json_decode($modification);
if($modification && $modification == "OK") {
 
} else {
//echo 'Erreur de modification l\'application '.$application.'<br />'.$modification;
}
}
}
 
return true;
}
 
/**
* parcourt la liste des applications et appelle une adresse spécifique pour la suppression
* et l'inclut, le cas échéant.
* @param l'identifiant de l'utilisateur
* @param le mail de l'utilisateur
*/
public function supprimerInscription($id_utilisateur, $params) {
 
if(count($this->applications_inscription) > 0) {
foreach($this->applications_inscription as $application) {
 
$suppression = @file_get_contents($application.'Suppression/'.$this->fabriquerRequete($id_utilisateur, $params));
$suppression = json_decode($suppression);
 
if($suppression && $suppression == "OK") {
 
} else {
//echo 'Erreur de desinscription à l\'application '.$application;
}
}
}
 
return true;
}
 
/**
* Parcourt le repertoire racine des applications et appelle un web service contenant la méthode
* Resume qui renvoie les informations associées à l'utilisateur qui seront affichées dans la fiche
* de profil
* @param l'identifiant de l'utilisateur
* @param le mail de l'utilisateur
* @return array un tableau associatif dont les clés sont les noms des applis et les valeurs sont le html qui sera
* inclus dans la fiche profil
*/
public function obtenirResume($id_utilisateur, $mail) {
 
$resumes = array();
 
if(count($this->applications_resume) > 0) {
foreach($this->applications_resume as $application) {
 
$resume = @file_get_contents($application.'Resume'.DS.$id_utilisateur.DS.$mail);
 
 
if($resume) {
$resume = json_decode($resume, true);
$resumes[] = $resume;
} else {
$resume = array('elements' => array(), 'titre' => '', 'message' => '');
}
}
}
 
return $resumes;
}
 
/** Parcourt le repertoire racine des applications et cherche un fichier spécifique contenant la méthode
* obtenirResume qui renvoie les informations associées à l'utilisateur qui seront affichées dans la fiche
* de profil
* @param l'identifiant de l'utilisateur
* @param le mail de l'utilisateur
* @return array un tableau associatif dont les clés sont les noms des applis et les valeurs sont le html qui sera
* inclus dans la fiche profil
*/
public function gererInscription($id_utilisateur, $mail) {
 
$gestions = array();
 
if(count($this->applications_gestion) > 0) {
foreach($this->applications_gestion as $application) {
 
$gestion = file_get_contents($application.'Gestion'.DS.$id_utilisateur.DS.$mail);
 
if($gestion) {
$gestion = json_decode($gestion, true);
$gestions[] = $gestion;
} else {
$gestion = array('elements' => array(), 'titre' => '', 'message' => '');
}
}
}
 
return $gestions;
}
 
private function fabriquerRequete($id, $params) {
 
$requete = '?';
 
foreach($params as $cle => $param) {
$requete .= '&'.$cle.'='.$param;
}
 
return $requete;
}
}
 
 
?>
/tags/v1.1-andromede/controleurs/LettreControleur.php
New file
0,0 → 1,240
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
/**
* Controleur permettant l'abonnement à une liste de diffusion
* à travers un mécanisme de mail ou de web services
*/
class LettreControleur extends AppControleur {
 
/** Adresse de base des web services
* ex : http://mail.domaine.com/
*/
private $adresse_service_lettre = null;
 
/**
* Nom du service permettant de s'inscrire
* ex : inscription.php
*/
private $service_inscription_lettre = null;
 
/**
* Nom du service permettant de s'inscrire
* ex : desinscription.php
*/
private $service_desinscription_lettre = null;
 
/**
* domaine de la liste
* ex : domaine.org
*/
private $domaine_lettre = null;
 
/**
* nom de la liste de diffusion
* ex : actualite
*/
private $nom_lettre = null;
 
/**
* adresse mail d'inscription (si on utilise les mails)
*/
private $adresse_inscription_lettre = null;
 
/**
* adresse mail de desinscription (si on utilise les mails)
*/
private $adresse_desinscription_lettre = null;
 
/**
* indique si on utilise les mails ou non
* (si les infos des web services sont entrées, on met cette variable à true)
*/
private $utilise_mail = false;
 
/**
* Constructeur sans paramètres
*/
public function LettreControleur() {
 
$this->__construct();
 
// on charge les variables de classes à partir du fichier de configuration
if(Config::get('adresse_service_lettre') != null) {
$this->adresse_service_lettre = Config::get('adresse_service_lettre');
} else {
$this->utilise_mail = true;
}
 
if(Config::get('service_inscription_lettre') != null) {
$this->service_inscription_lettre = Config::get('service_inscription_lettre');
} else {
$this->utilise_mail = true;
}
 
if(Config::get('service_desinscription_lettre') != null) {
$this->service_desinscription_lettre = Config::get('service_desinscription_lettre');
} else{
$this->utilise_mail = true;
}
 
if(Config::get('domaine_lettre') != null) {
$this->domaine_lettre = Config::get('domaine_lettre');
} else {
$this->utilise_mail = true;
}
 
if(Config::get('nom_lettre') != null) {
$this->nom_lettre = Config::get('nom_lettre');
} else {
$this->utilise_mail = true;
}
// si l'une des variables pour les web services n'est pas valide
 
// alors on utilise les mails
if(Config::get('adresse_inscription_lettre') != null) {
$this->adresse_inscription_lettre = Config::get('adresse_inscription_lettre');
}
 
if(Config::get('adresse_desinscription_lettre') != null) {
$this->adresse_desinscription_lettre = Config::get('adresse_desinscription_lettre');
}
}
 
/** --------------------------------- Fonction liées à l'inscription ou la desinscription à la lettre d'actualité gérée par une liste externe -------------------------------------------*/
/**
* Envoie un mail avec l'adresse de l'utilisateur donné en paramètre,
* à l'adresse donnée en paramètre
* @param string $adresse l'adresse de la liste à laquelle on veut abonner
* @param string $inscrit l'adresse de l'inscrit qui doit être abonné
* @param string $sujet sujet du mail
* @return boolean true ou false suivant le succès ou non de l'envoi
*/
private function envoyerMail($adresse, $inscrit, $sujet) {
 
// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
$entetes = 'MIME-Version: 1.0' . "\r\n";
$entetes .= 'Content-type: text/html; charset='.Config::get('appli_encodage'). "\r\n";
// En-têtes additionnels
$entetes .= 'To: '.$adresse."\r\n";
$entetes .= 'From: '.$inscrit."\r\n";
 
$contenu_mail = '';
 
return mail($adresse, $sujet, $contenu_mail, $entetes);
}
 
/**
* Inscrit une adresse à la lettre d'actu
* @param string $mail le mail à inscrire à la lettre
* @return boolean true ou false suivant le succès de la requete
*/
public function inscriptionLettreActualite($mail) {
 
if($this->utilise_mail) {
return $this->envoyerMail($this->adresse_inscription_lettre, $mail, 'inscription à la lettre d\'actualité');
} else {
$params = '?domaine='.$this->domaine_lettre.'&liste='.$this->nom_lettre.'&mail='.$mail;
//Log::ajouterEntree('lettre','inscription params '.$this->adresse_service_lettre.$this->service_inscription_lettre.$params);
return file_get_contents($this->adresse_service_lettre.$this->service_inscription_lettre.$params);
}
 
}
 
/**
* Desinscrit une adresse à une liste donnée
* @param string $mail le mail à desinscrire à la lettre
* @return boolean true ou false suivant le succès de la requete
*/
public function desinscriptionLettreActualite($mail) {
 
if($this->utilise_mail) {
return $this->envoyerMail($this->adresse_inscription_lettre, $mail, 'desinscription à la lettre d\'actualité');
} else {
$params = '?domaine='.$this->domaine_lettre.'&liste='.$this->nom_lettre.'&mail='.$mail;
//Log::ajouterEntree('lettre','desinscription params '.$this->adresse_service_lettre.$this->service_desinscription_lettre.$params);
return file_get_contents($this->adresse_service_lettre.$this->service_desinscription_lettre.$params);
}
 
}
 
/**
* Desinscrit l'ancien mail d'un utilisateur et réinscrit le nouveau
* @param string $ancien_mail l'ancien mail à desinscrire à la lettre
* @param string $nouveau_mail l'ancien mail à inscrire à la lettre
* @return boolean true ou false suivant le succès de la requete
*/
public function modificationInscriptionLettreActualite($ancien_mail, $nouveau_mail) {
 
if($this->utilise_mail) {
 
$adresse_deinscription_lettre = Config::get('adresse_desinscription_lettre');
$suppression_ancien_mail = $this->envoyerMail($adresse_deinscription_lettre, $ancien_mail, 'desinscription à la lettre d\'actualité');
 
$adresse_inscription_lettre = Config::get('adresse_inscription_lettre');
$ajout_nouveau_mail = $this->envoyerMail($adresse_inscription_lettre, $nouveau_mail, 'inscription à la lettre d\'actualité');
 
return $suppression_ancien_mail && $ajout_nouveau_mail;
} else {
$desinscription = $this->desinscriptionLettreActualite($ancien_mail);
$inscription = $this->inscriptionLettreActualite($nouveau_mail);
 
return ($desinscription && $inscription);
}
 
}
 
/** --------------------------------- Fonction de gestion du champ de données associé à la lettre d'actu (appelés par les web services) -------------------------------------------*/
public function estAbonneLettreActualite($id_annuaire, $id_utilisateur) {
 
$annuaire_modele = $this->getModele('AnnuaireModele');
$champs_description = $annuaire_modele->obtenirChampsDescriptionAnnuaire($id_annuaire);
 
$valeur = $annuaire_modele->obtenirValeurChampAnnuaireMappe($id_annuaire, $id_utilisateur, 'champ_lettre');
 
return $valeur;
}
 
public function abonnerDesabonnerLettreActualite($id_annuaire, $id_utilisateur, $abonner = true) {
 
$annuaire_modele = $this->getModele('AnnuaireModele');
$champs_description = $annuaire_modele->obtenirChampsDescriptionAnnuaire($id_annuaire);
 
$mail_utilisateur = $annuaire_modele->obtenirMailParId($id_annuaire, $id_utilisateur);
 
$champ_lettre = $champs_description[0]['champ_lettre'];
 
if($abonner) {
$valeur = 'on';
} else {
$valeur = '0';
}
 
$verificateur = new VerificationControleur();
$valeur_modif = $verificateur->remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, 'lettre', $valeur, $mail_utilisateur);
 
 
$annuaire_modele = $this->getModele('AnnuaireModele');
$valeur_modif = $annuaire_modele->modifierValeurChampAnnuaireMappe($id_annuaire, $id_utilisateur, $champ_lettre, $valeur_modif);
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->modifierValeurMetadonnee($champ_lettre,$id_utilisateur,$valeur_modif);
 
return $valeur_modif;
}
}
?>
/tags/v1.1-andromede/controleurs/NavigationControleur.php
New file
0,0 → 1,44
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class NavigationControleur extends AppControleur {
public function afficherContenuMenu($id_annuaire, $admin = false) {
$donnees['id_annuaire'] = $id_annuaire;
if($admin) {
$menu = $this->getVue(Config::get('dossier_squelettes_navigation').'menu_admin', $donnees);
} else {
$menu = $this->getVue(Config::get('dossier_squelettes_navigation').'menu', $donnees);
}
return $menu;
}
public function afficherBandeauNavigationUtilisateur($id_annuaire, $id_utilisateur = null, $page = 'fiche') {
if($id_utilisateur == null) {
$id_utilisateur = Registre::getInstance()->get('identification_id');
}
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
$donnees['page'] = $page;
$navigation = $this->getVue(Config::get('dossier_squelettes_navigation').'bandeau', $donnees);
return $navigation;
}
}
/tags/v1.1-andromede/controleurs/OntologieControleur.php
New file
0,0 → 1,162
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class OntologieControleur extends AppControleur {
 
 
/**--------Fonctions de gestion des ontologies --------------------------------*/
 
/**
* charge et renvoie la vue contenant la liste des listes
* @return string le html contenant la liste des listes
*/
public function chargerListeListe() {
 
$this->chargerModele('OntologieModele');
$data['ontologie'] = $this->OntologieModele->chargerListeListes();
$data['titre'] = 'Liste des listes';
$liste_des_listes = $this->getVue(Config::get('dossier_squelettes_ontologies').'liste_des_listes', $data);
 
return $liste_des_listes;
}
 
/**
* charge et renvoie la vue contenant la liste ontologie et ses éléments dont l'identifiant est passé en paramètre
* @param int $identifiant l'identifiant de la liste d'ontologie
* @return string le html contenant la liste et ses éléments
*/
public function chargerListeOntologie($identifiant) {
 
$this->chargerModele('OntologieModele');
 
// On charge les informations de la liste (nom description etc...)
$data['informations'] = $this->OntologieModele->chargerInformationsOntologie($identifiant);
$data['ontologie'] = $this->OntologieModele->chargerListeOntologie($identifiant);
 
$liste_ontologie = $this->getVue(Config::get('dossier_squelettes_ontologies').'liste_ontologie', $data);
 
return $liste_ontologie;
}
 
/**
* Affiche le formulaire d'ajout de liste ontologie
* @param Array $valeurs un tableau de valeurs (dans le cas du retour erreur)
* @return string le formulaire de liste d'ontologie
*/
public function afficherFormulaireAjoutListeOntologie($valeurs) {
 
if(!isset($valeurs['amo_nom'])) {
$valeurs['amo_nom'] = '';
}
 
if(!isset($valeurs['amo_abreviation'])) {
$valeurs['amo_abreviation'] = '';
}
 
if(!isset($valeurs['amo_description'])) {
$valeurs['amo_description'] = '';
}
 
if(!isset($valeurs['amo_ce_parent'])) {
$valeurs['amo_ce_parent'] = '';
}
 
$liste_ontologie_ajout = $this->getVue(Config::get('dossier_squelettes_ontologies').'liste_ontologie_ajout', $valeurs);
 
return $liste_ontologie_ajout;
}
 
/**
* Affiche le formulaire de modification de liste ontologie
* @param Array un tableau de valeurs contenant l'id de la liste (et les élements pour le retour erreur)
* @return string le formulaire de modification ou la liste des liste si l'id est invalide
*/
public function afficherFormulaireModificationListeOntologie($id_ontologie) {
 
if(trim($id_ontologie) != '') {
$this->chargerModele('OntologieModele');
$data['valeurs'] = $this->OntologieModele->chargerInformationsOntologie($id_ontologie);
$liste_ontologie_modification = $this->getVue(Config::get('dossier_squelettes_ontologies').'liste_ontologie_modification', $data);
return $liste_ontologie_modification;
} else {
return $this->chargerListeListe();
}
}
 
/**
* Ajoute une nouvelle liste d'ontologie
* @param Array $valeurs les valeurs à ajouter
* @return string la vue contenant la liste des liste, ou bien le formulaire d'ajout en cas d'erreur
*/
public function ajouterNouvelleListeOntologie($valeurs) {
 
if(isset($valeurs['amo_nom'])
&& isset($valeurs['amo_abreviation'])
&& isset($valeurs['amo_description'])
&& isset($valeurs['amo_ce_parent'])) {
$this->chargerModele('OntologieModele');
$this->OntologieModele->ajouterNouvelleListeOntologie($valeurs);
} else {
return $this->afficherFormulaireAjoutListeOntologie($valeurs);
}
return $this->chargerListeOntologie($valeurs['amo_ce_parent']);
}
 
/**
* Affiche le formulaire d'ajout ou de modification de liste ontologie
* @param Array $valeurs les valeurs à modifier
* @return String la vue contenant liste des liste, ou le formulaire de modification si erreur
*/
public function modifierListeOntologie($valeurs) {
 
if(isset($valeurs['amo_nom']) &&isset($valeurs['amo_abreviation']) && isset($valeurs['amo_description'])) {
$this->chargerModele('OntologieModele');
$this->OntologieModele->modifierListeOntologie($valeurs);
} else {
// TODO: afficher une erreur si la modification n'a pas fonctionné
return $this->afficherFormulaireListeOntologie($valeurs, true);
}
if($valeurs['amo_id_ontologie'] != 0) {
return $this->chargerListeOntologie($valeurs['amo_ce_parent']);
} else {
return $this->chargerListeListe();
}
}
 
/**
* Supprime une liste d'ontologie
* @param int $id_ontologie l'identifant de la liste à supprimer
* @return string la vue contenant la liste des listes
*/
public function supprimerListeOntologie($id_ontologie) {
$id_ontologie_parent = 0;
 
if(trim($id_ontologie) != '') {
$this->chargerModele('OntologieModele');
$infos_ontologie = $this->OntologieModele->chargerInformationsOntologie($id_ontologie);
$id_ontologie_parent = $infos_ontologie['amo_ce_parent'];
$this->OntologieModele->supprimerListeOntologie($id_ontologie);
} else {
// TODO: afficher une erreur si la suppression n'a pas fonctionné
return $this->chargerListeListe();
}
return $this->chargerListeOntologie($id_ontologie_parent);
}
}
?>
/tags/v1.1-andromede/controleurs/AnnuaireControleur.php
New file
0,0 → 1,1375
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class AnnuaireControleur extends AppControleur {
 
 
/**
* Fonction affichant la vue par défaut, ici le menu principal
* @return String la vue contenant le menu
*/
public function index() {
//$this->creerMetadonnee();
if(Registre::getInstance()->get('est_admin')) {
$data = array();
$index_annuaire = $this->getVue('index_annuaire', $data);
 
return $index_annuaire;
} else {
return $this->afficherFicheUtilisateur(Registre::getInstance()->get('identification_id'));
}
}
 
/**
* Fonction d'affichage par défaut
*/
public function executerActionParDefaut() {
 
if(Registre::getInstance()->get('est_admin')) {
$data = array();
$index_annuaire = $this->getVue('index_annuaire', $data);
 
return $index_annuaire;
} else {
return $this->afficherFicheUtilisateur(Registre::getInstance()->get('identification_id'));
}
}
public function creerMetadonnee() {
$this->chargerModele('AnnuaireModele');
$this->chargerModele('MetadonneeModele');
$id_liste_inscrit = $this->AnnuaireModele->migrer();
foreach($id_liste_inscrit as $id_inscrit) {
echo $id_inscrit.'<br />';
 
// S'il existe déjà une valeur de metadonnée pour cette colonne et cet utilisateur
// car on a pu ajouter de nouveaux champs entre temps
if($this->MetadonneeModele->valeurExiste('97',$id_inscrit)) {
// On se contente de la modifier
$this->MetadonneeModele->modifierValeurMetadonnee('97',$id_inscrit,'1');
 
} else {
// S'il n'existe pas de valeur, on ajoute une nouvelle ligne à la table de valeurs de meta données
if($this->MetadonneeModele->ajouterNouvelleValeurMetadonnee('97',$id_inscrit,'1')) {
// Si l'insertion a réussi, on continue
} else {
return false;
}
}
}
 
}
 
/**-------- Fonctions de gestion des annuaires --------------------------------*/
 
/**
* Charge la vue contenant la liste des annuaires gérés par l'application
* @return string la vue contenant la liste des annuaires
*/
public function chargerListeAnnuaire() {
$this->chargerModele('AnnuaireModele');
$data['erreurs'] = null;
$data['annuaires'] = $this->AnnuaireModele->chargerListeAnnuaire();
$liste_annu = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'liste_annu', $data);
 
return $liste_annu;
}
 
/**
* Charge la vue contenant les informations d'un annuaire donné en paramètre
* @param int $id l'identifiant de l'annuaire
* @return string la vue contenant les informations sur l'annuaire
*/
public function chargerAnnuaire($id) {
$this->chargerModele('AnnuaireModele');
$this->chargerModele('MetadonneeModele');
$data['erreurs'] = array();
$data['champs_mappage'] = $this->obtenirChampsMappageAnnuaire($id);
$data['annuaire'] = $this->AnnuaireModele->chargerAnnuaire($id, true);
$data['metadonnees'] = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id);
$annuaire = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'annuaire', $data);
 
return $annuaire;
}
 
/**
* Charge et affiche la liste des inscrits à un annuaire donné en paramètre
* @param $id int l'identifiant de l'annuaire
* @return string la vue contenant les inscrits à l'annuaire
*/
public function chargerAnnuaireListeInscrits($id_annuaire, $numero_page = 1, $taille_page = 50) {
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$data['erreurs'] = array();
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
$champ_id_annuaire = $tableau_mappage[0]['champ_id'];
 
$resultat_recherche = $this->AnnuaireModele->chargerAnnuaireListeInscrits($id_annuaire, $numero_page, $taille_page);
$nb_resultats = $resultat_recherche['total'];
$resultat_recherche = $resultat_recherche['resultat'];
$resultats = array();
foreach($resultat_recherche as $resultat) {
$id_utilisateur = $resultat[$champ_id_annuaire];
$resultats[$id_utilisateur] = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
}
 
// on renvoie une liste identique à celle de la liste des inscrits
$donnees['resultats_recherche'] = $resultats;
$donnees['tableau_mappage'] = $tableau_mappage[1];
$donnees['id_annuaire'] = $id_annuaire;
$donnees['nb_resultats'] = $nb_resultats;
$url_pagination = new URL(Registre::getInstance()->get('base_url_application'));
$url_pagination->setVariableRequete('m','annuaire_inscrits');
$url_pagination->setVariableRequete('id_annuaire',$id_annuaire);
 
$donnees['pagination'] = $this->paginer($numero_page,$taille_page,$nb_resultats,$url_pagination, array());
 
// S'il existe une page de résultats spécifique à l'annuaire pour la recherche
 
if($this->templateExiste($annuaire['informations']['aa_code'].'_resultat_recherche', Config::get('dossier_squelettes_annuaires'))) {
// on l'affiche
$annuaires_inscrits = $this->getVue(Config::get('dossier_squelettes_annuaires').$annuaire['informations']['aa_code'].'_resultat_recherche', $donnees);
} else {
// sinon on prend celle par défaut
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$annuaires_inscrits = $this->getVue(Config::get('dossier_squelettes_annuaires').'resultat_recherche', $donnees);
}
 
return $annuaires_inscrits;
}
 
/**-------- Fonctions d'affichage du formulaire de saisie d'un champ de metadonnée suivant le type de champ---------*/
 
/**
* Affiche le formulaire d'inscription pour un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire pour lequel on veut afficher le formulaire
* @param Array $donnees le tableau de données pour préremplir le formulaire si besoin (en cas de retour erreur)
*/
public function afficherFormulaireInscription($id_annuaire, $donnees=array()) {
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, false);
 
$this->chargerModele('MetadonneeModele');
$donnees['aa_id_annuaire'] = $id_annuaire;
 
$metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
// TODO: ceci charge toutes les métadonnées, voir si l'on ne peut pas parser le formulaire
// pour ne charger que ce qui est nécéssaire
foreach($metadonnees as $metadonnee) {
 
$id_champ = $metadonnee['amc_id_champ'];
$type_champ = $metadonnee['amc_ce_template_affichage'];
$nom_champ = $metadonnee['amc_abreviation'];
 
$metadonnee['aa_id_annuaire'] = $id_annuaire;
if(isset($donnees['erreurs'])) {
$metadonnee['erreurs'] = $donnees['erreurs'];
}
 
if(isset($donnees[$type_champ.'_'.$id_champ])) {
$metadonnee['valeur_defaut']['amv_valeur'] = $donnees[$type_champ.'_'.$id_champ];
}
// on charge le formulaire d'affichage de chacune des métadonnées
$donnees['champs'][$nom_champ] = $this->afficherFormulaireChampMetadonnees($id_champ,$metadonnee);
}
$donnees['tableau_mappage'] = $tableau_mappage[1];
 
// si le formulaire existe, on le charge
if(!$this->templateExiste($annuaire['informations']['aa_code'].'_inscription','formulaires/')) {
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$formulaire_inscription = $this->genererFormulaireInscription($donnees);
} else {
// sinon on en génère un qui contient tous les champs
$formulaire_inscription = $this->GetVue(Config::get('dossier_squelettes_formulaires').$annuaire['informations']['aa_code'].'_inscription',$donnees);
}
 
return $formulaire_inscription;
}
 
/**-------- Fonctions d'inscription -------------------------------------------------------------------------------*/
 
/**
* Lors d'une tentative d'inscription, ajoute les infos dans la table d'inscription
* temporaire et envoie le mail contenant le lien de confirmation si tout s'est bien passé
* @param Array $valeurs les valeurs à ajouter
* @return string la vue contenant la confirmation de l'inscription
*/
public function ajouterInscriptionTemporaire($valeurs) {
 
$this->chargerModele('MetadonneeModele');
$id_annuaire = $valeurs['aa_id_annuaire'];
unset($valeurs['aa_id_annuaire']);
$valeurs_mappees = array();
$valeurs_a_inserer = array();
 
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$verificateur = new VerificationControleur();
 
$valeurs_collectees = $verificateur->collecterValeurInscription($valeurs, $tableau_mappage);
$valeurs_mappees = $valeurs_collectees['valeurs_mappees'];
$valeurs_a_inserer = $valeurs_collectees['valeurs_a_inserer'];
 
// vérification des champs minimaux : nom, prénom, mail, mot de passe
if($erreurs = $verificateur->verifierErreursChampsSelonType($id_annuaire,$valeurs_mappees, $tableau_mappage)) {
$valeurs['erreurs'] = $erreurs;
return $this->afficherFormulaireInscription($id_annuaire, $valeurs);
}
$valeurs_a_inserer['aa_id_annuaire'] = $id_annuaire ;
 
$this->chargerModele('DonneeTemporaireModele');
$code_confirmation = $this->DonneeTemporaireModele->stockerDonneeTemporaire($valeurs_a_inserer);
$mail = $valeurs_mappees[$tableau_mappage[1]['champ_mail']]['valeur'];
$nom = $valeurs_mappees[$tableau_mappage[1]['champ_nom']]['valeur'];
if(isset($tableau_mappage[1]['champ_prenom']) && isset($valeurs_mappees[$tableau_mappage[1]['champ_prenom']]['valeur'])) {
$prenom = $valeurs_mappees[$tableau_mappage[1]['champ_prenom']]['valeur'];
} else {
$prenom = '';
}
$messagerie = new MessageControleur();
$messagerie->envoyerMailConfirmationInscription($mail,
$nom,
$prenom,
$code_confirmation);
// Si tout s'est bien passé, on affiche la page de confirmation
return $this->getVue(Config::get('dossier_squelettes_annuaires').'annuaire_inscription_reussie',array());
}
 
/**
* Ajoute une nouvelle inscription à un annuaire à partir de données d'une table temporaire.
* Typiquement, on déclenche cette fonction en cliquant sur le lien contenu dans le mail de confirmation
* @param int $indentifant L'identifant de session d'une tentative d'inscription
*/
public function ajouterNouvelleInscription($identifiant) {
 
$this->chargerModele('DonneeTemporaireModele');
$valeurs = $this->DonneeTemporaireModele->chargerDonneeTemporaire($identifiant);
 
if(!$valeurs || count($valeurs) == 0) {
$identificateur = new IdentificationControleur();
$donnees['titre'] = 'Erreur d\'inscription';
$donnees['message'] = 'Erreur : aucune demande d\'inscription ne correspond &agrave; ce lien <br />'.
'Si votre demande d\'inscription date de moins de deux semaines, essayez de vous connecter avec les informations fournies lors de l\'inscription<br />'.
'Si votre demande d\'inscription date de plus de deux semaines, alors celle ci doit &ecirc;tre renouvel&eacute;e';
return $this->getVue(Config::get('dossier_squelettes_annuaires').'information_simple',$donnees).$identificateur->afficherFormulaireIdentification(Config::get('annuaire_defaut'), array());
}
 
$this->chargerModele('AnnuaireModele');
 
$id_annuaire = $valeurs['aa_id_annuaire'];
unset($valeurs['aa_id_annuaire']);
 
$this->chargerModele('MetadonneeModele');
 
$verificateur = new VerificationControleur();
 
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$valeurs_mappees = array();
$valeurs_metadonnees = array();
 
$mail_nouvel_inscrit = $valeurs['mail_'.$tableau_mappage[1]['champ_mail']];
$pass_nouvel_inscrit = $valeurs['password_'.$tableau_mappage[1]['champ_pass']];
 
$nom = $valeurs['text_'.$tableau_mappage[1]['champ_nom']];
$mail = $mail_nouvel_inscrit;
$pass = $valeurs['password_'.$tableau_mappage[1]['champ_pass']];
if(isset($tableau_mappage[0]['champ_prenom']) && isset($valeurs_mappees[$tableau_mappage[0]['champ_prenom']])) {
$prenom = $valeurs['text_'.$tableau_mappage[1]['champ_prenom']];
} else {
$prenom = '';
}
if(isset($tableau_mappage[0]['champ_pays']) && isset($valeurs_mappees[$tableau_mappage[0]['champ_pays']])) {
$pays = $valeurs['select_'.$tableau_mappage[1]['champ_pays']];
} else {
$pays = '';
}
 
// on itère sur le tableau de valeur pour récupérer les métadonnées;
foreach($valeurs as $nom_champ => $valeur) {
 
// pour chaque valeur
// on extrait l'id du champ
$ids_champ = mb_split("_",$nom_champ, 2);
 
$type = $ids_champ[0];
$condition = false;
$id_champ = $ids_champ[1];
 
// on fait des vérifications et des remplacements sur certaines valeurs
$valeur = $verificateur->remplacerValeurChampPourInsertion($type,$valeur,$mail_nouvel_inscrit);
 
// Si le champ fait partie des champs mappés
$cle_champ = array_search($id_champ, $tableau_mappage[1]);
if($cle_champ) {
// on ajoute sa clé correspondante dans l'annuaire mappé et sa valeur dans le tableau des champs mappés
$valeurs_mappees[$tableau_mappage[0][$cle_champ]] = $valeur;
// et on supprime sa valeur du tableau de valeurs pour ne pas la retrouver lors
// de l'insertion des métadonnées
unset($valeurs[$nom_champ]);
} else {
$valeurs_metadonnees[$nom_champ] = $valeur;
}
}
 
// cas spécial du champ pays ou l'on fait un double stockage des données
if(isset($tableau_mappage[0]['champ_pays']) && isset($valeurs_mappees[$tableau_mappage[0]['champ_pays']])) {
$pays = $valeurs_mappees[$tableau_mappage[0]['champ_pays']];
$valeurs_metadonnees[$tableau_mappage[1]['champ_pays']] = $pays;
$pays = $this->MetadonneeModele->renvoyerCorrespondanceAbreviationId($pays);
$valeurs_mappees[$tableau_mappage[0]['champ_pays']] = $pays;
}
 
// obtenir l'id du nouvel arrivant en faisant un select sur le mail qui doit être unique
$id_nouvel_inscrit = $this->AnnuaireModele->ajouterInscriptionDansAnnuaireMappe($id_annuaire,$valeurs_mappees, $tableau_mappage[0]);
 
// les champs de metadonnees arrivent avec un identifiant sous la forme type_condition_id
foreach($valeurs_metadonnees as $nom_champ => $valeur) {
 
// pour chaque valeur
// on extrait l'id du champ
$ids_champ = mb_split("_",$nom_champ);
$id_champ = $ids_champ[count($ids_champ) - 1];
 
// Si l'insertion dans la base a réussi
if($this->MetadonneeModele->ajouterNouvelleValeurMetadonnee($id_champ,$id_nouvel_inscrit,$valeur)) {
// on continue
} else {
 
// Si une des insertions échoue, on supprime les méta valeurs déjà entrées.
// La transaction du pauvre en quelque sorte
$this->MetadonneeModele->supprimerValeursMetadonneesParIdEnregistrementLie($id_nouvel_inscrit);
return false;
}
}
 
$appli_controleur = new ApplicationExterneControleur();
 
$params = array (
'id_utilisateur' => $id_nouvel_inscrit,
'prenom' => $prenom,
'nom' => $nom,
'mail' => $mail,
'pass' => $pass,
'pays' => $pays,
'nouveau_pass' => '',
'nouveau_mail' => ''
);
 
// on crée un controleur qui appelle les webservice pour chaque application externe
$resumes_controleur = new ApplicationExterneControleur();
$resumes_controleur->ajouterInscription($id_nouvel_inscrit, $params);
 
// Si tout a réussi on supprime les données d'inscription temporaire
$this->DonneeTemporaireModele->supprimerDonneeTemporaire($identifiant);
 
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, false);
 
// Identifier l'utilisateur !
$identificateur = new IdentificationControleur();
if(config::get('identification')) {
$identificateur->deloggerUtilisateur();
}
$identificateur->loggerUtilisateur($mail, $pass);
 
// S'il existe une page d'accueil spécifique à l'annuaire pour la confirmation d'inscription
if($this->templateExiste($annuaire['informations']['aa_code'].'_inscription_confirmation', Config::get('dossier_squelettes_annuaires'))) {
// on l'affiche
$donnees = array('id_utilisateur' => $id_nouvel_inscrit, 'id_annuaire' => $id_annuaire);
return $this->getVue(Config::get('dossier_squelettes_annuaires').$annuaire['informations']['aa_code'].'_inscription_confirmation', $donnees);
 
} else {
// sinon on le redirige
return $this->afficherFicheUtilisateur($id_annuaire, $id_nouvel_inscrit);
}
}
public function afficherPage($id_annuaire, $id_utilisateur, $page) {
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
$navigateur = new NavigationControleur();
$donnees['navigation'] = $navigateur->afficherBandeauNavigationUtilisateur($id_annuaire ,$id_utilisateur, $page);
if ($this->templateExiste($page, '/pages/')) {
return $this->getVue(Config::get('dossier_squelettes_pages').$page, $donnees);
}
}
 
/**
* Affiche la fiche principale d'un utilisateur
* @param int $id_annuaire l'identifiant de l'annuaire
* @param int $id_utilisateur l'identifiant de l'utilisateur
* @return string la vue contenant la fiche utilisateur
*/
public function afficherFicheUtilisateur($id_annuaire, $id_utilisateur) {
// Chargement des informations de l'utilisateur dans la table annuaire principale
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$tableau_mappage = $this->AnnuaireModele->obtenirChampsMappageAnnuaire($id_annuaire);
 
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
$verificateur = new VerificationControleur();
$champs = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
$donnees['tableau_mappage'] = $tableau_mappage[1];
 
$donnees['champs'] = $champs;
$navigateur = new NavigationControleur();
$donnees['navigation'] = $navigateur->afficherBandeauNavigationUtilisateur($id_annuaire ,$id_utilisateur, 'fiche');
 
/*if(Registre::getInstance()->get('est_admin')) {
$donnees['formulaire_blocage'] = $this->getVue(Config::get('dossier_squelettes_elements').'blocage',$donnees);
}*/
// Si le formulaire spécifique à l'annuaire existe, on l'affiche
if(!$this->templateExiste($annuaire['informations']['aa_code'].'_fiche','/fiches/')) {
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$fiche_inscrit = $this->genererFicheInscrit($donnees);
} else {
// Sinon on prend celui par defaut
$fiche_inscrit = $this->getVue(Config::get('dossier_squelettes_fiches').$annuaire['informations']['aa_code'].'_fiche',$donnees);
}
 
return $fiche_inscrit;
}
 
/** Affiche le resumé des contributions d'un utilisateur
* @param int $id_annuaire l'identifiant de l'annuaire
* @param int $id_utilisateur l'identifiant de l'utilisateur
* @return string la vue contenant les contributions utilisateur
*/
public function afficherFicheResumeUtilisateur($id_annuaire, $id_utilisateur) {
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$champs = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
$mail_utilisateur = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);
 
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
$donnees['mail_utilisateur'] = $mail_utilisateur;
 
$url_modification_profil = new Url(Config::get('base_url_application'));
$url_modification_profil->setVariableRequete('m','annuaire_formulaire_modification_inscription');
$url_modification_profil->setVariableRequete('id_annuaire',$id_annuaire);
$url_modification_profil->setVariableRequete('id_utilisateur',$id_utilisateur);
 
$url_oubli_mdp = new Url(Config::get('base_url_application'));
$url_oubli_mdp->setVariableRequete('m','annuaire_afficher_formulaire_oubli_mdp');
$url_oubli_mdp->setVariableRequete('id_annuaire',$id_annuaire);
$url_oubli_mdp->setVariableRequete('id_utilisateur',$id_utilisateur);
 
$donnees['url_oubli_mdp'] = $url_oubli_mdp;
$donnees['url_modification_profil'] = $url_modification_profil;
 
$donnees['champs'] = $champs;
$donnees['tableau_mappage'] = $tableau_mappage[1];
$navigateur = new NavigationControleur();
$donnees['navigation'] = $navigateur->afficherBandeauNavigationUtilisateur($id_annuaire ,$id_utilisateur, 'resume');
 
// on crée un controleur appelle les hooks de résumé pour chaque application externe
$resumes_controleur = new ApplicationExterneControleur();
 
$donnees['resumes'] = $resumes_controleur->obtenirResume($id_utilisateur,$mail_utilisateur);
$donnees['carte_id'] = $this->getVue(Config::get('dossier_squelettes_fiches').$annuaire['informations']['aa_code'].'_carte_id',$donnees);
 
$fiche_contrib = $this->getVue(Config::get('dossier_squelettes_fiches').$annuaire['informations']['aa_code'].'_resume',$donnees);
 
return $fiche_contrib;
}
 
public function gererInscriptionExterne($id_annuaire, $id_utilisateur) {
 
$this->chargerModele('AnnuaireModele');
$mail_utilisateur = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);
 
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
$url_modification_profil = new Url(Config::get('base_url_application'));
$url_modification_profil->setVariableRequete('m','annuaire_formulaire_modification_inscription');
$url_modification_profil->setVariableRequete('id_annuaire',$id_annuaire);
$url_modification_profil->setVariableRequete('id_utilisateur',$id_utilisateur);
 
$url_oubli_mdp = new Url(Config::get('base_url_application'));
$url_oubli_mdp->setVariableRequete('m','annuaire_afficher_formulaire_oubli_mdp');
$url_oubli_mdp->setVariableRequete('id_annuaire',$id_annuaire);
$url_oubli_mdp->setVariableRequete('id_utilisateur',$id_utilisateur);
 
$donnees['url_oubli_mdp'] = $url_oubli_mdp;
$donnees['url_modification_profil'] = $url_modification_profil;
 
// on crée un controleur appelle les hooks de résumé pour chaque application externe
$resumes_controleur = new ApplicationExterneControleur();
 
$donnees['champs'] = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
$donnees['tableau_mappage'] = $tableau_mappage[1];
$navigateur = new NavigationControleur();
$donnees['navigation'] = $navigateur->afficherBandeauNavigationUtilisateur($id_annuaire ,$id_utilisateur, 'gestion');
//Debug::printr($champs);
$donnees['resumes'] = $resumes_controleur->gererInscription($id_utilisateur,$mail_utilisateur);
$donnees['carte_id'] = $this->getVue(Config::get('dossier_squelettes_fiches').'annuaire_tela_inscrits_carte_id',$donnees);
 
$fiche_contrib = $this->getVue(Config::get('dossier_squelettes_fiches').'annuaire_tela_inscrits_gestion_inscription',$donnees);
 
return $fiche_contrib;
}
 
public function afficherFormulaireModificationInscription($id_annuaire, $id_utilisateur, $erreurs = array()) {
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$donnees['aa_id_annuaire'] = $id_annuaire;
$this->chargerModele('MetadonneeModele');
$champ_metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
$valeurs_metadonnees = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// TODO: ceci charge toutes les métadonnées, voir si l'on ne peut pas parser le formulaire
// pour ne charger que ce qui est nécéssaire
foreach($champ_metadonnees as $champ_metadonnee) {
 
$id_champ = $champ_metadonnee['amc_id_champ'];
$nom_champ = $champ_metadonnee['amc_abreviation'];
if(isset($valeurs_metadonnees[$nom_champ])) {
//echo Debug::printr($valeurs_metadonnees[$nom_champ]).'<br />';
$champ_metadonnee['valeur_defaut'] = $valeurs_metadonnees[$nom_champ];
}
 
$champ_metadonnee['aa_id_annuaire'] = $id_annuaire;
// on charge le formulaire d'affichage de chacune des métadonnées
$donnees['champs'][$nom_champ] = $this->afficherFormulaireChampMetadonnees($id_champ,$champ_metadonnee);
 
}
$donnees['tableau_mappage'] = $tableau_mappage[1];
 
$donnees['id_utilisateur'] = $id_utilisateur;
$donnees['erreurs'] = $erreurs;
 
 
// Si le formulaire spécifique à l'annuaire existe, on l'affiche
if(!$this->templateExiste($annuaire['informations']['aa_code'].'_modification','/formulaires/')) {
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$formulaire_modification = $this->genererFormulaireModificationInscription($donnees);
} else {
// Sinon on prend celui par defaut
$formulaire_modification = $this->GetVue(Config::get('dossier_squelettes_formulaires').$annuaire['informations']['aa_code'].'_modification',$donnees);
}
 
return $formulaire_modification;
 
}
 
public function modifierInscription($valeurs) {
$this->chargerModele('MetadonneeModele');
 
$id_utilisateur = $valeurs['id_utilisateur'];
unset($valeurs['id_utilisateur']);
 
$id_annuaire = $valeurs['aa_id_annuaire'];
unset($valeurs['aa_id_annuaire']);
 
$this->chargerModele('AnnuaireModele');
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$mail_utilisateur = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
$ancien_mail = $mail_utilisateur;
 
$verificateur = new VerificationControleur();
 
$valeurs_mappees = array();
$valeurs_metadonnees = array();
 
$erreurs = array();
 
// on itère sur le tableau de valeur pour récupérer les métadonnées
// et les valeurs
foreach($valeurs as $nom_champ => $valeur) {
 
// pour chaque valeur
// on extrait l'id du champ
$ids_champ = mb_split("_",$nom_champ);
 
$confirmation = false;
$valeur_a_ignorer = false;
 
// l'identifiant du champ est la dernière valeur du tableau
if(count($ids_champ) == 3) {
 
$type = $ids_champ[0];
$id_champ = $ids_champ[2];
$condition = $ids_champ[1];
 
} else {
$type = $ids_champ[0];
$condition = false;
$id_champ = $ids_champ[1];
}
 
if($type == 'checkbox' && $condition != 'hidden') {
// on récupère la valeur
$nom_champ = $type.'_'.$id_champ;
$valeur = $valeurs[$type.'_'.$id_champ];
}
 
// cas de la checkbox qui devrait être là mais pas cochée
if($condition == 'hidden') {
if(!isset($valeurs[$type.'_'.$id_champ])) {
// dans ce cas là on fabrique une valeur qui vaut 0
$nom_champ = $type.'_'.$id_champ;
$valeur = '0';
} else {
// sinon la valeur a déjà été traitée et doit être ignorée
$valeur_a_ignorer = true;
}
}
 
if($type == 'mail') {
$mail_utilisateur = $valeur;
}
 
// cas du changement de mot de passe
if($type == 'password') {
 
if($condition == 'conf') {
$valeur_a_ignorer = true;
}
 
$tentative_changemement_mdp = false;
 
if(isset($valeurs[$type.'_conf_'.$id_champ]) && trim($valeurs[$type.'_conf_'.$id_champ]) != '') {
$tentative_changemement_mdp = true;
} else {
$valeur_a_ignorer = true;
}
 
if($tentative_changemement_mdp) {
$confirmation = $valeurs[$type.'_conf_'.$id_champ];
}
}
 
// Si la valeur n'est présente dans le formulaire que pour des raisons de vérification
// on passe à l'iteration suivante
if($valeur_a_ignorer) {
continue;
}
 
$verification = $verificateur->verifierErreurChampModification($id_annuaire, $id_utilisateur, $type , $valeur, $confirmation);
 
if($verification[0] == false) {
$erreurs[$type.'_'.$id_champ] = $verification[1];
 
}
 
// on fait des vérifications et des remplacements sur certaines valeurs
// et quelques fois des actions externes
$valeur = $verificateur->remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, $type, $valeur, $mail_utilisateur);
 
// Si le champ fait partie des champs mappés
$cle_champ = array_search($id_champ, $tableau_mappage[1]);
if($cle_champ) {
// on ajoute sa clé correspondante dans l'annuaire mappé et sa valeur dans le tableau des champs mappés
$valeurs_mappees[$tableau_mappage[0][$cle_champ]] = $valeur;
} else {
// sinon, il est stocké dans les valeurs de metadonnées
$valeurs_metadonnees[$id_champ] = $valeur;
}
}
if(count($erreurs) > 0) {
return $this->afficherFormulaireModificationInscription($id_annuaire,$id_utilisateur,$erreurs);
}
 
 
if(isset($tableau_mappage[0]['champ_pays']) && isset($valeurs_mappees[$tableau_mappage[0]['champ_pays']])) {
$pays = $valeurs_mappees[$tableau_mappage[0]['champ_pays']];
$valeurs_metadonnees[$tableau_mappage[1]['champ_pays']] = $pays;
$pays = $this->MetadonneeModele->renvoyerCorrespondanceAbreviationId($pays);
$valeurs_mappees[$tableau_mappage[0]['champ_pays']] = $pays;
} else {
$pays = '';
}
 
 
$this->chargerModele('AnnuaireModele');
$modification_annuaire = $this->AnnuaireModele->modifierInscriptionDansAnnuaireMappe($id_annuaire, $id_utilisateur ,$valeurs_mappees, $tableau_mappage[0]);
$nouveau_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
$changement_mail = false;
 
// Si le mail a changé alors il faut appeler les applications externes pour modification
if($ancien_mail != $mail_utilisateur || $tentative_changemement_mdp) {
if($ancien_mail != $mail_utilisateur) {
$changement_mail = true;
}
if(isset($tableau_mappage[0]['champ_prenom']) && isset($valeurs_mappees[$tableau_mappage[0]['champ_prenom']])) {
$prenom = $valeurs['text_'.$tableau_mappage[1]['champ_prenom']];
} else {
$prenom = '';
}
 
$nom = $valeurs['text_'.$tableau_mappage[1]['champ_nom']];
$ancien_mail = $ancien_mail;
$mail = $mail_utilisateur;
$pass = $valeurs['password_'.$tableau_mappage[1]['champ_pass']];
 
$appli_controleur = new ApplicationExterneControleur();
 
$params = array (
'id_utilisateur' => $id_utilisateur,
'prenom' => $prenom,
'nom' => $nom,
'mail' => $mail,
'pass' => $pass,
'pays' => $pays,
'nouveau_pass' => $pass,
'nouveau_mail' => $nouveau_mail
);
 
$appli_controleur->modifierInscription($id_utilisateur, $params);
}
 
// les champs arrivent avec un identifiant sous la forme type_xxx_id
foreach($valeurs_metadonnees as $id_champ => $valeur) {
 
// S'il existe déjà une valeur de metadonnée pour cette colonne et cet utilisateur
// car on a pu ajouter de nouveaux champs entre temps
if($this->MetadonneeModele->valeurExiste($id_champ,$id_utilisateur)) {
// On se contente de la modifier
$this->MetadonneeModele->modifierValeurMetadonnee($id_champ,$id_utilisateur,$valeur);
 
} else {
// S'il n'existe pas de valeur, on ajoute une nouvelle ligne à la table de valeurs de meta données
if($this->MetadonneeModele->ajouterNouvelleValeurMetadonnee($id_champ,$id_utilisateur,$valeur)) {
// Si l'insertion a réussi, on continue
} else {
return false;
}
}
}
if($changement_mail) {
$identificateur = new IdentificationControleur();
$identificateur->setUtilisateur($nouveau_mail);
}
 
return $this->afficherFicheUtilisateur($id_annuaire, $id_utilisateur);
}
 
public function bloquerDebloquerUtilisateur($id_annuaire, $id_utilisateur, $bloquer = true) {
 
$annuaire_modele = $this->getModele('AnnuaireModele');
$champs_description = $annuaire_modele->obtenirChampsDescriptionAnnuaire($id_annuaire);
 
$valeur = '0';
 
if($bloquer) {
$valeur = '1';
}
 
$metadonne_modele = $this->getModele('MetadonneeModele');
$metadonne_modele->modifierValeurMetadonnee($champs_description[1]['champ_statut'],$id_utilisateur,$valeur);
 
return $this->afficherFicheUtilisateur($id_annuaire, $id_utilisateur);
}
 
/**
* Affiche le formulaire permettant d'entrer un mail et de recevoir le mot de passe
* associé sur cette adresse
* @param int $id_annuaire l'identifiant de l'annuaire associé
*/
public function afficherFormulaireOubliMotDePasse($id_annuaire) {
 
$donnees['aa_id_annuaire'] = $id_annuaire;
return $this->getVue(Config::get('dossier_squelettes_formulaires').'oubli_mdp',$donnees);
}
 
/**
* Supprime l'ancien mot de passe d'un utilisateur et crée un nouveau mot de passe
* aléatoire qui sera envoyé par mail
* @param int $id_annuaire l'identifiant de l'annuaire associé
* @param int $mail le mail auquel on envoie le mot de passe
*
*/
public function reinitialiserMotDePasse($id_annuaire, $mail) {
 
$this->chargerModele('AnnuaireModele');
$verificateur = new VerificationControleur();
$messagerie = new MessageControleur();
 
$donnees = array();
 
if(!$verificateur->mailValide($mail) || !$this->AnnuaireModele->utilisateurExisteParMail($id_annuaire,$mail)) {
$donnees['erreurs']['mail'] = 'Cet utilisateur n\'existe pas';
$donnees['aa_id_annuaire'] = $id_annuaire;
return $this->getVue(Config::get('dossier_squelettes_formulaires').'oubli_mdp',$donnees);
}
$nouveau_mdp = $verificateur->genererMotDePasse();
$nouveau_mdp_encrypte = $verificateur->encrypterMotDePasse($nouveau_mdp);
$modif_mdp = $this->AnnuaireModele->reinitialiserMotDePasse($id_annuaire, $mail, $nouveau_mdp_encrypte);
if(!$modif_mdp) {
$donnees['erreurs']['mdp'] = 'Impossible de générer un nouveau mot de passe';
$donnees['aa_id_annuaire'] = $id_annuaire;
return $this->getVue(Config::get('dossier_squelettes_formulaires').'oubli_mdp',$donnees);
}
 
if($messagerie->envoyerMailOubliMdp($id_annuaire, $mail, $nouveau_mdp)) {
$donnees['titre'] = 'Mot de passe envoyé';
$donnees['message'] = 'Votre nouveau mot de passe a été envoyé à l\'adresse '.$mail;
} else {
$donnees['titre'] = 'Impossible de renvoyer le nouveau mot de passe';
$donnees['message'] = 'Votre nouveau mot de passe n\'a pas pu être envoyé à l\'adresse indiquée ';
}
return $this->getVue(Config::get('dossier_squelettes_annuaires').'information_simple',$donnees);
}
public function afficherFormulaireSuppressionInscription($id_annuaire, $id_utilisateur) {
 
$donnees['id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
return $this->getVue(Config::get('dossier_squelettes_formulaires').'suppression_inscription',$donnees);
}
 
/**
* Supprime l'inscription d'un utilisateur dans un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire associé
* @param int $id_utilisateur l'identifiant de l'utilisateur à supprimer
*/
public function supprimerInscription($id_annuaire, $id_utilisateur) {
if(!$id_utilisateur || $id_utilisateur == '') {
return $this->index();
}
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
$mail_utilisateur = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
$suppression_inscription = $this->AnnuaireModele->supprimerInscriptionDansAnnuaireMappe($id_annuaire, $id_utilisateur);
if(!$mail_utilisateur || $mail_utilisateur == '') {
return $this->index();
}
 
$donnees = array('erreurs' => array());
 
$this->chargerModele('MetadonneeModele');
$suppression_metadonnees = $this->MetadonneeModele->supprimerValeursMetadonneesParIdEnregistrementLie($id_utilisateur);
 
if(!$suppression_inscription || !$suppression_metadonnees) {
$donnees['erreurs']['inscription'] = $suppression_inscription;
$donnees['erreurs']['metadonnees'] = $suppression_metadonnees;
$donnees['erreurs']['titre'] = 'Erreur lors de la suppression de l\'inscription ';
 
return $this->getVue(Config::get('dossier_squelettes_elements').'erreurs',$donnees);
}
 
$params = array (
'id_utilisateur' => $id_utilisateur,
'prenom' => '',
'nom' => '',
'mail' => $mail_utilisateur,
'pass' => '',
'pays' => '',
'nouveau_pass' => '',
'nouveau_mail' => ''
);
 
// on appelle les controleur de lettre actu et d'applications externes
$appli_controleur = new ApplicationExterneControleur();
$appli_controleur->supprimerInscription($id_utilisateur, $params);
 
// pour qu'ils lancent les procédures de désinscription associées
$lettre_controleur = new LettreControleur();
$lettre_controleur->desinscriptionLettreActualite($mail_utilisateur);
if($id_utilisateur == Registre::getInstance()->get('identification_id')) {
$identificateur = new IdentificationControleur();
$identificateur->deloggerUtilisateur();
}
$donnees = array();
// Si le formulaire spécifique à l'annuaire existe, on l'affiche
if($this->templateExiste($annuaire['informations']['aa_code'].'_desinscription_confirmation','/annuaires/')) {
$informations_desinscription = $this->GetVue(Config::get('dossier_squelettes_annuaires').$annuaire['informations']['aa_code'].'_desinscription_confirmation',$donnees);
} else {
// Sinon on prend celui par defaut
$donnees['titre'] = 'Vous êtes maintenant désinscrit de l\'annuaire';
$donnees['message'] = 'Votre désinscription a bien été prise en compte <br />';
$informations_desinscription = $this->getVue(Config::get('dossier_squelettes_annuaires').'information_simple',$donnees);
}
return $informations_desinscription;
}
 
/**
* Affiche le formulaire de recherche pour un annuaire donné ou en génère un à la volée
* @param int $id_annuaire l'identifiant de l'annuaire
* @param array $donnees des données utilisées pour pré remplir le formulaire
* @return string le html contenant le formulaire de recherche
*/
public function afficherFormulaireRecherche($id_annuaire, $donnees = array()) {
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, false);
 
$this->chargerModele('MetadonneeModele');
$metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
 
$donnees['aa_id_annuaire'] = $id_annuaire;
 
// TODO: ceci charge toutes les métadonnées, voir si l'on ne peut pas parser le formulaire
// pour ne charger que ce qui est nécéssaire
 
foreach($metadonnees as $nom_champ => $metadonnee) {
 
$id_champ = $metadonnee['amc_id_champ'];
$type_champ = $metadonnee['amc_ce_template_affichage'];
$nom_champ = $metadonnee['amc_abreviation'];
 
if(isset($donnees[$type_champ.'_'.$id_champ])) {
//Debug::printr($donnees[$type_champ.'_'.$id_champ]);
$metadonnee['valeur_defaut']['amv_valeur'] = $donnees[$type_champ.'_'.$id_champ];
}
 
$metadonnee['aa_id_annuaire'] = $id_annuaire;
// on charge le formulaire d'affichage de chacune des métadonnées
$donnees['champs'][$nom_champ] = $this->afficherFormulaireChampMetadonnees($id_champ,$metadonnee);
}
 
// Si le formulaire spécifique à l'annuaire existe, on l'affiche
if(!$this->templateExiste($annuaire['informations']['aa_code'].'_recherche','/formulaires/')) {
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$formulaire_recherche = $this->genererFormulaireRecherche($donnees);
} else {
// Sinon on prend celui par defaut
$formulaire_recherche = $this->GetVue(Config::get('dossier_squelettes_formulaires').$annuaire['informations']['aa_code'].'_recherche',$donnees);
}
 
return $formulaire_recherche;
}
 
/**
* Recherche un ou plusieurs inscrits selon les valeurs passées en paramètres, qui peuvent êtres des valeurs
* dans l'annuaire mappé ou bien des valeurs de metadonnées
* @param int $id_annuaire l'identifiant de l'annuaire
* @param array $valeurs_recherchees les valeurs à rechercher
* @param boolean $exclusive indique si la recherche si fait sur tous les critères ou bien sur au moins un
*/
public function rechercherInscrit($id_annuaire, $valeurs_recherchees, $exclusive = true) {
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, true);
 
if(isset($_GET['numero_page'])) {
$numero_page = $_GET['numero_page'];
} else {
$numero_page = 1;
}
 
if(isset($_GET['taille_page'])) {
$taille_page = $_GET['taille_page'];
} else {
$taille_page = 50;
}
 
$tableau_mappage = $this->AnnuaireModele->obtenirChampsMappageAnnuaire($id_annuaire);
 
$valeurs_mappees = array();
$valeurs = array();
 
//TODO: faire une fonction qui factorise ce principe !!!!
//
 
// on itère sur le tableau de valeur pour récupérer les métadonnées;
foreach($valeurs_recherchees as $nom_champ => $valeur) {
 
// pour chaque valeur
// on extrait l'id du champ
$ids_champ = mb_split("_",$nom_champ);
 
if(count($ids_champ) == 2) {
 
// l'identifiant du champ est la dernière valeur du tableau
$type = $ids_champ[0];
$id_champ = $ids_champ[1];
 
// Si le champ fait partie des champs mappés
$cle_champ = array_search($id_champ, $tableau_mappage[1]);
if($cle_champ) {
// on ajoute sa clé correspondante dans l'annuaire mappé et sa valeur dans le tableau des champs mappés
$valeurs_mappees[$tableau_mappage[0][$cle_champ]] = $valeur;
// et on supprime sa valeur du tableau de valeurs pour ne pas la retrouver lors
// de l'insertion des métadonnées
} else {
$valeurs_recherchees[$id_champ] = $valeur;
}
// on retire la valeur du tableau pour ne pas la retrouver dans les deux recherches
$valeurs_get[$nom_champ] = $valeur;
}
 
unset($valeurs_recherchees[$nom_champ]);
}
$admin = Registre::getInstance()->get('est_admin');
 
//if(!$admin) {
// $champs_blocage = $this->AnnuaireModele->obtenirChampsDescriptionAnnuaire($id_annuaire);
// $valeurs_recherchees[$champs_blocage[1]['champ_statut']] = '0';
//}
 
$champ_id_annuaire = $tableau_mappage[0]['champ_id'];
 
// on recherche dans les métadonnées
$this->chargerModele('MetadonneeModele');
// le résultat est un ensemble d'identifiants
$resultat_metadonnees = $this->MetadonneeModele->rechercherDansValeurMetadonnees($id_annuaire,$valeurs_recherchees, $exclusive);
// on recherche les infos dans la table annuaire mappée
// en incluant ou excluant les id déjà trouvées dans les metadonnées
// suivant le critères d'exclusivité ou non
$resultat_annuaire_mappe = $this->AnnuaireModele->rechercherInscritDansAnnuaireMappe($id_annuaire,$valeurs_mappees, $resultat_metadonnees, $exclusive, $numero_page, $taille_page);
$resultat_recherche = $resultat_annuaire_mappe['resultat'];
 
$nb_resultats = $resultat_annuaire_mappe['total'];
$resultats = array();
foreach($resultat_recherche as $resultat) {
$id_utilisateur = $resultat[$champ_id_annuaire];
$resultats[$id_utilisateur] = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
}
 
// on renvoie une liste identique à celle de la liste des inscrits
$donnees['resultats_recherche'] = $resultats;
$donnees['tableau_mappage'] = $tableau_mappage[1];
$donnees['id_annuaire'] = $id_annuaire;
$donnees['nb_resultats'] = $nb_resultats;
 
$url_base = new URL(Registre::getInstance()->get('base_url_application'));
$url_pagination = clone($url_base);
 
$valeurs_get['id_annuaire'] = $id_annuaire;
$valeurs_get['m'] = $_GET['m'];
 
$donnees['pagination'] = $this->paginer($numero_page,$taille_page,$nb_resultats,$url_pagination, $valeurs_get);
 
// S'il existe une page de résultats spécifique à l'annuaire pour la recherche
if($this->templateExiste($annuaire['informations']['aa_code'].'_resultat_recherche', Config::get('dossier_squelettes_annuaires'))) {
// on l'affiche
$vue_resultat_recherche = $this->getVue(Config::get('dossier_squelettes_annuaires').$annuaire['informations']['aa_code'].'_resultat_recherche', $donnees);
 
} else {
// sinon on prend celle par défaut
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$vue_resultat_recherche = $this->getVue(Config::get('dossier_squelettes_annuaires').'resultat_recherche', $donnees);
}
return $this->afficherFormulaireRecherche($id_annuaire, $valeurs_get).$vue_resultat_recherche;
}
 
/** Recherche un ou plusieurs inscrits selon des indications géographiques, qui peuvent êtres des valeurs
* dans l'annuaire mappé ou bien des valeurs de metadonnées
* @param int $id_annuaire l'identifiant de l'annuaire
* @param array $valeurs_recherchees les valeurs à rechercher
* @param boolean $exclusive indique si la recherche si fait sur tous les critères ou bien sur au moins un
* @param int $numero_page le numero de page demandé
* @param int $taille_page la taille de page
*/
public function rechercherInscritParlocalisation($id_annuaire,$valeurs_recherchees) {
 
if(isset($_GET['taille_page'])) {
$taille_page = $_GET['taille_page'];
} else {
$taille_page = 50;
}
 
if(isset($_GET['numero_page'])) {
$numero_page = $_GET['numero_page'];
} else {
$numero_page = 1;
}
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, true);
 
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$valeurs_get = $valeurs_recherchees;
 
$valeurs_mappees = array();
$valeurs = array();
 
$champ_id_annuaire = $tableau_mappage[0]['champ_id'];
 
$valeur = $valeurs_recherchees['pays'];
$champ_critere = $tableau_mappage[0]['champ_pays'];
$criteres = array($tableau_mappage[0]['champ_pays'] => $valeurs_recherchees['pays']);
 
if(isset($valeurs_recherchees['departement'])) {
$valeur = $valeurs_recherchees['departement'];
$champ_critere = $tableau_mappage[0]['champ_code_postal'];
$criteres = array($tableau_mappage[0]['champ_pays'] => $valeurs_recherchees['pays'],
$tableau_mappage[0]['champ_code_postal'] => $valeurs_recherchees['departement']
);
}
 
$resultat_annuaire_mappe = $this->AnnuaireModele->rechercherInscritDansAnnuaireMappeParTableauChamps($id_annuaire, $criteres, true, $numero_page, $taille_page);
 
$resultat_recherche = $resultat_annuaire_mappe;
$nb_resultats = $resultat_recherche['total'];
$resultat_recherche = $resultat_recherche['resultat'];
$resultats = array();
foreach($resultat_recherche as $resultat) {
$id_utilisateur = $resultat[$champ_id_annuaire];
$resultats[$id_utilisateur] = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
}
 
// on renvoie une liste identique à celle de la liste des inscrits
$donnees['resultats_recherche'] = $resultats;
$donnees['tableau_mappage'] = $tableau_mappage[1];
$donnees['id_annuaire'] = $id_annuaire;
$donnees['nb_resultats'] = $nb_resultats;
//Debug::printr($resultat_annuaire_mappe);
 
$url_base = new URL(Registre::getInstance()->get('base_url_application'));
$url_pagination = clone($url_base);
 
$valeurs_get['id_annuaire'] = $id_annuaire;
$valeurs_get['m'] = $_GET['m'];
 
$donnees['pagination'] = $this->paginer($numero_page,$taille_page,$nb_resultats,$url_pagination, $valeurs_get);
 
// S'il existe une page de résultats spécifique à l'annuaire pour la recherche
if($this->templateExiste($annuaire['informations']['aa_code'].'_resultat_recherche', Config::get('dossier_squelettes_annuaires'))) {
// on l'affiche
$vue_resultat_recherche = $this->getVue(Config::get('dossier_squelettes_annuaires').$annuaire['informations']['aa_code'].'_resultat_recherche', $donnees);
 
} else {
// sinon on prend celle par défaut
$tableau_nom_mappage = $this->obtenirNomsChampsMappageAnnuaire($id_annuaire);
$donnees['mappage_nom_champs'] = $tableau_nom_mappage;
$vue_resultat_recherche = $this->getVue(Config::get('dossier_squelettes_annuaires').'resultat_recherche', $donnees);
}
return $vue_resultat_recherche;
}
 
 
/** --- Fonction pour les images ------------------------------------------------------------------------*/
 
public function afficherFormulaireUploadImage($id_annuaire,$id_utilisateur, $donnees = array()) {
 
$donnees['aa_id_annuaire'] = $id_annuaire;
$donnees['id_utilisateur'] = $id_utilisateur;
 
$donnees['amc_nom'] = 'Image de profil';
 
$this->chargerModele('AnnuaireModele');
$id_champ_image = $this->AnnuaireModele->obtenirChampAvatar($id_annuaire);
 
if(!$id_champ_image) {
$donnees['erreurs'] = 'Aucun champ n\'est défini pour l\'image de profil';
return $this->getVue(Config::get('dossier_squelettes_elements').'erreurs',$donnees);
}
$formats = str_replace('|',', ',Config::get('extensions_acceptees'));
$donnees['formats'] = $formats;
$taille_max = Config::get('taille_max_images');
$taille_max_formatee = VerificationControleur::convertirTailleFichier(Config::get('taille_max_images'));
$donnees['taille_max_formatee'] = $taille_max_formatee;
$donnees['taille_max'] = $taille_max;
 
$donnees['amc_id_champ'] = $id_champ_image;
 
return $this->getVue(Config::get('dossier_squelettes_champs').'image',$donnees);
}
 
/**
* Ajoute une image uploadée à travers le formulaire
*
*/
public function ajouterImageUtilisateur($id_annuaire, $id_utilisateur, $fichier_a_stocker, $retourner_booleen = false) {
 
$donnees = array('erreurs' => array(), 'aa_id_annuaire' => $id_annuaire);
 
foreach($fichier_a_stocker as $nom_champ => $fichier) {
 
$ids_champ = mb_split("_",$nom_champ, 3);
 
if(count($ids_champ) == 2) {
 
$type = $ids_champ[0];
$id_champ = $ids_champ[1];
 
 
} else {
trigger_error('Ce champ n\'est pas relié à un annuaire');
return false;
}
 
$this->chargerModele('ImageModele');
 
$format_accepte = $this->ImageModele->verifierFormat($fichier['name']);
 
if(!$format_accepte) {
$formats = str_replace('|',', ',Config::get('extensions_acceptees'));
$donnees['erreurs'][$id_champ] = 'Cette extension de fichier n\'est pas prise en charge. Veuillez utiliser un fichier portant l\'une des extensions suivantes :'.$formats ;
return $this->afficherFormulaireUploadImage($id_annuaire, $id_utilisateur,$donnees);
}
 
$stockage_image = $this->ImageModele->stockerFichier($id_annuaire, $id_utilisateur, $fichier);
 
$this->chargerModele('MetadonneeModele');
 
if($this->MetadonneeModele->valeurExiste($id_champ,$id_utilisateur)) {
// On se contente de la modifier
if($stockage_image && $this->MetadonneeModele->modifierValeurMetadonnee($id_champ,$id_utilisateur,$id_utilisateur)) {
 
} else {
$donnees['erreurs'][$id_champ] = 'Problème durant le stockage de l\'image';
return $this->afficherFormulaireUploadImage($id_annuaire, $id_utilisateur,$donnees);
}
 
} else {
// S'il n'existe pas de valeur, on ajoute une nouvelle ligne à la table de valeurs de meta données
if($stockage_image && $this->MetadonneeModele->ajouterNouvelleValeurMetadonnee($id_champ,$id_utilisateur,$id_utilisateur)) {
// Si l'insertion a réussi, on continue
} else {
$donnees['erreurs'][$id_champ] = 'Problème durant le stockage de l\'image';
return $this->afficherFormulaireUploadImage($id_annuaire, $id_utilisateur,$id_champ,$donnees);
}
}
}
 
if($retourner_booleen) {
return true;
} else {
return $this->afficherFicheUtilisateur($id_annuaire, $id_utilisateur) ;
}
}
public function obtenirTableauDerniersInscrits($id_annuaire, $limite = '20') {
// Chargement des informations de l'utilisateur dans la table annuaire principale
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
$this->chargerModele('AnnuaireModele');
$tableau_ids = $this->AnnuaireModele->obtenirTableauIdsUtilisateurs($id_annuaire, $tableau_mappage[0]);
$derniers_inscrits = array();
foreach($tableau_ids as $id) {
$id_utilisateur = $id[$tableau_mappage[0][champ_id]];
$derniers_inscrits[$id_utilisateur] = $this->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur);
}
return $derniers_inscrits;
}
 
public function chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $id_zones) {
 
$annuaire_modele = $this->getModele('AnnuaireModele');
return $annuaire_modele->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $id_zones);
}
 
public function chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire) {
$this->chargerModele('AnnuaireModele');
return $this->AnnuaireModele->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
}
}
?>
/tags/v1.1-andromede/controleurs/StatistiquesControleur.php
New file
0,0 → 1,137
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class StatistiquesControleur extends AppControleur {
 
private $statistiques = null;
 
private $champ_pays = '12';
private $onto_pays = '1074';
 
private $champ_rapport_activite_bota = '102';
private $onto_rapport_activite_bota = '30797';
 
private $champ_experience_bota = '4';
private $onto_experience_bota = '30785';
 
public function StatistiquesControleur() {
$this->statistiques = Composant::fabrique('statistiques', array());
}
 
public function obtenirGraphiques($id_annuaire) {
 
$graph = array();
 
//$this->obtenirStatistiquesParPays($id_annuaire);
$graph['pays'] = $this->obtenirStatistiquesParCritere($id_annuaire, $this->champ_pays, $this->onto_pays);
$graph['activite_bota'] = $this->obtenirStatistiquesParCritere($id_annuaire, $this->champ_rapport_activite_bota, $this->onto_rapport_activite_bota, 'Répartition des inscrits selon leur activité');
$graph['experience_bota'] = $this->obtenirStatistiquesParCritere($id_annuaire, $this->champ_experience_bota, $this->onto_experience_bota, 'Répartition des inscrits selon leur expérience botanique');
 
$image = $this->statistiques->combinerGraphiques($graph);
 
// Envoi d'une image png
header("Content-type: image/png");
imagepng ($image);
 
return $graph ;
}
 
public function obtenirStatistiquesParPays($id_annuaire, $titre = 'Répartition des inscrits par pays') {
 
$controleur = new AnnuaireControleur();
 
$modele_meta = new MetadonneeModele();
$modele_onto = new OntologieModele();
$valeurs = $modele_meta->obtenirNombreValeurMetadonnee($this->champ_experience_bota);
$legendes = $modele_onto->chargerListeOntologie($this->onto_experience_bota);
 
$valeurs_a_stat_code = array();
$valeurs_a_stat_legende = array();
 
foreach($valeurs as $valeur) {
$valeurs_a_stat_code[$valeur['amv_valeur']] = $valeur['nb'];
}
 
foreach($legendes as $legende) {
$legende_nom = $legende['amo_nom'];
$legende_code = $legende['amo_id_ontologie'];
 
if(isset($valeurs_a_stat_code[$legende_code])) {
$valeurs_a_stat_legende[$legende_nom] = $valeurs_a_stat_code[$legende_code];
}
}
 
return $this->statistiques->genererGraphique(Statistiques::GRAPH_CAMEMBERT,$valeurs_a_stat_legende);
 
}
 
public function obtenirStatistiquesParCritere($id_annuaire, $id_champ, $id_onto, $titre = '') {
 
$controleur = new AnnuaireControleur();
 
$modele_meta = new MetadonneeModele();
$modele_onto = new OntologieModele();
$valeurs = $modele_meta->obtenirNombreValeurMetadonnee($id_champ);
$legendes = $modele_onto->chargerListeOntologie($id_onto);
 
$valeurs_a_stat_code = array();
$valeurs_a_stat_legende = array();
 
foreach($valeurs as $valeur) {
$valeurs_a_stat_code[$valeur['amv_valeur']] = $valeur['nb'];
}
 
foreach($legendes as $legende) {
$legende_nom = $legende['amo_nom'];
$legende_code = $legende['amo_id_ontologie'];
 
if(isset($valeurs_a_stat_code[$legende_code])) {
$valeurs_a_stat_legende[$legende_nom] = $valeurs_a_stat_code[$legende_code];
}
}
 
return $this->statistiques->genererGraphique(Statistiques::GRAPH_CAMEMBERT,$valeurs_a_stat_legende, $titre);
 
}
 
public function obtenirStatistiquesParAnnees($id_annuaire) {
 
$controleur = new AnnuaireControleur();
 
$modele_stats = new StatistiquesModele();
$valeurs = $modele_stats->obtenirNombreInscriptionsParDate($id_annuaire);
$legendes = $modele_onto->chargerListeOntologie('1074');
 
 
$valeurs_a_stat_code = array();
$valeurs_a_stat_legende = array();
 
foreach($valeurs as $valeur) {
$valeurs_a_stat_code[$valeur['amv_valeur']] = $valeur['nb'];
}
 
foreach($legendes as $legende) {
$legende_nom = $legende['amo_nom'];
$legende_code = $legende['amo_id_ontologie'];
 
if(isset($valeurs_a_stat_code[$legende_code])) {
$valeurs_a_stat_legende[$legende_nom] = $valeurs_a_stat_code[$legende_code];
}
}
 
return $this->statistiques->genererGraphique(Statistiques::GRAPH_CAMEMBERT,$valeurs_a_stat_legende);
 
}
 
}
?>
/tags/v1.1-andromede/controleurs/RSSControleur.php
New file
0,0 → 1,34
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class RssControleur extends AppControleur {
 
public function obtenirDerniersInscritsRSS($id_annuaire, $admin = false) {
 
$annuaire_controleur = new AnnuaireControleur();
$tableau_valeurs = $annuaire_controleur->obtenirTableauDerniersInscrits($id_annuaire);
$donnees['derniers_inscrits'] = $tableau_valeurs;
if($admin) {
$retour_rss = $this->getVue(Config::get('dossier_squelettes_rss').'derniers_inscrits_admin',$donnees);
} else {
$retour_rss = $this->getVue(Config::get('dossier_squelettes_rss').'derniers_inscrits',$donnees);
}
 
return $retour_rss;
}
 
}
?>
/tags/v1.1-andromede/controleurs/CartoControleur.php
New file
0,0 → 1,349
<?php
// declare(encoding='UTF-8');
/**
* classe Controleur du module Carte.
*
* @package Collection
* @category Php5
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $Id$
*/
class CartoControleur extends AppControleur {
 
 
// identifiant de la france pour l'accès direct
private $id_france = 'fr';
 
// nom du fond de carte en cours
private $nom_fond = '';
 
//+----------------------------------------------------------------------------------------------------------------+
// Méthodes
 
/**
* Fonction d'affichage par défaut, elle appelle la cartographie
*/
public function executerActionParDefaut() {
return $this->cartographier(1);
}
 
/**
* Cartographier un annuaire.
* @param int $id_annuaire l'identitifiant de l'annuaire à cartographier
* @param int $continent l'identitifiant du continent sur lequel on se trouve
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
* @return string la vue correspondante
*/
public function cartographier($id_annuaire, $continent= null , $pays = null) {
// Initialisation de variable
$donnees = array();
 
// la présence d'un pays (non) et d'un continent (ou non) détermine le niveau de carte à afficher
$niveau = $this->calculerNiveau($continent, $pays);
 
// suivant le niveau, continent et pays, on renvoie un template html différent
$fond = $this->renvoyerPrefixePourNiveau($niveau, $continent, $pays);
 
$carte = '';
 
// chaque continent possède un fond de carte différent
if($niveau == 1) {
$carte = $this->renvoyerSuffixePourContinent($niveau, $continent, $pays);
}
 
// Création de la carte
$options = array(
'carte_nom' => $fond.$carte,
'formule' => Cartographie::FORMULE_PROPORTIONNEL,
'couleur_claire' => Config::get('carte_couleur_claire'),
'couleur_foncee' => Config::get('carte_couleur_foncee'),
'fond_fichier' => Config::get('carte_base_nom_'.$fond).$carte,
'fond_dossier' => Application::getChemin().Config::get('carte_fonds_chemin'),
'stock_dossier' => Config::get('carte_stockage_chemin'),
'stock_url' => Config::get('carte_stockage_url'),
'debug' => Config::get('carte_mode_debug'));
$cartographie = Composant::fabrique('cartographie', $options);
 
$this->nom_fond = Config::get('carte_base_nom_'.$fond).$carte;
 
// Construction des données nécessaires à la cartographie
$zones = $cartographie->getCarteZones();
$this->chargerZonesNbre($id_annuaire,$zones, $niveau);
$this->chargerZonesUrls($id_annuaire, $zones, $continent, $pays, $niveau);
 
 
 
$cartographie->setCarteZones($zones);
 
$cartographie->creerCarte();
$donnees['map'] = $cartographie->getImageMap();
 
$resultat = $this->getVue('cartes/'.$fond, $donnees);
return $resultat;
}
 
/**
* Charge le nombre d'inscrit par zone pour un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
* @param int $niveau le niveau de la carto (monde, continent, ou pays)
*/
private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0) {
 
$metaModele = $this->getModele('AnnuaireModele');
// on charge les inscrits pour le niveau donné
$zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau);
 
foreach ($zones as $id => &$infos) {
 
// si l'on a des données pour la zone, on renseigne le nombre d'inscrits
if (isset($zones_infos[$id])) {
 
$nbre = $zones_infos[$id];
$infos['info_nombre'] = $nbre;
} else {
// sinon on le met à 0
$infos['info_nombre'] = 0;
}
}
}
 
/**
* Charge les des zones pour un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
* @param int $continent l'identitifiant du continent sur lequel on se trouve
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
* @param int $niveau le niveau de la carto (monde, continent, ou pays)
*/
private function chargerZonesUrls($id_annuaire, &$zones, $continent = null, $pays = null, $niveau = 0) {
 
$url = new URL(Config::get('url_base'));
 
$url->setVariableRequete('id_annuaire', $id_annuaire);
//$url->setVariableRequete('m', 'annuaire_inscrits_carto');
 
foreach ($zones as $id => &$infos) {
 
switch ($niveau) {
// niveau 0 de la carte : on affiche tous les continents
// l'url va pointer vers un continent en particulier
case 0:
$url->setVariableRequete('m', 'annuaire_afficher_carte');
$url->setVariableRequete('continent', $id);
break;
 
// niveau 1, on est sur un continent en particulier : on affiche le détail du continent demandé
// l'url pointe sur des pays
case 1:
$url->setVariableRequete('continent', $continent);
 
// si le pays c'est la france alors l'url pointera vers la carte des départements
if($id == $this->id_france) {
$url->setVariableRequete('m', 'annuaire_afficher_carte');
} else {
// sinon l'url pointe vers la liste des inscrits de ce pays
$url->setVariableRequete('m', 'annuaire_inscrits_carto');
}
$url->setVariableRequete('pays', $id);
 
break;
 
// niveau 2, si on a cliqué sur la france pour afficher les départements :
case 2:
$url->setVariableRequete('m','annuaire_inscrits_carto');
$url->setVariableRequete('continent', $continent);
$url->setVariableRequete('pays', $pays);
$url->setVariableRequete('departement', $id);
break;
}
$infos['url'] = sprintf($url, $id);
}
}
 
/**
* Renvoie le niveau auquel on se trouve suivant la présence ou non de certains paramètres
* @param int $continent l'identitifiant du continent sur lequel on se trouve
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
*/
private function calculerNiveau($continent, $pays) {
 
// le niveau 0 c'est la carte de base
$niveau = 0;
 
// le niveau 1 on consulte un continent en particulier (ex. Amérique du Sud)
if($continent != null) {
$niveau = 1;
}
 
// le niveau 2 c'est un pays en particulier (ce cas là n'arrive que pour la france)
if($pays != null) {
$niveau = 2;
}
 
return $niveau;
}
 
/**
* Renvoie le type de template à utiliser suivant le niveau de certains paramètres
* @param int $niveau le niveau de la carto
* @return string le type de template
*/
private function renvoyerPrefixePourNiveau($niveau) {
switch ($niveau) {
case 0:
$fond = 'continents';
break;
 
case 1:
$fond = 'pays';
break;
 
case 2 :
$fond = 'france';
break;
 
default:
$fond = '';
break;
}
 
return $fond;
}
 
/**
* Renvoie le suffixe de fond de carte à utiliser pour un continent donné
* @param int $niveau le niveau de la carto
* @param int $niveau l'identifiant de continent
* @return string le suffixe
*/
private function renvoyerSuffixePourContinent($niveau, $continent) {
 
switch ($continent) {
case 1:
$carte = '_afrique';
break;
 
case 2:
$carte = '_nord_amerique';
break;
 
case 3:
$carte = '_asie';
break;
 
case 4:
$carte = '_europe';
break;
 
case 5:
$carte = '_oceanie';
break;
 
case 6:
$carte = '_sud_amerique';
break;
 
case 7:
$carte = '_moyen_orient';
break;
 
default:
$carte = '';
break;
}
 
return $carte;
}
 
/**
* renvoie tous les noms templates pour chaque zone du monde
* @return array un tableau associatif indexé par les identifiants de zone et contenant les noms de templates
*/
private function renvoyerTousTemplates() {
return array(1 => 'pays_afrique', 2 => 'pays_nord_amerique', 3 => 'pays_asie', 4 => 'pays_europe', 5 => 'pays_oceanie', 6 => 'pays_sud_amerique', 7 => 'pays_moyen_orient');
}
 
/**
* Charge la liste des inscrits par zone pour un niveau géographique donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @param int $niveau le niveau où l'on se situe
* @return array un tableau associatif indexé par les identifiants de zone et contenant le nombre d'inscrits pour chaque zone
*/
private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau) {
 
$nb_inscrits = array();
 
if($niveau == 0) {
// si on est au niveau des continents
$zones_ids = array();
// il faut faire la somme des inscrits par zones géographique
$templates = $this->renvoyerTousTemplates();
} else {
// sinon on appelle la fonction pour la zone demandée
$zones_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$this->nom_fond);
}
 
$annuaire_controleur = new AnnuaireControleur();
 
switch ($niveau) {
// niveau de la carte du monde
case 0:
// pour chacun des continents, on fait la somme des membres de sa zone
foreach($templates as $id_continent => $template) {
$zones_continent_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$template);
$nb_inscrits[$id_continent] = array_sum($annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_continent_ids));
}
break;
 
// niveau de la carte des pays d'un continent
case 1:
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_ids);
break;
 
// détail d'un pays
case 2 :
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
break;
 
// action par défaut
default:
// on renvoie un tableau vide
$nb_inscrits = array();
break;
}
 
return $nb_inscrits;
}
 
/**
* Récupère les identifiants de zone dans un fichier csv donné
* @param string $nom_csv chemin vers le fichier csv (sans extension) qui contient les données
* @return array un tableau contenant les identifiants des zones
*/
private function chargerZonesParCsv($nom_csv) {
 
$fichier_csv = $nom_csv.'.csv';
$zones_id = array();
 
if (($handle = fopen($fichier_csv, 'r')) !== false) {
$ligne = 0;
 
while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
 
if($ligne != 0 && trim($donnees[0]) != '') {
$zones_id[] = "'".$donnees[0]."'";
}
$ligne++;
}
fclose($handle);
}
 
return $zones_id;
}
}
?>
/tags/v1.1-andromede/controleurs/MappageControleur.php
New file
0,0 → 1,181
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class MappageControleur extends AppControleur {
 
private $id_liste_champs = 30768;
/**
* Charge la vue contenant les informations d'un annuaire géré par l'application
* @param int $id l'annuaire dont on veut consulter les informations
* @return string la vue contenant les informations
*/
public function chargerAnnuaire($id) {
$this->chargerModele('AnnuaireModele');
$this->chargerModele('MetadonneeModele');
$data['erreurs'] = array();
$data['annuaire'] = $this->AnnuaireModele->chargerAnnuaire($id,true);
$data['metadonnees'] = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id);
$annuaire = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'annuaire', $data);
 
return $annuaire;
}
/**--------Fonctions de gestion des champs de mappage associées à un annuaire et des formaulaires associés --------*/
/**
* Affiche le formulaire d'ajout d'une metadonnee
* @param Array $valeurs les valeurs à inclure dans le formulaire (dans le cas du retour erreur)
* @return string la vue contenant le formulaire
*/
public function afficherFormulaireAjoutMappage($id_annuaire, $donnees = array()) {
 
$this->chargerModele('MetadonneeModele');
$this->chargerModele('GestionAnnuaireModele');
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
$liste_champs_mappage = array('champ_id' => 'Champ identifiant',
'champ_pass' => 'Champ mot de passe',
'champ_nom' => 'Champ nom',
'champ_prenom' => 'Champ prénom' ,
'champ_mail' => 'Champ mail',
'champ_pays' => 'Champ pays',
'champ_code_postal' => 'Champ code postal',
'champ_adresse' => 'Champ adresse',
'champ_adresse_comp' => 'Champ adresse complémentaire',
'champ_adresse_comp' => 'Champ adresse complémentaire');
$champs_metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
$champs_annuaire = $this->GestionAnnuaireModele->obtenirListeNomsChampsAnnuaireParIdAnnuaire($id_annuaire);
$roles_deja_affectes = array_intersect_key($liste_champs_mappage, $champs_mappage[0]);
//Debug::printr($champs_mappage[0]);
//Debug::printr($liste_champs_mappage);
$champs_deja_mappe_annuaire = array_intersect_key($champs_mappage[0], $liste_champs_mappage);
$champs_deja_mappe_metadonnees = array_intersect_key($champs_mappage[1], $liste_champs_mappage);
// on retire les roles déjà affectés dans la liste des roles
$liste_champs_mappage = array_diff_key($liste_champs_mappage, $roles_deja_affectes);
// on retire les champs de l'annuaire qui sont déjà mappés
$champs_annuaire = array_diff($champs_annuaire, $champs_deja_mappe_annuaire);
// on retire les champ de metadonnées qui mappent déjà un champ
$champs_metadonnees = array_diff_key($champs_metadonnees, array_flip($champs_deja_mappe_metadonnees));
$data['champs_mappage'] = $liste_champs_mappage;
$data['champs_metadonnees'] = $champs_metadonnees;
$data['champs_annuaire'] = $champs_annuaire;
$data['id_annuaire'] = $id_annuaire;
$mappage_ajout = $this->getVue(Config::get('dossier_squelettes_metadonnees').'mappage_ajout',$data);
 
return $mappage_ajout;
}
 
/**
* Affiche le formulaire de modification d'une metadonnee
* @param Array $valeurs les valeurs à inclure dans le formulaire
* @return string la vue contenant le formulaire
*/
public function afficherFormulaireModificationMappage($id_mappage) {
 
if(!isset($valeurs['amc_nom'])) {
$valeurs['amc_nom'] = '';
}
 
if(!isset($valeurs['amc_abreviation'])) {
$valeurs['amc_abreviation'] = '';
}
 
if(!isset($valeurs['amc_description'])) {
$valeurs['amc_description'] = '';
}
$data['valeur'] = $valeurs;
 
$this->chargerModele('MetadonneeModele');
$data['valeur'] = $this->MetadonneeModele->chargerInformationsMetadonnee($valeurs['amc_id_champ']);
$data['types'] = $this->MetadonneeModele->chargerListeDesTypesDeChamps();
$data['listes'] = $this->MetadonneeModele->chargerListeDesListes();
$metadonnee_modification = $this->getVue(Config::get('dossier_squelettes_metadonnees').'metadonnee_modification',$data);
 
return $metadonnee_modification;
}
 
/**
* Ajoute un nouveau champ de mappage à un annuaire
* @param Array $valeurs les valeurs à ajouter
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function ajouterNouveauMappage($valeurs) {
 
$this->ChargerModele('MappageModele');
if(isset($valeurs['id_annuaire'])
&& isset($valeurs['at_valeur'])
&& isset($valeurs['at_ressource'])
&& isset($valeurs['at_action'])) {
$id_annuaire = $valeurs['id_annuaire'];
$id_champ_metadonnee = $valeurs['at_valeur'];
$nom_champ_annuaire = $valeurs['at_ressource'];
$role = $valeurs['at_action'];
$this->MappageModele->ajouterNouveauMappage($id_annuaire, $nom_champ_annuaire, $role, $id_champ_metadonnee);
} else {
return $this->afficherFormulaireAjoutMappage($valeurs);
}
return $this->chargerAnnuaire($valeurs['id_annuaire']);
}
 
/**
* Modifie un champ de mapagge associé à un annuaire
* @param Array $valeurs les valeurs à modifier
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function modifierMappage($valeurs) {
 
if(isset($valeurs['amc_id_champ'])
&& isset($valeurs['amc_nom'])
&& isset($valeurs['amc_abreviation'])
&& isset($valeurs['amc_description'])
&& isset($valeurs['amc_ce_annuaire'])
&& isset($valeurs['amc_ce_type_affichage'])) {
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->modifierMetadonnee($valeurs);
} else {
return $this->afficherFormulaireModificationMetadonnee($valeurs);
}
return $this->chargerAnnuaire($valeurs['amc_ce_annuaire']);
}
 
/**
* Supprime un champ de métadonnée associé à un annuaire
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function supprimerMappage($id_annuaire, $id_mappage) {
 
if($id_metadonnee != '') {
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->supprimerMetadonneeParId($id_metadonnee);
} else {
return false;
}
return $this->chargerAnnuaire($id_annuaire);
}
 
}
/tags/v1.1-andromede/controleurs/OpenIdControleur.php
New file
0,0 → 1,18
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class OpenIdControleur extends AppControleur {
 
 
}
?>
/tags/v1.1-andromede/controleurs/MetadonneeControleur.php
New file
0,0 → 1,157
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class MetadonneeControleur extends AppControleur {
 
/**
* Charge la vue contenant les informations d'un annuaire donné en paramètre
* @param int $id l'identifiant de l'annuaire
* @return string la vue contenant les informations sur l'annuaire
*/
public function chargerAnnuaire($id) {
$this->chargerModele('AnnuaireModele');
$this->chargerModele('MetadonneeModele');
$data['erreurs'] = array();
$data['champs_mappage'] = $this->obtenirChampsMappageAnnuaire($id);
$data['annuaire'] = $this->AnnuaireModele->chargerAnnuaire($id, true);
$data['metadonnees'] = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id);
$annuaire = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'annuaire', $data);
 
return $annuaire;
}
 
/**--------Fonctions de gestion des métadonnées associées à un annuaire--------*/
/**
* Affiche le formulaire d'ajout d'une metadonnee
* @param Array $valeurs les valeurs à inclure dans le formulaire (dans le cas du retour erreur)
* @return string la vue contenant le formulaire
*/
public function afficherFormulaireAjoutMetadonnee($valeurs) {
 
if(!isset($valeurs['amc_nom'])) {
$valeurs['amc_nom'] = '';
}
 
if(!isset($valeurs['amc_abreviation'])) {
$valeurs['amc_abreviation'] = '';
}
 
if(!isset($valeurs['amc_description'])) {
$valeurs['amc_description'] = '';
}
$data['valeur'] = $valeurs;
 
$this->chargerModele('MetadonneeModele');
$data['types'] = $this->MetadonneeModele->chargerListeDesTypesDeChamps();
$data['listes'] = $this->MetadonneeModele->chargerListeDesListes();
$metadonnee_ajout = $this->getVue(Config::get('dossier_squelettes_metadonnees').'metadonnee_ajout',$data);
 
return $metadonnee_ajout;
}
 
/**
* Affiche le formulaire de modification d'une metadonnee
* @param Array $valeurs les valeurs à inclure dans le formulaire
* @return string la vue contenant le formulaire
*/
public function afficherFormulaireModificationMetadonnee($valeurs) {
 
if(!isset($valeurs['amc_nom'])) {
$valeurs['amc_nom'] = '';
}
 
if(!isset($valeurs['amc_abreviation'])) {
$valeurs['amc_abreviation'] = '';
}
 
if(!isset($valeurs['amc_description'])) {
$valeurs['amc_description'] = '';
}
$data['valeur'] = $valeurs;
 
$this->chargerModele('MetadonneeModele');
$data['valeur'] = $this->MetadonneeModele->chargerInformationsMetadonnee($valeurs['amc_id_champ']);
$data['types'] = $this->MetadonneeModele->chargerListeDesTypesDeChamps();
$data['listes'] = $this->MetadonneeModele->chargerListeDesListes();
$metadonnee_modification = $this->getVue(Config::get('dossier_squelettes_metadonnees').'metadonnee_modification',$data);
 
return $metadonnee_modification;
}
 
/**
* Ajoute un nouveau champ de métadonnée à un annuaire
* @param Array $valeurs les valeurs à ajouter
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function ajouterNouvelleMetadonnee($valeurs) {
 
if(isset($valeurs['amc_nom'])
&& isset($valeurs['amc_abreviation'])
&& isset($valeurs['amc_description'])
&& isset($valeurs['amc_ce_annuaire'])
&& isset($valeurs['amc_ce_type_affichage'])) {
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->ajouterNouvelleMetadonnee($valeurs);
} else {
return $this->afficherFormulaireAjoutMetadonnee($valeurs);
}
return $this->chargerAnnuaire($valeurs['amc_ce_annuaire']);
}
 
/**
* Modifie un champ de métadonnée associé à un annuaire
* @param Array $valeurs les valeurs à modifier
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function modifierMetadonnee($valeurs) {
 
if(isset($valeurs['amc_id_champ'])
&& isset($valeurs['amc_nom'])
&& isset($valeurs['amc_abreviation'])
&& isset($valeurs['amc_description'])
&& isset($valeurs['amc_ce_annuaire'])
&& isset($valeurs['amc_ce_type_affichage'])) {
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->modifierMetadonnee($valeurs);
} else {
return $this->afficherFormulaireModificationMetadonnee($valeurs);
}
return $this->chargerAnnuaire($valeurs['amc_ce_annuaire']);
}
 
/**
* Supprime un champ de métadonnée associé à un annuaire
* @return string la vue contenant l'annuaire associé, ou le formulaire en cas d'échec
*/
public function supprimerMetadonnee($id_annuaire, $id_metadonnee) {
 
if($id_metadonnee != '') {
$this->chargerModele('MetadonneeModele');
$this->MetadonneeModele->supprimerMetadonneeParId($id_metadonnee);
} else {
return false;
}
return $this->chargerAnnuaire($id_annuaire);
}
public function obtenirIdChampMetadonneeParAbreviation($id_annuaire, $abreviation) {
if(!$id_annuaire || !$abreviation) {
return false;
} else {
$this->chargerModele('MetadonneeModele');
return $this->MetadonneeModele->obtenirIdChampMetadonneeParAbreviation($id_annuaire, $abreviation);
}
}
 
}
/tags/v1.1-andromede/controleurs/AppControleur.php
New file
0,0 → 1,413
<?
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
/**
*
* Classe mère des controleurs de l'application, abstraite, elle contient
* les fonctions utiles à tous les controleurs
* @author aurelien
*
*/
abstract class AppControleur extends Controleur {
/**
* (fonction héritée de la classe Controleur)
* Avant chaque chargement de vue, on ajoute l'url de la page dans
* les variables à insérer.
* @param Array $donnes les données à insérer dans la vue
* @return Array $donnees les données modifiées
*/
public function preTraiterDonnees($donnees) {
 
// ajout de l'url de l'appli
$donnees['base_url'] = new Url(Config::get('base_url_application'));
$donnees['base_url_styles'] = $this->getUrlBase();
$donnees['url_cette_page'] = $this->getUrlCettePage() ;
$donnees['base_url_application'] = $this->getUrlBaseComplete();
$this->chargerModele('AnnuaireModele');
 
//ajout des variables d'identification
$donnees['est_admin'] = Registre::getInstance()->get('est_admin');
$donnees['identification_id'] = Registre::getInstance()->get('identification_id');
$donnees['identification_mail'] = Registre::getInstance()->get('identification_mail');
$format = Config::get('date_format_simple');
if($format) {
$donnees['format_date_simple'] = $format;
} else {
$donnees['format_date_simple'] = 'd/m/Y';
}
 
return $donnees;
}
public function getUrlBase() {
$base_vrai_chemin = str_replace(realpath($_SERVER['DOCUMENT_ROOT']),'',realpath(Application::getChemin()));
$base_vrai_chemin .= '/';
return new Url($base_vrai_chemin);
}
public function getUrlBaseComplete() {
return new Url('http://'.$_SERVER['SERVER_NAME'].str_replace(realpath($_SERVER['DOCUMENT_ROOT']),'',realpath(Application::getChemin())));
}
public function getUrlCettePage() {
return $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
}
/**
* Renvoie le template de pagination, considérant des éléments donnés en paramètre
* @param int $numero_page le numéro de page en cours
* @param int $taille_page la taille de page
* @param int $total le nombre total de pages
* @param object $url_base l'url de base de la page
* @param array $valeurs les valeurs à concatener à l'url
* @return string le html contenu la template de pagination rempli avec les infos
*/
protected function paginer($numero_page = 1, $taille_page = 50, $total, $url_base, $valeurs) {
 
// TODO, faire plus complexe, tri alphabétique etc...
$page_precedente = $numero_page-1;
$page_suivante = $numero_page+1;
 
if($taille_page <= 0) {
$taille_page = 1;
}
 
$nombre_pages = ceil($total/$taille_page) ;
 
foreach($valeurs as $cle => $variable) {
$url_base->setVariableRequete($cle,$variable);
}
 
if($numero_page < 2) {
$page_precedente = false;
$url_page_precedente = '';
} else {
$url_page_prec = clone($url_base);
$url_page_prec->setVariableRequete('numero_page',($page_precedente));
$url_page_prec->setVariableRequete('taille_page',($taille_page));
$url_page_precedente = $url_page_prec->getUrl();
}
 
if($taille_page*($numero_page) >= $total) {
$page_suivante = false;
$url_page_suivante = '';
} else {
$url_page_suiv = clone($url_base);
$url_page_suiv->setVariableRequete('numero_page',($page_suivante));
$url_page_suiv->setVariableRequete('taille_page',($taille_page));
$url_page_suivante = $url_page_suiv->getUrl();
}
 
$url_pages = array();
 
for($i = 1; $i <= $nombre_pages ; $i++) {
 
$url_page_prev = clone($url_base);
$url_page_prev->setVariableRequete('numero_page',($i));
$url_page_prev->setVariableRequete('taille_page',($taille_page));
$url_pages[$i] = $url_page_prev->getUrl();
}
 
$donnees = array('url_pages' => $url_pages, 'numero_page' => $numero_page,
'page_precedente' => $page_precedente, 'page_suivante' => $page_suivante,
'url_page_precedente' => $url_page_precedente, 'url_page_suivante' => $url_page_suivante,
'nombre_pages' => $nombre_pages, 'taille_page' => $taille_page);
$donnees['base_url_pagination'] = $url_base;
 
return $this->getVue(Config::get('dossier_squelettes_elements').'pagination',$donnees);
}
 
public function obtenirIdParMail($id_annuaire, $mail_utilisateur) {
$this->chargerModele('AnnuaireModele');
$id = $this->AnnuaireModele->obtenirIdParMail($id_annuaire, $mail_utilisateur);
return $id;
}
public function utilisateurExiste($id_annuaire,$id, $utilise_mail = true) {
 
$this->chargerModele('AnnuaireModele');
 
if($utilise_mail) {
$existe = $this->AnnuaireModele->utilisateurExisteParMail($id_annuaire,$id);
} else {
$existe = $this->AnnuaireModele->utilisateurExisteParId($id_annuaire,$id);
}
 
return $existe;
}
 
 
/** --------------------------------- Fonction d'extraction des champs de mappage -------------------------------------------*/
/**
* Renvoie les champs de mappage correspondant à un annuaire donné
* @param int $id_annuaire l'indentifant de l'annuaire pour lequel on veut ces informations
* @return Array un tableau de mappage des champs
*
*/
protected function obtenirChampsMappageAnnuaire($id_annuaire) {
 
$this->chargerModele('AnnuaireModele');
$tableau_mappage = $this->AnnuaireModele->obtenirChampsMappageAnnuaire($id_annuaire);
 
return $tableau_mappage;
}
protected function obtenirNomsChampsMappageAnnuaire($id_annuaire) {
 
$this->chargerModele('AnnuaireModele');
$tableau_mappage = $this->AnnuaireModele->obtenirChampsMappageAnnuaire($id_annuaire);
$this->chargerModele('MetadonneeModele');
$metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
$tableau_nom_champs = array();
foreach($metadonnees as $id_champ => $valeur) {
 
// Si le champ fait partie des champs mappés
$cle_champ_mappage = array_search($id_champ, $tableau_mappage[1]);
if($cle_champ_mappage) {
$tableau_nom_champs[$cle_champ_mappage] = $valeur['amc_abreviation'];
}
}
 
return $tableau_nom_champs;
}
 
/** --------------------------------- Fonction d'affichage des champs de metadonnées -------------------------------------------*/
/**
* Charge et affiche le champ correspondant à la modification ou l'ajout d'un champ de metadonnée
* @param int $id_champ l'identifiant du champ demandé
* @return string la vue contenant le champ de formulaire correspondant
*/
public function afficherFormulaireChampMetadonnees($id_champ, $donnees) {
 
// si le champ est restreint à une valeur de liste
if($donnees['amc_ce_ontologie'] != 0) {
$this->chargerModele('OntologieModele');
$donnees['liste_valeurs'] = $this->OntologieModele->chargerListeOntologie($donnees['amc_ce_ontologie']);
}
 
$donnees['amc_id_champ'] = $id_champ;
 
if(isset($donnees['amc_ce_template_affichage'])) {
$nom_type_champ = $donnees['amc_ce_template_affichage'];
} else {
$this->chargerModele('MetadonneeModele');
$nom_type_champ = $this->MetadonneeModele->renvoyerTypeAffichageParId($donnees['amc_ce_type_affichage']);
}
 
return $this->getVue(Config::get('dossier_squelettes_champs').$nom_type_champ,$donnees);
}
/** --------------------------------- Fonction d'existence et de génération des formulaires -------------------------------------------*/
/**
* Renvoie le formulaire demandé s'il existe, sinon faux
* @param string $nom_formulaire le nom du formulaire demandé (qui est normalement le code d'un annuaire)
* @return boolean true si le formulaire existe, false sinon
*/
protected function formulaireExiste($nom_formulaire) {
 
return $this->templateExiste($nom_formulaire.'_inscription', Config::get('dossier_squelettes_formulaires'));
}
 
/**
* Renvoie le template demandé s'il existe, sinon faux
* @param string $nom_formulaire le nom du formulaire demandé (qui est normalement le code d'un annuaire)
* @param string $dossier le nom du dossier sous dossier demandé
* @return boolean true si le formulaire existe, false sinon
*/
protected function templateExiste($nom_template, $dossier = '/') {
return file_exists(Config::get('chemin_squelettes').$dossier.$nom_template.'.tpl.html');
}
/**
* Renvoie une fiche utilisateur minimale auto-générée
* @param string $donnees les données à inclure dans le formulaire
* @return string la vue contenant le formulaire généré
*/
protected function genererFicheInscrit($donnees) {
 
$formulaire_modele = $this->getVue(Config::get('dossier_squelettes_fiches').'fiche',$donnees);
 
if($formulaire_modele) {
return $formulaire_modele;
} else {
trigger_error("impossible de trouver le squelette de référence pour le formulaire");
}
 
return false;
}
 
/**
* Renvoie un formulaire d'inscription minimal auto-généré
* @param string $donnees les donnée à inclure dans le formulaire
* @return string la vue contenant le formulaire généré
*/
protected function genererFormulaireInscription($donnees) {
 
$formulaire_modele = $this->getVue(Config::get('dossier_squelettes_formulaires').'inscription',$donnees);
 
if($formulaire_modele) {
return $formulaire_modele;
} else {
trigger_error("impossible de trouver le squelette de référence pour le formulaire");
}
 
return false;
}
/**
* Renvoie un formulaire d'inscription minimal auto-généré
* @param string $donnees les donnée à inclure dans le formulaire
* @return string la vue contenant le formulaire généré
*/
protected function genererFormulaireModificationInscription($donnees) {
 
$formulaire_modele = $this->getVue(Config::get('dossier_squelettes_formulaires').'modification',$donnees);
 
if($formulaire_modele) {
return $formulaire_modele;
} else {
trigger_error("impossible de trouver le squelette de référence pour le formulaire");
}
 
return false;
}
 
/**
* Renvoie un formulaire d'inscription minimal auto-généré
* @param string $donnees les donnée à inclure dans le formulaire
* @return string la vue contenant le formulaire généré
*/
protected function genererFormulaireRecherche($donnees) {
 
$formulaire_modele = $this->getVue(Config::get('dossier_squelettes_formulaires').'recherche',$donnees);
 
if($formulaire_modele) {
return $formulaire_modele;
} else {
trigger_error("impossible de trouver le squelette de référence pour le formulaire");
}
 
return false;
}
/** --------------------------------- Fonction d'extraction d'informations utilisées entre autres par les web services -------------------------------------------*/
 
public function obtenirValeursUtilisateur($id_annuaire, $id_utilisateur) {
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire, false);
 
$this->chargerModele('MetadonneeModele');
 
$metadonnees = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id_annuaire);
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$valeurs_annuaire = $this->AnnuaireModele->obtenirValeursUtilisateur($id_annuaire, $id_utilisateur,$tableau_mappage[0]);
$valeurs_metadonnees= $this->MetadonneeModele->chargerListeValeursMetadonneesUtilisateur($id_annuaire, $id_utilisateur);
foreach($tableau_mappage[0] as $cle => $nom_champ) {
 
if($cle != 'champ_id') {
 
$nom_champ_formulaire = $metadonnees[$tableau_mappage[1][$cle]]['amc_abreviation'];
$valeur = $valeurs_annuaire[$nom_champ] ;
if(isset($valeurs_metadonnees[$nom_champ_formulaire])) {
if(isset($valeurs_metadonnees[$nom_champ_formulaire]['amv_valeur']) && $valeurs_metadonnees[$nom_champ_formulaire]['amv_valeur'] != '') {
$valeur = $valeurs_metadonnees[$nom_champ_formulaire]['amv_valeur'];
}
$informations_champ = array('amv_valeur' => $valeur,'amc_id_champ' => $tableau_mappage[1][$cle]) ;
$valeurs_metadonnees[$nom_champ_formulaire] = array_merge($valeurs_metadonnees[$nom_champ_formulaire],$informations_champ);
} else {
$informations_champ = array('amv_valeur' => $valeur,'amc_id_champ' => $tableau_mappage[1][$cle]) ;
$valeurs_metadonnees[$nom_champ_formulaire] = $informations_champ;
}
}
}
foreach($valeurs_metadonnees as $nom_champ => $valeur) {
$verificateur = new VerificationControleur();
$valeurs_metadonnees[$nom_champ] = $verificateur->verifierEtRemplacerValeurChampPourAffichage($valeur['amc_ce_type_affichage'],$valeur, 1);
}
return $valeurs_metadonnees;
}
public function obtenirInfosUtilisateurOpenId($id_annuaire,$id, $mail = true) {
 
$this->chargerModele('AnnuaireModele');
 
if($mail) {
$id = $this->AnnuaireModele->obtenirIdParMail($id_annuaire,$id);
}
 
$champs_mappage = $this->AnnuaireModele->obtenirChampsMappageAnnuaire($id_annuaire);
 
$valeurs = $this->AnnuaireModele->obtenirValeursUtilisateur($id_annuaire,$id, $champs_mappage[0]);
 
// TODO: valeurs incomplètes, voir ce qu'on renvoie obligatoirement
// et ce qu'on ne renvoie pas
$valeurs_open_id = array('fullname' => $valeurs[$champs_mappage[0]['champ_nom']].' '.$valeurs[$champs_mappage[0]['champ_prenom']],
'nickname' => $valeurs[$champs_mappage[0]['champ_nom']],
'dob' => '25/10/1984',
'email' => $valeurs[$champs_mappage[0]['champ_mail']],
'gender' => 'M',
'postcode' => $valeurs[$champs_mappage[0]['champ_code_postal']],
'country' => 'FR',
'language' => 'fr',
'timezone' => 'Europe/Paris');
 
return $valeurs_open_id;
}
 
public function comparerIdentifiantMotDePasse($id_annuaire,$id_utilisateur,$mot_de_passe, $utilise_mail = true, $mdp_deja_crypte = true) {
 
$this->chargerModele('AnnuaireModele');
 
if($utilise_mail) {
$id_utilisateur = $this->AnnuaireModele->obtenirIdParMail($id_annuaire,$id_utilisateur);
}
 
if(!$mdp_deja_crypte) {
$mot_de_passe = VerificationControleur::encrypterMotDePasseStatic($mot_de_passe);
}
 
return $this->AnnuaireModele->comparerIdentifiantMotDePasse($id_annuaire,$id_utilisateur,$mot_de_passe);
}
}
/tags/v1.1-andromede/controleurs/VerificationControleur.php
New file
0,0 → 1,534
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*
*/
 
/**
* Controleur chargé de la vérification des formulaires
* Remplace aussi les valeurs lors des actions spéciales comme la modification du mail
* (l'inscription à la lettre d'actu se fait aussi ici même si ça n'est pas totalement sa place)
*/
class VerificationControleur extends AppControleur {
 
/**
* Vérifie que les valeurs des champs de mappage et les valeurs obligatoires d'un annuaire donné
* sont correctes
* @param int $id_annuaire l'identifiant de l'annuaire
* @param Array $valeurs les valeurs à vérifier
*/
public function verifierErreursChampsSelonType($id_annuaire, $valeurs, $tableau_mappage) {
 
$erreurs = array();
 
$this->chargerModele('AnnuaireModele');
$tableau_champs_obligatoire = $this->AnnuaireModele->obtenirChampsObligatoires($id_annuaire);
if(!$tableau_champs_obligatoire) {
$tableau_champs_obligatoire = array();
}
 
foreach($valeurs as $id => $valeur_champ) {
 
$type = $valeur_champ['type'];
$valeur = $valeur_champ['valeur'];
$condition = $valeur_champ['condition'];
 
switch($type) {
 
case 'text':
if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
$erreurs[$id] = 'Ce champ est obligatoire';
}
break;
 
case 'mail':
if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
$erreurs[$id] = 'Le mail est obligatoire ';
}
 
if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && !$this->mailValide($valeur)) {
$erreurs[$id] = 'Le mail est invalide ';
}
 
if($this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
$erreurs[$id] = 'Cet email est déjà utilisé par quelqu\'un d\'autre ';
}
break;
 
case 'password':
if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == ''
|| $valeur != $condition) {
$erreurs[$id] = 'Le mot de passe est invalide';
}
break;
 
// cas du champ checkbox
case 'checkbox':
if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($condition) != 'on') {
$erreurs[$id] = 'N\'oubliez pas de cocher cette case';
}
break;
 
default:
 
break;
}
}
 
if(count($erreurs) == 0) {
$erreurs = false;
}
 
return $erreurs;
}
 
/**
* Vérifie les valeurs des champs pour la modification d'un formulaire
*/
public function verifierErreurChampModification($id_annuaire, $id_utilisateur, $type ,$valeur, $confirmation = false) {
 
$retour = array(true,false);
 
switch($type) {
case 'mail':
if(!$this->mailValide($valeur)) {
$retour[0] = false;
$retour[1] = 'mail invalide';
break;
}
 
$this->chargerModele('AnnuaireModele');
$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);
 
if($ancien_mail != $valeur && $this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
$retour[0] = false;
$retour[1] = 'cet email est déjà utilisé par quelqu\'un d\'autre';
}
 
break;
 
case 'password':
 
if(trim($valeur) != trim($confirmation)) {
$retour[0] = false;
$retour[1] = 'mot de passe invalide';
}
}
 
return $retour;
}
 
public function remplacerValeurChampPourInsertion($type, $valeur, $mail_utilisateur) {
 
$valeur_modifiee = $valeur;
 
switch($type) {
 
// cas du champ texte, à priori, rien de particulier
case 'text':
$valeur_modifiee = $valeur;
break;
 
// cas du champ password : on le crypte
case 'password':
$valeur_modifiee = $this->encrypterMotDePasse($valeur);
break;
 
// cas du champ checkbox
case 'checkbox':
// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
if(is_array($valeur)) {
// on stocke les valeurs d'ontologies liées au cases cochées
$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
 
} else {
if($valeur == 'on') {
// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
$valeur_modifiee = 1;
} else {
$valeur_modifiee = 0;
}
}
 
break;
 
case 'lettre':
if($valeur == 'on') {
// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
$valeur_modifiee = 1;
// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
$lettre_controleur = new LettreControleur();
$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
} else {
$valeur_modifiee = 0;
}
break;
 
default:
$valeur_modifiee = $valeur;
break;
}
 
return $valeur_modifiee;
}
 
public function remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, $type, $valeur, $mail_utilisateur) {
 
$valeur_modifiee = $valeur;
 
switch($type) {
 
// cas du champ texte, à priori, rien de particulier
case 'text':
$valeur_modifiee = $valeur;
break;
 
// cas du champ password : on le crypte
case 'password':
$valeur_modifiee = $this->encrypterMotDePasse($valeur);
break;
 
// cas du champ checkbox
case 'checkbox':
// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
if(is_array($valeur)) {
 
// on stocke les valeurs d'ontologies liées au cases cochées
$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
 
} else {
if($valeur == 'on' || $valeur == '1') {
// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
$valeur_modifiee = 1;
} else {
$valeur_modifiee = 0;
}
}
 
break;
 
case 'lettre':
 
// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
$lettre_controleur = new LettreControleur();
 
$this->chargerModele('AnnuaireModele');
$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
 
$changement_mail = false;
 
if($ancien_mail != $mail_utilisateur) {
$changement_mail = true;
}
 
if($valeur == 'on' || $valeur == '1') {
// on stocke 1 pour indique que la case est cochée (comme la checkbox oui/non)
$valeur_modifiee = 1;
 
// si le mail a changé on désinscrit l'ancien mail et on inscrit le nouveau
if($changement_mail) {
$lettre_controleur->ModificationInscriptionLettreActualite($ancien_mail, $mail_utilisateur);
} else {
 
$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
}
 
} else {
// sinon, si la case est vide
$valeur_modifiee = 0;
$mail_a_desinscrire = $mail_utilisateur;
if($changement_mail) {
$mail_a_desinscrire = $ancien_mail;
}
// on desinscrit l'utilisateur
$lettre_controleur->desinscriptionLettreActualite($mail_a_desinscrire);
}
break;
 
default:
$valeur_modifiee = $valeur;
break;
}
 
return $valeur_modifiee;
}
 
public function verifierEtRemplacerValeurChampPourAffichage($type, $valeur, $id_annuaire) {
 
if(!$type) {
$valeur_modifiee = array();
 
$valeur_modifiee['amv_type'] = 'champ_annuaire';
$valeur_modifiee['amv_valeur_affichage'] = $valeur;
 
} else {
if(!isset($valeur['amv_valeur'])) {
$valeur['amv_valeur'] = '';
}
 
$valeur_modifiee = $valeur;
 
switch($type) {
 
// cas du champ texte, à priori, rien de particulier
case 'text':
$valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
break;
// cas du champ texte long, à priori, rien de particulier
case 'textarea':
$valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
break;
 
// cas du champ checkbox
case 'checkbox':
// si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
if(isset($valeur['amo_nom'])) {
if(is_array($valeur['amo_nom']) && count($valeur['amo_nom']) > 0) {
// on stocke les valeurs d'ontologies liées au cases cochées
$valeur_modifiee['amv_valeur_affichage'] = implode(', ', $valeur['amo_nom']);
} else {
$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
}
} else {
// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
if($valeur_modifiee == 1) {
$valeur_modifiee['amv_valeur_affichage'] = 'oui';
} else {
$valeur_modifiee['amv_valeur_affichage'] = 'non';
}
}
break;
 
case 'select':
// TODO: si ça n'existe pas on va le chercher ?
if(isset($valeur['amo_nom'])) {
$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
} else {
if(isset($valeur['amv_valeur'])) {
$ontologie_modele = new OntologieModele();
$infos_onto = $ontologie_modele->chargerInformationsOntologie($valeur['amv_valeur']);
if(is_array($infos_onto) && !empty($infos_onto)) {
$valeur_modifiee['amv_valeur_affichage'] = $infos_onto['amo_nom'];
} else {
$valeur_modifiee['amv_valeur_affichage'] = '';
}
} else {
$valeur_modifiee['amv_valeur_affichage'] = '';
}
}
break;
 
case 'radio':
$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
break;
 
case 'image':
// si c'est une image, on recherche son url véritable à partir de l'id donnée en paramètre
if(isset($valeur['amv_valeur']) && $valeur['amv_valeur'] != '') {
$this->chargerModele('ImageModele');
$valeur_modifiee['amv_valeur_affichage'] = $this->ImageModele->obtenirEmplacementFichierParId($valeur['amv_valeur'],$id_annuaire, 'S');
}
break;
 
// cas du champ lettre
case 'lettre':
 
// on affiche oui ou non
if($valeur_modifiee['amv_valeur'] == 1) {
$valeur_modifiee['amv_valeur_affichage'] = 'oui';
} else {
$valeur_modifiee['amv_valeur_affichage'] = 'non';
}
break;
// cas de la date, on la formate
case 'date':
//echo '|'.$valeur['amv_valeur'].'|';
$format = Config::get('date_format_simple');
if(!isset($format)) {
$format = 'd/m/Y';
}
$time = strtotime($valeur['amv_valeur']);
if(!$time || $time == '') {
$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
} else {
$valeur_modifiee['amv_valeur_affichage'] = date($format, $time);
}
break;
 
default:
$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
break;
}
}
 
return $valeur_modifiee;
}
public function collecterValeurInscription($valeurs, $tableau_mappage) {
$valeurs_mappees = array();
$valeurs_a_inserer = array();
// on itère sur le tableau de valeur pour récupérer les champs de mappage;
foreach($valeurs as $nom_champ => $valeur) {
 
// pour chaque valeur
// on extrait l'id du champ
$ids_champ = mb_split("_",$nom_champ, 3);
 
if(count($ids_champ) == 3) {
 
$type = $ids_champ[0];
$id_champ = $ids_champ[2];
$condition = $ids_champ[1];
 
// cas de la checkbox qui devrait être là mais pas cochée
if($condition == 'hidden' && !isset($valeurs[$type.'_'.$id_champ])) {
// dans ce cas là on fabrique une valeur vide
$valeurs[$type.'_'.$id_champ] = 0;
}
 
} else {
$type = $ids_champ[0];
$condition = false;
$id_champ = $ids_champ[1];
}
 
// Si le champ fait partie des champs mappés
$cle_champ = array_search($id_champ, $tableau_mappage[1]);
 
// on ajoute sa clé correspondante dans le tableau des champs mappés
// qui sont les champs à vérifier
if($condition) {
$condition = $valeurs[$type.'_'.$id_champ];
$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => $condition);
} else {
//$valeurs_mappees[$cle_champ] = $valeur;
$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => false);
}
 
if(!$condition) {
$valeurs_a_inserer[$nom_champ] = $valeur;
}
}
return array('valeurs_mappees' => $valeurs_mappees, 'valeurs_a_inserer' => $valeurs_a_inserer);
}
 
/**
* Renvoie vrai ou faux suivant qu'un mail donné en paramètre est syntaxiquement valide (ne vérifie pas l'existence
* de l'adresse)
* @param string $mail le mail à tester
* @return boolean vrai ou faux suivant que le mail est valide ou non
*/
public function mailValide($mail) {
 
$regexp_mail = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
return preg_match($regexp_mail, $mail);
 
}
 
/**
* Renvoie un mot de passe crypté selon la fonction d'encryptage définie dans le fichier de configuration
* (si celle-ci n'existe pas on utilise une fonction par défaut)
* @param string $pass le mot de passe à encrypter
* @return string le mot de passe encrypté
*/
public function encrypterMotDePasse($pass) {
 
$fonction = Config::get('pass_crypt_fonct');
 
if(function_exists($fonction)) {
return $fonction($pass);
} else {
return md5($pass);
}
}
 
//TODO: créer une class util
static function encrypterMotDepasseStatic($pass) {
 
$fonction = Config::get('pass_crypt_fonct');
 
if(function_exists($fonction)) {
return $fonction($pass);
} else {
return md5($pass);
}
}
static function convertirTailleFichier($taille) {
if(!$taille) {
return "0 Mo";
}
return number_format($taille*(1/1024)*(1/1024), 0).' Mo';
}
public function genererMotDePasse() {
$pass = "";
$chaine = "abcdefghkmnpqrstuvwxyzABCDEFGHKLMNPQRSTUVWXYZ23456789";
 
srand((double)microtime()*1000000);
for($i = 0; $i < 10; $i++){
$pass .= $chaine[rand()%strlen($chaine)];
}
return $pass;
}
 
/**
* Suivant un identifiant de champ et un tableau, renvoie vrai ou faux suivant que le champs est obligatoire ou non
* @param int $id_champ l'identifiant de champ
* @param int $champ_obligatoire le tableau des champs obligatoires
*/
private function estUnchampObligatoire($id_champ, $champs_obligatoire) {
 
return in_array($id_champ, $champs_obligatoire) || in_array($id_champ, array_keys($champs_obligatoire));
}
/**
*
*/
private function remplacerLienHtml($texte) {
$expr = "(http[\S\.\/:]*)";
$matches = array();
preg_match_all($expr, $texte, $matches);
foreach($matches as $match) {
foreach($match as $element) {
$str_lien = '<br /><a class="info_resume" href="'.$element.'" >'.$element.'</a>';
$texte = str_replace($element, $str_lien, $texte);
}
}
return $texte;
}
}
?>
/tags/v1.1-andromede/controleurs/MessageControleur.php
New file
0,0 → 1,328
<?
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class MessageControleur extends AppControleur {
 
/**
* Les mails doivent ils être modérés ?
*/
private $moderer_mail = false;
 
/**
* Le ou les mails des modérateurs, si ce sont plusieurs mails,
* ils doivent être séparés par des virgules
*/
private $mail_moderateur = '';
 
/**
* Nombre de destinataires au dessus duquel on modère les mails
*/
private $seuil_moderation = 10;
 
/**
* Adresse mail de l'expéditeur à partir laquelle sont envoyée les mails de modération
*/
private $adresse_mail_annuaire = '';
 
/**
*
* Constructeur sans paramètres
*/
public function MessageControleur() {
 
$this->__construct();
 
// doit on modérer ?
if(Config::get('moderer_mail') != null) {
$this->moderer_mail = Config::get('moderer_mail');
}
 
// mail du modérateur pour l'envoi de messages au dessus d'un certain seuil
if($this->moderer_mail && Config::get('mail_moderateur') != null) {
$this->mail_moderateur = Config::get('mail_moderateur');
}
 
// seuil de modération
if($this->moderer_mail && Config::get('seuil_moderation_messages') != null) {
$this->seuil_moderation = Config::get('seuil_moderation_messages');
}
 
// adresse d'expéditeur
if(Config::get('adresse_mail_annuaire') != null) {
$this->adresse_mail_annuaire = Config::get('adresse_mail_annuaire');
}
}
/** -------------------Fonctions pour l'inscription et l'oubli de mot de passe -----------------------*/
 
/**
* En cas de tentative d'inscription, envoie un mail contenant un lien de confirmation à l'utilisateur
* @param string $adresse_mail adresse mail
* @param string $nom nom
* @param string $prenom prénom
* @param string $code_confirmation_inscription code de confirmation à inclure dans le mail
*
* @return boolean le succès ou l'échec de l'envoi du mail
*/
public function envoyerMailConfirmationInscription($adresse_mail, $nom, $prenom, $code_confirmation_inscription) {
 
$url_cette_page = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$base_url = new URL($url_cette_page);
$base_url->setVariablesRequete(array());
$base_url->setVariableRequete('m','annuaire_inscription_confirmation');
$base_url->setVariableRequete('id',$code_confirmation_inscription);
 
$donnees = array('nom' => $nom, 'prenom' => $prenom, 'lien_confirmation_inscription' => $base_url->getURL());
$contenu_mail = $this->getVue(Config::get('dossier_squelettes_mails').'mail_confirmation_inscription',$donnees);
// en attendant de gérer mieux l'envoi en mode texte
// remplacement du &amp dans les urls
$contenu_mail = str_replace('&amp;', '&', $contenu_mail);
 
// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
$entetes = 'MIME-Version: 1.0' . "\r\n";
$entetes .= 'Content-type: text/html; charset='.Config::get('appli_encodage'). "\r\n";
// En-têtes additionnels
$entetes .= 'From: '.Config::get('adresse_mail_annuaire')."\r\n";
 
return mail($adresse_mail,'Inscription à l\'annuaire',$contenu_mail, $entetes);
 
}
 
/** En cas d'oubli de mot de passe, régénère le mot de passe et envoie un mail à l'utilisateur
* @param int $id_annuaire l'identifiant d'annuaire
* @param string $adresse_mail adresse mail
* @return boolean le succès ou l'échec de l'envoi du mail
*/
public function envoyerMailOubliMdp($id_annuaire,$mail, $nouveau_mdp) {
 
$base_url = clone(Registre::getInstance()->get('base_url_application'));
$url_cette_page = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url_base = $url_cette_page;
$base_url = new URL($url_base);
$base_url->setVariablesRequete(array());
$base_url->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$base_url->setVariableRequete('id_annuaire',$id_annuaire);
 
$donnees['nouveau_mdp'] = $nouveau_mdp;
$donnees['lien_profil'] = $base_url;
 
$contenu_mail = $this->getVue(Config::get('dossier_squelettes_mails').'mail_oubli_mdp',$donnees);
 
// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
$entetes = 'MIME-Version: 1.0' . "\r\n";
$entetes .= 'Content-type: text/html; charset='.Config::get('appli_encodage'). "\r\n";
// En-têtes additionnels
$entetes .= 'From: '.Config::get('adresse_mail_annuaire')."\r\n";
 
return mail($mail,'Demande de réinitialisation de mot de passe',$contenu_mail, $entetes);
 
}
 
/** -------------------Fonctions pour la messagerie entre utilisateurs -----------------------*/
/** Envoie un mail avec l'adresse de l'utilisateur donné en paramètre,
* à l'adresse donnée en paramètre
* @param string $expediteur l'expediteur du message
* @param mixed $destinataires un string ou un tableau de mails qui contiennent les destinataire
* @param string $sujet sujet du mail
* @return boolean true ou false suivant le succès ou non de l'envoi
*/
public function envoyerMail($expediteur, $destinataires, $sujet, $message) {
 
if(is_array($destinataires)) {
$destinataires = implode(',',$destinataires);
}
 
// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
$entetes = 'MIME-Version: 1.0' . "\r\n";
$entetes .= 'Content-type: text/html; charset='.Config::get('appli_encodage'). "\r\n";
$entetes .= 'Bcc:'.$destinataires . "\r\n";
// En-têtes additionnels
$entetes .= 'From: '.$expediteur."\r\n";
 
$contenu_mail = $message;
 
return mail('', $sujet, $contenu_mail, $entetes);
}
 
/**
* Avec des l'informations d'expéditions données en paramètres, décide si un mail peut être envoyé directement
* ou bien s'il doit être stocké et soumis à modération
* @param int $id_annuaire l'identifiant de l'annuaire à utiliser
* @param string $expediteur l'expéditeur du mail
* @param array $destinataires les destinataires du mail
* @param string $sujet sujet du message
* @param string $message corps du message
*/
public function envoyerMailDirectOuModere($id_annuaire, $expediteur, $destinataires, $sujet = '', $message = '') {
$destinataires_mail = $this->obtenirMailParTableauId($id_annuaire, $destinataires);
$donnees['contenu_message'] = $this->filtrerChaine($message);
$sujet = $this->filtrerChaine($sujet);
$message = $this->getVue(Config::get('dossier_squelettes_mails').'mail_messagerie',$donnees);
 
// si on modere les mails et s'il y a trop de destinataires
if($this->moderer_mail && count($destinataires_mail) >= $this->seuil_moderation) {
// on prévient le moderateur
$this->stockerMailPourModeration($expediteur, $destinataires_mail, $sujet, $message);
$donnees['moderation'] = true;
} else {
// sinon, envoi direct
$this->envoyerMail($expediteur, $destinataires_mail, $sujet, $message);
$donnees['moderation'] = false;
}
 
$resultat = $this->getVue(Config::get('dossier_squelettes_annuaires').'message_envoi_confirmation',$donnees);
 
return $resultat;
 
}
 
/**
* Retrouve les informations d'un mail en attente de modération et envoie le mail
* @param string $code_confirmation le code associé au données en attente
*/
public function envoyerMailModere($code_confirmation) {
 
// chargement des données temporaire
$message_modele = $this->getModele('DonneeTemporaireModele');
$mail_a_moderer = $message_modele->chargerDonneeTemporaire($code_confirmation);
 
if($mail_a_moderer) {
// envoi
$resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'],
$mail_a_moderer['destinataires'],
$mail_a_moderer['sujet'],
$mail_a_moderer['message']);
if($resultat_envoi) {
$donnees = array('envoi_reussi' => true);
} else {
$donnees = array('envoi_echoue' => true);
}
// suppression des données temporaires
// TODO: envoyer un message à l'utilisateur original ?
$supression_donnees_temp = $message_modele->supprimerDonneeTemporaire($code_confirmation);
} else {
$donnees = array('message_inexistant' => true);
}
 
$resultat = $this->getVue(Config::get('dossier_squelettes_annuaires').'message_moderation_confirmation',$donnees);
return $resultat;
}
 
/**
* Supprime un mail en attente de modération grâce au code donné en paramètre
* @param string $code_confirmation le code associé au données en attente
*/
public function supprimerMailModere($code_confirmation) {
 
$message_modele = $this->getModele('DonneeTemporaireModele');
$supression_donnees_temp = $message_modele->supprimerDonneeTemporaire($code_confirmation);
$donnees = array('message_supprime' => true);
 
$resultat = $this->getVue(Config::get('dossier_squelettes_annuaires').'message_moderation_confirmation',$donnees);
 
return $resultat;
}
public function obtenirMailParTableauId($id_annuaire, $destinataires) {
// on remplace les identifiants par leurs destinataires
$this->chargerModele('AnnuaireModele');
$destinataires_mails = $this->AnnuaireModele->obtenirMailParTableauId($id_annuaire, $destinataires);
return $destinataires_mails;
}
 
/**
* Stocke un mail dans la base des données temporaires et envoie un mail au modérateur
* @param string $expediteur l'expéditeur du mail
* @param array $destinataires les destinataires du mail
* @param string $sujet sujet du message
* @param string $message corps du message
*/
private function stockerMailPourModeration($expediteur ,$destinataires, $sujet, $message) {
 
$mail = array('expediteur' => $expediteur,
'destinataires' => $destinataires,
'sujet' => $sujet,
'message' => $message);
 
$message_modele = $this->getModele('DonneeTemporaireModele');
$id_stockage = $message_modele->stockerDonneeTemporaire($mail, true);
 
if($id_stockage) {
$this->envoyerMailModeration($id_stockage, $destinataires, $sujet , $message);
return true;
}
 
return false;
 
}
 
/**
* Envoie un mail au modérateur contenant les lien pour, au choix, refuser ou bien accepter l'envoi du mail
* @param int $id_mail_a_moderer identifiant du mail à modérer (dans la table des données temporaires)
* @param string $sujet_message_a_moderer sujet du message
* @param string $message_a_moderer corps du message
*/
private function envoyerMailModeration($id_mail_a_moderer, $destinataires, $sujet_message_a_moderer, $message_a_moderer) {
 
$url_cette_page = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url_base = $url_cette_page;
 
$base_url = new URL($url_base);
 
$base_url->setVariablesRequete(array());
 
$donnees = array();
 
$base_url->setVariableRequete('id',$id_mail_a_moderer);
 
$lien_accepter_mail = clone($base_url);
$lien_refuser_mail = clone($base_url);
 
$lien_accepter_mail->setVariableRequete('m','message_moderation_confirmation');
$lien_refuser_mail->setVariableRequete('m','message_moderation_suppression');
 
$donnees['lien_accepter_mail'] = $lien_accepter_mail;
$donnees['lien_refuser_mail'] = $lien_refuser_mail;
$donnees['sujet_message'] = $sujet_message_a_moderer;
$donnees['contenu_message'] = $message_a_moderer;
if(is_array($destinataires)) {
$destinataires = implode(', ', $destinataires);;
}
$donnees['destinataires_message'] = $destinataires;
 
$contenu_mail = $this->getVue(Config::get('dossier_squelettes_mails').'mail_moderation_message',$donnees);
echo $contenu_mail;
exit;
 
return $this->envoyerMail($this->adresse_mail_annuaire, $this->mail_moderateur, 'Un message est en attente de modération', $contenu_mail);
 
}
private function filtrerChaine($message) {
return strip_tags($message);
}
 
}
/tags/v1.1-andromede/controleurs/IdentificationControleur.php
New file
0,0 → 1,105
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class IdentificationControleur extends AppControleur {
 
private $nom_cookie_persistant = '';
private $duree_identification = '0';
private $fonction_cryptage_mdp_cookie = 'md5';
private $objet_identification = null;
/*public function IdentificationControleur() {
 
Controleur::__construct();
$this->cookie_persistant_nom = session_name().'-memo';
$this->cookie_persistant_nom = 'pap-admin_papyrus_-memo';
$this->duree_identification = time()+Config::get('duree_session_identification');
$this->fonction_cryptage_mdp_cookie = Config::get('fonction_cryptage_mdp_cookie');
}*/
 
public function afficherFormulaireIdentification($id_annuaire, $donnees = array()) {
 
$this->chargerModele('AnnuaireModele');
$annuaire = $this->AnnuaireModele->chargerAnnuaire($id_annuaire);
 
if(!isset($donnees['informations'])) {
$donnees['informations'] = array();
}
 
$donnees['id_annuaire'] = $id_annuaire;
 
return $this->getVue(Config::get('dossier_squelettes_formulaires').'identification',$donnees);
}
 
public function loggerUtilisateur($utilisateur, $pass) {
$this->objet_identification = Config::get('objet_identification');
// on cree le cookie
$this->creerCookie($utilisateur, $pass);
// On loggue l'utilisateur
$this->objet_identification->username = $utilisateur;
$this->objet_identification->password = $pass;
$this->objet_identification->login();
 
return true;
}
public function deLoggerUtilisateur() {
$this->objet_identification = Config::get('objet_identification');
$this->objet_identification->logout();
return true;
}
public function setUtilisateur($nom_utilisateur) {
$this->objet_identification = Config::get('objet_identification');
$this->objet_identification->setAuth($nom_utilisateur);
$pass = $this->objet_identification->password;
$this->creerCookie($nom_utilisateur, $pass, true);
}
public function creerCookie($utilisateur, $pass, $pass_deja_crypte = false) {
$this->objet_identification = Config::get('objet_identification');
// Expiration si l'utilisateur ne referme pas son navigateur
$this->objet_identification->setExpire(0);
// Création d'un cookie pour rendre permanente l'identification de Papyrus
if(!$pass_deja_crypte) {
$pass_crypt = md5($pass);
} else {
$pass_crypt = $pass;
}
$cookie_val = $pass_crypt.$utilisateur;
setcookie(session_name().'-memo', $cookie_val, 0, '/');
}
public function obtenirLoginUtilisateurParCookie() {
 
$nom_session = Config::get('nom_session');
if(isset($_COOKIE[$nom_session])) {
$cookie_val = $_COOKIE[$nom_session];
$login_utilisateur = substr($cookie_val, '32', strlen($cookie_val));
return $login_utilisateur;
} else {
return false;
}
}
}
?>
/tags/v1.1-andromede/controleurs/GestionAnnuaireControleur.php
New file
0,0 → 1,231
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class GestionAnnuaireControleur extends AppControleur {
 
private $id_liste_champs = 30768;
/**--------Fonctions d'ajout et de modification des annuaires --------*/
/**
* Charge la vue contenant les informations d'un annuaire donné en paramètre
* @param int $id l'identifiant de l'annuaire
* @return string la vue contenant les informations sur l'annuaire
*/
public function chargerAnnuaire($id) {
$this->chargerModele('AnnuaireModele');
$this->chargerModele('MetadonneeModele');
$data['erreurs'] = array();
$data['champs_mappage'] = $this->obtenirChampsMappageAnnuaire($id);
$data['annuaire'] = $this->AnnuaireModele->chargerAnnuaire($id, true);
$data['metadonnees'] = $this->MetadonneeModele->chargerListeMetadonneeAnnuaire($id);
$annuaire = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'annuaire', $data);
 
return $annuaire;
}
/**
* Affiche le formulaire d'ajout d'un annuaire
* @param Array $valeurs les valeurs à inclure dans le formulaire (dans le cas du retour erreur)
* @return string la vue contenant le formulaire
*/
public function afficherFormulaireAjoutAnnuaire($donnees) {
 
$champs = array(
"aa_nom" => '',
"aa_description" => '',
"aa_bdd" => '',
"aa_table" => '',
"aa_code" => '',
"aa_champ_id" => '',
"aa_champ_nom" => '',
"aa_champ_mail" => '',
"aa_champ_pass" => ''
);
$donnees = $donnees;
 
$formulaire_ajout_annuaire = $this->getVue(Config::get('dossier_squelettes_gestion_annuaires').'annuaire_ajout',$donnees);
 
return $formulaire_ajout_annuaire;
}
public function ajouterAnnuaire($valeurs) {
$champs = array(
"aa_nom" => '',
"aa_description" => '',
"aa_bdd" => '',
"aa_table" => '',
"aa_code" => '',
"aa_champ_id" => '',
"aa_champ_nom" => '',
"aa_champ_mail" => '',
"aa_champ_pass" => ''
);
$donnees = array('erreurs_champs' => array());
// vérification de la présence de tous les champs
foreach($champs as $nom_champ => $valeur) {
if(!isset($valeurs[$nom_champ]) || $valeurs[$nom_champ] == '') {
$donnees['erreurs_champs'][$nom_champ] = 'Ce champ est obligatoire';
}
}
// si il y a une erreur on réaffiche le formulaire
if(!empty($donnees['erreurs_champs'])) {
return $this->afficherFormulaireAjoutAnnuaire($donnees);
}
$champs_a_verifier = array($valeurs[aa_champ_id],$valeurs[aa_champ_nom],$valeurs[aa_champ_mail],$valeurs[aa_champ_pass]);
$informations_annuaire = array(
"aa_nom" => $valeurs['aa_nom'],
"aa_description" => $valeurs['aa_description'],
"aa_bdd" => $valeurs['aa_bdd'],
"aa_table" => $valeurs['aa_table'],
"aa_code" => $valeurs['aa_code'],
);
$informations_champs = array(
"aa_champ_id" => $valeurs['aa_champ_id'],
"aa_champ_nom" => $valeurs['aa_champ_nom'],
"aa_champ_mail" => $valeurs['aa_champ_mail'],
"aa_champ_pass" => $valeurs['aa_champ_pass']
);
$this->chargerModele('GestionAnnuaireModele');
$annuaire_existe = $this->GestionAnnuaireModele->verifierPresenceTable($valeurs['aa_bdd'], $valeurs['aa_table']);
// si l'annuaire existe déjà
if($annuaire_existe) {
$champs_existent = $this->GestionAnnuaireModele->verifierPresenceChamps($valeurs['aa_bdd'], $valeurs['aa_table'], $champs_a_verifier);
// si l'annuaire existe déjà
if($champs_existent) {
// tout existe déjà, rien à créer
}
} else {
$creation_table = $this->creerTableAnnuaire($informations_annuaire, $informations_champs);
if(!$creation_table) {
$donnees['erreurs'] = 'Impossible de créer la table '.$informations_annuaire['aa_table'].' dans la base '.$informations_annuaire['aa_bdd'];
}
}
// on insere un nouvel enregistrement dans la table des annuaire
$id_annuaire = $this->GestionAnnuaireModele->AjouterAnnuaire($informations_annuaire);
if(!$id_annuaire) {
$donnees['erreurs_champs'][$nom_champ] = 'Impossible d\'ajouter les infos de la table '.$valeurs['aa_table'].' dans la base de données '.$valeurs['aa_bdd'] ;
}
// on cree un set de métadonnées minimal
$this->creerEtMapperChampsMetadonneeMinimaux($id_annuaire, $informations_champs);
return $this->chargerAnnuaire($id_annuaire);
}
private function creerTableAnnuaire($informations_annuaire, $information_champs) {
$this->chargerModele('GestionAnnuaireModele');
$this->GestionAnnuaireModele->creerTableAnnuaire($informations_annuaire, $information_champs);
}
private function creerEtMapperChampsMetadonneeMinimaux($id_annuaire, $informations_champs) {
$metadonnee_controleur = new MetadonneeControleur();
$this->chargerModele('MappageModele');
$this->chargerModele('MetadonneeModele');
foreach($informations_champs as $type_champ => $nom) {
$role = str_replace('aa_','',$type_champ);
if($role == 'champ_id') {
$valeurs_mappage = array(
'id_annuaire' => $id_annuaire,
'id_champ_annuaire' => $nom,
'role' => 'champ_id',
'id_champ_metadonnee' => ''
);
$creation = $this->MappageModele->ajouterNouveauMappage($id_annuaire, $nom, 'champ_id', '0');
 
} else {
$valeurs_insertion = $this->renvoyerInformationChampPourType($id_annuaire, $role, $nom);
$metadonnee_controleur->ajouterNouvelleMetadonnee($valeurs_insertion);
$id_champ_metadonnee = $this->MetadonneeModele->renvoyerIdChampMetadonneeParAbreviation($id_annuaire, $valeurs_insertion['amc_abreviation']);
// on affecte à chaque champ son role
$this->MappageModele->ajouterNouveauMappage($id_annuaire, $nom, $role, $id_champ_metadonnee);
// et on le rend obligatoire
$this->MappageModele->ajouterNouveauMappage($id_annuaire, $nom, 'champ_obligatoire', $id_champ_metadonnee);
 
}
}
return true;
}
private function renvoyerInformationChampPourType($id_annuaire, $type, $nom) {
$valeurs = array();
$this->chargerModele('MetadonneeModele');
$id_liste_champs = $this->id_liste_champs;
switch($type) {
case 'champ_nom':
$affichage = $this->MetadonneeModele->renvoyerCorrespondanceIdParAbreviation('text',$id_liste_champs);
$valeurs = array('amc_nom' => $nom,
'amc_abreviation' => 'nom' ,
'amc_description' => 'Nom',
'amc_ce_annuaire' => $id_annuaire,
'amc_ce_type_affichage' => $affichage,
'amc_ce_ontologie' => '0'
);
break;
case 'champ_mail':
$affichage = $this->MetadonneeModele->renvoyerCorrespondanceIdParAbreviation('mail',$id_liste_champs);
$valeurs = array('amc_nom' => $nom,
'amc_abreviation' => 'mail',
'amc_description' => 'Adresse electronique',
'amc_ce_annuaire' => $id_annuaire,
'amc_ce_type_affichage' => $affichage,
'amc_ce_ontologie' => '0'
);
break;
case 'champ_pass':
$affichage = $this->MetadonneeModele->renvoyerCorrespondanceIdParAbreviation('password',$id_liste_champs);
$valeurs = array('amc_nom' => $nom,
'amc_abreviation' => 'pass',
'amc_description' => 'Mot de passe',
'amc_ce_annuaire' => $id_annuaire,
'amc_ce_type_affichage' => $affichage,
'amc_ce_ontologie' => '0'
);
break;
}
return $valeurs;
}
}
/tags/v1.1-andromede/cartes/pays_europe.html
New file
0,0 → 1,48
<div id="cartographie">
<img id="carte-img" src="http://162.38.234.9/annuaire/cartes/pays_europe.png" alt="info" usemap="#carte-map" />
<map name="carte-map">
<area shape="poly" title="Albanie (0 inscrit)" class="zone-al" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=al" coords="346,416,351,422,351,435,356,439,357,444,354,447,352,451,348,454,346,454,339,450,337,444,338,438,341,432,340,427,338,425,340,418" />
<area shape="poly" title="Allemagne (20 inscrits)" class="zone-de" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=de" coords="239,247,254,231,261,234,274,240,292,240,300,250,297,263,295,264,300,269,299,278,301,287,299,292,298,294,287,298,280,299,275,301,276,305,277,312,278,313,288,324,286,327,283,329,279,331,280,340,275,339,266,338,263,342,258,339,253,338,252,340,249,337,247,337,243,334,236,331,236,334,232,334,227,332,228,327,236,314,222,308,220,304,221,296,221,293,223,291,222,287,219,285,219,282,220,281,223,277,224,276,223,273,223,270,227,271,229,270,231,268,233,267,234,266,233,265,231,264,232,261,233,260,235,260,237,258,238,254,238,254" />
<area shape="poly" title="Andorre (2 inscrits)" class="zone-an" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=an" coords="150,389,154,390,155,394,150,394" />
<area shape="poly" title="Autriche (4 inscrits)" class="zone-at" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=at" coords="249,344,249,347,251,347,254,346,256,348,259,349,260,347,270,347,272,352,281,356,284,356,293,358,296,356,306,356,311,350,312,346,316,341,318,341,318,338,316,336,316,329,310,328,307,326,305,326,303,324,300,324,299,328,297,330,291,330,288,329,286,330,285,332,280,334,280,337,282,340,282,342,280,345,276,342,272,342,267,341,264,344,260,344,257,341,255,341,255,343,253,345,251,344,250,341,248,340,247,342" />
<area shape="poly" title="Belgique (306 inscrits)" class="zone-be" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=be" coords="190,275,191,280,196,280,198,285,201,288,201,291,201,293,204,295,206,293,206,292,207,293,208,296,209,298,211,301,213,302,215,302,215,297,215,296,218,295,219,295,222,293,222,290,219,286,218,285,218,283,220,280,220,279,217,277,214,275,212,275,208,275,206,276,203,274,200,273,197,275" />
<area shape="poly" title="Biélorussie (1 inscrit)" class="zone-by" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=by" coords="425,282,429,281,430,283,432,283,438,282,440,283,440,275,443,272,447,269,446,267,447,265,442,259,442,256,444,254,446,254,450,255,454,252,451,248,448,248,445,246,445,244,440,240,439,237,436,236,435,230,433,228,434,224,427,220,425,223,423,223,422,220,420,220,417,221,415,219,412,219,406,225,404,225,401,226,401,228,403,230,403,233,401,235,398,237,396,240,396,248,394,249,392,248,390,250,386,253,381,254,378,253,378,258,381,262,381,271,377,275,380,279,380,284,382,285,384,284,386,281,396,278,401,278,403,280,410,280,413,283,416,283,420,282,422,281" />
<area shape="poly" title="Bosnie-Herzégovine (0 inscrit)" class="zone-ba" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ba" coords="333,402,338,399,338,397,340,396,336,391,338,384,335,384,333,382,326,381,324,382,321,379,314,379,310,380,308,381,305,379,305,382,307,384,307,387,308,390,310,392,315,399,318,402,323,408,323,410,327,410,330,411,330,407,332,405" />
<area shape="poly" title="Bulgarie (2 inscrits)" class="zone-bg" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=bg" coords="374,393,392,398,406,395,416,390,425,387,435,393,436,393,429,400,429,411,433,418,415,422,412,423,412,428,403,430,398,431,391,427,385,431,378,428,376,421,373,416,372,409,375,405,374,402" />
<area shape="poly" title="Chypre (1 inscrit)" class="zone-cy" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=cy" coords="230,427,218,427,216,452,220,459,224,460,231,457,236,434" />
<area shape="poly" title="Croatie (0 inscrit)" class="zone-hr" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=hr" coords="302,369,302,361,307,360,309,359,313,360,315,360,318,362,320,366,321,368,326,369,329,369,333,369,335,371,335,374,336,377,334,379,332,380,329,379,323,380,322,377,319,377,311,376,306,376,305,376,303,378,303,379,305,383,306,385,306,388,307,392,322,408,326,411,330,414,329,417,322,413,312,411,293,392,283,380,282,370,292,370" />
<area shape="poly" title="Danemark (1 inscrit)" class="zone-dk" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=dk" coords="254,205,273,193,286,218,286,234,281,240,271,236,262,233,253,230,249,233" />
<area shape="poly" title="Espagne (57 inscrits)" class="zone-es" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=es" coords="47,363,46,351,52,349,55,349,59,346,63,346,71,351,78,353,83,355,89,359,93,363,98,364,103,365,107,367,114,369,119,372,123,373,125,375,127,378,129,380,131,382,134,385,136,385,140,387,142,388,145,386,150,389,155,392,155,395,157,397,164,399,168,398,169,403,169,405,176,437,139,449,95,465,51,461,37,438,38,433,48,428,43,421,49,418,52,412,47,404,55,404,63,387,68,384,71,382,67,378,67,372,62,374,54,370,49,370,52,363" />
<area shape="poly" title="Estonie (0 inscrit)" class="zone-ee" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ee" coords="403,168,389,168,376,173,372,176,362,178,360,187,362,194,381,191,387,191,394,196,404,195,405,192,401,177,405,175" />
<area shape="poly" title="Finlande (1 inscrit)" class="zone-fi" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=fi" coords="401,154,369,167,355,153,354,121,377,86,370,81,364,49,351,36,355,33,360,41,365,38,370,42,374,37,376,35,377,24,384,21,391,26,391,44,396,46,401,51,397,60,399,67,404,73,404,85,407,86,404,91,410,93,410,98,413,102,410,107,420,114,420,125,410,143" />
<area shape="poly" title="France (8114 inscrits)" class="zone-fr" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=4&amp;pays=fr" coords="115,291,133,291,144,298,145,284,175,287,179,284,182,277,188,276,191,279,198,282,197,285,201,288,201,293,204,296,206,293,209,298,212,301,215,303,218,305,223,309,229,311,234,313,236,314,230,323,228,327,228,333,226,334,218,333,221,337,208,346,210,350,216,349,218,351,219,355,216,356,215,358,217,363,217,365,211,367,215,382,219,381,219,388,240,402,235,423,230,425,169,397,155,396,154,391,145,386,142,388,133,384,122,372" />
<area shape="poly" title="Grèce (3 inscrits)" class="zone-gr" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=gr" coords="378,430,385,431,392,428,398,432,406,430,412,430,413,423,417,423,419,428,416,433,413,436,520,496,515,509,493,517,402,522,379,513,363,497,351,480,346,472,348,457,350,455,351,450,355,449,355,444,358,438,363,438,367,435" />
<area shape="poly" title="Hongrie (0 inscrit)" class="zone-hu" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=hu" coords="337,366,339,366,346,363,354,363,357,362,357,360,359,358,360,355,362,353,363,347,368,342,369,340,372,339,373,337,371,337,367,333,363,334,362,331,360,331,355,332,353,331,351,333,346,339,342,338,339,340,336,340,335,342,325,343,320,338,320,342,317,343,315,345,313,352,312,354,313,359,316,362,318,362,320,364,324,369,331,369,335,368" />
<area shape="poly" title="Irlande (2 inscrits)" class="zone-ie" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ie" coords="125,191,114,194,101,196,85,222,84,228,85,235,91,238,120,238,129,226,130,212,125,205,121,207,120,203,120,198" />
<area shape="poly" title="Islande (1 inscrit)" class="zone-is" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=is" coords="98,3,88,24,92,39,103,54,119,57,151,58,161,43,162,25,135,9,124,1" />
<area shape="poly" title="Italie (31 inscrits)" class="zone-it" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=it" coords="216,357,217,365,212,367,215,382,219,381,219,387,232,381,242,385,245,392,249,402,250,409,255,416,217,431,217,454,221,460,276,433,284,439,286,442,288,444,292,449,294,451,259,475,260,482,287,500,291,499,332,450,273,375,281,366,281,360,284,355,277,354,272,351,269,346,259,347,258,349,254,347,251,350,252,351,248,352,246,354,243,351,240,353,240,355,237,357,236,356,232,353,229,356,225,357" />
<area shape="poly" title="Lettonie (0 inscrit)" class="zone-lv" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=lv" coords="384,191,360,200,356,206,354,212,356,219,363,215,373,213,376,218,383,215,389,218,395,220,402,225,411,217,408,210,406,205,409,201,401,197,393,196" />
<area shape="poly" title="Liechtenstein (0 inscrit)" class="zone-li" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=li" coords="246,340,244,341,244,346,248,346" />
<area shape="poly" title="Lituanie (0 inscrit)" class="zone-lt" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=lt" coords="356,220,362,214,374,214,376,218,380,217,384,216,389,220,393,220,399,225,401,230,398,232,394,236,395,246,391,246,384,250,378,251,372,245,369,239,371,234,364,233,358,231,356,226" />
<area shape="poly" title="Luxembourg (11 inscrits)" class="zone-lu" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=lu" coords="220,305,221,301,220,297,219,297,217,300,217,304" />
<area shape="poly" title="Macédoine (0 inscrit)" class="zone-mk" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=mk" coords="362,439,366,435,375,435,377,432,377,426,370,418,369,418,366,420,364,420,354,423,353,434,357,439" />
<area shape="poly" title="Malte (0 inscrit)" class="zone-mt" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=mt" coords="294,508,290,510,292,516,297,517,301,513,299,509" />
<area shape="poly" title="Moldavie (0 inscrit)" class="zone-md" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=md" coords="436,353,438,353,443,354,443,349,440,348,439,346,440,343,438,343,435,340,435,338,434,335,431,334,430,332,425,332,421,329,418,329,412,330,412,332,416,336,418,341,428,350,428,352,429,356,428,366,429,368,431,367,432,363,435,360,435,357,434,355" />
<area shape="poly" title="Monaco (7 inscrits)" class="zone-mc" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=mc" coords="218,390,212,387,211,390" />
<area shape="poly" title="Norvège (0 inscrit)" class="zone-no" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=no" coords="283,175,279,160,275,174,270,175,259,185,246,188,239,170,246,126,262,115,290,96,308,49,359,10,368,7,387,7,401,11,400,23,391,33,391,23,383,20,376,24,375,35,371,41,365,37,360,41,353,33,349,36,345,44,339,44,337,45,334,51,329,53,325,58,327,64,320,75,314,78,307,99,309,103,307,105,303,105,301,106,295,112,294,140,296,143,297,148,292,147,292,161,288,164" />
<area shape="poly" title="Pays-Bas (9 inscrits)" class="zone-nl" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=nl" coords="215,252,225,246,236,251,237,254,234,258,232,260,231,261,231,265,234,266,231,267,229,270,226,271,223,270,222,271,223,274,223,278,221,278,217,277,214,275,211,273,208,274,206,275,204,275,200,271,201,269,207,268,212,261,214,258" />
<area shape="poly" title="Pologne (0 inscrit)" class="zone-pl" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=pl" coords="302,249,311,248,322,241,334,239,338,245,347,245,354,246,374,246,377,249,376,257,381,261,380,266,376,269,373,273,375,276,378,279,379,285,378,287,380,291,381,294,381,298,380,300,377,303,374,307,370,314,370,317,372,319,370,320,364,316,359,315,356,316,351,317,346,317,345,318,340,315,338,316,337,316,333,311,333,308,330,308,327,306,319,300,318,306,315,302,311,298,300,291,301,287,299,282,299,278,300,272,300,269,294,265,297,262,299,254" />
<area shape="poly" title="Portugal (9 inscrits)" class="zone-pt" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=pt" coords="45,366,30,387,22,398,22,405,20,419,19,430,19,433,21,438,27,439,31,439,37,439,38,433,47,428,46,424,44,421,46,419,49,418,52,413,47,403,51,405,54,405,55,404,62,386,68,385,71,382,69,379,67,379,66,373,61,375,55,370,50,370,52,364" />
<area shape="poly" title="République Tchèque (4 inscrits)" class="zone-cz" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=cz" coords="316,326,318,327,321,325,323,325,330,326,330,323,335,318,333,315,333,313,331,311,327,311,324,308,323,306,320,305,320,308,316,309,314,307,313,303,312,301,307,299,305,297,301,296,299,298,293,297,290,298,288,300,278,303,277,305,279,307,279,309,278,312,282,316,285,320,288,322,293,328,297,327,297,325,299,322,304,322,306,324,308,324,311,326" />
<area shape="poly" title="Roumanie (6 inscrits)" class="zone-ro" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ro" coords="375,334,394,339,408,331,416,335,418,340,427,350,427,354,427,363,430,369,433,370,439,367,444,368,444,373,442,374,436,377,437,385,434,392,424,388,402,395,391,396,382,395,373,391,371,387,372,384,369,381,366,382,360,382,360,376,356,372,349,364,358,362,363,350,364,343" />
<area shape="poly" title="Royaume-Uni (7 inscrits)" class="zone-uk" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=uk" coords="129,192,125,197,121,199,119,204,121,207,125,205,127,209,128,210,131,212,132,214,136,243,127,244,128,249,115,266,120,272,167,279,174,276,183,271,192,253,205,131,194,135,142,154,137,167" />
<area shape="poly" title="Russie (0 inscrit)" class="zone-ru" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ru" coords="345,237,350,234,354,228,362,234,369,234,370,238,369,241,373,246,347,245 488,1,463,21,405,17,400,24,396,29,394,31,393,37,392,39,392,44,393,45,396,46,398,51,399,53,399,57,398,60,398,65,400,69,401,74,403,78,404,83,405,86,406,88,404,90,407,92,409,95,411,98,412,101,414,102,412,104,412,105,413,109,417,111,420,114,422,118,423,119,423,123,422,125,421,129,420,129,419,130,416,134,415,137,413,140,411,142,408,143,406,147,403,150,402,151,401,153,405,169,404,175,402,179,404,198,407,201,407,206,412,215,428,217,436,222,436,223,437,228,437,232,440,237,444,240,446,242,451,244,453,246,454,247,456,249,456,251,452,254,450,255,449,255,447,255,446,254,443,253,442,256,445,258,446,262,448,266,448,268,449,269,451,269,453,269,454,267,455,265,458,263,461,262,467,263,472,268,474,268,474,271,473,274,473,276,477,277,479,276,482,275,485,279,486,283,487,285,489,286,492,284,496,284,500,284,503,282,505,282,511,286,518,286,521,286,525,287,524,0" />
<area shape="poly" title="San Marin (0 inscrit)" class="zone-sm" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=sm" coords="267,374,264,371,261,375,262,377" />
<area shape="poly" title="Slovaquie (0 inscrit)" class="zone-sk" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=sk" coords="332,341,334,340,335,338,338,338,341,336,346,336,349,333,352,329,355,329,358,330,363,328,364,331,366,331,368,322,361,318,358,318,356,320,350,320,347,322,344,321,342,319,340,319,335,321,332,324,332,327,320,328,318,331,318,335,322,336,326,341" />
<area shape="poly" title="Slovénie (2 inscrits)" class="zone-si" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=si" coords="297,372,299,372,299,370,302,368,302,365,301,363,303,361,306,361,308,359,311,359,311,356,309,355,307,358,297,358,293,361,286,359,284,361,284,365,283,367,285,369,285,371,288,371,295,370" />
<area shape="poly" title="Suède (0 inscrit)" class="zone-se" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=se" coords="306,236,339,204,349,158,347,113,356,103,358,85,362,83,370,81,367,74,367,70,368,68,367,63,365,58,365,55,364,47,348,35,348,41,345,45,337,45,335,52,330,52,325,58,326,64,322,69,320,75,314,79,313,86,307,99,310,101,310,104,306,106,303,105,296,112,294,139,296,141,296,145,296,148,292,149,293,153,293,160,289,163,288,167,287,173,286,177,280,174,281,185,287,215,291,229,301,235" />
<area shape="poly" title="Suisse (148 inscrits)" class="zone-ch" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ch" coords="237,358,239,356,240,353,244,352,245,354,248,354,249,352,252,352,253,349,248,349,244,345,244,342,245,340,244,338,241,338,239,336,232,337,228,336,222,337,222,339,219,342,216,343,213,347,211,348,212,349,216,348,219,350,219,354,221,357,226,357,228,355,230,352,233,352,234,355" />
<area shape="poly" title="Ukraine (4 inscrits)" class="zone-ua" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=ua" coords="522,287,504,284,497,288,490,288,486,286,482,276,476,278,473,273,475,269,463,263,457,265,454,267,452,269,448,269,444,269,441,273,440,274,440,284,437,281,434,282,429,283,427,280,424,281,423,281,421,280,412,283,408,279,404,280,398,277,385,281,383,284,379,284,379,287,382,295,382,301,371,312,373,319,371,321,367,326,367,331,369,334,373,335,376,334,394,339,408,332,414,328,420,326,425,330,430,331,436,334,438,337,439,342,443,346,445,348,442,353,435,354,436,358,437,360,434,363,430,366,431,368,433,369,441,366,442,366,444,364,445,364,448,361,450,359,451,354,464,346,464,351,466,354,469,357,471,364,486,376,489,376,513,361,513,354,524,327" />
<area shape="poly" title="Yougoslavie (1 inscrit)" class="zone-yu" href="?id_annuaire=1&amp;m=annuaire_inscrits_carto&amp;continent=4&amp;pays=yu" coords="337,400,332,403,329,406,330,412,331,414,332,420,336,425,339,425,339,419,343,416,348,413,346,410,341,405 352,421,355,419,361,419,370,415,370,412,372,410,374,409,374,406,370,403,369,395,370,391,369,389,371,387,368,389,359,385,358,381,359,378,356,378,353,375,352,371,345,365,342,367,340,367,337,368,336,375,338,377,338,379,337,382,340,384,338,389,338,391,342,395,342,397,339,398,339,401,342,406,344,408,348,409,349,414,348,416,350,418" />
</map>
</div>
/tags/v1.1-andromede/cartes/pays_europe.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/cartes/pays_europe.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/cartes/continents.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="http://162.38.234.9/annuaire/cartes/continents.png" alt="info" usemap="#carte-map" />
<map name="carte-map">
<area shape="poly" title="Afrique (872 inscrits)" class="zone-1" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=1" coords="383,202,349,217,334,194,334,183,320,176,293,168,271,174,213,174,249,245,249,353,383,353" />
<area shape="poly" title="Amérique du Nord (124 inscrits)" class="zone-2" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=2" coords="0,220,116,220,116,225,153,224,153,211,200,211,200,199,206,199,206,193,220,193,212,174,296,0,0,0" />
<area shape="poly" title="Asie (15 inscrits)" class="zone-3" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=3" coords="579,20,579,150,501,225,501,252,494,252,485,249,473,254,384,256,383,193,392,193,392,182,398,182,396,181,396,171,401,172,401,166,409,166,409,156,355,156,357,154,358,150,354,146,360,142,363,143,377,144,378,132,381,131,379,127,382,125,381,122,378,117,384,110,384,87,379,79,379,20,431,20" />
<area shape="poly" title="Europe (8754 inscrits)" class="zone-4" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=4" coords="287,19,214,173,269,173,286,168,298,168,319,175,319,166,323,165,327,157,336,158,344,163,355,164,353,156,356,152,352,145,360,140,364,143,377,143,376,131,380,130,377,127,381,123,376,117,384,107,384,98,384,94,382,86,378,80,378,20" />
<area shape="poly" title="Océanie (3 inscrits)" class="zone-5" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=5" coords="578,151,502,226,502,253,495,253,486,250,473,255,384,256,384,353,579,353" />
<area shape="poly" title="Amérique du Sud (28 inscrits)" class="zone-6" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=6" coords="222,194,207,194,207,200,201,200,201,212,154,212,154,225,114,225,114,221,0,221,0,353,248,353,248,246" />
<area shape="poly" title="Moyen-Orient (21 inscrits)" class="zone-7" href="?id_annuaire=1&amp;m=annuaire_afficher_carte&amp;continent=7" coords="408,157,354,157,357,164,344,165,335,160,328,159,324,166,320,168,321,175,335,182,335,194,350,216,382,203,382,192,391,192,391,181,396,181,395,171,400,171,400,165,408,165,408,162" />
</map>
</div>
/tags/v1.1-andromede/cartes/continents.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/cartes/continents.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/.project
New file
0,0 → 1,17
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>annuaire</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>net.sourceforge.phpeclipse.parserbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>net.sourceforge.phpeclipse.phpnature</nature>
</natures>
</projectDescription>
/tags/v1.1-andromede/composants/cartographie/Cartographie.php
New file
0,0 → 1,649
<?php
// declare(encoding='UTF-8');
/**
* Composant Cartographie gérant les images représentant le fond de carte à insérer dans un fichier html contenant une
* image map.
* Avantage :
* - pas de base de données liée au composant (simplicité d'utilisation dans les applications)
* - facilite l'utilisation du Javascript et CSS pour intéragir avec la carte (affichage du nom des zones au survol)
* - l'application qui utilise le composant définie elle-même l'intéraction avec le clic sur une zone
* Inconvénient :
* - l'utilisation d'une balise map alourdie la page à renvoyer
*
* Il est possible de créer des fond de carte en vraies couleurs
* (16 millions de zones maxi sur la carte) ou en couleurs indexées (255 zones maxi sur la carte).
* Les couleurs réservées et a ne pas utiliser pour créer l'image png de fond sont :
* - le blanc (rvb : 255-255-255)
* - le noir (rvb : 0-0-0)
* - le gris (rvb : 128-128-128)
* - le rouge (rvb : 255-0-0)
* Pour activer le cache indiquer la date de dernière mise à jour des données servant à créer la carte de cette façon :
* $Carte->setCarteInfo(array('donnees_date_maj' => $date_maj_donnees));
*
* @category PHP5
* @package Collection
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license GPL-v3 et CECILL-v2
* @version SVN:$Id$
*/
 
class Cartographie {
/*** Constantes : ***/
const FORMULE_PROPORTIONNEL = 'proportionnel';
const FORMULE_LEGENDE = 'legende';
 
//+----------------------------------------------------------------------------------------------------------------+
/*** Attributs : ***/
/**
* L'image de la carte.
* @var string l'image de la carte.
*/
private $carte;
 
/**
* Le nom du fichier contenant la carte sans l'extension.
* @var string le nom du fichier de la carte.
*/
private $carte_nom;
 
/**
* @var string le chemin et le nom du fichier de l'image de la carte générée.
*/
private $carte_fichier;
 
/**
* Tableaux associatif contenant les informations sur la carte.
* donnees_date_maj = date de dernière mise à jour des données servant à créer la carte, si plus récente que la carte
* déjà créée getCarteCache renvoie false.
*
* @var array le tableau des infos sur la carte.
*/
private $carte_info = array();
 
/**
* Indique si la carte existe déjà et à besoin ou pas d'être créée.
* @var bool true si la carte existe..
*/
private $carte_cache = false;
 
/**
* Le nom du fichier de la carte de fond.
* @var string nom du fichier de la carte de fond.
*/
private $carte_fond_fichier;
 
/**
* Le nom du dossier contenant les cartes de fond.
* @var string nom du dossier contenant les cartes de fond.
*/
private $carte_fond_dossier;
 
/**
* Le nom du dossier où stocker les cartes créer via la classe Cartographie.
* @var string nom du dossier contenant les cartes créées.
*/
private $carte_stockage_dossier;
 
/**
* L'url correspondant au dossier où sont stockées les cartes crées via la classe Cartographie.
* L'url est passé à la fonction sprintf est doit donc contennir %s afin d'indiquer l'endroite où ajouter le nom du
* fichier de la carte.
* @var string url des cartes créées.
*/
private $carte_stockage_url;
 
/**
* Format du tableau :
* carte_zone est un tableau de tableaux associatifs.
* Chaque zone de la carte doit avoir son entrée dans ce tableau. Le code de la zone sert de clé.
* Chaque zone est représentée par :
* - nom : (string)
* le nom de la zone qui sera affiché dans l'attribut title de la balise map html.
* - rvb_fond : (string) Exemple : 255-255-255.
* les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de la zone sur la carte de fond
* Ne pas utiliser le blanc (255-255-255) et utiliser le noir pour les contours (0-0-0).
* - poly : (string)
* les coordonnées pour la balise map html. Si une même zone à plusieurs polygones, les séparer par le
* caractère pipe "|".
* - info_nombre : (int) Exemple : nombre de personnes présentent dans un département.
* nombre d'occurence dans cette zone.
* - url : (string) l'url qui doit être appelée sur un clic dans la zone.
* - rvb_carte : (string) Exemple : 255-255-255.
* les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de remplacement dans le cas de la formule
* de coloriage de type "légende".
* @var array les informations sur les zones de la carte.
*/
private $carte_zones = null;
 
/**
* Tableau contenant la valeur RVB de la zone du fond de carte en clé et la valeur RVB venant la remplacer en valeur.
* @var array valeur RVB de la zone du fond de carte en clé et valeur RVB venant la remplacer en valeur.
*/
private $carte_correspondance_couleurs = array();
 
/**
* La valeur RVB, sous forme de chaine de nombres séparées par des tirets (-), de la zone géographique à mettre en
* surbrillance.
* @var string la valeur RVB de la zone à repérer.
*/
private $zone_marker;
 
/**
* La formule de coloriage de la carte. Les formules disponibles sont : légende, proportionnel.
* @var string la formule de coloriage.
*/
private $formule_coloriage;
 
/**
* Les valeurs RVB séparés par des virgules pour la couleur la plus foncée utilisée, entre autre, par la formule de
* coloriage "proportionnel".
* @var string les valeurs RVB séparées par des virgules.
*/
private $coloriage_couleur_max;
 
/**
* Les valeurs RVB séparés par des virgules pour la couleur la plus claire utilisée, entre autre, par la formule de
* coloriage "proportionnel".
* @var string les valeurs RVB séparées par des virgules.
*/
private $coloriage_couleur_min;
 
/**
* Contient le nombre de couleurs différentes utilisées par le coloriage pour créer l'image finale.
* @var int le nombre de couleurs.
*/
private $coloriage_couleurs;
 
/**
* Contient le tableau des fréquences et des couleurs correspondantes.
* @var array les frequences et leurs couleurs.
*/
private $coloriage_tableau_frequence = array();
 
/**
* Permet de savoir si la cartographie est en mode déboguage ou pas.
* @var bool true si on est en mode débug, sinon false.
*/
private $mode_debug;
 
//+----------------------------------------------------------------------------------------------------------------+
/*** Constructeur : ***/
public function __construct($options = array()) {
// Initialisation de l'objet Cartographie
$this->setCarteNom(isset($options['carte_nom']) ? $options['carte_nom'] : '');
$this->setFormuleColoriage(isset($options['formule']) ? $options['formule'] : '');
$this->setColoriageCouleurClaire(isset($options['couleur_claire']) ? $options['couleur_claire'] : '');
$this->setColoriageCouleurFoncee(isset($options['couleur_foncee']) ? $options['couleur_foncee'] : '');
$this->setCarteFondFichier(isset($options['fond_fichier']) ? $options['fond_fichier'] : '');
$this->setCarteFondDossier(isset($options['fond_dossier']) ? $options['fond_dossier'] : '');
$this->setCarteStockageDossier(isset($options['stock_dossier']) ? $options['stock_dossier'] : '');
$this->setCarteStockageUrl(isset($options['stock_url']) ? $options['stock_url'] : '');
$this->setCarteZones(isset($options['zones']) ? $options['zones'] : null);
$this->setZoneMarker(isset($options['zone_marker']) ? $options['zone_marker'] : '');
$this->setModeDebug(isset($options['debug']) ? $options['debug'] : false);
}
 
//+----------------------------------------------------------------------------------------------------------------+
/*** Accesseur : ***/
public function getTableauFrequence() {
ksort($this->coloriage_tableau_frequence);
return $this->coloriage_tableau_frequence;
}
 
public function getCarteCache() {
// Gestion du cache
if ($this->getCarteNom() != '') {
$fichier_carte = $this->carte_stockage_dossier.$this->getCarteNom().'.png';
if (file_exists($fichier_carte)) {
//echo filemtime($fichier_carte).'-'.strtotime($this->carte_info['donnees_date_maj']);
if (filemtime($fichier_carte) < strtotime($this->carte_info['donnees_date_maj'])) {
$this->carte_cache = false;
} else {
$this->carte_cache = true;
}
}
}
return $this->carte_cache;
}
 
public function getCarteInfo() {
return $this->carte_info;
}
public function setCarteInfo($ci) {
$this->carte_info = $ci;
}
 
public function getColoriageCouleurClaire() {
return $this->coloriage_couleur_min;
}
public function setColoriageCouleurClaire($ccmi) {
$this->coloriage_couleur_min = $ccmi;
}
 
public function getColoriageCouleurFoncee() {
return $this->coloriage_couleur_max;
}
public function setColoriageCouleurFoncee($ccma) {
$this->coloriage_couleur_max = $ccma;
}
 
public function getFormuleColoriage() {
return $this->formule_coloriage;
}
public function setFormuleColoriage($fc) {
$this->formule_coloriage = $fc;
}
 
public function getCarteNom() {
return $this->carte_nom;
}
public function setCarteNom($cn) {
$this->carte_nom = $cn;
}
 
public function getCarteFichier() {
return $this->carte_fichier;
}
public function setCarteFichier($cf) {
$this->carte_fichier = $cf;
}
 
public function getCarteFondFichier() {
return $this->carte_fond_fichier;
}
public function setCarteFondFichier($cff) {
$this->carte_fond_fichier = $cff;
}
 
public function getCarteFondDossier() {
return $this->carte_fond_dossier;
}
public function setCarteFondDossier($cfd) {
$this->carte_fond_dossier = $cfd;
}
 
public function getCarteStockageDossier() {
return $this->carte_stockage_dossier;
}
public function setCarteStockageDossier($csd) {
$this->carte_stockage_dossier = $csd;
}
 
public function getCarteStockageUrl() {
return $this->carte_stockage_url;
}
public function setCarteStockageUrl($csu) {
$this->carte_stockage_url = $csu;
}
 
public function getCarteZones() {
if (is_null($this->carte_zones)) {
$this->chargerZones();
}
return $this->carte_zones;
}
public function setCarteZones($cz) {
$this->carte_zones = $cz;
}
 
public function getZoneMarker() {
return $this->zone_marker;
}
public function setZoneMarker($zm) {
$this->zone_marker = $zm;
}
 
public function getModeDebug() {
return $this->mode_debug;
}
public function setModeDebug($md) {
$this->mode_debug = $md;
}
 
//+----------------------------------------------------------------------------------------------------------------+
/*** Méthodes PUBLIQUES : ***/
 
public function creerCarte() {
 
// Création de la carte car aucun cache ou cache à vider
$carte_fond_fichier = $this->carte_fond_dossier.$this->getCarteFondFichier().'.png';
 
$this->carte = imagecreatefrompng($carte_fond_fichier);
// Vérification que la création à fonctionnée
if (!$this->carte) {
// Une erreur est survenue : création d'une image blanche
$this->carte = imagecreatetruecolor(520, 60);
$bgc = imagecolorallocate($this->carte, 255, 255, 255);
$tc = imagecolorallocate($this->carte, 0, 0, 0);
imagefilledrectangle($this->carte, 0, 0, 520, 60, $bgc);
// Affichage d'un message d'erreur
imagestring($this->carte, 1, 5, 5, "Erreur de chargement de l'image :", $tc);
imagestring($this->carte, 1, 5, 15, $carte_fond_fichier, $tc);
} else {
// Nous construisons le tableau de correspondance entre les couleurs présente sur l'image de fond
// et les couleurs qui doivent les remplacer.
$this->construireCorrespondanceCouleur();
 
// Nous lançons la création de la carte
$this->colorierCarte();
}
 
// Nous chercons à créer une image indéxées en sortie
if (imageistruecolor(&$this->carte) && $this->formule_coloriage != 'legende') {
if ($this->coloriage_couleurs <= 253) {
//imagetruecolortopalette(&$this->carte, false, ($this->coloriage_couleurs + 2));// + 2 car noir et blanc réservés.
} else {
// On force la création d'une palette... si cela pose problème ajouter un attribut permettant de désactiver
// ce fonctionnement.
imagetruecolortopalette(&$this->carte, false, 255);
}
}
 
// Nous écrivons le fichier de la carte.
if ($this->getCarteNom() == '') {
$this->setCarteNom(md5($this->carte));
}
 
$fichier_image_carte = $this->carte_stockage_dossier.$this->getCarteNom().'.png';
$this->setCarteFichier($fichier_image_carte);
 
if(file_exists($fichier_image_carte)) {
//echo 'suppression du fichier de carte : '.$fichier_html_carte;
unlink($fichier_image_carte);
}
 
imagepng(&$this->carte, $this->getCarteFichier());
return true;
}
 
public function getImageMap() {
// Initialisation de variables
$carte_map = '';
 
// Gestion de l'image map
$chemin_carte_map_fond = $this->getCarteFondDossier().$this->getCarteFondFichier().'.tpl.html';
$chemin_carte_map = $this->getCarteStockageDossier().$this->getCarteNom().'.html';
 
if(file_exists($chemin_carte_map)) {
unlink($chemin_carte_map);
}
 
if (file_exists($chemin_carte_map)) {
$carte_map = file_get_contents($chemin_carte_map);
} else {
$nom_carte_png = $this->getCarteNom().'.png';
$chemin_carte_png = $this->getCarteStockageDossier().$nom_carte_png;
$donnees['carte_url'] = sprintf($this->getCarteStockageUrl(), $nom_carte_png);
$donnees['carte_alt'] = 'info';
$donnees['zones'] = $this->getCarteZones();
//Debug::printr($donnees);
$carte_map = SquelettePhp::analyser($chemin_carte_map_fond, $donnees);
if (!file_put_contents($chemin_carte_map, $carte_map)) {
$e = "Écriture du fichier contenant le html de la carte impossible : $chemin_carte_map";
trigger_error($e, E_USER_WARNING);
}
}
 
return $carte_map;
}
 
//+----------------------------------------------------------------------------------------------------------------+
/*** Méthodes PRIVÉES : ***/
 
/**
* Charge en mémoire les données du fichier csv des zones géographique de la carte
*/
private function chargerZones() {
$fichier_csv = $this->getCarteFondDossier().$this->getCarteFondFichier().'.csv';
$zones = array();
if (($handle = fopen($fichier_csv, 'r')) !== false) {
$ligne = 1;
$cles = array();
while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
$cle = array_shift($donnees);
if ($ligne == 1) {
// Ligne 1 : les noms des champs
$cles = $donnees;
 
} else {
// Ligne > 1 : traitements des données
$zones[$cle] = array_combine($cles, $donnees);
}
$ligne++;
}
fclose($handle);
}
$this->setCarteZones($zones);
}
 
private function construireCorrespondanceCouleur() {
switch ($this->formule_coloriage) {
case self::FORMULE_LEGENDE :
$this->construireCorrespondanceCouleurLegende();
break;
case self::FORMULE_PROPORTIONNEL :
$this->construireCorrespondanceCouleurProportionnel();
break;
default :
$e = "Aucune formule de coloriage n'a été définie parmis : ".
self::FORMULE_LEGENDE.' et '.self::FORMULE_PROPORTIONNEL.'. '.
"Veuillez la définir avec la méthode setFormuleColoriage().";
trigger_error($e, E_USER_ERROR);
}
}
 
private function construireCorrespondanceCouleurProportionnel() {
// Création d'un tableau contenant seulement les nombres d'information pour chaque zone.
$tab_valeurs = array();
foreach ($this->getCarteZones() as $cle => $valeur) {
//Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum.
if (isset($valeur['info_nombre'])) {
$tab_valeurs[] = $valeur['info_nombre'];
if ($valeur['info_nombre'] == 0){
//trigger_error($valeur['nom'], E_USER_NOTICE);
}
}
}
 
//Nombre d'entrées dans le tableau de valeurs non nulles :
$valeurs_nbre = count($tab_valeurs);
$valeurs_somme = array_sum($tab_valeurs);
// Tabeau des fréquences trié de la plus petite à la plus grande clé.
$tab_frequences = array_count_values($tab_valeurs);
krsort($tab_frequences);
//trigger_error(print_r($tab_frequences, true), E_USER_NOTICE);
$frequences_nbre = count($tab_frequences);
if ($valeurs_nbre > 0){
// Nous trions le tableau dans l'ordre croissant :
sort($tab_valeurs);
// Nous récupérons la valeur la plus petite :
$mini = $tab_valeurs[0];
$maxi = $tab_valeurs[$valeurs_nbre - 1];
$medium = isset($tab_valeurs[$valeurs_nbre - 2]) ? $tab_valeurs[$valeurs_nbre - 2] : 0;
$moyenne = $valeurs_somme / $valeurs_nbre;
$ecart_au_carre_moyen = 0;
for ($i = 0; $i < $valeurs_nbre; $i++) {
$ecart_au_carre_moyen += pow(($tab_valeurs[$i] - $moyenne), 2);
}
$variance = $ecart_au_carre_moyen / $valeurs_nbre;
$ecart_type = round(sqrt($variance), 0);
$moyenne = round($moyenne, 0);
$variance = round($variance, 0);
}
 
// Calcul de l'écart moyen pour chaque élément R, V et B.
list($r_min, $v_min, $b_min) = explode(',', $this->coloriage_couleur_max);
list($r_max, $v_max, $b_max) = explode(',', $this->coloriage_couleur_min);
$r_diff = $r_min - $r_max;
$r_ecart_moyen = abs($r_diff / $frequences_nbre);
 
$v_diff = $v_min - $v_max;
$v_ecart_moyen = abs($v_diff / $frequences_nbre);
 
$b_diff = $b_min - $b_max;
$b_ecart_moyen = abs($b_diff / $frequences_nbre);
 
// Pour chaque fréquence nous attribuons une couleur.
$i = 1;
foreach ($tab_frequences as $cle => $valeur){
if ($cle == 0) {
$this->coloriage_tableau_frequence[$cle] = '255-255-255';
} else {
$r = $r_min + round(($i * $r_ecart_moyen), 0);
 
$v = $v_min + round(($i * $v_ecart_moyen), 0);
$b = $b_min + round(($i * $b_ecart_moyen), 0);
$this->coloriage_tableau_frequence[$cle] = $r.'-'.$v.'-'.$b;
}
$i++;
}
 
// Attribution du nombre de couleurs utilisé pour réaliser la carte
$this->coloriage_couleurs = count(array_count_values($this->coloriage_tableau_frequence));
//trigger_error('<pre>'.print_r($this->coloriage_couleurs, true).'</pre>', E_USER_ERROR);
 
// Nous attribuons les couleurs à chaque zone géographique
foreach ($this->getCarteZones() as $cle => $zg) {
if (isset($this->coloriage_tableau_frequence[$zg['info_nombre']])) {
$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $this->coloriage_tableau_frequence[$zg['info_nombre']];
} else {
$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
if ($this->getModeDebug()) {
$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas de couleur RVB pour la remplir. ".
"La valeur 128-128-128 lui a été attribué.";
trigger_error($e, E_USER_WARNING);
}
}
}
}
 
private function construireCorrespondanceCouleurLegende() {
$tab_couleurs = array();
foreach ($this->getCarteZones() as $cle => $zg) {
if ($zg['rvb_carte'] != '') {
$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $zg['rvb_carte'];
} else {
$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
if ($this->getModeDebug()) {
$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas d'information pour la légende dans le champ".
" rvb_carte. La valeur 128-128-128 lui a été attribué.";
trigger_error($e, E_USER_WARNING);
}
}
if (!isset($tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]])) {
$tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]] = 1;
}
}
// Attribution du nombre de couleurs utilisé pour réaliser la carte
$this->coloriage_couleurs = count($tab_couleurs);
}
 
private function colorierCarte() {
if (imageistruecolor(&$this->carte)) {
//+--------------------------------------------------------------------------------------------------------+
// Remplacement des couleurs sur la carte en mode vraies couleurs (RGB)
$this->colorierCarteModeVraiCouleur();
} else {
//+--------------------------------------------------------------------------------------------------------+
// Remplacement des couleurs sur la carte en mode couleurs indexées (palette de couleurs)
$this->colorierCarteModeIndexe();
}
}
 
private function colorierCarteModeVraiCouleur() {
// Nous commençons le rempalcement des couleurs sur la carte de fond.
$hauteur = imagesy(&$this->carte);
$largeur = imagesx(&$this->carte);
 
// Tableau contenant les couleurs traitées, pour éviter de traiter plusieurs fois la même couleur
$tab_rvb_ok = array();
for ($x = 0; $x < $largeur; $x++) {
for ($y = 0; $y < $hauteur; $y++) {
$rvb = ImageColorAt(&$this->carte, $x, $y);
if (!isset($tab_rvb_ok[$rvb])) {
// Récupération de la couleur rvb au format xxx-xxx-xxx
$cle = (($rvb >> 16) & 0xFF).'-'.(($rvb >> 8) & 0xFF).'-'.($rvb & 0xFF);
// Si nous n'avons pas à faire à la couleur noire (utilisé pour délimité les zones), nous continuons
if ($cle != '255-255-255') {
$rvb_final = null;
if (isset($this->carte_correspondance_couleurs[$cle])) {
if ($this->zone_marker != '' && $cle == $this->zone_marker) {
$rvb_final = '255'<<16 | '0'<<8 | '0';
} else {
list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$cle]);
$rvb_final = $rouge<<16 | $vert<<8 | $bleu;
}
// Si le nombre de couleurs sur la carte finale est infèrieur à 255 nous créons une image indexée
imagefill(&$this->carte, $x, $y, $rvb_final);
} else {
$rvb_final = '128'<<16 | '128'<<8 | '128';
imagefill(&$this->carte, $x, $y, $rvb_final);
}
// Nous ajoutons la couleur ajoutée à la carte dans le tableau des couleurs traitées
$tab_rvb_ok[$rvb_final] = true;
}
// Nous ajoutons la couleur trouvées sur la carte de fond dans le tableau des couleurs traitées
$tab_rvb_ok[$rvb] = true;
}
}
}
}
 
private function colorierCarteModeIndexe() {
// Nous attribuons à chaque zone présente dans le tableau $this->getCarteZones() la valeur de l'index
// de la couleur RVB représentant cette zone sur la carte de fond.
$this->construireAssociationIndexZone();
 
foreach ($this->getCarteZones() as $zg) {
if (isset($this->carte_correspondance_couleurs[$zg['rvb_fond']])) {
 
//Dans le cas où nous voulons repérer une zone sur la carte :
if ($this->getZoneMarker() != '' && $zg['rvb_fond'] == $this->getZoneMarker()) {
$rouge = 255;
$vert = 0;
$bleu = 0;
} else {
list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$zg['rvb_fond']]);
}
if (isset($zg['index'])) {
imagecolorset(&$this->carte, $zg['index'], $rouge, $vert, $bleu);
} else if ($this->getModeDebug()) {
$e = "La zone '{$zg['nom']}' n'est pas présente sur la carte.";
trigger_error($e, E_USER_WARNING);
}
}
}
}
 
private function construireAssociationIndexZone() {
// Nous récupérons le nombre de couleur différentes contenues dans l'image.
$taille_palette = imagecolorstotal($this->carte);
// Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant
// dans le tableau $this->getCarteZones(), qui contient des informations sur chaque zone de l'image,
// et nous attribuons la valeur de l'index de sa couleur sur la carte de fond.
for ($i = 0; $i < $taille_palette; $i++) {
$rvb = array();
$rvb = imagecolorsforindex($this->carte, $i);
$rvb_cle = $rvb['red'].'-'.$rvb['green'].'-'.$rvb['blue'];
// La couleur ne doit pas correspondre au noir ou au blanc car ces couleurs ne sont pas traitées
if ($rvb_cle != '255-255-255' && $rvb_cle != '0-0-0') {
$index_ok = false;
foreach($this->getCarteZones() as $cle => $zg) {
if (isset($zg['rvb_fond']) && $zg['rvb_fond'] == $rvb_cle) {
$this->carte_zones[$cle]['index'] = $i;
$index_ok = true;
break;
}
}
if (!$index_ok && $rvb_cle != '0-0-0' && $this->getModeDebug()) {
$e = "Aucune information n'est fournie pour la zone sur la carte d'index $i : $rvb_cle";
trigger_error($e, E_USER_WARNING);
//$this->carte_zones[] = array('rvb_fond' => $rvb_cle, 'rvb_carte' => '128-128-128', 'index' => $i);
}
}
}
}
 
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/france.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_oceanie.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_asie.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_asie.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_sud_amerique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_sud_amerique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_moyen_orient.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/continents.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/continents.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_asie.csv
New file
0,0 → 1,26
"code","rvb_fond","nom","poly"
"bd","140-40-0","Bangladesh","154,383,167,384,169,382,168,378,165,374,164,375,163,372,166,369,166,367,159,367,156,365,153,363,151,364,153,367,151,369,153,373,154,377"
"bt","140-80-0","Bhoutan","166,362, 165,360, 163,360, 159,359, 156,361, 158,363, 164,363"
"bn","140-120-0","Brunei Darusalam","247,447,246,441,253,440,253,443,251,446"
"kh","140-140-0","Cambodge","204,416,207,423,211,424,216,422,222,417,222,412,220,409,216,411,214,411,210,409,206,410"
"cn","140-180-0","Chine","123,292,122,294,114,299,103,303,100,305,100,311,103,313,104,318,107,321,112,325,114,326,119,323,124,327,122,331,120,335,121,337,119,340,119,344,126,347,132,347,144,357,158,357,160,356,162,357,168,357,179,351,184,355,190,358,191,365,188,369,188,372,192,374,193,379,197,382,201,383,200,380,201,379,202,378,210,378,214,376,217,377,219,379,220,382,221,382,222,383,225,382,228,382,230,385,230,388,228,390,225,392,226,394,229,395,230,395,235,391,234,388,234,385,234,383,238,382,240,382,246,379,256,377,260,373,264,368,273,354,274,348,273,341,269,331,264,327,272,321,276,319,283,305,284,302,293,298,297,298,296,295,300,295,305,291,308,285,307,280,311,278,313,279,319,266,319,263,308,267,305,263,304,260,293,255,286,236,275,234,268,238,270,243,265,255,260,256,252,255,252,266,263,265,265,268,265,272,264,273,256,273,252,278,249,278,244,282,239,281,236,285,237,289,231,294,221,294,214,297,211,296,205,295,202,294,199,292,196,292,192,292,182,291,174,283,168,280,163,280,161,279,161,269,157,266,155,264,152,261,147,260,144,263,143,269,141,270,136,270,133,272,132,273,131,280,128,280,125,281,124,284,124,287"
"in","255-0-0","Inde","119,323,109,329,101,326,100,329,101,336,105,340,103,342,101,346,93,357,87,357,84,361,90,370,78,373,88,386,96,384,97,395,97,400,105,418,113,433,123,424,124,404,148,387,149,383,153,382,153,371,150,369,151,367,152,364,155,363,158,365,159,367,167,368,164,373,164,375,167,374,168,377,171,380,172,374,175,372,176,367,179,362,184,359,185,356,182,355,179,351,173,353,170,356,167,358,166,361,164,364,158,363,155,361,154,358,151,358,151,363,146,363,141,363,137,360,132,359,128,358,125,356,123,354,123,350,125,347,117,344,118,338,121,337,119,334,124,327"
"id","255-40-0","Indonésie","171,408,191,447,208,461,211,465,229,455,232,459,237,458,241,457,248,457,255,446,257,446,258,452,261,453,299,452,342,471,343,472,345,493,343,495,278,501,267,499,264,497,223,490,214,486,189,466,177,443,169,428"
"jp","255-200-0","Japon","343,282,340,289,313,325,302,334,303,342,306,345,308,345,343,326,363,282"
"kz","0-100-255","Kazakhstan","125,289,123,284,124,280,127,279,131,278,131,272,135,269,138,269,141,270,143,269,144,262,148,260,148,255,142,255,135,249,132,250,129,249,126,246,124,247,122,246,116,235,109,228,101,234,99,232,98,229,95,229,93,230,91,229,90,228,92,227,91,225,90,223,90,222,83,221,56,231,56,234,52,237,54,239,52,241,52,244,56,247,54,249,46,249,45,247,38,247,36,249,31,248,27,244,22,243,16,245,12,247,9,252,5,251,2,261,3,263,5,265,9,266,10,269,10,270,7,271,8,272,10,273,17,271,18,270,25,270,31,277,30,279,28,278,22,278,20,280,20,282,16,282,16,284,19,286,20,290,24,292,23,296,27,294,30,294,37,299,37,280,46,277,53,271,54,272,55,276,57,279,55,285,57,287,62,288,68,287,72,290,73,296,76,299,82,300,91,293,91,291,93,290,96,292,98,292,103,289,104,290,103,290,103,291,119,291"
"my","140-100-255","Malaisie","256,436,265,443,259,447,255,445,253,446,247,456,239,457,231,458,229,454,210,455,206,455,202,452,198,448,197,445,196,441,195,438,201,440,205,440,207,442,208,446,209,450,238,450,241,450,244,448,245,446,248,447,251,446,253,442"
"mv","160-100-255","Maldives","89,423,87,429,96,463,102,469,105,463,104,442,95,423"
"mn","180-100-255","Mongolie","237,287, 236,285, 239,281, 241,281, 244,282, 249,278, 252,278, 254,276, 257,272, 264,272, 264,270, 262,268, 259,268, 253,269, 251,267, 251,260, 252,257, 246,256, 244,258, 239,259, 236,261, 233,261, 227,260, 223,256, 219,255, 216,253, 212,253, 207,255, 202,250, 202,248, 199,247, 197,245, 195,245, 192,244, 189,247, 189,249, 190,251, 189,255, 187,257, 178,257, 174,253, 165,253, 154,259, 153,262, 157,266, 159,266, 162,269, 162,271, 163,280, 165,280, 172,281, 179,285, 181,287, 184,292, 196,292, 198,291, 201,292, 204,295, 211,296, 214,297, 218,296, 221,294, 229,294, 232,293, 235,290, 237,289"
"np","200-100-255","Népal","142,363,147,363,151,364,151,360,145,360,135,353,133,351,127,350,125,352,125,355,129,358,131,358,133,360,138,360"
"ph","80-255-0","Philippines","262,399,257,432,272,440,293,441,295,433,281,408,270,398"
"kr","140-255-0","République de Corée","298,313,301,316,302,326,298,329,293,330,288,330,289,327,291,323,289,320,291,317,292,315"
"kp","180-255-0","République Populaire Démocratique de Corée","305,292,301,293,299,295,296,296,296,298,293,299,290,299,287,301,284,303,283,304,284,306,286,308,286,310,285,312,284,314,287,315,291,315,294,313,298,312,299,313,294,307,296,305,298,304,301,302,303,299"
"sg","200-255-0","Singapour","207,455,211,456,212,459,210,460"
"lk","220-255-0","Sri Lanka","125,425,130,435,129,438,128,439,124,439,121,437,121,435"
"th","50-100-50","Thaïlande","203,414, 207,410, 214,410, 214,406, 211,403, 211,399, 210,397, 207,397, 206,399, 202,398, 200,399, 199,392, 196,389, 194,391, 191,392, 195,389, 192,392, 189,392, 188,398, 192,402, 192,407, 191,410, 193,412, 193,415, 194,418, 195,415, 199,414, 200,416, 203,416"
"vn","200-100-50","Vietnam","204,379,206,384,210,385,212,387,210,390,211,393,215,395,221,404,222,412,222,415,222,416,212,424,212,430,219,426,228,421,229,415,228,410,226,402,223,399,216,391,221,384,218,380,215,377,211,378"
"la","160-200-250","Laos","216,411, 221,410, 221,405, 217,401, 212,395, 209,393, 211,390, 211,388, 207,387, 205,385, 205,383, 203,381, 202,381, 203,384, 201,386, 199,386, 197,387, 201,392, 201,396, 206,396, 210,395, 212,397, 213,403, 216,406"
"mm","210-200-250","Birmanie","170,380,167,386,170,389,174,403,177,405,186,401,190,422,192,422,192,413,190,407,190,403,189,399,186,395,189,389,193,387,197,383,192,376,188,371,187,367,190,363,188,357,186,356,182,361,178,364,177,369,175,374"
"rua","0-125-125","Russie (Asie)","56,229,62,222,60,214,64,207,55,192,59,185,72,175,71,155,78,146,69,135,69,125,64,121,63,110,85,69,208,2,217,6,237,19,245,31,244,59,281,59,297,64,347,72,376,80,382,89,409,94,470,105,484,115,484,151,480,155,482,173,470,173,448,192,441,186,434,192,428,191,423,216,419,227,412,236,395,255,354,274,329,280,321,289,315,292,312,291,310,290,307,293,305,291,308,287,308,284,307,282,311,279,314,280,318,272,319,268,320,266,320,263,308,266,305,259,293,254,287,236,275,233,270,235,267,238,269,241,268,244,266,249,264,254,260,255,256,255,247,254,242,255,234,257,230,257,225,256,221,253,216,251,212,250,209,251,206,252,204,249,203,247,200,244,195,242,191,241,188,243,187,246,187,250,187,253,186,254,178,254,174,250,164,250,160,252,155,255,153,256,151,260,150,260,149,260,148,254,141,254,135,248,131,249,125,245,124,246,122,245,117,235,109,227,101,233,98,229,95,228,93,229,91,227,93,227,90,221,82,220"
"tw","0-200-250 ","Taïwan","272,367,268,371,266,376,267,379,271,381,274,378,274,372"
0,"255-255-255",0,
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_sud_amerique.csv
New file
0,0 → 1,14
"class","rvb_fond","nom","poly"
"ar","20-220-120","Argentine","229,299,237,296,244,297,248,301,262,314,266,312,284,325,283,330,279,335,279,341,292,344,302,343,305,343,310,338,315,329,314,326,317,328,320,339,317,343,286,369,284,374,284,380,280,405,280,411,290,420,288,423,288,427,290,429,295,428,294,438,284,454,262,458,254,459,247,456,248,481,242,483,225,478,225,493,227,493,237,494,239,496,238,497,237,498,234,501,230,505,224,512,222,519,220,525,221,528,207,535,207,542,207,547,211,550,217,550,220,555,220,562,217,565,203,576,202,585,199,589,193,594,192,603,195,613,198,617,232,653,215,658,202,653,195,648,192,617,167,612,164,596,156,595,156,584,172,547,172,521,167,500,169,492,169,467,176,451,175,435,180,430,181,413,185,411,185,401,179,378,185,376,183,369,187,365,187,350,193,343,195,340,198,339,196,319,209,311,208,308,209,302,211,296,217,295"
"bo","120-220-120","Bolivie","211,296,213,296,215,294,217,294,219,296,224,296,228,297,230,299,234,296,242,296,245,297,247,288,247,283,249,281,249,279,252,275,259,272,264,272,270,271,274,270,277,271,284,278,285,274,284,268,285,261,283,258,280,256,279,249,277,249,266,247,263,245,263,229,260,225,253,223,240,216,238,216,227,211,222,206,222,200,223,192,219,193,217,195,215,195,210,196,205,200,194,202,191,202,189,201,195,214,193,217,193,225,194,228,192,229,191,232,192,235,190,242,192,244,192,247,190,250,190,254,189,258,191,260,192,264,194,267,194,269,197,272,196,277,195,280,197,282,197,284,199,286,199,288,201,293,201,297,202,302,206,303,208,301,209,298"
"br","250-220-120","Brésil","340,72,368,109,477,155,476,183,442,221,422,299,372,318,361,355,322,406,320,402,322,396,310,380,302,376,288,368,320,340,320,326,314,325,317,314,311,307,303,309,303,296,297,293,293,294,287,293,284,287,284,280,287,273,287,265,285,257,282,251,282,246,278,242,272,243,268,243,265,241,265,232,263,222,224,205,224,186,208,193,187,197,180,197,180,182,172,189,161,184,154,170,155,164,161,162,162,157,166,151,172,149,176,147,183,145,186,144,191,115,184,108,192,100,185,99,185,95,202,95,204,99,210,99,215,101,218,102,238,92,240,88,230,74,241,77,247,78,258,72,266,66,265,71,270,73,263,88,268,93,271,98,276,100,302,93,311,90,317,93,327,92,332,90"
"cl","220-20-120","Chili","187,256,196,271,193,278,202,302,208,302,208,308,203,315,196,319,198,339,192,341,192,344,190,347,187,350,185,353,186,366,183,371,183,374,183,376,180,378,180,385,181,392,185,402,185,407,184,413,181,414,181,418,180,421,180,429,178,432,175,434,175,435,174,439,173,444,173,449,174,451,176,452,176,454,170,467,169,486,169,493,167,499,171,522,171,539,168,552,165,567,159,582,155,594,162,596,166,612,192,616,196,651,211,657,202,664,153,640,139,548,151,441,178,263"
"co","220-120-120","Colombie","170,4,141,15,120,36,118,44,124,79,112,88,109,99,121,105,127,108,135,106,142,110,154,119,159,127,169,125,181,128,182,130,179,138,184,142,189,116,183,108,188,102,184,100,184,94,202,92,207,98,210,97,202,83,207,80,200,67,204,61,204,56,189,59,184,53,174,51,164,47,157,29,166,12,175,7"
"ec","220-250-120","Equateur","100,100,114,101,121,105,128,107,136,106,140,109,139,115,137,121,130,127,127,130,119,132,115,133,112,138,112,143,109,148,107,148,104,146,99,145,97,142,97,137,101,135,101,130,96,129,94,130,92,127,92,127,92,123,91,120,91,117,95,116,96,114,97,109,98,105"
"gy","20-0-160","Guyana","270,40,260,44,262,48,257,52,256,59,260,65,261,68,267,65,269,71,269,76,268,92,272,97,276,99,279,97,283,94,288,94,291,94,293,92,297,92,290,78,286,76,283,73,284,66,288,65,290,66,292,64,293,57"
"py","20-120-160","Paraguay","293,345,303,344,305,342,306,340,309,339,311,336,311,331,312,324,314,322,314,320,315,317,313,314,305,313,302,310,302,302,301,299,298,298,288,299,284,296,284,288,282,285,282,283,281,278,277,273,266,273,260,274,253,277,251,280,251,282,249,284,249,292,247,299,256,308,262,313,266,313,269,314,272,317,277,320,279,322,284,325,286,327,286,332,284,334,283,337,281,339,281,342,288,342,291,343"
"pe","20-160-160","Pérou","96,137,89,143,91,159,101,167,103,173,109,177,131,219,131,229,147,242,171,254,173,257,176,261,187,257,189,252,191,243,189,237,190,230,193,225,191,220,193,213,194,211,187,198,180,197,180,184,170,190,165,186,159,185,159,182,152,173,151,166,154,162,158,161,159,155,163,152,163,149,171,147,176,145,182,143,184,142,178,138,183,131,176,128,168,127,162,128,158,128,154,119,146,113,137,107,137,109,140,112,140,115,137,119,133,125,129,128,123,130,113,137,110,142,110,147,107,149,104,147,99,145,96,144"
"sr","20-160-250","Surinam","292,59,317,60,314,69,315,75,318,79,316,81,315,84,315,89,307,88,302,89,301,92,295,92,291,79,286,76,284,71,285,66,290,64"
"uy","220-220-60","Uruguay","286,370,284,375,284,393,281,403,280,406,283,409,285,413,292,411,297,415,302,418,308,417,312,416,317,413,320,409,321,405,321,399,323,396,314,383,309,383,304,378,301,375,299,377,293,371"
"ve","220-60-60","Vénézuéla","167,11,156,30,165,48,185,53,188,59,204,56,205,62,201,66,206,82,202,84,205,90,212,99,216,102,230,97,238,89,231,85,229,73,240,76,261,69,261,62,255,59,259,48,262,42,271,39,265,35,261,37,259,32,261,31,255,26,247,25,245,20,250,19,243,17,232,15,232,16,184,6"
0,"0-0-0 ",0,
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_nord_amerique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_nord_amerique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_afrique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_afrique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/continents.csv
New file
0,0 → 1,9
"code","rvb_fond","nom","poly"
"1","60-174-15","Afrique","383,202,349,217,334,194,334,183,320,176,293,168,271,174,213,174,249,245,249,353,383,353"
"2","128-218-141","Amérique du Nord","0,220,116,220,116,225,153,224,153,211,200,211,200,199,206,199,206,193,220,193,212,174,296,0,0,0"
"3","189-179-25","Asie","579,20,579,150,501,225,501,252,494,252,485,249,473,254,384,256,383,193,392,193,392,182,398,182,396,181,396,171,401,172,401,166,409,166,409,156,355,156,357,154,358,150,354,146,360,142,363,143,377,144,378,132,381,131,379,127,382,125,381,122,378,117,384,110,384,87,379,79,379,20,431,20"
"4","0-128-218","Europe","287,19,214,173,269,173,286,168,298,168,319,175,319,166,323,165,327,157,336,158,344,163,355,164,353,156,356,152,352,145,360,140,364,143,377,143,376,131,380,130,377,127,381,123,376,117,384,107,384,98,384,94,382,86,378,80,378,20"
"5","206-0-0","Océanie","578,151,502,226,502,253,495,253,486,250,473,255,384,256,384,353,579,353"
"6","255-125-0","Amérique du Sud","222,194,207,194,207,200,201,200,201,212,154,212,154,225,114,225,114,221,0,221,0,353,248,353,248,246"
"7","0-0-255","Moyen-Orient","408,157,354,157,357,164,344,165,335,160,328,159,324,166,320,168,321,175,335,182,335,194,350,216,382,203,382,192,391,192,391,181,396,181,395,171,400,171,400,165,408,165,408,162"
"0","255-255-255",,
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_asie.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_europe.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_europe.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_sud_amerique.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_nord_amerique.csv
New file
0,0 → 1,24
"code","rvb_fond","nom","poly"
"ag","200-100-0","Antigua et Barbuda","99,370,99,388,106,389,109,388,110,385,107,371"
"bs","200-100-50","Bahamas","400,354,407,377,432,392,436,404,445,401,453,394,432,374,411,351"
"bb","200-100-75","Barbade","128,442,137,443,137,450,133,453,128,449"
"bz","200-100-100","Bélize","348,417,345,419,345,421,341,424,341,438,344,438,348,431,348,422,351,423,350,419"
"ca","200-100-125","Canada","173,194,312,193,338,201,352,197,356,201,366,212,380,224,377,235,373,242,374,244,378,243,395,238,395,234,409,228,413,222,432,221,440,206,449,207,456,223,467,234,493,215,527,210,526,202,496,162,442,120,440,82,367,36,375,20,391,6,366,3,329,8,265,27,238,40,204,63,168,67,126,119,126,121,133,121,132,125,127,124,127,127,134,140,135,148,138,149,138,156,135,161,138,175,152,172,153,179,149,183,162,198,164,199,170,200"
"cr","200-100-150","Costa Rica","363,477,377,479,382,487,382,498,377,497,374,491,365,487,363,486"
"cu","200-100-175","Cuba","368,388,384,380,397,382,407,388,426,397,436,406,428,410,411,410,411,404,390,393,380,398,372,397,369,395,366,393"
"dm","200-100-250","Dominique","449,408,452,415,450,416,451,425,453,426,457,421,459,422,462,420,466,419,467,421,470,420,472,419,472,417,465,412,460,409,457,407"
"sv","200-200-0","Salvador","336,456,338,454,341,451,345,454,350,454,352,460,347,461,342,461"
"us","200-200-100","Etats-Unis","173,194,312,194,335,201,345,205,365,211,377,233,375,240,373,244,384,243,395,239,395,234,408,233,409,226,413,222,434,221,440,205,449,206,451,216,457,224,440,233,442,246,432,250,424,253,423,260,418,274,418,289,414,296,396,311,386,323,392,342,396,353,396,368,390,374,384,374,381,369,387,365,382,352,378,345,378,338,373,332,370,333,359,332,356,328,342,330,340,337,331,339,322,335,309,335,307,342,299,342,296,348,294,363,280,357,278,348,274,343,273,338,270,334,262,332,258,339,249,331,249,326,239,317,230,318,230,321,214,321,193,311,179,311,177,305,163,298,53,309,25,288,34,284,158,280,150,251,153,233,163,199,172,200 6,151,26,111,50,87,70,82,72,72,130,56,173,63,120,126,6,157"
"gd","200-200-125","Grenade","113,457,118,458,116,465,110,465,107,462"
"gl","200-200-250","Groenland","113,457,118,458,116,465,110,465,107,462"
"gt","0-100-200","Guatémala","327,427,331,427,332,424,341,424,341,438,346,441,346,443,343,443,341,451,339,453,336,456,330,455,326,454,325,453,322,450,323,447,323,444,328,438,333,437,333,433"
"ht","50-100-200","Haïti","449,409,451,414,450,415,450,423,446,421,444,422,439,422,438,423,434,419,434,417,440,418,441,417,445,417,443,415,442,411,438,410,442,406"
"hn","75-100-200","Honduras","346,440,346,443,342,447,342,451,345,454,350,454,352,460,356,461,357,455,360,455,362,453,364,453,368,450,368,448,370,447,372,449,379,445,377,443,369,439,347,440"
"jm","100-100-200","Jamaïque","408,418,416,417,425,422,424,426,411,426"
"mx","125-100-200","Mexique","179,311,185,333,194,344,188,347,190,352,195,356,199,357,203,372,214,386,219,384,232,377,242,401,239,409,273,435,301,444,306,439,311,441,323,448,323,444,327,437,333,437,333,433,327,427,331,427,332,424,341,424,348,416,350,418,356,399,355,395,348,394,335,397,326,417,302,416,294,362,281,357,274,343,268,332,261,332,258,339,248,331,248,325,239,316,230,317,229,321,214,322,193,312,179,311"
"ni","150-100-200","Nicaragua","352,461,356,461,357,456,360,456,362,454,364,454,368,451,368,449,370,448,372,449,380,446,379,450,378,456,377,464,377,479,362,477"
"pa","175-100-200","Panama","382,500,382,487,393,495,402,488,413,491,419,497,419,502,418,506,412,508,410,503,411,499,405,495,403,499,398,502,402,506,398,510,394,509,392,508,393,506"
"vc","200-100-200","Saint Vincent et les Grenadines","114,444,120,445,118,452,112,451"
"lc","0-100-100","Sainte Lucie","118,434,115,439,117,443,120,444,123,443,124,438,122,435"
"tt","75-100-100","Trinité et Tobago","108,479,113,476,120,477,122,471,131,472,127,494,109,494,106,489"
"0","255-255-255","",""
/tags/v1.1-andromede/composants/cartographie/squelettes/france.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/france.png
New file
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_afrique.csv
New file
0,0 → 1,57
"code","rvb_fond","nom","poly"
"km","255-150-175","Comores","471,401,469,401,470,403 480,401,480,399,477,400 463,392,460,389,463,385,463,383,461,383,459,386,459,389,464,395"
"ci","255-150-225","Côte d'Ivoire","99,263,110,263,113,264,113,261,111,259,110,249,112,247,112,244,115,240,114,232,110,229,104,229,98,230,94,226,91,225,88,226,87,223,85,223,85,225,75,226,74,230,76,232,77,239,75,240,75,245,73,247,73,253,76,255,77,257,80,259,80,263,79,269,88,265,90,265"
"rw","175-255-150","Rwanda","359,319,364,319,364,315,363,312,361,312,357,313,354,318,354,320,358,321"
"mw","25-250-255","Malawi","396,427,399,423,402,421,402,413,394,404,390,397,388,395,388,393,390,390,390,381,388,379,387,375,385,375,387,382,385,385,385,396,382,399,382,403,381,405,386,410,392,410,394,412,394,419,393,424"
"bf","255-150-25","Burkina Faso","113,225,112,220,140,219,144,215,149,215,150,212,149,208,144,208,141,204,140,201,135,196,135,194,134,191,129,191,127,193,114,202,112,202,108,203,106,204,103,211,97,217,97,219,96,224,99,228,102,228,111,227,113,228"
"sl","125-255-250","Sierra Leone","48,248,50,246,54,243,55,240,54,235,51,230,42,229,36,236,37,240,39,242,43,247,45,247"
"eg","255-250-75","Egypte","389,85,391,84,391,81,393,76,393,71,390,64,390,62,389,59,387,59,377,60,377,63,379,64,379,68,380,72,382,74,385,81 384,86,379,81,377,76,377,74,375,71,375,58,372,56,361,56,359,58,354,60,352,62,349,62,346,60,344,60,337,57,335,57,329,56,327,55,323,56,321,55,320,59,321,66,319,68,319,70,320,74,322,75,322,134,384,134,388,135,391,131,393,131,394,128,399,126,399,118,396,115,387,96,387,94,384,89"
"ga","25-50-255","Gabon","229,316,235,317,237,319,239,314,239,306,238,299,240,296,240,293,236,292,234,294,232,294,231,287,228,287,222,286,219,287,219,294,206,295,206,301,204,302,204,306,202,308,202,311,204,316,207,319,216,329,220,328,220,321"
"bw","255-25-225","Botswana","320,499,324,498,326,493,328,491,334,486,338,481,340,478,347,473,350,472,350,470,345,469,342,467,342,465,341,460,338,457,331,453,327,448,325,443,323,441,322,438,320,438,315,440,311,444,309,443,308,440,303,440,294,442,291,443,291,469,284,470,284,492,289,497,291,500,291,504,290,507,297,508,305,501,308,497,315,497,318,499"
"ug","25-255-150","Ouganda","361,309,371,309,371,307,372,304,374,302,377,300,382,300,385,299,389,300,390,297,392,295,396,290,396,284,391,278,391,274,388,273,386,275,379,275,373,276,368,275,366,278,366,282,369,285,369,287,366,290,364,291,364,293,360,298,358,307,358,311"
"sz","151-151-75","Swaziland","371,511,373,509,373,503,369,502,366,507,367,511"
"ls","75-150-255","Lesotho","350,536,352,534,353,530,351,528,349,525,346,525,340,530,339,535,343,540,347,537"
"et","255-250-175","Ethiopie","448,272,450,270,452,270,455,269,458,266,463,264,471,264,482,253,491,245,491,243,484,243,475,239,473,239,466,236,464,236,456,228,454,225,454,221,449,222,447,220,447,217,449,212,449,209,446,206,443,202,441,201,437,196,431,195,429,194,421,195,418,193,416,196,408,196,408,201,406,206,401,210,397,217,397,220,391,225,391,238,389,240,384,241,384,243,387,244,390,247,392,250,396,253,396,255,399,260,402,261,404,263,404,267,408,267,421,274,423,274,430,275,434,271,436,271,442,270,445,272"
"cg","175-151-151","Congo","219,332,223,336,224,338,229,334,233,337,235,337,238,334,241,334,242,337,244,337,253,329,254,321,256,316,258,314,260,311,266,306,266,300,267,292,268,287,272,280,272,277,266,277,261,276,255,282,255,289,252,290,249,288,246,288,234,287,233,291,239,290,242,293,242,297,240,300,240,304,241,317,240,320,236,321,234,319,230,319,228,318,226,320,222,323,222,329,219,330"
"mr","25-255-50","Mauritanie","44,189,46,187,47,183,51,182,54,186,56,186,58,184,92,184,93,180,90,178,90,169,87,141,87,139,85,122,85,119,84,110,93,109,92,107,85,103,83,101,76,97,74,95,71,94,71,101,47,102,47,122,44,124,41,124,38,126,38,139,8,140,9,142,13,145,14,152,13,156,15,159,15,167,12,174,12,176,19,176,27,175,31,179,34,179,37,184,42,189"
"sd","151-151-25","Soudan","377,274,385,273,392,267,402,267,402,264,397,261,394,256,394,254,392,252,389,250,386,246,384,246,381,244,381,242,383,239,386,239,389,237,389,224,391,222,392,220,395,219,395,216,398,211,400,209,405,203,405,200,406,189,409,179,409,177,410,173,413,172,415,170,420,168,421,165,414,160,412,157,412,142,410,140,409,135,404,130,401,128,399,128,396,129,395,132,392,133,390,135,389,137,384,137,322,136,322,150,315,151,315,183,313,185,307,185,307,187,303,192,300,205,303,207,303,211,307,218,307,221,311,226,312,233,311,235,314,236,317,239,320,239,324,242,324,245,331,250,333,252,333,254,334,256,339,259,342,264,344,266,345,268,354,268,357,267,360,270,365,274,373,273"
"bi","255-150-75","Burundi","361,331,364,326,364,324,362,323,362,321,360,321,359,323,355,324,355,329,354,335,359,333"
"zm","75-151-151","Zambie","335,437,340,430,342,428,345,426,348,426,348,422,355,419,359,419,359,415,362,413,364,413,371,410,373,410,378,408,380,399,383,395,383,384,385,382,385,380,378,372,376,372,373,371,370,368,368,368,366,369,361,365,359,365,354,366,352,369,352,381,350,388,350,391,352,393,357,393,358,401,351,402,345,397,344,395,342,395,338,392,329,392,324,389,323,387,317,387,316,385,315,399,300,400,300,426,302,429,308,434,320,433,323,436,326,436"
"gm","75-50-255","Gambie","15,202,22,200,20,199,18,201,11,201"
"dz","255-25-75","Algérie","149,147,151,147,153,149,155,149,158,150,159,157,161,157,171,154,173,154,178,152,181,149,194,139,201,135,203,133,212,128,215,125,218,124,220,122,220,120,216,115,210,114,208,112,208,110,207,107,205,105,203,102,203,99,206,96,206,81,205,74,203,72,202,66,203,60,202,54,201,51,196,48,195,44,192,41,190,40,189,32,191,30,195,27,195,25,196,7,191,7,188,6,185,7,182,6,179,8,177,8,173,9,170,7,164,7,158,8,155,10,147,10,138,14,135,17,131,17,125,22,122,23,122,29,123,39,124,42,127,45,126,49,114,50,112,53,110,53,107,54,107,57,108,60,99,64,94,69,90,69,86,70,85,72,81,72,79,74,77,74,71,79,71,91,78,95,80,97,87,101,90,104,97,108,99,110,106,114,109,117,116,121,118,123,143,140,144,143"
"dj","255-250-25","Djibouti","456,217,454,216,454,214,457,212,457,209,455,208,451,212,451,214,449,217,449,220,452,220,455,219"
"lr","125-150-255","Libéria","78,260,75,258,74,256,71,255,70,252,71,249,69,248,66,249,63,247,63,242,62,240,58,240,55,245,52,248,50,249,53,254,56,255,58,257,65,263,72,267,75,267,77,268,77,263"
"tg","151-151-225","Togo","144,256,146,255,146,236,142,227,139,225,139,221,136,221,135,223,138,226,138,229,139,241,140,251"
"cv","25-100-150","Cap Vert","58,349,58,346,56,345,56,348 66,335,65,335 46,328,45,328"
"tz","151-151-125","Tanzanie","432,377,432,375,428,366,428,363,429,354,425,350,425,345,428,338,426,336,419,332,417,330,417,328,416,325,413,324,411,322,406,320,404,318,399,316,397,314,394,313,392,311,390,311,390,313,387,316,387,320,385,322,383,322,379,323,376,322,374,324,372,323,371,314,372,311,365,311,365,313,366,319,365,323,366,327,361,334,356,337,354,340,354,342,355,350,357,352,360,356,363,358,364,364,365,366,367,366,369,365,371,367,374,369,376,369,385,373,388,373,389,377,392,380,392,391,394,391,403,387,405,387,407,389,416,388,418,386,427,386,434,383,436,381"
"gw","175-50-255","Guinée Bissau","23,219,23,217,25,215,30,214,30,210,31,208,20,208,14,209,13,211,16,213,20,213,21,215,20,218"
"mz","75-255-50","Mozambique","372,472,372,479,374,488,374,500,375,507,379,508,379,506,377,504,377,501,379,500,381,497,390,493,392,493,398,488,398,485,397,483,399,476,399,473,397,471,397,469,395,462,393,460,393,454,398,449,402,446,403,444,405,444,407,442,407,440,409,439,411,436,420,431,423,431,428,427,430,426,436,419,436,415,437,410,436,395,435,390,438,385,438,383,437,383,433,386,431,386,428,388,419,388,417,390,410,390,406,391,401,390,392,394,391,396,394,399,397,404,400,407,404,412,404,422,401,425,399,426,399,429,396,430,391,425,390,421,392,418,392,413,385,412,382,409,363,415,361,416,361,418,362,422,370,422,379,426,381,428,381,430,382,442,380,447,381,456,378,461,378,463,376,466,376,468"
"zw","225-151-151","Zimbabwe","349,467,352,469,356,469,361,471,367,471,370,472,373,468,379,455,379,451,378,445,380,440,380,433,379,429,377,427,373,426,370,424,362,424,359,421,355,421,352,423,350,423,350,427,346,428,344,430,340,433,337,437,336,439,326,439,324,438,327,442,330,449,333,452,336,453,339,456,343,459,343,463,344,466"
"gq","225-50-255","Guinée équatoriale","217,293,217,287,208,287,206,292"
"cd","125-255-150","République Démocratique du Congo","317,383,318,385,323,385,326,388,331,390,333,390,337,389,339,391,343,392,346,394,350,399,356,400,356,395,351,395,347,391,347,388,350,378,350,368,353,364,356,364,361,363,361,359,359,357,355,354,353,349,353,344,352,329,353,325,351,322,351,319,356,310,356,303,357,299,359,297,362,293,362,290,366,287,366,285,364,283,364,278,365,276,358,270,349,270,346,271,343,269,340,265,332,265,330,264,319,266,315,266,312,268,305,268,303,271,294,271,288,270,286,268,284,265,280,265,276,269,276,274,274,276,274,281,270,288,270,293,268,304,268,307,264,311,260,314,257,319,257,321,256,327,255,330,249,336,244,339,241,339,240,336,237,337,235,339,230,339,229,346,231,346,257,345,260,348,260,351,263,358,266,361,277,361,280,354,290,353,291,355,296,355,298,357,298,362,299,376,300,385,303,383"
"so","175-255-250","Somalie","443,281,443,309,445,312,447,312,456,301,462,295,470,288,477,285,480,282,483,278,491,271,492,268,494,266,500,259,500,257,503,250,505,248,506,243,510,239,513,234,513,230,514,226,516,225,516,215,513,214,512,216,508,217,513,214,510,217,508,217,499,219,497,219,490,220,483,223,476,223,471,226,466,226,459,219,456,221,456,224,458,226,465,234,467,234,476,238,478,238,485,241,494,241,495,243,472,266,463,266,458,269,456,271,454,271,451,272,448,275"
"td","151-151-175","Tchad","257,243,259,243,262,244,267,241,273,241,276,238,276,235,285,233,287,233,294,226,296,225,296,222,298,220,303,219,304,217,301,212,301,208,298,208,297,204,298,199,300,196,300,193,302,191,305,186,305,184,311,183,313,182,313,155,262,129,260,127,255,125,252,125,249,126,248,139,249,142,251,144,254,146,254,149,252,154,252,158,250,173,250,175,244,181,238,188,237,192,235,193,236,198,240,202,243,204,245,207,245,209,246,220,249,224,249,228,241,229,241,232,242,234,244,234,247,237,249,244,250,246,255,245"
"ly","175-150-255","Libye","317,67,319,65,319,62,318,56,319,52,315,52,306,50,305,46,298,44,294,44,290,45,286,49,284,50,284,52,283,54,285,59,282,64,279,66,273,66,270,63,263,60,260,60,255,59,252,58,248,54,247,49,238,45,235,45,224,44,220,43,220,47,217,50,210,56,210,58,211,62,208,65,205,66,204,69,207,73,207,80,208,96,205,100,209,107,209,109,210,112,214,112,219,115,222,120,238,121,245,125,247,125,252,123,256,123,313,152,313,150,320,149,320,76,318,74,318,71"
"er","255-250-125","Erythrée","451,208,454,207,453,205,450,203,447,199,445,198,441,193,439,193,437,191,435,191,433,189,433,187,431,187,428,185,426,180,426,178,424,171,423,169,416,172,415,174,422,169,413,174,411,179,411,181,408,191,408,194,411,194,413,193,415,194,416,191,419,190,422,193,424,193,430,192,436,193,438,195,442,198,443,200,448,204"
"mg","225-150-255","Madagascar","462,479,462,481,463,484,462,486,463,490,468,495,471,497,474,497,477,495,480,495,485,493,489,484,489,481,493,468,493,466,501,441,501,436,504,429,504,421,506,420,508,421,508,405,504,398,502,397,501,399,497,401,498,406,494,409,492,409,492,412,491,416,487,417,487,419,482,422,482,425,479,426,476,425,474,427,468,427,467,431,464,436,465,443,464,445,467,449,468,453,465,456,465,459,464,463,460,468,459,475"
"ma","125-250-255","Maroc","38,123,43,122,45,121,45,101,69,100,69,78,74,73,78,72,80,70,84,70,86,68,89,68,93,67,99,61,101,61,105,58,105,53,110,51,113,48,124,48,125,45,123,44,121,39,121,31,120,26,117,24,115,24,112,22,110,22,100,23,98,21,96,20,94,17,92,19,93,17,91,19,91,21,86,32,84,34,80,37,73,40,68,45,67,50,64,53,62,58,62,63,63,68,59,75,56,78,51,81,48,84,38,87,38,89,36,91,35,95,33,97,30,98,28,100,25,110,23,112,16,122,15,127,12,132,10,133,10,135,9,138,36,138,36,126"
"st","25-255-250","Sao Tomé et Principe","182,299,182,296,181,296,180,300"
"tn","25-151-151","Tunisie","214,49,218,46,218,41,214,38,210,37,207,35,207,32,209,31,213,26,215,25,216,19,213,17,212,11,215,8,211,8,210,5,204,4,198,9,198,25,197,28,195,30,191,33,191,37,192,39,196,42,197,46,202,49,204,56,204,59,205,64,208,62,208,55"
"cf","75-255-150","République Centrafricaine","288,267,292,267,295,269,302,269,305,265,307,265,311,266,316,264,322,264,331,262,339,263,336,259,333,258,331,255,331,253,328,250,322,245,322,243,319,241,316,241,313,238,311,238,309,236,309,232,310,229,305,222,301,221,298,223,298,226,290,233,287,235,284,235,278,236,278,239,274,243,267,243,265,245,256,246,253,248,250,248,244,259,244,266,249,275,253,279,255,279,259,275,266,274,271,275,274,273,274,269,278,265,279,263,285,263"
"ng","225-255-50","Nigéria","219,253,224,242,224,240,229,235,229,232,231,225,233,222,233,220,237,216,240,215,241,211,239,209,239,204,235,200,233,200,231,202,229,202,227,204,224,204,211,203,209,205,206,207,200,207,193,203,191,203,188,206,186,206,183,203,178,200,170,200,167,201,165,204,165,206,162,209,162,218,163,224,162,228,159,231,159,233,156,240,156,254,167,254,172,257,176,264,176,266,177,268,184,269,187,267,189,267,194,268,196,265,198,264,198,262,199,258,201,256,204,252,205,250,214,250,217,253"
"ne","175-255-50","Niger","165,200,170,198,178,198,183,201,185,203,188,203,191,201,194,201,198,204,200,204,205,205,209,202,224,201,226,202,233,197,234,196,233,192,235,191,235,189,238,186,245,178,248,174,248,166,249,157,250,152,252,147,250,145,248,144,246,139,246,127,243,127,240,124,222,123,220,125,213,129,211,131,204,135,202,137,195,141,193,143,180,153,177,155,175,155,168,157,166,158,166,182,162,185,161,187,144,187,143,189,137,190,136,193,139,198,143,202,146,206,150,206,151,211,153,211,153,209,155,208,159,211,160,208,163,205,163,203"
"mu","175-250-255","Maurice","557,460,557,456,556,456,555,460 594,455,593,455"
"cm","255-150-125","Cameroun","229,284,246,285,250,286,252,288,253,282,247,276,246,273,244,271,242,266,242,257,244,255,248,246,246,241,246,239,245,237,242,236,239,233,238,229,240,227,247,227,247,225,244,221,244,211,243,208,241,207,243,210,243,215,236,220,232,229,232,232,231,236,226,241,226,243,220,254,216,255,213,252,206,252,202,257,201,263,199,265,199,267,201,268,202,271,206,272,207,275,209,277,209,282,208,285,219,285"
"bj","255-25-175","Bénin","152,255,154,254,154,238,156,235,156,233,157,230,160,228,160,225,161,220,160,215,156,211,152,215,155,211,151,215,150,217,145,217,142,220,141,224,144,226,146,229,146,231,148,236,148,253,149,255"
"sc","100-255-250","Seychelles","572,342,572,340,570,340,569,342"
"ke","25-150-255","Kenya","426,334,430,335,434,328,434,326,437,321,440,319,442,316,444,315,443,312,441,310,441,281,444,278,446,275,441,272,438,272,435,273,432,276,423,277,419,276,406,269,393,269,392,272,394,279,398,282,398,290,394,295,390,302,392,304,392,307,391,309,398,312,400,314,403,315,405,317,410,319,412,321,415,322,418,325,419,329,421,331,424,332"
"sn","75-255-250","Sénégal","10,204,10,208,12,208,25,206,36,206,41,208,48,208,48,204,44,201,44,196,43,191,41,191,34,184,33,181,30,181,26,177,21,177,11,178,11,185,7,190,7,193,9,195,10,198,17,199,19,197,22,197,31,199,33,200,33,202,25,203,20,202,15,204"
"na","125-255-50","Namibie","282,470,284,468,289,468,289,442,292,440,296,440,305,438,309,438,310,440,312,440,314,438,318,437,319,435,312,435,307,436,302,438,300,438,289,439,276,438,271,434,237,434,234,431,229,431,224,432,222,434,222,436,223,440,230,450,239,469,241,471,243,482,243,488,245,493,245,498,249,515,251,517,256,523,258,523,260,521,262,521,266,524,267,527,276,527,278,525,281,524"
"gn","125-151-151","Guinée","72,245,73,242,72,239,75,238,75,235,72,231,72,227,73,225,71,223,71,220,70,217,67,215,67,212,66,210,61,212,57,212,54,213,49,212,48,210,40,210,33,208,33,214,31,216,28,216,25,218,25,221,27,223,28,226,32,229,35,233,37,233,39,231,40,228,51,227,54,230,56,235,56,238,62,238,65,241,65,246,67,247,69,245"
"ao","255-25-125","Angola","271,432,273,434,278,436,289,436,298,437,305,435,298,427,298,399,313,398,313,385,303,385,302,387,299,387,297,370,297,363,296,357,290,357,289,355,282,355,279,362,268,363,266,364,261,359,258,352,258,349,256,347,233,347,228,349,229,352,231,354,231,356,234,363,234,366,235,368,233,371,234,376,236,378,238,381,238,387,237,394,235,396,234,398,231,399,231,401,228,404,228,406,226,415,222,424,222,431,231,429,234,429,238,432"
"ao","255-25-125","Angola","226,343,227,340,226,340"
"ml","75-250-255","Mali","83,224,85,221,88,221,89,223,94,223,94,219,97,214,102,209,102,207,105,202,110,201,117,198,120,195,125,191,128,189,136,189,141,188,144,185,160,185,164,180,164,158,158,159,157,152,155,152,151,149,148,149,144,145,141,143,141,141,113,122,111,120,104,116,102,114,98,111,86,111,86,118,87,129,89,146,89,148,92,176,93,178,95,179,95,183,93,186,59,186,55,189,53,189,51,187,51,185,49,184,48,188,45,191,45,194,46,200,50,203,50,210,53,210,55,211,61,210,64,208,67,208,69,211,69,213,72,216,72,218,73,223,76,224,78,223"
"gh","125-50-255","Ghana","120,266,125,263,128,263,135,259,141,259,142,257,139,254,137,231,136,227,133,224,133,221,114,221,114,224,116,235,116,237,117,241,115,243,114,248,112,250,112,256,115,260,115,265,117,265"
"0","255-255-255,"0","0","0","287,577,285,579,279,579,276,576,273,574,271,574,270,568,268,566,266,563,270,558,270,556,269,552,267,550,259,533,259,531,255,524,249,519,246,514,246,510,244,503,244,500,243,493,241,488,241,479,240,474,235,465,233,463,232,459,225,446,223,444,220,439,220,423,222,420,222,418,224,413,224,411,225,406,229,399,231,397,233,396,235,393,235,388,236,382,232,377,232,374,231,370,232,363,225,348,225,346,224,342,220,335,218,333,215,331,211,326,206,322,202,317,202,315,200,312,200,310,199,308,202,305,202,301,204,296,204,294,203,292,205,289,205,286,206,281,207,278,205,276,205,274,203,274,200,272,199,270,196,269,190,270,187,269,185,271,178,271,174,267,174,265,173,262,170,259,169,257,167,257,153,256,147,257,144,258,141,261,136,261,129,265,127,265,120,268,117,268,110,265,97,265,88,267,81,271,78,271,73,269,71,269,67,266,64,265,56,257,54,257,48,251,41,248,40,246,36,243,34,240,34,234,30,231,30,229,27,228,24,223,20,220,18,219,18,215,15,215,8,210,8,204,7,202,9,200,5,193,3,193,2,191,4,189,8,186,9,177,13,164,13,159,11,157,10,154,12,152,12,148,11,146,9,145,8,143,6,142,6,140,7,135,11,130,13,125,13,123,15,121,16,118,18,116,23,109,23,107,27,98,31,95,33,94,36,87,39,84,42,84,49,81,54,76,58,73,59,70,61,68,61,65,60,56,63,51,65,49,65,46,67,44,72,38,81,34,84,31,87,26,87,24,90,17,92,15,95,15,97,17,99,20,107,21,113,20,116,22,120,22,123,21,128,16,134,15,137,12,144,9,146,9,154,8,157,6,162,6,172,5,174,7,178,6,181,4,185,4,187,5,191,4,199,5,202,2,1,2,1,580,599,580,599,2,211,2,212,6,217,4,218,8,216,11,214,12,214,14,215,16,218,18,218,23,217,26,211,31,209,34,216,36,217,39,219,39,224,42,235,42,244,46,246,46,249,49,249,51,253,56,255,56,264,58,269,60,273,64,279,64,281,62,282,56,281,51,288,44,293,42,301,42,306,44,307,48,310,48,316,49,320,50,323,54,329,53,335,54,342,57,344,57,347,59,349,59,351,60,355,57,362,54,373,54,375,56,378,58,385,58,388,56,391,58,391,60,394,67,394,69,396,74,393,84,390,88,383,82,382,78,380,77,382,82,386,86,386,89,388,91,389,96,391,101,393,103,398,114,402,118,401,125,404,128,411,134,411,137,414,141,414,156,415,159,418,160,421,163,423,164,424,167,426,169,426,171,428,180,431,185,434,185,435,188,438,189,440,191,442,191,446,195,447,197,452,201,454,204,459,208,460,212,457,215,463,220,465,223,470,224,477,220,484,221,486,219,496,218,509,215,513,212,517,213,518,224,519,226,516,227,516,230,515,235,513,237,510,242,508,244,508,247,506,249,502,258,502,260,495,267,493,272,489,276,481,283,478,287,471,290,467,294,453,307,447,314,444,318,442,319,441,321,438,323,433,334,430,337,430,339,427,346,427,349,429,351,432,355,431,363,430,365,432,368,432,370,435,377,439,380,440,385,438,390,438,408,440,413,438,416,438,420,433,425,430,429,426,432,421,433,412,438,405,447,403,447,395,455,395,459,397,461,397,463,399,470,401,472,401,478,400,488,395,494,388,496,381,500,379,502,381,504,381,511,379,518,379,520,378,523,369,532,362,545,353,554,344,564,338,569,331,571,327,571,327,573,325,574,322,573,320,575,314,574,310,573,305,574,301,573,297,576"
"0","255-255-255,"0","0","0","88,391,88,323,25,323,25,391"
"za","255-25-25","Afrique du Sud","284,577,286,575,295,575,300,571,305,571,308,572,314,571,320,572,325,571,326,569,332,569,337,567,341,563,346,559,348,558,355,549,360,544,361,541,363,539,364,536,366,534,367,531,376,522,376,519,378,512,378,510,375,510,371,514,367,513,365,511,364,507,366,502,369,499,372,500,372,487,370,478,369,475,366,473,359,473,353,472,351,474,346,476,343,479,339,482,335,487,334,489,328,494,326,499,321,501,317,501,314,499,309,499,305,503,300,509,289,510,288,504,289,500,285,496,284,524,277,529,267,529,264,526,262,523,259,525,259,527,265,540,265,542,268,546,271,553,271,555,272,559,269,563,273,570,273,572,275,572,276,574,278,574,280,577"
/tags/v1.1-andromede/composants/cartographie/squelettes/.directory
New file
0,0 → 1,2
[Dolphin]
Timestamp=2010,5,12,18,42,59
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_oceanie.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_oceanie.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_europe.csv
New file
0,0 → 1,44
"code","rvb_fond","nom","poly"
"al","150-150-255","Albanie","346,416,351,422,351,435,356,439,357,444,354,447,352,451,348,454,346,454,339,450,337,444,338,438,341,432,340,427,338,425,340,418"
"de","255-75-75","Allemagne","239,247,254,231,261,234,274,240,292,240,300,250,297,263,295,264,300,269,299,278,301,287,299,292,298,294,287,298,280,299,275,301,276,305,277,312,278,313,288,324,286,327,283,329,279,331,280,340,275,339,266,338,263,342,258,339,253,338,252,340,249,337,247,337,243,334,236,331,236,334,232,334,227,332,228,327,236,314,222,308,220,304,221,296,221,293,223,291,222,287,219,285,219,282,220,281,223,277,224,276,223,273,223,270,227,271,229,270,231,268,233,267,234,266,233,265,231,264,232,261,233,260,235,260,237,258,238,254,238,254"
"an","51-51-51","Andorre","150,389,154,390,155,394,150,394"
"at","179-179-179","Autriche","249,344,249,347,251,347,254,346,256,348,259,349,260,347,270,347,272,352,281,356,284,356,293,358,296,356,306,356,311,350,312,346,316,341,318,341,318,338,316,336,316,329,310,328,307,326,305,326,303,324,300,324,299,328,297,330,291,330,288,329,286,330,285,332,280,334,280,337,282,340,282,342,280,345,276,342,272,342,267,341,264,344,260,344,257,341,255,341,255,343,253,345,251,344,250,341,248,340,247,342"
"be","204-204-204","Belgique","190,275,191,280,196,280,198,285,201,288,201,291,201,293,204,295,206,293,206,292,207,293,208,296,209,298,211,301,213,302,215,302,215,297,215,296,218,295,219,295,222,293,222,290,219,286,218,285,218,283,220,280,220,279,217,277,214,275,212,275,208,275,206,276,203,274,200,273,197,275"
"by","225-255-225","Biélorussie","425,282,429,281,430,283,432,283,438,282,440,283,440,275,443,272,447,269,446,267,447,265,442,259,442,256,444,254,446,254,450,255,454,252,451,248,448,248,445,246,445,244,440,240,439,237,436,236,435,230,433,228,434,224,427,220,425,223,423,223,422,220,420,220,417,221,415,219,412,219,406,225,404,225,401,226,401,228,403,230,403,233,401,235,398,237,396,240,396,248,394,249,392,248,390,250,386,253,381,254,378,253,378,258,381,262,381,271,377,275,380,279,380,284,382,285,384,284,386,281,396,278,401,278,403,280,410,280,413,283,416,283,420,282,422,281"
"ba","255-25-25","Bosnie-Herzégovine","333,402,338,399,338,397,340,396,336,391,338,384,335,384,333,382,326,381,324,382,321,379,314,379,310,380,308,381,305,379,305,382,307,384,307,387,308,390,310,392,315,399,318,402,323,408,323,410,327,410,330,411,330,407,332,405"
"bg","75-75-255","Bulgarie","374,393,392,398,406,395,416,390,425,387,435,393,436,393,429,400,429,411,433,418,415,422,412,423,412,428,403,430,398,431,391,427,385,431,378,428,376,421,373,416,372,409,375,405,374,402"
"cy","200-200-255","Chypre","230,427,218,427,216,452,220,459,224,460,231,457,236,434"
"hr","255-225-225","Croatie","302,369,302,361,307,360,309,359,313,360,315,360,318,362,320,366,321,368,326,369,329,369,333,369,335,371,335,374,336,377,334,379,332,380,329,379,323,380,322,377,319,377,311,376,306,376,305,376,303,378,303,379,305,383,306,385,306,388,307,392,322,408,326,411,330,414,329,417,322,413,312,411,293,392,283,380,282,370,292,370"
"dk","25-255-25","Danemark","254,205,273,193,286,218,286,234,281,240,271,236,262,233,253,230,249,233"
"es","102-102-102","Espagne","47,363,46,351,52,349,55,349,59,346,63,346,71,351,78,353,83,355,89,359,93,363,98,364,103,365,107,367,114,369,119,372,123,373,125,375,127,378,129,380,131,382,134,385,136,385,140,387,142,388,145,386,150,389,155,392,155,395,157,397,164,399,168,398,169,403,169,405,176,437,139,449,95,465,51,461,37,438,38,433,48,428,43,421,49,418,52,412,47,404,55,404,63,387,68,384,71,382,67,378,67,372,62,374,54,370,49,370,52,363"
"ee","125-255-125","Estonie","403,168,389,168,376,173,372,176,362,178,360,187,362,194,381,191,387,191,394,196,404,195,405,192,401,177,405,175"
"fi","100-255-100","Finlande","401,154,369,167,355,153,354,121,377,86,370,81,364,49,351,36,355,33,360,41,365,38,370,42,374,37,376,35,377,24,384,21,391,26,391,44,396,46,401,51,397,60,399,67,404,73,404,85,407,86,404,91,410,93,410,98,413,102,410,107,420,114,420,125,410,143"
"fr","77-77-77","France","115,291,133,291,144,298,145,284,175,287,179,284,182,277,188,276,191,279,198,282,197,285,201,288,201,293,204,296,206,293,209,298,212,301,215,303,218,305,223,309,229,311,234,313,236,314,230,323,228,327,228,333,226,334,218,333,221,337,208,346,210,350,216,349,218,351,219,355,216,356,215,358,217,363,217,365,211,367,215,382,219,381,219,388,240,402,235,423,230,425,169,397,155,396,154,391,145,386,142,388,133,384,122,372"
"gr","175-175-255","Grèce","378,430,385,431,392,428,398,432,406,430,412,430,413,423,417,423,419,428,416,433,413,436,520,496,515,509,493,517,402,522,379,513,363,497,351,480,346,472,348,457,350,455,351,450,355,449,355,444,358,438,363,438,367,435"
"hu","255-175-175","Hongrie","337,366,339,366,346,363,354,363,357,362,357,360,359,358,360,355,362,353,363,347,368,342,369,340,372,339,373,337,371,337,367,333,363,334,362,331,360,331,355,332,353,331,351,333,346,339,342,338,339,340,336,340,335,342,325,343,320,338,320,342,317,343,315,345,313,352,312,354,313,359,316,362,318,362,320,364,324,369,331,369,335,368"
"ie","0-255-0","Irlande","125,191,114,194,101,196,85,222,84,228,85,235,91,238,120,238,129,226,130,212,125,205,121,207,120,203,120,198"
"is","255-50-50","Islande","98,3,88,24,92,39,103,54,119,57,151,58,161,43,162,25,135,9,124,1"
"it","153-153-153","Italie","216,357,217,365,212,367,215,382,219,381,219,387,232,381,242,385,245,392,249,402,250,409,255,416,217,431,217,454,221,460,276,433,284,439,286,442,288,444,292,449,294,451,259,475,260,482,287,500,291,499,332,450,273,375,281,366,281,360,284,355,277,354,272,351,269,346,259,347,258,349,254,347,251,350,252,351,248,352,246,354,243,351,240,353,240,355,237,357,236,356,232,353,229,356,225,357"
"lv","150-255-150","Lettonie","384,191,360,200,356,206,354,212,356,219,363,215,373,213,376,218,383,215,389,218,395,220,402,225,411,217,408,210,406,205,409,201,401,197,393,196"
"li","0-255-255","Liechtenstein","246,340,244,341,244,346,248,346"
"lt","175-255-175","Lituanie","356,220,362,214,374,214,376,218,380,217,384,216,389,220,393,220,399,225,401,230,398,232,394,236,395,246,391,246,384,250,378,251,372,245,369,239,371,234,364,233,358,231,356,226"
"lu","229-229-229","Luxembourg","220,305,221,301,220,297,219,297,217,300,217,304"
"mk","125-125-255","Macédoine","362,439,366,435,375,435,377,432,377,426,370,418,369,418,366,420,364,420,354,423,353,434,357,439"
"mt","225-225-255","Malte","294,508,290,510,292,516,297,517,301,513,299,509"
"md","25-25-255","Moldavie","436,353,438,353,443,354,443,349,440,348,439,346,440,343,438,343,435,340,435,338,434,335,431,334,430,332,425,332,421,329,418,329,412,330,412,332,416,336,418,341,428,350,428,352,429,356,428,366,429,368,431,367,432,363,435,360,435,357,434,355"
"mc","50-255-255","Monaco","218,390,212,387,211,390"
"no","50-255-50","Norvège","283,175,279,160,275,174,270,175,259,185,246,188,239,170,246,126,262,115,290,96,308,49,359,10,368,7,387,7,401,11,400,23,391,33,391,23,383,20,376,24,375,35,371,41,365,37,360,41,353,33,349,36,345,44,339,44,337,45,334,51,329,53,325,58,327,64,320,75,314,78,307,99,309,103,307,105,303,105,301,106,295,112,294,140,296,143,297,148,292,147,292,161,288,164"
"nl","245-245-245","Pays-Bas","215,252,225,246,236,251,237,254,234,258,232,260,231,261,231,265,234,266,231,267,229,270,226,271,223,270,222,271,223,274,223,278,221,278,217,277,214,275,211,273,208,274,206,275,204,275,200,271,201,269,207,268,212,261,214,258"
"pl","255-100-100","Pologne","302,249,311,248,322,241,334,239,338,245,347,245,354,246,374,246,377,249,376,257,381,261,380,266,376,269,373,273,375,276,378,279,379,285,378,287,380,291,381,294,381,298,380,300,377,303,374,307,370,314,370,317,372,319,370,320,364,316,359,315,356,316,351,317,346,317,345,318,340,315,338,316,337,316,333,311,333,308,330,308,327,306,319,300,318,306,315,302,311,298,300,291,301,287,299,282,299,278,300,272,300,269,294,265,297,262,299,254"
"pt","26-26-26","Portugal","45,366,30,387,22,398,22,405,20,419,19,430,19,433,21,438,27,439,31,439,37,439,38,433,47,428,46,424,44,421,46,419,49,418,52,413,47,403,51,405,54,405,55,404,62,386,68,385,71,382,69,379,67,379,66,373,61,375,55,370,50,370,52,364"
"cz","255-125-125","République Tchèque","316,326,318,327,321,325,323,325,330,326,330,323,335,318,333,315,333,313,331,311,327,311,324,308,323,306,320,305,320,308,316,309,314,307,313,303,312,301,307,299,305,297,301,296,299,298,293,297,290,298,288,300,278,303,277,305,279,307,279,309,278,312,282,316,285,320,288,322,293,328,297,327,297,325,299,322,304,322,306,324,308,324,311,326"
"ro","50-50-255","Roumanie","375,334,394,339,408,331,416,335,418,340,427,350,427,354,427,363,430,369,433,370,439,367,444,368,444,373,442,374,436,377,437,385,434,392,424,388,402,395,391,396,382,395,373,391,371,387,372,384,369,381,366,382,360,382,360,376,356,372,349,364,358,362,363,350,364,343"
"uk","255-0-0","Royaume-Uni","129,192,125,197,121,199,119,204,121,207,125,205,127,209,128,210,131,212,132,214,136,243,127,244,128,249,115,266,120,272,167,279,174,276,183,271,192,253,205,131,194,135,142,154,137,167"
"ru","200-255-200","Russie","345,237,350,234,354,228,362,234,369,234,370,238,369,241,373,246,347,245 488,1,463,21,405,17,400,24,396,29,394,31,393,37,392,39,392,44,393,45,396,46,398,51,399,53,399,57,398,60,398,65,400,69,401,74,403,78,404,83,405,86,406,88,404,90,407,92,409,95,411,98,412,101,414,102,412,104,412,105,413,109,417,111,420,114,422,118,423,119,423,123,422,125,421,129,420,129,419,130,416,134,415,137,413,140,411,142,408,143,406,147,403,150,402,151,401,153,405,169,404,175,402,179,404,198,407,201,407,206,412,215,428,217,436,222,436,223,437,228,437,232,440,237,444,240,446,242,451,244,453,246,454,247,456,249,456,251,452,254,450,255,449,255,447,255,446,254,443,253,442,256,445,258,446,262,448,266,448,268,449,269,451,269,453,269,454,267,455,265,458,263,461,262,467,263,472,268,474,268,474,271,473,274,473,276,477,277,479,276,482,275,485,279,486,283,487,285,489,286,492,284,496,284,500,284,503,282,505,282,511,286,518,286,521,286,525,287,524,0"
"sm","25-255-255","San Marin","267,374,264,371,261,375,262,377"
"sk","255-150-150","Slovaquie","332,341,334,340,335,338,338,338,341,336,346,336,349,333,352,329,355,329,358,330,363,328,364,331,366,331,368,322,361,318,358,318,356,320,350,320,347,322,344,321,342,319,340,319,335,321,332,324,332,327,320,328,318,331,318,335,322,336,326,341"
"si","255-200-200","Slovénie","297,372,299,372,299,370,302,368,302,365,301,363,303,361,306,361,308,359,311,359,311,356,309,355,307,358,297,358,293,361,286,359,284,361,284,365,283,367,285,369,285,371,288,371,295,370"
"se","75-255-75","Suède","306,236,339,204,349,158,347,113,356,103,358,85,362,83,370,81,367,74,367,70,368,68,367,63,365,58,365,55,364,47,348,35,348,41,345,45,337,45,335,52,330,52,325,58,326,64,322,69,320,75,314,79,313,86,307,99,310,101,310,104,306,106,303,105,296,112,294,139,296,141,296,145,296,148,292,149,293,153,293,160,289,163,288,167,287,173,286,177,280,174,281,185,287,215,291,229,301,235"
"ch","128-128-128","Suisse","237,358,239,356,240,353,244,352,245,354,248,354,249,352,252,352,253,349,248,349,244,345,244,342,245,340,244,338,241,338,239,336,232,337,228,336,222,337,222,339,219,342,216,343,213,347,211,348,212,349,216,348,219,350,219,354,221,357,226,357,228,355,230,352,233,352,234,355"
"ua","0-0-255","Ukraine","522,287,504,284,497,288,490,288,486,286,482,276,476,278,473,273,475,269,463,263,457,265,454,267,452,269,448,269,444,269,441,273,440,274,440,284,437,281,434,282,429,283,427,280,424,281,423,281,421,280,412,283,408,279,404,280,398,277,385,281,383,284,379,284,379,287,382,295,382,301,371,312,373,319,371,321,367,326,367,331,369,334,373,335,376,334,394,339,408,332,414,328,420,326,425,330,430,331,436,334,438,337,439,342,443,346,445,348,442,353,435,354,436,358,437,360,434,363,430,366,431,368,433,369,441,366,442,366,444,364,445,364,448,361,450,359,451,354,464,346,464,351,466,354,469,357,471,364,486,376,489,376,513,361,513,354,524,327"
"yu","100-100-255","Yougoslavie","337,400,332,403,329,406,330,412,331,414,332,420,336,425,339,425,339,419,343,416,348,413,346,410,341,405 352,421,355,419,361,419,370,415,370,412,372,410,374,409,374,406,370,403,369,395,370,391,369,389,371,387,368,389,359,385,358,381,359,378,356,378,353,375,352,371,345,365,342,367,340,367,337,368,336,375,338,377,338,379,337,382,340,384,338,389,338,391,342,395,342,397,339,398,339,401,342,406,344,408,348,409,349,414,348,416,350,418"
/tags/v1.1-andromede/composants/cartographie/squelettes/continents.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_moyen_orient.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_moyen_orient.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_nord_amerique.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/france.csv
New file
0,0 → 1,108
"code","rvb_fond","nom","poly"
"01","0-204-51","Ain","483,314, 486,313, 489,308, 489,305, 491,303, 493,302, 494,298, 495,296, 492,293, 487,299, 484,303, 478,303, 477,301, 474,301, 472,303, 468,304, 467,301, 463,298, 462,296, 460,295, 459,293, 456,291, 451,292, 448,291, 447,296, 445,299, 445,302, 443,309, 443,311, 444,313, 443,322, 446,323, 449,326, 450,329, 457,329, 459,331, 462,331, 465,326, 467,326, 468,329, 475,336, 476,339, 478,339, 482,332, 482,330, 484,321, 484,319"
"02","240-240-255","Aisne","389,160, 394,155, 395,150, 393,147, 393,145, 396,142, 395,135, 400,132, 402,132, 404,130, 406,130, 408,131, 409,127, 408,125, 409,117, 415,112, 415,102, 414,98, 408,98, 406,95, 402,95, 395,94, 393,95, 391,94, 388,96, 384,95, 391,94, 388,96, 384,95, 379,96, 379,99, 377,102, 377,104, 375,105, 375,109, 376,113, 378,115, 378,117, 377,120, 378,124, 377,126, 379,129, 375,136, 373,136, 375,138, 375,140, 377,143, 377,147, 379,149, 379,152, 386,159"
"03","255-125-125","Allier","393,320, 397,320, 400,323, 402,321, 404,321, 405,314, 404,305, 409,299, 409,294, 406,294, 403,292, 401,292, 399,290, 399,287, 398,284, 395,283, 392,285, 390,285, 388,283, 382,283, 380,284, 377,281, 373,278, 370,278, 367,282, 362,282, 359,285, 360,289, 356,293, 349,293, 347,296, 352,302, 355,304, 358,311, 358,314, 361,314, 364,310, 366,310, 368,307, 370,307, 372,312, 375,315, 377,315, 379,317, 387,317, 389,318, 391,317"
"04","51-51-153","Alpes-de-Haute-Provence","491,443, 494,442, 496,444, 499,444, 500,442, 502,442, 505,438, 509,441, 512,441, 512,439, 519,438, 522,437, 523,434, 527,433, 528,431, 530,431, 528,428, 524,425, 524,422, 522,420, 522,415, 525,411, 525,409, 527,407, 530,406, 530,403, 531,401, 528,398, 528,396, 531,394, 531,390, 530,390, 526,394, 521,398, 520,402, 514,403, 512,401, 509,399, 503,404, 501,404, 500,402, 498,402, 492,408, 491,412, 488,413, 488,415, 489,417, 482,418, 482,420, 477,421, 476,425, 478,426, 478,429, 477,431, 479,433, 481,434, 480,438, 482,438, 484,440, 487,442, 489,442"
"05","51-51-204","Hautes-Alpes","478,409, 480,412, 482,413, 482,417, 488,417, 487,413, 490,412, 490,410, 493,405, 498,401, 500,401, 501,403, 503,403, 504,401, 508,398, 515,402, 519,402, 519,400, 520,397, 529,390, 531,388, 535,387, 533,380, 527,379, 525,377, 523,376, 522,370, 520,370, 518,368, 518,365, 517,365, 512,367, 511,369, 506,369, 505,366, 502,367, 501,371, 505,371, 507,376, 507,380, 505,381, 503,380, 498,381, 495,383, 493,383, 492,386, 487,387, 487,390, 485,393, 483,393, 480,394, 479,398, 480,401, 478,403, 475,403, 473,402, 474,405, 472,406, 473,408, 475,408"
"06","51-51-102","Alpes-Maritimes","550,442, 551,440, 553,440, 555,437, 557,436, 556,431, 558,430, 559,427, 562,425, 562,422, 564,420, 562,417, 562,414, 557,417, 554,417, 550,418, 546,417, 539,413, 535,413, 534,410, 532,409, 531,407, 529,407, 526,409, 526,411, 524,413, 523,420, 525,422, 525,425, 531,430, 530,432, 528,432, 527,434, 524,434, 523,440, 525,440, 528,442, 528,445, 529,447, 533,447, 534,450, 539,450, 542,449, 542,445, 547,441"
"07","0-102-51","Ardèche","422,413, 424,413, 427,411, 431,411, 434,410, 438,413, 440,413, 441,407, 443,405, 443,399, 445,396, 445,388, 448,384, 448,381, 449,377, 447,374, 448,371, 446,369, 446,364, 445,362, 446,358, 443,356, 440,357, 439,361, 437,363, 434,363, 432,365, 432,368, 429,370, 429,372, 426,375, 424,378, 422,379, 421,382, 415,383, 413,386, 411,387, 410,395, 411,398, 413,399, 414,404, 417,406, 417,411, 420,411"
"08","0-255-0","Ardennes","446,132, 448,131, 448,126, 447,123, 448,120, 451,118, 454,119, 456,117, 456,114, 451,113, 447,109, 444,107, 440,108, 439,103, 440,101, 439,99, 437,98, 437,95, 439,90, 439,88, 437,88, 433,92, 433,96, 428,98, 426,100, 423,100, 416,99, 416,112, 410,118, 410,124, 409,126, 410,129, 412,129, 416,130, 421,135, 426,137, 431,136, 432,138, 440,138, 445,137"
"09","255-102-102","Ariège","311,508, 313,508, 314,506, 317,506, 322,507, 324,509, 329,510, 334,506, 336,506, 341,505, 340,503, 337,501, 332,501, 329,497, 330,495, 333,494, 333,484, 332,480, 327,478, 325,478, 323,476, 323,474, 319,474, 315,473, 315,475, 313,477, 310,475, 308,478, 306,478, 306,482, 304,484, 302,483, 301,481, 297,481, 295,482, 294,486, 295,488, 293,490, 291,490, 288,493, 289,496, 294,498, 297,498, 299,500, 299,502, 307,502, 310,504"
"10","50-255-50","Aube","405,209, 407,211, 414,211, 418,210, 420,211, 422,209, 429,209, 432,205, 437,206, 437,203, 441,202, 442,197, 441,195, 442,192, 440,190, 434,183, 434,178, 431,178, 428,179, 423,176, 422,170, 419,169, 412,170, 411,172, 409,173, 408,175, 405,177, 405,179, 397,180, 395,178, 394,176, 391,176, 391,178, 388,181, 388,187, 390,187, 395,192, 395,197, 397,199, 399,199, 403,202, 403,204, 405,207"
"11","102-51-0","Aude","371,493, 373,495, 375,495, 375,493, 377,492, 377,487, 378,485, 376,485, 374,483, 374,481, 376,480, 380,481, 383,477, 383,475, 380,475, 378,473, 376,473, 375,471, 369,471, 367,474, 364,474, 362,472, 359,472, 358,470, 356,469, 356,466, 357,464, 348,464, 344,463, 344,465, 337,466, 330,465, 328,464, 327,468, 324,469, 323,473, 324,476, 328,477, 333,480, 333,483, 334,494, 330,497, 333,500, 337,500, 339,502, 342,504, 343,506, 345,506, 346,504, 348,504, 349,497, 351,496, 356,497, 358,496, 365,497, 368,493"
"12","255-153-0","Aveyron","358,442, 362,446, 366,447, 371,446, 372,448, 377,448, 377,442, 384,441, 384,439, 386,437, 388,437, 389,434, 392,431, 392,429, 389,428, 387,426, 387,423, 389,421, 384,420, 382,417, 380,416, 380,412, 379,405, 377,403, 377,399, 374,396, 372,396, 370,393, 370,390, 367,385, 364,383, 364,381, 361,382, 359,385, 359,387, 357,389, 357,392, 355,394, 354,396, 347,396, 345,395, 341,400, 339,400, 335,401, 331,405, 329,405, 329,408, 331,411, 331,413, 330,416, 333,416, 334,418, 332,419, 332,423, 331,425, 336,424, 338,422, 341,422, 342,424, 348,425, 352,429, 354,430, 358,439"
"13","0-0-153","Bouches-du-Rhône","479,472, 480,474, 484,473, 488,469, 485,466, 485,463, 488,462, 485,458, 485,454, 484,450, 488,447, 488,445, 486,445, 483,446, 482,448, 475,448, 470,445, 468,445, 465,444, 462,445, 457,441, 454,437, 452,437, 450,435, 448,435, 446,433, 444,433, 441,437, 441,442, 438,447, 434,447, 433,452, 430,455, 426,458, 424,458, 424,462, 426,462, 427,460, 441,460, 443,462, 446,462, 447,464, 450,465, 450,463, 453,461, 455,461, 457,463, 458,466, 466,466, 468,464, 470,464, 472,467, 472,472"
"14","150-150-255","Calvados","266,155, 271,155, 273,154, 277,155, 278,151, 277,146, 278,144, 276,139, 276,136, 274,135, 274,130, 271,129, 268,130, 264,134, 259,136, 253,136, 251,134, 245,133, 243,132, 241,133, 234,132, 230,129, 225,129, 223,136, 225,137, 229,142, 232,147, 232,151, 230,152, 228,155, 225,155, 225,158, 223,160, 223,162, 229,163, 232,164, 235,163, 237,161, 240,161, 245,159, 248,159, 255,160, 257,162, 262,158, 264,158"
"15","255-175-175","Cantal","367,383, 371,390, 371,393, 372,395, 374,394, 374,392, 376,389, 376,386, 378,385, 378,383, 383,382, 385,379, 388,378, 386,375, 386,370, 384,368, 384,365, 380,361, 378,361, 374,360, 372,358, 371,356, 369,356, 364,355, 361,352, 357,352, 357,354, 355,356, 351,356, 348,359, 344,364, 345,367, 341,374, 342,376, 338,380, 338,383, 340,386, 340,393, 341,396, 343,397, 345,394, 354,395, 356,392, 356,389, 358,387, 358,385, 360,383, 361,381, 364,380, 365,383"
"16","175-255-175","Charente","250,358, 253,361, 262,362, 264,360, 266,357, 266,353, 268,350, 271,348, 273,348, 276,344, 276,341, 280,338, 283,333, 285,331, 287,331, 290,324, 293,323, 293,319, 289,316, 289,314, 285,313, 283,315, 279,315, 278,313, 277,313, 276,316, 274,317, 272,316, 269,317, 268,315, 265,315, 261,314, 259,316, 257,317, 256,321, 254,322, 253,327, 252,330, 249,331, 246,330, 242,331, 241,340, 245,343, 245,345, 247,347, 247,353, 246,358"
"17","150-255-150","Charente-Maritime","210,326, 211,322, 210,318, 208,318, 205,316, 205,320, 207,322, 209,323|204,306, 203,304, 200,304, 207,308, 208,307|254,367, 256,366, 256,363, 252,362, 250,359, 246,359, 245,354, 246,347, 244,345, 244,343, 242,341, 240,340, 240,332, 242,330, 245,330, 248,329, 251,330, 251,328, 253,321, 253,319, 242,313, 240,313, 238,311, 236,311, 233,309, 230,305, 230,302, 221,301, 220,299, 217,299, 214,302, 214,304, 212,307, 215,310, 217,317, 216,323, 213,326, 213,328, 210,329, 210,333, 212,335, 215,336, 219,340, 220,342, 227,348, 229,353, 229,355, 228,357, 233,356, 237,357, 239,359, 239,362, 240,365, 242,365, 246,368, 250,369, 252,368, 254,369"
"18","125-255-255","Cher","343,297, 346,297, 349,292, 356,292, 359,289, 359,287, 358,285, 362,281, 367,281, 374,273, 374,262, 373,257, 371,252, 371,250, 369,248, 367,247, 367,244, 369,241, 368,238, 364,238, 362,239, 358,235, 354,235, 353,233, 351,233, 349,234, 347,232, 344,232, 342,233, 345,236, 346,242, 342,243, 341,249, 338,251, 333,251, 333,253, 329,257, 335,258, 338,260, 338,263, 340,265, 340,267, 339,269, 342,271, 341,273, 339,274, 339,276, 340,280, 342,282, 342,284, 344,286, 344,288, 343,291, 344,295"
"19","255-255-150","Corrèze","330,378, 333,378, 336,377, 337,379, 339,377, 341,376, 340,373, 342,371, 344,366, 343,364, 347,360, 351,355, 355,355, 356,352, 355,348, 356,345, 354,343, 356,340, 356,336, 354,336, 350,337, 348,339, 341,336, 339,336, 336,335, 331,337, 331,339, 328,340, 326,342, 324,342, 321,345, 319,345, 315,346, 314,348, 310,351, 307,351, 305,352, 306,356, 304,357, 304,364, 305,367, 309,368, 311,371, 311,375, 313,375, 320,374, 324,378, 325,380"
"2A","200-150-90","Corse-du-Sud","549,543, 555,548, 558,549, 558,545, 560,542, 560,539, 562,537, 562,534, 564,529, 564,526, 563,523, 558,524, 555,522, 555,516, 554,514, 552,514, 551,511, 547,507, 547,505, 544,504, 542,502, 538,499, 536,499, 531,497, 529,497, 530,499, 532,500, 531,502, 528,503, 528,505, 529,508, 533,509, 535,512, 535,514, 533,515, 533,517, 531,518, 531,520, 535,520, 537,519, 538,526, 536,527, 536,530, 538,530, 543,533, 540,537, 540,540, 542,540, 544,542"
"2B","200-150-60","Haute-Corse","548,507, 552,511, 552,513, 554,513, 556,516, 556,522, 561,523, 563,522, 563,514, 564,510, 567,509, 568,506, 567,504, 568,502, 566,489, 566,487, 565,482, 563,482, 561,477, 561,470, 562,467, 560,460, 559,458, 556,458, 556,460, 557,462, 556,468, 557,473, 555,476, 552,474, 548,474, 546,476, 546,478, 543,480, 540,480, 538,482, 536,482, 536,484, 533,485, 531,487, 531,492, 528,493, 527,496, 532,496, 539,499, 541,501, 548,505"
"21","50-151-255","Côte-d'Or","459,260, 461,258, 464,256, 466,251, 466,248, 467,246, 466,242, 464,240, 464,238, 462,236, 463,234, 466,232, 466,229, 465,227, 462,229, 457,229, 454,226, 450,226, 448,224, 446,223, 446,216, 444,214, 443,212, 439,209, 438,207, 434,207, 432,206, 430,208, 429,210, 422,210, 421,217, 423,218, 423,223, 421,225, 417,234, 415,236, 416,240, 415,245, 417,246, 417,250, 419,250, 421,252, 421,255, 423,258, 432,263, 435,266, 438,268, 443,267, 448,265, 450,265, 452,264, 455,265, 459,262"
"22","75-75-255","Côtes-d'Armor","176,196, 178,195, 178,193, 182,189, 184,189, 188,188, 188,186, 190,177, 188,175, 186,175, 182,172, 180,171, 179,169, 176,167, 172,168, 170,170, 165,174, 162,174, 158,169, 158,166, 156,165, 154,162, 154,160, 152,159, 152,157, 150,157, 149,154, 146,155, 144,154, 137,157, 135,155, 133,155, 144,154, 137,157, 135,155, 133,155, 132,158, 133,160, 131,161, 131,163, 128,165, 128,168, 130,170, 130,173, 129,180, 130,185, 131,187, 130,189, 134,190, 136,192, 138,192, 142,193, 146,190, 148,190, 152,193, 154,193, 156,195, 158,195, 163,196, 164,199, 167,197, 169,194, 172,194, 173,196"
"23","255-255-125","Creuse","338,334, 342,335, 347,338, 350,336, 353,336, 354,333, 352,331, 353,329, 355,328, 359,321, 359,318, 357,316, 357,310, 353,303, 347,298, 341,298, 336,299, 327,298, 325,300, 315,300, 312,307, 312,310, 316,314, 316,316, 317,320, 318,322, 317,324, 320,325, 321,329, 324,330, 326,329, 328,331, 331,333, 331,336"
"24","102-153-102","Dordogne","295,395, 297,397, 299,397, 301,395, 302,393, 307,390, 307,387, 309,386, 312,382, 312,378, 310,375, 310,371, 309,369, 307,369, 304,367, 304,365, 303,357, 305,356, 305,354, 303,351, 300,350, 299,347, 297,346, 296,343, 292,342, 289,344, 285,341, 285,338, 283,338, 281,337, 277,342, 277,344, 274,347, 273,349, 271,349, 267,353, 267,358, 265,359, 262,363, 258,363, 256,368, 259,368, 260,373, 258,378, 258,383, 263,384, 266,382, 268,382, 269,385, 268,388, 270,389, 271,394, 273,394, 278,393, 281,392, 287,393, 289,392, 290,396"
"25","255-255-50","Doubs","493,279, 494,282, 501,276, 505,273, 505,263, 510,260, 512,260, 514,257, 514,255, 517,252, 519,251, 523,246, 523,244, 525,242, 526,239, 524,239, 522,240, 521,237, 523,235, 523,232, 521,232, 517,231, 513,228, 512,228, 510,231, 508,231, 508,233, 504,234, 499,233, 495,238, 490,241, 488,243, 484,243, 480,246, 478,247, 478,250, 481,253, 481,257, 480,259, 482,261, 486,262, 488,264, 488,267, 491,270, 496,273, 497,275"
"26","1-51-51","Drôme","481,420, 481,413, 477,410, 473,409, 471,407, 473,404, 472,402, 474,401, 478,402, 479,399, 478,395, 480,393, 482,393, 485,392, 482,390, 480,390, 476,386, 473,386, 471,383, 471,381, 472,378, 471,376, 472,373, 463,372, 460,371, 459,369, 460,367, 459,362, 453,357, 448,359, 452,357, 449,359, 447,359, 447,361, 446,363, 447,369, 449,371, 448,374, 450,377, 450,380, 449,384, 447,386, 446,396, 444,399, 444,405, 442,407, 442,412, 445,412, 446,416, 449,416, 454,413, 457,413, 461,417, 466,417, 469,420, 471,420, 472,422, 475,422, 477,420"
"27","204-255-0","Eure","318,149, 321,149, 323,146, 323,143, 326,142, 326,140, 328,139, 328,137, 327,133, 323,132, 321,130, 318,130, 312,129, 309,134, 307,134, 305,135, 304,137, 302,137, 301,139, 299,139, 298,137, 296,136, 296,132, 287,131, 282,127, 281,127, 276,129, 274,128, 275,135, 277,136, 277,140, 279,145, 278,150, 279,154, 277,156, 279,158, 284,158, 287,163, 291,166, 291,170, 293,170, 306,166, 311,166, 312,163, 316,159, 315,157, 317,156, 317,154, 316,151"
"28","0-255-255","Eure-et-Loir","308,211, 312,211, 314,210, 315,208, 321,208, 323,206, 327,206, 331,205, 332,201, 334,199, 334,193, 333,187, 332,185, 330,185, 326,181, 326,178, 321,174, 321,172, 319,161, 316,157, 317,160, 313,163, 313,165, 311,167, 304,167, 297,170, 294,170, 292,171, 292,173, 296,178, 296,186, 293,189, 291,189, 290,194, 291,198, 294,199, 299,204, 303,204, 304,207, 307,209"
"29","25-25-255","Finistère","103,210, 105,209, 105,207, 109,206, 112,207, 113,205, 116,207, 116,209, 117,211, 122,211, 127,213, 129,213, 132,208, 134,206, 131,205, 129,203, 126,203, 124,201, 124,199, 122,197, 122,194, 124,192, 126,192, 129,190, 129,188, 130,186, 128,177, 128,174, 129,170, 127,168, 127,165, 128,163, 125,161, 122,161, 120,164, 115,160, 109,161, 107,163, 105,163, 103,161, 100,162, 98,164, 95,163, 94,165, 89,166, 86,169, 86,178, 89,177, 92,178, 97,176, 98,179, 102,179, 103,181, 101,183, 99,183, 93,182, 93,186, 95,184, 99,185, 102,187, 102,189, 103,192, 93,193, 87,194, 90,196, 92,196, 97,200, 99,205, 99,207, 98,209, 101,209"
"30","255-204-0","Gard","423,452, 421,454, 419,454, 422,459, 424,457, 426,457, 429,454, 432,452, 432,449, 434,446, 438,446, 440,441, 440,437, 443,434, 444,432, 446,431, 446,427, 443,426, 442,420, 440,418, 440,415, 436,412, 432,411, 427,412, 424,414, 422,414, 420,412, 417,412, 416,409, 414,408, 411,409, 411,411, 413,420, 410,424, 407,424, 404,422, 401,422, 399,425, 393,425, 392,423, 389,422, 388,426, 393,429, 393,431, 390,434, 390,436, 393,439, 395,439, 398,440, 401,436, 404,434, 406,434, 408,436, 408,439, 411,438, 415,442, 420,446, 422,447, 422,449"
"31","204-102-102","Haute-Garonne","280,495, 283,494, 286,495, 287,492, 291,489, 293,489, 294,487, 293,484, 295,481, 301,480, 304,483, 305,478, 308,477, 310,474, 313,476, 314,473, 318,472, 322,473, 322,470, 324,468, 326,468, 326,466, 328,463, 334,464, 334,462, 329,459, 327,456, 322,454, 321,452, 322,448, 320,446, 317,442, 316,439, 314,439, 309,440, 309,443, 306,445, 303,445, 301,443, 298,443, 294,444, 301,453, 303,454, 303,456, 297,461, 297,463, 295,465, 294,467, 292,467, 289,465, 287,465, 278,473, 278,475, 274,478, 274,480, 277,483, 277,485, 279,486, 279,491, 276,495, 273,495, 273,502, 277,502, 280,503, 280,501, 279,498"
"32","204-153-51","Gers","269,467, 270,469, 275,468, 278,470, 280,470, 282,468, 283,466, 288,464, 293,466, 296,463, 296,461, 298,458, 302,455, 297,450, 292,444, 290,443, 289,437, 285,436, 284,434, 287,431, 282,429, 280,430, 278,428, 273,428, 272,430, 270,430, 264,431, 262,430, 260,432, 257,432, 258,435, 254,436, 252,434, 247,435, 247,440, 246,445, 244,448, 244,451, 246,451, 251,453, 253,453, 256,457, 259,459, 259,463, 262,466, 266,466"
"33","153-204-153","Gironde","256,405, 255,403, 257,400, 259,400, 261,397, 261,391, 263,389, 267,389, 267,386, 268,383, 266,383, 263,385, 259,385, 257,383, 257,377, 259,372, 259,369, 255,369, 253,370, 251,369, 248,370, 244,367, 240,366, 238,361, 238,359, 231,357, 230,362, 231,367, 232,369, 230,370, 227,363, 227,358, 224,353, 214,343, 212,352, 212,357, 209,376, 209,378, 208,384, 207,388, 209,388, 210,386, 215,390, 214,392, 209,392, 206,399, 206,402, 215,400, 217,401, 217,404, 219,404, 223,405, 230,404, 231,407, 236,411, 238,411, 240,414, 240,418, 243,418, 245,419, 245,416, 248,415, 249,417, 253,417, 254,414, 253,412, 256,409"
"34","204-153-0","Hérault","369,470, 375,470, 376,472, 378,472, 380,474, 383,474, 385,475, 389,471, 396,470, 398,468, 398,464, 401,461, 403,461, 407,462, 410,457, 412,455, 414,455, 415,453, 422,452, 422,450, 421,447, 416,443, 414,443, 411,439, 408,440, 407,436, 404,435, 402,437, 399,439, 398,441, 396,441, 392,440, 390,437, 386,438, 385,441, 378,442, 378,448, 372,449, 371,451, 364,453, 361,452, 360,456, 362,458, 362,461, 359,463, 359,465, 357,466, 357,469, 360,471, 362,471, 364,473, 367,473"
"35","100-100-255","Ille-et-Vilaine","197,219, 199,216, 203,215, 204,213, 208,213, 210,215, 213,215, 213,212, 215,210, 215,208, 218,205, 220,205, 220,202, 218,193, 218,190, 220,188, 220,184, 219,178, 215,177, 213,179, 210,181, 204,176, 204,171, 199,171, 195,170, 194,166, 191,166, 188,169, 183,169, 183,171, 184,173, 188,174, 191,177, 191,180, 190,185, 189,188, 182,190, 179,193, 179,195, 177,196, 177,198, 178,200, 176,203, 176,205, 179,205, 183,208, 183,210, 182,214, 183,216, 181,221, 182,222, 185,220, 188,220"
"36","100-255-255","Indre","327,297, 335,297, 340,298, 342,297, 343,292, 342,289, 343,286, 341,284, 341,282, 339,280, 339,277, 338,274, 341,271, 338,269, 339,265, 337,263, 337,260, 329,259, 328,257, 330,255, 330,253, 326,252, 323,250, 321,250, 318,252, 314,252, 311,255, 313,258, 307,265, 302,264, 300,269, 300,272, 297,279, 292,280, 292,283, 291,285, 297,291, 299,291, 300,294, 304,298, 304,300, 308,300, 310,299, 312,301, 315,299, 325,299"
"37","75-255-255","Indre-et-Loire","288,274, 288,276, 291,279, 296,279, 299,272, 299,268, 300,265, 302,263, 305,263, 307,264, 312,259, 309,252, 306,249, 303,249, 302,246, 303,243, 300,233, 297,230, 294,230, 292,227, 290,227, 283,225, 282,227, 279,227, 277,229, 275,230, 274,232, 271,230, 268,230, 266,231, 268,234, 265,244, 262,247, 262,253, 261,257, 263,257, 264,260, 268,261, 269,267, 276,268, 281,267, 283,266, 285,271"
"38","51-102-102","Isère","483,389, 487,386, 491,386, 492,383, 499,380, 502,380, 504,379, 506,380, 506,375, 505,372, 501,372, 500,369, 502,364, 500,364, 497,360, 497,357, 499,355, 499,351, 496,348, 492,348, 491,346, 489,347, 487,350, 485,350, 482,349, 480,344, 475,339, 474,336, 467,329, 467,327, 465,327, 464,330, 462,332, 459,332, 457,331, 457,333, 458,336, 455,339, 454,341, 449,342, 447,344, 447,347, 444,350, 444,354, 445,357, 449,357, 451,355, 453,355, 457,358, 459,359, 461,362, 461,366, 462,369, 471,370, 474,373, 474,375, 473,377, 474,381, 473,383, 476,384, 478,386"
"39","255-255-75","Jura","477,300, 478,302, 484,302, 486,300, 490,295, 492,292, 492,290, 494,287, 493,281, 492,279, 496,275, 495,273, 492,271, 490,271, 487,267, 487,264, 482,262, 479,259, 480,253, 477,250, 476,248, 473,249, 467,248, 467,252, 464,257, 462,259, 460,260, 460,262, 459,265, 466,270, 463,274, 466,281, 466,284, 464,286, 464,288, 466,290, 466,292, 462,293, 462,295, 464,297, 466,300, 468,301, 468,303, 470,303, 474,300"
"40","153-255-153","Landes","246,435, 250,434, 252,433, 254,435, 257,435, 256,432, 260,425, 257,424, 255,422, 251,422, 250,418, 247,416, 246,419, 244,420, 240,419, 239,414, 238,412, 236,412, 233,409, 230,407, 230,405, 224,405, 220,406, 217,405, 216,401, 212,401, 208,402, 206,403, 206,405, 203,421, 200,431, 200,433, 197,443, 197,445, 194,452, 197,455, 203,455, 205,453, 207,453, 209,455, 212,455, 219,453, 221,453, 223,452, 232,454, 239,453, 241,454, 243,452, 243,448, 245,445, 245,441"
"41","50-255-255","Loir-et-Cher","340,244, 342,242, 345,242, 345,238, 343,235, 341,234, 342,232, 344,231, 344,228, 336,228, 334,229, 331,228, 327,229, 326,226, 324,224, 321,224, 319,222, 318,219, 320,218, 320,215, 318,213, 318,209, 315,209, 314,211, 308,212, 306,210, 305,208, 303,207, 303,205, 299,205, 295,201, 293,201, 291,204, 291,206, 292,208, 291,213, 289,215, 289,218, 286,221, 283,223, 286,225, 289,225, 292,226, 295,229, 297,229, 301,233, 301,235, 303,240, 303,242, 304,245, 303,248, 306,248, 311,253, 314,251, 318,251, 321,249, 323,249, 326,251, 329,251, 331,253, 333,250, 338,250, 340,249"
"42","0-153-51","Loire","443,352, 442,350, 440,350, 438,348, 438,346, 435,344, 432,344, 427,339, 427,335, 426,332, 427,328, 425,326, 425,324, 424,320, 422,318, 424,315, 424,313, 427,311, 425,310, 421,311, 414,310, 411,311, 410,309, 408,309, 405,306, 405,313, 406,320, 404,322, 402,322, 403,329, 402,331, 405,335, 405,338, 412,344, 412,346, 413,350, 410,353, 412,353, 416,354, 418,352, 422,352, 426,353, 428,355, 428,358, 430,358, 434,362, 437,362, 439,357, 442,356"
"43","255-200-200","Haute-Loire","399,384, 403,385, 408,390, 410,388, 412,385, 414,384, 415,382, 420,382, 421,379, 423,377, 425,376, 425,374, 428,372, 428,370, 431,367, 431,365, 432,361, 430,359, 428,359, 427,355, 420,353, 418,353, 416,355, 413,355, 408,354, 403,356, 401,355, 398,356, 397,354, 384,354, 381,357, 378,357, 378,360, 380,360, 383,362, 385,365, 385,368, 387,370, 387,375, 389,377, 390,381, 393,385, 397,385"
"44","255-0-0","Loire-Atlantique","173,260, 174,258, 173,258|201,261, 203,260, 204,265, 207,265, 207,263, 209,260, 211,260, 213,259, 215,260, 215,258, 213,258, 212,254, 215,253, 215,250, 213,250, 211,248, 211,246, 210,244, 212,242, 216,242, 224,241, 223,237, 218,236, 216,234, 216,231, 219,230, 216,227, 216,224, 213,221, 213,216, 210,216, 208,214, 204,214, 203,216, 201,216, 198,218, 197,220, 189,220, 185,221, 180,224, 180,228, 178,230, 173,230, 169,234, 167,235, 166,243, 171,243, 173,246, 176,245, 178,242, 182,242, 183,244, 179,245, 178,247, 179,249, 176,252, 180,253, 183,255, 184,259, 190,265, 192,265, 194,268, 198,268, 201,269, 202,265"
"45","25-255-255","Loiret","353,232, 354,234, 358,234, 362,238, 367,237, 367,234, 369,232, 369,228, 368,226, 366,225, 366,222, 370,221, 372,220, 372,214, 376,210, 375,207, 373,205, 373,203, 371,201, 363,201, 361,203, 355,202, 353,200, 353,196, 350,194, 350,192, 345,192, 342,191, 340,193, 337,193, 335,194, 335,199, 333,201, 333,204, 331,206, 328,206, 323,207, 321,209, 319,209, 319,213, 321,215, 321,218, 319,219, 320,222, 324,223, 327,226, 327,228, 330,228, 333,227, 335,228, 344,227, 345,231, 347,231, 349,233"
"46","204-102-0","Lot","328,413, 330,413, 330,411, 328,408, 328,405, 331,404, 335,400, 338,400, 341,399, 341,397, 339,392, 339,386, 337,383, 337,380, 336,378, 334,378, 329,379, 326,381, 323,379, 320,375, 314,375, 312,376, 313,382, 308,388, 308,390, 306,392, 300,397, 298,400, 296,401, 296,405, 298,407, 298,410, 299,413, 302,416, 305,417, 306,419, 311,419, 314,417, 317,419, 324,415, 326,415"
"47","204-255-204","Lot-et-Garonne","280,429, 284,426, 285,424, 290,423, 290,420, 292,415, 290,413, 291,411, 293,411, 297,410, 297,407, 295,405, 295,401, 298,398, 295,396, 292,396, 290,397, 289,393, 282,394, 279,393, 274,394, 271,395, 270,391, 269,389, 263,390, 262,398, 260,399, 259,401, 257,401, 256,404, 257,410, 254,412, 255,416, 253,418, 251,419, 251,421, 255,421, 257,423, 260,423, 261,425, 258,430, 260,431, 262,429, 269,430, 272,429, 273,427, 278,427"
"48","153-102-0","Lozère","407,423, 410,423, 412,420, 412,417, 411,412, 410,409, 415,407, 416,406, 413,404, 413,401, 412,399, 410,398, 410,396, 409,392, 403,386, 400,386, 398,385, 392,386, 389,381, 389,379, 387,379, 384,381, 383,383, 379,383, 379,385, 377,386, 377,389, 375,392, 375,396, 378,399, 378,403, 380,405, 380,411, 381,416, 385,419, 389,419, 391,422, 394,424, 399,424, 401,421, 404,421"
"49","255-100-100","Maine-et-Loire","244,259, 249,257, 252,259, 255,259, 258,258, 258,255, 261,253, 261,247, 264,244, 265,239, 267,234, 263,230, 258,227, 254,228, 253,225, 248,224, 247,221, 244,221, 241,220, 238,222, 234,222, 231,220, 228,220, 225,219, 221,220, 214,219, 214,221, 217,224, 217,227, 220,229, 219,231, 217,231, 217,234, 222,235, 224,237, 224,239, 225,241, 217,242, 212,243, 211,245, 212,248, 215,249, 216,253, 213,254, 213,257, 215,257, 216,261, 231,263, 235,263, 238,261, 239,259"
"50","125-125-255","Manche","224,164, 222,162, 222,160, 224,158, 224,155, 228,154, 231,150, 231,147, 226,140, 222,136, 222,134, 223,131, 221,130, 221,127, 219,125, 217,122, 217,118, 219,117, 219,114, 218,112, 213,111, 209,114, 205,114, 202,112, 200,112, 195,109, 194,109, 198,114, 198,117, 196,119, 198,124, 198,128, 201,130, 205,139, 205,149, 206,156, 205,164, 207,166, 207,168, 204,169, 205,176, 209,180, 216,176, 222,176, 231,178, 235,174, 234,171, 235,169, 233,168, 232,165, 230,165"
"51","25-255-25","Marne","423,175, 428,178, 430,178, 434,177, 438,178, 437,175, 440,173, 443,169, 446,170, 446,166, 442,162, 442,157, 446,154, 446,150, 445,146, 443,143, 443,141, 444,139, 441,138, 432,139, 431,137, 427,137, 425,138, 420,135, 416,131, 413,131, 410,130, 408,132, 404,131, 402,133, 400,133, 396,136, 396,140, 397,143, 394,145, 394,147, 396,150, 396,153, 390,160, 390,162, 388,164, 388,167, 390,169, 389,172, 391,172, 396,177, 397,179, 404,179, 404,177, 412,169, 418,169, 421,168, 423,170"
"52","75-255-75","Haute-Marne","472,223, 472,221, 473,219, 472,217, 476,213, 479,211, 479,208, 476,206, 476,204, 472,201, 472,197, 474,196, 472,193, 470,192, 469,190, 465,187, 463,187, 462,182, 461,180, 458,178, 455,178, 452,175, 449,174, 448,172, 446,172, 443,170, 441,172, 438,176, 439,178, 435,179, 435,183, 441,189, 443,192, 443,194, 442,196, 443,201, 441,203, 438,203, 438,206, 440,208, 442,211, 445,213, 447,216, 447,223, 450,225, 454,225, 457,228, 462,228, 463,225, 468,223"
"53","255-75-75","Mayenne","224,219, 227,218, 231,219, 234,221, 238,221, 241,219, 243,219, 246,220, 246,217, 247,213, 250,211, 250,206, 253,205, 253,199, 256,197, 256,190, 259,187, 259,182, 257,182, 255,180, 255,177, 252,176, 251,178, 249,178, 246,179, 244,178, 241,180, 234,180, 232,181, 230,179, 228,179, 220,178, 220,183, 221,188, 219,190, 219,196, 221,205, 218,206, 216,208, 216,210, 214,212, 214,217, 220,218"
"54","102-0-102","Meurthe-et-Moselle","508,179, 509,181, 512,181, 514,182, 517,181, 523,175, 521,172, 514,169, 512,169, 509,168, 507,166, 504,164, 502,164, 498,163, 494,159, 494,155, 492,155, 488,154, 484,151, 483,149, 480,147, 482,144, 482,140, 483,137, 479,130, 479,125, 480,123, 477,123, 473,120, 468,121, 463,123, 462,127, 469,128, 471,130, 472,139, 473,144, 476,146, 476,153, 474,156, 474,159, 475,163, 473,165, 473,167, 474,173, 473,176, 476,178, 480,178, 481,183, 484,186, 486,186, 489,185, 490,183, 493,183, 496,182, 499,183, 504,181, 506,179"
"55","153-0-153","Meuse","465,185, 465,183, 469,182, 471,180, 474,180, 474,177, 472,176, 472,174, 473,168, 472,165, 474,163, 474,160, 473,156, 475,153, 475,146, 472,144, 472,140, 471,132, 469,129, 464,129, 461,127, 461,120, 460,117, 459,117, 458,119, 454,122, 449,121, 448,125, 449,131, 447,132, 447,136, 445,138, 445,140, 444,143, 446,146, 446,149, 447,155, 443,158, 443,162, 447,166, 447,171, 454,176, 458,177, 460,179, 462,180, 463,186"
"56","50-50-255","Morbihan","144,241, 140,237, 138,237, 138,240, 141,240|173,229, 178,229, 180,220, 182,215, 181,211, 182,208, 179,206, 176,206, 175,203, 177,200, 176,197, 173,197, 172,195, 169,195, 165,200, 163,199, 163,197, 159,197, 156,196, 154,194, 151,194, 150,192, 146,191, 144,193, 139,194, 136,193, 134,191, 132,191, 130,190, 128,192, 124,193, 123,197, 125,199, 125,201, 129,202, 131,204, 134,204, 135,206, 131,211, 130,216, 135,217, 144,225, 148,225, 150,226, 154,223, 156,223, 158,225, 158,227, 154,228, 154,230, 156,231, 160,230, 162,229, 164,230, 166,229, 169,231, 171,231"
"57","204-0-204","Moselle","519,155, 518,151, 520,150, 520,147, 522,146, 523,148, 527,148, 529,150, 533,150, 535,149, 539,150, 541,143, 535,138, 532,138, 531,140, 524,141, 520,140, 518,137, 514,137, 512,140, 509,140, 507,138, 505,133, 502,131, 503,128, 498,124, 494,124, 492,122, 487,122, 485,124, 480,125, 480,131, 482,133, 484,138, 483,145, 481,146, 482,148, 485,150, 486,152, 491,153, 494,154, 495,159, 498,162, 501,162, 504,163, 506,165, 509,167, 511,167, 522,172, 525,175, 529,171, 529,169, 530,166, 529,163, 530,160, 528,157, 522,156"
"58","100-151-255","Nièvre","414,273, 415,271, 413,269, 414,266, 413,264, 414,259, 417,256, 420,255, 420,252, 417,251, 416,246, 411,246, 410,244, 405,244, 401,243, 398,240, 396,240, 395,237, 392,236, 385,238, 382,238, 377,233, 373,234, 369,233, 368,237, 370,240, 368,245, 368,247, 372,250, 372,253, 374,258, 374,261, 375,274, 373,275, 373,277, 376,280, 380,283, 388,282, 390,284, 392,284, 395,282, 396,280, 399,280, 403,279, 404,281, 406,281, 413,277"
"59","153-153-51","Nord","413,89, 413,85, 415,83, 414,81, 411,80, 409,78, 406,78, 404,79, 399,78, 398,80, 396,79, 395,76, 396,73, 393,70, 391,70, 390,68, 387,70, 383,69, 382,65, 380,62, 381,59, 378,57, 378,55, 376,54, 372,55, 370,56, 369,58, 366,58, 363,55, 361,52, 359,52, 358,44, 356,42, 356,39, 353,38, 347,39, 342,41, 341,43, 344,48, 344,51, 347,54, 350,54, 351,60, 354,62, 356,62, 364,63, 366,65, 367,68, 371,69, 374,71, 375,75, 374,78, 375,82, 378,83, 379,88, 376,95, 383,95, 386,94, 388,95, 391,93, 394,94, 401,93, 406,94, 409,97, 413,97, 413,95, 416,93, 415,90"
"60","225-225-255","Oise","372,137, 373,135, 375,135, 376,131, 378,130, 376,125, 377,121, 376,118, 377,115, 371,115, 369,117, 365,117, 365,119, 360,121, 358,121, 356,119, 354,119, 351,117, 349,117, 346,115, 342,115, 339,116, 336,114, 332,114, 330,112, 327,112, 327,115, 326,121, 327,124, 329,125, 327,128, 327,132, 329,139, 327,140, 327,142, 333,143, 338,141, 341,143, 345,143, 348,145, 350,145, 354,146, 356,148, 359,147, 361,149, 363,149, 371,148, 376,146, 376,143, 374,140, 374,138"
"61","175-175-255","Orne","259,181, 260,184, 264,184, 266,181, 268,181, 272,180, 275,182, 276,189, 279,190, 282,193, 286,193, 289,196, 290,195, 289,190, 291,188, 293,188, 295,186, 295,178, 292,175, 290,170, 290,166, 288,164, 285,162, 284,159, 279,159, 275,156, 272,155, 266,156, 264,159, 262,159, 258,163, 255,161, 249,161, 244,160, 239,162, 237,162, 235,164, 233,164, 233,166, 234,168, 236,169, 235,172, 236,174, 234,177, 232,178, 232,180, 241,179, 244,177, 248,178, 251,177, 252,175, 254,175, 256,177, 256,180"
"62","102-102-51","Pas-de-Calais","361,89, 368,94, 371,94, 376,93, 378,86, 378,84, 375,83, 373,76, 374,73, 373,71, 369,70, 366,68, 365,65, 357,64, 352,62, 350,60, 350,55, 346,55, 343,51, 343,48, 340,43, 334,42, 332,44, 330,44, 324,49, 322,49, 323,56, 322,73, 321,77, 326,77, 329,76, 331,78, 334,78, 335,81, 338,82, 339,85, 344,85, 347,83, 350,83, 354,86, 353,89, 356,89, 359,91"
"63","255-150-150","Puy-de-Dôme","397,353, 398,355, 400,355, 402,354, 404,355, 407,354, 410,351, 412,350, 412,347, 411,344, 407,340, 404,338, 404,335, 402,333, 401,330, 402,324, 399,324, 397,321, 393,321, 390,318, 388,319, 379,318, 377,316, 375,316, 371,312, 370,308, 368,308, 366,311, 364,311, 362,313, 361,315, 358,315, 360,318, 360,322, 358,324, 355,329, 353,330, 357,337, 357,340, 355,342, 357,345, 357,347, 356,350, 362,351, 364,354, 368,354, 371,355, 373,357, 374,359, 376,359, 378,356, 381,356, 384,353"
"64","102-255-102","Pyrénées-Atlantiques","198,481, 199,479, 203,480, 206,482, 208,482, 210,484, 212,484, 213,486, 222,486, 223,490, 230,496, 237,495, 239,493, 239,490, 240,486, 243,483, 245,482, 245,479, 247,478, 251,473, 252,470, 251,468, 254,467, 253,461, 251,458, 251,456, 248,453, 244,452, 241,455, 233,454, 229,455, 224,454, 222,453, 209,456, 207,454, 205,454, 203,456, 197,456, 195,454, 192,455, 190,457, 186,462, 182,462, 183,465, 187,465, 188,468, 190,468, 191,466, 194,468, 196,468, 198,470, 198,472, 194,479, 196,481"
"65","153-102-51","Hautes-Pyrénées","265,503, 267,501, 270,503, 272,503, 272,495, 276,494, 278,491, 278,486, 276,485, 276,483, 273,480, 273,478, 277,474, 278,471, 275,469, 272,469, 270,470, 269,468, 267,468, 261,467, 258,463, 258,459, 252,454, 251,454, 252,458, 254,461, 254,465, 255,467, 252,468, 253,471, 250,476, 248,477, 246,480, 246,482, 244,484, 241,486, 241,489, 240,493, 239,495, 243,495, 246,496, 251,502, 255,502, 259,501, 261,500"
"66","51-51-0","Pyrénées-Orientales","338,522, 340,519, 343,519, 347,518, 350,520, 352,520, 355,523, 357,523, 359,522, 362,523, 362,520, 367,519, 370,516, 377,516, 379,518, 382,518, 382,516, 381,514, 378,513, 377,497, 373,496, 371,494, 368,494, 365,498, 359,498, 357,497, 352,498, 350,497, 350,503, 348,505, 346,505, 345,507, 343,507, 337,506, 334,507, 333,509, 328,511, 326,511, 324,512, 324,514, 328,515, 330,517, 332,517, 334,522"
"67","204-204-51","Bas-Rhin","532,186, 536,190, 538,190, 540,192, 540,194, 544,195, 544,193, 547,188, 547,185, 548,178, 550,173, 550,168, 555,162, 555,160, 557,159, 558,157, 560,156, 560,152, 563,148, 560,147, 558,145, 556,145, 542,144, 541,149, 539,151, 536,151, 534,150, 529,151, 527,149, 523,149, 522,147, 521,150, 519,151, 519,154, 521,154, 526,155, 530,158, 531,162, 530,165, 531,168, 530,171, 526,175, 525,184, 527,184, 530,186"
"68","153-153-0","Haut-Rhin","544,229, 544,227, 545,223, 542,220, 543,209, 545,204, 545,202, 543,200, 543,196, 540,195, 539,192, 536,191, 532,187, 528,187, 525,194, 525,198, 523,200, 523,202, 520,205, 520,209, 518,216, 521,217, 528,230, 528,233, 530,233, 539,234"
"69","0-255-51","Rhône","446,344, 449,341, 452,341, 454,340, 457,336, 457,334, 456,330, 450,330, 447,325, 444,324, 442,322, 442,314, 443,312, 442,310, 440,310, 438,308, 438,306, 431,305, 428,304, 428,307, 427,309, 428,311, 425,314, 423,317, 425,320, 425,323, 426,326, 428,328, 428,331, 427,334, 428,339, 432,343, 435,343, 439,346, 439,348, 444,349, 446,347"
"70","255-255-0","Haute-Saône","488,242, 491,239, 496,236, 499,232, 503,232, 507,233, 507,231, 510,230, 512,227, 514,227, 515,222, 514,217, 515,215, 511,212, 508,211, 507,209, 505,211, 501,211, 499,208, 492,210, 489,208, 489,206, 486,206, 486,208, 483,210, 480,210, 477,214, 473,217, 474,220, 473,223, 467,224, 464,225, 466,227, 467,232, 463,236, 465,238, 465,240, 467,242, 467,245, 468,247, 472,247, 474,248, 477,247, 479,245, 484,242"
"71","150-151-255","Saône-et-Loire","437,304, 439,306, 439,308, 442,309, 442,307, 447,291, 450,290, 454,291, 457,290, 458,292, 461,293, 465,292, 465,290, 463,288, 463,286, 465,284, 465,281, 462,274, 463,272, 465,271, 464,269, 462,269, 460,266, 456,265, 453,266, 451,265, 438,269, 436,267, 429,262, 426,261, 424,259, 420,256, 419,256, 415,259, 415,263, 414,265, 415,267, 414,269, 416,271, 415,277, 412,278, 410,280, 405,282, 402,280, 400,280, 397,281, 399,284, 399,286, 400,290, 407,293, 409,293, 410,299, 406,303, 406,305, 408,308, 410,308, 411,310, 413,310, 420,309, 424,310, 426,309, 427,304, 430,303"
"72","255-25-25","Sarthe","271,229, 273,231, 276,228, 279,226, 282,226, 282,223, 285,220, 288,218, 288,215, 290,213, 290,209, 291,207, 290,204, 292,201, 290,198, 287,196, 286,194, 281,194, 279,191, 276,190, 275,184, 274,182, 269,181, 266,182, 264,185, 260,186, 257,190, 257,197, 254,200, 254,205, 251,206, 251,211, 248,214, 248,216, 247,220, 248,223, 252,223, 254,225, 254,227, 256,227, 258,226, 261,227, 262,229, 267,230"
"73","51-153-153","Savoie","500,355, 498,357, 498,360, 501,363, 506,366, 506,368, 511,368, 512,366, 525,362, 527,362, 530,360, 531,358, 534,358, 536,356, 536,351, 538,348, 534,344, 531,343, 529,334, 527,334, 521,329, 518,329, 514,328, 512,326, 512,322, 510,322, 508,324, 508,327, 505,330, 505,332, 502,335, 499,333, 498,331, 496,331, 492,332, 490,330, 489,328, 485,325, 483,332, 483,334, 481,335, 480,338, 478,340, 481,344, 482,348, 484,348, 487,349, 490,345, 493,347, 496,347, 500,351"
"74","0-204-204","Haute-Savoie","504,330, 507,327, 507,324, 510,321, 512,321, 513,326, 520,328, 522,327, 522,325, 525,323, 527,323, 529,321, 530,316, 526,312, 524,311, 524,308, 521,308, 520,306, 522,299, 519,296, 520,293, 508,293, 506,296, 501,296, 500,302, 501,304, 495,309, 489,309, 489,311, 487,312, 486,314, 484,314, 484,318, 485,323, 487,325, 488,327, 491,329, 492,331, 495,331, 498,330, 500,332, 501,334, 504,332"
"75","199-255-175","Paris","350,164, 351,161, 348,160, 346,161, 346,163|503,55, 507,52, 509,52, 512,54, 515,54, 516,50, 512,49, 510,46, 510,43, 507,39, 507,36, 495,36, 493,38, 489,41, 487,41, 484,42, 482,44, 482,47, 485,48, 487,51, 490,51, 497,55"
"76","204-204-0","Seine-Maritime","300,138, 302,136, 304,136, 305,134, 309,133, 310,130, 312,128, 317,128, 321,129, 323,131, 326,131, 326,128, 328,126, 326,124, 326,122, 325,116, 326,112, 327,110, 325,103, 323,101, 318,97, 315,95, 313,95, 307,100, 302,102, 299,102, 292,105, 286,105, 282,108, 279,109, 277,111, 273,112, 270,114, 270,117, 267,122, 267,124, 270,124, 273,126, 275,126, 276,128, 283,126, 285,129, 294,130, 297,132, 297,136"
"77","199-255-75","Seine-et-Marne","371,198, 373,196, 373,190, 376,188, 385,188, 387,187, 387,181, 390,178, 390,176, 392,175, 391,173, 389,173, 388,171, 389,169, 387,167, 387,164, 388,161, 378,152, 378,149, 376,147, 375,147, 370,149, 364,149, 361,150, 359,148, 357,153, 359,158, 359,160, 358,162, 359,169, 357,172, 357,178, 356,188, 353,190, 351,193, 352,195, 354,196, 354,200, 359,201, 361,202, 363,200, 371,200"
"78","199-255-25","Yvelines","337,178, 337,172, 340,170, 341,168, 343,168, 343,166, 341,164, 341,161, 342,155, 337,154, 332,152, 330,150, 326,151, 318,150, 317,153, 318,158, 320,161, 320,165, 321,171, 322,174, 324,175, 325,177, 327,178, 327,181, 330,184, 332,182, 334,182"
"79","100-255-100","Deux-Sèvres","254,319, 254,321, 257,316, 261,313, 264,313, 266,314, 266,311, 263,309, 265,304, 265,301, 263,300, 261,301, 258,297, 258,294, 257,292, 259,290, 259,288, 260,285, 258,283, 258,281, 259,278, 258,273, 259,267, 258,264, 253,260, 250,258, 248,258, 243,260, 239,260, 237,263, 228,264, 229,270, 232,272, 232,275, 234,278, 234,280, 236,287, 236,289, 235,294, 237,296, 237,298, 233,301, 231,301, 231,305, 236,310, 238,310, 240,312, 242,312, 245,314, 247,314, 249,316, 251,316, 252,318"
"80","200-200-255","Somme","375,114, 375,110, 374,105, 376,104, 376,102, 378,99, 378,97, 374,94, 372,94, 367,95, 366,93, 364,93, 362,90, 360,92, 355,90, 353,90, 352,88, 353,86, 350,84, 347,84, 344,86, 339,86, 338,83, 335,82, 334,79, 331,79, 329,77, 327,77, 321,78, 321,80, 320,83, 321,85, 319,86, 318,90, 315,94, 317,96, 326,103, 326,105, 327,109, 332,113, 336,113, 339,115, 341,115, 346,114, 349,116, 351,116, 354,118, 356,118, 358,120, 361,120, 364,119, 364,117, 369,116, 371,114"
"81","153-102-102","Tarn","343,463, 347,462, 358,463, 361,460, 361,458, 359,456, 359,453, 361,451, 363,451, 366,452, 371,450, 371,447, 367,447, 364,448, 361,447, 357,442, 357,439, 353,430, 351,430, 348,426, 344,426, 340,423, 338,423, 336,425, 333,425, 331,426, 329,425, 327,428, 322,427, 324,429, 324,431, 321,433, 320,435, 318,435, 318,437, 317,440, 321,445, 323,448, 323,451, 322,453, 327,455, 332,460, 335,462, 337,465, 343,465"
"82","153-51-0","Tarn-et-Garonne","320,434, 323,430, 321,428, 322,426, 325,426, 327,427, 329,424, 331,423, 331,419, 333,418, 330,417, 329,414, 326,416, 323,416, 321,418, 318,420, 316,420, 315,418, 310,420, 306,420, 305,418, 302,417, 298,413, 298,411, 294,411, 291,412, 293,415, 291,422, 290,424, 287,424, 285,425, 285,427, 284,429, 287,429, 288,431, 285,434, 290,437, 290,441, 291,443, 297,443, 301,442, 303,444, 306,444, 308,443, 308,440, 313,439, 317,436, 318,434"
"83","0-0-204","Var","490,478, 491,480, 495,479, 496,477, 498,477, 504,478, 506,476, 510,476, 512,477, 512,475, 521,471, 524,471, 524,469, 525,467, 522,468, 521,466, 526,461, 526,459, 531,458, 534,456, 534,451, 533,448, 529,448, 527,445, 527,442, 523,441, 521,438, 513,439, 513,441, 509,442, 506,439, 504,440, 502,443, 500,443, 499,445, 496,445, 494,443, 492,443, 490,444, 487,443, 489,445, 489,448, 485,451, 485,453, 486,458, 489,461, 488,463, 486,463, 486,466, 489,469, 488,471, 485,473, 485,475, 488,476"
"84","0-0-102","Vaucluse","482,439, 480,439, 479,436, 480,434, 476,431, 477,426, 475,425, 475,423, 472,423, 471,421, 469,421, 466,418, 461,418, 457,414, 454,414, 449,417, 446,417, 445,413, 441,413, 441,418, 443,420, 443,425, 445,425, 447,427, 447,433, 450,434, 452,436, 454,436, 458,440, 460,443, 464,444, 467,443, 476,447, 482,447, 483,445, 485,445, 485,441|454,408, 452,407, 451,411, 453,411"
"85","255-50-50","Vendée","170,275, 169,275|234,294, 234,290, 235,285, 233,278, 231,275, 231,272, 228,270, 228,266, 227,264, 225,264, 217,263, 213,260, 209,261, 208,265, 204,266, 203,261, 202,264, 203,268, 201,270, 199,270, 194,269, 191,266, 186,263, 184,260, 182,260, 182,262, 178,266, 178,269, 179,271, 183,274, 187,279, 189,284, 189,286, 194,291, 197,293, 200,293, 202,295, 202,297, 206,297, 209,300, 212,301, 215,300, 217,298, 220,298, 221,300, 228,300, 230,301, 233,300, 236,297"
"86","125-255-125","Vienne","283,314, 285,312, 287,312, 289,313, 290,310, 289,308, 293,304, 296,304, 297,301, 301,300, 303,299, 299,294, 299,292, 297,292, 290,285, 291,280, 287,276, 287,274, 284,271, 283,267, 272,269, 270,269, 268,267, 268,262, 265,262, 263,260, 263,258, 261,258, 260,256, 259,256, 259,258, 256,259, 255,261, 259,264, 259,266, 260,272, 259,277, 260,280, 259,283, 261,285, 261,287, 260,290, 258,292, 259,297, 262,300, 264,299, 266,301, 266,305, 264,308, 265,310, 267,311, 267,314, 270,316, 273,315, 275,316, 275,314, 277,312, 280,314"
"87","255-255-100","Haute-Vienne","315,345, 318,345, 321,344, 324,341, 326,341, 328,339, 330,339, 330,333, 326,330, 323,331, 320,329, 320,326, 318,326, 316,324, 317,321, 315,314, 311,310, 311,307, 313,302, 310,300, 304,301, 302,300, 298,301, 297,304, 293,305, 290,308, 291,312, 290,316, 294,319, 294,323, 290,326, 288,331, 285,332, 283,335, 283,337, 285,337, 286,341, 288,343, 293,341, 296,342, 300,347, 300,349, 305,351, 310,350"
"88","255-0-255","Vosges","475,203, 477,204, 477,206, 481,209, 483,209, 485,208, 485,206, 489,205, 490,208, 494,209, 499,207, 502,210, 505,210, 506,208, 510,211, 513,212, 514,214, 517,215, 519,206, 522,202, 522,200, 524,198, 524,194, 527,187, 527,185, 525,185, 524,176, 523,176, 517,182, 515,182, 513,183, 509,182, 508,180, 506,180, 504,182, 497,184, 494,183, 490,184, 489,186, 487,186, 484,187, 480,183, 480,179, 477,179, 474,181, 471,181, 469,183, 466,183, 466,186, 468,189, 475,195, 473,198, 473,201"
"89","0-151-255","Yonne","401,242, 404,242, 410,243, 411,245, 414,245, 414,241, 415,238, 414,236, 417,233, 417,231, 422,222, 422,218, 420,217, 420,212, 415,211, 407,212, 404,209, 404,207, 402,204, 402,202, 399,200, 397,200, 394,197, 394,192, 390,188, 386,188, 376,189, 374,190, 374,196, 372,198, 372,201, 374,203, 374,205, 376,207, 377,210, 373,214, 373,220, 370,222, 367,222, 367,225, 369,226, 370,231, 373,233, 375,233, 378,232, 382,237, 387,237, 394,235, 396,237, 396,239, 398,239"
"90","255-255-25","Territoire de Belfort","527,231, 527,229, 525,227, 521,218, 519,218, 516,216, 515,221, 516,226, 515,229, 524,231"
"91","199-255-50","Essonne","340,192, 342,190, 344,190, 352,191, 355,187, 355,179, 356,171, 350,171, 345,169, 344,168, 341,169, 338,173, 338,179, 335,181, 333,184, 333,186, 334,192, 336,193"
"92","199-255-100","Hauts-de-Seine","345,163, 345,161, 347,160, 347,154, 344,154, 343,160, 342,164, 347,169, 348,165|495,60, 495,55, 490,52, 487,52, 483,48, 481,47, 481,44, 484,41, 486,41, 489,40, 492,37, 495,35, 495,33, 498,30, 498,27, 494,26, 492,25, 485,29, 475,39, 492,25, 485,29, 479,35, 474,39, 473,48, 472,54, 475,54, 477,56, 477,58, 479,58, 483,62, 484,65, 489,66, 491,68, 491,71, 494,71, 495,66, 497,64, 497,62"
"93","199-255-125","Seine-Saint-Denis","350,159, 352,161, 357,161, 358,157, 357,154, 356,154, 354,156, 348,156, 348,159|519,45, 522,46, 525,49, 529,52, 530,55, 534,56, 535,52, 532,50, 532,45, 530,43, 530,39, 533,36, 533,31, 535,30, 535,28, 531,23, 530,19, 531,15, 527,14, 524,19, 520,23, 518,23, 517,25, 507,25, 504,22, 502,22, 498,25, 493,24, 498,26, 499,30, 496,33, 496,35, 507,35, 508,39, 510,41, 511,46, 514,47"
"94","199-255-150","Val-de-Marne","357,170, 358,163, 352,162, 349,166, 349,169|517,74, 524,73, 525,78, 527,80, 531,81, 531,78, 533,73, 533,71, 535,69, 535,66, 533,64, 533,62, 534,57, 532,57, 529,55, 528,52, 526,50, 522,47, 518,46, 515,47, 517,50, 517,53, 515,55, 512,55, 509,53, 507,53, 505,55, 496,56, 496,60, 498,62, 498,64, 496,66, 496,69, 498,69, 503,70, 504,75, 507,75"
"95","199-255-0","Val-d'Oise","347,153, 349,155, 354,155, 356,153, 357,149, 354,147, 351,147, 344,144, 341,144, 338,142, 337,142, 332,144, 329,144, 324,143, 324,146, 323,149, 325,149, 328,150, 330,149, 332,151, 342,154"
"971","161-161-25","Guadeloupe","80,269, 80,172, 1,172, 1,269"
"972","161-161-125","Martinique","79,362, 79,271, 1,271, 1,362"
"973","161-161-200","Guyane","78,449, 78,365, 3,365, 3,449"
"974","161-161-225","Réunion","78,524, 78,453, 2,453, 2,524"
"975","25-161-161","Saint-Pierre-et-Miquelon","158,130, 158,4, 88,4, 88,130"
"976","125-161-161","Mayotte","81,101, 81,4, 3,4, 3,101"
"977","0-0-0","Saint-Barthélémy",""
"978","0-0-0","Saint-Martin",""
"986","200-161-161","Wallis-et-Futuna","161,527, 161,465, 160,405, 93,405, 93,464, 81,465, 81,527"
"987","225-161-161","Polynésie française","162,401, 162,306, 83,306, 83,401"
"988","225-225-161","Nouvelle-Calédonie","281,82, 281,7, 197,7, 197,82"
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_afrique.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_oceanie.csv
New file
0,0 → 1,16
"code","rvb_fond","nom","poly"
"au","255-25-25","Australie","14,246,47,233,49,220,59,220,71,203,89,211,92,187,119,195,135,193,129,216,149,225,159,188,176,211,213,227,231,255,220,279,228,299,200,359,192,394,181,397,164,377,162,364,143,355,125,344,110,321,88,319,63,329,60,336,37,331-32,339,15,338,6,334,5,321,11,318,8,310,5,292,0,281,3,252"
"fj","255-25-75","Fidji","321,180,342,181,382,222,379,250,365,269,348,271,325,258,324,246,331,222,320,203,322,180"
"ki","255-25-125","Kiribati","311,120,330,106,348,112,373,132,398,129,478,144,482,129,461,113,483,92,507,107,530,143,530,199,505,200,508,186,500,181,493,174,369,168,360,155,336,154,321,145,312,120"
"mh","255-25-175","Marshall","244,64,262,26,317,28,346,48,345,110,329,106,310,119,292,111,293,106"
"fm","255-25-225","Micronésie","128,72,193,59,244,65,291,105,290,117,286,119,170,118,152,103,128,103"
"nr","255-75-25","Nauru","297,112,312,120,319,144,292,141,292,129,298,121"
"nz","255-75-75","Nouvelle-Zélande","325,327,348,350,364,356,338,388,301,437,293,441,279,419,318,364,330,354,318,332"
"pw","255-75-125","Palau","127,73,92,93,92,116,111,123,128,104"
"pg","255-75-175","Papouasie - Nouvelle Guinée","152,131,152,184,158,187,171,186,179,201,228,200,233,193,231,178,225,179,225,174,234,170,249,159,281,158,281,131"
"sb","255-75-225","Salomon","281,158,249,158,226,176,226,178,232,178,232,194,242,194,251,203,321,204,321,180,303,162"
"ws","255-125-25","Samoa","394,205,405,203,411,193,423,214,414,223"
"to","25-125-225","Tonga","382,220,375,214,376,209,383,202,393,204,416,226,401,262,388,256,371,258,380,249"
"tv","25-175-25","Tuvalu","325,155,359,155,374,175,361,198,341,180,336,180"
"vu","255-125-175","Vanuatu","287,203,307,247,325,246,331,222,321,204"
"0","0-0-0","",""
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_europe.tpl.html
New file
0,0 → 1,12
<div id="cartographie">
<img id="carte-img" src="<?=$carte_url;?>" alt="<?=$carte_alt;?>" usemap="#carte-map" />
<map name="carte-map">
<?php foreach ($zones as $code => $zone) : ?>
<?php if (!empty($zone['poly'])) : ?>
<?php foreach (explode('|', $zone['poly']) as $coords) : ?>
<area shape="poly" title="<?=$zone['nom']?> (<? echo $zone['info_nombre']; if($zone['info_nombre'] > 1) {echo ' inscrits';} else { echo ' inscrit';} ?>)" class="zone-<?=$code?>" href="<?=$zone['url']?>" coords="<?=$coords?>" />
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</map>
</div>
/tags/v1.1-andromede/composants/cartographie/squelettes/pays_moyen_orient.csv
New file
0,0 → 1,26
"code","rvb_fond","nom","poly"
"af","60-140-60","Afghanistan","532,124,524,126,517,122,498,132,494,124,496,119,494,114,488,108,482,114,483,120,474,121,473,127,468,124,458,128,453,124,434,122,430,124,426,124,422,127,422,129,422,135,420,136,416,140,405,144,405,148,402,150,397,153,393,151,390,149,386,150,384,146,381,159,376,165,376,172,378,173,378,175,378,178,376,180,377,185,378,187,378,189,378,192,379,198,380,200,383,199,388,203,388,205,388,210,386,213,382,217,380,221,399,227,439,223,440,208,443,204,453,204,456,201,457,198,464,197,466,199,470,197,472,195,472,191,472,190,471,189,473,187,474,185,474,184,475,181,476,179,477,179,478,178,481,177,482,177,481,173,481,173,481,171,481,168,481,168,484,167,489,167,491,168,491,164,490,162,492,158,492,157,497,155,498,154,498,150,498,146,498,142,495,140,495,140,496,136,502,135,504,133,506,132,509,131,511,131,518,131,520,130,523,129,527,128"
"sa","60-100-60","Arabie Saoudite","143,191,160,196,174,206,180,208,184,211,186,214,192,214,192,223,204,229,226,230,234,234,236,237,242,238,243,238,262,260,263,267,264,272,272,287,281,296,284,305,316,310,319,309,324,316,316,340,283,351,248,358,221,389,220,376,200,370,185,376,182,381,174,366,165,355,159,340,143,329,141,315,142,310,131,290,124,288,121,282,120,276,116,271,111,264,108,258,104,251,101,245,94,242,97,228,109,230,117,220,124,220,125,216,130,211,120,200"
"am","60-180-60","Arménie","221,102,221,99,222,97,221,94,216,91,214,89,214,87,216,86,216,84,211,80,211,74,209,74,206,70,203,70,197,71,193,72,193,74,194,81,197,85,202,88,205,91,208,91,211,93,215,93,217,95,218,100,219,103"
"az","60-240-60","Azerbaïdjan","216,97,215,95,210,95,207,93,212,100,213,102,217,102"
"bh","140-0-0","Bahreïn","269,260,266,265,266,272,270,272,274,270"
"ae","140-220-0","Emirats Arabes Unis","275,285,282,292,293,290,303,292,307,291,325,268,328,272,329,275,330,282,323,282,326,290,319,294,319,308,315,310,282,304,281,296"
"ge","170-15-50","Géorgie","167,64,169,56,163,43,149,34,166,35,170,38,184,38,192,45,202,46,208,44,213,47,215,52,223,58,220,62,224,66,224,68,222,69,217,68,212,66,208,66,190,70,183,65,179,64,176,66"
"iq","255-80-0","Irak","204,125,210,137,214,142,221,144,220,153,211,165,212,171,217,176,218,180,231,188,236,198,236,207,240,211,246,219,242,221,235,218,231,221,226,230,203,229,191,223,192,214,187,214,180,208,175,206,160,197,143,192,138,177,165,162,167,135,174,133,186,121,191,123"
"ir","255-120-0","Iran","384,144,382,134,376,133,365,125,362,120,350,119,338,110,331,110,331,112,320,112,310,121,304,121,305,129,281,133,271,130,267,128,264,123,257,122,253,120,250,116,250,112,249,109,246,107,244,106,240,104,240,104,240,101,241,100,243,100,243,98,241,96,240,94,239,91,236,92,234,92,232,93,230,94,228,98,227,100,225,100,224,100,224,101,223,101,218,101,217,102,209,100,209,100,206,96,204,92,204,91,202,92,199,97,198,102,200,108,200,113,201,116,202,118,203,120,204,121,205,123,206,126,206,128,206,130,208,136,209,136,211,138,212,140,216,143,218,143,220,144,220,144,220,153,212,166,212,172,214,175,215,176,218,179,219,181,220,182,222,183,226,185,228,188,231,190,234,190,234,190,234,195,236,198,237,202,237,203,236,205,237,209,239,212,242,216,244,218,245,219,246,218,278,246,301,260,314,263,333,256,343,273,388,279,391,265,406,259,405,254,400,252,401,242,388,235,379,221,388,211,388,203,383,199,379,199,376,179,379,177,378,172,375,172,374,164,379,163"
"il","255-160-0","Israël","97,180,103,180,104,188,99,188,98,192,97,194,97,197,97,198,96,201,96,202,98,203,101,202,102,203,102,208,98,216,97,226,89,206,92,205,94,203,93,202,90,201"
"jo","255-240-0","Jordanie","114,227,115,224,117,222,124,221,125,218,129,214,129,212,121,204,119,203,119,201,132,198,134,198,139,197,142,195,142,190,139,183,139,181,136,181,132,184,125,187,123,189,114,193,108,188,105,188,105,200,104,208,101,215,101,217,100,223,99,227,98,229,100,229,107,230,110,231"
"kg","40-100-255","Kirghizstan","491,45,505,45,514,49,516,49,517,43,524,40,532,42,556,42,568,44,578,46,581,48,585,52,589,52,590,59,574,67,569,72,554,74,550,82,542,82,539,80,533,80,531,83,525,86,522,94,517,90,516,94,499,97,498,92,490,93,485,91,470,92,472,86,476,84,482,85,484,86,488,84,492,81,500,82,501,81,506,78,510,77,513,74,500,70,497,64,494,69,482,64,491,54,488,52"
"kw","80-100-255","Koweït","242,236,242,230,238,227,242,225,240,219,235,217,231,220,226,230,233,233,236,237"
"lb","120-100-255","Liban","97,179,108,162,111,158,114,158,118,162,116,167,113,170,109,171,110,174,103,180"
"om","220-100-255","Oman","330,283,356,297,369,311,355,335,345,351,332,363,316,374,294,378,283,350,316,340,324,317,318,308,319,293,327,291,324,282"
"uz","240-100-255","Ouzbekistan","326,12,327,66,338,67,336,60,338,55,342,54,346,53,348,50,350,50,352,48,353,46,357,46,362,52,369,53,370,64,383,68,387,66,394,73,398,88,410,94,415,100,420,100,425,106,427,108,433,110,436,110,440,112,442,114,440,122,455,124,454,119,460,112,458,106,458,99,454,100,451,95,452,92,464,91,465,85,470,83,470,76,480,75,484,70,487,76,484,78,485,82,491,82,499,82,502,79,507,77,512,75,501,70,498,66,494,70,487,66,482,64,491,55,487,52,464,70,455,68,444,68,444,60,435,58,438,44,423,31,392,35,372,13,356,4"
"pk","0-255-0","Pakistan","561,149,538,192,533,208,491,289,456,295,388,280,391,266,399,262,404,260,406,258,405,254,402,253,400,252,401,242,388,235,380,222,398,227,440,223,440,208,444,204,454,204,455,203,457,199,459,198,462,197,464,197,465,199,466,199,468,198,471,197,471,196,472,196,472,194,472,190,471,190,472,188,474,186,475,183,476,180,477,179,479,179,481,178,483,177,483,177,480,173,482,172,480,169,480,169,479,169,482,168,485,168,488,168,488,168,490,168,492,166,492,166,491,160,494,158,497,156,498,155,498,154,498,150,497,147,496,144,494,140,494,140,496,137,498,136,500,136,502,135,504,133,507,132,511,131,513,131,520,132,520,132,530,128,536,129,539,131,540,132,543,134,543,136,545,142,546,143,550,144,553,146,556,148"
"ps","40-255-0","Palestine","100,203,102,202,103,191,100,190,98,195,99,201,98,203"
"qa","120-255-0","Qatar","275,271,281,274,282,281,278,284,276,284,274,284"
"sy","240-255-0","Syrie","117,131,116,139,108,146,108,159,114,158,117,164,115,168,113,171,110,171,110,175,104,180,104,186,107,185,113,190,164,161,167,156,168,135,173,134,182,124,176,123,171,126,159,126,156,128,141,133,135,129,128,132"
"tj","0-100-50","Tadjikistan","530,106,532,113,534,119,533,123,523,125,517,122,498,132,494,124,496,118,493,112,488,108,482,114,483,119,473,121,472,127,468,123,458,128,454,124,454,120,460,112,458,106,457,98,453,100,450,95,453,92,463,91,465,86,470,84,471,76,479,76,484,71,486,75,484,78,484,81,491,82,483,86,477,84,472,86,470,91,482,92,484,90,489,93,496,91,498,96,516,94,516,91,521,92,521,107"
"tm","100-100-50","Turkmenistan","294,74,291,81,291,87,293,87,298,85,300,88,302,92,298,93,297,97,303,100,304,121,309,121,320,113,330,112,333,109,339,110,349,119,362,120,376,133,382,134,384,146,387,150,390,149,395,152,406,148,405,144,415,140,422,135,422,127,426,123,429,124,434,122,441,122,442,114,436,109,430,110,420,101,398,88,396,76,388,66,384,68,370,65,368,54,356,47,351,47,352,49,347,50,346,53,343,54,341,55,338,56,336,60,338,67,317,65,312,56,308,52,293,53,290,56,288,62,288,65,291,66,293,64,297,59,300,58,302,62,305,66,308,68,311,70,312,72,310,74,310,76,306,76,300,76"
"tr","150-100-50","Turquie","2,92,8,80,36,69,84,57,100,57,111,61,166,64,173,65,174,66,178,65,182,65,188,68,192,74,194,78,194,82,198,85,200,87,202,89,200,92,200,94,199,97,199,101,200,107,202,112,201,117,201,117,204,120,204,122,203,125,202,126,200,122,199,122,193,123,189,123,189,123,187,122,183,124,180,126,179,126,176,125,170,127,167,127,160,126,155,130,148,131,143,132,140,132,137,131,134,130,129,130,124,132,122,132,119,130,117,130,116,132,115,136,114,140,112,143,110,144,109,146,108,142,108,141,108,138,108,136,109,134,110,132,110,132,109,130,107,132,106,132,104,133,103,133,101,134,98,132,94,131,92,132,91,134,90,136,88,137,85,138,80,139,78,139,76,140,75,141,72,139,69,138,66,135,63,134,59,132,56,131,53,131,51,131,50,138,48,139,44,141,40,140,35,139,34,136,34,134,32,133,29,132,27,131,26,131,24,132,22,132,21,132,19,132,16,132,4,110"
"ye","250-100-50","Yémen","281,352,248,358,221,390,220,376,201,370,194,372,190,374,185,376,182,381,181,384,181,390,183,395,183,400,185,404,186,409,187,412,188,416,188,420,191,422,194,423,210,420,216,415,217,414,226,415,238,409,247,409,254,400,264,396,266,397,272,395,277,392,280,391,284,390,285,389,288,383,292,381,294,379"
0,"255-255-255",0,
/tags/v1.1-andromede/composants/Composant.php
New file
0,0 → 1,13
<?php
 
class Composant {
 
public static function fabrique($classe, $options = array()) {
$classe_nom = implode('', array_map('ucfirst', explode('_', $classe)));
require_once dirname(__FILE__).DS.$classe.DS.$classe_nom.'.php';
$Composant = new $classe_nom($options);
return $Composant;
}
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/v1.1-andromede/composants/openid/Services/Yadis/XRI.php
New file
0,0 → 1,233
<?php
 
/**
* Routines for XRI resolution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
require_once 'Services/Yadis/Misc.php';
require_once 'Services/Yadis/Yadis.php';
require_once 'Auth/OpenID.php';
 
function Services_Yadis_getDefaultProxy()
{
return 'http://proxy.xri.net/';
}
 
function Services_Yadis_getXRIAuthorities()
{
return array('!', '=', '@', '+', '$', '(');
}
 
function Services_Yadis_getEscapeRE()
{
$parts = array();
foreach (array_merge(Services_Yadis_getUCSChars(),
Services_Yadis_getIPrivateChars()) as $pair) {
list($m, $n) = $pair;
$parts[] = sprintf("%s-%s", chr($m), chr($n));
}
 
return sprintf('/[%s]/', implode('', $parts));
}
 
function Services_Yadis_getXrefRE()
{
return '/\((.*?)\)/';
}
 
function Services_Yadis_identifierScheme($identifier)
{
if (Services_Yadis_startswith($identifier, 'xri://') ||
(in_array($identifier[0], Services_Yadis_getXRIAuthorities()))) {
return "XRI";
} else {
return "URI";
}
}
 
function Services_Yadis_toIRINormal($xri)
{
if (!Services_Yadis_startswith($xri, 'xri://')) {
$xri = 'xri://' . $xri;
}
 
return Services_Yadis_escapeForIRI($xri);
}
 
function _escape_xref($xref_match)
{
$xref = $xref_match[0];
$xref = str_replace('/', '%2F', $xref);
$xref = str_replace('?', '%3F', $xref);
$xref = str_replace('#', '%23', $xref);
return $xref;
}
 
function Services_Yadis_escapeForIRI($xri)
{
$xri = str_replace('%', '%25', $xri);
$xri = preg_replace_callback(Services_Yadis_getXrefRE(),
'_escape_xref', $xri);
return $xri;
}
 
function Services_Yadis_toURINormal($xri)
{
return Services_Yadis_iriToURI(Services_Yadis_toIRINormal($xri));
}
 
function Services_Yadis_iriToURI($iri)
{
if (1) {
return $iri;
} else {
// According to RFC 3987, section 3.1, "Mapping of IRIs to URIs"
return preg_replace_callback(Services_Yadis_getEscapeRE(),
'Services_Yadis_pct_escape_unicode', $iri);
}
}
 
 
function Services_Yadis_XRIAppendArgs($url, $args)
{
// Append some arguments to an HTTP query. Yes, this is just like
// OpenID's appendArgs, but with special seasoning for XRI
// queries.
 
if (count($args) == 0) {
return $url;
}
 
// Non-empty array; if it is an array of arrays, use multisort;
// otherwise use sort.
if (array_key_exists(0, $args) &&
is_array($args[0])) {
// Do nothing here.
} else {
$keys = array_keys($args);
sort($keys);
$new_args = array();
foreach ($keys as $key) {
$new_args[] = array($key, $args[$key]);
}
$args = $new_args;
}
 
// According to XRI Resolution section "QXRI query parameters":
//
// "If the original QXRI had a null query component (only a
// leading question mark), or a query component consisting of
// only question marks, one additional leading question mark MUST
// be added when adding any XRI resolution parameters."
if (strpos(rtrim($url, '?'), '?') !== false) {
$sep = '&';
} else {
$sep = '?';
}
 
return $url . $sep . Auth_OpenID::httpBuildQuery($args);
}
 
function Services_Yadis_providerIsAuthoritative($providerID, $canonicalID)
{
$lastbang = strrpos($canonicalID, '!');
$p = substr($canonicalID, 0, $lastbang);
return $p == $providerID;
}
 
function Services_Yadis_rootAuthority($xri)
{
// Return the root authority for an XRI.
 
$root = null;
 
if (Services_Yadis_startswith($xri, 'xri://')) {
$xri = substr($xri, 6);
}
 
$authority = explode('/', $xri, 2);
$authority = $authority[0];
if ($authority[0] == '(') {
// Cross-reference.
// XXX: This is incorrect if someone nests cross-references so
// there is another close-paren in there. Hopefully nobody
// does that before we have a real xriparse function.
// Hopefully nobody does that *ever*.
$root = substr($authority, 0, strpos($authority, ')') + 1);
} else if (in_array($authority[0], Services_Yadis_getXRIAuthorities())) {
// Other XRI reference.
$root = $authority[0];
} else {
// IRI reference.
$_segments = explode("!", $authority);
$segments = array();
foreach ($_segments as $s) {
$segments = array_merge($segments, explode("*", $s));
}
$root = $segments[0];
}
 
return Services_Yadis_XRI($root);
}
 
function Services_Yadis_XRI($xri)
{
if (!Services_Yadis_startswith($xri, 'xri://')) {
$xri = 'xri://' . $xri;
}
return $xri;
}
 
function Services_Yadis_getCanonicalID($iname, $xrds)
{
// Returns FALSE or a canonical ID value.
 
// Now nodes are in reverse order.
$xrd_list = array_reverse($xrds->allXrdNodes);
$parser =& $xrds->parser;
$node = $xrd_list[0];
 
$canonicalID_nodes = $parser->evalXPath('xrd:CanonicalID', $node);
 
if (!$canonicalID_nodes) {
return false;
}
 
$canonicalID = $canonicalID_nodes[count($canonicalID_nodes) - 1];
$canonicalID = Services_Yadis_XRI($parser->content($canonicalID));
 
$childID = $canonicalID;
 
for ($i = 1; $i < count($xrd_list); $i++) {
$xrd = $xrd_list[$i];
 
$parent_sought = substr($childID, 0, strrpos($childID, '!'));
$parent_list = array();
 
foreach ($parser->evalXPath('xrd:CanonicalID', $xrd) as $c) {
$parent_list[] = Services_Yadis_XRI($parser->content($c));
}
 
if (!in_array($parent_sought, $parent_list)) {
// raise XRDSFraud.
return false;
}
 
$childID = $parent_sought;
}
 
$root = Services_Yadis_rootAuthority($iname);
if (!Services_Yadis_providerIsAuthoritative($root, $childID)) {
// raise XRDSFraud.
return false;
}
 
return $canonicalID;
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/PlainHTTPFetcher.php
New file
0,0 → 1,245
<?php
 
/**
* This module contains the plain non-curl HTTP fetcher
* implementation.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Interface import
*/
require_once "Services/Yadis/HTTPFetcher.php";
 
/**
* This class implements a plain, hand-built socket-based fetcher
* which will be used in the event that CURL is unavailable.
*
* @package Yadis
*/
class Services_Yadis_PlainHTTPFetcher extends Services_Yadis_HTTPFetcher {
function get($url, $extra_headers = null)
{
if (!$this->allowedURL($url)) {
trigger_error("Bad URL scheme in url: " . $url,
E_USER_WARNING);
return null;
}
 
$redir = true;
 
$stop = time() + $this->timeout;
$off = $this->timeout;
 
while ($redir && ($off > 0)) {
 
$parts = parse_url($url);
 
$specify_port = true;
 
// Set a default port.
if (!array_key_exists('port', $parts)) {
$specify_port = false;
if ($parts['scheme'] == 'http') {
$parts['port'] = 80;
} elseif ($parts['scheme'] == 'https') {
$parts['port'] = 443;
} else {
trigger_error("fetcher post method doesn't support " .
" scheme '" . $parts['scheme'] .
"', no default port available",
E_USER_WARNING);
return null;
}
}
 
$host = $parts['host'];
 
if ($parts['scheme'] == 'https') {
$host = 'ssl://' . $host;
}
 
$user_agent = "PHP Yadis Library Fetcher";
 
$headers = array(
"GET ".$parts['path'].
(array_key_exists('query', $parts) ?
"?".$parts['query'] : "").
" HTTP/1.0",
"User-Agent: $user_agent",
"Host: ".$parts['host'].
($specify_port ? ":".$parts['port'] : ""),
"Port: ".$parts['port']);
 
$errno = 0;
$errstr = '';
 
if ($extra_headers) {
foreach ($extra_headers as $h) {
$headers[] = $h;
}
}
 
@$sock = fsockopen($host, $parts['port'], $errno, $errstr,
$this->timeout);
if ($sock === false) {
return false;
}
 
stream_set_timeout($sock, $this->timeout);
 
fputs($sock, implode("\r\n", $headers) . "\r\n\r\n");
 
$data = "";
while (!feof($sock)) {
$data .= fgets($sock, 1024);
}
 
fclose($sock);
 
// Split response into header and body sections
list($headers, $body) = explode("\r\n\r\n", $data, 2);
$headers = explode("\r\n", $headers);
 
$http_code = explode(" ", $headers[0]);
$code = $http_code[1];
 
if (in_array($code, array('301', '302'))) {
$url = $this->_findRedirect($headers);
$redir = true;
} else {
$redir = false;
}
 
$off = $stop - time();
}
 
$new_headers = array();
 
foreach ($headers as $header) {
if (preg_match("/:/", $header)) {
list($name, $value) = explode(": ", $header, 2);
$new_headers[$name] = $value;
}
 
}
 
return new Services_Yadis_HTTPResponse($url, $code, $new_headers, $body);
}
 
function post($url, $body, $extra_headers = null)
{
if (!$this->allowedURL($url)) {
trigger_error("Bad URL scheme in url: " . $url,
E_USER_WARNING);
return null;
}
 
$parts = parse_url($url);
 
$headers = array();
 
$post_path = $parts['path'];
if (isset($parts['query'])) {
$post_path .= '?' . $parts['query'];
}
 
$headers[] = "POST ".$post_path." HTTP/1.0";
$headers[] = "Host: " . $parts['host'];
$headers[] = "Content-type: application/x-www-form-urlencoded";
$headers[] = "Content-length: " . strval(strlen($body));
 
if ($extra_headers &&
is_array($extra_headers)) {
$headers = array_merge($headers, $extra_headers);
}
 
// Join all headers together.
$all_headers = implode("\r\n", $headers);
 
// Add headers, two newlines, and request body.
$request = $all_headers . "\r\n\r\n" . $body;
 
// Set a default port.
if (!array_key_exists('port', $parts)) {
if ($parts['scheme'] == 'http') {
$parts['port'] = 80;
} elseif ($parts['scheme'] == 'https') {
$parts['port'] = 443;
} else {
trigger_error("fetcher post method doesn't support scheme '" .
$parts['scheme'] .
"', no default port available",
E_USER_WARNING);
return null;
}
}
 
if ($parts['scheme'] == 'https') {
$parts['host'] = sprintf("ssl://%s", $parts['host']);
}
 
// Connect to the remote server.
$errno = 0;
$errstr = '';
 
$sock = fsockopen($parts['host'], $parts['port'], $errno, $errstr,
$this->timeout);
 
if ($sock === false) {
trigger_error("Could not connect to " . $parts['host'] .
" port " . $parts['port'],
E_USER_WARNING);
return null;
}
 
stream_set_timeout($sock, $this->timeout);
 
// Write the POST request.
fputs($sock, $request);
 
// Get the response from the server.
$response = "";
while (!feof($sock)) {
if ($data = fgets($sock, 128)) {
$response .= $data;
} else {
break;
}
}
 
// Split the request into headers and body.
list($headers, $response_body) = explode("\r\n\r\n", $response, 2);
 
$headers = explode("\r\n", $headers);
 
// Expect the first line of the headers data to be something
// like HTTP/1.1 200 OK. Split the line on spaces and take
// the second token, which should be the return code.
$http_code = explode(" ", $headers[0]);
$code = $http_code[1];
 
$new_headers = array();
 
foreach ($headers as $header) {
if (preg_match("/:/", $header)) {
list($name, $value) = explode(": ", $header, 2);
$new_headers[$name] = $value;
}
 
}
 
return new Services_Yadis_HTTPResponse($url, $code,
$headers, $response_body);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/Yadis.php
New file
0,0 → 1,313
<?php
 
/**
* The core PHP Yadis implementation.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Need both fetcher types so we can use the right one based on the
* presence or absence of CURL.
*/
require_once "Services/Yadis/PlainHTTPFetcher.php";
require_once "Services/Yadis/ParanoidHTTPFetcher.php";
 
/**
* Need this for parsing HTML (looking for META tags).
*/
require_once "Services/Yadis/ParseHTML.php";
 
/**
* Need this to parse the XRDS document during Yadis discovery.
*/
require_once "Services/Yadis/XRDS.php";
 
/**
* This is the core of the PHP Yadis library. This is the only class
* a user needs to use to perform Yadis discovery. This class
* performs the discovery AND stores the result of the discovery.
*
* First, require this library into your program source:
*
* <pre> require_once "Services/Yadis/Yadis.php";</pre>
*
* To perform Yadis discovery, first call the "discover" method
* statically with a URI parameter:
*
* <pre> $http_response = array();
* $fetcher = Services_Yadis_Yadis::getHTTPFetcher();
* $yadis_object = Services_Yadis_Yadis::discover($uri,
* $http_response, $fetcher);</pre>
*
* If the discovery succeeds, $yadis_object will be an instance of
* {@link Services_Yadis_Yadis}. If not, it will be null. The XRDS
* document found during discovery should have service descriptions,
* which can be accessed by calling
*
* <pre> $service_list = $yadis_object->services();</pre>
*
* which returns an array of objects which describe each service.
* These objects are instances of Services_Yadis_Service. Each object
* describes exactly one whole Service element, complete with all of
* its Types and URIs (no expansion is performed). The common use
* case for using the service objects returned by services() is to
* write one or more filter functions and pass those to services():
*
* <pre> $service_list = $yadis_object->services(
* array("filterByURI",
* "filterByExtension"));</pre>
*
* The filter functions (whose names appear in the array passed to
* services()) take the following form:
*
* <pre> function myFilter(&$service) {
* // Query $service object here. Return true if the service
* // matches your query; false if not.
* }</pre>
*
* This is an example of a filter which uses a regular expression to
* match the content of URI tags (note that the Services_Yadis_Service
* class provides a getURIs() method which you should use instead of
* this contrived example):
*
* <pre>
* function URIMatcher(&$service) {
* foreach ($service->getElements('xrd:URI') as $uri) {
* if (preg_match("/some_pattern/",
* $service->parser->content($uri))) {
* return true;
* }
* }
* return false;
* }</pre>
*
* The filter functions you pass will be called for each service
* object to determine which ones match the criteria your filters
* specify. The default behavior is that if a given service object
* matches ANY of the filters specified in the services() call, it
* will be returned. You can specify that a given service object will
* be returned ONLY if it matches ALL specified filters by changing
* the match mode of services():
*
* <pre> $yadis_object->services(array("filter1", "filter2"),
* SERVICES_YADIS_MATCH_ALL);</pre>
*
* See {@link SERVICES_YADIS_MATCH_ALL} and {@link
* SERVICES_YADIS_MATCH_ANY}.
*
* Services described in an XRDS should have a library which you'll
* probably be using. Those libraries are responsible for defining
* filters that can be used with the "services()" call. If you need
* to write your own filter, see the documentation for {@link
* Services_Yadis_Service}.
*
* @package Yadis
*/
class Services_Yadis_Yadis {
 
/**
* Returns an HTTP fetcher object. If the CURL extension is
* present, an instance of {@link Services_Yadis_ParanoidHTTPFetcher}
* is returned. If not, an instance of
* {@link Services_Yadis_PlainHTTPFetcher} is returned.
*/
function getHTTPFetcher($timeout = 20)
{
if (Services_Yadis_Yadis::curlPresent()) {
$fetcher = new Services_Yadis_ParanoidHTTPFetcher($timeout);
} else {
$fetcher = new Services_Yadis_PlainHTTPFetcher($timeout);
}
return $fetcher;
}
 
function curlPresent()
{
return function_exists('curl_init');
}
 
/**
* @access private
*/
function _getHeader($header_list, $names)
{
foreach ($header_list as $name => $value) {
foreach ($names as $n) {
if (strtolower($name) == strtolower($n)) {
return $value;
}
}
}
 
return null;
}
 
/**
* @access private
*/
function _getContentType($content_type_header)
{
if ($content_type_header) {
$parts = explode(";", $content_type_header);
return strtolower($parts[0]);
}
}
 
/**
* This should be called statically and will build a Yadis
* instance if the discovery process succeeds. This implements
* Yadis discovery as specified in the Yadis specification.
*
* @param string $uri The URI on which to perform Yadis discovery.
*
* @param array $http_response An array reference where the HTTP
* response object will be stored (see {@link
* Services_Yadis_HTTPResponse}.
*
* @param Services_Yadis_HTTPFetcher $fetcher An instance of a
* Services_Yadis_HTTPFetcher subclass.
*
* @param array $extra_ns_map An array which maps namespace names
* to namespace URIs to be used when parsing the Yadis XRDS
* document.
*
* @param integer $timeout An optional fetcher timeout, in seconds.
*
* @return mixed $obj Either null or an instance of
* Services_Yadis_Yadis, depending on whether the discovery
* succeeded.
*/
function discover($uri, &$http_response, &$fetcher,
$extra_ns_map = null, $timeout = 20)
{
if (!$uri) {
return null;
}
 
$request_uri = $uri;
$headers = array("Accept: application/xrds+xml");
 
if (!$fetcher) {
$fetcher = Services_Yadis_Yadis::getHTTPFetcher($timeout);
}
 
$response = $fetcher->get($uri, $headers);
$http_response = $response;
 
if (!$response) {
return null;
}
 
if ($response->status != 200) {
return null;
}
 
$xrds_uri = $response->final_url;
$uri = $response->final_url;
$body = $response->body;
 
$xrds_header_uri = Services_Yadis_Yadis::_getHeader(
$response->headers,
array('x-xrds-location',
'x-yadis-location'));
 
$content_type = Services_Yadis_Yadis::_getHeader($response->headers,
array('content-type'));
 
if ($xrds_header_uri) {
$xrds_uri = $xrds_header_uri;
$response = $fetcher->get($xrds_uri);
$http_response = $response;
if (!$response) {
return null;
} else {
$body = $response->body;
$headers = $response->headers;
$content_type = Services_Yadis_Yadis::_getHeader($headers,
array('content-type'));
}
}
 
if (Services_Yadis_Yadis::_getContentType($content_type) !=
'application/xrds+xml') {
// Treat the body as HTML and look for a META tag.
$parser = new Services_Yadis_ParseHTML();
$new_uri = $parser->getHTTPEquiv($body);
$xrds_uri = null;
if ($new_uri) {
$response = $fetcher->get($new_uri);
if ($response->status != 200) {
return null;
}
$http_response = $response;
$body = $response->body;
$xrds_uri = $new_uri;
$content_type = Services_Yadis_Yadis::_getHeader(
$response->headers,
array('content-type'));
}
}
 
$xrds = Services_Yadis_XRDS::parseXRDS($body, $extra_ns_map);
 
if ($xrds !== null) {
$y = new Services_Yadis_Yadis();
 
$y->request_uri = $request_uri;
$y->xrds = $xrds;
$y->uri = $uri;
$y->xrds_uri = $xrds_uri;
$y->body = $body;
$y->content_type = $content_type;
 
return $y;
} else {
return null;
}
}
 
/**
* Instantiates an empty Services_Yadis_Yadis object. This
* constructor should not be used by any user of the library.
* This constructor results in a completely useless object which
* must be populated with valid discovery information. Instead of
* using this constructor, call
* Services_Yadis_Yadis::discover($uri).
*/
function Services_Yadis_Yadis()
{
$this->request_uri = null;
$this->uri = null;
$this->xrds = null;
$this->xrds_uri = null;
$this->body = null;
$this->content_type = null;
}
 
/**
* Returns the list of service objects as described by the XRDS
* document, if this yadis object represents a successful Yadis
* discovery.
*
* @return array $services An array of {@link Services_Yadis_Service}
* objects
*/
function services()
{
if ($this->xrds) {
return $this->xrds->services();
}
 
return null;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/Manager.php
New file
0,0 → 1,496
<?php
 
/**
* Yadis service manager to be used during yadis-driven authentication
* attempts.
*
* @package Yadis
*/
 
/**
* The base session class used by the Services_Yadis_Manager. This
* class wraps the default PHP session machinery and should be
* subclassed if your application doesn't use PHP sessioning.
*
* @package Yadis
*/
class Services_Yadis_PHPSession {
/**
* Set a session key/value pair.
*
* @param string $name The name of the session key to add.
* @param string $value The value to add to the session.
*/
function set($name, $value)
{
$_SESSION[$name] = $value;
}
 
/**
* Get a key's value from the session.
*
* @param string $name The name of the key to retrieve.
* @param string $default The optional value to return if the key
* is not found in the session.
* @return string $result The key's value in the session or
* $default if it isn't found.
*/
function get($name, $default=null)
{
if (array_key_exists($name, $_SESSION)) {
return $_SESSION[$name];
} else {
return $default;
}
}
 
/**
* Remove a key/value pair from the session.
*
* @param string $name The name of the key to remove.
*/
function del($name)
{
unset($_SESSION[$name]);
}
 
/**
* Return the contents of the session in array form.
*/
function contents()
{
return $_SESSION;
}
}
 
/**
* A session helper class designed to translate between arrays and
* objects. Note that the class used must have a constructor that
* takes no parameters. This is not a general solution, but it works
* for dumb objects that just need to have attributes set. The idea
* is that you'll subclass this and override $this->check($data) ->
* bool to implement your own session data validation.
*/
class Services_Yadis_SessionLoader {
/**
* Override this.
*/
function check($data)
{
return true;
}
 
/**
* Given a session data value (an array), this creates an object
* (returned by $this->newObject()) whose attributes and values
* are those in $data. Returns null if $data lacks keys found in
* $this->requiredKeys(). Returns null if $this->check($data)
* evaluates to false. Returns null if $this->newObject()
* evaluates to false.
*/
function fromSession($data)
{
if (!$data) {
return null;
}
 
$required = $this->requiredKeys();
 
foreach ($required as $k) {
if (!array_key_exists($k, $data)) {
return null;
}
}
 
if (!$this->check($data)) {
return null;
}
 
$data = array_merge($data, $this->prepareForLoad($data));
$obj = $this->newObject($data);
 
if (!$obj) {
return null;
}
 
foreach ($required as $k) {
$obj->$k = $data[$k];
}
 
return $obj;
}
 
/**
* Prepares the data array by making any necessary changes.
* Returns an array whose keys and values will be used to update
* the original data array before calling $this->newObject($data).
*/
function prepareForLoad($data)
{
return array();
}
 
/**
* Returns a new instance of this loader's class, using the
* session data to construct it if necessary. The object need
* only be created; $this->fromSession() will take care of setting
* the object's attributes.
*/
function newObject($data)
{
return null;
}
 
/**
* Returns an array of keys and values built from the attributes
* of $obj. If $this->prepareForSave($obj) returns an array, its keys
* and values are used to update the $data array of attributes
* from $obj.
*/
function toSession($obj)
{
$data = array();
foreach ($obj as $k => $v) {
$data[$k] = $v;
}
 
$extra = $this->prepareForSave($obj);
 
if ($extra && is_array($extra)) {
foreach ($extra as $k => $v) {
$data[$k] = $v;
}
}
 
return $data;
}
 
/**
* Override this.
*/
function prepareForSave($obj)
{
return array();
}
}
 
class Auth_OpenID_ServiceEndpointLoader extends Services_Yadis_SessionLoader {
function newObject($data)
{
return new Auth_OpenID_ServiceEndpoint();
}
 
function requiredKeys()
{
$obj = new Auth_OpenID_ServiceEndpoint();
$data = array();
foreach ($obj as $k => $v) {
$data[] = $k;
}
return $data;
}
 
function check($data)
{
return is_array($data['type_uris']);
}
}
 
class Services_Yadis_ManagerLoader extends Services_Yadis_SessionLoader {
function requiredKeys()
{
return array('starting_url',
'yadis_url',
'services',
'session_key',
'_current',
'stale');
}
 
function newObject($data)
{
return new Services_Yadis_Manager($data['starting_url'],
$data['yadis_url'],
$data['services'],
$data['session_key']);
}
 
function check($data)
{
return is_array($data['services']);
}
 
function prepareForLoad($data)
{
$loader = new Auth_OpenID_ServiceEndpointLoader();
$services = array();
foreach ($data['services'] as $s) {
$services[] = $loader->fromSession($s);
}
return array('services' => $services);
}
 
function prepareForSave($obj)
{
$loader = new Auth_OpenID_ServiceEndpointLoader();
$services = array();
foreach ($obj->services as $s) {
$services[] = $loader->toSession($s);
}
return array('services' => $services);
}
}
 
/**
* The Yadis service manager which stores state in a session and
* iterates over <Service> elements in a Yadis XRDS document and lets
* a caller attempt to use each one. This is used by the Yadis
* library internally.
*
* @package Yadis
*/
class Services_Yadis_Manager {
 
/**
* Intialize a new yadis service manager.
*
* @access private
*/
function Services_Yadis_Manager($starting_url, $yadis_url,
$services, $session_key)
{
// The URL that was used to initiate the Yadis protocol
$this->starting_url = $starting_url;
 
// The URL after following redirects (the identifier)
$this->yadis_url = $yadis_url;
 
// List of service elements
$this->services = $services;
 
$this->session_key = $session_key;
 
// Reference to the current service object
$this->_current = null;
 
// Stale flag for cleanup if PHP lib has trouble.
$this->stale = false;
}
 
/**
* @access private
*/
function length()
{
// How many untried services remain?
return count($this->services);
}
 
/**
* Return the next service
*
* $this->current() will continue to return that service until the
* next call to this method.
*/
function nextService()
{
 
if ($this->services) {
$this->_current = array_shift($this->services);
} else {
$this->_current = null;
}
 
return $this->_current;
}
 
/**
* @access private
*/
function current()
{
// Return the current service.
// Returns None if there are no services left.
return $this->_current;
}
 
/**
* @access private
*/
function forURL($url)
{
return in_array($url, array($this->starting_url, $this->yadis_url));
}
 
/**
* @access private
*/
function started()
{
// Has the first service been returned?
return $this->_current !== null;
}
}
 
/**
* State management for discovery.
*
* High-level usage pattern is to call .getNextService(discover) in
* order to find the next available service for this user for this
* session. Once a request completes, call .finish() to clean up the
* session state.
*
* @package Yadis
*/
class Services_Yadis_Discovery {
 
/**
* @access private
*/
var $DEFAULT_SUFFIX = 'auth';
 
/**
* @access private
*/
var $PREFIX = '_yadis_services_';
 
/**
* Initialize a discovery object.
*
* @param Services_Yadis_PHPSession $session An object which
* implements the Services_Yadis_PHPSession API.
* @param string $url The URL on which to attempt discovery.
* @param string $session_key_suffix The optional session key
* suffix override.
*/
function Services_Yadis_Discovery(&$session, $url,
$session_key_suffix = null)
{
/// Initialize a discovery object
$this->session =& $session;
$this->url = $url;
if ($session_key_suffix === null) {
$session_key_suffix = $this->DEFAULT_SUFFIX;
}
 
$this->session_key_suffix = $session_key_suffix;
$this->session_key = $this->PREFIX . $this->session_key_suffix;
}
 
/**
* Return the next authentication service for the pair of
* user_input and session. This function handles fallback.
*/
function getNextService($discover_cb, &$fetcher)
{
$manager = $this->getManager();
if (!$manager || (!$manager->services)) {
$this->destroyManager();
$http_response = array();
 
$services = call_user_func($discover_cb, $this->url,
$fetcher);
 
$manager = $this->createManager($services, $this->url);
}
 
if ($manager) {
$loader = new Services_Yadis_ManagerLoader();
$service = $manager->nextService();
$this->session->set($this->session_key,
serialize($loader->toSession($manager)));
} else {
$service = null;
}
 
return $service;
}
 
/**
* Clean up Yadis-related services in the session and return the
* most-recently-attempted service from the manager, if one
* exists.
*/
function cleanup()
{
$manager = $this->getManager();
if ($manager) {
$service = $manager->current();
$this->destroyManager();
} else {
$service = null;
}
 
return $service;
}
 
/**
* @access private
*/
function getSessionKey()
{
// Get the session key for this starting URL and suffix
return $this->PREFIX . $this->session_key_suffix;
}
 
/**
* @access private
*/
function &getManager()
{
// Extract the YadisServiceManager for this object's URL and
// suffix from the session.
 
$manager_str = $this->session->get($this->getSessionKey());
$manager = null;
 
if ($manager_str !== null) {
$loader = new Services_Yadis_ManagerLoader();
$manager = $loader->fromSession(unserialize($manager_str));
}
 
if ($manager && $manager->forURL($this->url)) {
return $manager;
} else {
$unused = null;
return $unused;
}
}
 
/**
* @access private
*/
function &createManager($services, $yadis_url = null)
{
$key = $this->getSessionKey();
if ($this->getManager()) {
return $this->getManager();
}
 
if ($services) {
$loader = new Services_Yadis_ManagerLoader();
$manager = new Services_Yadis_Manager($this->url, $yadis_url,
$services, $key);
$this->session->set($this->session_key,
serialize($loader->toSession($manager)));
return $manager;
} else {
// Oh, PHP.
$unused = null;
return $unused;
}
}
 
/**
* @access private
*/
function destroyManager()
{
if ($this->getManager() !== null) {
$key = $this->getSessionKey();
$this->session->del($key);
}
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/Misc.php
New file
0,0 → 1,59
<?php
 
/**
* Miscellaneous utility values and functions for OpenID and Yadis.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
function Services_Yadis_getUCSChars()
{
return array(
array(0xA0, 0xD7FF),
array(0xF900, 0xFDCF),
array(0xFDF0, 0xFFEF),
array(0x10000, 0x1FFFD),
array(0x20000, 0x2FFFD),
array(0x30000, 0x3FFFD),
array(0x40000, 0x4FFFD),
array(0x50000, 0x5FFFD),
array(0x60000, 0x6FFFD),
array(0x70000, 0x7FFFD),
array(0x80000, 0x8FFFD),
array(0x90000, 0x9FFFD),
array(0xA0000, 0xAFFFD),
array(0xB0000, 0xBFFFD),
array(0xC0000, 0xCFFFD),
array(0xD0000, 0xDFFFD),
array(0xE1000, 0xEFFFD)
);
}
 
function Services_Yadis_getIPrivateChars()
{
return array(
array(0xE000, 0xF8FF),
array(0xF0000, 0xFFFFD),
array(0x100000, 0x10FFFD)
);
}
 
function Services_Yadis_pct_escape_unicode($char_match)
{
$c = $char_match[0];
$result = "";
for ($i = 0; $i < strlen($c); $i++) {
$result .= "%".sprintf("%X", ord($c[$i]));
}
return $result;
}
 
function Services_Yadis_startswith($s, $stuff)
{
return strpos($s, $stuff) === 0;
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/XRIRes.php
New file
0,0 → 1,68
<?php
 
require_once 'Services/Yadis/XRDS.php';
require_once 'Services/Yadis/XRI.php';
 
class Services_Yadis_ProxyResolver {
function Services_Yadis_ProxyResolver(&$fetcher, $proxy_url = null)
{
$this->fetcher =& $fetcher;
$this->proxy_url = $proxy_url;
if (!$this->proxy_url) {
$this->proxy_url = Services_Yadis_getDefaultProxy();
}
}
 
function queryURL($xri, $service_type = null)
{
// trim off the xri:// prefix
$qxri = substr(Services_Yadis_toURINormal($xri), 6);
$hxri = $this->proxy_url . $qxri;
$args = array(
'_xrd_r' => 'application/xrds+xml'
);
 
if ($service_type) {
$args['_xrd_t'] = $service_type;
} else {
// Don't perform service endpoint selection.
$args['_xrd_r'] .= ';sep=false';
}
 
$query = Services_Yadis_XRIAppendArgs($hxri, $args);
return $query;
}
 
function query($xri, $service_types, $filters = array())
{
$services = array();
$canonicalID = null;
foreach ($service_types as $service_type) {
$url = $this->queryURL($xri, $service_type);
$response = $this->fetcher->get($url);
if ($response->status != 200) {
continue;
}
$xrds = Services_Yadis_XRDS::parseXRDS($response->body);
if (!$xrds) {
continue;
}
$canonicalID = Services_Yadis_getCanonicalID($xri,
$xrds);
 
if ($canonicalID === false) {
return null;
}
 
$some_services = $xrds->services($filters);
$services = array_merge($services, $some_services);
// TODO:
// * If we do get hits for multiple service_types, we're
// almost certainly going to have duplicated service
// entries and broken priority ordering.
}
return array($canonicalID, $services);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/ParanoidHTTPFetcher.php
New file
0,0 → 1,177
<?php
 
/**
* This module contains the CURL-based HTTP fetcher implementation.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Interface import
*/
require_once "Services/Yadis/HTTPFetcher.php";
 
/**
* A paranoid {@link Services_Yadis_HTTPFetcher} class which uses CURL
* for fetching.
*
* @package Yadis
*/
class Services_Yadis_ParanoidHTTPFetcher extends Services_Yadis_HTTPFetcher {
function Services_Yadis_ParanoidHTTPFetcher()
{
$this->reset();
}
 
function reset()
{
$this->headers = array();
$this->data = "";
}
 
/**
* @access private
*/
function _writeHeader($ch, $header)
{
array_push($this->headers, rtrim($header));
return strlen($header);
}
 
/**
* @access private
*/
function _writeData($ch, $data)
{
$this->data .= $data;
return strlen($data);
}
 
function get($url, $extra_headers = null)
{
$stop = time() + $this->timeout;
$off = $this->timeout;
 
$redir = true;
 
while ($redir && ($off > 0)) {
$this->reset();
 
$c = curl_init();
if (defined('CURLOPT_NOSIGNAL')) {
curl_setopt($c, CURLOPT_NOSIGNAL, true);
}
 
if (!$this->allowedURL($url)) {
trigger_error(sprintf("Fetching URL not allowed: %s", $url),
E_USER_WARNING);
return null;
}
 
curl_setopt($c, CURLOPT_WRITEFUNCTION,
array(&$this, "_writeData"));
curl_setopt($c, CURLOPT_HEADERFUNCTION,
array(&$this, "_writeHeader"));
 
if ($extra_headers) {
curl_setopt($c, CURLOPT_HTTPHEADER, $extra_headers);
}
 
curl_setopt($c, CURLOPT_TIMEOUT, $off);
curl_setopt($c, CURLOPT_URL, $url);
 
curl_exec($c);
 
$code = curl_getinfo($c, CURLINFO_HTTP_CODE);
$body = $this->data;
$headers = $this->headers;
 
if (!$code) {
return null;
}
 
if (in_array($code, array(301, 302, 303, 307))) {
$url = $this->_findRedirect($headers);
$redir = true;
} else {
$redir = false;
curl_close($c);
 
$new_headers = array();
 
foreach ($headers as $header) {
if (preg_match("/:/", $header)) {
list($name, $value) = explode(": ", $header, 2);
$new_headers[$name] = $value;
}
}
 
return new Services_Yadis_HTTPResponse($url, $code,
$new_headers, $body);
}
 
$off = $stop - time();
}
 
trigger_error(sprintf("Timed out fetching: %s", $url),
E_USER_WARNING);
 
return null;
}
 
function post($url, $body)
{
$this->reset();
 
if (!$this->allowedURL($url)) {
trigger_error(sprintf("Fetching URL not allowed: %s", $url),
E_USER_WARNING);
return null;
}
 
$c = curl_init();
 
curl_setopt($c, CURLOPT_NOSIGNAL, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $body);
curl_setopt($c, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_WRITEFUNCTION,
array(&$this, "_writeData"));
 
curl_exec($c);
 
$code = curl_getinfo($c, CURLINFO_HTTP_CODE);
 
if (!$code) {
trigger_error("No HTTP code returned", E_USER_WARNING);
return null;
}
 
$body = $this->data;
 
curl_close($c);
 
$new_headers = array();
 
foreach ($this->headers as $header) {
if (preg_match("/:/", $header)) {
list($name, $value) = explode(": ", $header, 2);
$new_headers[$name] = $value;
}
 
}
 
return new Services_Yadis_HTTPResponse($url, $code,
$new_headers, $body);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/ParseHTML.php
New file
0,0 → 1,258
<?php
 
/**
* This is the HTML pseudo-parser for the Yadis library.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* This class is responsible for scanning an HTML string to find META
* tags and their attributes. This is used by the Yadis discovery
* process. This class must be instantiated to be used.
*
* @package Yadis
*/
class Services_Yadis_ParseHTML {
 
/**
* @access private
*/
var $_re_flags = "si";
 
/**
* @access private
*/
var $_removed_re =
"<!--.*?-->|<!\[CDATA\[.*?\]\]>|<script\b(?!:)[^>]*>.*?<\/script>";
 
/**
* @access private
*/
var $_tag_expr = "<%s%s(?:\s.*?)?%s>";
 
/**
* @access private
*/
var $_attr_find = '\b([-\w]+)=(".*?"|\'.*?\'|.+?)[\s>]';
 
function Services_Yadis_ParseHTML()
{
$this->_attr_find = sprintf("/%s/%s",
$this->_attr_find,
$this->_re_flags);
 
$this->_removed_re = sprintf("/%s/%s",
$this->_removed_re,
$this->_re_flags);
 
$this->_entity_replacements = array(
'amp' => '&',
'lt' => '<',
'gt' => '>',
'quot' => '"'
);
 
$this->_ent_replace =
sprintf("&(%s);", implode("|",
$this->_entity_replacements));
}
 
/**
* Replace HTML entities (amp, lt, gt, and quot) as well as
* numeric entities (e.g. #x9f;) with their actual values and
* return the new string.
*
* @access private
* @param string $str The string in which to look for entities
* @return string $new_str The new string entities decoded
*/
function replaceEntities($str)
{
foreach ($this->_entity_replacements as $old => $new) {
$str = preg_replace(sprintf("/&%s;/", $old), $new, $str);
}
 
// Replace numeric entities because html_entity_decode doesn't
// do it for us.
$str = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $str);
$str = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $str);
 
return $str;
}
 
/**
* Strip single and double quotes off of a string, if they are
* present.
*
* @access private
* @param string $str The original string
* @return string $new_str The new string with leading and
* trailing quotes removed
*/
function removeQuotes($str)
{
$matches = array();
$double = '/^"(.*)"$/';
$single = "/^\'(.*)\'$/";
 
if (preg_match($double, $str, $matches)) {
return $matches[1];
} else if (preg_match($single, $str, $matches)) {
return $matches[1];
} else {
return $str;
}
}
 
/**
* Create a regular expression that will match an opening
* or closing tag from a set of names.
*
* @access private
* @param mixed $tag_names Tag names to match
* @param mixed $close false/0 = no, true/1 = yes, other = maybe
* @param mixed $self_close false/0 = no, true/1 = yes, other = maybe
* @return string $regex A regular expression string to be used
* in, say, preg_match.
*/
function tagPattern($tag_names, $close, $self_close)
{
if (is_array($tag_names)) {
$tag_names = '(?:'.implode('|',$tag_names).')';
}
if ($close) {
$close = '\/' . (($close == 1)? '' : '?');
} else {
$close = '';
}
if ($self_close) {
$self_close = '(?:\/\s*)' . (($self_close == 1)? '' : '?');
} else {
$self_close = '';
}
$expr = sprintf($this->_tag_expr, $close, $tag_names, $self_close);
 
return sprintf("/%s/%s", $expr, $this->_re_flags);
}
 
/**
* Given an HTML document string, this finds all the META tags in
* the document, provided they are found in the
* <HTML><HEAD>...</HEAD> section of the document. The <HTML> tag
* may be missing.
*
* @access private
* @param string $html_string An HTMl document string
* @return array $tag_list Array of tags; each tag is an array of
* attribute -> value.
*/
function getMetaTags($html_string)
{
$html_string = preg_replace($this->_removed_re,
"",
$html_string);
 
$key_tags = array($this->tagPattern('html', false, false),
$this->tagPattern('head', false, false),
$this->tagPattern('head', true, false),
$this->tagPattern('html', true, false),
$this->tagPattern(array(
'body', 'frameset', 'frame', 'p', 'div',
'table','span','a'), 'maybe', 'maybe'));
$key_tags_pos = array();
foreach ($key_tags as $pat) {
$matches = array();
preg_match($pat, $html_string, $matches, PREG_OFFSET_CAPTURE);
if($matches) {
$key_tags_pos[] = $matches[0][1];
} else {
$key_tags_pos[] = null;
}
}
// no opening head tag
if (is_null($key_tags_pos[1])) {
return array();
}
// the effective </head> is the min of the following
if (is_null($key_tags_pos[2])) {
$key_tags_pos[2] = strlen($html_string);
}
foreach (array($key_tags_pos[3], $key_tags_pos[4]) as $pos) {
if (!is_null($pos) && $pos < $key_tags_pos[2]) {
$key_tags_pos[2] = $pos;
}
}
// closing head tag comes before opening head tag
if ($key_tags_pos[1] > $key_tags_pos[2]) {
return array();
}
// if there is an opening html tag, make sure the opening head tag
// comes after it
if (!is_null($key_tags_pos[0]) && $key_tags_pos[1] < $key_tags_pos[0]) {
return array();
}
$html_string = substr($html_string, $key_tags_pos[1], ($key_tags_pos[2]-$key_tags_pos[1]));
 
$link_data = array();
$link_matches = array();
if (!preg_match_all($this->tagPattern('meta', false, 'maybe'),
$html_string, $link_matches)) {
return array();
}
 
foreach ($link_matches[0] as $link) {
$attr_matches = array();
preg_match_all($this->_attr_find, $link, $attr_matches);
$link_attrs = array();
foreach ($attr_matches[0] as $index => $full_match) {
$name = $attr_matches[1][$index];
$value = $this->replaceEntities(
$this->removeQuotes($attr_matches[2][$index]));
 
$link_attrs[strtolower($name)] = $value;
}
$link_data[] = $link_attrs;
}
 
return $link_data;
}
 
/**
* Looks for a META tag with an "http-equiv" attribute whose value
* is one of ("x-xrds-location", "x-yadis-location"), ignoring
* case. If such a META tag is found, its "content" attribute
* value is returned.
*
* @param string $html_string An HTML document in string format
* @return mixed $content The "content" attribute value of the
* META tag, if found, or null if no such tag was found.
*/
function getHTTPEquiv($html_string)
{
$meta_tags = $this->getMetaTags($html_string);
 
if ($meta_tags) {
foreach ($meta_tags as $tag) {
if (array_key_exists('http-equiv', $tag) &&
(in_array(strtolower($tag['http-equiv']),
array('x-xrds-location', 'x-yadis-location'))) &&
array_key_exists('content', $tag)) {
return $tag['content'];
}
}
}
 
return null;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/HTTPFetcher.php
New file
0,0 → 1,92
<?php
 
/**
* This module contains the HTTP fetcher interface
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
class Services_Yadis_HTTPResponse {
function Services_Yadis_HTTPResponse($final_url = null, $status = null,
$headers = null, $body = null)
{
$this->final_url = $final_url;
$this->status = $status;
$this->headers = $headers;
$this->body = $body;
}
}
 
/**
* This class is the interface for HTTP fetchers the Yadis library
* uses. This interface is only important if you need to write a new
* fetcher for some reason.
*
* @access private
* @package Yadis
*/
class Services_Yadis_HTTPFetcher {
 
var $timeout = 20; // timeout in seconds.
 
/**
* Return whether a URL should be allowed. Override this method to
* conform to your local policy.
*
* By default, will attempt to fetch any http or https URL.
*/
function allowedURL($url)
{
return $this->URLHasAllowedScheme($url);
}
 
/**
* Is this an http or https URL?
*
* @access private
*/
function URLHasAllowedScheme($url)
{
return (bool)preg_match('/^https?:\/\//i', $url);
}
 
/**
* @access private
*/
function _findRedirect($headers)
{
foreach ($headers as $line) {
if (strpos($line, "Location: ") === 0) {
$parts = explode(" ", $line, 2);
return $parts[1];
}
}
return null;
}
 
/**
* Fetches the specified URL using optional extra headers and
* returns the server's response.
*
* @param string $url The URL to be fetched.
* @param array $extra_headers An array of header strings
* (e.g. "Accept: text/html").
* @return mixed $result An array of ($code, $url, $headers,
* $body) if the URL could be fetched; null if the URL does not
* pass the URLHasAllowedScheme check or if the server's response
* is malformed.
*/
function get($url, $headers)
{
trigger_error("not implemented", E_USER_ERROR);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/XML.php
New file
0,0 → 1,365
<?php
 
/**
* XML-parsing classes to wrap the domxml and DOM extensions for PHP 4
* and 5, respectively.
*
* @package Yadis
*/
 
/**
* The base class for wrappers for available PHP XML-parsing
* extensions. To work with this Yadis library, subclasses of this
* class MUST implement the API as defined in the remarks for this
* class. Subclasses of Services_Yadis_XMLParser are used to wrap
* particular PHP XML extensions such as 'domxml'. These are used
* internally by the library depending on the availability of
* supported PHP XML extensions.
*
* @package Yadis
*/
class Services_Yadis_XMLParser {
/**
* Initialize an instance of Services_Yadis_XMLParser with some
* XML and namespaces. This SHOULD NOT be overridden by
* subclasses.
*
* @param string $xml_string A string of XML to be parsed.
* @param array $namespace_map An array of ($ns_name => $ns_uri)
* to be registered with the XML parser. May be empty.
* @return boolean $result True if the initialization and
* namespace registration(s) succeeded; false otherwise.
*/
function init($xml_string, $namespace_map)
{
if (!$this->setXML($xml_string)) {
return false;
}
 
foreach ($namespace_map as $prefix => $uri) {
if (!$this->registerNamespace($prefix, $uri)) {
return false;
}
}
 
return true;
}
 
/**
* Register a namespace with the XML parser. This should be
* overridden by subclasses.
*
* @param string $prefix The namespace prefix to appear in XML tag
* names.
*
* @param string $uri The namespace URI to be used to identify the
* namespace in the XML.
*
* @return boolean $result True if the registration succeeded;
* false otherwise.
*/
function registerNamespace($prefix, $uri)
{
// Not implemented.
}
 
/**
* Set this parser object's XML payload. This should be
* overridden by subclasses.
*
* @param string $xml_string The XML string to pass to this
* object's XML parser.
*
* @return boolean $result True if the initialization succeeded;
* false otherwise.
*/
function setXML($xml_string)
{
// Not implemented.
}
 
/**
* Evaluate an XPath expression and return the resulting node
* list. This should be overridden by subclasses.
*
* @param string $xpath The XPath expression to be evaluated.
*
* @param mixed $node A node object resulting from a previous
* evalXPath call. This node, if specified, provides the context
* for the evaluation of this xpath expression.
*
* @return array $node_list An array of matching opaque node
* objects to be used with other methods of this parser class.
*/
function evalXPath($xpath, $node = null)
{
// Not implemented.
}
 
/**
* Return the textual content of a specified node.
*
* @param mixed $node A node object from a previous call to
* $this->evalXPath().
*
* @return string $content The content of this node.
*/
function content($node)
{
// Not implemented.
}
 
/**
* Return the attributes of a specified node.
*
* @param mixed $node A node object from a previous call to
* $this->evalXPath().
*
* @return array $attrs An array mapping attribute names to
* values.
*/
function attributes($node)
{
// Not implemented.
}
}
 
/**
* This concrete implementation of Services_Yadis_XMLParser implements
* the appropriate API for the 'domxml' extension which is typically
* packaged with PHP 4. This class will be used whenever the 'domxml'
* extension is detected. See the Services_Yadis_XMLParser class for
* details on this class's methods.
*
* @package Yadis
*/
class Services_Yadis_domxml extends Services_Yadis_XMLParser {
function Services_Yadis_domxml()
{
$this->xml = null;
$this->doc = null;
$this->xpath = null;
$this->errors = array();
}
 
function setXML($xml_string)
{
$this->xml = $xml_string;
$this->doc = @domxml_open_mem($xml_string, DOMXML_LOAD_PARSING,
$this->errors);
 
if (!$this->doc) {
return false;
}
 
$this->xpath = $this->doc->xpath_new_context();
 
return true;
}
 
function registerNamespace($prefix, $uri)
{
return xpath_register_ns($this->xpath, $prefix, $uri);
}
 
function &evalXPath($xpath, $node = null)
{
if ($node) {
$result = @$this->xpath->xpath_eval($xpath, $node);
} else {
$result = @$this->xpath->xpath_eval($xpath);
}
 
if (!$result->nodeset) {
$n = array();
return $n;
}
 
return $result->nodeset;
}
 
function content($node)
{
if ($node) {
return $node->get_content();
}
}
 
function attributes($node)
{
if ($node) {
$arr = $node->attributes();
$result = array();
 
if ($arr) {
foreach ($arr as $attrnode) {
$result[$attrnode->name] = $attrnode->value;
}
}
 
return $result;
}
}
}
 
/**
* This concrete implementation of Services_Yadis_XMLParser implements
* the appropriate API for the 'dom' extension which is typically
* packaged with PHP 5. This class will be used whenever the 'dom'
* extension is detected. See the Services_Yadis_XMLParser class for
* details on this class's methods.
*
* @package Yadis
*/
class Services_Yadis_dom extends Services_Yadis_XMLParser {
function Services_Yadis_dom()
{
$this->xml = null;
$this->doc = null;
$this->xpath = null;
$this->errors = array();
}
 
function setXML($xml_string)
{
$this->xml = $xml_string;
$this->doc = new DOMDocument;
 
if (!$this->doc) {
return false;
}
 
if (!@$this->doc->loadXML($xml_string)) {
return false;
}
 
$this->xpath = new DOMXPath($this->doc);
 
if ($this->xpath) {
return true;
} else {
return false;
}
}
 
function registerNamespace($prefix, $uri)
{
return $this->xpath->registerNamespace($prefix, $uri);
}
 
function &evalXPath($xpath, $node = null)
{
if ($node) {
$result = @$this->xpath->query($xpath, $node);
} else {
$result = @$this->xpath->query($xpath);
}
 
$n = array();
 
for ($i = 0; $i < $result->length; $i++) {
$n[] = $result->item($i);
}
 
return $n;
}
 
function content($node)
{
if ($node) {
return $node->textContent;
}
}
 
function attributes($node)
{
if ($node) {
$arr = $node->attributes;
$result = array();
 
if ($arr) {
for ($i = 0; $i < $arr->length; $i++) {
$node = $arr->item($i);
$result[$node->nodeName] = $node->nodeValue;
}
}
 
return $result;
}
}
}
 
global $__Services_Yadis_defaultParser;
$__Services_Yadis_defaultParser = null;
 
/**
* Set a default parser to override the extension-driven selection of
* available parser classes. This is helpful in a test environment or
* one in which multiple parsers can be used but one is more
* desirable.
*
* @param Services_Yadis_XMLParser $parser An instance of a
* Services_Yadis_XMLParser subclass.
*/
function Services_Yadis_setDefaultParser(&$parser)
{
global $__Services_Yadis_defaultParser;
$__Services_Yadis_defaultParser =& $parser;
}
 
function Services_Yadis_getSupportedExtensions()
{
return array(
'dom' => array('classname' => 'Services_Yadis_dom',
'libname' => array('dom.so', 'dom.dll')),
'domxml' => array('classname' => 'Services_Yadis_domxml',
'libname' => array('domxml.so', 'php_domxml.dll')),
);
}
 
/**
* Returns an instance of a Services_Yadis_XMLParser subclass based on
* the availability of PHP extensions for XML parsing. If
* Services_Yadis_setDefaultParser has been called, the parser used in
* that call will be returned instead.
*/
function &Services_Yadis_getXMLParser()
{
global $__Services_Yadis_defaultParser;
 
if (isset($__Services_Yadis_defaultParser)) {
return $__Services_Yadis_defaultParser;
}
 
$p = null;
$classname = null;
 
$extensions = Services_Yadis_getSupportedExtensions();
 
// Return a wrapper for the resident implementation, if any.
foreach ($extensions as $name => $params) {
if (!extension_loaded($name)) {
foreach ($params['libname'] as $libname) {
if (@dl($libname)) {
$classname = $params['classname'];
}
}
} else {
$classname = $params['classname'];
}
if (isset($classname)) {
$p = new $classname();
return $p;
}
}
 
if (!isset($p)) {
trigger_error('No XML parser was found', E_USER_ERROR);
} else {
Services_Yadis_setDefaultParser($p);
}
 
return $p;
}
 
?>
/tags/v1.1-andromede/composants/openid/Services/Yadis/XRDS.php
New file
0,0 → 1,425
<?php
 
/**
* This module contains the XRDS parsing code.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package Yadis
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Require the XPath implementation.
*/
require_once 'Services/Yadis/XML.php';
 
/**
* This match mode means a given service must match ALL filters passed
* to the Services_Yadis_XRDS::services() call.
*/
define('SERVICES_YADIS_MATCH_ALL', 101);
 
/**
* This match mode means a given service must match ANY filters (at
* least one) passed to the Services_Yadis_XRDS::services() call.
*/
define('SERVICES_YADIS_MATCH_ANY', 102);
 
/**
* The priority value used for service elements with no priority
* specified.
*/
define('SERVICES_YADIS_MAX_PRIORITY', pow(2, 30));
 
function Services_Yadis_getNSMap()
{
return array('xrds' => 'xri://$xrds',
'xrd' => 'xri://$xrd*($v*2.0)');
}
 
/**
* @access private
*/
function Services_Yadis_array_scramble($arr)
{
$result = array();
 
while (count($arr)) {
$index = array_rand($arr, 1);
$result[] = $arr[$index];
unset($arr[$index]);
}
 
return $result;
}
 
/**
* This class represents a <Service> element in an XRDS document.
* Objects of this type are returned by
* Services_Yadis_XRDS::services() and
* Services_Yadis_Yadis::services(). Each object corresponds directly
* to a <Service> element in the XRDS and supplies a
* getElements($name) method which you should use to inspect the
* element's contents. See {@link Services_Yadis_Yadis} for more
* information on the role this class plays in Yadis discovery.
*
* @package Yadis
*/
class Services_Yadis_Service {
 
/**
* Creates an empty service object.
*/
function Services_Yadis_Service()
{
$this->element = null;
$this->parser = null;
}
 
/**
* Return the URIs in the "Type" elements, if any, of this Service
* element.
*
* @return array $type_uris An array of Type URI strings.
*/
function getTypes()
{
$t = array();
foreach ($this->getElements('xrd:Type') as $elem) {
$c = $this->parser->content($elem);
if ($c) {
$t[] = $c;
}
}
return $t;
}
 
/**
* Return the URIs in the "URI" elements, if any, of this Service
* element. The URIs are returned sorted in priority order.
*
* @return array $uris An array of URI strings.
*/
function getURIs()
{
$uris = array();
$last = array();
 
foreach ($this->getElements('xrd:URI') as $elem) {
$uri_string = $this->parser->content($elem);
$attrs = $this->parser->attributes($elem);
if ($attrs &&
array_key_exists('priority', $attrs)) {
$priority = intval($attrs['priority']);
if (!array_key_exists($priority, $uris)) {
$uris[$priority] = array();
}
 
$uris[$priority][] = $uri_string;
} else {
$last[] = $uri_string;
}
}
 
$keys = array_keys($uris);
sort($keys);
 
// Rebuild array of URIs.
$result = array();
foreach ($keys as $k) {
$new_uris = Services_Yadis_array_scramble($uris[$k]);
$result = array_merge($result, $new_uris);
}
 
$result = array_merge($result,
Services_Yadis_array_scramble($last));
 
return $result;
}
 
/**
* Returns the "priority" attribute value of this <Service>
* element, if the attribute is present. Returns null if not.
*
* @return mixed $result Null or integer, depending on whether
* this Service element has a 'priority' attribute.
*/
function getPriority()
{
$attributes = $this->parser->attributes($this->element);
 
if (array_key_exists('priority', $attributes)) {
return intval($attributes['priority']);
}
 
return null;
}
 
/**
* Used to get XML elements from this object's <Service> element.
*
* This is what you should use to get all custom information out
* of this element. This is used by service filter functions to
* determine whether a service element contains specific tags,
* etc. NOTE: this only considers elements which are direct
* children of the <Service> element for this object.
*
* @param string $name The name of the element to look for
* @return array $list An array of elements with the specified
* name which are direct children of the <Service> element. The
* nodes returned by this function can be passed to $this->parser
* methods (see {@link Services_Yadis_XMLParser}).
*/
function getElements($name)
{
return $this->parser->evalXPath($name, $this->element);
}
}
 
/**
* This class performs parsing of XRDS documents.
*
* You should not instantiate this class directly; rather, call
* parseXRDS statically:
*
* <pre> $xrds = Services_Yadis_XRDS::parseXRDS($xml_string);</pre>
*
* If the XRDS can be parsed and is valid, an instance of
* Services_Yadis_XRDS will be returned. Otherwise, null will be
* returned. This class is used by the Services_Yadis_Yadis::discover
* method.
*
* @package Yadis
*/
class Services_Yadis_XRDS {
 
/**
* Instantiate a Services_Yadis_XRDS object. Requires an XPath
* instance which has been used to parse a valid XRDS document.
*/
function Services_Yadis_XRDS(&$xmlParser, &$xrdNodes)
{
$this->parser =& $xmlParser;
$this->xrdNode = $xrdNodes[count($xrdNodes) - 1];
$this->allXrdNodes =& $xrdNodes;
$this->serviceList = array();
$this->_parse();
}
 
/**
* Parse an XML string (XRDS document) and return either a
* Services_Yadis_XRDS object or null, depending on whether the
* XRDS XML is valid.
*
* @param string $xml_string An XRDS XML string.
* @return mixed $xrds An instance of Services_Yadis_XRDS or null,
* depending on the validity of $xml_string
*/
function &parseXRDS($xml_string, $extra_ns_map = null)
{
$_null = null;
 
if (!$xml_string) {
return $_null;
}
 
$parser = Services_Yadis_getXMLParser();
 
$ns_map = Services_Yadis_getNSMap();
 
if ($extra_ns_map && is_array($extra_ns_map)) {
$ns_map = array_merge($ns_map, $extra_ns_map);
}
 
if (!($parser && $parser->init($xml_string, $ns_map))) {
return $_null;
}
 
// Try to get root element.
$root = $parser->evalXPath('/xrds:XRDS[1]');
if (!$root) {
return $_null;
}
 
if (is_array($root)) {
$root = $root[0];
}
 
$attrs = $parser->attributes($root);
 
if (array_key_exists('xmlns:xrd', $attrs) &&
$attrs['xmlns:xrd'] != 'xri://$xrd*($v*2.0)') {
return $_null;
} else if (array_key_exists('xmlns', $attrs) &&
preg_match('/xri/', $attrs['xmlns']) &&
$attrs['xmlns'] != 'xri://$xrd*($v*2.0)') {
return $_null;
}
 
// Get the last XRD node.
$xrd_nodes = $parser->evalXPath('/xrds:XRDS[1]/xrd:XRD');
 
if (!$xrd_nodes) {
return $_null;
}
 
$xrds = new Services_Yadis_XRDS($parser, $xrd_nodes);
return $xrds;
}
 
/**
* @access private
*/
function _addService($priority, $service)
{
$priority = intval($priority);
 
if (!array_key_exists($priority, $this->serviceList)) {
$this->serviceList[$priority] = array();
}
 
$this->serviceList[$priority][] = $service;
}
 
/**
* Creates the service list using nodes from the XRDS XML
* document.
*
* @access private
*/
function _parse()
{
$this->serviceList = array();
 
$services = $this->parser->evalXPath('xrd:Service', $this->xrdNode);
 
foreach ($services as $node) {
$s =& new Services_Yadis_Service();
$s->element = $node;
$s->parser =& $this->parser;
 
$priority = $s->getPriority();
 
if ($priority === null) {
$priority = SERVICES_YADIS_MAX_PRIORITY;
}
 
$this->_addService($priority, $s);
}
}
 
/**
* Returns a list of service objects which correspond to <Service>
* elements in the XRDS XML document for this object.
*
* Optionally, an array of filter callbacks may be given to limit
* the list of returned service objects. Furthermore, the default
* mode is to return all service objects which match ANY of the
* specified filters, but $filter_mode may be
* SERVICES_YADIS_MATCH_ALL if you want to be sure that the
* returned services match all the given filters. See {@link
* Services_Yadis_Yadis} for detailed usage information on filter
* functions.
*
* @param mixed $filters An array of callbacks to filter the
* returned services, or null if all services are to be returned.
* @param integer $filter_mode SERVICES_YADIS_MATCH_ALL or
* SERVICES_YADIS_MATCH_ANY, depending on whether the returned
* services should match ALL or ANY of the specified filters,
* respectively.
* @return mixed $services An array of {@link
* Services_Yadis_Service} objects if $filter_mode is a valid
* mode; null if $filter_mode is an invalid mode (i.e., not
* SERVICES_YADIS_MATCH_ANY or SERVICES_YADIS_MATCH_ALL).
*/
function services($filters = null,
$filter_mode = SERVICES_YADIS_MATCH_ANY)
{
 
$pri_keys = array_keys($this->serviceList);
sort($pri_keys, SORT_NUMERIC);
 
// If no filters are specified, return the entire service
// list, ordered by priority.
if (!$filters ||
(!is_array($filters))) {
 
$result = array();
foreach ($pri_keys as $pri) {
$result = array_merge($result, $this->serviceList[$pri]);
}
 
return $result;
}
 
// If a bad filter mode is specified, return null.
if (!in_array($filter_mode, array(SERVICES_YADIS_MATCH_ANY,
SERVICES_YADIS_MATCH_ALL))) {
return null;
}
 
// Otherwise, use the callbacks in the filter list to
// determine which services are returned.
$filtered = array();
 
foreach ($pri_keys as $priority_value) {
$service_obj_list = $this->serviceList[$priority_value];
 
foreach ($service_obj_list as $service) {
 
$matches = 0;
 
foreach ($filters as $filter) {
if (call_user_func_array($filter, array($service))) {
$matches++;
 
if ($filter_mode == SERVICES_YADIS_MATCH_ANY) {
$pri = $service->getPriority();
if ($pri === null) {
$pri = SERVICES_YADIS_MAX_PRIORITY;
}
 
if (!array_key_exists($pri, $filtered)) {
$filtered[$pri] = array();
}
 
$filtered[$pri][] = $service;
break;
}
}
}
 
if (($filter_mode == SERVICES_YADIS_MATCH_ALL) &&
($matches == count($filters))) {
 
$pri = $service->getPriority();
if ($pri === null) {
$pri = SERVICES_YADIS_MAX_PRIORITY;
}
 
if (!array_key_exists($pri, $filtered)) {
$filtered[$pri] = array();
}
$filtered[$pri][] = $service;
}
}
}
 
$pri_keys = array_keys($filtered);
sort($pri_keys, SORT_NUMERIC);
 
$result = array();
foreach ($pri_keys as $pri) {
$result = array_merge($result, $filtered[$pri]);
}
 
return $result;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/OpenId.php
New file
0,0 → 1,85
<? // fichiers inclus
require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";
 
// démarrage de la session (requis pour YADIS)
session_start();
 
// crée une zone de stockage pour les données OpenID
$store = new Auth_OpenID_FileStore('./oid_store');
 
// crée un consommateur OpenID
$consumer = new Auth_OpenID_Consumer($store);
 
// commence le process d'authentification
// crée une requête d'authentification pour le fournisseur OpenID
$auth = $consumer->begin($_POST['id']);
if (!$auth) {
die("ERROR: Entrez un OpenID valide svp.");
}
 
// redirige vers le fournisseur OpenID pour l'authentification
$url = $auth->redirectURL('http://consumer.example.com/', 'http://consumer.example.com/oid_return.php');
header('Location: ' . $url);
 
// fichiers inclus
require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";
require_once "Auth/OpenID/SReg.php";
 
// démarrage de session (requis pour YADIS)
session_start();
 
// crée une zone de stockage pour les données OpenID
$store = new Auth_OpenID_FileStore('./oid_store');
 
// crée un consommateur OpenID
// lit la réponse depuis e fournisseur OPenID
$consumer = new Auth_OpenID_Consumer($store);
$response = $consumer->complete('http://consumer.example.com/oid_return.php');
 
// crée une variable de session qui dépend de l'authentification
if ($response->status == Auth_OpenID_SUCCESS) {
$_SESSION['OPENID_AUTH'] = true;
 
// récupère les informations d'enregistrement
$sreg = new Auth_OpenID_SRegResponse();
$obj = $sreg->fromSuccessResponse($response);
$data = $obj->contents();
 
if (isset($data['email'])) {
// Si l'adresse mail est disponible
// Vérifie si l'utilisateur a déjà un compte sur le système
 
// ouvre une connexion a la base
$conn = mysql_connect('localhost', 'user', 'pass') or die('ERROR: Connexion serveur impossible');
mysql_select_db('test') or die('ERROR: Impossible de sélectionner une base');
 
// exécute la requête
$result = mysql_query("SELECT DISTINCT COUNT(*) FROM users WHERE email = '" . $data['email'] . "'") or die('ERROR: La requête ne peut pas être exécutée');
 
$row = mysql_fetch_array($result);
if ($row[0] == 1) {
// si oui affiche un message personnalisé
$newUser = false;
echo 'Bonjour et bienvenue, ' . $data['email'];
exit();
} else {
// si non avertit que l'utilisateur est nouveau
$newUser = true;
}
 
// ferme la connexion
mysql_free_result($result);
mysql_close($conn);
} else {
// si l'adresse email n'est pas disponible
// avertit que l'utilisateur est nouveau
$newUser = true;
}
} else {
$_SESSION['OPENID_AUTH'] = false;
die ('Vous n'avez pas la permission d'accéder a cette page! Re-loggez vous svp.');
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID.php
New file
0,0 → 1,412
<?php
 
/**
* This is the PHP OpenID library by JanRain, Inc.
*
* This module contains core utility functionality used by the
* library. See Consumer.php and Server.php for the consumer and
* server implementations.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Require the fetcher code.
*/
require_once "Services/Yadis/PlainHTTPFetcher.php";
require_once "Services/Yadis/ParanoidHTTPFetcher.php";
require_once "Auth/OpenID/BigMath.php";
 
/**
* Status code returned by the server when the only option is to show
* an error page, since we do not have enough information to redirect
* back to the consumer. The associated value is an error message that
* should be displayed on an HTML error page.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_LOCAL_ERROR', 'local_error');
 
/**
* Status code returned when there is an error to return in key-value
* form to the consumer. The caller should return a 400 Bad Request
* response with content-type text/plain and the value as the body.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_REMOTE_ERROR', 'remote_error');
 
/**
* Status code returned when there is a key-value form OK response to
* the consumer. The value associated with this code is the
* response. The caller should return a 200 OK response with
* content-type text/plain and the value as the body.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_REMOTE_OK', 'remote_ok');
 
/**
* Status code returned when there is a redirect back to the
* consumer. The value is the URL to redirect back to. The caller
* should return a 302 Found redirect with a Location: header
* containing the URL.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_REDIRECT', 'redirect');
 
/**
* Status code returned when the caller needs to authenticate the
* user. The associated value is a {@link Auth_OpenID_ServerRequest}
* object that can be used to complete the authentication. If the user
* has taken some authentication action, use the retry() method of the
* {@link Auth_OpenID_ServerRequest} object to complete the request.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_DO_AUTH', 'do_auth');
 
/**
* Status code returned when there were no OpenID arguments
* passed. This code indicates that the caller should return a 200 OK
* response and display an HTML page that says that this is an OpenID
* server endpoint.
*
* @see Auth_OpenID_Server
*/
define('Auth_OpenID_DO_ABOUT', 'do_about');
 
/**
* Defines for regexes and format checking.
*/
define('Auth_OpenID_letters',
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
 
define('Auth_OpenID_digits',
"0123456789");
 
define('Auth_OpenID_punct',
"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");
 
if (Auth_OpenID_getMathLib() === null) {
define('Auth_OpenID_NO_MATH_SUPPORT', true);
}
 
/**
* The OpenID utility function class.
*
* @package OpenID
* @access private
*/
class Auth_OpenID {
 
/**
* These namespaces are automatically fixed in query arguments by
* Auth_OpenID::fixArgs.
*/
function getOpenIDNamespaces()
{
return array('openid',
'sreg');
}
 
/**
* Rename query arguments back to 'openid.' from 'openid_'
*
* @access private
* @param array $args An associative array of URL query arguments
*/
function fixArgs($args)
{
foreach (array_keys($args) as $key) {
$fixed = $key;
if (preg_match('/^openid/', $key)) {
foreach (Auth_OpenID::getOpenIDNamespaces() as $ns) {
if (preg_match('/'.$ns.'_/', $key)) {
$fixed = preg_replace('/'.$ns.'_/', $ns.'.', $fixed);
}
}
 
if ($fixed != $key) {
$val = $args[$key];
unset($args[$key]);
$args[$fixed] = $val;
}
}
}
 
return $args;
}
 
/**
* Create dir_name as a directory if it does not exist. If it
* exists, make sure that it is, in fact, a directory. Returns
* true if the operation succeeded; false if not.
*
* @access private
*/
function ensureDir($dir_name)
{
if (is_dir($dir_name) || @mkdir($dir_name)) {
return true;
} else {
if (Auth_OpenID::ensureDir(dirname($dir_name))) {
return is_dir($dir_name) || @mkdir($dir_name);
} else {
return false;
}
}
}
 
/**
* Convenience function for getting array values.
*
* @access private
*/
function arrayGet($arr, $key, $fallback = null)
{
if (is_array($arr)) {
if (array_key_exists($key, $arr)) {
return $arr[$key];
} else {
return $fallback;
}
} else {
trigger_error("Auth_OpenID::arrayGet expected " .
"array as first parameter", E_USER_WARNING);
return false;
}
}
 
/**
* Implements the PHP 5 'http_build_query' functionality.
*
* @access private
* @param array $data Either an array key/value pairs or an array
* of arrays, each of which holding two values: a key and a value,
* sequentially.
* @return string $result The result of url-encoding the key/value
* pairs from $data into a URL query string
* (e.g. "username=bob&id=56").
*/
function httpBuildQuery($data)
{
$pairs = array();
foreach ($data as $key => $value) {
if (is_array($value)) {
$pairs[] = urlencode($value[0])."=".urlencode($value[1]);
} else {
$pairs[] = urlencode($key)."=".urlencode($value);
}
}
return implode("&", $pairs);
}
 
/**
* "Appends" query arguments onto a URL. The URL may or may not
* already have arguments (following a question mark).
*
* @param string $url A URL, which may or may not already have
* arguments.
* @param array $args Either an array key/value pairs or an array of
* arrays, each of which holding two values: a key and a value,
* sequentially. If $args is an ordinary key/value array, the
* parameters will be added to the URL in sorted alphabetical order;
* if $args is an array of arrays, their order will be preserved.
* @return string $url The original URL with the new parameters added.
*
*/
function appendArgs($url, $args)
{
if (count($args) == 0) {
return $url;
}
 
// Non-empty array; if it is an array of arrays, use
// multisort; otherwise use sort.
if (array_key_exists(0, $args) &&
is_array($args[0])) {
// Do nothing here.
} else {
$keys = array_keys($args);
sort($keys);
$new_args = array();
foreach ($keys as $key) {
$new_args[] = array($key, $args[$key]);
}
$args = $new_args;
}
 
$sep = '?';
if (strpos($url, '?') !== false) {
$sep = '&';
}
 
return $url . $sep . Auth_OpenID::httpBuildQuery($args);
}
 
/**
* Turn a string into an ASCII string.
*
* Replace non-ascii characters with a %-encoded, UTF-8
* encoding. This function will fail if the input is a string and
* there are non-7-bit-safe characters. It is assumed that the
* caller will have already translated the input into a Unicode
* character sequence, according to the encoding of the HTTP POST
* or GET.
*
* Do not escape anything that is already 7-bit safe, so we do the
* minimal transform on the identity URL
*
* @access private
*/
function quoteMinimal($s)
{
$res = array();
for ($i = 0; $i < strlen($s); $i++) {
$c = $s[$i];
if ($c >= "\x80") {
for ($j = 0; $j < count(utf8_encode($c)); $j++) {
array_push($res, sprintf("%02X", ord($c[$j])));
}
} else {
array_push($res, $c);
}
}
return implode('', $res);
}
 
/**
* Implements python's urlunparse, which is not available in PHP.
* Given the specified components of a URL, this function rebuilds
* and returns the URL.
*
* @access private
* @param string $scheme The scheme (e.g. 'http'). Defaults to 'http'.
* @param string $host The host. Required.
* @param string $port The port.
* @param string $path The path.
* @param string $query The query.
* @param string $fragment The fragment.
* @return string $url The URL resulting from assembling the
* specified components.
*/
function urlunparse($scheme, $host, $port = null, $path = '/',
$query = '', $fragment = '')
{
 
if (!$scheme) {
$scheme = 'http';
}
 
if (!$host) {
return false;
}
 
if (!$path) {
$path = '/';
}
 
$result = $scheme . "://" . $host;
 
if ($port) {
$result .= ":" . $port;
}
 
$result .= $path;
 
if ($query) {
$result .= "?" . $query;
}
 
if ($fragment) {
$result .= "#" . $fragment;
}
 
return $result;
}
 
/**
* Given a URL, this "normalizes" it by adding a trailing slash
* and / or a leading http:// scheme where necessary. Returns
* null if the original URL is malformed and cannot be normalized.
*
* @access private
* @param string $url The URL to be normalized.
* @return mixed $new_url The URL after normalization, or null if
* $url was malformed.
*/
function normalizeUrl($url)
{
if ($url === null) {
return null;
}
 
assert(is_string($url));
 
$old_url = $url;
$url = trim($url);
 
if (strpos($url, "://") === false) {
$url = "http://" . $url;
}
 
$parsed = @parse_url($url);
 
if ($parsed === false) {
return null;
}
 
$defaults = array(
'scheme' => '',
'host' => '',
'path' => '',
'query' => '',
'fragment' => '',
'port' => ''
);
 
$parsed = array_merge($defaults, $parsed);
 
if (($parsed['scheme'] == '') ||
($parsed['host'] == '')) {
if ($parsed['path'] == '' &&
$parsed['query'] == '' &&
$parsed['fragment'] == '') {
return null;
}
 
$url = 'http://' + $url;
$parsed = parse_url($url);
 
$parsed = array_merge($defaults, $parsed);
}
 
$tail = array_map(array('Auth_OpenID', 'quoteMinimal'),
array($parsed['path'],
$parsed['query'],
$parsed['fragment']));
if ($tail[0] == '') {
$tail[0] = '/';
}
 
$url = Auth_OpenID::urlunparse($parsed['scheme'], $parsed['host'],
$parsed['port'], $tail[0], $tail[1],
$tail[2]);
 
assert(is_string($url));
 
return $url;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Parse.php
New file
0,0 → 1,308
<?php
 
/**
* This module implements a VERY limited parser that finds <link> tags
* in the head of HTML or XHTML documents and parses out their
* attributes according to the OpenID spec. It is a liberal parser,
* but it requires these things from the data in order to work:
*
* - There must be an open <html> tag
*
* - There must be an open <head> tag inside of the <html> tag
*
* - Only <link>s that are found inside of the <head> tag are parsed
* (this is by design)
*
* - The parser follows the OpenID specification in resolving the
* attributes of the link tags. This means that the attributes DO
* NOT get resolved as they would by an XML or HTML parser. In
* particular, only certain entities get replaced, and href
* attributes do not get resolved relative to a base URL.
*
* From http://openid.net/specs.bml:
*
* - The openid.server URL MUST be an absolute URL. OpenID consumers
* MUST NOT attempt to resolve relative URLs.
*
* - The openid.server URL MUST NOT include entities other than &amp;,
* &lt;, &gt;, and &quot;.
*
* The parser ignores SGML comments and <![CDATA[blocks]]>. Both kinds
* of quoting are allowed for attributes.
*
* The parser deals with invalid markup in these ways:
*
* - Tag names are not case-sensitive
*
* - The <html> tag is accepted even when it is not at the top level
*
* - The <head> tag is accepted even when it is not a direct child of
* the <html> tag, but a <html> tag must be an ancestor of the
* <head> tag
*
* - <link> tags are accepted even when they are not direct children
* of the <head> tag, but a <head> tag must be an ancestor of the
* <link> tag
*
* - If there is no closing tag for an open <html> or <head> tag, the
* remainder of the document is viewed as being inside of the
* tag. If there is no closing tag for a <link> tag, the link tag is
* treated as a short tag. Exceptions to this rule are that <html>
* closes <html> and <body> or <head> closes <head>
*
* - Attributes of the <link> tag are not required to be quoted.
*
* - In the case of duplicated attribute names, the attribute coming
* last in the tag will be the value returned.
*
* - Any text that does not parse as an attribute within a link tag
* will be ignored. (e.g. <link pumpkin rel='openid.server' /> will
* ignore pumpkin)
*
* - If there are more than one <html> or <head> tag, the parser only
* looks inside of the first one.
*
* - The contents of <script> tags are ignored entirely, except
* unclosed <script> tags. Unclosed <script> tags are ignored.
*
* - Any other invalid markup is ignored, including unclosed SGML
* comments and unclosed <![CDATA[blocks.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Require Auth_OpenID::arrayGet().
*/
require_once "Auth/OpenID.php";
 
class Auth_OpenID_Parse {
 
/**
* Specify some flags for use with regex matching.
*/
var $_re_flags = "si";
 
/**
* Stuff to remove before we start looking for tags
*/
var $_removed_re =
"<!--.*?-->|<!\[CDATA\[.*?\]\]>|<script\b(?!:)[^>]*>.*?<\/script>";
 
/**
* Starts with the tag name at a word boundary, where the tag name
* is not a namespace
*/
var $_tag_expr = "<%s\b(?!:)([^>]*?)(?:\/>|>(.*?)(?:<\/?%s\s*>|\Z))";
 
var $_attr_find = '\b(\w+)=("[^"]*"|\'[^\']*\'|[^\'"\s\/<>]+)';
 
function Auth_OpenID_Parse()
{
$this->_link_find = sprintf("/<link\b(?!:)([^>]*)(?!<)>/%s",
$this->_re_flags);
 
$this->_entity_replacements = array(
'amp' => '&',
'lt' => '<',
'gt' => '>',
'quot' => '"'
);
 
$this->_attr_find = sprintf("/%s/%s",
$this->_attr_find,
$this->_re_flags);
 
$this->_removed_re = sprintf("/%s/%s",
$this->_removed_re,
$this->_re_flags);
 
$this->_ent_replace =
sprintf("&(%s);", implode("|",
$this->_entity_replacements));
}
 
/**
* Returns a regular expression that will match a given tag in an
* SGML string.
*/
function tagMatcher($tag_name, $close_tags = null)
{
if ($close_tags) {
$options = implode("|", array_merge(array($tag_name), $close_tags));
$closer = sprintf("(?:%s)", $options);
} else {
$closer = $tag_name;
}
 
$expr = sprintf($this->_tag_expr, $tag_name, $closer);
return sprintf("/%s/%s", $expr, $this->_re_flags);
}
 
function htmlFind()
{
return $this->tagMatcher('html');
}
 
function headFind()
{
return $this->tagMatcher('head', array('body'));
}
 
function replaceEntities($str)
{
foreach ($this->_entity_replacements as $old => $new) {
$str = preg_replace(sprintf("/&%s;/", $old), $new, $str);
}
return $str;
}
 
function removeQuotes($str)
{
$matches = array();
$double = '/^"(.*)"$/';
$single = "/^\'(.*)\'$/";
 
if (preg_match($double, $str, $matches)) {
return $matches[1];
} else if (preg_match($single, $str, $matches)) {
return $matches[1];
} else {
return $str;
}
}
 
/**
* Find all link tags in a string representing a HTML document and
* return a list of their attributes.
*
* @param string $html The text to parse
* @return array $list An array of arrays of attributes, one for each
* link tag
*/
function parseLinkAttrs($html)
{
$stripped = preg_replace($this->_removed_re,
"",
$html);
 
// Try to find the <HTML> tag.
$html_re = $this->htmlFind();
$html_matches = array();
if (!preg_match($html_re, $stripped, $html_matches)) {
return array();
}
 
// Try to find the <HEAD> tag.
$head_re = $this->headFind();
$head_matches = array();
if (!preg_match($head_re, $html_matches[0], $head_matches)) {
return array();
}
 
$link_data = array();
$link_matches = array();
 
if (!preg_match_all($this->_link_find, $head_matches[0],
$link_matches)) {
return array();
}
 
foreach ($link_matches[0] as $link) {
$attr_matches = array();
preg_match_all($this->_attr_find, $link, $attr_matches);
$link_attrs = array();
foreach ($attr_matches[0] as $index => $full_match) {
$name = $attr_matches[1][$index];
$value = $this->replaceEntities(
$this->removeQuotes($attr_matches[2][$index]));
 
$link_attrs[strtolower($name)] = $value;
}
$link_data[] = $link_attrs;
}
 
return $link_data;
}
 
function relMatches($rel_attr, $target_rel)
{
// Does this target_rel appear in the rel_str?
// XXX: TESTME
$rels = preg_split("/\s+/", trim($rel_attr));
foreach ($rels as $rel) {
$rel = strtolower($rel);
if ($rel == $target_rel) {
return 1;
}
}
 
return 0;
}
 
function linkHasRel($link_attrs, $target_rel)
{
// Does this link have target_rel as a relationship?
// XXX: TESTME
$rel_attr = Auth_OpeniD::arrayGet($link_attrs, 'rel', null);
return ($rel_attr && $this->relMatches($rel_attr,
$target_rel));
}
 
function findLinksRel($link_attrs_list, $target_rel)
{
// Filter the list of link attributes on whether it has
// target_rel as a relationship.
// XXX: TESTME
$result = array();
foreach ($link_attrs_list as $attr) {
if ($this->linkHasRel($attr, $target_rel)) {
$result[] = $attr;
}
}
 
return $result;
}
 
function findFirstHref($link_attrs_list, $target_rel)
{
// Return the value of the href attribute for the first link
// tag in the list that has target_rel as a relationship.
// XXX: TESTME
$matches = $this->findLinksRel($link_attrs_list,
$target_rel);
if (!$matches) {
return null;
}
$first = $matches[0];
return Auth_OpenID::arrayGet($first, 'href', null);
}
}
 
function Auth_OpenID_legacy_discover($html_text)
{
$p = new Auth_OpenID_Parse();
 
$link_attrs = $p->parseLinkAttrs($html_text);
 
$server_url = $p->findFirstHref($link_attrs,
'openid.server');
 
if ($server_url === null) {
return false;
} else {
$delegate_url = $p->findFirstHref($link_attrs,
'openid.delegate');
return array($delegate_url, $server_url);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/BigMath.php
New file
0,0 → 1,444
<?php
 
/**
* BigMath: A math library wrapper that abstracts out the underlying
* long integer library.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Needed for random number generation
*/
require_once 'Auth/OpenID/CryptUtil.php';
 
/**
* The superclass of all big-integer math implementations
* @access private
* @package OpenID
*/
class Auth_OpenID_MathLibrary {
/**
* Given a long integer, returns the number converted to a binary
* string. This function accepts long integer values of arbitrary
* magnitude and uses the local large-number math library when
* available.
*
* @param integer $long The long number (can be a normal PHP
* integer or a number created by one of the available long number
* libraries)
* @return string $binary The binary version of $long
*/
function longToBinary($long)
{
$cmp = $this->cmp($long, 0);
if ($cmp < 0) {
$msg = __FUNCTION__ . " takes only positive integers.";
trigger_error($msg, E_USER_ERROR);
return null;
}
 
if ($cmp == 0) {
return "\x00";
}
 
$bytes = array();
 
while ($this->cmp($long, 0) > 0) {
array_unshift($bytes, $this->mod($long, 256));
$long = $this->div($long, pow(2, 8));
}
 
if ($bytes && ($bytes[0] > 127)) {
array_unshift($bytes, 0);
}
 
$string = '';
foreach ($bytes as $byte) {
$string .= pack('C', $byte);
}
 
return $string;
}
 
/**
* Given a binary string, returns the binary string converted to a
* long number.
*
* @param string $binary The binary version of a long number,
* probably as a result of calling longToBinary
* @return integer $long The long number equivalent of the binary
* string $str
*/
function binaryToLong($str)
{
if ($str === null) {
return null;
}
 
// Use array_merge to return a zero-indexed array instead of a
// one-indexed array.
$bytes = array_merge(unpack('C*', $str));
 
$n = $this->init(0);
 
if ($bytes && ($bytes[0] > 127)) {
trigger_error("bytesToNum works only for positive integers.",
E_USER_WARNING);
return null;
}
 
foreach ($bytes as $byte) {
$n = $this->mul($n, pow(2, 8));
$n = $this->add($n, $byte);
}
 
return $n;
}
 
function base64ToLong($str)
{
$b64 = base64_decode($str);
 
if ($b64 === false) {
return false;
}
 
return $this->binaryToLong($b64);
}
 
function longToBase64($str)
{
return base64_encode($this->longToBinary($str));
}
 
/**
* Returns a random number in the specified range. This function
* accepts $start, $stop, and $step values of arbitrary magnitude
* and will utilize the local large-number math library when
* available.
*
* @param integer $start The start of the range, or the minimum
* random number to return
* @param integer $stop The end of the range, or the maximum
* random number to return
* @param integer $step The step size, such that $result - ($step
* * N) = $start for some N
* @return integer $result The resulting randomly-generated number
*/
function rand($stop)
{
static $duplicate_cache = array();
 
// Used as the key for the duplicate cache
$rbytes = $this->longToBinary($stop);
 
if (array_key_exists($rbytes, $duplicate_cache)) {
list($duplicate, $nbytes) = $duplicate_cache[$rbytes];
} else {
if ($rbytes[0] == "\x00") {
$nbytes = strlen($rbytes) - 1;
} else {
$nbytes = strlen($rbytes);
}
 
$mxrand = $this->pow(256, $nbytes);
 
// If we get a number less than this, then it is in the
// duplicated range.
$duplicate = $this->mod($mxrand, $stop);
 
if (count($duplicate_cache) > 10) {
$duplicate_cache = array();
}
 
$duplicate_cache[$rbytes] = array($duplicate, $nbytes);
}
 
do {
$bytes = "\x00" . Auth_OpenID_CryptUtil::getBytes($nbytes);
$n = $this->binaryToLong($bytes);
// Keep looping if this value is in the low duplicated range
} while ($this->cmp($n, $duplicate) < 0);
 
return $this->mod($n, $stop);
}
}
 
/**
* Exposes BCmath math library functionality.
*
* {@link Auth_OpenID_BcMathWrapper} wraps the functionality provided
* by the BCMath extension.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_BcMathWrapper extends Auth_OpenID_MathLibrary{
var $type = 'bcmath';
 
function add($x, $y)
{
return bcadd($x, $y);
}
 
function sub($x, $y)
{
return bcsub($x, $y);
}
 
function pow($base, $exponent)
{
return bcpow($base, $exponent);
}
 
function cmp($x, $y)
{
return bccomp($x, $y);
}
 
function init($number, $base = 10)
{
return $number;
}
 
function mod($base, $modulus)
{
return bcmod($base, $modulus);
}
 
function mul($x, $y)
{
return bcmul($x, $y);
}
 
function div($x, $y)
{
return bcdiv($x, $y);
}
 
/**
* Same as bcpowmod when bcpowmod is missing
*
* @access private
*/
function _powmod($base, $exponent, $modulus)
{
$square = $this->mod($base, $modulus);
$result = 1;
while($this->cmp($exponent, 0) > 0) {
if ($this->mod($exponent, 2)) {
$result = $this->mod($this->mul($result, $square), $modulus);
}
$square = $this->mod($this->mul($square, $square), $modulus);
$exponent = $this->div($exponent, 2);
}
return $result;
}
 
function powmod($base, $exponent, $modulus)
{
if (function_exists('bcpowmod')) {
return bcpowmod($base, $exponent, $modulus);
} else {
return $this->_powmod($base, $exponent, $modulus);
}
}
 
function toString($num)
{
return $num;
}
}
 
/**
* Exposes GMP math library functionality.
*
* {@link Auth_OpenID_GmpMathWrapper} wraps the functionality provided
* by the GMP extension.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_GmpMathWrapper extends Auth_OpenID_MathLibrary{
var $type = 'gmp';
 
function add($x, $y)
{
return gmp_add($x, $y);
}
 
function sub($x, $y)
{
return gmp_sub($x, $y);
}
 
function pow($base, $exponent)
{
return gmp_pow($base, $exponent);
}
 
function cmp($x, $y)
{
return gmp_cmp($x, $y);
}
 
function init($number, $base = 10)
{
return gmp_init($number, $base);
}
 
function mod($base, $modulus)
{
return gmp_mod($base, $modulus);
}
 
function mul($x, $y)
{
return gmp_mul($x, $y);
}
 
function div($x, $y)
{
return gmp_div_q($x, $y);
}
 
function powmod($base, $exponent, $modulus)
{
return gmp_powm($base, $exponent, $modulus);
}
 
function toString($num)
{
return gmp_strval($num);
}
}
 
/**
* Define the supported extensions. An extension array has keys
* 'modules', 'extension', and 'class'. 'modules' is an array of PHP
* module names which the loading code will attempt to load. These
* values will be suffixed with a library file extension (e.g. ".so").
* 'extension' is the name of a PHP extension which will be tested
* before 'modules' are loaded. 'class' is the string name of a
* {@link Auth_OpenID_MathWrapper} subclass which should be
* instantiated if a given extension is present.
*
* You can define new math library implementations and add them to
* this array.
*/
global $_Auth_OpenID_math_extensions;
$_Auth_OpenID_math_extensions = array(
array('modules' => array('gmp', 'php_gmp'),
'extension' => 'gmp',
'class' => 'Auth_OpenID_GmpMathWrapper'),
array('modules' => array('bcmath', 'php_bcmath'),
'extension' => 'bcmath',
'class' => 'Auth_OpenID_BcMathWrapper')
);
 
/**
* Detect which (if any) math library is available
*/
function Auth_OpenID_detectMathLibrary($exts)
{
$loaded = false;
 
foreach ($exts as $extension) {
// See if the extension specified is already loaded.
if ($extension['extension'] &&
extension_loaded($extension['extension'])) {
$loaded = true;
}
 
// Try to load dynamic modules.
if (!$loaded) {
foreach ($extension['modules'] as $module) {
if (@dl($module . "." . PHP_SHLIB_SUFFIX)) {
$loaded = true;
break;
}
}
}
 
// If the load succeeded, supply an instance of
// Auth_OpenID_MathWrapper which wraps the specified
// module's functionality.
if ($loaded) {
return $extension;
}
}
 
return false;
}
 
/**
* {@link Auth_OpenID_getMathLib} checks for the presence of long
* number extension modules and returns an instance of
* {@link Auth_OpenID_MathWrapper} which exposes the module's
* functionality.
*
* Checks for the existence of an extension module described by the
* local {@link Auth_OpenID_math_extensions} array and returns an
* instance of a wrapper for that extension module. If no extension
* module is found, an instance of {@link Auth_OpenID_MathWrapper} is
* returned, which wraps the native PHP integer implementation. The
* proper calling convention for this method is $lib =&
* Auth_OpenID_getMathLib().
*
* This function checks for the existence of specific long number
* implementations in the following order: GMP followed by BCmath.
*
* @return Auth_OpenID_MathWrapper $instance An instance of
* {@link Auth_OpenID_MathWrapper} or one of its subclasses
*
* @package OpenID
*/
function &Auth_OpenID_getMathLib()
{
// The instance of Auth_OpenID_MathWrapper that we choose to
// supply will be stored here, so that subseqent calls to this
// method will return a reference to the same object.
static $lib = null;
 
if (isset($lib)) {
return $lib;
}
 
if (defined('Auth_OpenID_NO_MATH_SUPPORT')) {
$null = null;
return $null;
}
 
// If this method has not been called before, look at
// $Auth_OpenID_math_extensions and try to find an extension that
// works.
global $_Auth_OpenID_math_extensions;
$ext = Auth_OpenID_detectMathLibrary($_Auth_OpenID_math_extensions);
if ($ext === false) {
$tried = array();
foreach ($_Auth_OpenID_math_extensions as $extinfo) {
$tried[] = $extinfo['extension'];
}
$triedstr = implode(", ", $tried);
 
define('Auth_OpenID_NO_MATH_SUPPORT', true);
return null;
}
 
// Instantiate a new wrapper
$class = $ext['class'];
$lib = new $class();
 
return $lib;
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Association.php
New file
0,0 → 1,308
<?php
 
/**
* This module contains code for dealing with associations between
* consumers and servers.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* @access private
*/
require_once 'Auth/OpenID/CryptUtil.php';
 
/**
* @access private
*/
require_once 'Auth/OpenID/KVForm.php';
 
/**
* This class represents an association between a server and a
* consumer. In general, users of this library will never see
* instances of this object. The only exception is if you implement a
* custom {@link Auth_OpenID_OpenIDStore}.
*
* If you do implement such a store, it will need to store the values
* of the handle, secret, issued, lifetime, and assoc_type instance
* variables.
*
* @package OpenID
*/
class Auth_OpenID_Association {
 
/**
* This is a HMAC-SHA1 specific value.
*
* @access private
*/
var $SIG_LENGTH = 20;
 
/**
* The ordering and name of keys as stored by serialize.
*
* @access private
*/
var $assoc_keys = array(
'version',
'handle',
'secret',
'issued',
'lifetime',
'assoc_type'
);
 
/**
* This is an alternate constructor (factory method) used by the
* OpenID consumer library to create associations. OpenID store
* implementations shouldn't use this constructor.
*
* @access private
*
* @param integer $expires_in This is the amount of time this
* association is good for, measured in seconds since the
* association was issued.
*
* @param string $handle This is the handle the server gave this
* association.
*
* @param string secret This is the shared secret the server
* generated for this association.
*
* @param assoc_type This is the type of association this
* instance represents. The only valid value of this field at
* this time is 'HMAC-SHA1', but new types may be defined in the
* future.
*
* @return association An {@link Auth_OpenID_Association}
* instance.
*/
function fromExpiresIn($expires_in, $handle, $secret, $assoc_type)
{
$issued = time();
$lifetime = $expires_in;
return new Auth_OpenID_Association($handle, $secret,
$issued, $lifetime, $assoc_type);
}
 
/**
* This is the standard constructor for creating an association.
* The library should create all of the necessary associations, so
* this constructor is not part of the external API.
*
* @access private
*
* @param string $handle This is the handle the server gave this
* association.
*
* @param string $secret This is the shared secret the server
* generated for this association.
*
* @param integer $issued This is the time this association was
* issued, in seconds since 00:00 GMT, January 1, 1970. (ie, a
* unix timestamp)
*
* @param integer $lifetime This is the amount of time this
* association is good for, measured in seconds since the
* association was issued.
*
* @param string $assoc_type This is the type of association this
* instance represents. The only valid value of this field at
* this time is 'HMAC-SHA1', but new types may be defined in the
* future.
*/
function Auth_OpenID_Association(
$handle, $secret, $issued, $lifetime, $assoc_type)
{
if ($assoc_type != 'HMAC-SHA1') {
$fmt = 'HMAC-SHA1 is the only supported association type (got %s)';
trigger_error(sprintf($fmt, $assoc_type), E_USER_ERROR);
}
 
$this->handle = $handle;
$this->secret = $secret;
$this->issued = $issued;
$this->lifetime = $lifetime;
$this->assoc_type = $assoc_type;
}
 
/**
* This returns the number of seconds this association is still
* valid for, or 0 if the association is no longer valid.
*
* @return integer $seconds The number of seconds this association
* is still valid for, or 0 if the association is no longer valid.
*/
function getExpiresIn($now = null)
{
if ($now == null) {
$now = time();
}
 
return max(0, $this->issued + $this->lifetime - $now);
}
 
/**
* This checks to see if two {@link Auth_OpenID_Association}
* instances represent the same association.
*
* @return bool $result true if the two instances represent the
* same association, false otherwise.
*/
function equal($other)
{
return ((gettype($this) == gettype($other))
&& ($this->handle == $other->handle)
&& ($this->secret == $other->secret)
&& ($this->issued == $other->issued)
&& ($this->lifetime == $other->lifetime)
&& ($this->assoc_type == $other->assoc_type));
}
 
/**
* Convert an association to KV form.
*
* @return string $result String in KV form suitable for
* deserialization by deserialize.
*/
function serialize()
{
$data = array(
'version' => '2',
'handle' => $this->handle,
'secret' => base64_encode($this->secret),
'issued' => strval(intval($this->issued)),
'lifetime' => strval(intval($this->lifetime)),
'assoc_type' => $this->assoc_type
);
 
assert(array_keys($data) == $this->assoc_keys);
 
return Auth_OpenID_KVForm::fromArray($data, $strict = true);
}
 
/**
* Parse an association as stored by serialize(). This is the
* inverse of serialize.
*
* @param string $assoc_s Association as serialized by serialize()
* @return Auth_OpenID_Association $result instance of this class
*/
function deserialize($class_name, $assoc_s)
{
$pairs = Auth_OpenID_KVForm::toArray($assoc_s, $strict = true);
$keys = array();
$values = array();
foreach ($pairs as $key => $value) {
if (is_array($value)) {
list($key, $value) = $value;
}
$keys[] = $key;
$values[] = $value;
}
 
$class_vars = get_class_vars($class_name);
$class_assoc_keys = $class_vars['assoc_keys'];
 
sort($keys);
sort($class_assoc_keys);
 
if ($keys != $class_assoc_keys) {
trigger_error('Unexpected key values: ' . strval($keys),
E_USER_WARNING);
return null;
}
 
$version = $pairs['version'];
$handle = $pairs['handle'];
$secret = $pairs['secret'];
$issued = $pairs['issued'];
$lifetime = $pairs['lifetime'];
$assoc_type = $pairs['assoc_type'];
 
if ($version != '2') {
trigger_error('Unknown version: ' . $version, E_USER_WARNING);
return null;
}
 
$issued = intval($issued);
$lifetime = intval($lifetime);
$secret = base64_decode($secret);
 
return new $class_name(
$handle, $secret, $issued, $lifetime, $assoc_type);
}
 
/**
* Generate a signature for a sequence of (key, value) pairs
*
* @access private
* @param array $pairs The pairs to sign, in order. This is an
* array of two-tuples.
* @return string $signature The binary signature of this sequence
* of pairs
*/
function sign($pairs)
{
$kv = Auth_OpenID_KVForm::fromArray($pairs);
return Auth_OpenID_HMACSHA1($this->secret, $kv);
}
 
/**
* Generate a signature for some fields in a dictionary
*
* @access private
* @param array $fields The fields to sign, in order; this is an
* array of strings.
* @param array $data Dictionary of values to sign (an array of
* string => string pairs).
* @return string $signature The signature, base64 encoded
*/
function signDict($fields, $data, $prefix = 'openid.')
{
$pairs = array();
foreach ($fields as $field) {
$pairs[] = array($field, $data[$prefix . $field]);
}
 
return base64_encode($this->sign($pairs));
}
 
/**
* Add a signature to an array of fields
*
* @access private
*/
function addSignature($fields, &$data, $prefix = 'openid.')
{
$sig = $this->signDict($fields, $data, $prefix);
$signed = implode(",", $fields);
$data[$prefix . 'sig'] = $sig;
$data[$prefix . 'signed'] = $signed;
}
 
/**
* Confirm that the signature of these fields matches the
* signature contained in the data
*
* @access private
*/
function checkSignature($data, $prefix = 'openid.')
{
$signed = $data[$prefix . 'signed'];
$fields = explode(",", $signed);
$expected_sig = $this->signDict($fields, $data, $prefix);
$request_sig = $data[$prefix . 'sig'];
 
return ($request_sig == $expected_sig);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/SQLStore.php
New file
0,0 → 1,658
<?php
 
/**
* SQL-backed OpenID stores.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Require the PEAR DB module because we'll need it for the SQL-based
* stores implemented here. We silence any errors from the inclusion
* because it might not be present, and a user of the SQL stores may
* supply an Auth_OpenID_DatabaseConnection instance that implements
* its own storage.
*/
global $__Auth_OpenID_PEAR_AVAILABLE;
$__Auth_OpenID_PEAR_AVAILABLE = @include_once 'DB.php';
 
/**
* @access private
*/
require_once 'Auth/OpenID/Interface.php';
 
/**
* This is the parent class for the SQL stores, which contains the
* logic common to all of the SQL stores.
*
* The table names used are determined by the class variables
* settings_table_name, associations_table_name, and
* nonces_table_name. To change the name of the tables used, pass new
* table names into the constructor.
*
* To create the tables with the proper schema, see the createTables
* method.
*
* This class shouldn't be used directly. Use one of its subclasses
* instead, as those contain the code necessary to use a specific
* database. If you're an OpenID integrator and you'd like to create
* an SQL-driven store that wraps an application's database
* abstraction, be sure to create a subclass of
* {@link Auth_OpenID_DatabaseConnection} that calls the application's
* database abstraction calls. Then, pass an instance of your new
* database connection class to your SQLStore subclass constructor.
*
* All methods other than the constructor and createTables should be
* considered implementation details.
*
* @package OpenID
*/
class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore {
 
/**
* This creates a new SQLStore instance. It requires an
* established database connection be given to it, and it allows
* overriding the default table names.
*
* @param connection $connection This must be an established
* connection to a database of the correct type for the SQLStore
* subclass you're using. This must either be an PEAR DB
* connection handle or an instance of a subclass of
* Auth_OpenID_DatabaseConnection.
*
* @param string $settings_table This is an optional parameter to
* specify the name of the table used for this store's settings.
* The default value is 'oid_settings'.
*
* @param associations_table: This is an optional parameter to
* specify the name of the table used for storing associations.
* The default value is 'oid_associations'.
*
* @param nonces_table: This is an optional parameter to specify
* the name of the table used for storing nonces. The default
* value is 'oid_nonces'.
*/
function Auth_OpenID_SQLStore($connection, $settings_table = null,
$associations_table = null,
$nonces_table = null)
{
global $__Auth_OpenID_PEAR_AVAILABLE;
 
$this->settings_table_name = "oid_settings";
$this->associations_table_name = "oid_associations";
$this->nonces_table_name = "oid_nonces";
 
// Check the connection object type to be sure it's a PEAR
// database connection.
if (!(is_object($connection) &&
(is_subclass_of($connection, 'db_common') ||
is_subclass_of($connection,
'auth_openid_databaseconnection')))) {
trigger_error("Auth_OpenID_SQLStore expected PEAR connection " .
"object (got ".get_class($connection).")",
E_USER_ERROR);
return;
}
 
$this->connection = $connection;
 
// Be sure to set the fetch mode so the results are keyed on
// column name instead of column index. This is a PEAR
// constant, so only try to use it if PEAR is present. Note
// that Auth_Openid_Databaseconnection instances need not
// implement ::setFetchMode for this reason.
if ($__Auth_OpenID_PEAR_AVAILABLE) {
$this->connection->setFetchMode(DB_FETCHMODE_ASSOC);
}
 
if ($settings_table) {
$this->settings_table_name = $settings_table;
}
 
if ($associations_table) {
$this->associations_table_name = $associations_table;
}
 
if ($nonces_table) {
$this->nonces_table_name = $nonces_table;
}
 
$this->max_nonce_age = 6 * 60 * 60;
 
// Be sure to run the database queries with auto-commit mode
// turned OFF, because we want every function to run in a
// transaction, implicitly. As a rule, methods named with a
// leading underscore will NOT control transaction behavior.
// Callers of these methods will worry about transactions.
$this->connection->autoCommit(false);
 
// Create an empty SQL strings array.
$this->sql = array();
 
// Call this method (which should be overridden by subclasses)
// to populate the $this->sql array with SQL strings.
$this->setSQL();
 
// Verify that all required SQL statements have been set, and
// raise an error if any expected SQL strings were either
// absent or empty.
list($missing, $empty) = $this->_verifySQL();
 
if ($missing) {
trigger_error("Expected keys in SQL query list: " .
implode(", ", $missing),
E_USER_ERROR);
return;
}
 
if ($empty) {
trigger_error("SQL list keys have no SQL strings: " .
implode(", ", $empty),
E_USER_ERROR);
return;
}
 
// Add table names to queries.
$this->_fixSQL();
}
 
function tableExists($table_name)
{
return !$this->isError(
$this->connection->query("SELECT * FROM %s LIMIT 0",
$table_name));
}
 
/**
* Returns true if $value constitutes a database error; returns
* false otherwise.
*/
function isError($value)
{
return PEAR::isError($value);
}
 
/**
* Converts a query result to a boolean. If the result is a
* database error according to $this->isError(), this returns
* false; otherwise, this returns true.
*/
function resultToBool($obj)
{
if ($this->isError($obj)) {
return false;
} else {
return true;
}
}
 
/**
* This method should be overridden by subclasses. This method is
* called by the constructor to set values in $this->sql, which is
* an array keyed on sql name.
*/
function setSQL()
{
}
 
/**
* Resets the store by removing all records from the store's
* tables.
*/
function reset()
{
$this->connection->query(sprintf("DELETE FROM %s",
$this->associations_table_name));
 
$this->connection->query(sprintf("DELETE FROM %s",
$this->nonces_table_name));
 
$this->connection->query(sprintf("DELETE FROM %s",
$this->settings_table_name));
}
 
/**
* @access private
*/
function _verifySQL()
{
$missing = array();
$empty = array();
 
$required_sql_keys = array(
'nonce_table',
'assoc_table',
'settings_table',
'get_auth',
'create_auth',
'set_assoc',
'get_assoc',
'get_assocs',
'remove_assoc',
'add_nonce',
'get_nonce',
'remove_nonce'
);
 
foreach ($required_sql_keys as $key) {
if (!array_key_exists($key, $this->sql)) {
$missing[] = $key;
} else if (!$this->sql[$key]) {
$empty[] = $key;
}
}
 
return array($missing, $empty);
}
 
/**
* @access private
*/
function _fixSQL()
{
$replacements = array(
array(
'value' => $this->nonces_table_name,
'keys' => array('nonce_table',
'add_nonce',
'get_nonce',
'remove_nonce')
),
array(
'value' => $this->associations_table_name,
'keys' => array('assoc_table',
'set_assoc',
'get_assoc',
'get_assocs',
'remove_assoc')
),
array(
'value' => $this->settings_table_name,
'keys' => array('settings_table',
'get_auth',
'create_auth')
)
);
 
foreach ($replacements as $item) {
$value = $item['value'];
$keys = $item['keys'];
 
foreach ($keys as $k) {
if (is_array($this->sql[$k])) {
foreach ($this->sql[$k] as $part_key => $part_value) {
$this->sql[$k][$part_key] = sprintf($part_value,
$value);
}
} else {
$this->sql[$k] = sprintf($this->sql[$k], $value);
}
}
}
}
 
function blobDecode($blob)
{
return $blob;
}
 
function blobEncode($str)
{
return $str;
}
 
function createTables()
{
$this->connection->autoCommit(true);
$n = $this->create_nonce_table();
$a = $this->create_assoc_table();
$s = $this->create_settings_table();
$this->connection->autoCommit(false);
 
if ($n && $a && $s) {
return true;
} else {
return false;
}
}
 
function create_nonce_table()
{
if (!$this->tableExists($this->nonces_table_name)) {
$r = $this->connection->query($this->sql['nonce_table']);
return $this->resultToBool($r);
}
return true;
}
 
function create_assoc_table()
{
if (!$this->tableExists($this->associations_table_name)) {
$r = $this->connection->query($this->sql['assoc_table']);
return $this->resultToBool($r);
}
return true;
}
 
function create_settings_table()
{
if (!$this->tableExists($this->settings_table_name)) {
$r = $this->connection->query($this->sql['settings_table']);
return $this->resultToBool($r);
}
return true;
}
 
/**
* @access private
*/
function _get_auth()
{
return $this->connection->getOne($this->sql['get_auth']);
}
 
/**
* @access private
*/
function _create_auth($str)
{
return $this->connection->query($this->sql['create_auth'],
array($str));
}
 
function getAuthKey()
{
$value = $this->_get_auth();
if (!$value) {
$auth_key =
Auth_OpenID_CryptUtil::randomString($this->AUTH_KEY_LEN);
 
$auth_key_s = $this->blobEncode($auth_key);
$this->_create_auth($auth_key_s);
} else {
$auth_key_s = $value;
$auth_key = $this->blobDecode($auth_key_s);
}
 
$this->connection->commit();
 
if (strlen($auth_key) != $this->AUTH_KEY_LEN) {
$fmt = "Expected %d-byte string for auth key. Got key of length %d";
trigger_error(sprintf($fmt, $this->AUTH_KEY_LEN, strlen($auth_key)),
E_USER_WARNING);
return null;
}
 
return $auth_key;
}
 
/**
* @access private
*/
function _set_assoc($server_url, $handle, $secret, $issued,
$lifetime, $assoc_type)
{
return $this->connection->query($this->sql['set_assoc'],
array(
$server_url,
$handle,
$secret,
$issued,
$lifetime,
$assoc_type));
}
 
function storeAssociation($server_url, $association)
{
if ($this->resultToBool($this->_set_assoc(
$server_url,
$association->handle,
$this->blobEncode(
$association->secret),
$association->issued,
$association->lifetime,
$association->assoc_type
))) {
$this->connection->commit();
} else {
$this->connection->rollback();
}
}
 
/**
* @access private
*/
function _get_assoc($server_url, $handle)
{
$result = $this->connection->getRow($this->sql['get_assoc'],
array($server_url, $handle));
if ($this->isError($result)) {
return null;
} else {
return $result;
}
}
 
/**
* @access private
*/
function _get_assocs($server_url)
{
$result = $this->connection->getAll($this->sql['get_assocs'],
array($server_url));
 
if ($this->isError($result)) {
return array();
} else {
return $result;
}
}
 
function removeAssociation($server_url, $handle)
{
if ($this->_get_assoc($server_url, $handle) == null) {
return false;
}
 
if ($this->resultToBool($this->connection->query(
$this->sql['remove_assoc'],
array($server_url, $handle)))) {
$this->connection->commit();
} else {
$this->connection->rollback();
}
 
return true;
}
 
function getAssociation($server_url, $handle = null)
{
if ($handle !== null) {
$assoc = $this->_get_assoc($server_url, $handle);
 
$assocs = array();
if ($assoc) {
$assocs[] = $assoc;
}
} else {
$assocs = $this->_get_assocs($server_url);
}
 
if (!$assocs || (count($assocs) == 0)) {
return null;
} else {
$associations = array();
 
foreach ($assocs as $assoc_row) {
$assoc = new Auth_OpenID_Association($assoc_row['handle'],
$assoc_row['secret'],
$assoc_row['issued'],
$assoc_row['lifetime'],
$assoc_row['assoc_type']);
 
$assoc->secret = $this->blobDecode($assoc->secret);
 
if ($assoc->getExpiresIn() == 0) {
$this->removeAssociation($server_url, $assoc->handle);
} else {
$associations[] = array($assoc->issued, $assoc);
}
}
 
if ($associations) {
$issued = array();
$assocs = array();
foreach ($associations as $key => $assoc) {
$issued[$key] = $assoc[0];
$assocs[$key] = $assoc[1];
}
 
array_multisort($issued, SORT_DESC, $assocs, SORT_DESC,
$associations);
 
// return the most recently issued one.
list($issued, $assoc) = $associations[0];
return $assoc;
} else {
return null;
}
}
}
 
/**
* @access private
*/
function _add_nonce($nonce, $expires)
{
$sql = $this->sql['add_nonce'];
$result = $this->connection->query($sql, array($nonce, $expires));
return $this->resultToBool($result);
}
 
/**
* @access private
*/
function storeNonce($nonce)
{
if ($this->_add_nonce($nonce, time())) {
$this->connection->commit();
} else {
$this->connection->rollback();
}
}
 
/**
* @access private
*/
function _get_nonce($nonce)
{
$result = $this->connection->getRow($this->sql['get_nonce'],
array($nonce));
 
if ($this->isError($result)) {
return null;
} else {
return $result;
}
}
 
/**
* @access private
*/
function _remove_nonce($nonce)
{
$this->connection->query($this->sql['remove_nonce'],
array($nonce));
}
 
function useNonce($nonce)
{
$row = $this->_get_nonce($nonce);
 
if ($row !== null) {
$nonce = $row['nonce'];
$timestamp = $row['expires'];
$nonce_age = time() - $timestamp;
 
if ($nonce_age > $this->max_nonce_age) {
$present = 0;
} else {
$present = 1;
}
 
$this->_remove_nonce($nonce);
} else {
$present = 0;
}
 
$this->connection->commit();
 
return $present;
}
 
/**
* "Octifies" a binary string by returning a string with escaped
* octal bytes. This is used for preparing binary data for
* PostgreSQL BYTEA fields.
*
* @access private
*/
function _octify($str)
{
$result = "";
for ($i = 0; $i < strlen($str); $i++) {
$ch = substr($str, $i, 1);
if ($ch == "\\") {
$result .= "\\\\\\\\";
} else if (ord($ch) == 0) {
$result .= "\\\\000";
} else {
$result .= "\\" . strval(decoct(ord($ch)));
}
}
return $result;
}
 
/**
* "Unoctifies" octal-escaped data from PostgreSQL and returns the
* resulting ASCII (possibly binary) string.
*
* @access private
*/
function _unoctify($str)
{
$result = "";
$i = 0;
while ($i < strlen($str)) {
$char = $str[$i];
if ($char == "\\") {
// Look to see if the next char is a backslash and
// append it.
if ($str[$i + 1] != "\\") {
$octal_digits = substr($str, $i + 1, 3);
$dec = octdec($octal_digits);
$char = chr($dec);
$i += 4;
} else {
$char = "\\";
$i += 2;
}
} else {
$i += 1;
}
 
$result .= $char;
}
 
return $result;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/SQLiteStore.php
New file
0,0 → 1,66
<?php
 
/**
* An SQLite store.
*
* @package OpenID
*/
 
/**
* Require the base class file.
*/
require_once "Auth/OpenID/SQLStore.php";
 
/**
* An SQL store that uses SQLite as its backend.
*
* @package OpenID
*/
class Auth_OpenID_SQLiteStore extends Auth_OpenID_SQLStore {
function setSQL()
{
$this->sql['nonce_table'] =
"CREATE TABLE %s (nonce CHAR(8) UNIQUE PRIMARY KEY, ".
"expires INTEGER)";
 
$this->sql['assoc_table'] =
"CREATE TABLE %s (server_url VARCHAR(2047), handle VARCHAR(255), ".
"secret BLOB(128), issued INTEGER, lifetime INTEGER, ".
"assoc_type VARCHAR(64), PRIMARY KEY (server_url, handle))";
 
$this->sql['settings_table'] =
"CREATE TABLE %s (setting VARCHAR(128) UNIQUE PRIMARY KEY, ".
"value BLOB(20))";
 
$this->sql['create_auth'] =
"INSERT INTO %s VALUES ('auth_key', ?)";
 
$this->sql['get_auth'] =
"SELECT value FROM %s WHERE setting = 'auth_key'";
 
$this->sql['set_assoc'] =
"INSERT OR REPLACE INTO %s VALUES (?, ?, ?, ?, ?, ?)";
 
$this->sql['get_assocs'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ?";
 
$this->sql['get_assoc'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ? AND handle = ?";
 
$this->sql['remove_assoc'] =
"DELETE FROM %s WHERE server_url = ? AND handle = ?";
 
$this->sql['add_nonce'] =
"INSERT OR REPLACE INTO %s (nonce, expires) VALUES (?, ?)";
 
$this->sql['get_nonce'] =
"SELECT * FROM %s WHERE nonce = ?";
 
$this->sql['remove_nonce'] =
"DELETE FROM %s WHERE nonce = ?";
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Discover.php
New file
0,0 → 1,258
<?php
 
/**
* The OpenID and Yadis discovery implementation for OpenID 1.2.
*/
 
require_once "Auth/OpenID.php";
require_once "Auth/OpenID/Parse.php";
require_once "Services/Yadis/XRIRes.php";
require_once "Services/Yadis/Yadis.php";
 
define('_OPENID_1_0_NS', 'http://openid.net/xmlns/1.0');
define('_OPENID_1_2_TYPE', 'http://openid.net/signon/1.2');
define('_OPENID_1_1_TYPE', 'http://openid.net/signon/1.1');
define('_OPENID_1_0_TYPE', 'http://openid.net/signon/1.0');
 
/**
* Object representing an OpenID service endpoint.
*/
class Auth_OpenID_ServiceEndpoint {
function Auth_OpenID_ServiceEndpoint()
{
$this->identity_url = null;
$this->server_url = null;
$this->type_uris = array();
$this->delegate = null;
$this->canonicalID = null;
$this->used_yadis = false; // whether this came from an XRDS
}
 
function usesExtension($extension_uri)
{
return in_array($extension_uri, $this->type_uris);
}
 
function parseService($yadis_url, $uri, $type_uris, $service_element)
{
// Set the state of this object based on the contents of the
// service element.
$this->type_uris = $type_uris;
$this->identity_url = $yadis_url;
$this->server_url = $uri;
$this->delegate = Auth_OpenID_ServiceEndpoint::findDelegate(
$service_element);
$this->used_yadis = true;
}
 
function findDelegate($service)
{
// Extract a openid:Delegate value from a Yadis Service
// element. If no delegate is found, returns null.
 
// Try to register new namespace.
$service->parser->registerNamespace('openid',
'http://openid.net/xmlns/1.0');
 
// XXX: should this die if there is more than one delegate
// element?
$delegates = $service->getElements("openid:Delegate");
 
if ($delegates) {
return $service->parser->content($delegates[0]);
} else {
return null;
}
}
 
function getServerID()
{
// Return the identifier that should be sent as the
// openid.identity_url parameter to the server.
if ($this->delegate === null) {
if ($this->canonicalID) {
return $this->canonicalID;
} else {
return $this->identity_url;
}
} else {
return $this->delegate;
}
}
 
function fromHTML($uri, $html)
{
// Parse the given document as HTML looking for an OpenID <link
// rel=...>
$urls = Auth_OpenID_legacy_discover($html);
if ($urls === false) {
return null;
}
 
list($delegate_url, $server_url) = $urls;
 
$service = new Auth_OpenID_ServiceEndpoint();
$service->identity_url = $uri;
$service->delegate = $delegate_url;
$service->server_url = $server_url;
$service->type_uris = array(_OPENID_1_0_TYPE);
return $service;
}
}
 
function filter_MatchesAnyOpenIDType(&$service)
{
$uris = $service->getTypes();
 
foreach ($uris as $uri) {
if (in_array($uri,
array(_OPENID_1_0_TYPE,
_OPENID_1_1_TYPE,
_OPENID_1_2_TYPE))) {
return true;
}
}
 
return false;
}
 
function Auth_OpenID_makeOpenIDEndpoints($uri, $endpoints)
{
$s = array();
 
if (!$endpoints) {
return $s;
}
 
foreach ($endpoints as $service) {
$type_uris = $service->getTypes();
$uris = $service->getURIs();
 
// If any Type URIs match and there is an endpoint URI
// specified, then this is an OpenID endpoint
if ($type_uris &&
$uris) {
 
foreach ($uris as $service_uri) {
$openid_endpoint = new Auth_OpenID_ServiceEndpoint();
$openid_endpoint->parseService($uri,
$service_uri,
$type_uris,
$service);
 
$s[] = $openid_endpoint;
}
}
}
 
return $s;
}
 
function Auth_OpenID_discoverWithYadis($uri, &$fetcher)
{
// Discover OpenID services for a URI. Tries Yadis and falls back
// on old-style <link rel='...'> discovery if Yadis fails.
 
// Might raise a yadis.discover.DiscoveryFailure if no document
// came back for that URI at all. I don't think falling back to
// OpenID 1.0 discovery on the same URL will help, so don't bother
// to catch it.
$openid_services = array();
 
$http_response = null;
$response = Services_Yadis_Yadis::discover($uri, $http_response,
$fetcher);
 
if ($response) {
$identity_url = $response->uri;
$openid_services =
$response->xrds->services(array('filter_MatchesAnyOpenIDType'));
}
 
if (!$openid_services) {
return @Auth_OpenID_discoverWithoutYadis($uri,
$fetcher);
}
 
if (!$openid_services) {
$body = $response->body;
 
// Try to parse the response as HTML to get OpenID 1.0/1.1
// <link rel="...">
$service = Auth_OpenID_ServiceEndpoint::fromHTML($identity_url,
$body);
 
if ($service !== null) {
$openid_services = array($service);
}
} else {
$openid_services = Auth_OpenID_makeOpenIDEndpoints($response->uri,
$openid_services);
}
 
return array($identity_url, $openid_services, $http_response);
}
 
function _Auth_OpenID_discoverServiceList($uri, &$fetcher)
{
list($url, $services, $resp) = Auth_OpenID_discoverWithYadis($uri,
$fetcher);
 
return $services;
}
 
function _Auth_OpenID_discoverXRIServiceList($uri, &$fetcher)
{
list($url, $services, $resp) = _Auth_OpenID_discoverXRI($uri,
$fetcher);
return $services;
}
 
function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher)
{
$http_resp = @$fetcher->get($uri);
 
if ($http_resp->status != 200) {
return array(null, array(), $http_resp);
}
 
$identity_url = $http_resp->final_url;
 
// Try to parse the response as HTML to get OpenID 1.0/1.1 <link
// rel="...">
$endpoint =& new Auth_OpenID_ServiceEndpoint();
$service = $endpoint->fromHTML($identity_url, $http_resp->body);
if ($service === null) {
$openid_services = array();
} else {
$openid_services = array($service);
}
 
return array($identity_url, $openid_services, $http_resp);
}
 
function _Auth_OpenID_discoverXRI($iname, &$fetcher)
{
$services = new Services_Yadis_ProxyResolver($fetcher);
list($canonicalID, $service_list) = $services->query($iname,
array(_OPENID_1_0_TYPE,
_OPENID_1_1_TYPE,
_OPENID_1_2_TYPE),
array('filter_MatchesAnyOpenIDType'));
 
$endpoints = Auth_OpenID_makeOpenIDEndpoints($iname, $service_list);
 
for ($i = 0; $i < count($endpoints); $i++) {
$endpoints[$i]->canonicalID = $canonicalID;
}
 
// FIXME: returned xri should probably be in some normal form
return array($iname, $endpoints, null);
}
 
function Auth_OpenID_discover($uri, &$fetcher)
{
return @Auth_OpenID_discoverWithYadis($uri, $fetcher);
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/ServerRequest.php
New file
0,0 → 1,37
<?php
/**
* OpenID Server Request
*
* @see Auth_OpenID_Server
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Imports
*/
require_once "Auth/OpenID.php";
 
/**
* Object that holds the state of a request to the OpenID server
*
* With accessor functions to get at the internal request data.
*
* @see Auth_OpenID_Server
* @package OpenID
*/
class Auth_OpenID_ServerRequest {
function Auth_OpenID_ServerRequest()
{
$this->mode = null;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/PostgreSQLStore.php
New file
0,0 → 1,136
<?php
 
/**
* A PostgreSQL store.
*
* @package OpenID
*/
 
/**
* Require the base class file.
*/
require_once "Auth/OpenID/SQLStore.php";
 
/**
* An SQL store that uses PostgreSQL as its backend.
*
* @package OpenID
*/
class Auth_OpenID_PostgreSQLStore extends Auth_OpenID_SQLStore {
/**
* @access private
*/
function setSQL()
{
$this->sql['nonce_table'] =
"CREATE TABLE %s (nonce CHAR(8) UNIQUE PRIMARY KEY, ".
"expires INTEGER)";
 
$this->sql['assoc_table'] =
"CREATE TABLE %s (server_url VARCHAR(2047), handle VARCHAR(255), ".
"secret BYTEA, issued INTEGER, lifetime INTEGER, ".
"assoc_type VARCHAR(64), PRIMARY KEY (server_url, handle), ".
"CONSTRAINT secret_length_constraint CHECK ".
"(LENGTH(secret) <= 128))";
 
$this->sql['settings_table'] =
"CREATE TABLE %s (setting VARCHAR(128) UNIQUE PRIMARY KEY, ".
"value BYTEA, ".
"CONSTRAINT value_length_constraint CHECK (LENGTH(value) <= 20))";
 
$this->sql['create_auth'] =
"INSERT INTO %s VALUES ('auth_key', '!')";
 
$this->sql['get_auth'] =
"SELECT value FROM %s WHERE setting = 'auth_key'";
 
$this->sql['set_assoc'] =
array(
'insert_assoc' => "INSERT INTO %s (server_url, handle, ".
"secret, issued, lifetime, assoc_type) VALUES ".
"(?, ?, '!', ?, ?, ?)",
'update_assoc' => "UPDATE %s SET secret = '!', issued = ?, ".
"lifetime = ?, assoc_type = ? WHERE server_url = ? AND ".
"handle = ?"
);
 
$this->sql['get_assocs'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ?";
 
$this->sql['get_assoc'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ? AND handle = ?";
 
$this->sql['remove_assoc'] =
"DELETE FROM %s WHERE server_url = ? AND handle = ?";
 
$this->sql['add_nonce'] =
array(
'insert_nonce' => "INSERT INTO %s (nonce, expires) VALUES ".
"(?, ?)",
'update_nonce' => "UPDATE %s SET expires = ? WHERE nonce = ?"
);
 
$this->sql['get_nonce'] =
"SELECT * FROM %s WHERE nonce = ?";
 
$this->sql['remove_nonce'] =
"DELETE FROM %s WHERE nonce = ?";
}
 
/**
* @access private
*/
function _set_assoc($server_url, $handle, $secret, $issued, $lifetime,
$assoc_type)
{
$result = $this->_get_assoc($server_url, $handle);
if ($result) {
// Update the table since this associations already exists.
$this->connection->query($this->sql['set_assoc']['update_assoc'],
array($secret, $issued, $lifetime,
$assoc_type, $server_url, $handle));
} else {
// Insert a new record because this association wasn't
// found.
$this->connection->query($this->sql['set_assoc']['insert_assoc'],
array($server_url, $handle, $secret,
$issued, $lifetime, $assoc_type));
}
}
 
/**
* @access private
*/
function _add_nonce($nonce, $expires)
{
if ($this->_get_nonce($nonce)) {
return $this->resultToBool($this->connection->query(
$this->sql['add_nonce']['update_nonce'],
array($expires, $nonce)));
} else {
return $this->resultToBool($this->connection->query(
$this->sql['add_nonce']['insert_nonce'],
array($nonce, $expires)));
}
}
 
/**
* @access private
*/
function blobEncode($blob)
{
return $this->_octify($blob);
}
 
/**
* @access private
*/
function blobDecode($blob)
{
return $this->_unoctify($blob);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/MySQLStore.php
New file
0,0 → 1,78
<?php
 
/**
* A MySQL store.
*
* @package OpenID
*/
 
/**
* Require the base class file.
*/
require_once "Auth/OpenID/SQLStore.php";
 
/**
* An SQL store that uses MySQL as its backend.
*
* @package OpenID
*/
class Auth_OpenID_MySQLStore extends Auth_OpenID_SQLStore {
/**
* @access private
*/
function setSQL()
{
$this->sql['nonce_table'] =
"CREATE TABLE %s (nonce CHAR(8) UNIQUE PRIMARY KEY, ".
"expires INTEGER) TYPE=InnoDB";
 
$this->sql['assoc_table'] =
"CREATE TABLE %s (server_url BLOB, handle VARCHAR(255), ".
"secret BLOB, issued INTEGER, lifetime INTEGER, ".
"assoc_type VARCHAR(64), PRIMARY KEY (server_url(255), handle)) ".
"TYPE=InnoDB";
 
$this->sql['settings_table'] =
"CREATE TABLE %s (setting VARCHAR(128) UNIQUE PRIMARY KEY, ".
"value BLOB) TYPE=InnoDB";
 
$this->sql['create_auth'] =
"INSERT INTO %s VALUES ('auth_key', !)";
 
$this->sql['get_auth'] =
"SELECT value FROM %s WHERE setting = 'auth_key'";
 
$this->sql['set_assoc'] =
"REPLACE INTO %s VALUES (?, ?, !, ?, ?, ?)";
 
$this->sql['get_assocs'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ?";
 
$this->sql['get_assoc'] =
"SELECT handle, secret, issued, lifetime, assoc_type FROM %s ".
"WHERE server_url = ? AND handle = ?";
 
$this->sql['remove_assoc'] =
"DELETE FROM %s WHERE server_url = ? AND handle = ?";
 
$this->sql['add_nonce'] =
"REPLACE INTO %s (nonce, expires) VALUES (?, ?)";
 
$this->sql['get_nonce'] =
"SELECT * FROM %s WHERE nonce = ?";
 
$this->sql['remove_nonce'] =
"DELETE FROM %s WHERE nonce = ?";
}
 
/**
* @access private
*/
function blobEncode($blob)
{
return "0x" . bin2hex($blob);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/DatabaseConnection.php
New file
0,0 → 1,131
<?php
 
/**
* The Auth_OpenID_DatabaseConnection class, which is used to emulate
* a PEAR database connection.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* An empty base class intended to emulate PEAR connection
* functionality in applications that supply their own database
* abstraction mechanisms. See {@link Auth_OpenID_SQLStore} for more
* information. You should subclass this class if you need to create
* an SQL store that needs to access its database using an
* application's database abstraction layer instead of a PEAR database
* connection. Any subclass of Auth_OpenID_DatabaseConnection MUST
* adhere to the interface specified here.
*
* @package OpenID
*/
class Auth_OpenID_DatabaseConnection {
/**
* Sets auto-commit mode on this database connection.
*
* @param bool $mode True if auto-commit is to be used; false if
* not.
*/
function autoCommit($mode)
{
}
 
/**
* Run an SQL query with the specified parameters, if any.
*
* @param string $sql An SQL string with placeholders. The
* placeholders are assumed to be specific to the database engine
* for this connection.
*
* @param array $params An array of parameters to insert into the
* SQL string using this connection's escaping mechanism.
*
* @return mixed $result The result of calling this connection's
* internal query function. The type of result depends on the
* underlying database engine. This method is usually used when
* the result of a query is not important, like a DDL query.
*/
function query($sql, $params = array())
{
}
 
/**
* Starts a transaction on this connection, if supported.
*/
function begin()
{
}
 
/**
* Commits a transaction on this connection, if supported.
*/
function commit()
{
}
 
/**
* Performs a rollback on this connection, if supported.
*/
function rollback()
{
}
 
/**
* Run an SQL query and return the first column of the first row
* of the result set, if any.
*
* @param string $sql An SQL string with placeholders. The
* placeholders are assumed to be specific to the database engine
* for this connection.
*
* @param array $params An array of parameters to insert into the
* SQL string using this connection's escaping mechanism.
*
* @return mixed $result The value of the first column of the
* first row of the result set. False if no such result was
* found.
*/
function getOne($sql, $params = array())
{
}
 
/**
* Run an SQL query and return the first row of the result set, if
* any.
*
* @param string $sql An SQL string with placeholders. The
* placeholders are assumed to be specific to the database engine
* for this connection.
*
* @param array $params An array of parameters to insert into the
* SQL string using this connection's escaping mechanism.
*
* @return array $result The first row of the result set, if any,
* keyed on column name. False if no such result was found.
*/
function getRow($sql, $params = array())
{
}
 
/**
* Run an SQL query with the specified parameters, if any.
*
* @param string $sql An SQL string with placeholders. The
* placeholders are assumed to be specific to the database engine
* for this connection.
*
* @param array $params An array of parameters to insert into the
* SQL string using this connection's escaping mechanism.
*
* @return array $result An array of arrays representing the
* result of the query; each array is keyed on column name.
*/
function getAll($sql, $params = array())
{
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/TrustRoot.php
New file
0,0 → 1,243
<?php
/**
* Functions for dealing with OpenID trust roots
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* A regular expression that matches a domain ending in a top-level domains.
* Used in checking trust roots for sanity.
*
* @access private
*/
define('Auth_OpenID___TLDs',
'/\.(com|edu|gov|int|mil|net|org|biz|info|name|museum|coop|aero|ac|' .
'ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|' .
'bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|' .
'cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|' .
'fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|' .
'gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|' .
'ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|' .
'ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|' .
'nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|' .
'ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|' .
'so|sr|st|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|' .
'ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$/');
 
/**
* A wrapper for trust-root related functions
*/
class Auth_OpenID_TrustRoot {
/**
* Parse a URL into its trust_root parts.
*
* @static
*
* @access private
*
* @param string $trust_root The url to parse
*
* @return mixed $parsed Either an associative array of trust root
* parts or false if parsing failed.
*/
function _parse($trust_root)
{
$parts = @parse_url($trust_root);
if ($parts === false) {
return false;
}
$required_parts = array('scheme', 'host');
$forbidden_parts = array('user', 'pass', 'fragment');
$keys = array_keys($parts);
if (array_intersect($keys, $required_parts) != $required_parts) {
return false;
}
 
if (array_intersect($keys, $forbidden_parts) != array()) {
return false;
}
 
// Return false if the original trust root value has more than
// one port specification.
if (preg_match("/:\/\/[^:]+(:\d+){2,}(\/|$)/", $trust_root)) {
return false;
}
 
$scheme = strtolower($parts['scheme']);
$allowed_schemes = array('http', 'https');
if (!in_array($scheme, $allowed_schemes)) {
return false;
}
$parts['scheme'] = $scheme;
 
$host = strtolower($parts['host']);
$hostparts = explode('*', $host);
switch (count($hostparts)) {
case 1:
$parts['wildcard'] = false;
break;
case 2:
if ($hostparts[0] ||
($hostparts[1] && substr($hostparts[1], 0, 1) != '.')) {
return false;
}
$host = $hostparts[1];
$parts['wildcard'] = true;
break;
default:
return false;
}
if (strpos($host, ':') !== false) {
return false;
}
 
$parts['host'] = $host;
 
if (isset($parts['path'])) {
$path = strtolower($parts['path']);
if (substr($path, -1) != '/') {
$path .= '/';
}
} else {
$path = '/';
}
$parts['path'] = $path;
if (!isset($parts['port'])) {
$parts['port'] = false;
}
return $parts;
}
 
/**
* Is this trust root sane?
*
* A trust root is sane if it is syntactically valid and it has a
* reasonable domain name. Specifically, the domain name must be
* more than one level below a standard TLD or more than two
* levels below a two-letter tld.
*
* For example, '*.com' is not a sane trust root, but '*.foo.com'
* is. '*.co.uk' is not sane, but '*.bbc.co.uk' is.
*
* This check is not always correct, but it attempts to err on the
* side of marking sane trust roots insane instead of marking
* insane trust roots sane. For example, 'kink.fm' is marked as
* insane even though it "should" (for some meaning of should) be
* marked sane.
*
* This function should be used when creating OpenID servers to
* alert the users of the server when a consumer attempts to get
* the user to accept a suspicious trust root.
*
* @static
* @param string $trust_root The trust root to check
* @return bool $sanity Whether the trust root looks OK
*/
function isSane($trust_root)
{
$parts = Auth_OpenID_TrustRoot::_parse($trust_root);
if ($parts === false) {
return false;
}
 
// Localhost is a special case
if ($parts['host'] == 'localhost') {
return true;
}
 
// Get the top-level domain of the host. If it is not a valid TLD,
// it's not sane.
preg_match(Auth_OpenID___TLDs, $parts['host'], $matches);
if (!$matches) {
return false;
}
$tld = $matches[1];
 
// Require at least two levels of specificity for non-country
// tlds and three levels for country tlds.
$elements = explode('.', $parts['host']);
$n = count($elements);
if ($parts['wildcard']) {
$n -= 1;
}
if (strlen($tld) == 2) {
$n -= 1;
}
if ($n <= 1) {
return false;
}
return true;
}
 
/**
* Does this URL match the given trust root?
*
* Return whether the URL falls under the given trust root. This
* does not check whether the trust root is sane. If the URL or
* trust root do not parse, this function will return false.
*
* @param string $trust_root The trust root to match against
*
* @param string $url The URL to check
*
* @return bool $matches Whether the URL matches against the
* trust root
*/
function match($trust_root, $url)
{
$trust_root_parsed = Auth_OpenID_TrustRoot::_parse($trust_root);
$url_parsed = Auth_OpenID_TrustRoot::_parse($url);
if (!$trust_root_parsed || !$url_parsed) {
return false;
}
 
// Check hosts matching
if ($url_parsed['wildcard']) {
return false;
}
if ($trust_root_parsed['wildcard']) {
$host_tail = $trust_root_parsed['host'];
$host = $url_parsed['host'];
if ($host_tail &&
substr($host, -(strlen($host_tail))) != $host_tail &&
substr($host_tail, 1) != $host) {
return false;
}
} else {
if ($trust_root_parsed['host'] != $url_parsed['host']) {
return false;
}
}
 
// Check path and query matching
$base_path = $trust_root_parsed['path'];
$path = $url_parsed['path'];
if (!isset($trust_root_parsed['query'])) {
if (substr($path, 0, strlen($base_path)) != $base_path) {
return false;
}
} else {
$base_query = $trust_root_parsed['query'];
$query = @$url_parsed['query'];
$qplus = substr($query, 0, strlen($base_query) + 1);
$bqplus = $base_query . '&';
if ($base_path != $path ||
($base_query != $query && $qplus != $bqplus)) {
return false;
}
}
 
// The port and scheme need to match exactly
return ($trust_root_parsed['scheme'] == $url_parsed['scheme'] &&
$url_parsed['port'] === $trust_root_parsed['port']);
}
}
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/HMACSHA1.php
New file
0,0 → 1,72
<?php
 
/**
* This is the HMACSHA1 implementation for the OpenID library.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* SHA1_BLOCKSIZE is this module's SHA1 blocksize used by the fallback
* implementation.
*/
define('Auth_OpenID_SHA1_BLOCKSIZE', 64);
 
if (!function_exists('sha1')) {
/**
* Return a raw SHA1 hash of the given string
*
* XXX: include the SHA1 code from Dan Libby's OpenID library
*/
function Auth_OpenID_SHA1($text)
{
trigger_error('No SHA1 function found', E_USER_ERROR);
}
} else {
/**
* @ignore
*/
function Auth_OpenID_SHA1($text)
{
$hex = sha1($text);
$raw = '';
for ($i = 0; $i < 40; $i += 2) {
$hexcode = substr($hex, $i, 2);
$charcode = (int)base_convert($hexcode, 16, 10);
$raw .= chr($charcode);
}
return $raw;
}
}
 
/**
* Compute an HMAC/SHA1 hash.
*
* @access private
* @param string $key The HMAC key
* @param string $text The message text to hash
* @return string $mac The MAC
*/
function Auth_OpenID_HMACSHA1($key, $text)
{
if (strlen($key) > Auth_OpenID_SHA1_BLOCKSIZE) {
$key = Auth_OpenID_SHA1($key, true);
}
 
$key = str_pad($key, Auth_OpenID_SHA1_BLOCKSIZE, chr(0x00));
$ipad = str_repeat(chr(0x36), Auth_OpenID_SHA1_BLOCKSIZE);
$opad = str_repeat(chr(0x5c), Auth_OpenID_SHA1_BLOCKSIZE);
$hash1 = Auth_OpenID_SHA1(($key ^ $ipad) . $text, true);
$hmac = Auth_OpenID_SHA1(($key ^ $opad) . $hash1, true);
return $hmac;
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/DiffieHellman.php
New file
0,0 → 1,181
<?php
 
/**
* The OpenID library's Diffie-Hellman implementation.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
require_once 'Auth/OpenID/BigMath.php';
require_once 'Auth/OpenID/HMACSHA1.php';
 
function Auth_OpenID_getDefaultMod()
{
return '155172898181473697471232257763715539915724801'.
'966915404479707795314057629378541917580651227423'.
'698188993727816152646631438561595825688188889951'.
'272158842675419950341258706556549803580104870537'.
'681476726513255747040765857479291291572334510643'.
'245094715007229621094194349783925984760375594985'.
'848253359305585439638443';
}
 
function Auth_OpenID_getDefaultGen()
{
return '2';
}
 
/**
* The Diffie-Hellman key exchange class. This class relies on
* {@link Auth_OpenID_MathLibrary} to perform large number operations.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_DiffieHellman {
 
var $mod;
var $gen;
var $private;
var $lib = null;
 
function Auth_OpenID_DiffieHellman($mod = null, $gen = null,
$private = null, $lib = null)
{
if ($lib === null) {
$this->lib =& Auth_OpenID_getMathLib();
} else {
$this->lib =& $lib;
}
 
if ($mod === null) {
$this->mod = $this->lib->init(Auth_OpenID_getDefaultMod());
} else {
$this->mod = $mod;
}
 
if ($gen === null) {
$this->gen = $this->lib->init(Auth_OpenID_getDefaultGen());
} else {
$this->gen = $gen;
}
 
if ($private === null) {
$r = $this->lib->rand($this->mod);
$this->private = $this->lib->add($r, 1);
} else {
$this->private = $private;
}
 
$this->public = $this->lib->powmod($this->gen, $this->private,
$this->mod);
}
 
function getSharedSecret($composite)
{
return $this->lib->powmod($composite, $this->private, $this->mod);
}
 
function getPublicKey()
{
return $this->public;
}
 
/**
* Generate the arguments for an OpenID Diffie-Hellman association
* request
*/
function getAssocArgs()
{
$cpub = $this->lib->longToBase64($this->getPublicKey());
$args = array(
'openid.dh_consumer_public' => $cpub,
'openid.session_type' => 'DH-SHA1'
);
 
if ($this->lib->cmp($this->mod, Auth_OpenID_getDefaultMod()) ||
$this->lib->cmp($this->gen, Auth_OpenID_getDefaultGen())) {
$args['openid.dh_modulus'] = $this->lib->longToBase64($this->mod);
$args['openid.dh_gen'] = $this->lib->longToBase64($this->gen);
}
 
return $args;
}
 
function usingDefaultValues()
{
return ($this->mod == Auth_OpenID_getDefaultMod() &&
$this->gen == Auth_OpenID_getDefaultGen());
}
 
/**
* Perform the server side of the OpenID Diffie-Hellman association
*/
function serverAssociate($consumer_args, $assoc_secret)
{
$lib =& Auth_OpenID_getMathLib();
 
if (isset($consumer_args['openid.dh_modulus'])) {
$mod = $lib->base64ToLong($consumer_args['openid.dh_modulus']);
} else {
$mod = null;
}
 
if (isset($consumer_args['openid.dh_gen'])) {
$gen = $lib->base64ToLong($consumer_args['openid.dh_gen']);
} else {
$gen = null;
}
$cpub64 = @$consumer_args['openid.dh_consumer_public'];
if (!isset($cpub64)) {
return false;
}
 
$dh = new Auth_OpenID_DiffieHellman($mod, $gen);
$cpub = $lib->base64ToLong($cpub64);
$mac_key = $dh->xorSecret($cpub, $assoc_secret);
$enc_mac_key = base64_encode($mac_key);
$spub64 = $lib->longToBase64($dh->getPublicKey());
 
$server_args = array(
'session_type' => 'DH-SHA1',
'dh_server_public' => $spub64,
'enc_mac_key' => $enc_mac_key
);
 
return $server_args;
}
 
function consumerFinish($reply)
{
$spub = $this->lib->base64ToLong($reply['dh_server_public']);
if ($this->lib->cmp($spub, 0) <= 0) {
return false;
}
$enc_mac_key = base64_decode($reply['enc_mac_key']);
return $this->xorSecret($spub, $enc_mac_key);
}
 
function xorSecret($composite, $secret)
{
$dh_shared = $this->getSharedSecret($composite);
$dh_shared_str = $this->lib->longToBinary($dh_shared);
$sha1_dh_shared = Auth_OpenID_SHA1($dh_shared_str);
 
$xsecret = "";
for ($i = 0; $i < strlen($secret); $i++) {
$xsecret .= chr(ord($secret[$i]) ^ ord($sha1_dh_shared[$i]));
}
 
return $xsecret;
}
}
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Consumer.php
New file
0,0 → 1,1186
<?php
 
/**
* This module documents the main interface with the OpenID consumer
* library. The only part of the library which has to be used and
* isn't documented in full here is the store required to create an
* Auth_OpenID_Consumer instance. More on the abstract store type and
* concrete implementations of it that are provided in the
* documentation for the Auth_OpenID_Consumer constructor.
*
* OVERVIEW
*
* The OpenID identity verification process most commonly uses the
* following steps, as visible to the user of this library:
*
* 1. The user enters their OpenID into a field on the consumer's
* site, and hits a login button.
* 2. The consumer site discovers the user's OpenID server using the
* YADIS protocol.
* 3. The consumer site sends the browser a redirect to the identity
* server. This is the authentication request as described in
* the OpenID specification.
* 4. The identity server's site sends the browser a redirect back
* to the consumer site. This redirect contains the server's
* response to the authentication request.
*
* The most important part of the flow to note is the consumer's site
* must handle two separate HTTP requests in order to perform the full
* identity check.
*
* LIBRARY DESIGN
*
* This consumer library is designed with that flow in mind. The goal
* is to make it as easy as possible to perform the above steps
* securely.
*
* At a high level, there are two important parts in the consumer
* library. The first important part is this module, which contains
* the interface to actually use this library. The second is the
* Auth_OpenID_Interface class, which describes the interface to use
* if you need to create a custom method for storing the state this
* library needs to maintain between requests.
*
* In general, the second part is less important for users of the
* library to know about, as several implementations are provided
* which cover a wide variety of situations in which consumers may use
* the library.
*
* This module contains a class, Auth_OpenID_Consumer, with methods
* corresponding to the actions necessary in each of steps 2, 3, and 4
* described in the overview. Use of this library should be as easy
* as creating an Auth_OpenID_Consumer instance and calling the
* methods appropriate for the action the site wants to take.
*
* STORES AND DUMB MODE
*
* OpenID is a protocol that works best when the consumer site is able
* to store some state. This is the normal mode of operation for the
* protocol, and is sometimes referred to as smart mode. There is
* also a fallback mode, known as dumb mode, which is available when
* the consumer site is not able to store state. This mode should be
* avoided when possible, as it leaves the implementation more
* vulnerable to replay attacks.
*
* The mode the library works in for normal operation is determined by
* the store that it is given. The store is an abstraction that
* handles the data that the consumer needs to manage between http
* requests in order to operate efficiently and securely.
*
* Several store implementation are provided, and the interface is
* fully documented so that custom stores can be used as well. See
* the documentation for the Auth_OpenID_Consumer class for more
* information on the interface for stores. The implementations that
* are provided allow the consumer site to store the necessary data in
* several different ways, including several SQL databases and normal
* files on disk.
*
* There is an additional concrete store provided that puts the system
* in dumb mode. This is not recommended, as it removes the library's
* ability to stop replay attacks reliably. It still uses time-based
* checking to make replay attacks only possible within a small
* window, but they remain possible within that window. This store
* should only be used if the consumer site has no way to retain data
* between requests at all.
*
* IMMEDIATE MODE
*
* In the flow described above, the user may need to confirm to the
* lidentity server that it's ok to authorize his or her identity.
* The server may draw pages asking for information from the user
* before it redirects the browser back to the consumer's site. This
* is generally transparent to the consumer site, so it is typically
* ignored as an implementation detail.
*
* There can be times, however, where the consumer site wants to get a
* response immediately. When this is the case, the consumer can put
* the library in immediate mode. In immediate mode, there is an
* extra response possible from the server, which is essentially the
* server reporting that it doesn't have enough information to answer
* the question yet. In addition to saying that, the identity server
* provides a URL to which the user can be sent to provide the needed
* information and let the server finish handling the original
* request.
*
* USING THIS LIBRARY
*
* Integrating this library into an application is usually a
* relatively straightforward process. The process should basically
* follow this plan:
*
* Add an OpenID login field somewhere on your site. When an OpenID
* is entered in that field and the form is submitted, it should make
* a request to the your site which includes that OpenID URL.
*
* First, the application should instantiate the Auth_OpenID_Consumer
* class using the store of choice (Auth_OpenID_FileStore or one of
* the SQL-based stores). If the application has any sort of session
* framework that provides per-client state management, a dict-like
* object to access the session should be passed as the optional
* second parameter. (The default behavior is to use PHP's standard
* session machinery.)
*
* Next, the application should call the Auth_OpenID_Consumer object's
* 'begin' method. This method takes the OpenID URL. The 'begin'
* method returns an Auth_OpenID_AuthRequest object.
*
* Next, the application should call the 'redirectURL' method of the
* Auth_OpenID_AuthRequest object. The 'return_to' URL parameter is
* the URL that the OpenID server will send the user back to after
* attempting to verify his or her identity. The 'trust_root' is the
* URL (or URL pattern) that identifies your web site to the user when
* he or she is authorizing it. Send a redirect to the resulting URL
* to the user's browser.
*
* That's the first half of the authentication process. The second
* half of the process is done after the user's ID server sends the
* user's browser a redirect back to your site to complete their
* login.
*
* When that happens, the user will contact your site at the URL given
* as the 'return_to' URL to the Auth_OpenID_AuthRequest::redirectURL
* call made above. The request will have several query parameters
* added to the URL by the identity server as the information
* necessary to finish the request.
*
* Lastly, instantiate an Auth_OpenID_Consumer instance as above and
* call its 'complete' method, passing in all the received query
* arguments.
*
* There are multiple possible return types possible from that
* method. These indicate the whether or not the login was successful,
* and include any additional information appropriate for their type.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Require utility classes and functions for the consumer.
*/
require_once "Auth/OpenID.php";
require_once "Auth/OpenID/HMACSHA1.php";
require_once "Auth/OpenID/Association.php";
require_once "Auth/OpenID/CryptUtil.php";
require_once "Auth/OpenID/DiffieHellman.php";
require_once "Auth/OpenID/KVForm.php";
require_once "Auth/OpenID/Discover.php";
require_once "Services/Yadis/Manager.php";
require_once "Services/Yadis/XRI.php";
 
/**
* This is the status code returned when the complete method returns
* successfully.
*/
define('Auth_OpenID_SUCCESS', 'success');
 
/**
* Status to indicate cancellation of OpenID authentication.
*/
define('Auth_OpenID_CANCEL', 'cancel');
 
/**
* This is the status code completeAuth returns when the value it
* received indicated an invalid login.
*/
define('Auth_OpenID_FAILURE', 'failure');
 
/**
* This is the status code completeAuth returns when the
* {@link Auth_OpenID_Consumer} instance is in immediate mode, and the
* identity server sends back a URL to send the user to to complete his
* or her login.
*/
define('Auth_OpenID_SETUP_NEEDED', 'setup needed');
 
/**
* This is the status code beginAuth returns when the page fetched
* from the entered OpenID URL doesn't contain the necessary link tags
* to function as an identity page.
*/
define('Auth_OpenID_PARSE_ERROR', 'parse error');
 
/**
* This is the characters that the nonces are made from.
*/
define('Auth_OpenID_DEFAULT_NONCE_CHRS',"abcdefghijklmnopqrstuvwxyz" .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
 
/**
* An OpenID consumer implementation that performs discovery and does
* session management. See the Consumer.php file documentation for
* more information.
*
* @package OpenID
*/
class Auth_OpenID_Consumer {
 
/**
* @access private
*/
var $session_key_prefix = "_openid_consumer_";
 
/**
* @access private
*/
var $_token_suffix = "last_token";
 
/**
* Initialize a Consumer instance.
*
* You should create a new instance of the Consumer object with
* every HTTP request that handles OpenID transactions.
*
* @param Auth_OpenID_OpenIDStore $store This must be an object
* that implements the interface in {@link
* Auth_OpenID_OpenIDStore}. Several concrete implementations are
* provided, to cover most common use cases. For stores backed by
* MySQL, PostgreSQL, or SQLite, see the {@link
* Auth_OpenID_SQLStore} class and its sublcasses. For a
* filesystem-backed store, see the {@link Auth_OpenID_FileStore}
* module. As a last resort, if it isn't possible for the server
* to store state at all, an instance of {@link
* Auth_OpenID_DumbStore} can be used.
*
* @param mixed session An object which implements the interface
* of the Services_Yadis_Session class. Particularly, this object
* is expected to have these methods: get($key), set($key,
* $value), and del($key). This defaults to a session object
* which wraps PHP's native session machinery. You should only
* need to pass something here if you have your own sessioning
* implementation.
*/
function Auth_OpenID_Consumer(&$store, $session = null)
{
if ($session === null) {
$session = new Services_Yadis_PHPSession();
}
 
$this->session =& $session;
$this->consumer =& new Auth_OpenID_GenericConsumer($store);
$this->_token_key = $this->session_key_prefix . $this->_token_suffix;
}
 
/**
* Start the OpenID authentication process. See steps 1-2 in the
* overview at the top of this file.
*
* @param User_url: Identity URL given by the user. This method
* performs a textual transformation of the URL to try and make
* sure it is normalized. For example, a user_url of example.com
* will be normalized to http://example.com/ normalizing and
* resolving any redirects the server might issue.
*
* @return Auth_OpenID_AuthRequest $auth_request An object
* containing the discovered information will be returned, with a
* method for building a redirect URL to the server, as described
* in step 3 of the overview. This object may also be used to add
* extension arguments to the request, using its 'addExtensionArg'
* method.
*/
function begin($user_url)
{
$discoverMethod = '_Auth_OpenID_discoverServiceList';
$openid_url = $user_url;
 
if (Services_Yadis_identifierScheme($user_url) == 'XRI') {
$discoverMethod = '_Auth_OpenID_discoverXRIServiceList';
} else {
$openid_url = Auth_OpenID::normalizeUrl($user_url);
}
 
$disco =& new Services_Yadis_Discovery($this->session,
$openid_url,
$this->session_key_prefix);
 
// Set the 'stale' attribute of the manager. If discovery
// fails in a fatal way, the stale flag will cause the manager
// to be cleaned up next time discovery is attempted.
 
$m = $disco->getManager();
$loader = new Services_Yadis_ManagerLoader();
 
if ($m) {
if ($m->stale) {
$disco->destroyManager();
} else {
$m->stale = true;
$disco->session->set($disco->session_key,
serialize($loader->toSession($m)));
}
}
 
$endpoint = $disco->getNextService($discoverMethod,
$this->consumer->fetcher);
 
// Reset the 'stale' attribute of the manager.
$m =& $disco->getManager();
if ($m) {
$m->stale = false;
$disco->session->set($disco->session_key,
serialize($loader->toSession($m)));
}
 
if ($endpoint === null) {
return null;
} else {
return $this->beginWithoutDiscovery($endpoint);
}
}
 
/**
* Start OpenID verification without doing OpenID server
* discovery. This method is used internally by Consumer.begin
* after discovery is performed, and exists to provide an
* interface for library users needing to perform their own
* discovery.
*
* @param Auth_OpenID_ServiceEndpoint $endpoint an OpenID service
* endpoint descriptor.
*
* @return Auth_OpenID_AuthRequest $auth_request An OpenID
* authentication request object.
*/
function &beginWithoutDiscovery($endpoint)
{
$loader = new Auth_OpenID_ServiceEndpointLoader();
$auth_req = $this->consumer->begin($endpoint);
$this->session->set($this->_token_key,
$loader->toSession($auth_req->endpoint));
return $auth_req;
}
 
/**
* Called to interpret the server's response to an OpenID
* request. It is called in step 4 of the flow described in the
* consumer overview.
*
* @param array $query An array of the query parameters (key =>
* value pairs) for this HTTP request.
*
* @return Auth_OpenID_ConsumerResponse $response A instance of an
* Auth_OpenID_ConsumerResponse subclass. The type of response is
* indicated by the status attribute, which will be one of
* SUCCESS, CANCEL, FAILURE, or SETUP_NEEDED.
*/
function complete($query)
{
$query = Auth_OpenID::fixArgs($query);
 
$loader = new Auth_OpenID_ServiceEndpointLoader();
$endpoint_data = $this->session->get($this->_token_key);
$endpoint =
$loader->fromSession($endpoint_data);
 
if ($endpoint === null) {
$response = new Auth_OpenID_FailureResponse(null,
'No session state found');
} else {
$response = $this->consumer->complete($query, $endpoint);
$this->session->del($this->_token_key);
}
 
if (in_array($response->status, array(Auth_OpenID_SUCCESS,
Auth_OpenID_CANCEL))) {
if ($response->identity_url !== null) {
$disco = new Services_Yadis_Discovery($this->session,
$response->identity_url,
$this->session_key_prefix);
$disco->cleanup();
}
}
 
return $response;
}
}
 
class Auth_OpenID_DiffieHellmanConsumerSession {
var $session_type = 'DH-SHA1';
 
function Auth_OpenID_DiffieHellmanConsumerSession($dh = null)
{
if ($dh === null) {
$dh = new Auth_OpenID_DiffieHellman();
}
 
$this->dh = $dh;
}
 
function getRequest()
{
$math =& Auth_OpenID_getMathLib();
 
$cpub = $math->longToBase64($this->dh->public);
 
$args = array('openid.dh_consumer_public' => $cpub);
 
if (!$this->dh->usingDefaultValues()) {
$args = array_merge($args, array(
'openid.dh_modulus' =>
$math->longToBase64($this->dh->mod),
'openid.dh_gen' =>
$math->longToBase64($this->dh->gen)));
}
 
return $args;
}
 
function extractSecret($response)
{
if (!array_key_exists('dh_server_public', $response)) {
return null;
}
 
if (!array_key_exists('enc_mac_key', $response)) {
return null;
}
 
$math =& Auth_OpenID_getMathLib();
$spub = $math->base64ToLong($response['dh_server_public']);
$enc_mac_key = base64_decode($response['enc_mac_key']);
 
return $this->dh->xorSecret($spub, $enc_mac_key);
}
}
 
class Auth_OpenID_PlainTextConsumerSession {
var $session_type = null;
 
function getRequest()
{
return array();
}
 
function extractSecret($response)
{
if (!array_key_exists('mac_key', $response)) {
return null;
}
 
return base64_decode($response['mac_key']);
}
}
 
/**
* This class is the interface to the OpenID consumer logic.
* Instances of it maintain no per-request state, so they can be
* reused (or even used by multiple threads concurrently) as needed.
*
* @package OpenID
* @access private
*/
class Auth_OpenID_GenericConsumer {
/**
* This consumer's store object.
*/
var $store;
 
/**
* @access private
*/
var $_use_assocs;
 
/**
* This is the number of characters in the generated nonce for
* each transaction.
*/
var $nonce_len = 8;
 
/**
* What characters are allowed in nonces
*/
var $nonce_chrs = Auth_OpenID_DEFAULT_NONCE_CHRS;
 
/**
* This method initializes a new {@link Auth_OpenID_Consumer}
* instance to access the library.
*
* @param Auth_OpenID_OpenIDStore $store This must be an object
* that implements the interface in {@link Auth_OpenID_OpenIDStore}.
* Several concrete implementations are provided, to cover most common use
* cases. For stores backed by MySQL, PostgreSQL, or SQLite, see
* the {@link Auth_OpenID_SQLStore} class and its sublcasses. For a
* filesystem-backed store, see the {@link Auth_OpenID_FileStore} module.
* As a last resort, if it isn't possible for the server to store
* state at all, an instance of {@link Auth_OpenID_DumbStore} can be used.
*
* @param bool $immediate This is an optional boolean value. It
* controls whether the library uses immediate mode, as explained
* in the module description. The default value is False, which
* disables immediate mode.
*/
function Auth_OpenID_GenericConsumer(&$store)
{
$this->store =& $store;
$this->_use_assocs =
!(defined('Auth_OpenID_NO_MATH_SUPPORT') ||
($this->store && $this->store->isDumb()));
 
$this->fetcher = Services_Yadis_Yadis::getHTTPFetcher();
}
 
function begin($service_endpoint)
{
$nonce = $this->_createNonce();
$assoc = $this->_getAssociation($service_endpoint->server_url);
$r = new Auth_OpenID_AuthRequest($assoc, $service_endpoint);
$r->return_to_args['nonce'] = $nonce;
return $r;
}
 
function complete($query, $endpoint)
{
$mode = Auth_OpenID::arrayGet($query, 'openid.mode',
'<no mode specified>');
 
if ($mode == Auth_OpenID_CANCEL) {
return new Auth_OpenID_CancelResponse($endpoint);
} else if ($mode == 'error') {
$error = Auth_OpenID::arrayGet($query, 'openid.error');
return new Auth_OpenID_FailureResponse($endpoint, $error);
} else if ($mode == 'id_res') {
if ($endpoint->identity_url === null) {
return new Auth_OpenID_FailureResponse($identity_url,
"No session state found");
}
 
$response = $this->_doIdRes($query, $endpoint);
 
if ($response === null) {
return new Auth_OpenID_FailureResponse($endpoint,
"HTTP request failed");
}
if ($response->status == Auth_OpenID_SUCCESS) {
return $this->_checkNonce($response,
Auth_OpenID::arrayGet($query,
'nonce'));
} else {
return $response;
}
} else {
return new Auth_OpenID_FailureResponse($endpoint,
sprintf("Invalid openid.mode '%s'",
$mode));
}
}
 
/**
* @access private
*/
function _doIdRes($query, $endpoint)
{
$user_setup_url = Auth_OpenID::arrayGet($query,
'openid.user_setup_url');
 
if ($user_setup_url !== null) {
return new Auth_OpenID_SetupNeededResponse($endpoint,
$user_setup_url);
}
 
$return_to = Auth_OpenID::arrayGet($query, 'openid.return_to', null);
$server_id2 = Auth_OpenID::arrayGet($query, 'openid.identity', null);
$assoc_handle = Auth_OpenID::arrayGet($query,
'openid.assoc_handle', null);
 
if (($return_to === null) ||
($server_id2 === null) ||
($assoc_handle === null)) {
return new Auth_OpenID_FailureResponse($endpoint,
"Missing required field");
}
 
if ($endpoint->getServerID() != $server_id2) {
return new Auth_OpenID_FailureResponse($endpoint,
"Server ID (delegate) mismatch");
}
 
$signed = Auth_OpenID::arrayGet($query, 'openid.signed');
 
$assoc = $this->store->getAssociation($endpoint->server_url,
$assoc_handle);
 
if ($assoc === null) {
// It's not an association we know about. Dumb mode is
// our only possible path for recovery.
if ($this->_checkAuth($query, $endpoint->server_url)) {
return new Auth_OpenID_SuccessResponse($endpoint, $query,
$signed);
} else {
return new Auth_OpenID_FailureResponse($endpoint,
"Server denied check_authentication");
}
}
 
if ($assoc->getExpiresIn() <= 0) {
$msg = sprintf("Association with %s expired",
$endpoint->server_url);
return new Auth_OpenID_FailureResponse($endpoint, $msg);
}
 
// Check the signature
$sig = Auth_OpenID::arrayGet($query, 'openid.sig', null);
if (($sig === null) ||
($signed === null)) {
return new Auth_OpenID_FailureResponse($endpoint,
"Missing argument signature");
}
 
$signed_list = explode(",", $signed);
 
//Fail if the identity field is present but not signed
if (($endpoint->identity_url !== null) &&
(!in_array('identity', $signed_list))) {
$msg = '"openid.identity" not signed';
return new Auth_OpenID_FailureResponse($endpoint, $msg);
}
 
$v_sig = $assoc->signDict($signed_list, $query);
 
if ($v_sig != $sig) {
return new Auth_OpenID_FailureResponse($endpoint,
"Bad signature");
}
 
return Auth_OpenID_SuccessResponse::fromQuery($endpoint,
$query, $signed);
}
 
/**
* @access private
*/
function _checkAuth($query, $server_url)
{
$request = $this->_createCheckAuthRequest($query);
if ($request === null) {
return false;
}
 
$response = $this->_makeKVPost($request, $server_url);
if ($response == null) {
return false;
}
 
return $this->_processCheckAuthResponse($response, $server_url);
}
 
/**
* @access private
*/
function _createCheckAuthRequest($query)
{
$signed = Auth_OpenID::arrayGet($query, 'openid.signed', null);
if ($signed === null) {
return null;
}
 
$whitelist = array('assoc_handle', 'sig',
'signed', 'invalidate_handle');
 
$signed = array_merge(explode(",", $signed), $whitelist);
 
$check_args = array();
 
foreach ($query as $key => $value) {
if (in_array(substr($key, 7), $signed)) {
$check_args[$key] = $value;
}
}
 
$check_args['openid.mode'] = 'check_authentication';
return $check_args;
}
 
/**
* @access private
*/
function _processCheckAuthResponse($response, $server_url)
{
$is_valid = Auth_OpenID::arrayGet($response, 'is_valid', 'false');
 
$invalidate_handle = Auth_OpenID::arrayGet($response,
'invalidate_handle');
 
if ($invalidate_handle !== null) {
$this->store->removeAssociation($server_url,
$invalidate_handle);
}
 
if ($is_valid == 'true') {
return true;
}
 
return false;
}
 
/**
* @access private
*/
function _makeKVPost($args, $server_url)
{
$mode = $args['openid.mode'];
 
$pairs = array();
foreach ($args as $k => $v) {
$v = urlencode($v);
$pairs[] = "$k=$v";
}
 
$body = implode("&", $pairs);
 
$resp = $this->fetcher->post($server_url, $body);
 
if ($resp === null) {
return null;
}
 
$response = Auth_OpenID_KVForm::toArray($resp->body);
 
if ($resp->status == 400) {
return null;
} else if ($resp->status != 200) {
return null;
}
 
return $response;
}
 
/**
* @access private
*/
function _checkNonce($response, $nonce)
{
$parsed_url = parse_url($response->getReturnTo());
$query_str = @$parsed_url['query'];
$query = array();
parse_str($query_str, $query);
 
$found = false;
 
foreach ($query as $k => $v) {
if ($k == 'nonce') {
if ($v != $nonce) {
return new Auth_OpenID_FailureResponse($response,
"Nonce mismatch");
} else {
$found = true;
break;
}
}
}
 
if (!$found) {
return new Auth_OpenID_FailureResponse($response,
sprintf("Nonce missing from return_to: %s",
$response->getReturnTo()));
}
 
if (!$this->store->useNonce($nonce)) {
return new Auth_OpenID_FailureResponse($response,
"Nonce missing from store");
}
 
return $response;
}
 
/**
* @access private
*/
function _createNonce()
{
$nonce = Auth_OpenID_CryptUtil::randomString($this->nonce_len,
$this->nonce_chrs);
$this->store->storeNonce($nonce);
return $nonce;
}
 
/**
* @access protected
*/
function _createDiffieHellman()
{
return new Auth_OpenID_DiffieHellman();
}
 
/**
* @access private
*/
function _getAssociation($server_url)
{
if (!$this->_use_assocs) {
return null;
}
 
$assoc = $this->store->getAssociation($server_url);
 
if (($assoc === null) ||
($assoc->getExpiresIn() <= 0)) {
 
$parts = $this->_createAssociateRequest($server_url);
 
if ($parts === null) {
return null;
}
 
list($assoc_session, $args) = $parts;
 
$response = $this->_makeKVPost($args, $server_url);
 
if ($response === null) {
$assoc = null;
} else {
$assoc = $this->_parseAssociation($response, $assoc_session,
$server_url);
}
}
 
return $assoc;
}
 
function _createAssociateRequest($server_url)
{
$parts = parse_url($server_url);
 
if ($parts === false) {
return null;
}
 
if (array_key_exists('scheme', $parts)) {
$proto = $parts['scheme'];
} else {
$proto = 'http';
}
 
if ($proto == 'https') {
$assoc_session = new Auth_OpenID_PlainTextConsumerSession();
} else {
$assoc_session = new Auth_OpenID_DiffieHellmanConsumerSession();
}
 
$args = array(
'openid.mode' => 'associate',
'openid.assoc_type' => 'HMAC-SHA1');
 
if ($assoc_session->session_type !== null) {
$args['openid.session_type'] = $assoc_session->session_type;
}
 
$args = array_merge($args, $assoc_session->getRequest());
return array($assoc_session, $args);
}
 
/**
* @access private
*/
function _parseAssociation($results, $assoc_session, $server_url)
{
$required_keys = array('assoc_type', 'assoc_handle',
'expires_in');
 
foreach ($required_keys as $key) {
if (!array_key_exists($key, $results)) {
return null;
}
}
 
$assoc_type = $results['assoc_type'];
$assoc_handle = $results['assoc_handle'];
$expires_in_str = $results['expires_in'];
 
if ($assoc_type != 'HMAC-SHA1') {
return null;
}
 
$expires_in = intval($expires_in_str);
 
if ($expires_in <= 0) {
return null;
}
 
$session_type = Auth_OpenID::arrayGet($results, 'session_type');
if ($session_type != $assoc_session->session_type) {
if ($session_type === null) {
$assoc_session = new Auth_OpenID_PlainTextConsumerSession();
} else {
return null;
}
}
 
$secret = $assoc_session->extractSecret($results);
 
if (!$secret) {
return null;
}
 
$assoc = Auth_OpenID_Association::fromExpiresIn(
$expires_in, $assoc_handle, $secret, $assoc_type);
$this->store->storeAssociation($server_url, $assoc);
 
return $assoc;
}
}
 
/**
* This class represents an authentication request from a consumer to
* an OpenID server.
*
* @package OpenID
*/
class Auth_OpenID_AuthRequest {
 
/**
* Initialize an authentication request with the specified token,
* association, and endpoint.
*
* Users of this library should not create instances of this
* class. Instances of this class are created by the library when
* needed.
*/
function Auth_OpenID_AuthRequest($assoc, $endpoint)
{
$this->assoc = $assoc;
$this->endpoint = $endpoint;
$this->extra_args = array();
$this->return_to_args = array();
}
 
/**
* Add an extension argument to this OpenID authentication
* request.
*
* Use caution when adding arguments, because they will be
* URL-escaped and appended to the redirect URL, which can easily
* get quite long.
*
* @param string $namespace The namespace for the extension. For
* example, the simple registration extension uses the namespace
* 'sreg'.
*
* @param string $key The key within the extension namespace. For
* example, the nickname field in the simple registration
* extension's key is 'nickname'.
*
* @param string $value The value to provide to the server for
* this argument.
*/
function addExtensionArg($namespace, $key, $value)
{
$arg_name = implode('.', array('openid', $namespace, $key));
$this->extra_args[$arg_name] = $value;
}
 
/**
* Compute the appropriate redirection URL for this request based
* on a specified trust root and return-to.
*
* @param string $trust_root The trust root URI for your
* application.
*
* @param string$ $return_to The return-to URL to be used when the
* OpenID server redirects the user back to your site.
*
* @return string $redirect_url The resulting redirect URL that
* you should send to the user agent.
*/
function redirectURL($trust_root, $return_to, $immediate=false)
{
if ($immediate) {
$mode = 'checkid_immediate';
} else {
$mode = 'checkid_setup';
}
 
$return_to = Auth_OpenID::appendArgs($return_to, $this->return_to_args);
 
$redir_args = array(
'openid.mode' => $mode,
'openid.identity' => $this->endpoint->getServerID(),
'openid.return_to' => $return_to,
'openid.trust_root' => $trust_root);
 
if ($this->assoc) {
$redir_args['openid.assoc_handle'] = $this->assoc->handle;
}
 
$redir_args = array_merge($redir_args, $this->extra_args);
 
return Auth_OpenID::appendArgs($this->endpoint->server_url,
$redir_args);
}
}
 
/**
* The base class for responses from the Auth_OpenID_Consumer.
*
* @package OpenID
*/
class Auth_OpenID_ConsumerResponse {
var $status = null;
}
 
/**
* A response with a status of Auth_OpenID_SUCCESS. Indicates that
* this request is a successful acknowledgement from the OpenID server
* that the supplied URL is, indeed controlled by the requesting
* agent. This has three relevant attributes:
*
* identity_url - The identity URL that has been authenticated
*
* signed_args - The arguments in the server's response that were
* signed and verified.
*
* status - Auth_OpenID_SUCCESS.
*
* @package OpenID
*/
class Auth_OpenID_SuccessResponse extends Auth_OpenID_ConsumerResponse {
var $status = Auth_OpenID_SUCCESS;
 
/**
* @access private
*/
function Auth_OpenID_SuccessResponse($endpoint, $signed_args)
{
$this->endpoint = $endpoint;
$this->identity_url = $endpoint->identity_url;
$this->signed_args = $signed_args;
}
 
/**
* @access private
*/
function fromQuery($endpoint, $query, $signed)
{
$signed_args = array();
foreach (explode(",", $signed) as $field_name) {
$field_name = 'openid.' . $field_name;
$signed_args[$field_name] = Auth_OpenID::arrayGet($query,
$field_name, '');
}
return new Auth_OpenID_SuccessResponse($endpoint, $signed_args);
}
 
/**
* Extract signed extension data from the server's response.
*
* @param string $prefix The extension namespace from which to
* extract the extension data.
*/
function extensionResponse($prefix)
{
$response = array();
$prefix = sprintf('openid.%s.', $prefix);
$prefix_len = strlen($prefix);
foreach ($this->signed_args as $k => $v) {
if (strpos($k, $prefix) === 0) {
$response_key = substr($k, $prefix_len);
$response[$response_key] = $v;
}
}
 
return $response;
}
 
/**
* Get the openid.return_to argument from this response.
*
* This is useful for verifying that this request was initiated by
* this consumer.
*
* @return string $return_to The return_to URL supplied to the
* server on the initial request, or null if the response did not
* contain an 'openid.return_to' argument.
*/
function getReturnTo()
{
return Auth_OpenID::arrayGet($this->signed_args, 'openid.return_to');
}
}
 
/**
* A response with a status of Auth_OpenID_FAILURE. Indicates that the
* OpenID protocol has failed. This could be locally or remotely
* triggered. This has three relevant attributes:
*
* identity_url - The identity URL for which authentication was
* attempted, if it can be determined. Otherwise, null.
*
* message - A message indicating why the request failed, if one is
* supplied. Otherwise, null.
*
* status - Auth_OpenID_FAILURE.
*
* @package OpenID
*/
class Auth_OpenID_FailureResponse extends Auth_OpenID_ConsumerResponse {
var $status = Auth_OpenID_FAILURE;
 
function Auth_OpenID_FailureResponse($endpoint, $message = null)
{
$this->endpoint = $endpoint;
if ($endpoint !== null) {
$this->identity_url = $endpoint->identity_url;
} else {
$this->identity_url = null;
}
$this->message = $message;
}
}
 
/**
* A response with a status of Auth_OpenID_CANCEL. Indicates that the
* user cancelled the OpenID authentication request. This has two
* relevant attributes:
*
* identity_url - The identity URL for which authentication was
* attempted, if it can be determined. Otherwise, null.
*
* status - Auth_OpenID_SUCCESS.
*
* @package OpenID
*/
class Auth_OpenID_CancelResponse extends Auth_OpenID_ConsumerResponse {
var $status = Auth_OpenID_CANCEL;
 
function Auth_OpenID_CancelResponse($endpoint)
{
$this->endpoint = $endpoint;
$this->identity_url = $endpoint->identity_url;
}
}
 
/**
* A response with a status of Auth_OpenID_SETUP_NEEDED. Indicates
* that the request was in immediate mode, and the server is unable to
* authenticate the user without further interaction.
*
* identity_url - The identity URL for which authentication was
* attempted.
*
* setup_url - A URL that can be used to send the user to the server
* to set up for authentication. The user should be redirected in to
* the setup_url, either in the current window or in a new browser
* window.
*
* status - Auth_OpenID_SETUP_NEEDED.
*
* @package OpenID
*/
class Auth_OpenID_SetupNeededResponse extends Auth_OpenID_ConsumerResponse {
var $status = Auth_OpenID_SETUP_NEEDED;
 
function Auth_OpenID_SetupNeededResponse($endpoint,
$setup_url = null)
{
$this->endpoint = $endpoint;
$this->identity_url = $endpoint->identity_url;
$this->setup_url = $setup_url;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/URINorm.php
New file
0,0 → 1,231
<?php
 
/**
* URI normalization routines.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
require_once 'Services/Yadis/Misc.php';
 
// from appendix B of rfc 3986 (http://www.ietf.org/rfc/rfc3986.txt)
function Auth_OpenID_getURIPattern()
{
return '&^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?&';
}
 
function Auth_OpenID_getAuthorityPattern()
{
return '/^([^@]*@)?([^:]*)(:.*)?/';
}
 
function Auth_OpenID_getEncodedPattern()
{
return '/%([0-9A-Fa-f]{2})/';
}
 
function Auth_OpenID_getUnreserved()
{
$_unreserved = array();
for ($i = 0; $i < 256; $i++) {
$_unreserved[$i] = false;
}
 
for ($i = ord('A'); $i <= ord('Z'); $i++) {
$_unreserved[$i] = true;
}
 
for ($i = ord('0'); $i <= ord('9'); $i++) {
$_unreserved[$i] = true;
}
 
for ($i = ord('a'); $i <= ord('z'); $i++) {
$_unreserved[$i] = true;
}
 
$_unreserved[ord('-')] = true;
$_unreserved[ord('.')] = true;
$_unreserved[ord('_')] = true;
$_unreserved[ord('~')] = true;
 
return $_unreserved;
}
 
function Auth_OpenID_getEscapeRE()
{
$parts = array();
foreach (array_merge(Services_Yadis_getUCSChars(),
Services_Yadis_getIPrivateChars()) as $pair) {
list($m, $n) = $pair;
$parts[] = sprintf("%s-%s", chr($m), chr($n));
}
 
return sprintf('[%s]', implode('', $parts));
}
 
function Auth_OpenID_pct_encoded_replace_unreserved($mo)
{
$_unreserved = Auth_OpenID_getUnreserved();
 
$i = intval($mo[1], 16);
if ($_unreserved[$i]) {
return chr($i);
} else {
return strtoupper($mo[0]);
}
 
return $mo[0];
}
 
function Auth_OpenID_pct_encoded_replace($mo)
{
return chr(intval($mo[1], 16));
}
 
function Auth_OpenID_remove_dot_segments($path)
{
$result_segments = array();
while ($path) {
if (Services_Yadis_startswith($path, '../')) {
$path = substr($path, 3);
} else if (Services_Yadis_startswith($path, './')) {
$path = substr($path, 2);
} else if (Services_Yadis_startswith($path, '/./')) {
$path = substr($path, 2);
} else if ($path == '/.') {
$path = '/';
} else if (Services_Yadis_startswith($path, '/../')) {
$path = substr($path, 3);
if ($result_segments) {
array_pop($result_segments);
}
} else if ($path == '/..') {
$path = '/';
if ($result_segments) {
array_pop($result_segments);
}
} else if (($path == '..') ||
($path == '.')) {
$path = '';
} else {
$i = 0;
if ($path[0] == '/') {
$i = 1;
}
$i = strpos($path, '/', $i);
if ($i === false) {
$i = strlen($path);
}
$result_segments[] = substr($path, 0, $i);
$path = substr($path, $i);
}
}
 
return implode('', $result_segments);
}
 
function Auth_OpenID_urinorm($uri)
{
$uri_matches = array();
preg_match(Auth_OpenID_getURIPattern(), $uri, $uri_matches);
 
if (count($uri_matches) < 9) {
for ($i = count($uri_matches); $i <= 9; $i++) {
$uri_matches[] = '';
}
}
 
$scheme = $uri_matches[2];
if ($scheme) {
$scheme = strtolower($scheme);
}
 
$scheme = $uri_matches[2];
if ($scheme === '') {
// No scheme specified
return null;
}
 
$scheme = strtolower($scheme);
if (!in_array($scheme, array('http', 'https'))) {
// Not an absolute HTTP or HTTPS URI
return null;
}
 
$authority = $uri_matches[4];
if ($authority === '') {
// Not an absolute URI
return null;
}
 
$authority_matches = array();
preg_match(Auth_OpenID_getAuthorityPattern(),
$authority, $authority_matches);
if (count($authority_matches) === 0) {
// URI does not have a valid authority
return null;
}
 
if (count($authority_matches) < 4) {
for ($i = count($authority_matches); $i <= 4; $i++) {
$authority_matches[] = '';
}
}
 
list($_whole, $userinfo, $host, $port) = $authority_matches;
 
if ($userinfo === null) {
$userinfo = '';
}
 
if (strpos($host, '%') !== -1) {
$host = strtolower($host);
$host = preg_replace_callback(
Auth_OpenID_getEncodedPattern(),
'Auth_OpenID_pct_encoded_replace', $host);
// NO IDNA.
// $host = unicode($host, 'utf-8').encode('idna');
} else {
$host = strtolower($host);
}
 
if ($port) {
if (($port == ':') ||
($scheme == 'http' && $port == ':80') ||
($scheme == 'https' && $port == ':443')) {
$port = '';
}
} else {
$port = '';
}
 
$authority = $userinfo . $host . $port;
 
$path = $uri_matches[5];
$path = preg_replace_callback(
Auth_OpenID_getEncodedPattern(),
'Auth_OpenID_pct_encoded_replace_unreserved', $path);
 
$path = Auth_OpenID_remove_dot_segments($path);
if (!$path) {
$path = '/';
}
 
$query = $uri_matches[6];
if ($query === null) {
$query = '';
}
 
$fragment = $uri_matches[8];
if ($fragment === null) {
$fragment = '';
}
 
return $scheme . '://' . $authority . $path . $query . $fragment;
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/FileStore.php
New file
0,0 → 1,674
<?php
 
/**
* This file supplies a Memcached store backend for OpenID servers and
* consumers.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*
*/
 
/**
* Require base class for creating a new interface.
*/
require_once 'Auth/OpenID.php';
require_once 'Auth/OpenID/Interface.php';
require_once 'Auth/OpenID/HMACSHA1.php';
 
/**
* This is a filesystem-based store for OpenID associations and
* nonces. This store should be safe for use in concurrent systems on
* both windows and unix (excluding NFS filesystems). There are a
* couple race conditions in the system, but those failure cases have
* been set up in such a way that the worst-case behavior is someone
* having to try to log in a second time.
*
* Most of the methods of this class are implementation details.
* People wishing to just use this store need only pay attention to
* the constructor.
*
* @package OpenID
*/
class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore {
 
/**
* Initializes a new {@link Auth_OpenID_FileStore}. This
* initializes the nonce and association directories, which are
* subdirectories of the directory passed in.
*
* @param string $directory This is the directory to put the store
* directories in.
*/
function Auth_OpenID_FileStore($directory)
{
if (!Auth_OpenID::ensureDir($directory)) {
trigger_error('Not a directory and failed to create: '
. $directory, E_USER_ERROR);
}
$directory = realpath($directory);
 
$this->directory = $directory;
$this->active = true;
 
$this->nonce_dir = $directory . DIRECTORY_SEPARATOR . 'nonces';
 
$this->association_dir = $directory . DIRECTORY_SEPARATOR .
'associations';
 
// Temp dir must be on the same filesystem as the assciations
// $directory and the $directory containing the auth key file.
$this->temp_dir = $directory . DIRECTORY_SEPARATOR . 'temp';
 
$this->auth_key_name = $directory . DIRECTORY_SEPARATOR . 'auth_key';
 
$this->max_nonce_age = 6 * 60 * 60; // Six hours, in seconds
 
if (!$this->_setup()) {
trigger_error('Failed to initialize OpenID file store in ' .
$directory, E_USER_ERROR);
}
}
 
function destroy()
{
Auth_OpenID_FileStore::_rmtree($this->directory);
$this->active = false;
}
 
/**
* Make sure that the directories in which we store our data
* exist.
*
* @access private
*/
function _setup()
{
return (Auth_OpenID::ensureDir(dirname($this->auth_key_name)) &&
Auth_OpenID::ensureDir($this->nonce_dir) &&
Auth_OpenID::ensureDir($this->association_dir) &&
Auth_OpenID::ensureDir($this->temp_dir));
}
 
/**
* Create a temporary file on the same filesystem as
* $this->auth_key_name and $this->association_dir.
*
* The temporary directory should not be cleaned if there are any
* processes using the store. If there is no active process using
* the store, it is safe to remove all of the files in the
* temporary directory.
*
* @return array ($fd, $filename)
* @access private
*/
function _mktemp()
{
$name = Auth_OpenID_FileStore::_mkstemp($dir = $this->temp_dir);
$file_obj = @fopen($name, 'wb');
if ($file_obj !== false) {
return array($file_obj, $name);
} else {
Auth_OpenID_FileStore::_removeIfPresent($name);
}
}
 
/**
* Read the auth key from the auth key file. Will return None if
* there is currently no key.
*
* @return mixed
*/
function readAuthKey()
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$auth_key_file = @fopen($this->auth_key_name, 'rb');
if ($auth_key_file === false) {
return null;
}
 
$key = fread($auth_key_file, filesize($this->auth_key_name));
fclose($auth_key_file);
 
return $key;
}
 
/**
* Generate a new random auth key and safely store it in the
* location specified by $this->auth_key_name.
*
* @return string $key
*/
function createAuthKey()
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$auth_key = Auth_OpenID_CryptUtil::randomString($this->AUTH_KEY_LEN);
 
list($file_obj, $tmp) = $this->_mktemp();
 
fwrite($file_obj, $auth_key);
fflush($file_obj);
fclose($file_obj);
 
if (function_exists('link')) {
// Posix filesystem
$saved = link($tmp, $this->auth_key_name);
Auth_OpenID_FileStore::_removeIfPresent($tmp);
} else {
// Windows filesystem
$saved = rename($tmp, $this->auth_key_name);
}
 
if (!$saved) {
// The link failed, either because we lack the permission,
// or because the file already exists; try to read the key
// in case the file already existed.
$auth_key = $this->readAuthKey();
}
 
return $auth_key;
}
 
/**
* Retrieve the auth key from the file specified by
* $this->auth_key_name, creating it if it does not exist.
*
* @return string $key
*/
function getAuthKey()
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$auth_key = $this->readAuthKey();
if ($auth_key === null) {
$auth_key = $this->createAuthKey();
 
if (strlen($auth_key) != $this->AUTH_KEY_LEN) {
$fmt = 'Got an invalid auth key from %s. Expected '.
'%d-byte string. Got: %s';
$msg = sprintf($fmt, $this->auth_key_name, $this->AUTH_KEY_LEN,
$auth_key);
trigger_error($msg, E_USER_WARNING);
return null;
}
}
return $auth_key;
}
 
/**
* Create a unique filename for a given server url and
* handle. This implementation does not assume anything about the
* format of the handle. The filename that is returned will
* contain the domain name from the server URL for ease of human
* inspection of the data directory.
*
* @return string $filename
*/
function getAssociationFilename($server_url, $handle)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
if (strpos($server_url, '://') === false) {
trigger_error(sprintf("Bad server URL: %s", $server_url),
E_USER_WARNING);
return null;
}
 
list($proto, $rest) = explode('://', $server_url, 2);
$parts = explode('/', $rest);
$domain = Auth_OpenID_FileStore::_filenameEscape($parts[0]);
$url_hash = Auth_OpenID_FileStore::_safe64($server_url);
if ($handle) {
$handle_hash = Auth_OpenID_FileStore::_safe64($handle);
} else {
$handle_hash = '';
}
 
$filename = sprintf('%s-%s-%s-%s', $proto, $domain, $url_hash,
$handle_hash);
 
return $this->association_dir. DIRECTORY_SEPARATOR . $filename;
}
 
/**
* Store an association in the association directory.
*/
function storeAssociation($server_url, $association)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return false;
}
 
$association_s = $association->serialize();
$filename = $this->getAssociationFilename($server_url,
$association->handle);
list($tmp_file, $tmp) = $this->_mktemp();
 
if (!$tmp_file) {
trigger_error("_mktemp didn't return a valid file descriptor",
E_USER_WARNING);
return false;
}
 
fwrite($tmp_file, $association_s);
 
fflush($tmp_file);
 
fclose($tmp_file);
 
if (@rename($tmp, $filename)) {
return true;
} else {
// In case we are running on Windows, try unlinking the
// file in case it exists.
@unlink($filename);
 
// Now the target should not exist. Try renaming again,
// giving up if it fails.
if (@rename($tmp, $filename)) {
return true;
}
}
 
// If there was an error, don't leave the temporary file
// around.
Auth_OpenID_FileStore::_removeIfPresent($tmp);
return false;
}
 
/**
* Retrieve an association. If no handle is specified, return the
* association with the most recent issue time.
*
* @return mixed $association
*/
function getAssociation($server_url, $handle = null)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
if ($handle === null) {
$handle = '';
}
 
// The filename with the empty handle is a prefix of all other
// associations for the given server URL.
$filename = $this->getAssociationFilename($server_url, $handle);
 
if ($handle) {
return $this->_getAssociation($filename);
} else {
$association_files =
Auth_OpenID_FileStore::_listdir($this->association_dir);
$matching_files = array();
 
// strip off the path to do the comparison
$name = basename($filename);
foreach ($association_files as $association_file) {
if (strpos($association_file, $name) === 0) {
$matching_files[] = $association_file;
}
}
 
$matching_associations = array();
// read the matching files and sort by time issued
foreach ($matching_files as $name) {
$full_name = $this->association_dir . DIRECTORY_SEPARATOR .
$name;
$association = $this->_getAssociation($full_name);
if ($association !== null) {
$matching_associations[] = array($association->issued,
$association);
}
}
 
$issued = array();
$assocs = array();
foreach ($matching_associations as $key => $assoc) {
$issued[$key] = $assoc[0];
$assocs[$key] = $assoc[1];
}
 
array_multisort($issued, SORT_DESC, $assocs, SORT_DESC,
$matching_associations);
 
// return the most recently issued one.
if ($matching_associations) {
list($issued, $assoc) = $matching_associations[0];
return $assoc;
} else {
return null;
}
}
}
 
/**
* @access private
*/
function _getAssociation($filename)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$assoc_file = @fopen($filename, 'rb');
 
if ($assoc_file === false) {
return null;
}
 
$assoc_s = fread($assoc_file, filesize($filename));
fclose($assoc_file);
 
if (!$assoc_s) {
return null;
}
 
$association =
Auth_OpenID_Association::deserialize('Auth_OpenID_Association',
$assoc_s);
 
if (!$association) {
Auth_OpenID_FileStore::_removeIfPresent($filename);
return null;
}
 
if ($association->getExpiresIn() == 0) {
Auth_OpenID_FileStore::_removeIfPresent($filename);
return null;
} else {
return $association;
}
}
 
/**
* Remove an association if it exists. Do nothing if it does not.
*
* @return bool $success
*/
function removeAssociation($server_url, $handle)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$assoc = $this->getAssociation($server_url, $handle);
if ($assoc === null) {
return false;
} else {
$filename = $this->getAssociationFilename($server_url, $handle);
return Auth_OpenID_FileStore::_removeIfPresent($filename);
}
}
 
/**
* Mark this nonce as present.
*/
function storeNonce($nonce)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce;
$nonce_file = fopen($filename, 'w');
if ($nonce_file === false) {
return false;
}
fclose($nonce_file);
return true;
}
 
/**
* Return whether this nonce is present. As a side effect, mark it
* as no longer present.
*
* @return bool $present
*/
function useNonce($nonce)
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce;
$st = @stat($filename);
 
if ($st === false) {
return false;
}
 
// Either it is too old or we are using it. Either way, we
// must remove the file.
if (!unlink($filename)) {
return false;
}
 
$now = time();
$nonce_age = $now - $st[9];
 
// We can us it if the age of the file is less than the
// expiration time.
return $nonce_age <= $this->max_nonce_age;
}
 
/**
* Remove expired entries from the database. This is potentially
* expensive, so only run when it is acceptable to take time.
*/
function clean()
{
if (!$this->active) {
trigger_error("FileStore no longer active", E_USER_ERROR);
return null;
}
 
$nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir);
$now = time();
 
// Check all nonces for expiry
foreach ($nonces as $nonce) {
$filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce;
$st = @stat($filename);
 
if ($st !== false) {
// Remove the nonce if it has expired
$nonce_age = $now - $st[9];
if ($nonce_age > $this->max_nonce_age) {
Auth_OpenID_FileStore::_removeIfPresent($filename);
}
}
}
 
$association_filenames =
Auth_OpenID_FileStore::_listdir($this->association_dir);
 
foreach ($association_filenames as $association_filename) {
$association_file = fopen($association_filename, 'rb');
 
if ($association_file !== false) {
$assoc_s = fread($association_file,
filesize($association_filename));
fclose($association_file);
 
// Remove expired or corrupted associations
$association =
Auth_OpenID_Association::deserialize(
'Auth_OpenID_Association', $assoc_s);
 
if ($association === null) {
Auth_OpenID_FileStore::_removeIfPresent(
$association_filename);
} else {
if ($association->getExpiresIn() == 0) {
Auth_OpenID_FileStore::_removeIfPresent(
$association_filename);
}
}
}
}
}
 
/**
* @access private
*/
function _rmtree($dir)
{
if ($dir[strlen($dir) - 1] != DIRECTORY_SEPARATOR) {
$dir .= DIRECTORY_SEPARATOR;
}
 
if ($handle = opendir($dir)) {
while ($item = readdir($handle)) {
if (!in_array($item, array('.', '..'))) {
if (is_dir($dir . $item)) {
 
if (!Auth_OpenID_FileStore::_rmtree($dir . $item)) {
return false;
}
} else if (is_file($dir . $item)) {
if (!unlink($dir . $item)) {
return false;
}
}
}
}
 
closedir($handle);
 
if (!@rmdir($dir)) {
return false;
}
 
return true;
} else {
// Couldn't open directory.
return false;
}
}
 
/**
* @access private
*/
function _mkstemp($dir)
{
foreach (range(0, 4) as $i) {
$name = tempnam($dir, "php_openid_filestore_");
 
if ($name !== false) {
return $name;
}
}
return false;
}
 
/**
* @access private
*/
function _mkdtemp($dir)
{
foreach (range(0, 4) as $i) {
$name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) .
"-" . strval(rand(1, time()));
if (!mkdir($name, 0700)) {
return false;
} else {
return $name;
}
}
return false;
}
 
/**
* @access private
*/
function _listdir($dir)
{
$handle = opendir($dir);
$files = array();
while (false !== ($filename = readdir($handle))) {
$files[] = $filename;
}
return $files;
}
 
/**
* @access private
*/
function _isFilenameSafe($char)
{
$_Auth_OpenID_filename_allowed = Auth_OpenID_letters .
Auth_OpenID_digits . ".";
return (strpos($_Auth_OpenID_filename_allowed, $char) !== false);
}
 
/**
* @access private
*/
function _safe64($str)
{
$h64 = base64_encode(Auth_OpenID_SHA1($str));
$h64 = str_replace('+', '_', $h64);
$h64 = str_replace('/', '.', $h64);
$h64 = str_replace('=', '', $h64);
return $h64;
}
 
/**
* @access private
*/
function _filenameEscape($str)
{
$filename = "";
for ($i = 0; $i < strlen($str); $i++) {
$c = $str[$i];
if (Auth_OpenID_FileStore::_isFilenameSafe($c)) {
$filename .= $c;
} else {
$filename .= sprintf("_%02X", ord($c));
}
}
return $filename;
}
 
/**
* Attempt to remove a file, returning whether the file existed at
* the time of the call.
*
* @access private
* @return bool $result True if the file was present, false if not.
*/
function _removeIfPresent($filename)
{
return @unlink($filename);
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/CryptUtil.php
New file
0,0 → 1,109
<?php
 
/**
* CryptUtil: A suite of wrapper utility functions for the OpenID
* library.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
if (!defined('Auth_OpenID_RAND_SOURCE')) {
/**
* The filename for a source of random bytes. Define this yourself
* if you have a different source of randomness.
*/
define('Auth_OpenID_RAND_SOURCE', '/dev/urandom');
}
 
class Auth_OpenID_CryptUtil {
/**
* Get the specified number of random bytes.
*
* Attempts to use a cryptographically secure (not predictable)
* source of randomness if available. If there is no high-entropy
* randomness source available, it will fail. As a last resort,
* for non-critical systems, define
* <code>Auth_OpenID_RAND_SOURCE</code> as <code>null</code>, and
* the code will fall back on a pseudo-random number generator.
*
* @param int $num_bytes The length of the return value
* @return string $bytes random bytes
*/
function getBytes($num_bytes)
{
static $f = null;
$bytes = '';
if ($f === null) {
if (Auth_OpenID_RAND_SOURCE === null) {
$f = false;
} else {
$f = @fopen(Auth_OpenID_RAND_SOURCE, "r");
if ($f === false) {
$msg = 'Define Auth_OpenID_RAND_SOURCE as null to ' .
' continue with an insecure random number generator.';
trigger_error($msg, E_USER_ERROR);
}
}
}
if ($f === false) {
// pseudorandom used
$bytes = '';
for ($i = 0; $i < $num_bytes; $i += 4) {
$bytes .= pack('L', mt_rand());
}
$bytes = substr($bytes, 0, $num_bytes);
} else {
$bytes = fread($f, $num_bytes);
}
return $bytes;
}
 
/**
* Produce a string of length random bytes, chosen from chrs. If
* $chrs is null, the resulting string may contain any characters.
*
* @param integer $length The length of the resulting
* randomly-generated string
* @param string $chrs A string of characters from which to choose
* to build the new string
* @return string $result A string of randomly-chosen characters
* from $chrs
*/
function randomString($length, $population = null)
{
if ($population === null) {
return Auth_OpenID_CryptUtil::getBytes($length);
}
 
$popsize = strlen($population);
 
if ($popsize > 256) {
$msg = 'More than 256 characters supplied to ' . __FUNCTION__;
trigger_error($msg, E_USER_ERROR);
}
 
$duplicate = 256 % $popsize;
 
$str = "";
for ($i = 0; $i < $length; $i++) {
do {
$n = ord(Auth_OpenID_CryptUtil::getBytes(1));
} while ($n < $duplicate);
 
$n %= $popsize;
$str .= $population[$n];
}
 
return $str;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Interface.php
New file
0,0 → 1,188
<?php
 
/**
* This file specifies the interface for PHP OpenID store implementations.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* This is the interface for the store objects the OpenID library
* uses. It is a single class that provides all of the persistence
* mechanisms that the OpenID library needs, for both servers and
* consumers. If you want to create an SQL-driven store, please see
* then {@link Auth_OpenID_SQLStore} class.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
*/
class Auth_OpenID_OpenIDStore {
/**
* @var integer The length of the auth key that should be returned
* by the getAuthKey method.
*/
var $AUTH_KEY_LEN = 20;
 
/**
* This method puts an Association object into storage,
* retrievable by server URL and handle.
*
* @param string $server_url The URL of the identity server that
* this association is with. Because of the way the server portion
* of the library uses this interface, don't assume there are any
* limitations on the character set of the input string. In
* particular, expect to see unescaped non-url-safe characters in
* the server_url field.
*
* @param Association $association The Association to store.
*/
function storeAssociation($server_url, $association)
{
trigger_error("Auth_OpenID_OpenIDStore::storeAssociation ".
"not implemented", E_USER_ERROR);
}
 
/**
* This method returns an Association object from storage that
* matches the server URL and, if specified, handle. It returns
* null if no such association is found or if the matching
* association is expired.
*
* If no handle is specified, the store may return any association
* which matches the server URL. If multiple associations are
* valid, the recommended return value for this method is the one
* that will remain valid for the longest duration.
*
* This method is allowed (and encouraged) to garbage collect
* expired associations when found. This method must not return
* expired associations.
*
* @param string $server_url The URL of the identity server to get
* the association for. Because of the way the server portion of
* the library uses this interface, don't assume there are any
* limitations on the character set of the input string. In
* particular, expect to see unescaped non-url-safe characters in
* the server_url field.
*
* @param mixed $handle This optional parameter is the handle of
* the specific association to get. If no specific handle is
* provided, any valid association matching the server URL is
* returned.
*
* @return Association The Association for the given identity
* server.
*/
function getAssociation($server_url, $handle = null)
{
trigger_error("Auth_OpenID_OpenIDStore::getAssociation ".
"not implemented", E_USER_ERROR);
}
 
/**
* This method removes the matching association if it's found, and
* returns whether the association was removed or not.
*
* @param string $server_url The URL of the identity server the
* association to remove belongs to. Because of the way the server
* portion of the library uses this interface, don't assume there
* are any limitations on the character set of the input
* string. In particular, expect to see unescaped non-url-safe
* characters in the server_url field.
*
* @param string $handle This is the handle of the association to
* remove. If there isn't an association found that matches both
* the given URL and handle, then there was no matching handle
* found.
*
* @return mixed Returns whether or not the given association existed.
*/
function removeAssociation($server_url, $handle)
{
trigger_error("Auth_OpenID_OpenIDStore::removeAssociation ".
"not implemented", E_USER_ERROR);
}
 
/**
* Stores a nonce. This is used by the consumer to prevent replay
* attacks.
*
* @param string $nonce The nonce to store.
*
* @return null
*/
function storeNonce($nonce)
{
trigger_error("Auth_OpenID_OpenIDStore::storeNonce ".
"not implemented", E_USER_ERROR);
}
 
/**
* This method is called when the library is attempting to use a
* nonce. If the nonce is in the store, this method removes it and
* returns a value which evaluates as true. Otherwise it returns a
* value which evaluates as false.
*
* This method is allowed and encouraged to treat nonces older
* than some period (a very conservative window would be 6 hours,
* for example) as no longer existing, and return False and remove
* them.
*
* @param string $nonce The nonce to use.
*
* @return bool Whether or not the nonce was valid.
*/
function useNonce($nonce)
{
trigger_error("Auth_OpenID_OpenIDStore::useNonce ".
"not implemented", E_USER_ERROR);
}
 
/**
* This method returns a key used to sign the tokens, to ensure
* that they haven't been tampered with in transit. It should
* return the same key every time it is called. The key returned
* should be {@link AUTH_KEY_LEN} bytes long.
*
* @return string The key. It should be {@link AUTH_KEY_LEN} bytes in
* length, and use the full range of byte values. That is, it
* should be treated as a lump of binary data stored in a string.
*/
function getAuthKey()
{
trigger_error("Auth_OpenID_OpenIDStore::getAuthKey ".
"not implemented", E_USER_ERROR);
}
 
/**
* This method must return true if the store is a dumb-mode-style
* store. Unlike all other methods in this class, this one
* provides a default implementation, which returns false.
*
* In general, any custom subclass of {@link Auth_OpenID_OpenIDStore}
* won't override this method, as custom subclasses are only likely to
* be created when the store is fully functional.
*
* @return bool true if the store works fully, false if the
* consumer will have to use dumb mode to use this store.
*/
function isDumb()
{
return false;
}
 
/**
* Removes all entries from the store; implementation is optional.
*/
function reset()
{
}
 
}
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/DumbStore.php
New file
0,0 → 1,116
<?php
 
/**
* This file supplies a dumb store backend for OpenID servers and
* consumers.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Import the interface for creating a new store class.
*/
require_once 'Auth/OpenID/Interface.php';
require_once 'Auth/OpenID/HMACSHA1.php';
 
/**
* This is a store for use in the worst case, when you have no way of
* saving state on the consumer site. Using this store makes the
* consumer vulnerable to replay attacks, as it's unable to use
* nonces. Avoid using this store if it is at all possible.
*
* Most of the methods of this class are implementation details.
* Users of this class need to worry only about the constructor.
*
* @package OpenID
*/
class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore {
 
/**
* Creates a new {@link Auth_OpenID_DumbStore} instance. For the security
* of the tokens generated by the library, this class attempts to
* at least have a secure implementation of getAuthKey.
*
* When you create an instance of this class, pass in a secret
* phrase. The phrase is hashed with sha1 to make it the correct
* length and form for an auth key. That allows you to use a long
* string as the secret phrase, which means you can make it very
* difficult to guess.
*
* Each {@link Auth_OpenID_DumbStore} instance that is created for use by
* your consumer site needs to use the same $secret_phrase.
*
* @param string secret_phrase The phrase used to create the auth
* key returned by getAuthKey
*/
function Auth_OpenID_DumbStore($secret_phrase)
{
$this->auth_key = Auth_OpenID_SHA1($secret_phrase);
}
 
/**
* This implementation does nothing.
*/
function storeAssociation($server_url, $association)
{
}
 
/**
* This implementation always returns null.
*/
function getAssociation($server_url, $handle = null)
{
return null;
}
 
/**
* This implementation always returns false.
*/
function removeAssociation($server_url, $handle)
{
return false;
}
 
/**
* This implementation does nothing.
*/
function storeNonce($nonce)
{
}
 
/**
* In a system truly limited to dumb mode, nonces must all be
* accepted. This therefore always returns true, which makes
* replay attacks feasible.
*/
function useNonce($nonce)
{
return true;
}
 
/**
* This method returns the auth key generated by the constructor.
*/
function getAuthKey()
{
return $this->auth_key;
}
 
/**
* This store is a dumb mode store, so this method is overridden
* to return true.
*/
function isDumb()
{
return true;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/KVForm.php
New file
0,0 → 1,112
<?php
 
/**
* OpenID protocol key-value/comma-newline format parsing and
* serialization
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @access private
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Container for key-value/comma-newline OpenID format and parsing
*/
class Auth_OpenID_KVForm {
/**
* Convert an OpenID colon/newline separated string into an
* associative array
*
* @static
* @access private
*/
function toArray($kvs, $strict=false)
{
$lines = explode("\n", $kvs);
 
$last = array_pop($lines);
if ($last !== '') {
array_push($lines, $last);
if ($strict) {
return false;
}
}
 
$values = array();
 
for ($lineno = 0; $lineno < count($lines); $lineno++) {
$line = $lines[$lineno];
$kv = explode(':', $line, 2);
if (count($kv) != 2) {
if ($strict) {
return false;
}
continue;
}
 
$key = $kv[0];
$tkey = trim($key);
if ($tkey != $key) {
if ($strict) {
return false;
}
}
 
$value = $kv[1];
$tval = trim($value);
if ($tval != $value) {
if ($strict) {
return false;
}
}
 
$values[$tkey] = $tval;
}
 
return $values;
}
 
/**
* Convert an array into an OpenID colon/newline separated string
*
* @static
* @access private
*/
function fromArray($values)
{
if ($values === null) {
return null;
}
 
ksort($values);
 
$serialized = '';
foreach ($values as $key => $value) {
if (is_array($value)) {
list($key, $value) = array($value[0], $value[1]);
}
 
if (strpos($key, ':') !== false) {
return null;
}
 
if (strpos($key, "\n") !== false) {
return null;
}
 
if (strpos($value, "\n") !== false) {
return null;
}
$serialized .= "$key:$value\n";
}
return $serialized;
}
}
 
?>
/tags/v1.1-andromede/composants/openid/Auth/OpenID/Server.php
New file
0,0 → 1,1307
<?php
 
/**
* OpenID server protocol and logic.
*
* Overview
*
* An OpenID server must perform three tasks:
*
* 1. Examine the incoming request to determine its nature and validity.
* 2. Make a decision about how to respond to this request.
* 3. Format the response according to the protocol.
*
* The first and last of these tasks may performed by the
* 'decodeRequest' and 'encodeResponse' methods of the
* Auth_OpenID_Server object. Who gets to do the intermediate task --
* deciding how to respond to the request -- will depend on what type
* of request it is.
*
* If it's a request to authenticate a user (a 'checkid_setup' or
* 'checkid_immediate' request), you need to decide if you will assert
* that this user may claim the identity in question. Exactly how you
* do that is a matter of application policy, but it generally
* involves making sure the user has an account with your system and
* is logged in, checking to see if that identity is hers to claim,
* and verifying with the user that she does consent to releasing that
* information to the party making the request.
*
* Examine the properties of the Auth_OpenID_CheckIDRequest object,
* and if and when you've come to a decision, form a response by
* calling Auth_OpenID_CheckIDRequest::answer.
*
* Other types of requests relate to establishing associations between
* client and server and verifing the authenticity of previous
* communications. Auth_OpenID_Server contains all the logic and data
* necessary to respond to such requests; just pass it to
* Auth_OpenID_Server::handleRequest.
*
* OpenID Extensions
*
* Do you want to provide other information for your users in addition
* to authentication? Version 1.2 of the OpenID protocol allows
* consumers to add extensions to their requests. For example, with
* sites using the Simple Registration
* Extension
* (http://www.openidenabled.com/openid/simple-registration-extension/),
* a user can agree to have their nickname and e-mail address sent to
* a site when they sign up.
*
* Since extensions do not change the way OpenID authentication works,
* code to handle extension requests may be completely separate from
* the Auth_OpenID_Request class here. But you'll likely want data
* sent back by your extension to be signed. Auth_OpenID_Response
* provides methods with which you can add data to it which can be
* signed with the other data in the OpenID signature.
*
* For example:
*
* // when request is a checkid_* request
* response = request.answer(True)
* // this will a signed 'openid.sreg.timezone' parameter to the response
* response.addField('sreg', 'timezone', 'America/Los_Angeles')
*
* Stores
*
* The OpenID server needs to maintain state between requests in order
* to function. Its mechanism for doing this is called a store. The
* store interface is defined in Interface.php. Additionally, several
* concrete store implementations are provided, so that most sites
* won't need to implement a custom store. For a store backed by flat
* files on disk, see Auth_OpenID_FileStore. For stores based on
* MySQL, SQLite, or PostgreSQL, see the Auth_OpenID_SQLStore
* subclasses.
*
* Upgrading
*
* The keys by which a server looks up associations in its store have
* changed in version 1.2 of this library. If your store has entries
* created from version 1.0 code, you should empty it.
*
* PHP versions 4 and 5
*
* LICENSE: See the COPYING file included in this distribution.
*
* @package OpenID
* @author JanRain, Inc. <openid@janrain.com>
* @copyright 2005 Janrain, Inc.
* @license http://www.gnu.org/copyleft/lesser.html LGPL
*/
 
/**
* Required imports
*/
require_once "Auth/OpenID.php";
require_once "Auth/OpenID/Association.php";
require_once "Auth/OpenID/CryptUtil.php";
require_once "Auth/OpenID/BigMath.php";
require_once "Auth/OpenID/DiffieHellman.php";
require_once "Auth/OpenID/KVForm.php";
require_once "Auth/OpenID/TrustRoot.php";
require_once "Auth/OpenID/ServerRequest.php";
 
define('AUTH_OPENID_HTTP_OK', 200);
define('AUTH_OPENID_HTTP_REDIRECT', 302);
define('AUTH_OPENID_HTTP_ERROR', 400);
 
global $_Auth_OpenID_Request_Modes,
$_Auth_OpenID_OpenID_Prefix,
$_Auth_OpenID_Encode_Kvform,
$_Auth_OpenID_Encode_Url;
 
/**
* @access private
*/
$_Auth_OpenID_Request_Modes = array('checkid_setup',
'checkid_immediate');
 
/**
* @access private
*/
$_Auth_OpenID_OpenID_Prefix = "openid.";
 
/**
* @access private
*/
$_Auth_OpenID_Encode_Kvform = array('kfvorm');
 
/**
* @access private
*/
$_Auth_OpenID_Encode_Url = array('URL/redirect');
 
/**
* @access private
*/
function _isError($obj, $cls = 'Auth_OpenID_ServerError')
{
return is_a($obj, $cls);
}
 
/**
* An error class which gets instantiated and returned whenever an
* OpenID protocol error occurs. Be prepared to use this in place of
* an ordinary server response.
*
* @package OpenID
*/
class Auth_OpenID_ServerError {
/**
* @access private
*/
function Auth_OpenID_ServerError($query = null, $message = null)
{
$this->message = $message;
$this->query = $query;
}
 
/**
* Returns the return_to URL for the request which caused this
* error.
*/
function hasReturnTo()
{
global $_Auth_OpenID_OpenID_Prefix;
if ($this->query) {
return array_key_exists($_Auth_OpenID_OpenID_Prefix .
'return_to', $this->query);
} else {
return false;
}
}
 
/**
* Encodes this error's response as a URL suitable for
* redirection. If the response has no return_to, another
* Auth_OpenID_ServerError is returned.
*/
function encodeToURL()
{
global $_Auth_OpenID_OpenID_Prefix;
$return_to = Auth_OpenID::arrayGet($this->query,
$_Auth_OpenID_OpenID_Prefix .
'return_to');
if (!$return_to) {
return new Auth_OpenID_ServerError(null, "no return_to URL");
}
 
return Auth_OpenID::appendArgs($return_to,
array('openid.mode' => 'error',
'openid.error' => $this->toString()));
}
 
/**
* Encodes the response to key-value form. This is a
* machine-readable format used to respond to messages which came
* directly from the consumer and not through the user-agent. See
* the OpenID specification.
*/
function encodeToKVForm()
{
return Auth_OpenID_KVForm::fromArray(
array('mode' => 'error',
'error' => $this->toString()));
}
 
/**
* Returns one of $_Auth_OpenID_Encode_Url,
* $_Auth_OpenID_Encode_Kvform, or null, depending on the type of
* encoding expected for this error's payload.
*/
function whichEncoding()
{
global $_Auth_OpenID_Encode_Url,
$_Auth_OpenID_Encode_Kvform,
$_Auth_OpenID_Request_Modes;
 
if ($this->hasReturnTo()) {
return $_Auth_OpenID_Encode_Url;
}
 
$mode = Auth_OpenID::arrayGet($this->query, 'openid.mode');
 
if ($mode) {
if (!in_array($mode, $_Auth_OpenID_Request_Modes)) {
return $_Auth_OpenID_Encode_Kvform;
}
}
return null;
}
 
/**
* Returns this error message.
*/
function toString()
{
if ($this->message) {
return $this->message;
} else {
return get_class($this) . " error";
}
}
}
 
/**
* An error indicating that the return_to URL is malformed.
*
* @package OpenID
*/
class Auth_OpenID_MalformedReturnURL extends Auth_OpenID_ServerError {
function Auth_OpenID_MalformedReturnURL($query, $return_to)
{
$this->return_to = $return_to;
parent::Auth_OpenID_ServerError($query, "malformed return_to URL");
}
}
 
/**
* This error is returned when the trust_root value is malformed.
*
* @package OpenID
*/
class Auth_OpenID_MalformedTrustRoot extends Auth_OpenID_ServerError {
function toString()
{
return "Malformed trust root";
}
}
 
/**
* The base class for all server request classes.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_Request {
var $mode = null;
}
 
/**
* A request to verify the validity of a previous response.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_CheckAuthRequest extends Auth_OpenID_Request {
var $mode = "check_authentication";
var $invalidate_handle = null;
 
function Auth_OpenID_CheckAuthRequest($assoc_handle, $sig, $signed,
$invalidate_handle = null)
{
$this->assoc_handle = $assoc_handle;
$this->sig = $sig;
$this->signed = $signed;
if ($invalidate_handle !== null) {
$this->invalidate_handle = $invalidate_handle;
}
}
 
function fromQuery($query)
{
global $_Auth_OpenID_OpenID_Prefix;
 
$required_keys = array('assoc_handle', 'sig', 'signed');
 
foreach ($required_keys as $k) {
if (!array_key_exists($_Auth_OpenID_OpenID_Prefix . $k,
$query)) {
return new Auth_OpenID_ServerError($query,
sprintf("%s request missing required parameter %s from \
query", "check_authentication", $k));
}
}
 
$assoc_handle = $query[$_Auth_OpenID_OpenID_Prefix . 'assoc_handle'];
$sig = $query[$_Auth_OpenID_OpenID_Prefix . 'sig'];
$signed_list = $query[$_Auth_OpenID_OpenID_Prefix . 'signed'];
 
$signed_list = explode(",", $signed_list);
$signed_pairs = array();
 
foreach ($signed_list as $field) {
if ($field == 'mode') {
// XXX KLUDGE HAX WEB PROTOCoL BR0KENNN
//
// openid.mode is currently check_authentication
// because that's the mode of this request. But the
// signature was made on something with a different
// openid.mode.
$value = "id_res";
} else {
if (array_key_exists($_Auth_OpenID_OpenID_Prefix . $field,
$query)) {
$value = $query[$_Auth_OpenID_OpenID_Prefix . $field];
} else {
return new Auth_OpenID_ServerError($query,
sprintf("Couldn't find signed field %r in query %s",
$field, var_export($query, true)));
}
}
$signed_pairs[] = array($field, $value);
}
 
$result = new Auth_OpenID_CheckAuthRequest($assoc_handle, $sig,
$signed_pairs);
$result->invalidate_handle = Auth_OpenID::arrayGet($query,
$_Auth_OpenID_OpenID_Prefix . 'invalidate_handle');
return $result;
}
 
function answer(&$signatory)
{
$is_valid = $signatory->verify($this->assoc_handle, $this->sig,
$this->signed);
 
// Now invalidate that assoc_handle so it this checkAuth
// message cannot be replayed.
$signatory->invalidate($this->assoc_handle, true);
$response = new Auth_OpenID_ServerResponse($this);
$response->fields['is_valid'] = $is_valid ? "true" : "false";
 
if ($this->invalidate_handle) {
$assoc = $signatory->getAssociation($this->invalidate_handle,
false);
if (!$assoc) {
$response->fields['invalidate_handle'] =
$this->invalidate_handle;
}
}
return $response;
}
}
 
class Auth_OpenID_PlainTextServerSession {
/**
* An object that knows how to handle association requests with no
* session type.
*/
var $session_type = 'plaintext';
 
function fromQuery($unused_request)
{
return new Auth_OpenID_PlainTextServerSession();
}
 
function answer($secret)
{
return array('mac_key' => base64_encode($secret));
}
}
 
class Auth_OpenID_DiffieHellmanServerSession {
/**
* An object that knows how to handle association requests with
* the Diffie-Hellman session type.
*/
 
var $session_type = 'DH-SHA1';
 
function Auth_OpenID_DiffieHellmanServerSession($dh, $consumer_pubkey)
{
$this->dh = $dh;
$this->consumer_pubkey = $consumer_pubkey;
}
 
function fromQuery($query)
{
$dh_modulus = Auth_OpenID::arrayGet($query, 'openid.dh_modulus');
$dh_gen = Auth_OpenID::arrayGet($query, 'openid.dh_gen');
 
if ((($dh_modulus === null) && ($dh_gen !== null)) ||
(($dh_gen === null) && ($dh_modulus !== null))) {
 
if ($dh_modulus === null) {
$missing = 'modulus';
} else {
$missing = 'generator';
}
 
return new Auth_OpenID_ServerError(
'If non-default modulus or generator is '.
'supplied, both must be supplied. Missing '.
$missing);
}
 
$lib =& Auth_OpenID_getMathLib();
 
if ($dh_modulus || $dh_gen) {
$dh_modulus = $lib->base64ToLong($dh_modulus);
$dh_gen = $lib->base64ToLong($dh_gen);
if ($lib->cmp($dh_modulus, 0) == 0 ||
$lib->cmp($dh_gen, 0) == 0) {
return new Auth_OpenID_ServerError(
$query, "Failed to parse dh_mod or dh_gen");
}
$dh = new Auth_OpenID_DiffieHellman($dh_modulus, $dh_gen);
} else {
$dh = new Auth_OpenID_DiffieHellman();
}
 
$consumer_pubkey = Auth_OpenID::arrayGet($query,
'openid.dh_consumer_public');
if ($consumer_pubkey === null) {
return new Auth_OpenID_ServerError(
'Public key for DH-SHA1 session '.
'not found in query');
}
 
$consumer_pubkey =
$lib->base64ToLong($consumer_pubkey);
 
if ($consumer_pubkey === false) {
return new Auth_OpenID_ServerError($query,
"dh_consumer_public is not base64");
}
 
return new Auth_OpenID_DiffieHellmanServerSession($dh,
$consumer_pubkey);
}
 
function answer($secret)
{
$lib =& Auth_OpenID_getMathLib();
$mac_key = $this->dh->xorSecret($this->consumer_pubkey, $secret);
return array(
'dh_server_public' =>
$lib->longToBase64($this->dh->public),
'enc_mac_key' => base64_encode($mac_key));
}
}
 
/**
* A request to associate with the server.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request {
var $mode = "associate";
var $assoc_type = 'HMAC-SHA1';
 
function Auth_OpenID_AssociateRequest(&$session)
{
$this->session =& $session;
}
 
function fromQuery($query)
{
global $_Auth_OpenID_OpenID_Prefix;
 
$session_classes = array(
'DH-SHA1' => 'Auth_OpenID_DiffieHellmanServerSession',
null => 'Auth_OpenID_PlainTextServerSession');
 
$session_type = null;
 
if (array_key_exists($_Auth_OpenID_OpenID_Prefix . 'session_type',
$query)) {
$session_type = $query[$_Auth_OpenID_OpenID_Prefix .
'session_type'];
}
 
if (!array_key_exists($session_type, $session_classes)) {
return new Auth_OpenID_ServerError($query,
"Unknown session type $session_type");
}
 
$session_cls = $session_classes[$session_type];
$session = call_user_func_array(array($session_cls, 'fromQuery'),
array($query));
 
if (($session === null) || (_isError($session))) {
return new Auth_OpenID_ServerError($query,
"Error parsing $session_type session");
}
 
return new Auth_OpenID_AssociateRequest($session);
}
 
function answer($assoc)
{
$ml =& Auth_OpenID_getMathLib();
$response = new Auth_OpenID_ServerResponse($this);
 
$response->fields = array('expires_in' => $assoc->getExpiresIn(),
'assoc_type' => 'HMAC-SHA1',
'assoc_handle' => $assoc->handle);
 
$r = $this->session->answer($assoc->secret);
foreach ($r as $k => $v) {
$response->fields[$k] = $v;
}
 
if ($this->session->session_type != 'plaintext') {
$response->fields['session_type'] = $this->session->session_type;
}
 
return $response;
}
}
 
/**
* A request to confirm the identity of a user.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request {
var $mode = "checkid_setup"; // or "checkid_immediate"
var $immediate = false;
var $trust_root = null;
 
function make($query, $identity, $return_to, $trust_root = null,
$immediate = false, $assoc_handle = null)
{
if (!Auth_OpenID_TrustRoot::_parse($return_to)) {
return new Auth_OpenID_MalformedReturnURL($query, $return_to);
}
 
$r = new Auth_OpenID_CheckIDRequest($identity, $return_to,
$trust_root, $immediate,
$assoc_handle);
 
if (!$r->trustRootValid()) {
return new Auth_OpenID_UntrustedReturnURL($return_to,
$trust_root);
} else {
return $r;
}
}
 
function Auth_OpenID_CheckIDRequest($identity, $return_to,
$trust_root = null, $immediate = false,
$assoc_handle = null)
{
$this->identity = $identity;
$this->return_to = $return_to;
$this->trust_root = $trust_root;
$this->assoc_handle = $assoc_handle;
 
if ($immediate) {
$this->immediate = true;
$this->mode = "checkid_immediate";
} else {
$this->immediate = false;
$this->mode = "checkid_setup";
}
}
 
function fromQuery($query)
{
global $_Auth_OpenID_OpenID_Prefix;
 
$mode = $query[$_Auth_OpenID_OpenID_Prefix . 'mode'];
$immediate = null;
 
if ($mode == "checkid_immediate") {
$immediate = true;
$mode = "checkid_immediate";
} else {
$immediate = false;
$mode = "checkid_setup";
}
 
$required = array('identity',
'return_to');
 
$optional = array('trust_root',
'assoc_handle');
 
$values = array();
 
foreach ($required as $field) {
if (array_key_exists($_Auth_OpenID_OpenID_Prefix . $field,
$query)) {
$value = $query[$_Auth_OpenID_OpenID_Prefix . $field];
} else {
return new Auth_OpenID_ServerError($query,
sprintf("Missing required field %s from request",
$field));
}
$values[$field] = $value;
}
 
foreach ($optional as $field) {
$value = null;
if (array_key_exists($_Auth_OpenID_OpenID_Prefix . $field,
$query)) {
$value = $query[$_Auth_OpenID_OpenID_Prefix. $field];
}
if ($value) {
$values[$field] = $value;
}
}
 
if (!Auth_OpenID_TrustRoot::_parse($values['return_to'])) {
return new Auth_OpenID_MalformedReturnURL($query,
$values['return_to']);
}
 
$obj = Auth_OpenID_CheckIDRequest::make($query,
$values['identity'],
$values['return_to'],
Auth_OpenID::arrayGet($values,
'trust_root', null),
$immediate);
 
if (is_a($obj, 'Auth_OpenID_ServerError')) {
return $obj;
}
 
if (Auth_OpenID::arrayGet($values, 'assoc_handle')) {
$obj->assoc_handle = $values['assoc_handle'];
}
 
return $obj;
}
 
function trustRootValid()
{
if (!$this->trust_root) {
return true;
}
 
$tr = Auth_OpenID_TrustRoot::_parse($this->trust_root);
if ($tr === false) {
return new Auth_OpenID_MalformedTrustRoot(null, $this->trust_root);
}
 
return Auth_OpenID_TrustRoot::match($this->trust_root,
$this->return_to);
}
 
function answer($allow, $server_url = null)
{
if ($allow || $this->immediate) {
$mode = 'id_res';
} else {
$mode = 'cancel';
}
 
$response = new Auth_OpenID_CheckIDResponse($this, $mode);
 
if ($allow) {
$response->fields['identity'] = $this->identity;
$response->fields['return_to'] = $this->return_to;
if (!$this->trustRootValid()) {
return new Auth_OpenID_UntrustedReturnURL($this->return_to,
$this->trust_root);
}
} else {
$response->signed = array();
if ($this->immediate) {
if (!$server_url) {
return new Auth_OpenID_ServerError(null,
'setup_url is required for $allow=false \
in immediate mode.');
}
 
$setup_request =& new Auth_OpenID_CheckIDRequest(
$this->identity,
$this->return_to,
$this->trust_root,
false,
$this->assoc_handle);
 
$setup_url = $setup_request->encodeToURL($server_url);
 
$response->fields['user_setup_url'] = $setup_url;
}
}
 
return $response;
}
 
function encodeToURL($server_url)
{
global $_Auth_OpenID_OpenID_Prefix;
 
// Imported from the alternate reality where these classes are
// used in both the client and server code, so Requests are
// Encodable too. That's right, code imported from alternate
// realities all for the love of you, id_res/user_setup_url.
 
$q = array('mode' => $this->mode,
'identity' => $this->identity,
'return_to' => $this->return_to);
 
if ($this->trust_root) {
$q['trust_root'] = $this->trust_root;
}
 
if ($this->assoc_handle) {
$q['assoc_handle'] = $this->assoc_handle;
}
 
$_q = array();
 
foreach ($q as $k => $v) {
$_q[$_Auth_OpenID_OpenID_Prefix . $k] = $v;
}
 
return Auth_OpenID::appendArgs($server_url, $_q);
}
 
function getCancelURL()
{
global $_Auth_OpenID_OpenID_Prefix;
 
if ($this->immediate) {
return new Auth_OpenID_ServerError(null,
"Cancel is not an appropriate \
response to immediate mode \
requests.");
}
 
return Auth_OpenID::appendArgs($this->return_to,
array($_Auth_OpenID_OpenID_Prefix . 'mode' =>
'cancel'));
}
}
 
/**
* This class encapsulates the response to an OpenID server request.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_ServerResponse {
 
function Auth_OpenID_ServerResponse($request)
{
$this->request = $request;
$this->fields = array();
}
 
function whichEncoding()
{
global $_Auth_OpenID_Encode_Kvform,
$_Auth_OpenID_Request_Modes,
$_Auth_OpenID_Encode_Url;
 
if (in_array($this->request->mode, $_Auth_OpenID_Request_Modes)) {
return $_Auth_OpenID_Encode_Url;
} else {
return $_Auth_OpenID_Encode_Kvform;
}
}
 
function encodeToURL()
{
global $_Auth_OpenID_OpenID_Prefix;
 
$fields = array();
 
foreach ($this->fields as $k => $v) {
$fields[$_Auth_OpenID_OpenID_Prefix . $k] = $v;
}
 
return Auth_OpenID::appendArgs($this->request->return_to, $fields);
}
 
function encodeToKVForm()
{
return Auth_OpenID_KVForm::fromArray($this->fields);
}
}
 
/**
* A response to a checkid request.
*
* @access private
* @package OpenID
*/
class Auth_OpenID_CheckIDResponse extends Auth_OpenID_ServerResponse {
 
function Auth_OpenID_CheckIDResponse(&$request, $mode = 'id_res')
{
parent::Auth_OpenID_ServerResponse($request);
$this->fields['mode'] = $mode;
$this->signed = array();
 
if ($mode == 'id_res') {
array_push($this->signed, 'mode', 'identity', 'return_to');
}
}
 
function addField($namespace, $key, $value, $signed = true)
{
if ($namespace) {
$key = sprintf('%s.%s', $namespace, $key);
}
$this->fields[$key] = $value;
if ($signed && !in_array($key, $this->signed)) {
$this->signed[] = $key;
}
}
 
function addFields($namespace, $fields, $signed = true)
{
foreach ($fields as $k => $v) {
$this->addField($namespace, $k, $v, $signed);
}
}
 
function update($namespace, $other)
{
$namespaced_fields = array();
 
foreach ($other->fields as $k => $v) {
$name = sprintf('%s.%s', $namespace, $k);
 
$namespaced_fields[$name] = $v;
}
 
$this->fields = array_merge($this->fields, $namespaced_fields);
$this->signed = array_merge($this->signed, $other->signed);
}
}
 
/**
* A web-capable response object which you can use to generate a
* user-agent response.
*
* @package OpenID
*/
class Auth_OpenID_WebResponse {
var $code = AUTH_OPENID_HTTP_OK;
var $body = "";
 
function Auth_OpenID_WebResponse($code = null, $headers = null,
$body = null)
{
if ($code) {
$this->code = $code;
}
 
if ($headers !== null) {
$this->headers = $headers;
} else {
$this->headers = array();
}
 
if ($body !== null) {
$this->body = $body;
}
}
}
 
/**
* Responsible for the signature of query data and the verification of
* OpenID signature values.
*
* @package OpenID
*/
class Auth_OpenID_Signatory {
 
// = 14 * 24 * 60 * 60; # 14 days, in seconds
var $SECRET_LIFETIME = 1209600;
 
// keys have a bogus server URL in them because the filestore
// really does expect that key to be a URL. This seems a little
// silly for the server store, since I expect there to be only one
// server URL.
var $normal_key = 'http://localhost/|normal';
var $dumb_key = 'http://localhost/|dumb';
 
/**
* Create a new signatory using a given store.
*/
function Auth_OpenID_Signatory(&$store)
{
// assert store is not None
$this->store =& $store;
}
 
/**
* Verify, using a given association handle, a signature with
* signed key-value pairs from an HTTP request.
*/
function verify($assoc_handle, $sig, $signed_pairs)
{
$assoc = $this->getAssociation($assoc_handle, true);
if (!$assoc) {
// oidutil.log("failed to get assoc with handle %r to verify sig %r"
// % (assoc_handle, sig))
return false;
}
 
$expected_sig = base64_encode($assoc->sign($signed_pairs));
 
return $sig == $expected_sig;
}
 
/**
* Given a response, sign the fields in the response's 'signed'
* list, and insert the signature into the response.
*/
function sign($response)
{
$signed_response = $response;
$assoc_handle = $response->request->assoc_handle;
 
if ($assoc_handle) {
// normal mode
$assoc = $this->getAssociation($assoc_handle, false);
if (!$assoc) {
// fall back to dumb mode
$signed_response->fields['invalidate_handle'] = $assoc_handle;
$assoc = $this->createAssociation(true);
}
} else {
// dumb mode.
$assoc = $this->createAssociation(true);
}
 
$signed_response->fields['assoc_handle'] = $assoc->handle;
$assoc->addSignature($signed_response->signed,
$signed_response->fields, '');
return $signed_response;
}
 
/**
* Make a new association.
*/
function createAssociation($dumb = true, $assoc_type = 'HMAC-SHA1')
{
$secret = Auth_OpenID_CryptUtil::getBytes(20);
$uniq = base64_encode(Auth_OpenID_CryptUtil::getBytes(4));
$handle = sprintf('{%s}{%x}{%s}', $assoc_type, intval(time()), $uniq);
 
$assoc = Auth_OpenID_Association::fromExpiresIn(
$this->SECRET_LIFETIME, $handle, $secret, $assoc_type);
 
if ($dumb) {
$key = $this->dumb_key;
} else {
$key = $this->normal_key;
}
 
$this->store->storeAssociation($key, $assoc);
return $assoc;
}
 
/**
* Given an association handle, get the association from the
* store, or return a ServerError or null if something goes wrong.
*/
function getAssociation($assoc_handle, $dumb)
{
if ($assoc_handle === null) {
return new Auth_OpenID_ServerError(null,
"assoc_handle must not be null");
}
 
if ($dumb) {
$key = $this->dumb_key;
} else {
$key = $this->normal_key;
}
 
$assoc = $this->store->getAssociation($key, $assoc_handle);
 
if (($assoc !== null) && ($assoc->getExpiresIn() <= 0)) {
$this->store->removeAssociation($key, $assoc_handle);
$assoc = null;
}
 
return $assoc;
}
 
/**
* Invalidate a given association handle.
*/
function invalidate($assoc_handle, $dumb)
{
if ($dumb) {
$key = $this->dumb_key;
} else {
$key = $this->normal_key;
}
$this->store->removeAssociation($key, $assoc_handle);
}
}
 
/**
* Encode an Auth_OpenID_Response to an Auth_OpenID_WebResponse.
*
* @package OpenID
*/
class Auth_OpenID_Encoder {
 
var $responseFactory = 'Auth_OpenID_WebResponse';
 
/**
* Encode an Auth_OpenID_Response and return an
* Auth_OpenID_WebResponse.
*/
function encode(&$response)
{
global $_Auth_OpenID_Encode_Kvform,
$_Auth_OpenID_Encode_Url;
 
$cls = $this->responseFactory;
 
$encode_as = $response->whichEncoding();
if ($encode_as == $_Auth_OpenID_Encode_Kvform) {
$wr = new $cls(null, null, $response->encodeToKVForm());
if (is_a($response, 'Auth_OpenID_ServerError')) {
$wr->code = AUTH_OPENID_HTTP_ERROR;
}
} else if ($encode_as == $_Auth_OpenID_Encode_Url) {
$location = $response->encodeToURL();
$wr = new $cls(AUTH_OPENID_HTTP_REDIRECT,
array('location' => $location));
} else {
return new Auth_OpenID_EncodingError($response);
}
return $wr;
}
}
 
/**
* Returns true if the given response needs a signature.
*
* @access private
*/
function needsSigning($response)
{
return (in_array($response->request->mode, array('checkid_setup',
'checkid_immediate')) &&
$response->signed);
}
 
/**
* An encoder which also takes care of signing fields when required.
*
* @package OpenID
*/
class Auth_OpenID_SigningEncoder extends Auth_OpenID_Encoder {
 
function Auth_OpenID_SigningEncoder(&$signatory)
{
$this->signatory =& $signatory;
}
 
/**
* Sign an Auth_OpenID_Response and return an
* Auth_OpenID_WebResponse.
*/
function encode(&$response)
{
// the isinstance is a bit of a kludge... it means there isn't
// really an adapter to make the interfaces quite match.
if (!is_a($response, 'Auth_OpenID_ServerError') &&
needsSigning($response)) {
 
if (!$this->signatory) {
return new Auth_OpenID_ServerError(null,
"Must have a store to sign request");
}
if (array_key_exists('sig', $response->fields)) {
return new Auth_OpenID_AlreadySigned($response);
}
$response = $this->signatory->sign($response);
}
return parent::encode($response);
}
}
 
/**
* Decode an incoming Auth_OpenID_WebResponse into an
* Auth_OpenID_Request.
*
* @package OpenID
*/
class Auth_OpenID_Decoder {
 
function Auth_OpenID_Decoder()
{
global $_Auth_OpenID_OpenID_Prefix;
$this->prefix = $_Auth_OpenID_OpenID_Prefix;
 
$this->handlers = array(
'checkid_setup' => 'Auth_OpenID_CheckIDRequest',
'checkid_immediate' => 'Auth_OpenID_CheckIDRequest',
'check_authentication' => 'Auth_OpenID_CheckAuthRequest',
'associate' => 'Auth_OpenID_AssociateRequest'
);
}
 
/**
* Given an HTTP query in an array (key-value pairs), decode it
* into an Auth_OpenID_Request object.
*/
function decode($query)
{
if (!$query) {
return null;
}
 
$myquery = array();
 
foreach ($query as $k => $v) {
if (strpos($k, $this->prefix) === 0) {
$myquery[$k] = $v;
}
}
 
if (!$myquery) {
return null;
}
 
$mode = Auth_OpenID::arrayGet($myquery, $this->prefix . 'mode');
if (!$mode) {
return new Auth_OpenID_ServerError($query,
sprintf("No %s mode found in query", $this->prefix));
}
 
$handlerCls = Auth_OpenID::arrayGet($this->handlers, $mode,
$this->defaultDecoder($query));
 
if (!is_a($handlerCls, 'Auth_OpenID_ServerError')) {
return call_user_func_array(array($handlerCls, 'fromQuery'),
array($query));
} else {
return $handlerCls;
}
}
 
function defaultDecoder($query)
{
$mode = $query[$this->prefix . 'mode'];
return new Auth_OpenID_ServerError($query,
sprintf("No decoder for mode %s", $mode));
}
}
 
/**
* An error that indicates an encoding problem occurred.
*
* @package OpenID
*/
class Auth_OpenID_EncodingError {
function Auth_OpenID_EncodingError(&$response)
{
$this->response =& $response;
}
}
 
/**
* An error that indicates that a response was already signed.
*
* @package OpenID
*/
class Auth_OpenID_AlreadySigned extends Auth_OpenID_EncodingError {
// This response is already signed.
}
 
/**
* An error that indicates that the given return_to is not under the
* given trust_root.
*
* @package OpenID
*/
class Auth_OpenID_UntrustedReturnURL extends Auth_OpenID_ServerError {
function Auth_OpenID_UntrustedReturnURL($return_to, $trust_root)
{
global $_Auth_OpenID_OpenID_Prefix;
 
$query = array(
$_Auth_OpenID_OpenID_Prefix . 'return_to' => $return_to,
$_Auth_OpenID_OpenID_Prefix . 'trust_root' => $trust_root);
 
parent::Auth_OpenID_ServerError($query);
}
 
function toString()
{
global $_Auth_OpenID_OpenID_Prefix;
 
$return_to = $this->query[$_Auth_OpenID_OpenID_Prefix . 'return_to'];
$trust_root = $this->query[$_Auth_OpenID_OpenID_Prefix . 'trust_root'];
 
return sprintf("return_to %s not under trust_root %s",
$return_to, $trust_root);
}
}
 
/**
* An object that implements the OpenID protocol for a single URL.
*
* Use this object by calling getOpenIDResponse when you get any
* request for the server URL.
*
* @package OpenID
*/
class Auth_OpenID_Server {
function Auth_OpenID_Server(&$store)
{
$this->store =& $store;
$this->signatory =& new Auth_OpenID_Signatory($this->store);
$this->encoder =& new Auth_OpenID_SigningEncoder($this->signatory);
$this->decoder =& new Auth_OpenID_Decoder();
}
 
/**
* Handle a request. Given an Auth_OpenID_Request object, call
* the appropriate Auth_OpenID_Server method to process the
* request and generate a response.
*
* @param Auth_OpenID_Request $request An Auth_OpenID_Request
* returned by Auth_OpenID_Server::decodeRequest.
*
* @return Auth_OpenID_Response $response A response object
* capable of generating a user-agent reply.
*/
function handleRequest($request)
{
if (method_exists($this, "openid_" . $request->mode)) {
$handler = array($this, "openid_" . $request->mode);
return call_user_func($handler, $request);
}
return null;
}
 
/**
* The callback for 'check_authentication' messages.
*
* @access private
*/
function openid_check_authentication(&$request)
{
return $request->answer($this->signatory);
}
 
/**
* The callback for 'associate' messages.
*
* @access private
*/
function openid_associate(&$request)
{
$assoc = $this->signatory->createAssociation(false);
return $request->answer($assoc);
}
 
/**
* Encodes as response in the appropriate format suitable for
* sending to the user agent.
*/
function encodeResponse(&$response)
{
return $this->encoder->encode($response);
}
 
/**
* Decodes a query args array into the appropriate
* Auth_OpenID_Request object.
*/
function decodeRequest(&$query)
{
return $this->decoder->decode($query);
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_canvas.php
New file
0,0 → 1,95
<?php
/*=======================================================================
// File: JPGRAPH_CANVAS.PHP
// Description: Canvas drawing extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_canvas.php 1923 2010-01-11 13:48:49Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS CanvasGraph
// Description: Creates a simple canvas graph which
// might be used together with the basic Image drawing
// primitives. Useful to auickoly produce some arbitrary
// graphic which benefits from all the functionality in the
// graph liek caching for example.
//===================================================
class CanvasGraph extends Graph {
//---------------
// CONSTRUCTOR
function __construct($aWidth=300,$aHeight=200,$aCachedName="",$timeout=0,$inline=1) {
parent::__construct($aWidth,$aHeight,$aCachedName,$timeout,$inline);
}
 
//---------------
// PUBLIC METHODS
 
function InitFrame() {
$this->StrokePlotArea();
}
 
// Method description
function Stroke($aStrokeFileName="") {
if( $this->texts != null ) {
for($i=0; $i < count($this->texts); ++$i) {
$this->texts[$i]->Stroke($this->img);
}
}
if( $this->iTables !== null ) {
for($i=0; $i < count($this->iTables); ++$i) {
$this->iTables[$i]->Stroke($this->img);
}
}
$this->StrokeTitles();
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
if( !$_csim ) {
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans',false) ) {
require_once('jpgraph_imgtrans.php');
}
 
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
 
// If the filename is given as the special _IMG_HANDLER
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
return true;
}
}
}
} // Class
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_antispam.php
New file
0,0 → 1,615
<?php
//=======================================================================
// File: JPGRAPH_ANTISPAM.PHP
// Description: Genarate anti-spam challenge
// Created: 2004-10-07
// Ver: $Id: jpgraph_antispam.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class HandDigits {
public $chars = array();
public $iHeight=30, $iWidth=30;
 
function __construct() {
 
//==========================================================
// lj-small.jpg
//==========================================================
$this->chars['j'][0]= 658 ;
$this->chars['j'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBAf/xAAsEAACAQMDAwMBCQAAAAAAAAAB'.
'AgMEBREAEjEGIUEUUXGBBxMVIiNSYWKC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/8QAGhEAAwADAQAAAAAAAAAAAAAAAAECERIh'.
'Mv/aAAwDAQACEQMRAD8A6veK2st8zRWSyV1dUBfvHaGVI4hknsS7AFv4AyM57ayWbqeS+11xtT2etttwo4YqhEqnQs5bcAfyk4AZ'.
'SOeD441TKRTyingUBG4/ah8j684+dSFzh/BvtaslejMUu9DPQTDnLx4lQ/ONw1TGBm0jdRWqguEMghEisWilgDmNs4Ze+MEEEH40'.
'aUVFTa7JeLjRXu4GjhmnNbSfqFQVlA3rkckOjH/Q99Glmkl0C/Q06pvsvT9vttXHDF6T1KrWbs5gRgQJM+FDlQxPhjpF1XcVq+qe'.
'jEoKiOecXBqh2TDDYIXLKuP6549xk8auI6aJqV45oknWdNswkAIkGMYIxjGO2NR1F0LZY5qkWqkS1xrM0M8lMSJpY+TGrnJiQ577'.
'cEgeNHhi7D3qC3UN69M8tIakRhgrh9o748+eNGtcCiKjjpkQKlMTEg3ZwoxtHHtgfTRpYXArvp//2Q==' ;
 
//==========================================================
// lf-small.jpg
//==========================================================
$this->chars['f'][0]= 633 ;
$this->chars['f'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQFBgcC/8QAKxAAAgEDAwMCBQUAAAAAAAAA'.
'AQIDBBEhAAUGEjFBEyIHFFFhoRUzYnGS/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQP/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIRMRIh'.
'/9oADAMBAAIRAxEAPwDcnmLoIkiSYsouC3tA++O2lU9WkqVjJ+YdhZLsQI/4/YfQm50kZP0vbmaCSU0SRNIH6sghb9INs3t38dvp'.
'akUuz8x5DwdN5peS1jV1dSipSiVUigIcdQjQ26lIB/c6r3F86SZpE/zCFJaqsihQNhRgdj3Jyfxo0jDSbXHt9Oph9RAoV3qJGltY'.
'HDOxyb/nRpV0D3RXle21m48XraOk3IUSemUaV4g4Zc9ShcDtgff+tQfwvjq34Dtku7buamFqeJKemCCMxKFsEJU+/FrX8d76sEHG'.
'aNItzr4usVNdG3S0rmRYAVwEUmyjyQLZ11x7aF4zs9DQOyzml29I2cLa/pixIHi99DFCtU9dFuLIaijo9qiYPmR2mZmB9thgAHOD'.
'4+mjUrURyrUNMZFEkkIOFuFAbsP9d/OjVIQ6Vh4tP//Z' ;
 
//==========================================================
// lb-small.jpg
//==========================================================
$this->chars['b'][0]= 645 ;
$this->chars['b'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYCAwUH/8QAKxAAAQMDAwMDAwUAAAAAAAAA'.
'AQIDBAAFEQYSIRMxUSJBYQcVI2JxgqHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAYEQEBAQEBAAAAAAAAAAAAAAAAATERYf/a'.
'AAwDAQACEQMRAD8A6H95mxNYwLXcX+pCuilSLXJ6YSplaUELjqxwe4IJ5PIPamJ2V0bPcS7+NxCX1cHggAnIP+xSd9RyzHh2m7FQ'.
'Q1CvMNQWTjCt+HFD+PB/Y1fI1PL1HFFt0zaGblFdJQ9cJjpZiqPJUlBAKnPcEpGB5NNRKdrOl1NlgiQol4R2w4Sc5VtGf7opZteo'.
'LhdorjUSM5FnQnlR50NeHQysYxtVxlJHIPgjtRRD3xkaghs6juumdHz4+Y7RVPnt59K2mk7W+fcKWsZ7djTXMkW+xMP3GRJjwIEN'.
'HTG/CWx5wPY8AADx2NYk3SL9wukvUjGobnBkORksIbjdMANozgEqSo8qJPGO/wAVO36IsjUmBIfZfuM7epZk3F9UhSSk5O0K9Kcq'.
'8AcU3UzFuhUSBFud6nRXoz96mqmJZWg7m2dqUNhWBwdqQSP1UU5c/FFCn//Z' ;
 
//==========================================================
// d6-small.jpg
//==========================================================
$this->chars['6'][0]= 645 ;
$this->chars['6'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'.
'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'.
'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'.
'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'.
'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'.
'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'.
'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ;
 
//==========================================================
// lx-small.jpg
//==========================================================
$this->chars['x'][0]= 650 ;
$this->chars['x'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABMDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUHBgj/xAApEAABAwMDAwQCAwAAAAAAAAAB'.
'AgMEBQYRACFBBxIxFCJRgRNxkcHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAMAwEA'.
'AhEDEQA/AH9t3pKvO14UykVARa/HfAlxlDKXR24V2p3z7RlPwdtMep91uWdRGHWELjuTFFtLvcC4SNznnH+21O7ttiodOq1BvC0E'.
'p9I0lSX2kgqCSklK+5PKCMAng6zV2XRO6u3lSIURtbDRShltlZHa0tW7q/0MeTwnjxq1Jiw2xc9xTLbhSVU5iaXUFfqFFILgJOCd'.
'9Gt3SXabR6REpkL8yo0RpLCFNx1qBCRjOQMHxo0pEr6o3um2LVYpMEpTVqg25lHn08dfcB9kEgfZ1LIFDuawqZRb7aQlLTzqglsg'.
'9wQdveOEqBIB425xqhQuk8qo9UKlPrlRblw2ZBeCSVKW6CcoSrI2AGOT41SKzT4dYtmdS5bIXDZhNoWgbZJ94x8AYT/GkM03oNUc'.
'uKgwqtTZDTMOU0FttqRkoHggnPkEEHRrkJ6t1SlSHYUOc6zHaWrsbQrATk5/vRqK/9k=' ;
 
//==========================================================
// d2-small.jpg
//==========================================================
$this->chars['2'][0]= 606 ;
$this->chars['2'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'.
'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'.
'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'.
'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'.
'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'.
'7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'.
'DLZ6f//Z' ;
 
//==========================================================
// lm-small.jpg
//==========================================================
$this->chars['m'][0]= 649 ;
$this->chars['m'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAcDBAUCBv/EAC0QAAICAQMCBAMJAAAAAAAA'.
'AAECAwQRAAUSBiETMVFhB2KhFSIyQVJxgZHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREBAQEAAwAAAAAAAAAAAAAAAQAR'.
'EiEx/9oADAMBAAIRAxEAPwB0MI2lIdgI0Cly3kFXLEn2zx1FDdp7rbpbjUtRWKio3hyxOGQllJzkegX66rQ2qW87Zuk9S5FNVmru'.
'iywyBhjDKTkeXfSr+GRfYtq2KAO32b1BGxAZu0dyJ2DKPTxY1wPddVszycUq2Golq8jRWbcnJWwCVGMjz+VQP50atxMtm2ZUOY4l'.
'4qfUnBP0x/Z0amy4jJm10Tt2yddWasFmfaRfdrlG3UcgArnxKzJ+Fu4DqCMkcgNem2DoWav8PLfTm+FPEkuSNTnqueS5bnHIv6CG'.
'LNjJwM99bm67NB1Ht89KSxNXnr2hNDbiUc47K4KyD2GQMfmMjUnS+7vuIktTqPCaaWCqAMMojPFyw8hyYMQBnAwNJHYGXPTsW9VN'.
'jg2zf50W9zk524GAEihuz+xbIOD82jW5TkjtRPZkTkJ+4VgDhQfuj/f3OjUxl1f/2Q==' ;
 
//==========================================================
// lt-small.jpg
//==========================================================
$this->chars['t'][0]= 648 ;
$this->chars['t'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAJxAAAQMDAgYDAQEAAAAAAAAA'.
'AQIDBAUGEQASEyExQVFhIjJxFSP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAP/xAAZEQADAQEBAAAAAAAAAAAAAAAAAREhMUH/2gAM'.
'AwEAAhEDEQA/AO4BLEiEy7uG4IGxxs5IOOx76wd2XYidSp1HoD70240gcNNPbDyI6wQQpaz8E9MczkdhqtbsKYLieDk6WLKmZmmL'.
'Hk7AHVkbkLI+RQc7uRxgkfr1tx2rGu6VbToLVKkhU+kbugGf9WfaknCk5ycaX0zmaa+3JkqvW/CmzojsB9xoF6OoFK0r6HOcEDI0'.
'aefTuKX5ScMdC14HYq8n12zo1DEUcKTGg1Z+hyBwoPBVIiA/VQyOIgedhUCB4WMfXSV3UufVLcTUIqVf26K6mXDbPVRRzKT54iMg'.
'+zjtq6mtsyJjclxpKlUhSXEbkgkqWnBx4+J5e/zU0pZemPvJJQzEPDfQOrwwFY9AZ5eeYPLV6FwhoFYZuigxpkJeIjqAeIoAk9wA'.
'D46EnuD+6Nc1smDNrTlRkxqtMo1vzKhIdYgU9YDqVpISrLhHxSSd21I0aYyqP//Z' ;
 
//==========================================================
// li-small.jpg
//==========================================================
$this->chars['i'][0]= 639 ;
$this->chars['i'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwAGBP/EACcQAAEEAQMEAgIDAAAAAAAAAAEC'.
'AwQRBQAGEiExQVEHExSBFWFx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECMRH/2gAMAwEA'.
'AhEDEQA/AE7c+5M9BeRG29t1WUfKFFYW+GvrI7WD3B9g140YD5T36rcErDjbUR6dCBdejsKUpxITXI2FUrooCh70yvxzHyIlMvuK'.
'eVSH7IKEpJoKqu/ahddLryR/aMiO187bsmrWShhp1AZS2XHHrWhNJrzdf7f7GiVcHk3sptmHkJcJ2DIftS2FrKlJPXudWuLGYeQp'.
't2fmEIckqIZaaKuSGG0lQ4gduRoFRHQ9AOgs2lOJbk9aSUlpjGvAWeSVH2VKq/2dFPw3IjyJe8s281ct3I9UoHJXGiQkD2STrSZ7'.
'Yf8AOl7JTdw5eOCz0jw3+LbYCfA9nz71msb8KMxoTGTw+5srjsipAdDqFBQBIuiOl6KrdYyJMyTCshlw2G3Fr/HiNqNNAqJJUoGl'.
'KND+h47km1bZwsvCbYYjycxIyK1qDv2yEi0hQviK8atKDcy9j//Z' ;
 
 
//==========================================================
// lp-small.jpg
//==========================================================
$this->chars['p'][0]= 700 ;
$this->chars['p'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAECBAUGB//EAC8QAAEDAwMCBAMJAAAAAAAA'.
'AAECAwQFESEABhIiMRMVUWEHFEEWIzIzcYGRocH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAcEQACAgIDAAAAAAAAAAAAAAAA'.
'AQIxAxESIUH/2gAMAwEAAhEDEQA/AOh703xG21DMeOyqoVNDjSzERiwU6Ep5qtZNycA97HTF13d33KWtmlt9xwkLl1NkXVxIuQgK'.
'wLj+hqBvel0qmbR8GnR22nJNZiLeeKr8nDIT1OLJucX+uPbWom7iocRpafOac5MX1ALltp/Cbi+cJH++utdh+WVNL3PNdNYpdWgx'.
'Y0qmLZSrwJJcQoOJ5XKlJFu4HbJOjVbt+V5nu7eopNRivqcdhK+bFnWwA1Y2AOcgjvj9dGlxy0g5y0xd+hNXoG24C4obizq3HZUh'.
'YHqtRHD06bG/8a0MbbG1mqekxaBSGmgkrcdcitlLfrckZIz7DUatbeFak0tyRLUwzT5vmiGm0cufEkFBJItfkD+59tKmiO12atFa'.
'eQukO3ejUxgENqTcfnE5WbkHiOnJ76N2IqI1DibabptS+zkZhtp90F2Y0S026EkAFK/qL46cXv65NVZDfxHmVCK4DE2/RX/lRFbA'.
'C5LwAyq2EtpHZI7mxPYDRqoctdESimz/2Q==' ;
 
//==========================================================
// le-small.jpg
//==========================================================
$this->chars['e'][0]= 700 ;
$this->chars['e'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYEBQcB/8QAKhAAAQMCBAUEAwEAAAAAAAAA'.
'AgEDBAURAAYSIQciMTJBE0JRYRQVFoH/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREAAwEBAQAAAAAAAAAAAAAAAAERAjFB'.
'/9oADAMBAAIRAxEAPwDTszvhEYCoS80BTm2bCjQRwdAzVe2yopkpJtpRUVfjEIc4V2oMerByg5Ji30oMyS3GeMunK0upfnu09MdJ'.
'p2scTmWnnGfx6HThktgLfKj7xEOqyr7QBbL41LhBzpxbcOru0LKDLdSnOHoaltNqSC4qWL0x9xbJYum69caczSaHmGmTmpDUYn4l'.
'UiqjkynzAVtwV23Ud+X4Ibpa2DCPkjhfUaRO/p8yzpb+YHhUmhbev6ZEll1lvqK3jt2XrbBgp6HVwsK3THpfEubGSoOUyFMpbJmL'.
'Deh6SgOGKti57EuY6l62JMWdJy7k3hg1LkOozEbVm7suQSkTiKtkEfP1pH664Za/QItccgI4bseTHdNxiXHLQ8yVl7V32XyioqL5'.
'TGc1ng6eYs0idczXUZscBBABWgEhEtfKNuUezwPnBhEuj8X2M21z9BR6NUX211Kk/UKKAjuhkPhL7XVf8vtgw7UPJlEyrDWFSYLb'.
'LBNF6qrzG6t0spEu6+fpL7YMXhUndp//2Q==' ;
 
//==========================================================
// la-small.jpg
//==========================================================
$this->chars['a'][0]= 730 ;
$this->chars['a'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABoDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwIFAQcCBwAAAAAAAAAB'.
'AgMEBREAEiExQQYHFBUiUXGBE2EyQkNSgpHh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABkRAAMBAQEAAAAAAAAAAAAAAAAB'.
'IQIRMf/aAAwDAQACEQMRAD8AfdQ1pxjqZMSn0mRUZRYDaklJCE3OawO2ttTxY4hl07qFMVs1Ku02kpPnRGhsAqz8W9T9wDjozq6o'.
'Q1lDrcZLGVcmUoZg0obpufxK3Ftt9ccqB1GgBcmLSqtVEqOZcr6ARm/kbXHt7DEtc7WTJKTJqEWvRKfLqL9QplSjuPtGVYOJKBrm'.
't+U+n94WGStZzNypmRWqckUKTbixy6jAfxPxHtCgKqFNlU5huK6pLMndSlegG4J45N8aKmTMKQRBsCNMzwB+RbHWHGEAZlPZX2hx'.
'qZIC34ygZoYUbB50JSkFXFhZR9BrpheR4fIbQ6gvurJ7q02bIQTuAOAN8x40HAxRr3TrNRpBmSHVt1KMlTyJTCsqkKAPlSf28W+c'.
'UGaD1c9HSR1HFUh9tJU45EBcAtcC9+P9wqbg8IAto9o81yputrVGpiUkgHKkqUTZI32+cKm1z1tIUgPBBAKQ4UBQH3uL3xmXSXep'.
'HVDtXStE5K5jlPU7PF3Q41+okJFkjgC+3OuNSYiSzHaLtRcW4UDMpLYSCbakDW3thhum5p//2Q==' ;
 
//==========================================================
// d9-small.jpg
//==========================================================
$this->chars['9'][0]= 680 ;
$this->chars['9'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'.
'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'.
'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'.
'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'.
'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'.
'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'.
'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'.
'1V1//9k=' ;
 
//==========================================================
// d5-small.jpg
//==========================================================
$this->chars['5'][0]= 632 ;
$this->chars['5'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'.
'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'.
'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'.
'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'.
'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'.
'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'.
'8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ;
 
//==========================================================
// d1-small.jpg
//==========================================================
$this->chars['1'][0]= 646 ;
$this->chars['1'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'.
'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'.
'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'.
'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'.
'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'.
'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'.
'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ;
 
//==========================================================
// ll-small.jpg
//==========================================================
$this->chars['l'][0]= 626 ;
$this->chars['l'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAArEAACAQIFAwIGAwAAAAAAAAAB'.
'AgMEEQAFBhIhFEFREzEHFSIyYcFxgZH/xAAXAQEAAwAAAAAAAAAAAAAAAAACAAED/8QAGhEAAwEAAwAAAAAAAAAAAAAAAAECMREh'.
'Qf/aAAwDAQACEQMRAD8A15Zfm1VURj1Fp5AqLKv3OARcL4W5Nzx+MLWjdRz5hqXU6TSb6OCr6WghiQbrJ91gOTy1yT5xZ55myZFk'.
'Gb5ozX6Ondm28XYqpQDwu7jEH4c5S2UaDy4xxrLmlUDWzk8XaQ3O49hbj+RiB85HNg8Ee3aqwIqhDuux7G/HHbvzgxEqaWOvy09R'.
'O0o3hjdQoUji20g+fY3wYSM6pJ4Ylr7V+Zz5PSaezHTlTRNWzxySSxt6q1MSkH6AOT2Fu3Aw7RfF/T9DEkLUeawuF2mKSgdWQj2/'.
'q3+fnDZDlqRZzQGaOGcpTOaeR1u8R+ncN3gj94so2jNWHeMNNKzorEX2qp9v3imNPoRE1zpjUtZ09HJmYq5lury0benZeTww23t3'.
'Ivgw+T0yRRyyxIqNfkLcA8jt7YMKcBWn/9k=' ;
 
 
//==========================================================
// ls-small.jpg
//==========================================================
$this->chars['s'][0]= 701 ;
$this->chars['s'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAMCBAUGB//EACwQAAEEAQIFAgUFAAAAAAAA'.
'AAECAwQFEQAGEhMUITEiYQcjQVFxFRZCUoH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAZEQADAQEBAAAAAAAAAAAAAAAAAQIR'.
'EiH/2gAMAwEAAhEDEQA/APWZMhmFXSJU+SGmWFiQtAWMJQAnJUr8Z+w/OuQk71uZnMsqnbjy9s8st9UMCQ6kZJdZaIHEkZ/JHceN'.
'N3HtizuY1JLrG48yLBSC9UTFKQiY4nACir+wAOOMEe2rm2bTbzlqtE1MyBuZAPybpw85KSfDRJ4Cg+Pl/wC61hJeGjV31VuuKqwr'.
'LGU+whZZK+Rw+oYJAyj3GjS4dZFpZVkqPLktdfMXNcaU2kBC1BIITkdx6c599GlnvPAa3TL2vNvU76n0063acr3YSLCEjpUpUQtW'.
'Dhf14SMEnOc57aZ8Tegm7dbrEQGZt1PeTDgc1PEW3FeXAvyAkZVkeMDOm2G3f3O7Cl/qEuqkQg4lp6CRxraWfUlRUD24kZA741Ko'.
'2k1HvlT3ri2sLOCgtsyJz6XEtBwZPAgJAGQMHUNPWKqWItsqh0UCFVyLeKhyLHQ2TMdHNVj+RKlAnJyfto1FW2ahgjrq6LYTFjjf'.
'lymUOLdWfJyoHA+gA7AAAaNPE3ysJdLT/9k=' ;
 
//==========================================================
// lh-small.jpg
//==========================================================
$this->chars['h'][0]= 677 ;
$this->chars['h'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAIDBAUGB//EACwQAAIBAwMCBQIHAAAAAAAA'.
'AAECAwQFEQAGEiExExQiQVEVggcyU2GRocH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAwQB/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQAC'.
'AyEyMf/aAAwDAQACEQMRAD8A6DZb95q9bmpK6ieOCzNHJTxmE+NMhQ5fr1fLq3Ejvkak2e7ipiFsqb3R0m4qkPPJRiRXenU9VjKE'.
'5JVcA9R7nWc3/BUbfoKTdO3VRXhpjbZ2D8Rwk6RyZH6chB+46m7i2hDYtgA2ePlV2VkuKysoLzzRnlIScZJZeeevvjtrX7LK2rp7'.
'tTwwJ9WjhILDrTKnIdMEDl2+P80aVdJZb1QW+vgqENLPH4sBCDLIwUgnOf4GjVvDnLgUk79T81voqjb8NnuUx8pVRCiEaYUSuynl'.
'jHU9mOfnOoOx6hqz8PrbNdfEkMUXg1LSM3rKOUywJ7YAJ1ZTWmSpvdvlaVTDSUzJAhH5ZJBgv0x2RSAPlz21WXqoet3ba9nuW8n4'.
'Jr6qTPqnUNxSM/f6mPvxA9zqJnExTbR+h0nkhVu1uE8j0UBRQ9PGxBKFjnkAScdsDp10a0lc7z0tI7Y5YYN+5GAf7GjVXF4Icj3f'.
'/9k=' ;
 
 
//==========================================================
// ld-small.jpg
//==========================================================
$this->chars['d'][0]= 681 ;
$this->chars['d'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFBgH/xAAsEAABAwMEAAQFBQAAAAAAAAAB'.
'AgMEBQYRABIhMQcTI0EUMlFhkRgicaGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgEA/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECETH/'.
'2gAMAwEAAhEDEQA/ALUhp6h3W/X63UlypbhCY0WMjLqGzwDtPCfv/WtealNpVInuVBBqCogcdbU36YUkAkJWVHG8YPXBxxzxqPcN'.
'YtWyWnIlUeW05VEOAvrCnnSkftK1H5lKJPHsMDoDUWq+KdrSbIqsalVsImiEtLUZ2MU71bcYJWkhZ/36ayLHhi/IXZVOmzKqp5uU'.
'688hTyjuGVEFJKvoQesD86NL2jGZp1EoLDSmk+ZAQ8d7oPzp3YGesFWMfxo1YGvSzLsT9QExVX8phTlMaFOExAJIBGQjJwCcL+/e'.
'rd+W7GuO0Kw05CQ6+ww69Gfdb2kFIKk7DgEkjgnr86rXRa9HuyP8LV4SH0sIBbWFFDiFEgDaocgdkjo8ccay0qw7ut5nyrcviQqC'.
'slsRKo0HwlODkBRzxj2AGoXTtpzIdQ8MbffUChz4NCPRaClAo9Mn6c7T3o13wytmo0K05VIqkiPJbizFiMWs4CTgnIIHOST796NL'.
'Ia1JX//Z' ;
 
//==========================================================
// d8-small.jpg
//==========================================================
$this->chars['8'][0]= 694 ;
$this->chars['8'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'.
'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'.
'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'.
'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'.
'44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'.
'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'.
'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'.
'EylmLHQltptPZKQOBo1FzH//2Q==' ;
 
//==========================================================
// lz-small.jpg
//==========================================================
$this->chars['z'][0]= 690 ;
$this->chars['z'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAHA//EACsQAAEDAwQBAwIHAAAAAAAAAAEC'.
'AwQFESEABhIxBxMiQVFxCCM0UmGRof/EABYBAQEBAAAAAAAAAAAAAAAAAAECAP/EABgRAAMBAQAAAAAAAAAAAAAAAAABEVEC/9oA'.
'DAMBAAIRAxEAPwBTWfLu1KXXZDbM4uewNvLajlwhaCbBAwDe5uehYd3xm6t6bi3jvulwqc7KgxXZZeYQLNLeF73WRg4HEdgfzrSa'.
'P45pNEkznITDc9ypLShtyWhJDJyXC2qxJHZvjoZOjyVv1v8AESt6FFS4ijxvTLbawEApSccrYHJf0+OtJMQ2rNXk7GZMufJgJjTH'.
'Un9M4qzxT7hyCiThIyRnPXWrRvyLElVBUF6vlhl0lwRYCFKcQhAtyWpVhyWTx+w++rUvp4EWjOvbniUOnVatcS43BYDbJSPZyIBw'.
'ejclIx+3Wa+J63T6DQanuGszI0eZVJJV60p0Jum5GEi6le7l0PjvSjyRsaTvJqI1BqhhR46ksuMrQVJcUSEoUbHNr/7o7C8L7eiz'.
'4lLlyJk2cEqW+6V+m0AE9ISLnsj5+O9UhsFK92bZZqb9SRu9p2c4A0OCEqDbYAJSlJwAVZv3fBvbFrg/462btlhuS1RG5nL8pYkq'.
'KrnsKH06I/rVrQKkf//Z' ;
 
//==========================================================
// d4-small.jpg
//==========================================================
$this->chars['4'][0]= 643 ;
$this->chars['4'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'.
'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'.
'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'.
'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'.
'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'.
'27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'.
'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ;
 
//==========================================================
// lv-small.jpg
//==========================================================
$this->chars['v'][0]= 648 ;
$this->chars['v'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAKBAAAQQBAwMEAgMAAAAAAAAA'.
'AQIDBBEFAAYhEzFBEhQiYQdRFTKB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAERIf/aAAwD'.
'AQACEQMRAD8A6Ngt1SZ4yrYgrecgTFsFJA9aGwAUrUaF2D2Avjzq6CIjiBPkB9bwQVIkIYIDae/wq+P9N+dY4SGMf+Txlev7KBmY'.
'PoadKRy4zxSgRxaTwO/x09u7KPYnasmHjlsyFZZXt4K23ezjvBpNGgLUrvXfVZyLLbWambiwEbKvvxYAkeotNlIJW2FEJWb7WBda'.
'NSQI0fHYyJjkrjKRDZQwnpQ1vgBIr+w8+a+9GocZr8iKkuY1eXhsKH8U8iZE9BHz6ZHUc48UfSPqzqH3kfeO9kTTDQYGGietpTaO'.
'shyW6AocpHNIrv8AvWzk9BUSdPdYS4BcRlomkhIV6KP0VE39V+tU2wdlRMHtZUB8NuTQ+51X27+Kr46ZPIAFV540D8zeLsJ5LMHa'.
'ubmMBCVJdjx0pRyLoWR4I8aNIQ8BvZMNtMTeUcsptKfc4tC1gAkCyFC+K0aJtf/Z' ;
 
//==========================================================
// lk-small.jpg
//==========================================================
$this->chars['k'][0]= 680 ;
$this->chars['k'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBAMH/8QALhAAAQMDAwIEBAcAAAAAAAAA'.
'AQIDBAUREgAGITFBEyIyYQcVUYEUIzNicZHx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAEC'.
'AxESMeH/2gAMAwEAAhEDEQA/APVK/V36dU6NSJDTT8esPLiqfK8S2cCoeTkKvZQ6jm2ldSqKqbu+OgMOvSX3m4UBrLnDlbqiefKl'.
'Nzz2x1m+IwNP27CkJQ7JkR6rCkMJbP5jp8S2CPfkgD6H+dJ6Ca0nerr+64rTNSqMYrg+C9mmOwhVpDfsuxSbi97DmybaoZeQ5jTl'.
'PEp18JTIfeW3kq3ly4H26aNZqvTWZsjFcZTsVtSg0G8Rio+vr2vb7g6NLPRnuXy8F+8kl+obUh4KXJdqSJJQnohlkZqJPYBXh3P+'.
'a4b5Hyp6k1bO7sOotPyXkj9NlwFl0ewstJA9ifrqkVSmET4csoS7UTHXFQ+6SQlskKUMb/tH9ddLVUmS7DqdBqD7U6OsqfS46jzl'.
'hQ5bXb1K9Scuybdxo2OTu92dwSZkWn0Sb8viQWyn8Qq5D6ifSLd0BIv7q0arTBRSKPToMZbi2GWylsvLK148Wue/XRrRjxOpT2R2'.
'k9aP/9k=' ;
 
//==========================================================
// lr-small.jpg
//==========================================================
$this->chars['r'][0]= 681 ;
$this->chars['r'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAGgAAAgIDAAAAAAAAAAAAAAAAAAYCBQMEB//EAC4QAAICAQIFAgMJAQAAAAAA'.
'AAECAwQRBQYAEiExQQdRFGFxEyIyM0JSYoGC8P/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/EABcRAQEBAQAAAAAAAAAAAAAAAAAB'.
'EUH/2gAMAwEAAhEDEQA/AOs0ZdETU54Gt1INSmlPJEsyo7J+jlXPUYBPY9c+eE/dO9tY0a7ren6BVrW7VJTZtW5kZkjXkBSIKveQ'.
'gHp0AAJ4w+q2hVdT2Md0h46+saS4mr3EUK0gWTAB+vQj2PboeL/ZVOqmhaZVjkFmxdC6tctt3tM2G5/7bAx4C4+qxiWwd3prWzKe'.
'r3IBAth5OYxozKsgc8y4GTgnJB9uncdTi6tXq2140rRVM13JMEMAVAg7sMdBjJB/18uDgRO9R2Oo6FX2vShkFzURFUq1whIj+8DI'.
'7EdAFjXv7MeNb0kuStsFEmIaajZaos2fy2Q4VGH7SGxn+Rzw9yMLOm/FzRhZazmOTkP4grYyD3B8j2PTyeFfZ+z7G3BeSS8lmprl'.
'2K2qcnK0Z5S8gPjrgAY8cNEWmq7u23pEos6/Zji+Kd0rLLGWwseA3joeZj/w4OET1g0vlmrWV+ydFnkUxSgsvM4V+YYIwfHz6cHB'.
'ZeKZ1//Z' ;
 
//==========================================================
// lg-small.jpg
//==========================================================
$this->chars['g'][0]= 655 ;
$this->chars['g'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQCBQYH/8QAJxAAAQQBAwQCAgMAAAAAAAAA'.
'AQIDBBEFAAYhBxIxQRNhcYEiQlH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EABkRAAMBAQEAAAAAAAAAAAAAAAABAhEhIv/a'.
'AAwDAQACEQMRAD8AayO4t6bq3hmMHtxyLi4OKeKH5jyASiiQCCQeTRNAeB61FrBb+jTGpLO+BMW24EFMhkhpQru8m7B/H70x09Yi'.
'q3nv/vLfwpnJ7UNkqSRbngf2ofWkpXV7brymC2malLfagurjW0aHk89xPJ9cX9aprURHWbYEaMHHEBfwpv8AnXPk+/8AdGqGJOxO'.
'4YbOSxK4y4boIStUWysgkEmxY54r60aOI8oTV9MHtjJwunPUbO46WWo0HLlD8KY4goboFVoquOVEVwLT963WdnxYfT6ZJyz0JvHm'.
'KvtaSkW4tYNVSqKiTwB+fw5n9sY/cuOXCzDDcluyW3Ckd7V+0n0eNZTH9DdouFalHIOJBUhtDki0pNV3UALo81ehG6IdKjPZ6d47'.
'4ywltanVJvuJI+RQs/sHRqy2r003JhsImEc/CUyhxRZBjKV2oJ8eRXNmufPnRo1WIz3DdNn/2Q==' ;
 
//==========================================================
// lc-small.jpg
//==========================================================
$this->chars['c'][0]= 629 ;
$this->chars['c'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBwID/8QALRAAAgICAQIEBAYDAAAAAAAA'.
'AQIDBAURACExBhIiQRMVUWEHMkJScYFykaH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAAAATER'.
'/9oADAMBAAIRAxEAPwDcoGkmiT4Q8kWvzuPU38D2/v8A1zwrCFayq1qTaFk2H7aJHt05MeMvENzC4upDWkjW9kJXiricAJCigvJN'.
'IB1IVQT5frrv24twPgunk6a288crbklUSJNNdnSTZ2STHHqOP/Eb17njdZtAoqwEvrEiGVyG117/AG6HhyV8H1sljMldoxXTksGC'.
'zV7M0oaWGQOVeGQ92I6EMR22D11w4LmEPjaOL51iL8ssc9Z69zHtZkYCGGeQK0ez2UEoU39wCeX1S/LLiEt+mPSbMLxsGVv2kEjR'.
'305xkaEV/GTULMUT1LD/AAGh8gIZS2jv+vpybb8NMIb0dVLWYWgiiU0vmMphOj6V0TvQI3rfsON1E6dYjGtisa0F1mAWR2NhG0WZ'.
'3Ls3TqNs5Hc9h23w49NWL9K+Q/VD5T/zhwPH/9k=' ;
 
//==========================================================
// d7-small.jpg
//==========================================================
$this->chars['7'][0]= 658 ;
$this->chars['7'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'.
'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'.
'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'.
'19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'.
'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'.
'8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'.
'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ;
 
//==========================================================
// ly-small.jpg
//==========================================================
$this->chars['y'][0]= 672 ;
$this->chars['y'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAArEAABAwMEAQIFBQAAAAAAAAAB'.
'AgMEBREhAAYSEzEHIhQkQVGxQmFxgaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/xAAeEQEAAgEEAwAAAAAAAAAAAAABABECAxIh'.
'MUGR8P/aAAwDAQACEQMRAD8Ar3tys07dVHohemz5dWQ7fk91MsA3IIRY8rkKFySceTqw3JVV0KhyKw+0C1CQp9aUOFSiAk4AIAvn'.
'76xtz0ioVvbcJ6msx2JtOfZmw1PKI5LQcJNh7UqBKcn6+NRfqPu6s1fYc6GxSJsRfWDUVSGA22ygEckJWSexRNgOP0udXzDKOJ0I'.
'yo62mHm25Sy80l1Z4lSgpQvZRGLgWwPGjTjbchyLH+Ejx22EtJSgO8kki3kADA/nOjWjGzv73CyQZjUWNVp7bNSrj7qJDqflqUlQ'.
'DMds24l3HvcNr3Pi9gME6T9WWVsemdYWswwC2lPta4m5WMA3OdUExCmozUJD6g84ntMjrHIFBTdQz5yLDx/WDNytpwW6nAkViqVe'.
'uvmXdlme6n4dCwlRBKEgA2tj99QG7Ilncp5QqpU31PMsJ6x7A32f6SPxo0hPVCD45oVyKf0MtgeT97/nRrO7UOCFla3tn//Z' ;
 
//==========================================================
// d3-small.jpg
//==========================================================
$this->chars['3'][0]= 662 ;
$this->chars['3'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'.
'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'.
'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'.
'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'.
'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'.
'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'.
'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ;
 
//==========================================================
// ln-small.jpg
//==========================================================
$this->chars['n'][0]= 643 ;
$this->chars['n'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGwAAAgEFAAAAAAAAAAAAAAAAAAYCAQMEBQf/xAAtEAACAQMCBAUCBwAAAAAA'.
'AAABAgMEBREAIQYSE0EHIjFRcWGRIzIzQoGCwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAP/EABkRAQEBAQEBAAAAAAAAAAAAAAEA'.
'AhEhUf/aAAwDAQACEQMRAD8A6FR3p7v4oV9rlkMQsjL00RyOss0KkFxnDcrc2PbI1NOJKyTjW+W5OmKeA0UEJx5meRZS2/8AUfbS'.
'LVGS1+K16vCzfiR3GmoqqXGyxz06hWPsFlVMfOmq1iNvE69KjBYo3oJMZ3GKeYYPxg/fW+xzZX1FLQyxwSTcpWNceu4G3+aNSmpY'.
'qmQzzwh2k8yhv2r2H23/AJ0aoy+EWh7I1ntacR3PxDtEzhjWy0wkkIwYmanU5GO6sNh7rrU8AVdTceNbhDXxNHUQvS0tZ3DzwxVA'.
'fB7hj59/XJ08cPWaKj4gvlwSQiG7dCboqvLy9NOmQT9SM7ayJrBa6K5V91hjlWorp4JGUOAglRSiMMDb82/vgaBGTpVvtNUVtyJg'.
'5+WNAh5ZCu/r2+dGrgq0pi0DhmlRsSSAfqMd+b6ZyNu3po1Rk1yNBe3/2Q==' ;
 
//==========================================================
// lu-small.jpg
//==========================================================
$this->chars['u'][0]= 671 ;
$this->chars['u'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYDBAUH/8QAJRAAAQQBAwQDAQEAAAAAAAAA'.
'AQIDBBEFAAYhBxMxYRJBURSB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAD/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQARITFBAv/aAAwD'.
'AQACEQMRAD8A6dLkQmJzu3WVtHIqjf0duKFNuBr5UTQ45F1R8/XI1PMmsYoJyjhS9iI7BKHeKjkXZVXqhyLHP+rrHeR1pZlx1W1M'.
'wTiW0ukkrS28nn5fV2SPPFfurHUKQhzYG7pLYKEfyBhaSOS7dG/YCki/uvWn3LPDOJrwa4kyEzOYeakqkpC3Hk0bNePQHgDRpchY'.
'leIZwzUWauKtuPctTSUlCAUmrBHIKuAPV/ujQsmHdm7hya43UbbD3ZVElOQJsdTS6IQaQUqBHCk8E2Pocgam6oYwObHy0Zm0oi45'.
'T1KBPdpV2f0pom/1Ws7cmPazu98Ltvcq3VzRHfehz8a4pirFEKRZo8eQT+eCdWYfS/b+WYnxpbuVcDRMdHcyTqg2fiAfiLoi+Rf+'.
'jT7Xc74HtOYnHyUOh8yWUvKeHhy0CiPVUAPoDRrm+OeznTva6lzsyMjCYbbaiNJjJSWElagD5tRpNUSALFeNGoOCH7Bv/9k=' ;
 
//==========================================================
// lw-small.jpg
//==========================================================
$this->chars['w'][0]= 673 ;
$this->chars['w'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYDBAX/xAAtEAACAQMDAgMHBQAAAAAAAAAB'.
'AgMEBREABhIhMRMUQRUiIzJRYZEWNIGx0f/EABYBAQEBAAAAAAAAAAAAAAAAAAABA//EABoRAAICAwAAAAAAAAAAAAAAAAABERIh'.
'MVH/2gAMAwEAAhEDEQA/AHXbV13ZLu6t2/uaa1JijWopVp4XUTKSAXRyc+6ehBGeoPbTSlwpql0K3GneqpZViqUhI5JzGMEZJGeh'.
'GlXfaFILDf7FQzXC426rDLTojs8sLqVkXBGcfKf40twWbdWzZY75R0s90ul3jPtKjVMJDNn4DDp8iEhW+wJ1WZG2KWt3Lv26U1tv'.
'92o7PaYkgYUbqVepYlmUBlIwqnB++O2jTDt/bBtth9jcpvEWNGqalZQryTlmeR8jPct6+mNGmRC4a1U13htzVFItB5nA/cyOUVfp'.
'7oz/ALqitJulYJKuqvFsppHALLFb3cp9FBaXr+O51bq0q6i38KK5PDVAAxSzU6SIpz3Kjjn8jUFoS7uFmut1gq17xLFQ+DxOccj8'.
'Rsn+tVpiyJnqv09YfOXu5AycgZZQEhBZjgDBOOgwO/po0sttWHdNzqLruioa4UwmdaC3kYp4IwSvJlBHKQ4OSe3po0qxM6P/2Q==' ;
 
//==========================================================
// lq-small.jpg
//==========================================================
$this->chars['q'][0]= 671 ;
$this->chars['q'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAcDBAUG/8QAKRAAAQQBBAICAQQDAAAAAAAA'.
'AQIDBBEFAAYSIQcxIlETCBQVgSNBYf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oADAMB'.
'AAIRAxEAPwDT3H5Qz+O3LN2vtrF/y86NYLzzVlAABJITQPv2a/17vXMboz3lDEYWPuafNx7CFrS03+2jpK2bs0CUkUa7pRvrUu63'.
'sr438yv7pLEo4XIK5Kcji0uJUkckm+uQUOVH6GsnyJv7A5vaJwuFdkONLmolgONFH4vioKRXYqyCADXvRMh0yspmZ4jyIEtDTK47'.
'aiA0lQUopBJBI/7X9aNT7amRo228e3a31iO3yUzCcdSPiKAIFdCho0TIswZ7GQlO/hlRxBooih1YXzAoKUkX0LPEBX110dJ7zbuv'.
'AORpO04cIpmxH23FSEIRwKuNnsdk0o31702XhFMKbuRUZJWP8LTQ6HBCuIB+iVWSR2BXuqK93/hDlvGzEphmG3Ml5JpDi1I7TzNA'.
'BYFlPafY+/7LBiv1CYDH4iFDOGySlMR22lFP4wCUpANfL11o1r4bxXlWMNEaE/bqlIbCFl/ANPK5Do/M0VDr2Rf3o0TX/9k=' ;
 
 
 
}
}
 
class AntiSpam {
 
private $iData='';
private $iDD=null;
 
function __construct($aData='') {
$this->iData = $aData;
$this->iDD = new HandDigits();
}
 
function Set($aData) {
$this->iData = $aData;
}
 
function Rand($aLen) {
$d='';
for($i=0; $i < $aLen; ++$i) {
if( rand(0,9) < 6 ) {
// Digits
$d .= chr( ord('1') + rand(0,8) );
}
else {
// Letters
do {
$offset = rand(0,25);
} while ( $offset==14 );
$d .= chr( ord('a') + $offset );
}
}
$this->iData = $d;
return $d;
}
 
function Stroke() {
 
$n=strlen($this->iData);
if( $n==0 ) {
return false;
}
 
for($i=0; $i < $n; ++$i ) {
if( $this->iData[$i]==='0' || strtolower($this->iData[$i])==='o') {
return false;
}
}
 
$img = @imagecreatetruecolor($n*$this->iDD->iWidth, $this->iDD->iHeight);
if( $img < 1 ) {
return false;
}
 
$start=0;
for($i=0; $i < $n; ++$i ) {
$dimg = imagecreatefromstring(base64_decode($this->iDD->chars[strtolower($this->iData[$i])][1]));
imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $this->iDD->iHeight);
$start += imagesx($dimg);
}
$resimg = @imagecreatetruecolor($start+4, $this->iDD->iHeight+4);
if( $resimg < 1 ) {
return false;
}
 
imagecopy($resimg,$img,2,2,0,0,$start, $this->iDD->iHeight);
header("Content-type: image/jpeg");
imagejpeg($resimg);
return true;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_pie.php
New file
0,0 → 1,1462
<?php
/*=======================================================================
// File: JPGRAPH_PIE.PHP
// Description: Pie plot extension for JpGraph
// Created: 2001-02-14
// Ver: $Id: jpgraph_pie.php 1926 2010-01-11 16:33:07Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
 
// Defines for PiePlot::SetLabelType()
define("PIE_VALUE_ABS",1);
define("PIE_VALUE_PER",0);
define("PIE_VALUE_PERCENTAGE",0);
define("PIE_VALUE_ADJPERCENTAGE",2);
define("PIE_VALUE_ADJPER",2);
 
//===================================================
// CLASS PiePlot
// Description: Draws a pie plot
//===================================================
class PiePlot {
public $posx=0.5,$posy=0.5;
protected $radius=0.3;
protected $explode_radius=array(),$explode_all=false,$explode_r=20;
protected $labels=null, $legends=null;
protected $csimtargets=null,$csimwintargets=null; // Array of targets for CSIM
protected $csimareas=''; // Generated CSIM text
protected $csimalts=null; // ALT tags for corresponding target
protected $data=null;
public $title;
protected $startangle=0;
protected $weight=1, $color="black";
protected $legend_margin=6,$show_labels=true;
protected $themearr = array(
"earth" => array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430),
"pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38),
"water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388),
"sand" => array(27,168,34,170,19,50,65,72,131,209,46,393));
protected $theme="earth";
protected $setslicecolors=array();
protected $labeltype=0; // Default to percentage
protected $pie_border=true,$pie_interior_border=true;
public $value;
protected $ishadowcolor='',$ishadowdrop=4;
protected $ilabelposadj=1;
protected $legendcsimtargets = array(),$legendcsimwintargets = array();
protected $legendcsimalts = array();
protected $adjusted_data = array();
public $guideline = null;
protected $guidelinemargin=10,$iShowGuideLineForSingle = false;
protected $iGuideLineCurve = false,$iGuideVFactor=1.4,$iGuideLineRFactor=0.8;
protected $la = array(); // Holds the exact angle for each label
 
//---------------
// CONSTRUCTOR
function __construct($data) {
$this->data = array_reverse($data);
$this->title = new Text("");
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->value = new DisplayValue();
$this->value->Show();
$this->value->SetFormat('%.1f%%');
$this->guideline = new LineProperty();
}
 
//---------------
// PUBLIC METHODS
function SetCenter($x,$y=0.5) {
$this->posx = $x;
$this->posy = $y;
}
 
// Enable guideline and set drwaing policy
function SetGuideLines($aFlg=true,$aCurved=true,$aAlways=false) {
$this->guideline->Show($aFlg);
$this->iShowGuideLineForSingle = $aAlways;
$this->iGuideLineCurve = $aCurved;
}
 
// Adjuste the distance between labels and labels and pie
function SetGuideLinesAdjust($aVFactor,$aRFactor=0.8) {
$this->iGuideVFactor=$aVFactor;
$this->iGuideLineRFactor=$aRFactor;
}
 
function SetColor($aColor) {
$this->color = $aColor;
}
 
function SetSliceColors($aColors) {
$this->setslicecolors = $aColors;
}
 
function SetShadow($aColor='darkgray',$aDropWidth=4) {
$this->ishadowcolor = $aColor;
$this->ishadowdrop = $aDropWidth;
}
 
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets=array_reverse($aTargets);
if( is_array($aWinTargets) )
$this->csimwintargets=array_reverse($aWinTargets);
if( is_array($aAlts) )
$this->csimalts=array_reverse($aAlts);
}
 
function GetCSIMareas() {
return $this->csimareas;
}
 
function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
//Slice number, ellipse centre (x,y), height, width, start angle, end angle
while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
 
$sa = 2*M_PI - $sa;
$ea = 2*M_PI - $ea;
 
// Special case when we have only one slice since then both start and end
// angle will be == 0
if( abs($sa - $ea) < 0.0001 ) {
$sa=2*M_PI; $ea=0;
}
 
//add coordinates of the centre to the map
$xc = floor($xc);$yc=floor($yc);
$coords = "$xc, $yc";
 
//add coordinates of the first point on the arc to the map
$xp = floor(($radius*cos($ea))+$xc);
$yp = floor($yc-$radius*sin($ea));
$coords.= ", $xp, $yp";
 
//add coordinates every 0.2 radians
$a=$ea+0.2;
 
// If we cross the 360-limit with a slice we need to handle
// the fact that end angle is smaller than start
if( $sa < $ea ) {
while ($a <= 2*M_PI) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.2;
}
$a -= 2*M_PI;
}
 
 
while ($a < $sa) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.2;
}
 
//Add the last point on the arc
$xp = floor($radius*cos($sa)+$xc);
$yp = floor($yc-$radius*sin($sa));
$coords.= ", $xp, $yp";
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtargets[$i]."\"";
$tmp="";
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
 
 
function SetTheme($aTheme) {
if( in_array($aTheme,array_keys($this->themearr)) )
$this->theme = $aTheme;
else
JpGraphError::RaiseL(15001,$aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme");
}
 
function ExplodeSlice($e,$radius=20) {
if( ! is_integer($e) )
JpGraphError::RaiseL(15002);//('Argument to PiePlot::ExplodeSlice() must be an integer');
$this->explode_radius[$e]=$radius;
}
 
function ExplodeAll($radius=20) {
$this->explode_all=true;
$this->explode_r = $radius;
}
 
function Explode($aExplodeArr) {
if( !is_array($aExplodeArr) ) {
JpGraphError::RaiseL(15003);
//("Argument to PiePlot::Explode() must be an array with integer distances.");
}
$this->explode_radius = $aExplodeArr;
}
 
function SetStartAngle($aStart) {
if( $aStart < 0 || $aStart > 360 ) {
JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.');
}
if( $aStart == 0 ) {
$this->startangle = 0;
}
else {
$this->startangle = 360-$aStart;
$this->startangle *= M_PI/180;
}
}
 
// Size in percentage
function SetSize($aSize) {
if( ($aSize>0 && $aSize<=0.5) || ($aSize>10 && $aSize<1000) )
$this->radius = $aSize;
else
JpGraphError::RaiseL(15006);
//("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]");
}
 
// Set label arrays
function SetLegends($aLegend) {
$this->legends = $aLegend;
}
 
// Set text labels for slices
function SetLabels($aLabels,$aLblPosAdj="auto") {
$this->labels = array_reverse($aLabels);
$this->ilabelposadj=$aLblPosAdj;
}
 
function SetLabelPos($aLblPosAdj) {
$this->ilabelposadj=$aLblPosAdj;
}
 
// Should we display actual value or percentage?
function SetLabelType($aType) {
if( $aType < 0 || $aType > 2 )
JpGraphError::RaiseL(15008,$aType);
//("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t).");
$this->labeltype = $aType;
}
 
// Deprecated.
function SetValueType($aType) {
$this->SetLabelType($aType);
}
 
// Should the circle around a pie plot be displayed
function ShowBorder($exterior=true,$interior=true) {
$this->pie_border = $exterior;
$this->pie_interior_border = $interior;
}
 
// Setup the legends
function Legend($graph) {
$colors = array_keys($graph->img->rgb->rgb_table);
sort($colors);
$ta=$this->themearr[$this->theme];
$n = count($this->data);
 
if( $this->setslicecolors==null ) {
$numcolors=count($ta);
if( class_exists('PiePlot3D',false) && ($this instanceof PiePlot3D) ) {
$ta = array_reverse(array_slice($ta,0,$n));
}
}
else {
$this->setslicecolors = array_slice($this->setslicecolors,0,$n);
$numcolors=count($this->setslicecolors);
if( $graph->pieaa && !($this instanceof PiePlot3D) ) {
$this->setslicecolors = array_reverse($this->setslicecolors);
}
}
 
$sum=0;
for($i=0; $i < $n; ++$i)
$sum += $this->data[$i];
 
// Bail out with error if the sum is 0
if( $sum==0 )
JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!");
 
// Make sure we don't plot more values than data points
// (in case the user added more legends than data points)
$n = min(count($this->legends),count($this->data));
if( $this->legends != "" ) {
$this->legends = array_reverse(array_slice($this->legends,0,$n));
}
for( $i=$n-1; $i >= 0; --$i ) {
$l = $this->legends[$i];
// Replace possible format with actual values
if( count($this->csimalts) > $i ) {
$fmt = $this->csimalts[$i];
}
else {
$fmt = "%d"; // Deafult Alt if no other has been specified
}
if( $this->labeltype==0 ) {
$l = sprintf($l,100*$this->data[$i]/$sum);
$alt = sprintf($fmt,$this->data[$i]);
 
}
elseif( $this->labeltype == 1) {
$l = sprintf($l,$this->data[$i]);
$alt = sprintf($fmt,$this->data[$i]);
 
}
else {
$l = sprintf($l,$this->adjusted_data[$i]);
$alt = sprintf($fmt,$this->adjusted_data[$i]);
}
 
if( empty($this->csimwintargets[$i]) ) {
$wintarg = '';
}
else {
$wintarg = $this->csimwintargets[$i];
}
 
if( $this->setslicecolors==null ) {
$graph->legend->Add($l,$colors[$ta[$i%$numcolors]],"",0,$this->csimtargets[$i],$alt,$wintarg);
}
else {
$graph->legend->Add($l,$this->setslicecolors[$i%$numcolors],"",0,$this->csimtargets[$i],$alt,$wintarg);
}
}
}
 
// Adjust the rounded percetage value so that the sum of
// of the pie slices are always 100%
// Using the Hare/Niemeyer method
function AdjPercentage($aData,$aPrec=0) {
$mul=100;
if( $aPrec > 0 && $aPrec < 3 ) {
if( $aPrec == 1 )
$mul=1000;
else
$mul=10000;
}
 
$tmp = array();
$result = array();
$quote_sum=0;
$n = count($aData) ;
for( $i=0, $sum=0; $i < $n; ++$i )
$sum+=$aData[$i];
foreach($aData as $index => $value) {
$tmp_percentage=$value/$sum*$mul;
$result[$index]=floor($tmp_percentage);
$tmp[$index]=$tmp_percentage-$result[$index];
$quote_sum+=$result[$index];
}
if( $quote_sum == $mul) {
if( $mul > 100 ) {
$tmp = $mul / 100;
for( $i=0; $i < $n; ++$i ) {
$result[$i] /= $tmp ;
}
}
return $result;
}
arsort($tmp,SORT_NUMERIC);
reset($tmp);
for($i=0; $i < $mul-$quote_sum; $i++)
{
$result[key($tmp)]++;
next($tmp);
}
if( $mul > 100 ) {
$tmp = $mul / 100;
for( $i=0; $i < $n; ++$i ) {
$result[$i] /= $tmp ;
}
}
return $result;
}
 
 
function Stroke($img,$aaoption=0) {
// aaoption is used to handle antialias
// aaoption == 0 a normal pie
// aaoption == 1 just the body
// aaoption == 2 just the values
 
// Explode scaling. If anti alias we scale the image
// twice and we also need to scale the exploding distance
$expscale = $aaoption === 1 ? 2 : 1;
 
if( $this->labeltype == 2 ) {
// Adjust the data so that it will add up to 100%
$this->adjusted_data = $this->AdjPercentage($this->data);
}
 
$colors = array_keys($img->rgb->rgb_table);
sort($colors);
$ta=$this->themearr[$this->theme];
$n = count($this->data);
 
if( $this->setslicecolors==null ) {
$numcolors=count($ta);
}
else {
// We need to create an array of colors as long as the data
// since we need to reverse it to get the colors in the right order
$numcolors=count($this->setslicecolors);
$i = 2*$numcolors;
while( $n > $i ) {
$this->setslicecolors = array_merge($this->setslicecolors,$this->setslicecolors);
$i += $n;
}
$tt = array_slice($this->setslicecolors,0,$n % $numcolors);
$this->setslicecolors = array_merge($this->setslicecolors,$tt);
$this->setslicecolors = array_reverse($this->setslicecolors);
}
 
// Draw the slices
$sum=0;
for($i=0; $i < $n; ++$i)
$sum += $this->data[$i];
 
// Bail out with error if the sum is 0
if( $sum==0 ) {
JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie.");
}
 
// Set up the pie-circle
if( $this->radius <= 1 ) {
$radius = floor($this->radius*min($img->width,$img->height));
}
else {
$radius = $aaoption === 1 ? $this->radius*2 : $this->radius;
}
 
if( $this->posx <= 1 && $this->posx > 0 ) {
$xc = round($this->posx*$img->width);
}
else {
$xc = $this->posx ;
}
 
if( $this->posy <= 1 && $this->posy > 0 ) {
$yc = round($this->posy*$img->height);
}
else {
$yc = $this->posy ;
}
 
$n = count($this->data);
 
if( $this->explode_all ) {
for($i=0; $i < $n; ++$i) {
$this->explode_radius[$i]=$this->explode_r;
}
}
 
// If we have a shadow and not just drawing the labels
if( $this->ishadowcolor != "" && $aaoption !== 2) {
$accsum=0;
$angle2 = $this->startangle;
$img->SetColor($this->ishadowcolor);
for($i=0; $sum > 0 && $i < $n; ++$i) {
$j = $n-$i-1;
$d = $this->data[$i];
$angle1 = $angle2;
$accsum += $d;
$angle2 = $this->startangle+2*M_PI*$accsum/$sum;
if( empty($this->explode_radius[$j]) ) {
$this->explode_radius[$j]=0;
}
 
if( $d < 0.00001 ) continue;
 
$la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
 
$xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale;
$ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale;
 
$xcm += $this->ishadowdrop*$expscale;
$ycm += $this->ishadowdrop*$expscale;
 
$_sa = round($angle1*180/M_PI);
$_ea = round($angle2*180/M_PI);
 
// The CakeSlice method draws a full circle in case of start angle = end angle
// for pie slices we don't want this behaviour unless we only have one
// slice in the pie in case it is the wanted behaviour
if( $_ea-$_sa > 0.1 || $n==1 ) {
$img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,
$angle1*180/M_PI,$angle2*180/M_PI,$this->ishadowcolor);
}
}
}
 
//--------------------------------------------------------------------------------
// This is the main loop to draw each cake slice
//--------------------------------------------------------------------------------
 
// Set up the accumulated sum, start angle for first slice and border color
$accsum=0;
$angle2 = $this->startangle;
$img->SetColor($this->color);
 
// Loop though all the slices if there is a pie to draw (sum>0)
// There are n slices in total
for($i=0; $sum>0 && $i < $n; ++$i) {
 
// $j is the actual index used for the slice
$j = $n-$i-1;
 
// Make sure we havea valid distance to explode the slice
if( empty($this->explode_radius[$j]) ) {
$this->explode_radius[$j]=0;
}
 
// The actual numeric value for the slice
$d = $this->data[$i];
 
$angle1 = $angle2;
 
// Accumlate the sum
$accsum += $d;
 
// The new angle when we add the "size" of this slice
// angle1 is then the start and angle2 the end of this slice
$angle2 = $this->NormAngle($this->startangle+2*M_PI*$accsum/$sum);
 
// We avoid some trouble by not allowing end angle to be 0, in that case
// we translate to 360
 
// la is used to hold the label angle, which is centered on the slice
if( $angle2 < 0.0001 && $angle1 > 0.0001 ) {
$this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1);
}
elseif( $angle1 > $angle2 ) {
// The case where the slice crosses the 3 a'clock line
// Remember that the slices are counted clockwise and
// labels are counted counter clockwise so we need to revert with 2 PI
$this->la[$i] = 2*M_PI-$this->NormAngle($angle1 + ((2*M_PI - $angle1)+$angle2)/2);
}
else {
$this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
}
 
// Too avoid rounding problems we skip the slice if it is too small
if( $d < 0.00001 ) continue;
 
// If the user has specified an array of colors for each slice then use
// that a color otherwise use the theme array (ta) of colors
if( $this->setslicecolors==null ) {
$slicecolor=$colors[$ta[$i%$numcolors]];
}
else {
$slicecolor=$this->setslicecolors[$i%$numcolors];
}
 
// $_sa = round($angle1*180/M_PI);
// $_ea = round($angle2*180/M_PI);
// $_la = round($this->la[$i]*180/M_PI);
// echo "Slice#$i: ang1=$_sa , ang2=$_ea, la=$_la, color=$slicecolor<br>";
 
 
// If we have enabled antialias then we don't draw any border so
// make the bordedr color the same as the slice color
if( $this->pie_interior_border && $aaoption===0 ) {
$img->SetColor($this->color);
}
else {
$img->SetColor($slicecolor);
}
$arccolor = $this->pie_border && $aaoption===0 ? $this->color : "";
 
// Calculate the x,y coordinates for the base of this slice taking
// the exploded distance into account. Here we use the mid angle as the
// ray of extension and we have the mid angle handy as it is also the
// label angle
$xcm = $xc + $this->explode_radius[$j]*cos($this->la[$i])*$expscale;
$ycm = $yc - $this->explode_radius[$j]*sin($this->la[$i])*$expscale;
 
// If we are not just drawing the labels then draw this cake slice
if( $aaoption !== 2 ) {
 
$_sa = round($angle1*180/M_PI);
$_ea = round($angle2*180/M_PI);
$_la = round($this->la[$i]*180/M_PI);
//echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)<br>";
 
// The CakeSlice method draws a full circle in case of start angle = end angle
// for pie slices we want this in case the slice have a value larger than 99% of the
// total sum
if( abs($_ea-$_sa) >= 1 || $d == $sum ) {
$img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,$_sa,$_ea,$slicecolor,$arccolor);
}
}
 
// If the CSIM is used then make sure we register a CSIM area for this slice as well
if( $this->csimtargets && $aaoption !== 1 ) {
$this->AddSliceToCSIM($i,$xcm,$ycm,$radius,$angle1,$angle2);
}
}
 
// Format the titles for each slice
if( $aaoption !== 2 ) {
for( $i=0; $i < $n; ++$i) {
if( $this->labeltype==0 ) {
if( $sum != 0 )
$l = 100.0*$this->data[$i]/$sum;
else
$l = 0.0;
}
elseif( $this->labeltype==1 ) {
$l = $this->data[$i]*1.0;
}
else {
$l = $this->adjusted_data[$i];
}
if( isset($this->labels[$i]) && is_string($this->labels[$i]) )
$this->labels[$i]=sprintf($this->labels[$i],$l);
else
$this->labels[$i]=$l;
}
}
 
if( $this->value->show && $aaoption !== 1 ) {
$this->StrokeAllLabels($img,$xc,$yc,$radius);
}
 
// Adjust title position
if( $aaoption !== 1 ) {
$this->title->SetPos($xc,
$yc-$this->title->GetFontHeight($img)-$radius-$this->title->margin,
"center","bottom");
$this->title->Stroke($img);
}
 
}
 
//---------------
// PRIVATE METHODS
 
function NormAngle($a) {
while( $a < 0 ) $a += 2*M_PI;
while( $a > 2*M_PI ) $a -= 2*M_PI;
return $a;
}
 
function Quadrant($a) {
$a=$this->NormAngle($a);
if( $a > 0 && $a <= M_PI/2 )
return 0;
if( $a > M_PI/2 && $a <= M_PI )
return 1;
if( $a > M_PI && $a <= 1.5*M_PI )
return 2;
if( $a > 1.5*M_PI )
return 3;
}
 
function StrokeGuideLabels($img,$xc,$yc,$radius) {
$n = count($this->labels);
 
//-----------------------------------------------------------------------
// Step 1 of the algorithm is to construct a number of clusters
// a cluster is defined as all slices within the same quadrant (almost)
// that has an angular distance less than the treshold
//-----------------------------------------------------------------------
$tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster
$incluster=false; // flag if we are currently in a cluster or not
$clusters = array(); // array of clusters
$cidx=-1; // running cluster index
 
// Go through all the labels and construct a number of clusters
for($i=0; $i < $n-1; ++$i) {
// Calc the angle distance between two consecutive slices
$a1=$this->la[$i];
$a2=$this->la[$i+1];
$q1 = $this->Quadrant($a1);
$q2 = $this->Quadrant($a2);
$diff = abs($a1-$a2);
if( $diff < $tresh_hold ) {
if( $incluster ) {
$clusters[$cidx][1]++;
// Each cluster can only cover one quadrant
// Do we cross a quadrant ( and must break the cluster)
if( $q1 != $q2 ) {
// If we cross a quadrant boundary we normally start a
// new cluster. However we need to take the 12'a clock
// and 6'a clock positions into a special consideration.
// Case 1: WE go from q=1 to q=2 if the last slice on
// the cluster for q=1 is close to 12'a clock and the
// first slice in q=0 is small we extend the previous
// cluster
if( $q1 == 1 && $q2 == 0 && $a2 > (90-15)*M_PI/180 ) {
if( $i < $n-2 ) {
$a3 = $this->la[$i+2];
// If there isn't a cluster coming up with the next-next slice
// we extend the previous cluster to cover this slice as well
if( abs($a3-$a2) >= $tresh_hold ) {
$clusters[$cidx][1]++;
$i++;
}
}
}
elseif( $q1 == 3 && $q2 == 2 && $a2 > (270-15)*M_PI/180 ) {
if( $i < $n-2 ) {
$a3 = $this->la[$i+2];
// If there isn't a cluster coming up with the next-next slice
// we extend the previous cluster to cover this slice as well
if( abs($a3-$a2) >= $tresh_hold ) {
$clusters[$cidx][1]++;
$i++;
}
}
}
 
if( $q1==2 && $q2==1 && $a2 > (180-15)*M_PI/180 ) {
$clusters[$cidx][1]++;
$i++;
}
 
$incluster = false;
}
}
elseif( $q1 == $q2) {
$incluster = true;
// Now we have a special case for quadrant 0. If we previously
// have a cluster of one in quadrant 0 we just extend that
// cluster. If we don't do this then we risk that the label
// for the cluster of one will cross the guide-line
if( $q1 == 0 && $cidx > -1 &&
$clusters[$cidx][1] == 1 &&
$this->Quadrant($this->la[$clusters[$cidx][0]]) == 0 ) {
$clusters[$cidx][1]++;
}
else {
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
else {
// Create a "cluster" of one since we are just crossing
// a quadrant
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
else {
if( $incluster ) {
// Add the last slice
$clusters[$cidx][1]++;
$incluster = false;
}
else { // Create a "cluster" of one
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
}
// Handle the very last slice
if( $incluster ) {
$clusters[$cidx][1]++;
}
else { // Create a "cluster" of one
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
 
/*
if( true ) {
// Debug printout in labels
for( $i=0; $i <= $cidx; ++$i ) {
for( $j=0; $j < $clusters[$i][1]; ++$j ) {
$a = $this->la[$clusters[$i][0]+$j];
$aa = round($a*180/M_PI);
$q = $this->Quadrant($a);
$this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j";
}
}
}
*/
 
//-----------------------------------------------------------------------
// Step 2 of the algorithm is use the clusters and draw the labels
// and guidelines
//-----------------------------------------------------------------------
 
// We use the font height as the base factor for how far we need to
// spread the labels in the Y-direction.
$this->value->ApplyFont($img);
$fh = $img->GetFontHeight();
$origvstep=$fh*$this->iGuideVFactor;
$this->value->SetMargin(0);
 
// Number of clusters found
$nc = count($clusters);
 
// Walk through all the clusters
for($i=0; $i < $nc; ++$i) {
 
// Start angle and number of slices in this cluster
$csize = $clusters[$i][1];
$a = $this->la[$clusters[$i][0]];
$q = $this->Quadrant($a);
 
// Now set up the start and end conditions to make sure that
// in each cluster we walk through the all the slices starting with the slice
// closest to the equator. Since all slices are numbered clockwise from "3'a clock"
// we have different conditions depending on in which quadrant the slice lies within.
if( $q == 0 ) {
$start = $csize-1; $idx = $start; $step = -1; $vstep = -$origvstep;
}
elseif( $q == 1 ) {
$start = 0; $idx = $start; $step = 1; $vstep = -$origvstep;
}
elseif( $q == 2 ) {
$start = $csize-1; $idx = $start; $step = -1; $vstep = $origvstep;
}
elseif( $q == 3 ) {
$start = 0; $idx = $start; $step = 1; $vstep = $origvstep;
}
 
// Walk through all slices within this cluster
for($j=0; $j < $csize; ++$j) {
// Now adjust the position of the labels in each cluster starting
// with the slice that is closest to the equator of the pie
$a = $this->la[$clusters[$i][0]+$idx];
 
// Guide line start in the center of the arc of the slice
$r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
$x = round($r*cos($a)+$xc);
$y = round($yc-$r*sin($a));
 
// The distance from the arc depends on chosen font and the "R-Factor"
$r += $fh*$this->iGuideLineRFactor;
 
// Should the labels be placed curved along the pie or in straight columns
// outside the pie?
if( $this->iGuideLineCurve )
$xt=round($r*cos($a)+$xc);
 
// If this is the first slice in the cluster we need some first time
// proessing
if( $idx == $start ) {
if( ! $this->iGuideLineCurve )
$xt=round($r*cos($a)+$xc);
$yt=round($yc-$r*sin($a));
 
// Some special consideration in case this cluster starts
// in quadrant 1 or 3 very close to the "equator" (< 20 degrees)
// and the previous clusters last slice is within the tolerance.
// In that case we add a font height to this labels Y-position
// so it doesn't collide with
// the slice in the previous cluster
$prevcluster = ($i + ($nc-1) ) % $nc;
$previdx=$clusters[$prevcluster][0]+$clusters[$prevcluster][1]-1;
if( $q == 1 && $a > 160*M_PI/180 ) {
// Get the angle for the previous clusters last slice
$diff = abs($a-$this->la[$previdx]);
if( $diff < $tresh_hold ) {
$yt -= $fh;
}
}
elseif( $q == 3 && $a > 340*M_PI/180 ) {
// We need to subtract 360 to compare angle distance between
// q=0 and q=3
$diff = abs($a-$this->la[$previdx]-360*M_PI/180);
if( $diff < $tresh_hold ) {
$yt += $fh;
}
}
 
}
else {
// The step is at minimum $vstep but if the slices are relatively large
// we make sure that we add at least a step that corresponds to the vertical
// distance between the centers at the arc on the slice
$prev_a = $this->la[$clusters[$i][0]+($idx-$step)];
$dy = abs($radius*(sin($a)-sin($prev_a))*1.2);
if( $vstep > 0 )
$yt += max($vstep,$dy);
else
$yt += min($vstep,-$dy);
}
 
$label = $this->labels[$clusters[$i][0]+$idx];
 
if( $csize == 1 ) {
// A "meta" cluster with only one slice
$r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
$rr = $r+$img->GetFontHeight()/2;
$xt=round($rr*cos($a)+$xc);
$yt=round($yc-$rr*sin($a));
$this->StrokeLabel($label,$img,$xc,$yc,$a,$r);
if( $this->iShowGuideLineForSingle )
$this->guideline->Stroke($img,$x,$y,$xt,$yt);
}
else {
$this->guideline->Stroke($img,$x,$y,$xt,$yt);
if( $q==1 || $q==2 ) {
// Left side of Pie
$this->guideline->Stroke($img,$xt,$yt,$xt-$this->guidelinemargin,$yt);
$lbladj = -$this->guidelinemargin-5;
$this->value->halign = "right";
$this->value->valign = "center";
}
else {
// Right side of pie
$this->guideline->Stroke($img,$xt,$yt,$xt+$this->guidelinemargin,$yt);
$lbladj = $this->guidelinemargin+5;
$this->value->halign = "left";
$this->value->valign = "center";
}
$this->value->Stroke($img,$label,$xt+$lbladj,$yt);
}
 
// Udate idx to point to next slice in the cluster to process
$idx += $step;
}
}
}
 
function StrokeAllLabels($img,$xc,$yc,$radius) {
// First normalize all angles for labels
$n = count($this->la);
for($i=0; $i < $n; ++$i) {
$this->la[$i] = $this->NormAngle($this->la[$i]);
}
if( $this->guideline->iShow ) {
$this->StrokeGuideLabels($img,$xc,$yc,$radius);
}
else {
$n = count($this->labels);
for($i=0; $i < $n; ++$i) {
$this->StrokeLabel($this->labels[$i],$img,$xc,$yc,
$this->la[$i],
$radius + $this->explode_radius[$n-1-$i]);
}
}
}
 
// Position the labels of each slice
function StrokeLabel($label,$img,$xc,$yc,$a,$r) {
 
// Default value
if( $this->ilabelposadj === 'auto' )
$this->ilabelposadj = 0.65;
 
// We position the values diferently depending on if they are inside
// or outside the pie
if( $this->ilabelposadj < 1.0 ) {
 
$this->value->SetAlign('center','center');
$this->value->margin = 0;
 
$xt=round($this->ilabelposadj*$r*cos($a)+$xc);
$yt=round($yc-$this->ilabelposadj*$r*sin($a));
 
$this->value->Stroke($img,$label,$xt,$yt);
}
else {
 
$this->value->halign = "left";
$this->value->valign = "top";
$this->value->margin = 0;
 
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
$this->value->ApplyFont($img);
$h=$img->GetTextHeight($label);
// For numeric values the format of the display value
// must be taken into account
if( is_numeric($label) ) {
if( $label > 0 )
$w=$img->GetTextWidth(sprintf($this->value->format,$label));
else
$w=$img->GetTextWidth(sprintf($this->value->negformat,$label));
}
else
$w=$img->GetTextWidth($label);
 
if( $this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) {
$r *= $this->ilabelposadj;
}
 
$r += $img->GetFontHeight()/1.5;
 
$xt=round($r*cos($a)+$xc);
$yt=round($yc-$r*sin($a));
 
// Normalize angle
while( $a < 0 ) $a += 2*M_PI;
while( $a > 2*M_PI ) $a -= 2*M_PI;
 
if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0;
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1;
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI);
 
if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI;
if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI);
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI);
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0;
 
$this->value->Stroke($img,$label,$xt-$dx*$w,$yt-$dy*$h);
}
}
} // Class
 
 
//===================================================
// CLASS PiePlotC
// Description: Same as a normal pie plot but with a
// filled circle in the center
//===================================================
class PiePlotC extends PiePlot {
private $imidsize=0.5; // Fraction of total width
private $imidcolor='white';
public $midtitle='';
private $middlecsimtarget='',$middlecsimwintarget='',$middlecsimalt='';
 
function __construct($data,$aCenterTitle='') {
parent::__construct($data);
$this->midtitle = new Text();
$this->midtitle->ParagraphAlign('center');
}
 
function SetMid($aTitle,$aColor='white',$aSize=0.5) {
$this->midtitle->Set($aTitle);
 
$this->imidsize = $aSize ;
$this->imidcolor = $aColor ;
}
 
function SetMidTitle($aTitle) {
$this->midtitle->Set($aTitle);
}
 
function SetMidSize($aSize) {
$this->imidsize = $aSize ;
}
 
function SetMidColor($aColor) {
$this->imidcolor = $aColor ;
}
 
function SetMidCSIM($aTarget,$aAlt='',$aWinTarget='') {
$this->middlecsimtarget = $aTarget;
$this->middlecsimwintarget = $aWinTarget;
$this->middlecsimalt = $aAlt;
}
 
function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
//Slice number, ellipse centre (x,y), radius, start angle, end angle
while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
 
$sa = 2*M_PI - $sa;
$ea = 2*M_PI - $ea;
 
// Special case when we have only one slice since then both start and end
// angle will be == 0
if( abs($sa - $ea) < 0.0001 ) {
$sa=2*M_PI; $ea=0;
}
 
// Add inner circle first point
$xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
$yp = floor($yc-($this->imidsize*$radius*sin($ea)));
$coords = "$xp, $yp";
 
//add coordinates every 0.25 radians
$a=$ea+0.25;
 
// If we cross the 360-limit with a slice we need to handle
// the fact that end angle is smaller than start
if( $sa < $ea ) {
while ($a <= 2*M_PI) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.25;
}
$a -= 2*M_PI;
}
 
while ($a < $sa) {
$xp = floor(($this->imidsize*$radius*cos($a)+$xc));
$yp = floor($yc-($this->imidsize*$radius*sin($a)));
$coords.= ", $xp, $yp";
$a += 0.25;
}
 
// Make sure we end at the last point
$xp = floor(($this->imidsize*$radius*cos($sa)+$xc));
$yp = floor($yc-($this->imidsize*$radius*sin($sa)));
$coords.= ", $xp, $yp";
 
// Straight line to outer circle
$xp = floor($radius*cos($sa)+$xc);
$yp = floor($yc-$radius*sin($sa));
$coords.= ", $xp, $yp";
 
//add coordinates every 0.25 radians
$a=$sa - 0.25;
while ($a > $ea) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a -= 0.25;
}
 
//Add the last point on the arc
$xp = floor($radius*cos($ea)+$xc);
$yp = floor($yc-$radius*sin($ea));
$coords.= ", $xp, $yp";
 
// Close the arc
$xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
$yp = floor($yc-($this->imidsize*$radius*sin($ea)));
$coords .= ", $xp, $yp";
 
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".
$this->csimtargets[$i]."\"";
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
 
 
function Stroke($img,$aaoption=0) {
 
// Stroke the pie but don't stroke values
$tmp = $this->value->show;
$this->value->show = false;
parent::Stroke($img,$aaoption);
$this->value->show = $tmp;
 
$xc = round($this->posx*$img->width);
$yc = round($this->posy*$img->height);
 
$radius = floor($this->radius * min($img->width,$img->height)) ;
 
 
if( $this->imidsize > 0 && $aaoption !== 2 ) {
 
if( $this->ishadowcolor != "" ) {
$img->SetColor($this->ishadowcolor);
$img->FilledCircle($xc+$this->ishadowdrop,$yc+$this->ishadowdrop,
round($radius*$this->imidsize));
}
 
$img->SetColor($this->imidcolor);
$img->FilledCircle($xc,$yc,round($radius*$this->imidsize));
 
if( $this->pie_border && $aaoption === 0 ) {
$img->SetColor($this->color);
$img->Circle($xc,$yc,round($radius*$this->imidsize));
}
 
if( !empty($this->middlecsimtarget) )
$this->AddMiddleCSIM($xc,$yc,round($radius*$this->imidsize));
 
}
 
if( $this->value->show && $aaoption !== 1) {
$this->StrokeAllLabels($img,$xc,$yc,$radius);
$this->midtitle->SetPos($xc,$yc,'center','center');
$this->midtitle->Stroke($img);
}
 
}
 
function AddMiddleCSIM($xc,$yc,$r) {
$xc=round($xc);$yc=round($yc);$r=round($r);
$this->csimareas .= "<area shape=\"circle\" coords=\"$xc,$yc,$r\" href=\"".
$this->middlecsimtarget."\"";
if( !empty($this->middlecsimwintarget) ) {
$this->csimareas .= " target=\"".$this->middlecsimwintarget."\"";
}
if( !empty($this->middlecsimalt) ) {
$tmp = $this->middlecsimalt;
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
 
function StrokeLabel($label,$img,$xc,$yc,$a,$r) {
 
if( $this->ilabelposadj === 'auto' )
$this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize;
 
parent::StrokeLabel($label,$img,$xc,$yc,$a,$r);
 
}
 
}
 
 
//===================================================
// CLASS PieGraph
// Description:
//===================================================
class PieGraph extends Graph {
private $posx, $posy, $radius;
private $legends=array();
public $plots=array();
public $pieaa = false ;
//---------------
// CONSTRUCTOR
function __construct($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) {
parent::__construct($width,$height,$cachedName,$timeout,$inline);
$this->posx=$width/2;
$this->posy=$height/2;
$this->SetColor(array(255,255,255));
}
 
//---------------
// PUBLIC METHODS
function Add($aObj) {
 
if( is_array($aObj) && count($aObj) > 0 )
$cl = $aObj[0];
else
$cl = $aObj;
 
if( $cl instanceof Text )
$this->AddText($aObj);
elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) )
$this->AddIcon($aObj);
else {
if( is_array($aObj) ) {
$n = count($aObj);
for($i=0; $i < $n; ++$i ) {
$this->plots[] = $aObj[$i];
}
}
else {
$this->plots[] = $aObj;
}
}
}
 
function SetAntiAliasing($aFlg=true) {
$this->pieaa = $aFlg;
}
 
function SetColor($c) {
$this->SetMarginColor($c);
}
 
 
function DisplayCSIMAreas() {
$csim="";
foreach($this->plots as $p ) {
$csim .= $p->GetCSIMareas();
}
$csim.= $this->legend->GetCSIMareas();
if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) {
$this->img->SetColor($this->csimcolor);
$n = count($coords[0]);
for ($i=0; $i < $n; $i++) {
if ($coords[1][$i]=="poly") {
preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts);
$this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]);
$m = count($pts[0]);
for ($j=0; $j < $m; $j++) {
$this->img->LineTo($pts[1][$j],$pts[2][$j]);
}
} else if ($coords[1][$i]=="rect") {
$pts = preg_split('/,/', $coords[2][$i]);
$this->img->SetStartPoint($pts[0],$pts[1]);
$this->img->LineTo($pts[2],$pts[1]);
$this->img->LineTo($pts[2],$pts[3]);
$this->img->LineTo($pts[0],$pts[3]);
$this->img->LineTo($pts[0],$pts[1]);
 
}
}
}
}
 
// Method description
function Stroke($aStrokeFileName="") {
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// If we are called the second time (perhaps the user has called GetHTMLImageMap()
// himself then the legends have alsready been populated once in order to get the
// CSIM coordinats. Since we do not want the legends to be populated a second time
// we clear the legends
$this->legend->Clear();
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
$n = count($this->plots);
 
if( $this->pieaa ) {
 
if( !$_csim ) {
if( $this->background_image != "" ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
$this->StrokeBackgroundGrad();
}
}
 
 
$w = $this->img->width;
$h = $this->img->height;
$oldimg = $this->img->img;
 
$this->img->CreateImgCanvas(2*$w,2*$h);
 
$this->img->SetColor( $this->margin_color );
$this->img->FilledRectangle(0,0,2*$w-1,2*$h-1);
 
// Make all icons *2 i size since we will be scaling down the
// imahe to do the anti aliasing
$ni = count($this->iIcons);
for($i=0; $i < $ni; ++$i) {
$this->iIcons[$i]->iScale *= 2 ;
if( $this->iIcons[$i]->iX > 1 )
$this->iIcons[$i]->iX *= 2 ;
if( $this->iIcons[$i]->iY > 1 )
$this->iIcons[$i]->iY *= 2 ;
}
 
$this->StrokeIcons();
 
for($i=0; $i < $n; ++$i) {
if( $this->plots[$i]->posx > 1 )
$this->plots[$i]->posx *= 2 ;
if( $this->plots[$i]->posy > 1 )
$this->plots[$i]->posy *= 2 ;
 
$this->plots[$i]->Stroke($this->img,1);
 
if( $this->plots[$i]->posx > 1 )
$this->plots[$i]->posx /= 2 ;
if( $this->plots[$i]->posy > 1 )
$this->plots[$i]->posy /= 2 ;
}
 
$indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0 )) : 0 ;
$indent += $this->framebevel ? $this->framebeveldepth + 1 : 0 ;
$this->img->CopyCanvasH($oldimg,$this->img->img,$indent,$indent,$indent,$indent,
$w-2*$indent,$h-2*$indent,2*($w-$indent),2*($h-$indent));
 
$this->img->img = $oldimg ;
$this->img->width = $w ;
$this->img->height = $h ;
 
for($i=0; $i < $n; ++$i) {
$this->plots[$i]->Stroke($this->img,2); // Stroke labels
$this->plots[$i]->Legend($this);
}
 
}
else {
 
if( !$_csim ) {
if( $this->background_image != "" ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
$this->StrokeBackgroundGrad();
}
}
 
$this->StrokeIcons();
 
for($i=0; $i < $n; ++$i) {
$this->plots[$i]->Stroke($this->img);
$this->plots[$i]->Legend($this);
}
}
 
$this->legend->Stroke($this->img);
$this->footer->Stroke($this->img);
$this->StrokeTitles();
 
if( !$_csim ) {
 
// Stroke texts
if( $this->texts != null ) {
$n = count($this->texts);
for($i=0; $i < $n; ++$i ) {
$this->texts[$i]->Stroke($this->img);
}
}
 
if( _JPG_DEBUG ) {
$this->DisplayCSIMAreas();
}
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans',false) ) {
require_once('jpgraph_imgtrans.php');
//JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.');
}
 
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
}
} // Class
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_polar.php
New file
0,0 → 1,897
<?php
/*=======================================================================
// File: JPGRAPH_POLAR.PHP
// Description: Polar plot extension for JpGraph
// Created: 2003-02-02
// Ver: $Id: jpgraph_polar.php 1796 2009-09-07 09:37:19Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once ('jpgraph_plotmark.inc.php');
require_once "jpgraph_log.php";
 
 
define('POLAR_360',1);
define('POLAR_180',2);
 
//
// Note. Don't attempt to make sense of this code.
// In order not to have to be able to inherit the scaling code
// from the main graph package we have had to make some "tricks" since
// the original scaling and axis was not designed to do what is
// required here.
// There were two option. 1: Re-implement everything and get a clean design
// and 2: do some "small" trickery and be able to inherit most of
// the functionlity from the main graph package.
// We choose 2: here in order to save some time.
//
 
//--------------------------------------------------------------------------
// class PolarPlot
//--------------------------------------------------------------------------
class PolarPlot {
public $line_style='solid',$mark;
public $legendcsimtarget='';
public $legendcsimalt='';
public $legend="";
public $csimtargets=array(); // Array of targets for CSIM
public $csimareas=""; // Resultant CSIM area tags
public $csimalts=null; // ALT:s for corresponding target
public $scale=null;
private $numpoints=0;
private $iColor='navy',$iFillColor='';
private $iLineWeight=1;
private $coord=null;
 
function __construct($aData) {
$n = count($aData);
if( $n & 1 ) {
JpGraphError::RaiseL(17001);
//('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).');
}
$this->numpoints = $n/2;
$this->coord = $aData;
$this->mark = new PlotMark();
}
 
function SetWeight($aWeight) {
$this->iLineWeight = $aWeight;
}
 
function SetColor($aColor){
$this->iColor = $aColor;
}
 
function SetFillColor($aColor){
$this->iFillColor = $aColor;
}
 
function Max() {
$m = $this->coord[1];
$i=1;
while( $i < $this->numpoints ) {
$m = max($m,$this->coord[2*$i+1]);
++$i;
}
return $m;
}
// Set href targets for CSIM
function SetCSIMTargets($aTargets,$aAlts=null) {
$this->csimtargets=$aTargets;
$this->csimalts=$aAlts;
}
 
// Get all created areas
function GetCSIMareas() {
return $this->csimareas;
}
 
function SetLegend($aLegend,$aCSIM="",$aCSIMAlt="") {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimalt = $aCSIMAlt;
}
 
// Private methods
 
function Legend($aGraph) {
$color = $this->iColor ;
if( $this->legend != "" ) {
if( $this->iFillColor!='' ) {
$color = $this->iFillColor;
$aGraph->legend->Add($this->legend,$color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt);
}
else {
$aGraph->legend->Add($this->legend,$color,$this->mark,$this->line_style,
$this->legendcsimtarget,$this->legendcsimalt);
}
}
}
 
function Stroke($img,$scale) {
 
$i=0;
$p=array();
$this->csimareas='';
while($i < $this->numpoints) {
list($x1,$y1) = $scale->PTranslate($this->coord[2*$i],$this->coord[2*$i+1]);
$p[2*$i] = $x1;
$p[2*$i+1] = $y1;
 
if( isset($this->csimtargets[$i]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$i]);
$this->mark->SetCSIMAlt($this->csimalts[$i]);
$this->mark->SetCSIMAltVal($this->coord[2*$i], $this->coord[2*$i+1]);
$this->mark->Stroke($img,$x1,$y1);
$this->csimareas .= $this->mark->GetCSIMAreas();
}
else {
$this->mark->Stroke($img,$x1,$y1);
}
 
++$i;
}
 
if( $this->iFillColor != '' ) {
$img->SetColor($this->iFillColor);
$img->FilledPolygon($p);
}
$img->SetLineWeight($this->iLineWeight);
$img->SetColor($this->iColor);
$img->Polygon($p,$this->iFillColor!='');
}
}
 
//--------------------------------------------------------------------------
// class PolarAxis
//--------------------------------------------------------------------------
class PolarAxis extends Axis {
private $angle_step=15,$angle_color='lightgray',$angle_label_color='black';
private $angle_fontfam=FF_FONT1,$angle_fontstyle=FS_NORMAL,$angle_fontsize=10;
private $angle_fontcolor = 'navy';
private $gridminor_color='lightgray',$gridmajor_color='lightgray';
private $show_minor_grid = false, $show_major_grid = true ;
private $show_angle_mark=true, $show_angle_grid=true, $show_angle_label=true;
private $angle_tick_len=3, $angle_tick_len2=3, $angle_tick_color='black';
private $show_angle_tick=true;
private $radius_tick_color='black';
 
function __construct($img,$aScale) {
parent::__construct($img,$aScale);
}
 
function ShowAngleDegreeMark($aFlg=true) {
$this->show_angle_mark = $aFlg;
}
 
function SetAngleStep($aStep) {
$this->angle_step=$aStep;
}
 
function HideTicks($aFlg=true,$aAngleFlg=true) {
parent::HideTicks($aFlg,$aFlg);
$this->show_angle_tick = !$aAngleFlg;
}
 
function ShowAngleLabel($aFlg=true) {
$this->show_angle_label = $aFlg;
}
 
function ShowGrid($aMajor=true,$aMinor=false,$aAngle=true) {
$this->show_minor_grid = $aMinor;
$this->show_major_grid = $aMajor;
$this->show_angle_grid = $aAngle ;
}
 
function SetAngleFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=10) {
$this->angle_fontfam = $aFontFam;
$this->angle_fontstyle = $aFontStyle;
$this->angle_fontsize = $aFontSize;
}
 
function SetColor($aColor,$aRadColor='',$aAngleColor='') {
if( $aAngleColor == '' )
$aAngleColor=$aColor;
parent::SetColor($aColor,$aRadColor);
$this->angle_fontcolor = $aAngleColor;
}
 
function SetGridColor($aMajorColor,$aMinorColor='',$aAngleColor='') {
if( $aMinorColor == '' )
$aMinorColor = $aMajorColor;
if( $aAngleColor == '' )
$aAngleColor = $aMajorColor;
 
$this->gridminor_color = $aMinorColor;
$this->gridmajor_color = $aMajorColor;
$this->angle_color = $aAngleColor;
}
 
function SetTickColors($aRadColor,$aAngleColor='') {
$this->radius_tick_color = $aRadColor;
$this->angle_tick_color = $aAngleColor;
}
 
// Private methods
function StrokeGrid($pos) {
$x = round($this->img->left_margin + $this->img->plotwidth/2);
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
 
// Stroke the minor arcs
$pmin = array();
$p = $this->scale->ticks->ticks_pos;
$n = count($p);
$i = 0;
$this->img->SetColor($this->gridminor_color);
while( $i < $n ) {
$r = $p[$i]-$x+1;
$pmin[]=$r;
if( $this->show_minor_grid ) {
$this->img->Circle($x,$pos,$r);
}
$i++;
}
 
$limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ;
while( $r < $limit ) {
$off = $r;
$i=1;
$r = $off + round($p[$i]-$x+1);
while( $r < $limit && $i < $n ) {
$r = $off+$p[$i]-$x;
$pmin[]=$r;
if( $this->show_minor_grid ) {
$this->img->Circle($x,$pos,$r);
}
$i++;
}
}
 
// Stroke the major arcs
if( $this->show_major_grid ) {
// First determine how many minor step on
// every major step. We have recorded the minor radius
// in pmin and use these values. This is done in order
// to avoid rounding errors if we were to recalculate the
// different major radius.
$pmaj = $this->scale->ticks->maj_ticks_pos;
$p = $this->scale->ticks->ticks_pos;
if( $this->scale->name == 'lin' ) {
$step=round(($pmaj[1] - $pmaj[0])/($p[1] - $p[0]));
}
else {
$step=9;
}
$n = round(count($pmin)/$step);
$i = 0;
$this->img->SetColor($this->gridmajor_color);
$limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ;
$off = $r;
$i=0;
$r = $pmin[$i*$step];
while( $r < $limit && $i < $n ) {
$r = $pmin[$i*$step];
$this->img->Circle($x,$pos,$r);
$i++;
}
}
 
// Draw angles
if( $this->show_angle_grid ) {
$this->img->SetColor($this->angle_color);
$d = max($this->img->plotheight,$this->img->plotwidth)*1.4 ;
$a = 0;
$p = $this->scale->ticks->ticks_pos;
$start_radius = $p[1]-$x;
while( $a < 360 ) {
if( $a == 90 || $a == 270 ) {
// Make sure there are no rounding problem with
// exactly vertical lines
$this->img->Line($x+$start_radius*cos($a/180*M_PI)+1,
$pos-$start_radius*sin($a/180*M_PI),
$x+$start_radius*cos($a/180*M_PI)+1,
$pos-$d*sin($a/180*M_PI));
 
}
else {
$this->img->Line($x+$start_radius*cos($a/180*M_PI)+1,
$pos-$start_radius*sin($a/180*M_PI),
$x+$d*cos($a/180*M_PI),
$pos-$d*sin($a/180*M_PI));
}
$a += $this->angle_step;
}
}
}
 
function StrokeAngleLabels($pos,$type) {
 
if( !$this->show_angle_label )
return;
 
$x0 = round($this->img->left_margin+$this->img->plotwidth/2)+1;
 
$d = max($this->img->plotwidth,$this->img->plotheight)*1.42;
$a = $this->angle_step;
$t = new Text();
$t->SetColor($this->angle_fontcolor);
$t->SetFont($this->angle_fontfam,$this->angle_fontstyle,$this->angle_fontsize);
$xright = $this->img->width - $this->img->right_margin;
$ytop = $this->img->top_margin;
$xleft = $this->img->left_margin;
$ybottom = $this->img->height - $this->img->bottom_margin;
$ha = 'left';
$va = 'center';
$w = $this->img->plotwidth/2;
$h = $this->img->plotheight/2;
$xt = $x0; $yt = $pos;
$margin=5;
 
$tl = $this->angle_tick_len ; // Outer len
$tl2 = $this->angle_tick_len2 ; // Interior len
 
$this->img->SetColor($this->angle_tick_color);
$rot90 = $this->img->a == 90 ;
 
if( $type == POLAR_360 ) {
 
// Corner angles of the four corners
$ca1 = atan($h/$w)/M_PI*180;
$ca2 = 180-$ca1;
$ca3 = $ca1+180;
$ca4 = 360-$ca1;
$end = 360;
 
while( $a < $end ) {
$ca = cos($a/180*M_PI);
$sa = sin($a/180*M_PI);
$x = $d*$ca;
$y = $d*$sa;
$xt=1000;$yt=1000;
if( $a <= $ca1 || $a >= $ca4 ) {
$yt = $pos - $w * $y/$x;
$xt = $xright + $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'top';
}
else {
$ha = 'left';
$va = 'center';
}
$x1=$xright-$tl2; $x2=$xright+$tl;
$y1=$y2=$yt;
}
elseif( $a > $ca1 && $a < $ca2 ) {
$xt = $x0 + $h * $x/$y;
$yt = $ytop - $margin;
if( $rot90 ) {
$ha = 'left';
$va = 'center';
}
else {
$ha = 'center';
$va = 'bottom';
}
$y1=$ytop+$tl2;$y2=$ytop-$tl;
$x1=$x2=$xt;
}
elseif( $a >= $ca2 && $a <= $ca3 ) {
$yt = $pos + $w * $y/$x;
$xt = $xleft - $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'bottom';
}
else {
$ha = 'right';
$va = 'center';
}
$x1=$xleft+$tl2;$x2=$xleft-$tl;
$y1=$y2=$yt;
}
else {
$xt = $x0 - $h * $x/$y;
$yt = $ybottom + $margin;
if( $rot90 ) {
$ha = 'right';
$va = 'center';
}
else {
$ha = 'center';
$va = 'top';
}
$y1=$ybottom-$tl2;$y2=$ybottom+$tl;
$x1=$x2=$xt;
}
if( $a != 0 && $a != 180 ) {
$t->Align($ha,$va);
if( $this->scale->clockwise ) {
$t->Set(360-$a);
}
else {
$t->Set($a);
}
if( $this->show_angle_mark && $t->font_family > 4 ) {
$a .= SymChar::Get('degree');
}
$t->Stroke($this->img,$xt,$yt);
if( $this->show_angle_tick ) {
$this->img->Line($x1,$y1,$x2,$y2);
}
}
$a += $this->angle_step;
}
}
else {
// POLAR_HALF
$ca1 = atan($h/$w*2)/M_PI*180;
$ca2 = 180-$ca1;
$end = 180;
while( $a < $end ) {
$ca = cos($a/180*M_PI);
$sa = sin($a/180*M_PI);
$x = $d*$ca;
$y = $d*$sa;
if( $a <= $ca1 ) {
$yt = $pos - $w * $y/$x;
$xt = $xright + $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'top';
}
else {
$ha = 'left';
$va = 'center';
}
$x1=$xright-$tl2; $x2=$xright+$tl;
$y1=$y2=$yt;
}
elseif( $a > $ca1 && $a < $ca2 ) {
$xt = $x0 + 2*$h * $x/$y;
$yt = $ytop - $margin;
if( $rot90 ) {
$ha = 'left';
$va = 'center';
}
else {
$ha = 'center';
$va = 'bottom';
}
$y1=$ytop+$tl2;$y2=$ytop-$tl;
$x1=$x2=$xt;
}
elseif( $a >= $ca2 ) {
$yt = $pos + $w * $y/$x;
$xt = $xleft - $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'bottom';
}
else {
$ha = 'right';
$va = 'center';
}
$x1=$xleft+$tl2;$x2=$xleft-$tl;
$y1=$y2=$yt;
}
$t->Align($ha,$va);
if( $this->show_angle_mark && $t->font_family > 4 ) {
$a .= SymChar::Get('degree');
}
$t->Set($a);
$t->Stroke($this->img,$xt,$yt);
if( $this->show_angle_tick ) {
$this->img->Line($x1,$y1,$x2,$y2);
}
$a += $this->angle_step;
}
}
}
 
function Stroke($pos,$dummy=true) {
 
$this->img->SetLineWeight($this->weight);
$this->img->SetColor($this->color);
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
if( !$this->hide_line ) {
$this->img->FilledRectangle($this->img->left_margin,$pos,
$this->img->width-$this->img->right_margin,
$pos+$this->weight-1);
}
$y=$pos+$this->img->GetFontHeight()+$this->title_margin+$this->title->margin;
if( $this->title_adjust=="high" ) {
$this->title->SetPos($this->img->width-$this->img->right_margin,$y,"right","top");
}
elseif( $this->title_adjust=="middle" || $this->title_adjust=="center" ) {
$this->title->SetPos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin,
$y,"center","top");
}
elseif($this->title_adjust=="low") {
$this->title->SetPos($this->img->left_margin,$y,"left","top");
}
else {
JpGraphError::RaiseL(17002,$this->title_adjust);
//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')');
}
 
 
if (!$this->hide_labels) {
$this->StrokeLabels($pos,false);
}
$this->img->SetColor($this->radius_tick_color);
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
 
//
// Mirror the positions for the left side of the scale
//
$mid = 2*($this->img->left_margin+$this->img->plotwidth/2);
$n = count($this->scale->ticks->ticks_pos);
$i=0;
while( $i < $n ) {
$this->scale->ticks->ticks_pos[$i] =
$mid-$this->scale->ticks->ticks_pos[$i] ;
++$i;
}
 
$n = count($this->scale->ticks->maj_ticks_pos);
$i=0;
while( $i < $n ) {
$this->scale->ticks->maj_ticks_pos[$i] =
$mid-$this->scale->ticks->maj_ticks_pos[$i] ;
++$i;
}
 
$n = count($this->scale->ticks->maj_ticklabels_pos);
$i=1;
while( $i < $n ) {
$this->scale->ticks->maj_ticklabels_pos[$i] =
$mid-$this->scale->ticks->maj_ticklabels_pos[$i] ;
++$i;
}
 
// Draw the left side of the scale
$n = count($this->scale->ticks->ticks_pos);
$yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMinTickAbsSize();
 
 
// Minor ticks
if( ! $this->scale->ticks->supress_minor_tickmarks ) {
$i=1;
while( $i < $n/2 ) {
$x = round($this->scale->ticks->ticks_pos[$i]) ;
$this->img->Line($x,$pos,$x,$yu);
++$i;
}
}
 
$n = count($this->scale->ticks->maj_ticks_pos);
$yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMajTickAbsSize();
 
 
// Major ticks
if( ! $this->scale->ticks->supress_tickmarks ) {
$i=1;
while( $i < $n/2 ) {
$x = round($this->scale->ticks->maj_ticks_pos[$i]) ;
$this->img->Line($x,$pos,$x,$yu);
++$i;
}
}
if (!$this->hide_labels) {
$this->StrokeLabels($pos,false);
}
$this->title->Stroke($this->img);
}
}
 
class PolarScale extends LinearScale {
private $graph;
public $clockwise=false;
 
function __construct($aMax,$graph,$aClockwise) {
parent::__construct(0,$aMax,'x');
$this->graph = $graph;
$this->clockwise = $aClockwise;
}
 
function SetClockwise($aFlg) {
$this->clockwise = $aFlg;
}
 
function _Translate($v) {
return parent::Translate($v);
}
 
function PTranslate($aAngle,$aRad) {
 
$m = $this->scale[1];
$w = $this->graph->img->plotwidth/2;
$aRad = $aRad/$m*$w;
 
$a = $aAngle/180 * M_PI;
if( $this->clockwise ) {
$a = 2*M_PI-$a;
}
 
$x = cos($a) * $aRad;
$y = sin($a) * $aRad;
 
$x += $this->_Translate(0);
 
if( $this->graph->iType == POLAR_360 ) {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y;
}
else {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y;
}
return array($x,$y);
}
}
 
class PolarLogScale extends LogScale {
private $graph;
public $clockwise=false;
 
function __construct($aMax,$graph,$aClockwise=false) {
parent::__construct(0,$aMax,'x');
$this->graph = $graph;
$this->ticks->SetLabelLogType(LOGLABELS_MAGNITUDE);
$this->clockwise = $aClockwise;
 
}
 
function SetClockwise($aFlg) {
$this->clockwise = $aFlg;
}
 
function PTranslate($aAngle,$aRad) {
 
if( $aRad == 0 )
$aRad = 1;
$aRad = log10($aRad);
$m = $this->scale[1];
$w = $this->graph->img->plotwidth/2;
$aRad = $aRad/$m*$w;
 
$a = $aAngle/180 * M_PI;
if( $this->clockwise ) {
$a = 2*M_PI-$a;
}
 
$x = cos( $a ) * $aRad;
$y = sin( $a ) * $aRad;
 
$x += $w+$this->graph->img->left_margin;//$this->_Translate(0);
if( $this->graph->iType == POLAR_360 ) {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y;
}
else {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y;
}
return array($x,$y);
}
}
 
class PolarGraph extends Graph {
public $scale;
public $axis;
public $iType=POLAR_360;
private $iClockwise=false;
 
function __construct($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) {
parent::__construct($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline) ;
$this->SetDensity(TICKD_DENSE);
$this->SetBox();
$this->SetMarginColor('white');
}
 
function SetDensity($aDense) {
$this->SetTickDensity(TICKD_NORMAL,$aDense);
}
 
function SetClockwise($aFlg) {
$this->scale->SetClockwise($aFlg);
}
 
function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) {
$adj = ($this->img->height - $this->img->width)/2;
$this->SetAngle(90);
$lm2 = -$adj + ($lm-$rm+$tm+$bm)/2;
$rm2 = -$adj + (-$lm+$rm+$tm+$bm)/2;
$tm2 = $adj + ($tm-$bm+$lm+$rm)/2;
$bm2 = $adj + (-$tm+$bm+$lm+$rm)/2;
$this->SetMargin($lm2, $rm2, $tm2, $bm2);
$this->axis->SetLabelAlign('right','center');
}
 
function SetScale($aScale,$rmax=0,$dummy1=1,$dummy2=1,$dummy3=1) {
if( $aScale == 'lin' ) {
$this->scale = new PolarScale($rmax,$this,$this->iClockwise);
}
elseif( $aScale == 'log' ) {
$this->scale = new PolarLogScale($rmax,$this,$this->iClockwise);
}
else {
JpGraphError::RaiseL(17004);//('Unknown scale type for polar graph. Must be "lin" or "log"');
}
 
$this->axis = new PolarAxis($this->img,$this->scale);
$this->SetMargin(40,40,50,40);
}
 
function SetType($aType) {
$this->iType = $aType;
}
 
function SetPlotSize($w,$h) {
$this->SetMargin(($this->img->width-$w)/2,($this->img->width-$w)/2,
($this->img->height-$h)/2,($this->img->height-$h)/2);
}
 
// Private methods
function GetPlotsMax() {
$n = count($this->plots);
$m = $this->plots[0]->Max();
$i=1;
while($i < $n) {
$m = max($this->plots[$i]->Max(),$m);
++$i;
}
return $m;
}
 
function Stroke($aStrokeFileName="") {
 
// Start by adjusting the margin so that potential titles will fit.
$this->AdjustMarginsForTitles();
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
//Check if we should autoscale axis
if( !$this->scale->IsSpecified() && count($this->plots)>0 ) {
$max = $this->GetPlotsMax();
$t1 = $this->img->plotwidth;
$this->img->plotwidth /= 2;
$t2 = $this->img->left_margin;
$this->img->left_margin += $this->img->plotwidth+1;
$this->scale->AutoScale($this->img,0,$max,
$this->img->plotwidth/$this->xtick_factor/2);
$this->img->plotwidth = $t1;
$this->img->left_margin = $t2;
}
else {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
//$min = 0;
$max = $this->scale->scale[1];
$t1 = $this->img->plotwidth;
$this->img->plotwidth /= 2;
$t2 = $this->img->left_margin;
$this->img->left_margin += $this->img->plotwidth+1;
$this->scale->AutoScale($this->img,0,$max,
$this->img->plotwidth/$this->xtick_factor/2);
$this->img->plotwidth = $t1;
$this->img->left_margin = $t2;
}
 
if( $this->iType == POLAR_180 ) {
$pos = $this->img->height - $this->img->bottom_margin;
}
else {
$pos = $this->img->plotheight/2 + $this->img->top_margin;
}
 
if( !$_csim ) {
$this->StrokePlotArea();
}
 
$this->iDoClipping = true;
 
if( $this->iDoClipping ) {
$oldimage = $this->img->CloneCanvasH();
}
 
if( !$_csim ) {
$this->axis->StrokeGrid($pos);
}
 
// Stroke all plots for Y1 axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->scale);
}
 
 
if( $this->iDoClipping ) {
// Clipping only supports graphs at 0 and 90 degrees
if( $this->img->a == 0 ) {
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->left_margin,$this->img->top_margin,
$this->img->left_margin,$this->img->top_margin,
$this->img->plotwidth+1,$this->img->plotheight+1);
}
elseif( $this->img->a == 90 ) {
$adj1 = round(($this->img->height - $this->img->width)/2);
$adj2 = round(($this->img->width - $this->img->height)/2);
$lm = $this->img->left_margin;
$rm = $this->img->right_margin;
$tm = $this->img->top_margin;
$bm = $this->img->bottom_margin;
$this->img->CopyCanvasH($oldimage,$this->img->img,
$adj2 + round(($lm-$rm+$tm+$bm)/2),
$adj1 + round(($tm-$bm+$lm+$rm)/2),
$adj2 + round(($lm-$rm+$tm+$bm)/2),
$adj1 + round(($tm-$bm+$lm+$rm)/2),
$this->img->plotheight+1,
$this->img->plotwidth+1);
}
$this->img->Destroy();
$this->img->SetCanvasH($oldimage);
}
 
if( !$_csim ) {
$this->axis->Stroke($pos);
$this->axis->StrokeAngleLabels($pos,$this->iType);
}
 
if( !$_csim ) {
$this->StrokePlotBox();
$this->footer->Stroke($this->img);
 
// The titles and legends never gets rotated so make sure
// that the angle is 0 before stroking them
$aa = $this->img->SetAngle(0);
$this->StrokeTitles();
}
 
for($i=0; $i < count($this->plots) ; ++$i ) {
$this->plots[$i]->Legend($this);
}
 
$this->legend->Stroke($this->img);
 
if( !$_csim ) {
 
$this->StrokeTexts();
$this->img->SetAngle($aa);
 
// Draw an outline around the image map
if(_JPG_DEBUG)
$this->DisplayClientSideaImageMapAreas();
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
}
}
}
}
 
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_stars.inc.php
New file
0,0 → 1,144
<?php
//=======================================================================
// File: IMGDATA_STARS.INC
// Description: Base64 encoded images for stars
// Created: 2003-03-20
// Ver: $Id: imgdata_stars.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
class ImgData_Stars extends ImgData {
protected $name = 'Stars';
protected $an = array(MARK_IMG_STAR => 'imgdata');
 
protected $colors = array('bluegreen','lightblue','purple','blue','green','pink','red','yellow');
protected $index = array('bluegreen'=>3,'lightblue'=>4,'purple'=>1,
'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6);
protected $maxidx = 7 ;
protected $imgdata ;
 
function __construct() {
//==========================================================
// File: bstar_green_001.png
//==========================================================
$this->imgdata[0][0]= 329 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'.
'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'.
'/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'.
'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'.
'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'.
'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'.
'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'.
'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ;
//==========================================================
// File: bstar_blred.png
//==========================================================
$this->imgdata[1][0]= 325 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'.
'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'.
'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'.
'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_red_001.png
//==========================================================
$this->imgdata[2][0]= 325 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'.
'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'.
'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'.
'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blgr_001.png
//==========================================================
$this->imgdata[3][0]= 325 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'.
'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'.
'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'.
'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blgr_002.png
//==========================================================
$this->imgdata[4][0]= 325 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'.
'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'.
'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'.
'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blue_001.png
//==========================================================
$this->imgdata[5][0]= 325 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'.
'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'.
'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'.
'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_oy_007.png
//==========================================================
$this->imgdata[6][0]= 325 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'.
'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'.
'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'.
'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_lred.png
//==========================================================
$this->imgdata[7][0]= 325 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'.
'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'.
'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'.
'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_balls.inc.php
New file
0,0 → 1,1061
<?php
//=======================================================================
// File: IMGDATA_ROUNDBALLS.INC
// Description: Base64 encoded images for small round markers
// Created: 2003-03-20
// Ver: $Id: imgdata_balls.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Balls extends ImgData {
protected $name = 'Round Balls';
protected $an = array(MARK_IMG_LBALL => 'imgdata_large',
MARK_IMG_MBALL => 'imgdata_small',
MARK_IMG_SBALL => 'imgdata_xsmall',
MARK_IMG_BALL => 'imgdata_xsmall');
protected $colors,$index,$maxidx;
private $colors_1 = array('blue','lightblue','brown','darkgreen',
'green','purple','red','gray','yellow','silver','gray');
private $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7,
'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2);
private $maxidx_1 = 9 ;
 
private $colors_2 = array('blue','bluegreen','brown','cyan',
'darkgray','greengray','gray','green',
'greenblue','lightblue','lightred',
'purple','red','white','yellow');
 
private $index_2 = array('blue'=>9,'bluegreen'=>13,'brown'=>8,'cyan'=>12,
'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10,
'greenblue'=>3,'lightblue'=>1,'lightred'=>14,
'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4);
private $maxidx_2 = 14 ;
 
 
private $colors_3 = array('bluegreen','cyan','darkgray','greengray',
'gray','graypurple','green','greenblue','lightblue',
'lightred','navy','orange','purple','red','yellow');
 
private $index_3 = array('bluegreen'=>1,'cyan'=>11,'darkgray'=>14,'greengray'=>10,
'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7,
'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12,
'purple'=>8,'red'=>5,'yellow'=>6);
private $maxidx_3 = 14 ;
 
protected $imgdata_large, $imgdata_small, $imgdata_xsmall ;
 
 
function GetImg($aMark,$aIdx) {
switch( $aMark ) {
case MARK_IMG_SBALL:
case MARK_IMG_BALL:
$this->colors = $this->colors_3;
$this->index = $this->index_3 ;
$this->maxidx = $this->maxidx_3 ;
break;
case MARK_IMG_MBALL:
$this->colors = $this->colors_2;
$this->index = $this->index_2 ;
$this->maxidx = $this->maxidx_2 ;
break;
default:
$this->colors = $this->colors_1;
$this->index = $this->index_1 ;
$this->maxidx = $this->maxidx_1 ;
break;
}
return parent::GetImg($aMark,$aIdx);
}
 
function __construct() {
 
//==========================================================
// File: bl_red.png
//==========================================================
$this->imgdata_large[0][0]= 1072 ;
$this->imgdata_large[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'.
'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'.
'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'.
'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'.
'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'.
'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'.
'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'.
'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'.
'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'.
'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'.
'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'.
'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'.
'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'.
'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'.
'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'.
'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'.
'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'.
'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'.
'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'.
'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'.
'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'.
'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'.
'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'.
'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'.
'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'.
'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'.
'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'.
'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bl_bluegreen.png
//==========================================================
$this->imgdata_large[1][0]= 1368 ;
$this->imgdata_large[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'.
'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'.
'/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'.
'333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'.
'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'.
'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'.
'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'.
'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'.
'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'.
'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'.
'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'.
'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'.
'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'.
'+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'.
'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'.
'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'.
'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'.
'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'.
'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'.
'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'.
'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'.
'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'.
'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'.
'7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'.
'3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'.
'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'.
'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'.
'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'.
'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'.
'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'.
'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'.
'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'.
'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'.
'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'.
'0zz7G56hAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_yellow.png
//==========================================================
$this->imgdata_large[2][0]= 1101 ;
$this->imgdata_large[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'.
'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'.
'/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'.
'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'.
'7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'.
'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'.
'1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'.
'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'.
'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'.
'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'.
'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'.
'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'.
'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'.
'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'.
'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'.
'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'.
'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'.
'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'.
'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'.
'6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'.
'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'.
'24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'.
'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'.
'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'.
'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'.
'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'.
'+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'.
'SXAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_silver.png
//==========================================================
$this->imgdata_large[3][0]= 1481 ;
$this->imgdata_large[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'.
'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'.
'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'.
'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'.
'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'.
'/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'.
'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'.
'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'.
'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'.
'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'.
'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'.
'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'.
'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'.
'1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'.
'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'.
'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'.
'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'.
'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'.
'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'.
'3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'.
'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'.
'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'.
'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'.
'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'.
'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'.
'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'.
'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'.
'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'.
'8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'.
'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'.
'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'.
'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'.
'NlNT9CliMAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bl_purple.png
//==========================================================
$this->imgdata_large[4][0]= 1149 ;
$this->imgdata_large[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'.
'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'.
'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'.
'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'.
'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'.
'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'.
'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'.
'7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'.
'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'.
'29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'.
'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'.
'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'.
'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'.
'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'.
'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'.
'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'.
'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'.
'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'.
'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'.
'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'.
'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'.
'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'.
'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'.
'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'.
'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'.
'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'.
'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'.
'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'.
'+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'.
'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'.
'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_gray.png
//==========================================================
$this->imgdata_large[5][0]= 905 ;
$this->imgdata_large[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'.
'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'.
'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'.
'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'.
'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'.
'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'.
'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'.
'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'.
'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'.
'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'.
'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'.
'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'.
'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'.
'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'.
'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'.
'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'.
'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'.
'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'.
'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'.
'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'.
'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'.
'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'.
'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'.
'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'.
'RK5CYII=' ;
 
//==========================================================
// File: bl_brown.png
//==========================================================
$this->imgdata_large[6][0]= 1053 ;
$this->imgdata_large[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'.
'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'.
'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'.
'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'.
'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'.
'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'.
'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'.
'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'.
'1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'.
'3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'.
'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'.
'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'.
'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'.
'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'.
'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'.
'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'.
'1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'.
'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'.
'7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'.
'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'.
'8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'.
'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'.
'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'.
'8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'.
'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'.
'4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'.
'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'.
'QmCC' ;
 
//==========================================================
// File: bl_darkgreen.png
//==========================================================
$this->imgdata_large[7][0]= 1113 ;
$this->imgdata_large[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'.
'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'.
'/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'.
'2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'.
'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'.
'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'.
'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'.
'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'.
'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'.
'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'.
'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'.
'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'.
'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'.
'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'.
'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'.
'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'.
'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'.
'5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'.
'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'.
'3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'.
'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'.
'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'.
'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'.
'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'.
'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'.
'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'.
'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'.
'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_green.png
//==========================================================
$this->imgdata_large[8][0]= 1484 ;
$this->imgdata_large[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'.
'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'.
'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'.
'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'.
'5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'.
'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'.
'9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'.
'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'.
'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'.
'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'.
'+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'.
'0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'.
'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'.
'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'.
'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'.
'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'.
'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'.
'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'.
'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'.
'8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'.
'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'.
'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'.
'6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'.
'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'.
'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'.
'7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'.
'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'.
'7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'.
'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'.
'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'.
'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'.
'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'.
'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'.
'0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'.
'9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'.
'9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'.
'/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'.
'0fHxyiE8XMLl4AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bl_blue.png
//==========================================================
$this->imgdata_large[9][0]= 1169 ;
$this->imgdata_large[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'.
'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'.
'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'.
'+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'.
'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'.
'9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'.
'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'.
'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'.
'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'.
'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'.
'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'.
'8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'.
'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'.
'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'.
'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'.
'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'.
'/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'.
'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'.
'3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'.
'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'.
'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'.
'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'.
'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'.
'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'.
'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'.
'8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'.
'49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'.
'+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'.
'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'.
'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'.
'VORK5CYII=' ;
 
//==========================================================
// File: bs_red.png
//==========================================================
$this->imgdata_small[0][0]= 437 ;
$this->imgdata_small[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'.
'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'.
'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'.
'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'.
'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'.
'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'.
'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'.
'7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'.
'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'.
'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'.
'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ;
 
 
//==========================================================
// File: bs_lightblue.png
//==========================================================
$this->imgdata_small[1][0]= 657 ;
$this->imgdata_small[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'.
'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'.
'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'.
'+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'.
'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'.
'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'.
'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'.
'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'.
'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'.
'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'.
'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'.
'9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'.
'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'.
'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'.
'2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'.
'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'.
'qvIlIAMH7YAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_gray.png
//==========================================================
$this->imgdata_small[2][0]= 550 ;
$this->imgdata_small[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'.
'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'.
'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'.
'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'.
'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'.
'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'.
'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'.
'3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'.
'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'.
'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'.
'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'.
'2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'.
'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'.
'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'.
'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bs_greenblue.png
//==========================================================
$this->imgdata_small[3][0]= 503 ;
$this->imgdata_small[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'.
'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'.
'9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'.
'17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'.
'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'.
'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'.
'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'.
'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'.
'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'.
'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'.
'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'.
'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'.
'97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'.
'4/IOkAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bs_yellow.png
//==========================================================
$this->imgdata_small[4][0]= 507 ;
$this->imgdata_small[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'.
'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'.
'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'.
'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'.
'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'.
'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'.
'50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'.
'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'.
'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'.
'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'.
'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'.
'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'.
'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'.
'KgEq+FpPbfAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_darkgray.png
//==========================================================
$this->imgdata_small[5][0]= 611 ;
$this->imgdata_small[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'.
'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'.
'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'.
'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'.
'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'.
'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'.
'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'.
'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'.
'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'.
'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'.
'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'.
'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'.
'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'.
'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'.
'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'.
'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'.
'AAAASUVORK5CYII=' ;
 
 
//==========================================================
// File: bs_darkgreen.png
//==========================================================
$this->imgdata_small[6][0]= 666 ;
$this->imgdata_small[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'.
'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'.
'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'.
'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'.
'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'.
'6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'.
'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'.
'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'.
'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'.
'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'.
'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'.
'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'.
'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'.
'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'.
'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'.
'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_purple.png
//==========================================================
$this->imgdata_small[7][0]= 447 ;
$this->imgdata_small[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'.
'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'.
'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'.
'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'.
'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'.
'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'.
'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'.
'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'.
'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'.
'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'.
'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ;
 
 
//==========================================================
// File: bs_brown.png
//==========================================================
$this->imgdata_small[8][0]= 677 ;
$this->imgdata_small[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'.
'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'.
'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'.
'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'.
'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'.
'/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'.
'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'.
'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'.
'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'.
'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'.
'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'.
'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'.
'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'.
'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'.
'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'.
'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'.
'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'.
'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'.
'YII=' ;
 
//==========================================================
// File: bs_blue.png
//==========================================================
$this->imgdata_small[9][0]= 436 ;
$this->imgdata_small[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'.
'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'.
'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'.
'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'.
'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'.
'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'.
'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'.
'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'.
'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'.
'2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'.
't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bs_green.png
//==========================================================
$this->imgdata_small[10][0]= 452 ;
$this->imgdata_small[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'.
'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'.
'/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'.
'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'.
'5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'.
'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'.
'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'.
'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'.
'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'.
'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'.
'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'.
'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'.
'YII=' ;
 
 
//==========================================================
// File: bs_white.png
//==========================================================
$this->imgdata_small[11][0]= 480 ;
$this->imgdata_small[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'.
'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'.
'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'.
'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'.
'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'.
'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'.
'1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'.
'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'.
'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'.
'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'.
'2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ;
 
 
//==========================================================
// File: bs_cyan.png
//==========================================================
$this->imgdata_small[12][0]= 633 ;
$this->imgdata_small[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'.
'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'.
'//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'.
'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'.
'/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'.
'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'.
'3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'.
'4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'.
'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'.
'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'.
'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'.
'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'.
'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'.
'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'.
'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_bluegreen.png
//==========================================================
$this->imgdata_small[13][0]= 493 ;
$this->imgdata_small[13][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'.
'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'.
'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'.
'8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'.
'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'.
'0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'.
'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'.
'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'.
'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'.
'6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'.
'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'.
'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'.
'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'.
'5ErkJggg==' ;
 
//==========================================================
// File: bs_lightred.png
//==========================================================
$this->imgdata_small[14][0]= 532 ;
$this->imgdata_small[14][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'.
'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'.
'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'.
'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'.
'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'.
'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'.
'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'.
'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'.
'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'.
'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'.
'6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'.
'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'.
'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'.
'RU5ErkJggg==' ;
 
//==========================================================
// File: bxs_lightred.png
//==========================================================
$this->imgdata_xsmall[0][0]= 432 ;
$this->imgdata_xsmall[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'.
'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'.
'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'.
'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'.
'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'.
'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'.
'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'.
'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'.
'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'.
'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'.
'DaB7Du8MiEAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bxs_bluegreen.png
//==========================================================
$this->imgdata_xsmall[1][0]= 397 ;
$this->imgdata_xsmall[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'.
'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'.
'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'.
'8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'.
'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'.
'0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'.
'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'.
'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'.
'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'.
'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'.
'4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_navy.png
//==========================================================
$this->imgdata_xsmall[2][0]= 353 ;
$this->imgdata_xsmall[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'.
'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'.
'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'.
'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'.
'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'.
'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'.
'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'.
'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'.
's5S60AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_gray.png
//==========================================================
$this->imgdata_xsmall[3][0]= 492 ;
$this->imgdata_xsmall[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'.
'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'.
'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'.
'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'.
'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'.
'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'.
'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'.
'3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'.
'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'.
'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'.
'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'.
'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'.
'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'.
'SuQmCC' ;
 
//==========================================================
// File: bxs_graypurple.png
//==========================================================
$this->imgdata_xsmall[4][0]= 542 ;
$this->imgdata_xsmall[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'.
'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'.
'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'.
'2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'.
'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'.
'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'.
'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'.
'9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'.
'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'.
'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'.
'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'.
'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'.
'hkeRpo8AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_red.png
//==========================================================
$this->imgdata_xsmall[5][0]= 357 ;
$this->imgdata_xsmall[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'.
'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'.
'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'.
'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'.
'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'.
'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'.
'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'.
'0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'.
'yXBg73lwGUAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bxs_yellow.png
//==========================================================
$this->imgdata_xsmall[6][0]= 414 ;
$this->imgdata_xsmall[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'.
'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'.
'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'.
'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'.
'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'.
'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'.
'50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'.
'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'.
'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'.
'2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'.
'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'.
'CC' ;
 
//==========================================================
// File: bxs_greenblue.png
//==========================================================
$this->imgdata_xsmall[7][0]= 410 ;
$this->imgdata_xsmall[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'.
'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'.
'9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'.
'17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'.
'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'.
'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'.
'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'.
'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'.
'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'.
'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'.
'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_purple.png
//==========================================================
$this->imgdata_xsmall[8][0]= 364 ;
$this->imgdata_xsmall[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'.
'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'.
'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'.
'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'.
'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'.
'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'.
'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'.
'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'.
'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_green.png
//==========================================================
$this->imgdata_xsmall[9][0]= 370 ;
$this->imgdata_xsmall[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'.
'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'.
'/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'.
'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'.
'5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'.
'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'.
'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'.
'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'.
'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'.
'6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_darkgreen.png
//==========================================================
$this->imgdata_xsmall[10][0]= 563 ;
$this->imgdata_xsmall[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'.
'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'.
'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'.
'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'.
'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'.
'6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'.
'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'.
'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'.
'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'.
'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'.
'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'.
'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'.
'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'.
'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'.
'I=' ;
 
//==========================================================
// File: bxs_cyan.png
//==========================================================
$this->imgdata_xsmall[11][0]= 530 ;
$this->imgdata_xsmall[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'.
'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'.
'//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'.
'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'.
'/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'.
'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'.
'3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'.
'4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'.
'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'.
'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'.
'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'.
'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'.
'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'.
'RK5CYII=' ;
 
//==========================================================
// File: bxs_orange.png
//==========================================================
$this->imgdata_xsmall[12][0]= 572 ;
$this->imgdata_xsmall[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'.
'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'.
'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'.
'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'.
'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'.
'/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'.
'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'.
'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'.
'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'.
'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'.
'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'.
'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'.
'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'.
'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'.
'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'.
'AASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_lightblue.png
//==========================================================
$this->imgdata_xsmall[13][0]= 554 ;
$this->imgdata_xsmall[13][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'.
'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'.
'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'.
'+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'.
'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'.
'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'.
'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'.
'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'.
'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'.
'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'.
'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'.
'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'.
'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'.
'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_darkgray.png
//==========================================================
$this->imgdata_xsmall[14][0]= 574 ;
$this->imgdata_xsmall[14][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'.
'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'.
'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'.
'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'.
'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'.
'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'.
'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'.
'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'.
'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'.
'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'.
'8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'.
'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'.
'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'.
'5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'.
'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'.
'AAAABJRU5ErkJggg==' ;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_log.php
New file
0,0 → 1,305
<?php
/*=======================================================================
// File: JPGRAPH_LOG.PHP
// Description: Log scale plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_log.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
DEFINE('LOGLABELS_PLAIN',0);
DEFINE('LOGLABELS_MAGNITUDE',1);
 
//===================================================
// CLASS LogScale
// Description: Logarithmic scale between world and screen
//===================================================
class LogScale extends LinearScale {
//---------------
// CONSTRUCTOR
 
// Log scale is specified using the log of min and max
function __construct($min,$max,$type="y") {
parent::__construct($min,$max,$type);
$this->ticks = new LogTicks();
$this->name = 'log';
}
 
//----------------
// PUBLIC METHODS
 
// Translate between world and screen
function Translate($a) {
if( !is_numeric($a) ) {
if( $a != '' && $a != '-' && $a != 'x' ) {
JpGraphError::RaiseL(11001);
// ('Your data contains non-numeric values.');
}
return 1;
}
if( $a < 0 ) {
JpGraphError::RaiseL(11002);
//("Negative data values can not be used in a log scale.");
exit(1);
}
if( $a==0 ) $a=1;
$a=log10($a);
return ceil($this->off + ($a*1.0 - $this->scale[0]) * $this->scale_factor);
}
 
// Relative translate (don't include offset) usefull when we just want
// to know the relative position (in pixels) on the axis
function RelTranslate($a) {
if( !is_numeric($a) ) {
if( $a != '' && $a != '-' && $a != 'x' ) {
JpGraphError::RaiseL(11001);
//('Your data contains non-numeric values.');
}
return 1;
}
if( $a==0 ) {
$a=1;
}
$a=log10($a);
return round(($a*1.0 - $this->scale[0]) * $this->scale_factor);
}
 
// Use bcpow() for increased precision
function GetMinVal() {
if( function_exists("bcpow") ) {
return round(bcpow(10,$this->scale[0],15),14);
}
else {
return round(pow(10,$this->scale[0]),14);
}
}
 
function GetMaxVal() {
if( function_exists("bcpow") ) {
return round(bcpow(10,$this->scale[1],15),14);
}
else {
return round(pow(10,$this->scale[1]),14);
}
}
 
// Logarithmic autoscaling is much simplier since we just
// set the min and max to logs of the min and max values.
// Note that for log autoscale the "maxstep" the fourth argument
// isn't used. This is just included to give the method the same
// signature as the linear counterpart.
function AutoScale($img,$min,$max,$maxsteps,$majend=true) {
if( $min==0 ) $min=1;
 
if( $max <= 0 ) {
JpGraphError::RaiseL(11004);
//('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.');
}
if( is_numeric($this->autoscale_min) ) {
$smin = round($this->autoscale_min);
$smax = ceil(log10($max));
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
}
else {
$smin = floor(log10($min));
if( is_numeric($this->autoscale_max) ) {
$smax = round($this->autoscale_max);
if( $smin >= $smax ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
}
else
$smax = ceil(log10($max));
}
 
$this->Update($img,$smin,$smax);
}
//---------------
// PRIVATE METHODS
} // Class
 
//===================================================
// CLASS LogTicks
// Description:
//===================================================
class LogTicks extends Ticks{
private $label_logtype=LOGLABELS_MAGNITUDE;
private $ticklabels_pos = array();
//---------------
// CONSTRUCTOR
function LogTicks() {
}
//---------------
// PUBLIC METHODS
function IsSpecified() {
return true;
}
 
function SetLabelLogType($aType) {
$this->label_logtype = $aType;
}
 
// For log scale it's meaningless to speak about a major step
// We just return -1 to make the framework happy (specifically
// StrokeLabels() )
function GetMajor() {
return -1;
}
 
function SetTextLabelStart($aStart) {
JpGraphError::RaiseL(11005);
//('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.');
}
 
function SetXLabelOffset($dummy) {
// For log scales we dont care about XLabel offset
}
 
// Draw ticks on image "img" using scale "scale". The axis absolute
// position in the image is specified in pos, i.e. for an x-axis
// it specifies the absolute y-coord and for Y-ticks it specified the
// absolute x-position.
function Stroke($img,$scale,$pos) {
$start = $scale->GetMinVal();
$limit = $scale->GetMaxVal();
$nextMajor = 10*$start;
$step = $nextMajor / 10.0;
 
 
$img->SetLineWeight($this->weight);
 
if( $scale->type == "y" ) {
// member direction specified if the ticks should be on
// left or right side.
$a=$pos + $this->direction*$this->GetMinTickAbsSize();
$a2=$pos + $this->direction*$this->GetMajTickAbsSize();
$count=1;
$this->maj_ticks_pos[0]=$scale->Translate($start);
$this->maj_ticklabels_pos[0]=$scale->Translate($start);
if( $this->supress_first )
$this->maj_ticks_label[0]="";
else {
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[0]=call_user_func($f,$start);
}
elseif( $this->label_logtype == LOGLABELS_PLAIN ) {
$this->maj_ticks_label[0]=$start;
}
else {
$this->maj_ticks_label[0]='10^'.round(log10($start));
}
}
$i=1;
for($y=$start; $y<=$limit; $y+=$step,++$count ) {
$ys=$scale->Translate($y);
$this->ticks_pos[]=$ys;
$this->ticklabels_pos[]=$ys;
if( $count % 10 == 0 ) {
if( !$this->supress_tickmarks ) {
if( $this->majcolor!="" ) {
$img->PushColor($this->majcolor);
$img->Line($pos,$ys,$a2,$ys);
$img->PopColor();
}
else {
$img->Line($pos,$ys,$a2,$ys);
}
}
 
$this->maj_ticks_pos[$i]=$ys;
$this->maj_ticklabels_pos[$i]=$ys;
 
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[$i]=call_user_func($f,$nextMajor);
}
elseif( $this->label_logtype == 0 ) {
$this->maj_ticks_label[$i]=$nextMajor;
}
else {
$this->maj_ticks_label[$i]='10^'.round(log10($nextMajor));
}
++$i;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor!="" ) {
$img->PushColor($this->mincolor);
}
$img->Line($pos,$ys,$a,$ys);
if( $this->mincolor!="" ) {
$img->PopColor();
}
}
}
}
}
else {
$a=$pos - $this->direction*$this->GetMinTickAbsSize();
$a2=$pos - $this->direction*$this->GetMajTickAbsSize();
$count=1;
$this->maj_ticks_pos[0]=$scale->Translate($start);
$this->maj_ticklabels_pos[0]=$scale->Translate($start);
if( $this->supress_first ) {
$this->maj_ticks_label[0]="";
}
else {
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[0]=call_user_func($f,$start);
}
elseif( $this->label_logtype == 0 ) {
$this->maj_ticks_label[0]=$start;
}
else {
$this->maj_ticks_label[0]='10^'.round(log10($start));
}
}
$i=1;
for($x=$start; $x<=$limit; $x+=$step,++$count ) {
$xs=$scale->Translate($x);
$this->ticks_pos[]=$xs;
$this->ticklabels_pos[]=$xs;
if( $count % 10 == 0 ) {
if( !$this->supress_tickmarks ) {
$img->Line($xs,$pos,$xs,$a2);
}
$this->maj_ticks_pos[$i]=$xs;
$this->maj_ticklabels_pos[$i]=$xs;
 
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[$i]=call_user_func($f,$nextMajor);
}
elseif( $this->label_logtype == 0 ) {
$this->maj_ticks_label[$i]=$nextMajor;
}
else {
$this->maj_ticks_label[$i]='10^'.round(log10($nextMajor));
}
++$i;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
$img->Line($xs,$pos,$xs,$a);
}
}
}
}
return true;
}
} // Class
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_plotline.php
New file
0,0 → 1,138
<?php
/*=======================================================================
// File: JPGRAPH_PLOTLINE.PHP
// Description: PlotLine extension for JpGraph
// Created: 2009-03-24
// Ver: $Id: jpgraph_plotline.php 1881 2009-10-01 10:28:12Z ljp $
//
// CLASS PlotLine
// Data container class to hold properties for a static
// line that is drawn directly in the plot area.
// Useful to add static borders inside a plot to show for example set-values
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
class PlotLine {
public $scaleposition, $direction=-1;
protected $weight=1;
protected $color = 'black';
private $legend='',$hidelegend=false, $legendcsimtarget='', $legendcsimalt='',$legendcsimwintarget='';
private $iLineStyle='solid';
public $numpoints=0; // Needed since the framework expects this property
 
function __construct($aDir=HORIZONTAL,$aPos=0,$aColor='black',$aWeight=1) {
$this->direction = $aDir;
$this->color=$aColor;
$this->weight=$aWeight;
$this->scaleposition=$aPos;
}
 
function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimwintarget = $aCSIMWinTarget;
$this->legendcsimalt = $aCSIMAlt;
}
 
function HideLegend($f=true) {
$this->hidelegend = $f;
}
 
function SetPosition($aScalePosition) {
$this->scaleposition=$aScalePosition;
}
 
function SetDirection($aDir) {
$this->direction = $aDir;
}
 
function SetColor($aColor) {
$this->color=$aColor;
}
 
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
 
function SetLineStyle($aStyle) {
$this->iLineStyle = $aStyle;
}
 
//---------------
// PRIVATE METHODS
 
function DoLegend($graph) {
if( !$this->hidelegend ) $this->Legend($graph);
}
 
// Framework function the chance for each plot class to set a legend
function Legend($aGraph) {
if( $this->legend != '' ) {
$dummyPlotMark = new PlotMark();
$lineStyle = 1;
$aGraph->legend->Add($this->legend,$this->color,$dummyPlotMark,$lineStyle,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
 
function PreStrokeAdjust($aGraph) {
// Nothing to do
}
 
// Called by framework to allow the object to draw
// optional information in the margin area
function StrokeMargin($aImg) {
// Nothing to do
}
 
// Framework function to allow the object to adjust the scale
function PrescaleSetup($aGraph) {
// Nothing to do
}
 
function Min() {
return array(null,null);
}
 
function Max() {
return array(null,null);
}
 
function _Stroke($aImg,$aMinX,$aMinY,$aMaxX,$aMaxY,$aXPos,$aYPos) {
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->weight);
$oldStyle = $aImg->SetLineStyle($this->iLineStyle);
if( $this->direction == VERTICAL ) {
$ymin_abs = $aMinY;
$ymax_abs = $aMaxY;
$xpos_abs = $aXPos;
$aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs);
}
elseif( $this->direction == HORIZONTAL ) {
$xmin_abs = $aMinX;
$xmax_abs = $aMaxX;
$ypos_abs = $aYPos;
$aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs);
}
else {
JpGraphError::RaiseL(25125);//(" Illegal direction for static line");
}
$aImg->SetLineStyle($oldStyle);
}
 
function Stroke($aImg,$aXScale,$aYScale) {
$this->_Stroke($aImg,
$aImg->left_margin,
$aYScale->Translate($aYScale->GetMinVal()),
$aImg->width-$aImg->right_margin,
$aYScale->Translate($aYScale->GetMaxVal()),
$aXScale->Translate($this->scaleposition),
$aYScale->Translate($this->scaleposition)
);
}
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_iconplot.php
New file
0,0 → 1,190
<?php
//=======================================================================
// File: JPGRAPH_ICONPLOT.PHP
// Description: Extension module to add icons to plots
// Created: 2004-02-18
// Ver: $Id: jpgraph_iconplot.php 1404 2009-06-28 15:25:41Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//===================================================
// CLASS IconPlot
// Description: Make it possible to add a (small) image
// to the graph
//===================================================
class IconPlot {
public $iX=0,$iY=0,$iScale=1.0,$iMix=100;
private $iHorAnchor='left',$iVertAnchor='top';
private $iFile='';
private $iAnchors = array('left','right','top','bottom','center');
private $iCountryFlag='',$iCountryStdSize=3;
private $iScalePosY=null,$iScalePosX=null;
private $iImgString='';
 
 
function __construct($aFile="",$aX=0,$aY=0,$aScale=1.0,$aMix=100) {
$this->iFile = $aFile;
$this->iX=$aX;
$this->iY=$aY;
$this->iScale= $aScale;
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix ;
}
 
function SetCountryFlag($aFlag,$aX=0,$aY=0,$aScale=1.0,$aMix=100,$aStdSize=3) {
$this->iCountryFlag = $aFlag;
$this->iX=$aX;
$this->iY=$aY;
$this->iScale= $aScale;
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001);//'Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix;
$this->iCountryStdSize = $aStdSize;
}
 
function SetPos($aX,$aY) {
$this->iX=$aX;
$this->iY=$aY;
}
 
function CreateFromString($aStr) {
$this->iImgString = $aStr;
}
 
function SetScalePos($aX,$aY) {
$this->iScalePosX = $aX;
$this->iScalePosY = $aY;
}
 
function SetScale($aScale) {
$this->iScale = $aScale;
}
 
function SetMix($aMix) {
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001);//('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix ;
}
 
function SetAnchor($aXAnchor='left',$aYAnchor='center') {
if( !in_array($aXAnchor,$this->iAnchors) ||
!in_array($aYAnchor,$this->iAnchors) ) {
JpGraphError::RaiseL(8002);//("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'");
}
$this->iHorAnchor=$aXAnchor;
$this->iVertAnchor=$aYAnchor;
}
 
function PreStrokeAdjust($aGraph) {
// Nothing to do ...
}
 
function DoLegend($aGraph) {
// Nothing to do ...
}
 
function Max() {
return array(false,false);
}
 
 
// The next four function are framework function tht gets called
// from Gantt and is not menaiungfull in the context of Icons but
// they must be implemented to avoid errors.
function GetMaxDate() { return false; }
function GetMinDate() { return false; }
function GetLineNbr() { return 0; }
function GetAbsHeight() {return 0; }
 
 
function Min() {
return array(false,false);
}
 
function StrokeMargin(&$aImg) {
return true;
}
 
function Stroke($aImg,$axscale=null,$ayscale=null) {
$this->StrokeWithScale($aImg,$axscale,$ayscale);
}
 
function StrokeWithScale($aImg,$axscale,$ayscale) {
if( $this->iScalePosX === null || $this->iScalePosY === null ||
$axscale === null || $ayscale === null ) {
$this->_Stroke($aImg);
}
else {
$this->_Stroke($aImg,
round($axscale->Translate($this->iScalePosX)),
round($ayscale->Translate($this->iScalePosY)));
}
}
 
function GetWidthHeight() {
$dummy=0;
return $this->_Stroke($dummy,null,null,true);
}
 
function _Stroke($aImg,$x=null,$y=null,$aReturnWidthHeight=false) {
if( $this->iFile != '' && $this->iCountryFlag != '' ) {
JpGraphError::RaiseL(8003);//('It is not possible to specify both an image file and a country flag for the same icon.');
}
if( $this->iFile != '' ) {
$gdimg = Graph::LoadBkgImage('',$this->iFile);
}
elseif( $this->iImgString != '') {
$gdimg = Image::CreateFromString($this->iImgString);
}
 
else {
if( ! class_exists('FlagImages',false) ) {
JpGraphError::RaiseL(8004);//('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.');
}
$fobj = new FlagImages($this->iCountryStdSize);
$dummy='';
$gdimg = $fobj->GetImgByName($this->iCountryFlag,$dummy);
}
 
$iconw = imagesx($gdimg);
$iconh = imagesy($gdimg);
 
if( $aReturnWidthHeight ) {
return array(round($iconw*$this->iScale),round($iconh*$this->iScale));
}
 
if( $x !== null && $y !== null ) {
$this->iX = $x; $this->iY = $y;
}
if( $this->iX >= 0 && $this->iX <= 1.0 ) {
$w = imagesx($aImg->img);
$this->iX = round($w*$this->iX);
}
if( $this->iY >= 0 && $this->iY <= 1.0 ) {
$h = imagesy($aImg->img);
$this->iY = round($h*$this->iY);
}
 
if( $this->iHorAnchor == 'center' )
$this->iX -= round($iconw*$this->iScale/2);
if( $this->iHorAnchor == 'right' )
$this->iX -= round($iconw*$this->iScale);
if( $this->iVertAnchor == 'center' )
$this->iY -= round($iconh*$this->iScale/2);
if( $this->iVertAnchor == 'bottom' )
$this->iY -= round($iconh*$this->iScale);
 
$aImg->CopyMerge($gdimg,$this->iX,$this->iY,0,0,
round($iconw*$this->iScale),round($iconh*$this->iScale),
$iconw,$iconh,
$this->iMix);
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/gd_image.inc.php
New file
0,0 → 1,2021
<?php
//=======================================================================
// File: GD_IMAGE.INC.PHP
// Description: PHP Graph Plotting library. Low level image drawing routines
// Created: 2001-01-08, refactored 2008-03-29
// Ver: $Id: gd_image.inc.php 1922 2010-01-11 11:42:50Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
require_once 'jpgraph_rgb.inc.php';
require_once 'jpgraph_ttf.inc.php';
 
// Line styles
define('LINESTYLE_SOLID',1);
define('LINESTYLE_DOTTED',2);
define('LINESTYLE_DASHED',3);
define('LINESTYLE_LONGDASH',4);
 
// The DEFAULT_GFORMAT sets the default graphic encoding format, i.e.
// PNG, JPG or GIF depending on what is installed on the target system
// in that order.
if( !DEFINED("DEFAULT_GFORMAT") ) {
define("DEFAULT_GFORMAT","auto");
}
 
//========================================================================
// CLASS Image
// Description: The very coor image drawing class that encapsulates all
// calls to the GD library
// Note: The class used by the library is the decendant
// class RotImage which extends the Image class with transparent
// rotation.
//=========================================================================
class Image {
public $left_margin=30,$right_margin=30,$top_margin=20,$bottom_margin=30;
public $img=null;
public $plotwidth=0,$plotheight=0;
public $width=0, $height=0;
public $rgb=null;
public $current_color,$current_color_name;
public $line_weight=1, $line_style=LINESTYLE_SOLID;
public $img_format;
public $ttf=null;
protected $expired=true;
protected $lastx=0, $lasty=0;
protected $obs_list=array();
protected $font_size=12,$font_family=FF_FONT1, $font_style=FS_NORMAL;
protected $font_file='';
protected $text_halign="left",$text_valign="bottom";
protected $use_anti_aliasing=false;
protected $quality=null;
protected $colorstack=array(),$colorstackidx=0;
protected $canvascolor = 'white' ;
protected $langconv = null ;
protected $iInterlace=false;
protected $bbox_cache = array(); // STore the last found tetx bounding box
 
//---------------
// CONSTRUCTOR
function __construct($aWidth=0,$aHeight=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) {
$this->CreateImgCanvas($aWidth,$aHeight);
 
if( $aSetAutoMargin ) {
$this->SetAutoMargin();
}
 
if( !$this->SetImgFormat($aFormat) ) {
JpGraphError::RaiseL(25081,$aFormat);//("JpGraph: Selected graphic format is either not supported or unknown [$aFormat]");
}
$this->ttf = new TTF();
$this->langconv = new LanguageConv();
}
 
// Enable interlacing in images
function SetInterlace($aFlg=true) {
$this->iInterlace=$aFlg;
}
 
// Should we use anti-aliasing. Note: This really slows down graphics!
function SetAntiAliasing($aFlg=true) {
$this->use_anti_aliasing = $aFlg;
if( function_exists('imageantialias') ) {
imageantialias($this->img,$aFlg);
}
else {
JpGraphError::RaiseL(25128);//('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.')
}
}
 
function GetAntiAliasing() {
return $this->use_anti_aliasing ;
}
 
function CreateRawCanvas($aWidth=0,$aHeight=0) {
if( $aWidth <= 1 || $aHeight <= 1 ) {
JpGraphError::RaiseL(25082,$aWidth,$aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)");
}
 
$this->img = @imagecreatetruecolor($aWidth, $aHeight);
if( $this->img < 1 ) {
JpGraphError::RaiseL(25126);
//die("Can't create truecolor image. Check that you really have GD2 library installed.");
}
$this->SetAlphaBlending();
 
if( $this->iInterlace ) {
imageinterlace($this->img,1);
}
if( $this->rgb != null ) {
$this->rgb->img = $this->img ;
}
else {
$this->rgb = new RGB($this->img);
}
}
 
function CloneCanvasH() {
$oldimage = $this->img;
$this->CreateRawCanvas($this->width,$this->height);
imagecopy($this->img,$oldimage,0,0,0,0,$this->width,$this->height);
return $oldimage;
}
 
function CreateImgCanvas($aWidth=0,$aHeight=0) {
 
$old = array($this->img,$this->width,$this->height);
 
$aWidth = round($aWidth);
$aHeight = round($aHeight);
 
$this->width=$aWidth;
$this->height=$aHeight;
 
 
if( $aWidth==0 || $aHeight==0 ) {
// We will set the final size later.
// Note: The size must be specified before any other
// img routines that stroke anything are called.
$this->img = null;
$this->rgb = null;
return $old;
}
 
$this->CreateRawCanvas($aWidth,$aHeight);
// Set canvas color (will also be the background color for a
// a pallett image
$this->SetColor($this->canvascolor);
$this->FilledRectangle(0,0,$aWidth-1,$aHeight-1);
 
return $old ;
}
 
function CopyCanvasH($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY,$aWidth,$aHeight,$aw=-1,$ah=-1) {
if( $aw === -1 ) {
$aw = $aWidth;
$ah = $aHeight;
$f = 'imagecopyresized';
}
else {
$f = 'imagecopyresampled';
}
$f($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY, $aWidth,$aHeight,$aw,$ah);
}
 
function Copy($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1) {
$this->CopyCanvasH($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight);
}
 
function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) {
if( $aMix == 100 ) {
$this->CopyCanvasH($this->img,$fromImg,
$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight);
}
else {
if( ($fromWidth != -1 && ($fromWidth != $toWidth)) || ($fromHeight != -1 && ($fromHeight != $fromHeight)) ) {
// Create a new canvas that will hold the re-scaled original from image
if( $toWidth <= 1 || $toHeight <= 1 ) {
JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.');
}
 
$tmpimg = @imagecreatetruecolor($toWidth, $toHeight);
 
if( $tmpimg < 1 ) {
JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?');
}
$this->CopyCanvasH($tmpimg,$fromImg,0,0,0,0,
$toWidth,$toHeight,$fromWidth,$fromHeight);
$fromImg = $tmpimg;
}
imagecopymerge($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$aMix);
}
}
 
static function GetWidth($aImg=null) {
if( $aImg === null ) {
$aImg = $this->img;
}
return imagesx($aImg);
}
 
static function GetHeight($aImg=null) {
if( $aImg === null ) {
$aImg = $this->img;
}
return imagesy($aImg);
}
 
static function CreateFromString($aStr) {
$img = imagecreatefromstring($aStr);
if( $img === false ) {
JpGraphError::RaiseL(25085);
//('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.');
}
return $img;
}
 
function SetCanvasH($aHdl) {
$this->img = $aHdl;
$this->rgb->img = $aHdl;
}
 
function SetCanvasColor($aColor) {
$this->canvascolor = $aColor ;
}
 
function SetAlphaBlending($aFlg=true) {
ImageAlphaBlending($this->img,$aFlg);
}
 
function SetAutoMargin() {
$min_bm=5;
$lm = min(40,$this->width/7);
$rm = min(20,$this->width/10);
$tm = max(5,$this->height/7);
$bm = max($min_bm,$this->height/6);
$this->SetMargin($lm,$rm,$tm,$bm);
}
 
//---------------
// PUBLIC METHODS
 
function SetFont($family,$style=FS_NORMAL,$size=10) {
$this->font_family=$family;
$this->font_style=$style;
$this->font_size=$size;
$this->font_file='';
if( ($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD ){
++$this->font_family;
}
if( $this->font_family > FF_FONT2+1 ) { // A TTF font so get the font file
 
// Check that this PHP has support for TTF fonts
if( !function_exists('imagettfbbox') ) {
JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.');
}
$this->font_file = $this->ttf->File($this->font_family,$this->font_style);
}
}
 
// Get the specific height for a text string
function GetTextHeight($txt="",$angle=0) {
$tmp = preg_split('/\n/',$txt);
$n = count($tmp);
$m=0;
for($i=0; $i< $n; ++$i) {
$m = max($m,strlen($tmp[$i]));
}
 
if( $this->font_family <= FF_FONT2+1 ) {
if( $angle==0 ) {
$h = imagefontheight($this->font_family);
if( $h === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
 
return $n*$h;
}
else {
$w = @imagefontwidth($this->font_family);
if( $w === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
 
return $m*$w;
}
}
else {
$bbox = $this->GetTTFBBox($txt,$angle);
return $bbox[1]-$bbox[5]+1;
}
}
 
// Estimate font height
function GetFontHeight($angle=0) {
$txt = "XOMg";
return $this->GetTextHeight($txt,$angle);
}
 
// Approximate font width with width of letter "O"
function GetFontWidth($angle=0) {
$txt = 'O';
return $this->GetTextWidth($txt,$angle);
}
 
// Get actual width of text in absolute pixels. Note that the width is the
// texts projected with onto the x-axis. Call with angle=0 to get the true
// etxt width.
function GetTextWidth($txt,$angle=0) {
 
$tmp = preg_split('/\n/',$txt);
$n = count($tmp);
if( $this->font_family <= FF_FONT2+1 ) {
 
$m=0;
for($i=0; $i < $n; ++$i) {
$l=strlen($tmp[$i]);
if( $l > $m ) {
$m = $l;
}
}
 
if( $angle==0 ) {
$w = @imagefontwidth($this->font_family);
if( $w === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
return $m*$w;
}
else {
// 90 degrees internal so height becomes width
$h = @imagefontheight($this->font_family);
if( $h === false ) {
JpGraphError::RaiseL(25089);//('You have a misconfigured GD font support. The call to imagefontheight() fails.');
}
return $n*$h;
}
}
else {
// For TTF fonts we must walk through a lines and find the
// widest one which we use as the width of the multi-line
// paragraph
$m=0;
for( $i=0; $i < $n; ++$i ) {
$bbox = $this->GetTTFBBox($tmp[$i],$angle);
$mm = $bbox[2] - $bbox[0];
if( $mm > $m )
$m = $mm;
}
return $m;
}
}
 
 
// Draw text with a box around it
function StrokeBoxedText($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black",
$shadowcolor=false,$paragraph_align="left",
$xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) {
 
$oldx = $this->lastx;
$oldy = $this->lasty;
 
if( !is_numeric($dir) ) {
if( $dir=="h" ) $dir=0;
elseif( $dir=="v" ) $dir=90;
else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]");
}
 
if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) {
$width=$this->GetTextWidth($txt,$dir) ;
$height=$this->GetTextHeight($txt,$dir) ;
}
else {
$width=$this->GetBBoxWidth($txt,$dir) ;
$height=$this->GetBBoxHeight($txt,$dir) ;
}
 
$height += 2*$ymarg;
$width += 2*$xmarg;
 
if( $this->text_halign=="right" ) $x -= $width;
elseif( $this->text_halign=="center" ) $x -= $width/2;
 
if( $this->text_valign=="bottom" ) $y -= $height;
elseif( $this->text_valign=="center" ) $y -= $height/2;
 
$olda = $this->SetAngle(0);
 
if( $shadowcolor ) {
$this->PushColor($shadowcolor);
$this->FilledRoundedRectangle($x-$xmarg+$dropwidth,$y-$ymarg+$dropwidth,
$x+$width+$dropwidth,$y+$height-$ymarg+$dropwidth,
$cornerradius);
$this->PopColor();
$this->PushColor($fcolor);
$this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,
$x+$width,$y+$height-$ymarg,
$cornerradius);
$this->PopColor();
$this->PushColor($bcolor);
$this->RoundedRectangle($x-$xmarg,$y-$ymarg,
$x+$width,$y+$height-$ymarg,$cornerradius);
$this->PopColor();
}
else {
if( $fcolor ) {
$oc=$this->current_color;
$this->SetColor($fcolor);
$this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius);
$this->current_color=$oc;
}
if( $bcolor ) {
$oc=$this->current_color;
$this->SetColor($bcolor);
$this->RoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius);
$this->current_color=$oc;
}
}
 
$h=$this->text_halign;
$v=$this->text_valign;
$this->SetTextAlign("left","top");
 
$debug=false;
$this->StrokeText($x, $y, $txt, $dir, $paragraph_align,$debug);
 
$bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg,
$x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg);
$this->SetTextAlign($h,$v);
 
$this->SetAngle($olda);
$this->lastx = $oldx;
$this->lasty = $oldy;
 
return $bb;
}
 
// Draw text with a box around it. This time the box will be rotated
// with the text. The previous method will just make a larger enough non-rotated
// box to hold the text inside.
function StrokeBoxedText2($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black",
$shadowcolor=false,$paragraph_align="left",
$xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) {
 
// This version of boxed text will stroke a rotated box round the text
// thta will follow the angle of the text.
// This has two implications:
// 1) This methos will only support TTF fonts
// 2) The only two alignment that makes sense are centered or baselined
 
if( $this->font_family <= FF_FONT2+1 ) {
JpGraphError::RaiseL(25131);//StrokeBoxedText2() Only support TTF fonts and not built in bitmap fonts
}
 
$oldx = $this->lastx;
$oldy = $this->lasty;
$dir = $this->NormAngle($dir);
 
if( !is_numeric($dir) ) {
if( $dir=="h" ) $dir=0;
elseif( $dir=="v" ) $dir=90;
else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]");
}
 
$width=$this->GetTextWidth($txt,0) + 2*$xmarg;
$height=$this->GetTextHeight($txt,0) + 2*$ymarg ;
$rect_width=$this->GetBBoxWidth($txt,$dir) ;
$rect_height=$this->GetBBoxHeight($txt,$dir) ;
 
$baseline_offset = $this->bbox_cache[1]-1;
 
if( $this->text_halign=="center" ) {
if( $dir >= 0 && $dir <= 90 ) {
 
$x -= $rect_width/2;
$x += sin($dir*M_PI/180)*$height;
$y += $rect_height/2;
 
} elseif( $dir >= 270 && $dir <= 360 ) {
 
$x -= $rect_width/2;
$y -= $rect_height/2;
$y += cos($dir*M_PI/180)*$height;
 
} elseif( $dir >= 90 && $dir <= 180 ) {
 
$x += $rect_width/2;
$y += $rect_height/2;
$y += cos($dir*M_PI/180)*$height;
 
}
else {
// $dir > 180 && $dir < 270
$x += $rect_width/2;
$x += sin($dir*M_PI/180)*$height;
$y -= $rect_height/2;
}
}
 
// Rotate the box around this point
$this->SetCenter($x,$y);
$olda = $this->SetAngle(-$dir);
 
// We need to use adjusted coordinats for the box to be able
// to draw the box below the baseline. This cannot be done before since
// the rotating point must be the original x,y since that is arounbf the
// point where the text will rotate and we cannot change this since
// that is where the GD/GreeType will rotate the text
 
 
// For smaller <14pt font we need to do some additional
// adjustments to make it look good
if( $this->font_size < 14 ) {
$x -= 2;
$y += 2;
}
else {
// $y += $baseline_offset;
}
 
if( $shadowcolor ) {
$this->PushColor($shadowcolor);
$this->FilledRectangle($x-$xmarg+$dropwidth,$y+$ymarg+$dropwidth-$height,
$x+$width+$dropwidth,$y+$ymarg+$dropwidth);
//$cornerradius);
$this->PopColor();
$this->PushColor($fcolor);
$this->FilledRectangle($x-$xmarg, $y+$ymarg-$height,
$x+$width, $y+$ymarg);
//$cornerradius);
$this->PopColor();
$this->PushColor($bcolor);
$this->Rectangle($x-$xmarg,$y+$ymarg-$height,
$x+$width,$y+$ymarg);
//$cornerradius);
$this->PopColor();
}
else {
if( $fcolor ) {
$oc=$this->current_color;
$this->SetColor($fcolor);
$this->FilledRectangle($x-$xmarg,$y+$ymarg-$height,$x+$width,$y+$ymarg);//,$cornerradius);
$this->current_color=$oc;
}
if( $bcolor ) {
$oc=$this->current_color;
$this->SetColor($bcolor);
$this->Rectangle($x-$xmarg,$y+$ymarg-$height,$x+$width,$y+$ymarg);//,$cornerradius);
$this->current_color=$oc;
}
}
 
if( $this->font_size < 14 ) {
$x += 2;
$y -= 2;
}
else {
 
// Restore the original y before we stroke the text
// $y -= $baseline_offset;
 
}
 
$this->SetCenter(0,0);
$this->SetAngle($olda);
 
$h=$this->text_halign;
$v=$this->text_valign;
if( $this->text_halign == 'center') {
$this->SetTextAlign('center','basepoint');
}
else {
$this->SetTextAlign('basepoint','basepoint');
}
 
$debug=false;
$this->StrokeText($x, $y, $txt, $dir, $paragraph_align,$debug);
 
$bb = array($x-$xmarg, $y+$height-$ymarg,
$x+$width, $y+$height-$ymarg,
$x+$width, $y-$ymarg,
$x-$xmarg, $y-$ymarg);
 
$this->SetTextAlign($h,$v);
$this->SetAngle($olda);
 
$this->lastx = $oldx;
$this->lasty = $oldy;
 
return $bb;
}
 
// Set text alignment
function SetTextAlign($halign,$valign="bottom") {
$this->text_halign=$halign;
$this->text_valign=$valign;
}
 
function _StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,&$aBoundingBox,$aDebug=false) {
 
if( is_numeric($dir) && $dir!=90 && $dir!=0)
JpGraphError::RaiseL(25091);//(" Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.");
 
$h=$this->GetTextHeight($txt);
$fh=$this->GetFontHeight();
$w=$this->GetTextWidth($txt);
 
if( $this->text_halign=="right") {
$x -= $dir==0 ? $w : $h;
}
elseif( $this->text_halign=="center" ) {
// For center we subtract 1 pixel since this makes the middle
// be prefectly in the middle
$x -= $dir==0 ? $w/2-1 : $h/2;
}
if( $this->text_valign=="top" ) {
$y += $dir==0 ? $h : $w;
}
elseif( $this->text_valign=="center" ) {
$y += $dir==0 ? $h/2 : $w/2;
}
 
if( $dir==90 ) {
imagestringup($this->img,$this->font_family,$x,$y,$txt,$this->current_color);
$aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y));
if( $aDebug ) {
// Draw bounding box
$this->PushColor('green');
$this->Polygon($aBoundingBox,true);
$this->PopColor();
}
}
else {
if( preg_match('/\n/',$txt) ) {
$tmp = preg_split('/\n/',$txt);
for($i=0; $i < count($tmp); ++$i) {
$w1 = $this->GetTextWidth($tmp[$i]);
if( $paragraph_align=="left" ) {
imagestring($this->img,$this->font_family,$x,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
elseif( $paragraph_align=="right" ) {
imagestring($this->img,$this->font_family,$x+($w-$w1),$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
else {
imagestring($this->img,$this->font_family,$x+$w/2-$w1/2,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
}
}
else {
//Put the text
imagestring($this->img,$this->font_family,$x,$y-$h+1,$txt,$this->current_color);
}
if( $aDebug ) {
// Draw the bounding rectangle and the bounding box
$p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y));
 
// Draw bounding box
$this->PushColor('green');
$this->Polygon($p1,true);
$this->PopColor();
 
}
$aBoundingBox=array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y));
}
}
 
function AddTxtCR($aTxt) {
// If the user has just specified a '\n'
// instead of '\n\t' we have to add '\r' since
// the width will be too muchy otherwise since when
// we print we stroke the individually lines by hand.
$e = explode("\n",$aTxt);
$n = count($e);
for($i=0; $i<$n; ++$i) {
$e[$i]=str_replace("\r","",$e[$i]);
}
return implode("\n\r",$e);
}
 
function NormAngle($a) {
// Normalize angle in degrees
// Normalize angle to be between 0-360
while( $a > 360 )
$a -= 360;
while( $a < -360 )
$a += 360;
if( $a < 0 )
$a = 360 + $a;
return $a;
}
 
function imagettfbbox_fixed($size, $angle, $fontfile, $text) {
 
 
if( ! USE_LIBRARY_IMAGETTFBBOX ) {
 
$bbox = @imagettfbbox($size, $angle, $fontfile, $text);
if( $bbox === false ) {
JpGraphError::RaiseL(25092,$this->font_file);
//("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.");
}
$this->bbox_cache = $bbox;
return $bbox;
}
 
// The built in imagettfbbox is buggy for angles != 0 so
// we calculate this manually by getting the bounding box at
// angle = 0 and then rotate the bounding box manually
$bbox = @imagettfbbox($size, 0, $fontfile, $text);
if( $bbox === false ) {
JpGraphError::RaiseL(25092,$this->font_file);
//("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.");
}
 
$angle = $this->NormAngle($angle);
 
$a = $angle*M_PI/180;
$ca = cos($a);
$sa = sin($a);
$ret = array();
 
// We always add 1 pixel to the left since the left edge of the bounding
// box is sometimes coinciding with the first pixel of the text
//$bbox[0] -= 1;
//$bbox[6] -= 1;
// For roatated text we need to add extra width for rotated
// text since the kerning and stroking of the TTF is not the same as for
// text at a 0 degree angle
 
if( $angle > 0.001 && abs($angle-360) > 0.001 ) {
$h = abs($bbox[7]-$bbox[1]);
$w = abs($bbox[2]-$bbox[0]);
 
$bbox[0] -= 2;
$bbox[6] -= 2;
// The width is underestimated so compensate for that
$bbox[2] += round($w*0.06);
$bbox[4] += round($w*0.06);
 
// and we also need to compensate with increased height
$bbox[5] -= round($h*0.1);
$bbox[7] -= round($h*0.1);
 
if( $angle > 90 ) {
// For angles > 90 we also need to extend the height further down
// by the baseline since that is also one more problem
$bbox[1] += round($h*0.15);
$bbox[3] += round($h*0.15);
 
// and also make it slighty less height
$bbox[7] += round($h*0.05);
$bbox[5] += round($h*0.05);
 
// And we need to move the box slightly top the rright (from a tetx perspective)
$bbox[0] += round($w*0.02);
$bbox[6] += round($w*0.02);
 
if( $angle > 180 ) {
// And we need to move the box slightly to the left (from a text perspective)
$bbox[0] -= round($w*0.02);
$bbox[6] -= round($w*0.02);
$bbox[2] -= round($w*0.02);
$bbox[4] -= round($w*0.02);
 
}
 
}
for($i = 0; $i < 7; $i += 2) {
$ret[$i] = round($bbox[$i] * $ca + $bbox[$i+1] * $sa);
$ret[$i+1] = round($bbox[$i+1] * $ca - $bbox[$i] * $sa);
}
$this->bbox_cache = $ret;
return $ret;
}
else {
$this->bbox_cache = $bbox;
return $bbox;
}
}
 
// Deprecated
function GetTTFBBox($aTxt,$aAngle=0) {
$bbox = $this->imagettfbbox_fixed($this->font_size,$aAngle,$this->font_file,$aTxt);
return $bbox;
}
 
function GetBBoxTTF($aTxt,$aAngle=0) {
// Normalize the bounding box to become a minimum
// enscribing rectangle
 
$aTxt = $this->AddTxtCR($aTxt);
 
if( !is_readable($this->font_file) ) {
JpGraphError::RaiseL(25093,$this->font_file);
//('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.');
}
$bbox = $this->imagettfbbox_fixed($this->font_size,$aAngle,$this->font_file,$aTxt);
 
if( $aAngle==0 ) return $bbox;
 
if( $aAngle >= 0 ) {
if( $aAngle <= 90 ) { //<=0
$bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1],
$bbox[2],$bbox[5],$bbox[6],$bbox[5]);
}
elseif( $aAngle <= 180 ) { //<= 2
$bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7],
$bbox[0],$bbox[3],$bbox[4],$bbox[3]);
}
elseif( $aAngle <= 270 ) { //<= 3
$bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5],
$bbox[6],$bbox[1],$bbox[2],$bbox[1]);
}
else {
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
}
elseif( $aAngle < 0 ) {
if( $aAngle <= -270 ) { // <= -3
$bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1],
$bbox[2],$bbox[5],$bbox[6],$bbox[5]);
}
elseif( $aAngle <= -180 ) { // <= -2
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
elseif( $aAngle <= -90 ) { // <= -1
$bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5],
$bbox[6],$bbox[1],$bbox[2],$bbox[1]);
}
else {
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
}
return $bbox;
}
 
function GetBBoxHeight($aTxt,$aAngle=0) {
$box = $this->GetBBoxTTF($aTxt,$aAngle);
return abs($box[7]-$box[1]);
}
 
function GetBBoxWidth($aTxt,$aAngle=0) {
$box = $this->GetBBoxTTF($aTxt,$aAngle);
return $box[2]-$box[0]+1;
}
 
 
function _StrokeTTF($x,$y,$txt,$dir,$paragraph_align,&$aBoundingBox,$debug=false) {
 
// Setup default inter line margin for paragraphs to be
// 3% of the font height.
$ConstLineSpacing = 0.03 ;
 
// Remember the anchor point before adjustment
if( $debug ) {
$ox=$x;
$oy=$y;
}
 
if( !preg_match('/\n/',$txt) || ($dir>0 && preg_match('/\n/',$txt)) ) {
// Format a single line
 
$txt = $this->AddTxtCR($txt);
$bbox=$this->GetBBoxTTF($txt,$dir);
$width = $this->GetBBoxWidth($txt,$dir);
$height = $this->GetBBoxHeight($txt,$dir);
 
// The special alignment "basepoint" is mostly used internally
// in the library. This will put the anchor position at the left
// basepoint of the tetx. This is the default anchor point for
// TTF text.
 
if( $this->text_valign != 'basepoint' ) {
// Align x,y ot lower left corner of bbox
 
if( $this->text_halign=='right' ) {
$x -= $width;
$x -= $bbox[0];
}
elseif( $this->text_halign=='center' ) {
$x -= $width/2;
$x -= $bbox[0];
}
elseif( $this->text_halign=='baseline' ) {
// This is only support for text at 90 degree !!
// Do nothing the text is drawn at baseline by default
}
 
if( $this->text_valign=='top' ) {
$y -= $bbox[1]; // Adjust to bottom of text
$y += $height;
}
elseif( $this->text_valign=='center' ) {
$y -= $bbox[1]; // Adjust to bottom of text
$y += $height/2;
}
elseif( $this->text_valign=='baseline' ) {
// This is only support for text at 0 degree !!
// Do nothing the text is drawn at baseline by default
}
}
ImageTTFText ($this->img, $this->font_size, $dir, $x, $y,
$this->current_color,$this->font_file,$txt);
 
// Calculate and return the co-ordinates for the bounding box
$box = $this->imagettfbbox_fixed($this->font_size,$dir,$this->font_file,$txt);
$p1 = array();
 
for($i=0; $i < 4; ++$i) {
$p1[] = round($box[$i*2]+$x);
$p1[] = round($box[$i*2+1]+$y);
}
$aBoundingBox = $p1;
 
// Debugging code to highlight the bonding box and bounding rectangle
// For text at 0 degrees the bounding box and bounding rectangle are the
// same
if( $debug ) {
// Draw the bounding rectangle and the bounding box
 
$p = array();
$p1 = array();
 
for($i=0; $i < 4; ++$i) {
$p[] = $bbox[$i*2]+$x ;
$p[] = $bbox[$i*2+1]+$y;
$p1[] = $box[$i*2]+$x ;
$p1[] = $box[$i*2+1]+$y ;
}
 
// Draw bounding box
$this->PushColor('green');
$this->Polygon($p1,true);
$this->PopColor();
 
// Draw bounding rectangle
$this->PushColor('darkgreen');
$this->Polygon($p,true);
$this->PopColor();
 
// Draw a cross at the anchor point
$this->PushColor('red');
$this->Line($ox-15,$oy,$ox+15,$oy);
$this->Line($ox,$oy-15,$ox,$oy+15);
$this->PopColor();
}
}
else {
// Format a text paragraph
$fh=$this->GetFontHeight();
 
// Line margin is 25% of font height
$linemargin=round($fh*$ConstLineSpacing);
$fh += $linemargin;
$w=$this->GetTextWidth($txt);
 
$y -= $linemargin/2;
$tmp = preg_split('/\n/',$txt);
$nl = count($tmp);
$h = $nl * $fh;
 
if( $this->text_halign=='right') {
$x -= $dir==0 ? $w : $h;
}
elseif( $this->text_halign=='center' ) {
$x -= $dir==0 ? $w/2 : $h/2;
}
 
if( $this->text_valign=='top' ) {
$y += $dir==0 ? $h : $w;
}
elseif( $this->text_valign=='center' ) {
$y += $dir==0 ? $h/2 : $w/2;
}
 
// Here comes a tricky bit.
// Since we have to give the position for the string at the
// baseline this means thaht text will move slightly up
// and down depending on any of it's character descend below
// the baseline, for example a 'g'. To adjust the Y-position
// we therefore adjust the text with the baseline Y-offset
// as used for the current font and size. This will keep the
// baseline at a fixed positoned disregarding the actual
// characters in the string.
$standardbox = $this->GetTTFBBox('Gg',$dir);
$yadj = $standardbox[1];
$xadj = $standardbox[0];
$aBoundingBox = array();
for($i=0; $i < $nl; ++$i) {
$wl = $this->GetTextWidth($tmp[$i]);
$bbox = $this->GetTTFBBox($tmp[$i],$dir);
if( $paragraph_align=='left' ) {
$xl = $x;
}
elseif( $paragraph_align=='right' ) {
$xl = $x + ($w-$wl);
}
else {
// Center
$xl = $x + $w/2 - $wl/2 ;
}
 
// In theory we should adjust with full pre-lead to get the lines
// lined up but this doesn't look good so therfore we only adjust with
// half th pre-lead
$xl -= $bbox[0]/2;
$yl = $y - $yadj;
//$xl = $xl- $xadj;
ImageTTFText($this->img, $this->font_size, $dir, $xl, $yl-($h-$fh)+$fh*$i,
$this->current_color,$this->font_file,$tmp[$i]);
 
// echo "xl=$xl,".$tmp[$i]." <br>";
if( $debug ) {
// Draw the bounding rectangle around each line
$box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$tmp[$i]);
$p = array();
for($j=0; $j < 4; ++$j) {
$p[] = $bbox[$j*2]+$xl;
$p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i;
}
 
// Draw bounding rectangle
$this->PushColor('darkgreen');
$this->Polygon($p,true);
$this->PopColor();
}
}
 
// Get the bounding box
$bbox = $this->GetBBoxTTF($txt,$dir);
for($j=0; $j < 4; ++$j) {
$bbox[$j*2]+= round($x);
$bbox[$j*2+1]+= round($y - ($h-$fh) - $yadj);
}
$aBoundingBox = $bbox;
 
if( $debug ) {
// Draw a cross at the anchor point
$this->PushColor('red');
$this->Line($ox-25,$oy,$ox+25,$oy);
$this->Line($ox,$oy-25,$ox,$oy+25);
$this->PopColor();
}
 
}
}
 
function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) {
 
$x = round($x);
$y = round($y);
 
// Do special language encoding
$txt = $this->langconv->Convert($txt,$this->font_family);
 
if( !is_numeric($dir) ) {
JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90.");
}
 
if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) {
$this->_StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug);
}
elseif( $this->font_family >= _FIRST_FONT && $this->font_family <= _LAST_FONT) {
$this->_StrokeTTF($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug);
}
else {
JpGraphError::RaiseL(25095);//(" Unknown font font family specification. ");
}
return $boundingbox;
}
 
function SetMargin($lm,$rm,$tm,$bm) {
$this->left_margin=$lm;
$this->right_margin=$rm;
$this->top_margin=$tm;
$this->bottom_margin=$bm;
$this->plotwidth=$this->width - $this->left_margin-$this->right_margin ;
$this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ;
if( $this->width > 0 && $this->height > 0 ) {
if( $this->plotwidth < 0 || $this->plotheight < 0 ) {
JpGraphError::RaiseL(25130, $this->plotwidth, $this->plotheight);
//JpGraphError::raise("To small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.");
}
}
}
 
function SetTransparent($color) {
imagecolortransparent ($this->img,$this->rgb->allocate($color));
}
 
function SetColor($color,$aAlpha=0) {
$this->current_color_name = $color;
$this->current_color=$this->rgb->allocate($color,$aAlpha);
if( $this->current_color == -1 ) {
$tc=imagecolorstotal($this->img);
JpGraphError::RaiseL(25096);
//("Can't allocate any more colors. Image has already allocated maximum of <b>$tc colors</b>. This might happen if you have anti-aliasing turned on together with a background image or perhaps gradient fill since this requires many, many colors. Try to turn off anti-aliasing. If there is still a problem try downgrading the quality of the background image to use a smaller pallete to leave some entries for your graphs. You should try to limit the number of colors in your background image to 64. If there is still problem set the constant DEFINE(\"USE_APPROX_COLORS\",true); in jpgraph.php This will use approximative colors when the palette is full. Unfortunately there is not much JpGraph can do about this since the palette size is a limitation of current graphic format and what the underlying GD library suppports.");
}
return $this->current_color;
}
 
function PushColor($color) {
if( $color != "" ) {
$this->colorstack[$this->colorstackidx]=$this->current_color_name;
$this->colorstack[$this->colorstackidx+1]=$this->current_color;
$this->colorstackidx+=2;
$this->SetColor($color);
}
else {
JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor().");
}
}
 
function PopColor() {
if( $this->colorstackidx < 1 ) {
JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()");
}
$this->current_color=$this->colorstack[--$this->colorstackidx];
$this->current_color_name=$this->colorstack[--$this->colorstackidx];
}
 
 
function SetLineWeight($weight) {
$old = $this->line_weight;
imagesetthickness($this->img,$weight);
$this->line_weight = $weight;
return $old;
}
 
function SetStartPoint($x,$y) {
$this->lastx=round($x);
$this->lasty=round($y);
}
 
function Arc($cx,$cy,$w,$h,$s,$e) {
// GD Arc doesn't like negative angles
while( $s < 0) $s += 360;
while( $e < 0) $e += 360;
imagearc($this->img,round($cx),round($cy),round($w),round($h),$s,$e,$this->current_color);
}
 
function FilledArc($xc,$yc,$w,$h,$s,$e,$style='') {
$s = round($s);
$e = round($e);
while( $s < 0 ) $s += 360;
while( $e < 0 ) $e += 360;
if( $style=='' )
$style=IMG_ARC_PIE;
if( abs($s-$e) > 0 ) {
imagefilledarc($this->img,round($xc),round($yc),round($w),round($h),$s,$e,$this->current_color,$style);
}
}
 
function FilledCakeSlice($cx,$cy,$w,$h,$s,$e) {
$this->CakeSlice($cx,$cy,$w,$h,$s,$e,$this->current_color_name);
}
 
function CakeSlice($xc,$yc,$w,$h,$s,$e,$fillcolor="",$arccolor="") {
$s = round($s); $e = round($e);
$w = round($w); $h = round($h);
$xc = round($xc); $yc = round($yc);
if( $s == $e ) {
// A full circle. We draw this a plain circle
$this->PushColor($fillcolor);
imagefilledellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color);
 
// If antialiasing is used then we often don't have any color no the surrounding
// arc. So, we need to check for this special case so we don't send an empty
// color to the push function. In this case we use the fill color for the arc as well
if( $arccolor != '' ) {
$this->PopColor();
$this->PushColor($arccolor);
}
imageellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color);
$this->Line($xc,$yc,cos($s*M_PI/180)*$w+$xc,$yc+sin($s*M_PI/180)*$h);
$this->PopColor();
}
else {
$this->PushColor($fillcolor);
$this->FilledArc($xc,$yc,2*$w,2*$h,$s,$e);
$this->PopColor();
if( $arccolor != "" ) {
$this->PushColor($arccolor);
// We add 2 pixels to make the Arc() better aligned with
// the filled arc.
imagefilledarc($this->img,$xc,$yc,2*$w,2*$h,$s,$e,$this->current_color,IMG_ARC_NOFILL | IMG_ARC_EDGED ) ;
$this->PopColor();
}
}
}
 
function Ellipse($xc,$yc,$w,$h) {
$this->Arc($xc,$yc,$w,$h,0,360);
}
 
function Circle($xc,$yc,$r) {
imageellipse($this->img,round($xc),round($yc),$r*2,$r*2,$this->current_color);
}
 
function FilledCircle($xc,$yc,$r) {
imagefilledellipse($this->img,round($xc),round($yc),2*$r,2*$r,$this->current_color);
}
 
// Linear Color InterPolation
function lip($f,$t,$p) {
$p = round($p,1);
$r = $f[0] + ($t[0]-$f[0])*$p;
$g = $f[1] + ($t[1]-$f[1])*$p;
$b = $f[2] + ($t[2]-$f[2])*$p;
return array($r,$g,$b);
}
 
// Set line style dashed, dotted etc
function SetLineStyle($s) {
if( is_numeric($s) ) {
if( $s<1 || $s>4 ) {
JpGraphError::RaiseL(25101,$s);//(" Illegal numeric argument to SetLineStyle(): ($s)");
}
}
elseif( is_string($s) ) {
if( $s == "solid" ) $s=1;
elseif( $s == "dotted" ) $s=2;
elseif( $s == "dashed" ) $s=3;
elseif( $s == "longdashed" ) $s=4;
else {
JpGraphError::RaiseL(25102,$s);//(" Illegal string argument to SetLineStyle(): $s");
}
}
else {
JpGraphError::RaiseL(25103,$s);//(" Illegal argument to SetLineStyle $s");
}
$old = $this->line_style;
$this->line_style=$s;
return $old;
}
 
// Same as Line but take the line_style into account
function StyleLine($x1,$y1,$x2,$y2,$aStyle='') {
if( $this->line_weight <= 0 ) return;
 
if( $aStyle === '' ) {
$aStyle = $this->line_style;
}
 
// Add error check since dashed line will only work if anti-alias is disabled
// this is a limitation in GD
 
if( $aStyle == 1 ) {
// Solid style. We can handle anti-aliasing for this
$this->Line($x1,$y1,$x2,$y2);
}
else {
// Since the GD routines doesn't handle AA for styled line
// we have no option than to turn it off to get any lines at
// all if the weight > 1
$oldaa = $this->GetAntiAliasing();
if( $oldaa && $this->line_weight > 1 ) {
$this->SetAntiAliasing(false);
}
 
switch( $aStyle ) {
case 2: // Dotted
$this->DashedLine($x1,$y1,$x2,$y2,2,6);
break;
case 3: // Dashed
$this->DashedLine($x1,$y1,$x2,$y2,5,9);
break;
case 4: // Longdashes
$this->DashedLine($x1,$y1,$x2,$y2,9,13);
break;
default:
JpGraphError::RaiseL(25104,$this->line_style);//(" Unknown line style: $this->line_style ");
break;
}
if( $oldaa ) {
$this->SetAntiAliasing(true);
}
}
}
 
function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) {
 
if( $this->line_weight <= 0 ) return;
 
// Add error check to make sure anti-alias is not enabled.
// Dashed line does not work with anti-alias enabled. This
// is a limitation in GD.
if( $this->use_anti_aliasing ) {
JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.
}
 
 
$x1 = round($x1);
$x2 = round($x2);
$y1 = round($y1);
$y2 = round($y2);
 
$style = array_fill(0,$dash_length,$this->current_color);
$style = array_pad($style,$dash_space,IMG_COLOR_TRANSPARENT);
imagesetstyle($this->img, $style);
imageline($this->img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
$this->lastx = $x2;
$this->lasty = $y2;
}
 
function Line($x1,$y1,$x2,$y2) {
 
if( $this->line_weight <= 0 ) return;
 
$x1 = round($x1);
$x2 = round($x2);
$y1 = round($y1);
$y2 = round($y2);
 
imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color);
$this->lastx=$x2;
$this->lasty=$y2;
}
 
function Polygon($p,$closed=FALSE,$fast=FALSE) {
 
if( $this->line_weight <= 0 ) return;
 
$n=count($p);
$oldx = $p[0];
$oldy = $p[1];
if( $fast ) {
for( $i=2; $i < $n; $i+=2 ) {
imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->current_color);
$oldx = $p[$i];
$oldy = $p[$i+1];
}
if( $closed ) {
imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->current_color);
}
}
else {
for( $i=2; $i < $n; $i+=2 ) {
$this->StyleLine($oldx,$oldy,$p[$i],$p[$i+1]);
$oldx = $p[$i];
$oldy = $p[$i+1];
}
if( $closed ) {
$this->StyleLine($oldx,$oldy,$p[0],$p[1]);
}
}
}
 
function FilledPolygon($pts) {
$n=count($pts);
if( $n == 0 ) {
JpGraphError::RaiseL(25105);//('NULL data specified for a filled polygon. Check that your data is not NULL.');
}
for($i=0; $i < $n; ++$i) {
$pts[$i] = round($pts[$i]);
}
$old = $this->line_weight;
imagesetthickness($this->img,1);
imagefilledpolygon($this->img,$pts,count($pts)/2,$this->current_color);
$this->line_weight = $old;
imagesetthickness($this->img,$old);
}
 
function Rectangle($xl,$yu,$xr,$yl) {
$this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu));
}
 
function FilledRectangle($xl,$yu,$xr,$yl) {
$this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl));
}
 
function FilledRectangle2($xl,$yu,$xr,$yl,$color1,$color2,$style=1) {
// Fill a rectangle with lines of two colors
if( $style===1 ) {
// Horizontal stripe
if( $yl < $yu ) {
$t = $yl; $yl=$yu; $yu=$t;
}
for( $y=$yu; $y <= $yl; ++$y) {
$this->SetColor($color1);
$this->Line($xl,$y,$xr,$y);
++$y;
$this->SetColor($color2);
$this->Line($xl,$y,$xr,$y);
}
}
else {
if( $xl < $xl ) {
$t = $xl; $xl=$xr; $xr=$t;
}
for( $x=$xl; $x <= $xr; ++$x) {
$this->SetColor($color1);
$this->Line($x,$yu,$x,$yl);
++$x;
$this->SetColor($color2);
$this->Line($x,$yu,$x,$yl);
}
}
}
 
function ShadowRectangle($xl,$yu,$xr,$yl,$fcolor=false,$shadow_width=4,$shadow_color='darkgray',$useAlpha=true) {
// This is complicated by the fact that we must also handle the case where
// the reactangle has no fill color
$xl = floor($xl);
$yu = floor($yu);
$xr = floor($xr);
$yl = floor($yl);
$this->PushColor($shadow_color);
$shadowAlpha=0;
$this->SetLineWeight(1);
$this->SetLineStyle('solid');
$basecolor = $this->rgb->Color($shadow_color);
$shadow_color = array($basecolor[0],$basecolor[1],$basecolor[2],);
for( $i=0; $i < $shadow_width; ++$i ) {
$this->SetColor($shadow_color,$shadowAlpha);
$this->Line($xr-$shadow_width+$i, $yu+$shadow_width,
$xr-$shadow_width+$i, $yl-$shadow_width-1+$i);
$this->Line($xl+$shadow_width, $yl-$shadow_width+$i,
$xr-$shadow_width+$i, $yl-$shadow_width+$i);
if( $useAlpha ) $shadowAlpha += 1.0/$shadow_width;
}
 
$this->PopColor();
if( $fcolor==false ) {
$this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
}
else {
$this->PushColor($fcolor);
$this->FilledRectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
$this->PopColor();
$this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
}
}
 
function FilledRoundedRectangle($xt,$yt,$xr,$yl,$r=5) {
if( $r==0 ) {
$this->FilledRectangle($xt,$yt,$xr,$yl);
return;
}
 
// To avoid overlapping fillings (which will look strange
// when alphablending is enabled) we have no choice but
// to fill the five distinct areas one by one.
 
// Center square
$this->FilledRectangle($xt+$r,$yt+$r,$xr-$r,$yl-$r);
// Top band
$this->FilledRectangle($xt+$r,$yt,$xr-$r,$yt+$r);
// Bottom band
$this->FilledRectangle($xt+$r,$yl-$r,$xr-$r,$yl);
// Left band
$this->FilledRectangle($xt,$yt+$r,$xt+$r,$yl-$r);
// Right band
$this->FilledRectangle($xr-$r,$yt+$r,$xr,$yl-$r);
 
// Topleft & Topright arc
$this->FilledArc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->FilledArc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Bottomleft & Bottom right arc
$this->FilledArc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->FilledArc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
}
 
function RoundedRectangle($xt,$yt,$xr,$yl,$r=5) {
 
if( $r==0 ) {
$this->Rectangle($xt,$yt,$xr,$yl);
return;
}
 
// Top & Bottom line
$this->Line($xt+$r,$yt,$xr-$r,$yt);
$this->Line($xt+$r,$yl,$xr-$r,$yl);
 
// Left & Right line
$this->Line($xt,$yt+$r,$xt,$yl-$r);
$this->Line($xr,$yt+$r,$xr,$yl-$r);
 
// Topleft & Topright arc
$this->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Bottomleft & Bottomright arc
$this->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
}
 
function FilledBevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='darkgray@0.4') {
$this->FilledRectangle($x1,$y1,$x2,$y2);
$this->Bevel($x1,$y1,$x2,$y2,$depth,$color1,$color2);
}
 
function Bevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='black@0.5') {
$this->PushColor($color1);
for( $i=0; $i < $depth; ++$i ) {
$this->Line($x1+$i,$y1+$i,$x1+$i,$y2-$i);
$this->Line($x1+$i,$y1+$i,$x2-$i,$y1+$i);
}
$this->PopColor();
 
$this->PushColor($color2);
for( $i=0; $i < $depth; ++$i ) {
$this->Line($x1+$i,$y2-$i,$x2-$i,$y2-$i);
$this->Line($x2-$i,$y1+$i,$x2-$i,$y2-$i-1);
}
$this->PopColor();
}
 
function StyleLineTo($x,$y) {
$this->StyleLine($this->lastx,$this->lasty,$x,$y);
$this->lastx=$x;
$this->lasty=$y;
}
 
function LineTo($x,$y) {
$this->Line($this->lastx,$this->lasty,$x,$y);
$this->lastx=$x;
$this->lasty=$y;
}
 
function Point($x,$y) {
imagesetpixel($this->img,round($x),round($y),$this->current_color);
}
 
function Fill($x,$y) {
imagefill($this->img,round($x),round($y),$this->current_color);
}
 
function FillToBorder($x,$y,$aBordColor) {
$bc = $this->rgb->allocate($aBordColor);
if( $bc == -1 ) {
JpGraphError::RaiseL(25106);//('Image::FillToBorder : Can not allocate more colors');
}
imagefilltoborder($this->img,round($x),round($y),$bc,$this->current_color);
}
 
function SetExpired($aFlg=true) {
$this->expired = $aFlg;
}
 
// Generate image header
function Headers() {
 
// In case we are running from the command line with the client version of
// PHP we can't send any headers.
$sapi = php_sapi_name();
if( $sapi == 'cli' ) return;
 
// These parameters are set by headers_sent() but they might cause
// an undefined variable error unless they are initilized
$file='';
$lineno='';
if( headers_sent($file,$lineno) ) {
$file=basename($file);
$t = new ErrMsgText();
$msg = $t->Get(10,$file,$lineno);
die($msg);
}
 
if ($this->expired) {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
}
header("Content-type: image/$this->img_format");
}
 
// Adjust image quality for formats that allow this
function SetQuality($q) {
$this->quality = $q;
}
 
// Stream image to browser or to file
function Stream($aFile="") {
$func="image".$this->img_format;
if( $this->img_format=="jpeg" && $this->quality != null ) {
$res = @$func($this->img,$aFile,$this->quality);
}
else {
if( $aFile != "" ) {
$res = @$func($this->img,$aFile);
if( !$res ) {
JpGraphError::RaiseL(25107,$aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission.");
}
}
else {
$res = @$func($this->img);
if( !$res ) {
JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.");
}
 
}
}
}
 
// Clear resources used by image (this is normally not used since all resources are/should be
// returned when the script terminates
function Destroy() {
imagedestroy($this->img);
}
 
// Specify image format. Note depending on your installation
// of PHP not all formats may be supported.
function SetImgFormat($aFormat,$aQuality=75) {
$this->quality = $aQuality;
$aFormat = strtolower($aFormat);
$tst = true;
$supported = imagetypes();
if( $aFormat=="auto" ) {
if( $supported & IMG_PNG ) $this->img_format="png";
elseif( $supported & IMG_JPG ) $this->img_format="jpeg";
elseif( $supported & IMG_GIF ) $this->img_format="gif";
elseif( $supported & IMG_WBMP ) $this->img_format="wbmp";
elseif( $supported & IMG_XPM ) $this->img_format="xpm";
else {
JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.");
}
return true;
}
else {
if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) {
if( $aFormat=="jpeg" && !($supported & IMG_JPG) ) $tst=false;
elseif( $aFormat=="png" && !($supported & IMG_PNG) ) $tst=false;
elseif( $aFormat=="gif" && !($supported & IMG_GIF) ) $tst=false;
elseif( $aFormat=="wbmp" && !($supported & IMG_WBMP) ) $tst=false;
elseif( $aFormat=="xpm" && !($supported & IMG_XPM) ) $tst=false;
else {
$this->img_format=$aFormat;
return true;
}
}
else {
$tst=false;
}
if( !$tst ) {
JpGraphError::RaiseL(25110,$aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat");
}
}
}
} // CLASS
 
//===================================================
// CLASS RotImage
// Description: Exactly as Image but draws the image at
// a specified angle around a specified rotation point.
//===================================================
class RotImage extends Image {
public $a=0;
public $dx=0,$dy=0,$transx=0,$transy=0;
private $m=array();
 
function __construct($aWidth,$aHeight,$a=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) {
parent::__construct($aWidth,$aHeight,$aFormat,$aSetAutoMargin);
$this->dx=$this->left_margin+$this->plotwidth/2;
$this->dy=$this->top_margin+$this->plotheight/2;
$this->SetAngle($a);
}
 
function SetCenter($dx,$dy) {
$old_dx = $this->dx;
$old_dy = $this->dy;
$this->dx=$dx;
$this->dy=$dy;
$this->SetAngle($this->a);
return array($old_dx,$old_dy);
}
 
function SetTranslation($dx,$dy) {
$old = array($this->transx,$this->transy);
$this->transx = $dx;
$this->transy = $dy;
return $old;
}
 
function UpdateRotMatrice() {
$a = $this->a;
$a *= M_PI/180;
$sa=sin($a); $ca=cos($a);
// Create the rotation matrix
$this->m[0][0] = $ca;
$this->m[0][1] = -$sa;
$this->m[0][2] = $this->dx*(1-$ca) + $sa*$this->dy ;
$this->m[1][0] = $sa;
$this->m[1][1] = $ca;
$this->m[1][2] = $this->dy*(1-$ca) - $sa*$this->dx ;
}
 
function SetAngle($a) {
$tmp = $this->a;
$this->a = $a;
$this->UpdateRotMatrice();
return $tmp;
}
 
function Circle($xc,$yc,$r) {
list($xc,$yc) = $this->Rotate($xc,$yc);
parent::Circle($xc,$yc,$r);
}
 
function FilledCircle($xc,$yc,$r) {
list($xc,$yc) = $this->Rotate($xc,$yc);
parent::FilledCircle($xc,$yc,$r);
}
 
 
function Arc($xc,$yc,$w,$h,$s,$e) {
list($xc,$yc) = $this->Rotate($xc,$yc);
$s += $this->a;
$e += $this->a;
parent::Arc($xc,$yc,$w,$h,$s,$e);
}
 
function FilledArc($xc,$yc,$w,$h,$s,$e,$style='') {
list($xc,$yc) = $this->Rotate($xc,$yc);
$s += $this->a;
$e += $this->a;
parent::FilledArc($xc,$yc,$w,$h,$s,$e);
}
 
function SetMargin($lm,$rm,$tm,$bm) {
parent::SetMargin($lm,$rm,$tm,$bm);
$this->dx=$this->left_margin+$this->plotwidth/2;
$this->dy=$this->top_margin+$this->plotheight/2;
$this->UpdateRotMatrice();
}
 
function Rotate($x,$y) {
// Optimization. Ignore rotation if Angle==0 || Angle==360
if( $this->a == 0 || $this->a == 360 ) {
return array($x + $this->transx, $y + $this->transy );
}
else {
$x1=round($this->m[0][0]*$x + $this->m[0][1]*$y,1) + $this->m[0][2] + $this->transx;
$y1=round($this->m[1][0]*$x + $this->m[1][1]*$y,1) + $this->m[1][2] + $this->transy;
return array($x1,$y1);
}
}
 
function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) {
list($toX,$toY) = $this->Rotate($toX,$toY);
parent::CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight,$aMix);
 
}
 
function ArrRotate($pnts) {
$n = count($pnts)-1;
for($i=0; $i < $n; $i+=2) {
list ($x,$y) = $this->Rotate($pnts[$i],$pnts[$i+1]);
$pnts[$i] = $x; $pnts[$i+1] = $y;
}
return $pnts;
}
 
function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) {
list($x1,$y1) = $this->Rotate($x1,$y1);
list($x2,$y2) = $this->Rotate($x2,$y2);
parent::DashedLine($x1,$y1,$x2,$y2,$dash_length,$dash_space);
}
 
function Line($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->Rotate($x1,$y1);
list($x2,$y2) = $this->Rotate($x2,$y2);
parent::Line($x1,$y1,$x2,$y2);
}
 
function Rectangle($x1,$y1,$x2,$y2) {
// Rectangle uses Line() so it will be rotated through that call
parent::Rectangle($x1,$y1,$x2,$y2);
}
 
function FilledRectangle($x1,$y1,$x2,$y2) {
if( $y1==$y2 || $x1==$x2 )
$this->Line($x1,$y1,$x2,$y2);
else
$this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2));
}
 
function Polygon($pnts,$closed=FALSE,$fast=FALSE) {
// Polygon uses Line() so it will be rotated through that call unless
// fast drawing routines are used in which case a rotate is needed
if( $fast ) {
parent::Polygon($this->ArrRotate($pnts));
}
else {
parent::Polygon($pnts,$closed,$fast);
}
}
 
function FilledPolygon($pnts) {
parent::FilledPolygon($this->ArrRotate($pnts));
}
 
function Point($x,$y) {
list($xp,$yp) = $this->Rotate($x,$y);
parent::Point($xp,$yp);
}
 
function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) {
list($xp,$yp) = $this->Rotate($x,$y);
return parent::StrokeText($xp,$yp,$txt,$dir,$paragraph_align,$debug);
}
}
 
//=======================================================================
// CLASS ImgStreamCache
// Description: Handle caching of graphs to files. All image output goes
// through this class
//=======================================================================
class ImgStreamCache {
private $cache_dir, $timeout=0; // Infinite timeout
//---------------
// CONSTRUCTOR
function __construct($aCacheDir=CACHE_DIR) {
$this->cache_dir = $aCacheDir;
}
 
//---------------
// PUBLIC METHODS
 
// Specify a timeout (in minutes) for the file. If the file is older then the
// timeout value it will be overwritten with a newer version.
// If timeout is set to 0 this is the same as infinite large timeout and if
// timeout is set to -1 this is the same as infinite small timeout
function SetTimeout($aTimeout) {
$this->timeout=$aTimeout;
}
 
// Output image to browser and also write it to the cache
function PutAndStream($aImage,$aCacheFileName,$aInline,$aStrokeFileName) {
 
// Check if we should always stroke the image to a file
if( _FORCE_IMGTOFILE ) {
$aStrokeFileName = _FORCE_IMGDIR.GenImgName();
}
 
if( $aStrokeFileName != '' ) {
 
if( $aStrokeFileName == 'auto' ) {
$aStrokeFileName = GenImgName();
}
 
if( file_exists($aStrokeFileName) ) {
 
// Wait for lock (to make sure no readers are trying to access the image)
$fd = fopen($aStrokeFileName,'w');
$lock = flock($fd, LOCK_EX);
 
// Since the image write routines only accepts a filename which must not
// exist we need to delete the old file first
if( !@unlink($aStrokeFileName) ) {
$lock = flock($fd, LOCK_UN);
JpGraphError::RaiseL(25111,$aStrokeFileName);
//(" Can't delete cached image $aStrokeFileName. Permission problem?");
}
$aImage->Stream($aStrokeFileName);
$lock = flock($fd, LOCK_UN);
fclose($fd);
 
}
else {
$aImage->Stream($aStrokeFileName);
}
 
return;
}
 
if( $aCacheFileName != '' && USE_CACHE) {
 
$aCacheFileName = $this->cache_dir . $aCacheFileName;
if( file_exists($aCacheFileName) ) {
if( !$aInline ) {
// If we are generating image off-line (just writing to the cache)
// and the file exists and is still valid (no timeout)
// then do nothing, just return.
$diff=time()-filemtime($aCacheFileName);
if( $diff < 0 ) {
JpGraphError::RaiseL(25112,$aCacheFileName);
//(" Cached imagefile ($aCacheFileName) has file date in the future!!");
}
if( $this->timeout>0 && ($diff <= $this->timeout*60) ) return;
}
 
// Wait for lock (to make sure no readers are trying to access the image)
$fd = fopen($aCacheFileName,'w');
$lock = flock($fd, LOCK_EX);
 
if( !@unlink($aCacheFileName) ) {
$lock = flock($fd, LOCK_UN);
JpGraphError::RaiseL(25113,$aStrokeFileName);
//(" Can't delete cached image $aStrokeFileName. Permission problem?");
}
$aImage->Stream($aCacheFileName);
$lock = flock($fd, LOCK_UN);
fclose($fd);
 
}
else {
$this->MakeDirs(dirname($aCacheFileName));
if( !is_writeable(dirname($aCacheFileName)) ) {
JpGraphError::RaiseL(25114,$aCacheFileName);
//('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.');
}
$aImage->Stream($aCacheFileName);
}
 
$res=true;
// Set group to specified
if( CACHE_FILE_GROUP != '' ) {
$res = @chgrp($aCacheFileName,CACHE_FILE_GROUP);
}
if( CACHE_FILE_MOD != '' ) {
$res = @chmod($aCacheFileName,CACHE_FILE_MOD);
}
if( !$res ) {
JpGraphError::RaiseL(25115,$aStrokeFileName);
//(" Can't set permission for cached image $aStrokeFileName. Permission problem?");
}
 
$aImage->Destroy();
if( $aInline ) {
if ($fh = @fopen($aCacheFileName, "rb") ) {
$aImage->Headers();
fpassthru($fh);
return;
}
else {
JpGraphError::RaiseL(25116,$aFile);//(" Cant open file from cache [$aFile]");
}
}
}
elseif( $aInline ) {
$aImage->Headers();
$aImage->Stream();
return;
}
}
 
function IsValid($aCacheFileName) {
$aCacheFileName = $this->cache_dir.$aCacheFileName;
if ( USE_CACHE && file_exists($aCacheFileName) ) {
$diff=time()-filemtime($aCacheFileName);
if( $this->timeout>0 && ($diff > $this->timeout*60) ) {
return false;
}
else {
return true;
}
}
else {
return false;
}
}
 
function StreamImgFile($aImage,$aCacheFileName) {
$aCacheFileName = $this->cache_dir.$aCacheFileName;
if ( $fh = @fopen($aCacheFileName, 'rb') ) {
$lock = flock($fh, LOCK_SH);
$aImage->Headers();
fpassthru($fh);
$lock = flock($fh, LOCK_UN);
fclose($fh);
return true;
}
else {
JpGraphError::RaiseL(25117,$aCacheFileName);//(" Can't open cached image \"$aCacheFileName\" for reading.");
}
}
 
// Check if a given image is in cache and in that case
// pass it directly on to web browser. Return false if the
// image file doesn't exist or exists but is to old
function GetAndStream($aImage,$aCacheFileName) {
if( $this->Isvalid($aCacheFileName) ) {
$this->StreamImgFile($aImage,$aCacheFileName);
}
else {
return false;
}
}
 
//---------------
// PRIVATE METHODS
// Create all necessary directories in a path
function MakeDirs($aFile) {
$dirs = array();
// In order to better work when open_basedir is enabled
// we do not create directories in the root path
while ( $aFile != '/' && !(file_exists($aFile)) ) {
$dirs[] = $aFile.'/';
$aFile = dirname($aFile);
}
for ($i = sizeof($dirs)-1; $i>=0; $i--) {
if(! @mkdir($dirs[$i],0777) ) {
JpGraphError::RaiseL(25118,$aFile);//(" Can't create directory $aFile. Make sure PHP has write permission to this directory.");
}
// We also specify mode here after we have changed group.
// This is necessary if Apache user doesn't belong the
// default group and hence can't specify group permission
// in the previous mkdir() call
if( CACHE_FILE_GROUP != "" ) {
$res=true;
$res =@chgrp($dirs[$i],CACHE_FILE_GROUP);
$res = @chmod($dirs[$i],0777);
if( !$res ) {
JpGraphError::RaiseL(25119,$aFile);//(" Can't set permissions for $aFile. Permission problems?");
}
}
}
return true;
}
} // CLASS Cache
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_flags.php
New file
0,0 → 1,376
<?php
//=======================================================================
// File: JPGRAPH_FLAGS.PHP
// Description: Class Jpfile. Handles plotmarks
// Created: 2003-06-28
// Ver: $Id: jpgraph_flags.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
//------------------------------------------------------------
// Defines for the different basic sizes of flags
//------------------------------------------------------------
DEFINE('FLAGSIZE1',1);
DEFINE('FLAGSIZE2',2);
DEFINE('FLAGSIZE3',3);
DEFINE('FLAGSIZE4',4);
 
class FlagImages {
 
public $iCountryNameMap = array(
'Afghanistan' => 'afgh',
'Republic of Angola' => 'agla',
'Republic of Albania' => 'alba',
'Alderney' => 'alde',
'Democratic and Popular Republic of Algeria' => 'alge',
'Territory of American Samoa' => 'amsa',
'Principality of Andorra' => 'andr',
'British Overseas Territory of Anguilla' => 'angu',
'Antarctica' => 'anta',
'Argentine Republic' => 'arge',
'League of Arab States' => 'arle',
'Republic of Armenia' => 'arme',
'Aruba' => 'arub',
'Commonwealth of Australia' => 'astl',
'Republic of Austria' => 'aust',
'Azerbaijani Republic' => 'azer',
'Bangladesh' => 'bngl',
'British Antarctic Territory' => 'bant',
'Kingdom of Belgium' => 'belg',
'British Overseas Territory of Bermuda' => 'berm',
'Commonwealth of the Bahamas' => 'bhms',
'Kingdom of Bahrain' => 'bhrn',
'Republic of Belarus' => 'blru',
'Republic of Bolivia' => 'blva',
'Belize' => 'blze',
'Republic of Benin' => 'bnin',
'Republic of Botswana' => 'bots',
'Federative Republic of Brazil' => 'braz',
'Barbados' => 'brbd',
'British Indian Ocean Territory' => 'brin',
'Brunei Darussalam' => 'brun',
'Republic of Burkina' => 'bufa',
'Republic of Bulgaria' => 'bulg',
'Republic of Burundi' => 'buru',
'Overseas Territory of the British Virgin Islands' => 'bvis',
'Central African Republic' => 'cafr',
'Kingdom of Cambodia' => 'camb',
'Republic of Cameroon' => 'came',
'Dominion of Canada' => 'cana',
'Caribbean Community' => 'cari',
'Republic of Cape Verde' => 'cave',
'Republic of Chad' => 'chad',
'Republic of Chile' => 'chil',
'Peoples Republic of China' => 'chin',
'Territory of Christmas Island' => 'chms',
'Commonwealth of Independent States' => 'cins',
'Cook Islands' => 'ckis',
'Republic of Colombia' => 'clmb',
'Territory of Cocos Islands' => 'cois',
'Commonwealth' => 'comn',
'Union of the Comoros' => 'como',
'Republic of the Congo' => 'cong',
'Republic of Costa Rica' => 'corc',
'Republic of Croatia' => 'croa',
'Republic of Cuba' => 'cuba',
'British Overseas Territory of the Cayman Islands' => 'cyis',
'Republic of Cyprus' => 'cypr',
'The Czech Republic' => 'czec',
'Kingdom of Denmark' => 'denm',
'Republic of Djibouti' => 'djib',
'Commonwealth of Dominica' => 'domn',
'Dominican Republic' => 'dore',
'Republic of Ecuador' => 'ecua',
'Arab Republic of Egypt' => 'egyp',
'Republic of El Salvador' => 'elsa',
'England' => 'engl',
'Republic of Equatorial Guinea' => 'eqgu',
'State of Eritrea' => 'erit',
'Republic of Estonia' => 'estn',
'Ethiopia' => 'ethp',
'European Union' => 'euun',
'British Overseas Territory of the Falkland Islands' => 'fais',
'International Federation of Vexillological Associations' => 'fiav',
'Republic of Fiji' => 'fiji',
'Republic of Finland' => 'finl',
'Territory of French Polynesia' => 'fpol',
'French Republic' => 'fran',
'Overseas Department of French Guiana' => 'frgu',
'Gabonese Republic' => 'gabn',
'Republic of the Gambia' => 'gamb',
'Republic of Georgia' => 'geor',
'Federal Republic of Germany' => 'germ',
'Republic of Ghana' => 'ghan',
'Gibraltar' => 'gibr',
'Hellenic Republic' => 'grec',
'State of Grenada' => 'gren',
'Overseas Department of Guadeloupe' => 'guad',
'Territory of Guam' => 'guam',
'Republic of Guatemala' => 'guat',
'The Bailiwick of Guernsey' => 'guer',
'Republic of Guinea' => 'guin',
'Republic of Haiti' => 'hait',
'Hong Kong Special Administrative Region' => 'hokn',
'Republic of Honduras' => 'hond',
'Republic of Hungary' => 'hung',
'Republic of Iceland' => 'icel',
'International Committee of the Red Cross' => 'icrc',
'Republic of India' => 'inda',
'Republic of Indonesia' => 'indn',
'Republic of Iraq' => 'iraq',
'Republic of Ireland' => 'irel',
'Organization of the Islamic Conference' => 'isco',
'Isle of Man' => 'isma',
'State of Israel' => 'isra',
'Italian Republic' => 'ital',
'Jamaica' => 'jama',
'Japan' => 'japa',
'The Bailiwick of Jersey' => 'jers',
'Hashemite Kingdom of Jordan' => 'jord',
'Republic of Kazakhstan' => 'kazk',
'Republic of Kenya' => 'keny',
'Republic of Kiribati' => 'kirb',
'State of Kuwait' => 'kuwa',
'Kyrgyz Republic' => 'kyrg',
'Republic of Latvia' => 'latv',
'Lebanese Republic' => 'leba',
'Kingdom of Lesotho' => 'lest',
'Republic of Liberia' => 'libe',
'Principality of Liechtenstein' => 'liec',
'Republic of Lithuania' => 'lith',
'Grand Duchy of Luxembourg' => 'luxe',
'Macao Special Administrative Region' => 'maca',
'Republic of Macedonia' => 'mace',
'Republic of Madagascar' => 'mada',
'Republic of the Marshall Islands' => 'mais',
'Republic of Mali' => 'mali',
'Federation of Malaysia' => 'mals',
'Republic of Malta' => 'malt',
'Republic of Malawi' => 'malw',
'Overseas Department of Martinique' => 'mart',
'Islamic Republic of Mauritania' => 'maur',
'Territorial Collectivity of Mayotte' => 'mayt',
'United Mexican States' => 'mexc',
'Federated States of Micronesia' => 'micr',
'Midway Islands' => 'miis',
'Republic of Moldova' => 'mold',
'Principality of Monaco' => 'mona',
'Republic of Mongolia' => 'mong',
'British Overseas Territory of Montserrat' => 'mont',
'Kingdom of Morocco' => 'morc',
'Republic of Mozambique' => 'moza',
'Republic of Mauritius' => 'mrts',
'Union of Myanmar' => 'myan',
'Republic of Namibia' => 'namb',
'North Atlantic Treaty Organization' => 'nato',
'Republic of Nauru' => 'naur',
'Turkish Republic of Northern Cyprus' => 'ncyp',
'Netherlands Antilles' => 'nean',
'Kingdom of Nepal' => 'nepa',
'Kingdom of the Netherlands' => 'neth',
'Territory of Norfolk Island' => 'nfis',
'Federal Republic of Nigeria' => 'ngra',
'Republic of Nicaragua' => 'nica',
'Republic of Niger' => 'nigr',
'Niue' => 'niue',
'Commonwealth of the Northern Mariana Islands' => 'nmar',
'Province of Northern Ireland' => 'noir',
'Nordic Council' => 'nord',
'Kingdom of Norway' => 'norw',
'Territory of New Caledonia and Dependencies' => 'nwca',
'New Zealand' => 'nwze',
'Organization of American States' => 'oast',
'Organization of African Unity' => 'oaun',
'International Olympic Committee' => 'olym',
'Sultanate of Oman' => 'oman',
'Islamic Republic of Pakistan' => 'paks',
'Republic of Palau' => 'pala',
'Independent State of Papua New Guinea' => 'pang',
'Republic of Paraguay' => 'para',
'Republic of Peru' => 'peru',
'Republic of the Philippines' => 'phil',
'British Overseas Territory of the Pitcairn Islands' => 'piis',
'Republic of Poland' => 'pola',
'Republic of Portugal' => 'port',
'Commonwealth of Puerto Rico' => 'purc',
'State of Qatar' => 'qata',
'Russian Federation' => 'russ',
'Romania' => 'rmna',
'Republic of Rwanda' => 'rwan',
'Kingdom of Saudi Arabia' => 'saar',
'Republic of San Marino' => 'sama',
'Nordic Sami Conference' => 'sami',
'Sark' => 'sark',
'Scotland' => 'scot',
'Principality of Seborga' => 'sebo',
'Republic of Serbia' => 'serb',
'Republic of Sierra Leone' => 'sile',
'Republic of Singapore' => 'sing',
'Republic of Korea' => 'skor',
'Republic of Slovenia' => 'slva',
'Somali Republic' => 'smla',
'Republic of Somaliland' => 'smld',
'Republic of South Africa' => 'soaf',
'Solomon Islands' => 'sois',
'Kingdom of Spain' => 'span',
'Secretariat of the Pacific Community' => 'spco',
'Democratic Socialist Republic of Sri Lanka' => 'srla',
'Saint Lucia' => 'stlu',
'Republic of the Sudan' => 'suda',
'Republic of Suriname' => 'surn',
'Slovak Republic' => 'svka',
'Kingdom of Sweden' => 'swdn',
'Swiss Confederation' => 'swit',
'Syrian Arab Republic' => 'syra',
'Kingdom of Swaziland' => 'szld',
'Republic of China' => 'taiw',
'Taiwan' => 'taiw',
'Republic of Tajikistan' => 'tajk',
'United Republic of Tanzania' => 'tanz',
'Kingdom of Thailand' => 'thal',
'Autonomous Region of Tibet' => 'tibe',
'Turkmenistan' => 'tkst',
'Togolese Republic' => 'togo',
'Tokelau' => 'toke',
'Kingdom of Tonga' => 'tong',
'Tristan da Cunha' => 'trdc',
'Tromelin' => 'tris',
'Republic of Tunisia' => 'tuns',
'Republic of Turkey' => 'turk',
'Tuvalu' => 'tuva',
'United Arab Emirates' => 'uaem',
'Republic of Uganda' => 'ugan',
'Ukraine' => 'ukrn',
'United Kingdom of Great Britain' => 'unkg',
'United Nations' => 'unna',
'United States of America' => 'unst',
'Oriental Republic of Uruguay' => 'urgy',
'Virgin Islands of the United States' => 'usvs',
'Republic of Uzbekistan' => 'uzbk',
'State of the Vatican City' => 'vacy',
'Republic of Vanuatu' => 'vant',
'Bolivarian Republic of Venezuela' => 'venz',
'Republic of Yemen' => 'yemn',
'Democratic Republic of Congo' => 'zare',
'Republic of Zimbabwe' => 'zbwe' ) ;
 
 
private $iFlagCount = -1;
private $iFlagSetMap = array(
FLAGSIZE1 => 'flags_thumb35x35',
FLAGSIZE2 => 'flags_thumb60x60',
FLAGSIZE3 => 'flags_thumb100x100',
FLAGSIZE4 => 'flags'
);
 
private $iFlagData ;
private $iOrdIdx=array();
 
function FlagImages($aSize=FLAGSIZE1) {
switch($aSize) {
case FLAGSIZE1 :
case FLAGSIZE2 :
case FLAGSIZE3 :
case FLAGSIZE4 :
$file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat';
$fp = fopen($file,'rb');
$rawdata = fread($fp,filesize($file));
$this->iFlagData = unserialize($rawdata);
break;
default:
JpGraphError::RaiseL(5001,$aSize);
//('Unknown flag size. ('.$aSize.')');
}
$this->iFlagCount = count($this->iCountryNameMap);
}
 
function GetNum() {
return $this->iFlagCount;
}
 
function GetImgByName($aName,&$outFullName) {
$idx = $this->GetIdxByName($aName,$outFullName);
return $this->GetImgByIdx($idx);
}
 
function GetImgByIdx($aIdx) {
if( array_key_exists($aIdx,$this->iFlagData) ) {
$d = $this->iFlagData[$aIdx][1];
return Image::CreateFromString($d);
}
else {
JpGraphError::RaiseL(5002,$aIdx);
//("Flag index \"�$aIdx\" does not exist.");
}
}
 
function GetIdxByOrdinal($aOrd,&$outFullName) {
$aOrd--;
$n = count($this->iOrdIdx);
if( $n == 0 ) {
reset($this->iCountryNameMap);
$this->iOrdIdx=array();
$i=0;
while( list($key,$val) = each($this->iCountryNameMap) ) {
$this->iOrdIdx[$i++] = array($val,$key);
}
$tmp=$this->iOrdIdx[$aOrd];
$outFullName = $tmp[1];
return $tmp[0];
}
elseif( $aOrd >= 0 && $aOrd < $n ) {
$tmp=$this->iOrdIdx[$aOrd];
$outFullName = $tmp[1];
return $tmp[0];
}
else {
JpGraphError::RaiseL(5003,$aOrd);
//('Invalid ordinal number specified for flag index.');
}
}
 
function GetIdxByName($aName,&$outFullName) {
 
if( is_integer($aName) ) {
$idx = $this->GetIdxByOrdinal($aName,$outFullName);
return $idx;
}
 
$found=false;
$aName = strtolower($aName);
$nlen = strlen($aName);
reset($this->iCountryNameMap);
// Start by trying to match exact index name
while( list($key,$val) = each($this->iCountryNameMap) ) {
if( $nlen == strlen($val) && $val == $aName ) {
$found=true;
break;
}
}
if( !$found ) {
reset($this->iCountryNameMap);
// If the exact index doesn't work try a (partial) full name
while( list($key,$val) = each($this->iCountryNameMap) ) {
if( strpos(strtolower($key), $aName) !== false ) {
$found=true;
break;
}
}
}
if( $found ) {
$outFullName = $key;
return $val;
}
else {
JpGraphError::RaiseL(5004,$aName);
//("The (partial) country name \"$aName\" does not have a cooresponding flag image. The flag may still exist but under another name, e.g. insted of \"usa\" try \"united states\".");
}
}
}
 
 
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_antispam-digits.php
New file
0,0 → 1,205
<?php
//=======================================================================
// File: JPGRAPH_ANTISPAM.PHP
// Description: Genarate anti-spam challenge
// Created: 2004-10-07
// Ver: $Id: jpgraph_antispam-digits.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class HandDigits {
public $digits = array();
public $iHeight=30, $iWidth=30;
 
function __construct() {
//==========================================================
// d6-small.jpg
//==========================================================
$this->digits['6'][0]= 645 ;
$this->digits['6'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'.
'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'.
'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'.
'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'.
'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'.
'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'.
'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ;
 
//==========================================================
// d2-small.jpg
//==========================================================
$this->digits['2'][0]= 606 ;
$this->digits['2'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'.
'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'.
'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'.
'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'.
'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'.
'7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'.
'DLZ6f//Z' ;
 
//==========================================================
// d9-small.jpg
//==========================================================
$this->digits['9'][0]= 680 ;
$this->digits['9'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'.
'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'.
'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'.
'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'.
'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'.
'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'.
'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'.
'1V1//9k=' ;
 
//==========================================================
// d5-small.jpg
//==========================================================
$this->digits['5'][0]= 632 ;
$this->digits['5'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'.
'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'.
'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'.
'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'.
'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'.
'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'.
'8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ;
 
//==========================================================
// d1-small.jpg
//==========================================================
$this->digits['1'][0]= 646 ;
$this->digits['1'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'.
'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'.
'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'.
'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'.
'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'.
'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'.
'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ;
 
//==========================================================
// d8-small.jpg
//==========================================================
$this->digits['8'][0]= 694 ;
$this->digits['8'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'.
'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'.
'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'.
'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'.
'44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'.
'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'.
'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'.
'EylmLHQltptPZKQOBo1FzH//2Q==' ;
 
//==========================================================
// d4-small.jpg
//==========================================================
$this->digits['4'][0]= 643 ;
$this->digits['4'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'.
'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'.
'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'.
'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'.
'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'.
'27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'.
'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ;
 
//==========================================================
// d7-small.jpg
//==========================================================
$this->digits['7'][0]= 658 ;
$this->digits['7'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'.
'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'.
'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'.
'19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'.
'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'.
'8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'.
'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ;
 
//==========================================================
// d3-small.jpg
//==========================================================
$this->digits['3'][0]= 662 ;
$this->digits['3'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'.
'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'.
'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'.
'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'.
'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'.
'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'.
'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ;
}
}
 
class AntiSpam {
 
var $iNumber='';
 
function __construct($aNumber='') {
$this->iNumber = $aNumber;
}
 
function Rand($aLen) {
$d='';
for($i=0; $i < $aLen; ++$i) {
$d .= rand(1,9);
}
$this->iNumber = $d;
return $d;
}
 
function Stroke() {
 
$n=strlen($this->iNumber);
for($i=0; $i < $n; ++$i ) {
if( !is_numeric($this->iNumber[$i]) || $this->iNumber[$i]==0 ) {
return false;
}
}
 
$dd = new HandDigits();
$n = strlen($this->iNumber);
$img = @imagecreatetruecolor($n*$dd->iWidth, $dd->iHeight);
if( $img < 1 ) {
return false;
}
$start=0;
for($i=0; $i < $n; ++$i ) {
$size = $dd->digits[$this->iNumber[$i]][0];
$dimg = imagecreatefromstring(base64_decode($dd->digits[$this->iNumber[$i]][1]));
imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $dd->iHeight);
$start += imagesx($dimg);
}
$resimg = @imagecreatetruecolor($start+4, $dd->iHeight+4);
if( $resimg < 1 ) {
return false;
}
imagecopy($resimg,$img,2,2,0,0,$start, $dd->iHeight);
header("Content-type: image/jpeg");
imagejpeg($resimg);
return true;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_gb2312.php
New file
0,0 → 1,1552
<?php
//=======================================================================
// File: JPGRAPH_GB2312.PHP
// Description: Chinese font conversions
// Created: 2003-05-30
// Ver: $Id: jpgraph_gb2312.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
class GB2312toUTF8 {
// --------------------------------------------------------------------
// This code table is used to translate GB2312 code (key) to
// it's corresponding Unicode value (data)
// --------------------------------------------------------------------
private $codetable = array(
8481 => 12288, 8482 => 12289, 8483 => 12290, 8484 => 12539, 8485 => 713,
8486 => 711, 8487 => 168, 8488 => 12291, 8489 => 12293, 8490 => 8213,
8491 => 65374, 8492 => 8214, 8493 => 8230, 8494 => 8216, 8495 => 8217,
8496 => 8220, 8497 => 8221, 8498 => 12308, 8499 => 12309, 8500 => 12296,
8501 => 12297, 8502 => 12298, 8503 => 12299, 8504 => 12300, 8505 => 12301,
8506 => 12302, 8507 => 12303, 8508 => 12310, 8509 => 12311, 8510 => 12304,
8511 => 12305, 8512 => 177, 8513 => 215, 8514 => 247, 8515 => 8758,
8516 => 8743, 8517 => 8744, 8518 => 8721, 8519 => 8719, 8520 => 8746,
8521 => 8745, 8522 => 8712, 8523 => 8759, 8524 => 8730, 8525 => 8869,
8526 => 8741, 8527 => 8736, 8528 => 8978, 8529 => 8857, 8530 => 8747,
8531 => 8750, 8532 => 8801, 8533 => 8780, 8534 => 8776, 8535 => 8765,
8536 => 8733, 8537 => 8800, 8538 => 8814, 8539 => 8815, 8540 => 8804,
8541 => 8805, 8542 => 8734, 8543 => 8757, 8544 => 8756, 8545 => 9794,
8546 => 9792, 8547 => 176, 8548 => 8242, 8549 => 8243, 8550 => 8451,
8551 => 65284, 8552 => 164, 8553 => 65504, 8554 => 65505, 8555 => 8240,
8556 => 167, 8557 => 8470, 8558 => 9734, 8559 => 9733, 8560 => 9675,
8561 => 9679, 8562 => 9678, 8563 => 9671, 8564 => 9670, 8565 => 9633,
8566 => 9632, 8567 => 9651, 8568 => 9650, 8569 => 8251, 8570 => 8594,
8571 => 8592, 8572 => 8593, 8573 => 8595, 8574 => 12307, 8753 => 9352,
8754 => 9353, 8755 => 9354, 8756 => 9355, 8757 => 9356, 8758 => 9357,
8759 => 9358, 8760 => 9359, 8761 => 9360, 8762 => 9361, 8763 => 9362,
8764 => 9363, 8765 => 9364, 8766 => 9365, 8767 => 9366, 8768 => 9367,
8769 => 9368, 8770 => 9369, 8771 => 9370, 8772 => 9371, 8773 => 9332,
8774 => 9333, 8775 => 9334, 8776 => 9335, 8777 => 9336, 8778 => 9337,
8779 => 9338, 8780 => 9339, 8781 => 9340, 8782 => 9341, 8783 => 9342,
8784 => 9343, 8785 => 9344, 8786 => 9345, 8787 => 9346, 8788 => 9347,
8789 => 9348, 8790 => 9349, 8791 => 9350, 8792 => 9351, 8793 => 9312,
8794 => 9313, 8795 => 9314, 8796 => 9315, 8797 => 9316, 8798 => 9317,
8799 => 9318, 8800 => 9319, 8801 => 9320, 8802 => 9321, 8805 => 12832,
8806 => 12833, 8807 => 12834, 8808 => 12835, 8809 => 12836, 8810 => 12837,
8811 => 12838, 8812 => 12839, 8813 => 12840, 8814 => 12841, 8817 => 8544,
8818 => 8545, 8819 => 8546, 8820 => 8547, 8821 => 8548, 8822 => 8549,
8823 => 8550, 8824 => 8551, 8825 => 8552, 8826 => 8553, 8827 => 8554,
8828 => 8555, 8993 => 65281, 8994 => 65282, 8995 => 65283, 8996 => 65509,
8997 => 65285, 8998 => 65286, 8999 => 65287, 9000 => 65288, 9001 => 65289,
9002 => 65290, 9003 => 65291, 9004 => 65292, 9005 => 65293, 9006 => 65294,
9007 => 65295, 9008 => 65296, 9009 => 65297, 9010 => 65298, 9011 => 65299,
9012 => 65300, 9013 => 65301, 9014 => 65302, 9015 => 65303, 9016 => 65304,
9017 => 65305, 9018 => 65306, 9019 => 65307, 9020 => 65308, 9021 => 65309,
9022 => 65310, 9023 => 65311, 9024 => 65312, 9025 => 65313, 9026 => 65314,
9027 => 65315, 9028 => 65316, 9029 => 65317, 9030 => 65318, 9031 => 65319,
9032 => 65320, 9033 => 65321, 9034 => 65322, 9035 => 65323, 9036 => 65324,
9037 => 65325, 9038 => 65326, 9039 => 65327, 9040 => 65328, 9041 => 65329,
9042 => 65330, 9043 => 65331, 9044 => 65332, 9045 => 65333, 9046 => 65334,
9047 => 65335, 9048 => 65336, 9049 => 65337, 9050 => 65338, 9051 => 65339,
9052 => 65340, 9053 => 65341, 9054 => 65342, 9055 => 65343, 9056 => 65344,
9057 => 65345, 9058 => 65346, 9059 => 65347, 9060 => 65348, 9061 => 65349,
9062 => 65350, 9063 => 65351, 9064 => 65352, 9065 => 65353, 9066 => 65354,
9067 => 65355, 9068 => 65356, 9069 => 65357, 9070 => 65358, 9071 => 65359,
9072 => 65360, 9073 => 65361, 9074 => 65362, 9075 => 65363, 9076 => 65364,
9077 => 65365, 9078 => 65366, 9079 => 65367, 9080 => 65368, 9081 => 65369,
9082 => 65370, 9083 => 65371, 9084 => 65372, 9085 => 65373, 9086 => 65507,
9249 => 12353, 9250 => 12354, 9251 => 12355, 9252 => 12356, 9253 => 12357,
9254 => 12358, 9255 => 12359, 9256 => 12360, 9257 => 12361, 9258 => 12362,
9259 => 12363, 9260 => 12364, 9261 => 12365, 9262 => 12366, 9263 => 12367,
9264 => 12368, 9265 => 12369, 9266 => 12370, 9267 => 12371, 9268 => 12372,
9269 => 12373, 9270 => 12374, 9271 => 12375, 9272 => 12376, 9273 => 12377,
9274 => 12378, 9275 => 12379, 9276 => 12380, 9277 => 12381, 9278 => 12382,
9279 => 12383, 9280 => 12384, 9281 => 12385, 9282 => 12386, 9283 => 12387,
9284 => 12388, 9285 => 12389, 9286 => 12390, 9287 => 12391, 9288 => 12392,
9289 => 12393, 9290 => 12394, 9291 => 12395, 9292 => 12396, 9293 => 12397,
9294 => 12398, 9295 => 12399, 9296 => 12400, 9297 => 12401, 9298 => 12402,
9299 => 12403, 9300 => 12404, 9301 => 12405, 9302 => 12406, 9303 => 12407,
9304 => 12408, 9305 => 12409, 9306 => 12410, 9307 => 12411, 9308 => 12412,
9309 => 12413, 9310 => 12414, 9311 => 12415, 9312 => 12416, 9313 => 12417,
9314 => 12418, 9315 => 12419, 9316 => 12420, 9317 => 12421, 9318 => 12422,
9319 => 12423, 9320 => 12424, 9321 => 12425, 9322 => 12426, 9323 => 12427,
9324 => 12428, 9325 => 12429, 9326 => 12430, 9327 => 12431, 9328 => 12432,
9329 => 12433, 9330 => 12434, 9331 => 12435, 9505 => 12449, 9506 => 12450,
9507 => 12451, 9508 => 12452, 9509 => 12453, 9510 => 12454, 9511 => 12455,
9512 => 12456, 9513 => 12457, 9514 => 12458, 9515 => 12459, 9516 => 12460,
9517 => 12461, 9518 => 12462, 9519 => 12463, 9520 => 12464, 9521 => 12465,
9522 => 12466, 9523 => 12467, 9524 => 12468, 9525 => 12469, 9526 => 12470,
9527 => 12471, 9528 => 12472, 9529 => 12473, 9530 => 12474, 9531 => 12475,
9532 => 12476, 9533 => 12477, 9534 => 12478, 9535 => 12479, 9536 => 12480,
9537 => 12481, 9538 => 12482, 9539 => 12483, 9540 => 12484, 9541 => 12485,
9542 => 12486, 9543 => 12487, 9544 => 12488, 9545 => 12489, 9546 => 12490,
9547 => 12491, 9548 => 12492, 9549 => 12493, 9550 => 12494, 9551 => 12495,
9552 => 12496, 9553 => 12497, 9554 => 12498, 9555 => 12499, 9556 => 12500,
9557 => 12501, 9558 => 12502, 9559 => 12503, 9560 => 12504, 9561 => 12505,
9562 => 12506, 9563 => 12507, 9564 => 12508, 9565 => 12509, 9566 => 12510,
9567 => 12511, 9568 => 12512, 9569 => 12513, 9570 => 12514, 9571 => 12515,
9572 => 12516, 9573 => 12517, 9574 => 12518, 9575 => 12519, 9576 => 12520,
9577 => 12521, 9578 => 12522, 9579 => 12523, 9580 => 12524, 9581 => 12525,
9582 => 12526, 9583 => 12527, 9584 => 12528, 9585 => 12529, 9586 => 12530,
9587 => 12531, 9588 => 12532, 9589 => 12533, 9590 => 12534, 9761 => 913,
9762 => 914, 9763 => 915, 9764 => 916, 9765 => 917, 9766 => 918,
9767 => 919, 9768 => 920, 9769 => 921, 9770 => 922, 9771 => 923,
9772 => 924, 9773 => 925, 9774 => 926, 9775 => 927, 9776 => 928,
9777 => 929, 9778 => 931, 9779 => 932, 9780 => 933, 9781 => 934,
9782 => 935, 9783 => 936, 9784 => 937, 9793 => 945, 9794 => 946,
9795 => 947, 9796 => 948, 9797 => 949, 9798 => 950, 9799 => 951,
9800 => 952, 9801 => 953, 9802 => 954, 9803 => 955, 9804 => 956,
9805 => 957, 9806 => 958, 9807 => 959, 9808 => 960, 9809 => 961,
9810 => 963, 9811 => 964, 9812 => 965, 9813 => 966, 9814 => 967,
9815 => 968, 9816 => 969, 10017 => 1040, 10018 => 1041, 10019 => 1042,
10020 => 1043, 10021 => 1044, 10022 => 1045, 10023 => 1025, 10024 => 1046,
10025 => 1047, 10026 => 1048, 10027 => 1049, 10028 => 1050, 10029 => 1051,
10030 => 1052, 10031 => 1053, 10032 => 1054, 10033 => 1055, 10034 => 1056,
10035 => 1057, 10036 => 1058, 10037 => 1059, 10038 => 1060, 10039 => 1061,
10040 => 1062, 10041 => 1063, 10042 => 1064, 10043 => 1065, 10044 => 1066,
10045 => 1067, 10046 => 1068, 10047 => 1069, 10048 => 1070, 10049 => 1071,
10065 => 1072, 10066 => 1073, 10067 => 1074, 10068 => 1075, 10069 => 1076,
10070 => 1077, 10071 => 1105, 10072 => 1078, 10073 => 1079, 10074 => 1080,
10075 => 1081, 10076 => 1082, 10077 => 1083, 10078 => 1084, 10079 => 1085,
10080 => 1086, 10081 => 1087, 10082 => 1088, 10083 => 1089, 10084 => 1090,
10085 => 1091, 10086 => 1092, 10087 => 1093, 10088 => 1094, 10089 => 1095,
10090 => 1096, 10091 => 1097, 10092 => 1098, 10093 => 1099, 10094 => 1100,
10095 => 1101, 10096 => 1102, 10097 => 1103, 10273 => 257, 10274 => 225,
10275 => 462, 10276 => 224, 10277 => 275, 10278 => 233, 10279 => 283,
10280 => 232, 10281 => 299, 10282 => 237, 10283 => 464, 10284 => 236,
10285 => 333, 10286 => 243, 10287 => 466, 10288 => 242, 10289 => 363,
10290 => 250, 10291 => 468, 10292 => 249, 10293 => 470, 10294 => 472,
10295 => 474, 10296 => 476, 10297 => 252, 10298 => 234, 10309 => 12549,
10310 => 12550, 10311 => 12551, 10312 => 12552, 10313 => 12553, 10314 => 12554,
10315 => 12555, 10316 => 12556, 10317 => 12557, 10318 => 12558, 10319 => 12559,
10320 => 12560, 10321 => 12561, 10322 => 12562, 10323 => 12563, 10324 => 12564,
10325 => 12565, 10326 => 12566, 10327 => 12567, 10328 => 12568, 10329 => 12569,
10330 => 12570, 10331 => 12571, 10332 => 12572, 10333 => 12573, 10334 => 12574,
10335 => 12575, 10336 => 12576, 10337 => 12577, 10338 => 12578, 10339 => 12579,
10340 => 12580, 10341 => 12581, 10342 => 12582, 10343 => 12583, 10344 => 12584,
10345 => 12585, 10532 => 9472, 10533 => 9473, 10534 => 9474, 10535 => 9475,
10536 => 9476, 10537 => 9477, 10538 => 9478, 10539 => 9479, 10540 => 9480,
10541 => 9481, 10542 => 9482, 10543 => 9483, 10544 => 9484, 10545 => 9485,
10546 => 9486, 10547 => 9487, 10548 => 9488, 10549 => 9489, 10550 => 9490,
10551 => 9491, 10552 => 9492, 10553 => 9493, 10554 => 9494, 10555 => 9495,
10556 => 9496, 10557 => 9497, 10558 => 9498, 10559 => 9499, 10560 => 9500,
10561 => 9501, 10562 => 9502, 10563 => 9503, 10564 => 9504, 10565 => 9505,
10566 => 9506, 10567 => 9507, 10568 => 9508, 10569 => 9509, 10570 => 9510,
10571 => 9511, 10572 => 9512, 10573 => 9513, 10574 => 9514, 10575 => 9515,
10576 => 9516, 10577 => 9517, 10578 => 9518, 10579 => 9519, 10580 => 9520,
10581 => 9521, 10582 => 9522, 10583 => 9523, 10584 => 9524, 10585 => 9525,
10586 => 9526, 10587 => 9527, 10588 => 9528, 10589 => 9529, 10590 => 9530,
10591 => 9531, 10592 => 9532, 10593 => 9533, 10594 => 9534, 10595 => 9535,
10596 => 9536, 10597 => 9537, 10598 => 9538, 10599 => 9539, 10600 => 9540,
10601 => 9541, 10602 => 9542, 10603 => 9543, 10604 => 9544, 10605 => 9545,
10606 => 9546, 10607 => 9547, 12321 => 21834, 12322 => 38463, 12323 => 22467,
12324 => 25384, 12325 => 21710, 12326 => 21769, 12327 => 21696, 12328 => 30353,
12329 => 30284, 12330 => 34108, 12331 => 30702, 12332 => 33406, 12333 => 30861,
12334 => 29233, 12335 => 38552, 12336 => 38797, 12337 => 27688, 12338 => 23433,
12339 => 20474, 12340 => 25353, 12341 => 26263, 12342 => 23736, 12343 => 33018,
12344 => 26696, 12345 => 32942, 12346 => 26114, 12347 => 30414, 12348 => 20985,
12349 => 25942, 12350 => 29100, 12351 => 32753, 12352 => 34948, 12353 => 20658,
12354 => 22885, 12355 => 25034, 12356 => 28595, 12357 => 33453, 12358 => 25420,
12359 => 25170, 12360 => 21485, 12361 => 21543, 12362 => 31494, 12363 => 20843,
12364 => 30116, 12365 => 24052, 12366 => 25300, 12367 => 36299, 12368 => 38774,
12369 => 25226, 12370 => 32793, 12371 => 22365, 12372 => 38712, 12373 => 32610,
12374 => 29240, 12375 => 30333, 12376 => 26575, 12377 => 30334, 12378 => 25670,
12379 => 20336, 12380 => 36133, 12381 => 25308, 12382 => 31255, 12383 => 26001,
12384 => 29677, 12385 => 25644, 12386 => 25203, 12387 => 33324, 12388 => 39041,
12389 => 26495, 12390 => 29256, 12391 => 25198, 12392 => 25292, 12393 => 20276,
12394 => 29923, 12395 => 21322, 12396 => 21150, 12397 => 32458, 12398 => 37030,
12399 => 24110, 12400 => 26758, 12401 => 27036, 12402 => 33152, 12403 => 32465,
12404 => 26834, 12405 => 30917, 12406 => 34444, 12407 => 38225, 12408 => 20621,
12409 => 35876, 12410 => 33502, 12411 => 32990, 12412 => 21253, 12413 => 35090,
12414 => 21093, 12577 => 34180, 12578 => 38649, 12579 => 20445, 12580 => 22561,
12581 => 39281, 12582 => 23453, 12583 => 25265, 12584 => 25253, 12585 => 26292,
12586 => 35961, 12587 => 40077, 12588 => 29190, 12589 => 26479, 12590 => 30865,
12591 => 24754, 12592 => 21329, 12593 => 21271, 12594 => 36744, 12595 => 32972,
12596 => 36125, 12597 => 38049, 12598 => 20493, 12599 => 29384, 12600 => 22791,
12601 => 24811, 12602 => 28953, 12603 => 34987, 12604 => 22868, 12605 => 33519,
12606 => 26412, 12607 => 31528, 12608 => 23849, 12609 => 32503, 12610 => 29997,
12611 => 27893, 12612 => 36454, 12613 => 36856, 12614 => 36924, 12615 => 40763,
12616 => 27604, 12617 => 37145, 12618 => 31508, 12619 => 24444, 12620 => 30887,
12621 => 34006, 12622 => 34109, 12623 => 27605, 12624 => 27609, 12625 => 27606,
12626 => 24065, 12627 => 24199, 12628 => 30201, 12629 => 38381, 12630 => 25949,
12631 => 24330, 12632 => 24517, 12633 => 36767, 12634 => 22721, 12635 => 33218,
12636 => 36991, 12637 => 38491, 12638 => 38829, 12639 => 36793, 12640 => 32534,
12641 => 36140, 12642 => 25153, 12643 => 20415, 12644 => 21464, 12645 => 21342,
12646 => 36776, 12647 => 36777, 12648 => 36779, 12649 => 36941, 12650 => 26631,
12651 => 24426, 12652 => 33176, 12653 => 34920, 12654 => 40150, 12655 => 24971,
12656 => 21035, 12657 => 30250, 12658 => 24428, 12659 => 25996, 12660 => 28626,
12661 => 28392, 12662 => 23486, 12663 => 25672, 12664 => 20853, 12665 => 20912,
12666 => 26564, 12667 => 19993, 12668 => 31177, 12669 => 39292, 12670 => 28851,
12833 => 30149, 12834 => 24182, 12835 => 29627, 12836 => 33760, 12837 => 25773,
12838 => 25320, 12839 => 38069, 12840 => 27874, 12841 => 21338, 12842 => 21187,
12843 => 25615, 12844 => 38082, 12845 => 31636, 12846 => 20271, 12847 => 24091,
12848 => 33334, 12849 => 33046, 12850 => 33162, 12851 => 28196, 12852 => 27850,
12853 => 39539, 12854 => 25429, 12855 => 21340, 12856 => 21754, 12857 => 34917,
12858 => 22496, 12859 => 19981, 12860 => 24067, 12861 => 27493, 12862 => 31807,
12863 => 37096, 12864 => 24598, 12865 => 25830, 12866 => 29468, 12867 => 35009,
12868 => 26448, 12869 => 25165, 12870 => 36130, 12871 => 30572, 12872 => 36393,
12873 => 37319, 12874 => 24425, 12875 => 33756, 12876 => 34081, 12877 => 39184,
12878 => 21442, 12879 => 34453, 12880 => 27531, 12881 => 24813, 12882 => 24808,
12883 => 28799, 12884 => 33485, 12885 => 33329, 12886 => 20179, 12887 => 27815,
12888 => 34255, 12889 => 25805, 12890 => 31961, 12891 => 27133, 12892 => 26361,
12893 => 33609, 12894 => 21397, 12895 => 31574, 12896 => 20391, 12897 => 20876,
12898 => 27979, 12899 => 23618, 12900 => 36461, 12901 => 25554, 12902 => 21449,
12903 => 33580, 12904 => 33590, 12905 => 26597, 12906 => 30900, 12907 => 25661,
12908 => 23519, 12909 => 23700, 12910 => 24046, 12911 => 35815, 12912 => 25286,
12913 => 26612, 12914 => 35962, 12915 => 25600, 12916 => 25530, 12917 => 34633,
12918 => 39307, 12919 => 35863, 12920 => 32544, 12921 => 38130, 12922 => 20135,
12923 => 38416, 12924 => 39076, 12925 => 26124, 12926 => 29462, 13089 => 22330,
13090 => 23581, 13091 => 24120, 13092 => 38271, 13093 => 20607, 13094 => 32928,
13095 => 21378, 13096 => 25950, 13097 => 30021, 13098 => 21809, 13099 => 20513,
13100 => 36229, 13101 => 25220, 13102 => 38046, 13103 => 26397, 13104 => 22066,
13105 => 28526, 13106 => 24034, 13107 => 21557, 13108 => 28818, 13109 => 36710,
13110 => 25199, 13111 => 25764, 13112 => 25507, 13113 => 24443, 13114 => 28552,
13115 => 37108, 13116 => 33251, 13117 => 36784, 13118 => 23576, 13119 => 26216,
13120 => 24561, 13121 => 27785, 13122 => 38472, 13123 => 36225, 13124 => 34924,
13125 => 25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104,
13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548,
13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204,
13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744,
13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831,
13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021,
13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815,
13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364,
13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504,
13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986,
13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607,
13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648,
13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571,
13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337,
13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162,
13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810,
13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943,
13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850,
13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913,
13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789,
13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874,
13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995,
13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419,
13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828,
13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140,
13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923,
13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169,
13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171,
13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140,
13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955,
13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285,
13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966,
13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129,
13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377,
13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443,
13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548,
13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423,
13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783,
13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011,
13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932,
13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265,
13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532,
13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072,
13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856,
13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008,
13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583,
13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993,
13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300,
13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853,
13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025,
13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746,
13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026,
13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923,
13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497,
13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563,
13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581,
13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922,
13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701,
13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534,
13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544,
13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045,
13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810,
13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346,
13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558,
13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769,
13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943,
13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799,
13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108,
14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240,
14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281,
14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718,
14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453,
14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277,
14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938,
14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775,
14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857,
14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536,
14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452,
14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439,
14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859,
14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016,
14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155,
14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911,
14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315,
14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413,
14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679,
14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014,
14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995,
14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023,
14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212,
14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613,
14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127,
14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538,
14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913,
14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178,
14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925,
14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195,
14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923,
14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705,
14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957,
14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733,
14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011,
14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684,
14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010,
14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789,
14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831,
14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685,
14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467,
14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129,
14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503,
14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815,
14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272,
14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476,
14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925,
14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916,
14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054,
14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448,
14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592,
14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191,
14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789,
14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740,
14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330,
14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829,
14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065,
14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023,
14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219,
14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085,
14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752,
14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717,
14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477,
14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627,
14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009,
14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680,
14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418,
14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203,
14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657,
14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756,
14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720,
14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946,
14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399,
14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518,
14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774,
14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946,
14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252,
15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719,
15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010,
15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576,
15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707,
15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796,
15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462,
15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970,
15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822,
15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854,
15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674,
15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935,
15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229,
15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826,
15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746,
15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249,
15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669,
15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522,
15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637,
15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749,
15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513,
15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598,
15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363,
15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034,
15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395,
15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982,
15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082,
15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426,
15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478,
15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002,
15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550,
15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362,
15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860,
15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575,
15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315,
15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943,
15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145,
15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581,
15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293,
15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558,
15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728,
15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477,
15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014,
15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047,
15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389,
15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564,
15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735,
15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509,
15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130,
15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463,
15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299,
15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028,
15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626,
15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170,
15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165,
15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105,
15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170,
15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230,
15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923,
15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048,
15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452,
15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928,
15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416,
15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061,
15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276,
15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816,
15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545,
15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030,
15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040,
15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465,
15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424,
15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367,
15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496,
15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776,
15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891,
15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994,
16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345,
16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975,
16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350,
16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968,
16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771,
16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499,
16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185,
16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811,
16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827,
16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354,
16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475,
16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391,
16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840,
16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359,
16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454,
16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719,
16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420,
16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745,
16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372,
16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193,
16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895,
16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713,
16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639,
16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572,
16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518,
16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436,
16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438,
16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013,
16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048,
16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047,
16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867,
16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400,
16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432,
16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324,
16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519,
16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782,
16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432,
16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582,
16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852,
16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604,
16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142,
16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937,
16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742,
16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769,
16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525,
16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243,
16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872,
16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967,
16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107,
16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618,
16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278,
16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725,
16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705,
16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016,
16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857,
16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534,
16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044,
16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446,
16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523,
16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860,
16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510,
16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540,
16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653,
16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459,
16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371,
16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504,
16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177,
16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746,
16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585,
16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476,
17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434,
17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475,
17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033,
17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067,
17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426,
17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725,
17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683,
17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125,
17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522,
17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809,
17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654,
17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376,
17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308,
17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391,
17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855,
17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269,
17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825,
17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193,
17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551,
17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217,
17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279,
17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126,
17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629,
17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169,
17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273,
17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819,
17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279,
17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982,
17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215,
17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287,
17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048,
17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035,
17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007,
17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700,
17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869,
17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522,
17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311,
17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288,
17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565,
17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423,
17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221,
17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957,
17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197,
17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892,
17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899,
17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062,
17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485,
17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812,
17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597,
17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472,
17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424,
17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467,
17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982,
17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957,
17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521,
17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329,
17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256,
17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842,
17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527,
17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713,
17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607,
17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305,
17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687,
17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418,
17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340,
17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050,
17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973,
17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900,
17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843,
17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166,
17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484,
18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889,
18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646,
18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422,
18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855,
18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784,
18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215,
18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865,
18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323,
18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688,
18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085,
18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878,
18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069,
18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545,
18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595,
18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378,
18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708,
18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039,
18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431,
18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623,
18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206,
18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165,
18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682,
18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228,
18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198,
18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041,
18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845,
18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527,
18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094,
18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079,
18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154,
18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570,
18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063,
18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982,
18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756,
18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200,
18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161,
18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748,
18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173,
18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635,
18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466,
18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593,
18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785,
18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719,
18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384,
18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922,
18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187,
18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705,
18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195,
18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862,
18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049,
18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022,
18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441,
18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378,
18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892,
18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260,
18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578,
18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903,
18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736,
18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503,
18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556,
18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775,
18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145,
18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457,
18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183,
18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319,
18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988,
18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045,
18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313,
18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135,
18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690,
19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335,
19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107,
19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159,
19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365,
19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643,
19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163,
19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806,
19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530,
19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460,
19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174,
19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329,
19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646,
19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101,
19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465,
19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928,
19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684,
19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561,
19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308,
19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031,
19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496,
19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987,
19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051,
19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865,
19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368,
19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439,
19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609,
19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240,
19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543,
19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319,
19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439,
19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553,
19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604,
19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549,
19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492,
19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826,
19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138,
19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192,
19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631,
19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845,
19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848,
19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538,
19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059,
19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867,
19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305,
19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799,
19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064,
19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159,
19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825,
19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684,
19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834,
19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086,
19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311,
19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351,
19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516,
19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413,
19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237,
19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361,
19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648,
19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242,
19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114,
19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302,
19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534,
19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822,
19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043,
19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916,
19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024,
19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202,
19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975,
19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505,
19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536,
19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361,
20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807,
20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479,
20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614,
20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031,
20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205,
20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239,
20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441,
20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985,
20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065,
20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569,
20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044,
20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436,
20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494,
20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237,
20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212,
20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823,
20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802,
20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177,
20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713,
20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911,
20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989,
20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115,
20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454,
20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758,
20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979,
20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184,
20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688,
20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046,
20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616,
20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673,
20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456,
20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140,
20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814,
20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055,
20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831,
20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179,
20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195,
20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880,
20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463,
20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658,
20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889,
20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844,
20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455,
20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571,
20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125,
20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411,
20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184,
20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982,
20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066,
20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957,
20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687,
20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035,
20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465,
20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110,
20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927,
20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873,
20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203,
20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195,
20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547,
20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757,
20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276,
20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469,
20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079,
20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937,
20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416,
20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310,
20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839,
20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436,
20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746,
20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476,
20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495,
20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113,
20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208,
20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992,
20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591,
21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676,
21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928,
21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918,
21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494,
21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968,
21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381,
21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951,
21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778,
21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433,
21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197,
21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673,
21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900,
21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589,
21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811,
21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764,
21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240,
21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535,
21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609,
21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185,
21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721,
21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814,
21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828,
21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219,
21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553,
21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703,
21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736,
21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080,
21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377,
21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825,
21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110,
21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286,
21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841,
21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089,
21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431,
21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419,
21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786,
21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946,
21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044,
21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900,
21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588,
21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503,
21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895,
21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234,
21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376,
21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095,
21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164,
21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277,
21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798,
21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681,
21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039,
21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299,
21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481,
21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157,
21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156,
21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192,
21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711,
21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048,
21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688,
21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528,
21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838,
21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637,
21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449,
21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432,
21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454,
21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960,
21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214,
21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806,
21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746,
21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071,
21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495,
21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024,
21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663,
21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379,
21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596,
21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103,
22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525,
22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930,
22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844,
22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540,
22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286,
22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370,
22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092,
22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258,
22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835,
22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047,
22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325,
22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030,
22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920,
22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172,
22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417,
22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481,
22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065,
22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496,
22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880,
22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341,
22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186,
22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918,
22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181,
22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846,
22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700,
22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528,
22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164,
22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043,
22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258,
22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394,
22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049,
22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275,
22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459,
22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257,
22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152,
22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316,
22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800,
22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120,
22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008,
22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829,
22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996,
22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022,
22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115,
22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164,
22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422,
22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286,
22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347,
22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043,
22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089,
22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121,
22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155,
22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193,
22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258,
22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233,
22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314,
22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285,
22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355,
22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348,
22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458,
22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433,
22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467,
22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478,
22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606,
22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588,
22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666,
22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710,
22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709,
22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718,
22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320,
22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335,
22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128,
22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149,
22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819,
22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924,
23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744,
23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765,
23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791,
23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798,
23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808,
23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824,
23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839,
23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852,
23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861,
23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869,
23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879,
23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890,
23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370,
23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442,
23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484,
23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516,
23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015,
23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025,
23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048,
23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072,
23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090,
23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103,
23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155,
23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190,
23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165,
23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232,
23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981,
23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042,
23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654,
23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316,
23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319,
23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405,
23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376,
23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436,
23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452,
23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490,
23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511,
23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541,
23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553,
23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657,
23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729,
23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423,
23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425,
23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470,
23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432,
23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473,
23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439,
23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545,
23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500,
23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531,
23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556,
23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617,
23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596,
23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583,
23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600,
23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587,
23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641,
23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712,
23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706,
23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718,
23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688,
23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729,
23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816,
23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820,
23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759,
23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770,
23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761,
23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907,
23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912,
23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932,
23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997,
23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994,
23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977,
23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060,
23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079,
23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044,
24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142,
24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171,
24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169,
24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231,
24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303,
24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364,
24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823,
24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586,
24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194,
24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303,
24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419,
24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466,
24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482,
24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592,
24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550,
24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665,
24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638,
24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750,
24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786,
24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826,
24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530,
24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501,
24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526,
24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588,
24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593,
24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623,
24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636,
24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677,
24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670,
24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717,
24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722,
24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725,
24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792,
24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795,
24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863,
24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825,
24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815,
24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811,
24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891,
24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919,
24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983,
24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994,
24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995,
24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956,
24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964,
24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756,
24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052,
24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061,
24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093,
24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100,
24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139,
24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228,
24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251,
24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281,
24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081,
24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132,
24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692,
24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688,
24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708,
24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723,
24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748,
24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810,
24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844,
24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870,
24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919,
24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913,
24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955,
24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450,
24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473,
24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508,
24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364,
24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390,
24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417,
24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427,
24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459,
25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461,
25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496,
25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536,
25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821,
25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271,
25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276,
25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300,
25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313,
25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209,
25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249,
25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274,
25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210,
25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579,
25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574,
25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568,
25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591,
25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639,
25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698,
25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730,
25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716,
25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797,
25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864,
25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832,
25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004,
25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077,
25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385,
25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398,
25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410,
25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418,
25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426,
25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732,
25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792,
25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764,
25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860,
25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863,
25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883,
25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902,
25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976,
25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947,
25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983,
25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015,
25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052,
25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186,
25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095,
25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121,
25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203,
25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255,
25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197,
25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384,
25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349,
25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367,
25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486,
25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463,
25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425,
25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536,
25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617,
25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641,
25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698,
25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751,
25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443,
25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652,
25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423,
25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837,
25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851,
25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902,
25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917,
25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945,
25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962,
25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994,
25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407,
25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632,
25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700,
25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380,
25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925,
25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986,
26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962,
26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046,
26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033,
26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057,
26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114,
26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004,
26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230,
26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224,
26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270,
26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318,
26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580,
26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379,
26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546,
26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557,
26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571,
26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581,
26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589,
26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421,
26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446,
26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459,
26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475,
26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494,
26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502,
26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514,
26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524,
26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537,
26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546,
26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551,
26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559,
26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565,
26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013,
26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599,
26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619,
26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657,
26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662,
26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787,
26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742,
26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788,
26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805,
26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825,
26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865,
26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890,
26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462,
26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474,
26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536,
26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492,
26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601,
26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586,
26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552,
26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674,
26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722,
26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709,
26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686,
26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767,
26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818,
26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873,
26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967,
26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976,
26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008,
26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015,
26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979,
26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051,
26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082,
26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135,
26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237,
26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216,
26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197,
26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280,
26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522,
26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538,
26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553,
26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722,
26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727,
26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737,
27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749,
27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558,
27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122,
27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255,
27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969,
27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096,
27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133,
27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164,
27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207,
27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209,
27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279,
27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342,
27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155,
27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168,
27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185,
27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278,
27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343,
27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311,
27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330,
27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816,
27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637,
27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661,
27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681,
27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909,
27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270,
27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924,
27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945,
27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999,
27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962,
27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384,
27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005,
27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389,
27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068,
27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107,
27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120,
27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127,
27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169,
27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406,
27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428,
27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481,
27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129,
27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315,
27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054,
27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066,
27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829,
27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849,
27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950,
27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032,
27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050,
27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088,
27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213,
27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113,
27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161,
27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067,
27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063,
27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109,
27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529,
27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679,
27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838,
27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035,
27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795,
27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720,
27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027,
27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778,
27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764,
27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806,
27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796,
27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855,
27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905,
27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956,
28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012,
28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699,
28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457,
28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489,
28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544,
28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568,
28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589,
28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624,
28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016,
28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066,
28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607,
28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633,
28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866,
28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026,
28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036,
28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044,
28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061,
28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068,
28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074,
28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088,
28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093,
28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101,
28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107,
28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116,
28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121,
28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132,
28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141,
28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151,
28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159,
28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166,
28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175,
28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188,
28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199,
28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210,
28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217,
28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227,
28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233,
28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241,
28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247,
28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252,
28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202,
28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213,
28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235,
28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287,
28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344,
28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918,
28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488,
28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498,
28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505,
28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516,
28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523,
28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535,
28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547,
28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554,
28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563,
28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109,
28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136,
28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146,
28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182,
28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193,
28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213,
28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232,
28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242,
28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271,
28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285,
28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315,
28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353,
28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398,
28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411,
28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943,
28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004,
29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045,
29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070,
29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099,
29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137,
29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386,
29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790,
29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806,
29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779,
29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850,
29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040,
29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055,
29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071,
29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381,
29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426,
29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443,
29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474,
29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485,
29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479,
29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545,
29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579,
29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513,
29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570,
29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590,
29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632,
29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623,
29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683,
29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699,
29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649,
29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770,
29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711,
29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741,
29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769,
29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784,
29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826,
29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566,
29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482,
29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509,
29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544,
29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520,
29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518,
29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564,
29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586,
29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655,
29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621,
29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668,
29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706,
29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742,
29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775,
29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808,
29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260,
29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325,
29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339,
29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353,
29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384,
29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039,
29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687,
29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889,
29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922,
29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948,
29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976,
29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725,
29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750,
29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174,
29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211,
29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199,
29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200,
29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217,
29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246,
29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253,
29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283,
30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301,
30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280,
30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277,
30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310,
30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303,
30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344,
30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361,
30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396,
30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416,
30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425,
30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426,
30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468,
30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508,
30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973,
30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294,
30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311,
30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643,
30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671,
30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718,
30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839,
30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702,
30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589,
30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518,
30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834,
30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066,
30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267,
30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082,
30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094,
30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099,
30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105,
30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113,
30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118,
30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125,
30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138,
30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143,
30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151,
30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159,
30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802,
30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834,
30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536,
30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616,
30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633,
30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752,
30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214,
30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654,
30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673,
30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715,
30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583,
30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605,
30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672,
30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677,
30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751,
30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772,
0 => 0 );
 
function gb2utf8($gb) {
if( !trim($gb) ) return $gb;
$utf8='';
while($gb) {
if( ord(substr($gb,0,1)) > 127 ) {
$t=substr($gb,0,2);
$gb=substr($gb,2);
$utf8 .= $this->u2utf8($this->codetable[hexdec(bin2hex($t))-0x8080]);
}
else {
$t=substr($gb,0,1);
$gb=substr($gb,1);
$utf8 .= $this->u2utf8($t);
}
}
return $utf8;
}
 
function u2utf8($c) {
$str='';
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return $str;
}
 
} // END Class
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_plotmark.inc.php
New file
0,0 → 1,504
<?php
//=======================================================================
// File: JPGRAPH_PLOTMARK.PHP
// Description: Class file. Handles plotmarks
// Created: 2003-03-21
// Ver: $Id: jpgraph_plotmark.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//===================================================
// CLASS PlotMark
// Description: Handles the plot marks in graphs
//===================================================
 
class PlotMark {
public $title, $show=true;
public $type,$weight=1;
public $iFormatCallback="", $iFormatCallback2="";
public $fill_color="blue";
public $color="black", $width=4;
private $yvalue,$xvalue='',$csimtarget,$csimwintarget='',$csimalt,$csimareas;
private $markimg='',$iScale=1.0;
private $oldfilename='',$iFileName='';
private $imgdata_balls = null;
private $imgdata_diamonds = null;
private $imgdata_squares = null;
private $imgdata_bevels = null;
private $imgdata_stars = null;
private $imgdata_pushpins = null;
 
//--------------
// CONSTRUCTOR
function __construct() {
$this->title = new Text();
$this->title->Hide();
$this->csimareas = '';
$this->type=-1;
}
//---------------
// PUBLIC METHODS
function SetType($aType,$aFileName='',$aScale=1.0) {
$this->type = $aType;
if( $aType == MARK_IMG && $aFileName=='' ) {
JpGraphError::RaiseL(23003);//('A filename must be specified if you set the mark type to MARK_IMG.');
}
$this->iFileName = $aFileName;
$this->iScale = $aScale;
}
 
function SetCallback($aFunc) {
$this->iFormatCallback = $aFunc;
}
 
function SetCallbackYX($aFunc) {
$this->iFormatCallback2 = $aFunc;
}
 
function GetType() {
return $this->type;
}
 
function SetColor($aColor) {
$this->color=$aColor;
}
 
function SetFillColor($aFillColor) {
$this->fill_color = $aFillColor;
}
 
function SetWeight($aWeight) {
$this->weight = $aWeight;
}
 
// Synonym for SetWidth()
function SetSize($aWidth) {
$this->width=$aWidth;
}
 
function SetWidth($aWidth) {
$this->width=$aWidth;
}
 
function SetDefaultWidth() {
switch( $this->type ) {
case MARK_CIRCLE:
case MARK_FILLEDCIRCLE:
$this->width=4;
break;
default:
$this->width=7;
}
}
 
function GetWidth() {
return $this->width;
}
 
function Hide($aHide=true) {
$this->show = !$aHide;
}
 
function Show($aShow=true) {
$this->show = $aShow;
}
 
function SetCSIMAltVal($aY,$aX='') {
$this->yvalue=$aY;
$this->xvalue=$aX;
}
 
function SetCSIMTarget($aTarget,$aWinTarget='') {
$this->csimtarget=$aTarget;
$this->csimwintarget=$aWinTarget;
}
 
function SetCSIMAlt($aAlt) {
$this->csimalt=$aAlt;
}
 
function GetCSIMAreas(){
return $this->csimareas;
}
 
function AddCSIMPoly($aPts) {
$coords = round($aPts[0]).", ".round($aPts[1]);
$n = count($aPts)/2;
for( $i=1; $i < $n; ++$i){
$coords .= ", ".round($aPts[2*$i]).", ".round($aPts[2*$i+1]);
}
$this->csimareas="";
if( !empty($this->csimtarget) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($this->csimtarget)."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\"";
}
$this->csimareas .= " />\n";
}
}
 
function AddCSIMCircle($x,$y,$r) {
$x = round($x); $y=round($y); $r=round($r);
$this->csimareas="";
if( !empty($this->csimtarget) ) {
$this->csimareas .= "<area shape=\"circle\" coords=\"$x,$y,$r\" href=\"".htmlentities($this->csimtarget)."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
function Stroke($img,$x,$y) {
if( !$this->show ) return;
 
if( $this->iFormatCallback != '' || $this->iFormatCallback2 != '' ) {
 
if( $this->iFormatCallback != '' ) {
$f = $this->iFormatCallback;
list($width,$color,$fcolor) = call_user_func($f,$this->yvalue);
$filename = $this->iFileName;
$imgscale = $this->iScale;
}
else {
$f = $this->iFormatCallback2;
list($width,$color,$fcolor,$filename,$imgscale) = call_user_func($f,$this->yvalue,$this->xvalue);
if( $filename=="" ) $filename = $this->iFileName;
if( $imgscale=="" ) $imgscale = $this->iScale;
}
 
if( $width=="" ) $width = $this->width;
if( $color=="" ) $color = $this->color;
if( $fcolor=="" ) $fcolor = $this->fill_color;
 
}
else {
$fcolor = $this->fill_color;
$color = $this->color;
$width = $this->width;
$filename = $this->iFileName;
$imgscale = $this->iScale;
}
 
if( $this->type == MARK_IMG ||
($this->type >= MARK_FLAG1 && $this->type <= MARK_FLAG4 ) ||
$this->type >= MARK_IMG_PUSHPIN ) {
 
// Note: For the builtin images we use the "filename" parameter
// to denote the color
$anchor_x = 0.5;
$anchor_y = 0.5;
switch( $this->type ) {
case MARK_FLAG1:
case MARK_FLAG2:
case MARK_FLAG3:
case MARK_FLAG4:
$this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1,$filename);
break;
 
case MARK_IMG :
// Load an image and use that as a marker
// Small optimization, if we have already read an image don't
// waste time reading it again.
if( $this->markimg == '' || !($this->oldfilename === $filename) ) {
$this->markimg = Graph::LoadBkgImage('',$filename);
$this->oldfilename = $filename ;
}
break;
 
case MARK_IMG_PUSHPIN:
case MARK_IMG_SPUSHPIN:
case MARK_IMG_LPUSHPIN:
if( $this->imgdata_pushpins == null ) {
require_once 'imgdata_pushpins.inc.php';
$this->imgdata_pushpins = new ImgData_PushPins();
}
$this->markimg = $this->imgdata_pushpins->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_pushpins->GetAnchor();
break;
 
case MARK_IMG_SQUARE:
if( $this->imgdata_squares == null ) {
require_once 'imgdata_squares.inc.php';
$this->imgdata_squares = new ImgData_Squares();
}
$this->markimg = $this->imgdata_squares->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_squares->GetAnchor();
break;
 
case MARK_IMG_STAR:
if( $this->imgdata_stars == null ) {
require_once 'imgdata_stars.inc.php';
$this->imgdata_stars = new ImgData_Stars();
}
$this->markimg = $this->imgdata_stars->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_stars->GetAnchor();
break;
 
case MARK_IMG_BEVEL:
if( $this->imgdata_bevels == null ) {
require_once 'imgdata_bevels.inc.php';
$this->imgdata_bevels = new ImgData_Bevels();
}
$this->markimg = $this->imgdata_bevels->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_bevels->GetAnchor();
break;
 
case MARK_IMG_DIAMOND:
if( $this->imgdata_diamonds == null ) {
require_once 'imgdata_diamonds.inc.php';
$this->imgdata_diamonds = new ImgData_Diamonds();
}
$this->markimg = $this->imgdata_diamonds->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_diamonds->GetAnchor();
break;
 
case MARK_IMG_BALL:
case MARK_IMG_SBALL:
case MARK_IMG_MBALL:
case MARK_IMG_LBALL:
if( $this->imgdata_balls == null ) {
require_once 'imgdata_balls.inc.php';
$this->imgdata_balls = new ImgData_Balls();
}
$this->markimg = $this->imgdata_balls->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_balls->GetAnchor();
break;
}
 
$w = $img->GetWidth($this->markimg);
$h = $img->GetHeight($this->markimg);
$dw = round($imgscale * $w );
$dh = round($imgscale * $h );
 
// Do potential rotation
list($x,$y) = $img->Rotate($x,$y);
 
$dx = round($x-$dw*$anchor_x);
$dy = round($y-$dh*$anchor_y);
$this->width = max($dx,$dy);
$img->Copy($this->markimg,$dx,$dy,0,0,$dw,$dh,$w,$h);
if( !empty($this->csimtarget) ) {
$this->csimareas = "<area shape=\"rect\" coords=\"".
$dx.','.$dy.','.round($dx+$dw).','.round($dy+$dh).'" '.
"href=\"".htmlentities($this->csimtarget)."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
// Stroke title
$this->title->Align("center","top");
$this->title->Stroke($img,$x,$y+round($dh/2));
return;
}
 
$weight = $this->weight;
$dx=round($width/2,0);
$dy=round($width/2,0);
$pts=0;
 
switch( $this->type ) {
case MARK_SQUARE:
$c[]=$x-$dx;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y-$dy;
$pts=5;
break;
case MARK_UTRIANGLE:
++$dx;++$dy;
$c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$c[]=$x;$c[]=$y-0.87*$dy;
$c[]=$x+$dx;$c[]=$y+0.87*$dy;
$c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$pts=4;
break;
case MARK_DTRIANGLE:
++$dx;++$dy;
$c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$c[]=$x-$dx;$c[]=$y-0.87*$dy;
$c[]=$x+$dx;$c[]=$y-0.87*$dy;
$c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$pts=4;
break;
case MARK_DIAMOND:
$c[]=$x;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y;
$c[]=$x;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y;
$c[]=$x;$c[]=$y+$dy;
$pts=5;
break;
case MARK_LEFTTRIANGLE:
$c[]=$x;$c[]=$y;
$c[]=$x;$c[]=$y+2*$dy;
$c[]=$x+$dx*2;$c[]=$y;
$c[]=$x;$c[]=$y;
$pts=4;
break;
case MARK_RIGHTTRIANGLE:
$c[]=$x-$dx*2;$c[]=$y;
$c[]=$x;$c[]=$y+2*$dy;
$c[]=$x;$c[]=$y;
$c[]=$x-$dx*2;$c[]=$y;
$pts=4;
break;
case MARK_FLASH:
$dy *= 2;
$c[]=$x+$dx/2; $c[]=$y-$dy;
$c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy;
$c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy;
$c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy;
$img->SetLineWeight($weight);
$img->SetColor($color);
$img->Polygon($c);
$img->SetLineWeight(1);
$this->AddCSIMPoly($c);
break;
}
 
if( $pts>0 ) {
$this->AddCSIMPoly($c);
$img->SetLineWeight($weight);
$img->SetColor($fcolor);
$img->FilledPolygon($c);
$img->SetColor($color);
$img->Polygon($c);
$img->SetLineWeight(1);
}
elseif( $this->type==MARK_CIRCLE ) {
$img->SetColor($color);
$img->Circle($x,$y,$width);
$this->AddCSIMCircle($x,$y,$width);
}
elseif( $this->type==MARK_FILLEDCIRCLE ) {
$img->SetColor($fcolor);
$img->FilledCircle($x,$y,$width);
$img->SetColor($color);
$img->Circle($x,$y,$width);
$this->AddCSIMCircle($x,$y,$width);
}
elseif( $this->type==MARK_CROSS ) {
// Oversize by a pixel to match the X
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x,$y+$dy+1,$x,$y-$dy-1);
$img->Line($x-$dx-1,$y,$x+$dx+1,$y);
$this->AddCSIMCircle($x,$y,$dx);
}
elseif( $this->type==MARK_X ) {
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
$img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
$this->AddCSIMCircle($x,$y,$dx+$dy);
}
elseif( $this->type==MARK_STAR ) {
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
$img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
// Oversize by a pixel to match the X
$img->Line($x,$y+$dy+1,$x,$y-$dy-1);
$img->Line($x-$dx-1,$y,$x+$dx+1,$y);
$this->AddCSIMCircle($x,$y,$dx+$dy);
}
 
// Stroke title
$this->title->Align("center","center");
$this->title->Stroke($img,$x,$y);
}
} // Class
 
 
 
//========================================================================
// CLASS ImgData
// Description: Base class for all image data classes that contains the
// real image data.
//========================================================================
class ImgData {
protected $name = ''; // Each subclass gives a name
protected $an = array(); // Data array names
protected $colors = array(); // Available colors
protected $index = array(); // Index for colors
protected $maxidx = 0 ; // Max color index
protected $anchor_x=0.5, $anchor_y=0.5 ; // Where is the center of the image
function __construct() {
// Empty
}
// Create a GD image from the data and return a GD handle
function GetImg($aMark,$aIdx) {
$n = $this->an[$aMark];
if( is_string($aIdx) ) {
if( !in_array($aIdx,$this->colors) ) {
JpGraphError::RaiseL(23001,$this->name,$aIdx);//('This marker "'.($this->name).'" does not exist in color: '.$aIdx);
}
$idx = $this->index[$aIdx];
}
elseif( !is_integer($aIdx) ||
(is_integer($aIdx) && $aIdx > $this->maxidx ) ) {
JpGraphError::RaiseL(23002,$this->name);//('Mark color index too large for marker "'.($this->name).'"');
}
else
$idx = $aIdx ;
return Image::CreateFromString(base64_decode($this->{$n}[$idx][1]));
}
function GetAnchor() {
return array($this->anchor_x,$this->anchor_y);
}
}
 
 
// Keep a global flag cache to reduce memory usage
$_gFlagCache=array(
1 => null,
2 => null,
3 => null,
4 => null,
);
// Only supposed to b called as statics
class FlagCache {
static function GetFlagImgByName($aSize,$aName) {
global $_gFlagCache;
require_once('jpgraph_flags.php');
if( $_gFlagCache[$aSize] === null ) {
$_gFlagCache[$aSize] = new FlagImages($aSize);
}
$f = $_gFlagCache[$aSize];
$idx = $f->GetIdxByName($aName,$aFullName);
return $f->GetImgByIdx($idx);
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_bevels.inc.php
New file
0,0 → 1,104
<?php
//=======================================================================
// File: IMGDATA_BEVELS.INC
// Description: Base64 encoded images for round bevels
// Created: 2003-03-20
// Ver: $Id: imgdata_bevels.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Bevels extends ImgData {
protected $name = 'Round Bevels';
protected $an = array(MARK_IMG_BEVEL => 'imgdata');
 
protected $colors = array('green','purple','orange','red','yellow');
protected $index = array('green'=>1,'purple'=>4,'orange'=>2,'red'=>0,'yellow'=>3);
protected $maxidx = 4 ;
 
protected $imgdata ;
 
function __construct() {
//==========================================================
// File: bullets_balls_red_013.png
//==========================================================
$this->imgdata[0][0]= 337 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'.
'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'.
'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'.
'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'.
'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'.
'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: bullets_balls_green_013.png
//==========================================================
$this->imgdata[1][0]= 344 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'.
'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'.
'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'.
'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'.
'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'.
'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'.
'VORK5CYII=' ;
 
//==========================================================
// File: bullets_balls_oy_035.png
//==========================================================
$this->imgdata[2][0]= 341 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'.
'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'.
'+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'.
'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'.
'5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'.
'9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'.
'5CYII=' ;
 
//==========================================================
// File: bullets_balls_oy_036.png
//==========================================================
$this->imgdata[3][0]= 340 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'.
'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'.
'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'.
'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'.
'4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'.
'7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'.
'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bullets_balls_pp_019.png
//==========================================================
$this->imgdata[4][0]= 334 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'.
'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'.
'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'.
'5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'.
'4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'.
'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ;
 
}
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_scatter.php
New file
0,0 → 1,242
<?php
/*=======================================================================
// File: JPGRAPH_SCATTER.PHP
// Description: Scatter (and impuls) plot extension for JpGraph
// Created: 2001-02-11
// Ver: $Id: jpgraph_scatter.php 1397 2009-06-27 21:34:14Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
require_once ('jpgraph_plotmark.inc.php');
 
//===================================================
// CLASS FieldArrow
// Description: Draw an arrow at (x,y) with angle a
//===================================================
class FieldArrow {
public $iColor='black';
public $iSize=10; // Length in pixels for arrow
public $iArrowSize = 2;
private $isizespec = array(
array(2,1),array(3,2),array(4,3),array(6,4),array(7,4),array(8,5),array(10,6),array(12,7),array(16,8),array(20,10)
);
function __construct() {
// Empty
}
 
function SetSize($aSize,$aArrowSize=2) {
$this->iSize = $aSize;
$this->iArrowSize = $aArrowSize;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function Stroke($aImg,$x,$y,$a) {
// First rotate the center coordinates
list($x,$y) = $aImg->Rotate($x,$y);
 
$old_origin = $aImg->SetCenter($x,$y);
$old_a = $aImg->a;
$aImg->SetAngle(-$a+$old_a);
 
$dx = round($this->iSize/2);
$c = array($x-$dx,$y,$x+$dx,$y);
$x += $dx;
 
list($dx,$dy) = $this->isizespec[$this->iArrowSize];
$ca = array($x,$y,$x-$dx,$y-$dy,$x-$dx,$y+$dy,$x,$y);
 
$aImg->SetColor($this->iColor);
$aImg->Polygon($c);
$aImg->FilledPolygon($ca);
 
$aImg->SetCenter($old_origin[0],$old_origin[1]);
$aImg->SetAngle($old_a);
}
}
 
//===================================================
// CLASS FieldPlot
// Description: Render a field plot
//===================================================
class FieldPlot extends Plot {
public $arrow = '';
private $iAngles = array();
private $iCallback = '';
 
function __construct($datay,$datax,$angles) {
if( (count($datax) != count($datay)) )
JpGraphError::RaiseL(20001);//("Fieldplots must have equal number of X and Y points.");
if( (count($datax) != count($angles)) )
JpGraphError::RaiseL(20002);//("Fieldplots must have an angle specified for each X and Y points.");
 
$this->iAngles = $angles;
 
parent::__construct($datay,$datax);
$this->value->SetAlign('center','center');
$this->value->SetMargin(15);
 
$this->arrow = new FieldArrow();
}
 
function SetCallback($aFunc) {
$this->iCallback = $aFunc;
}
 
function Stroke($img,$xscale,$yscale) {
 
// Remeber base color and size
$bc = $this->arrow->iColor;
$bs = $this->arrow->iSize;
$bas = $this->arrow->iArrowSize;
 
for( $i=0; $i<$this->numpoints; ++$i ) {
// Skip null values
if( $this->coords[0][$i]==="" )
continue;
 
$f = $this->iCallback;
if( $f != "" ) {
list($cc,$cs,$cas) = call_user_func($f,$this->coords[1][$i],$this->coords[0][$i],$this->iAngles[$i]);
// Fall back on global data if the callback isn't set
if( $cc == "" ) $cc = $bc;
if( $cs == "" ) $cs = $bs;
if( $cas == "" ) $cas = $bas;
$this->arrow->SetColor($cc);
$this->arrow->SetSize($cs,$cas);
}
 
$xt = $xscale->Translate($this->coords[1][$i]);
$yt = $yscale->Translate($this->coords[0][$i]);
 
$this->arrow->Stroke($img,$xt,$yt,$this->iAngles[$i]);
$this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
}
}
 
// Framework function
function Legend($aGraph) {
if( $this->legend != "" ) {
$aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
//===================================================
// CLASS ScatterPlot
// Description: Render X and Y plots
//===================================================
class ScatterPlot extends Plot {
public $mark,$link;
private $impuls = false;
//---------------
// CONSTRUCTOR
function __construct($datay,$datax=false) {
if( (count($datax) != count($datay)) && is_array($datax)) {
JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points.");
}
parent::__construct($datay,$datax);
$this->mark = new PlotMark();
$this->mark->SetType(MARK_SQUARE);
$this->mark->SetColor($this->color);
$this->value->SetAlign('center','center');
$this->value->SetMargin(0);
$this->link = new LineProperty(1,'black','solid');
$this->link->iShow = false;
}
 
//---------------
// PUBLIC METHODS
function SetImpuls($f=true) {
$this->impuls = $f;
}
 
function SetStem($f=true) {
$this->impuls = $f;
}
 
// Combine the scatter plot points with a line
function SetLinkPoints($aFlag=true,$aColor="black",$aWeight=1,$aStyle='solid') {
$this->link->iShow = $aFlag;
$this->link->iColor = $aColor;
$this->link->iWeight = $aWeight;
$this->link->iStyle = $aStyle;
}
 
function Stroke($img,$xscale,$yscale) {
 
$ymin=$yscale->scale_abs[0];
if( $yscale->scale[0] < 0 )
$yzero=$yscale->Translate(0);
else
$yzero=$yscale->scale_abs[0];
 
$this->csimareas = '';
for( $i=0; $i<$this->numpoints; ++$i ) {
 
// Skip null values
if( $this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x')
continue;
 
if( isset($this->coords[1]) )
$xt = $xscale->Translate($this->coords[1][$i]);
else
$xt = $xscale->Translate($i);
$yt = $yscale->Translate($this->coords[0][$i]);
 
 
if( $this->link->iShow && isset($yt_old) ) {
$img->SetColor($this->link->iColor);
$img->SetLineWeight($this->link->iWeight);
$old = $img->SetLineStyle($this->link->iStyle);
$img->StyleLine($xt_old,$yt_old,$xt,$yt);
$img->SetLineStyle($old);
}
 
if( $this->impuls ) {
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$img->Line($xt,$yzero,$xt,$yt);
}
 
if( !empty($this->csimtargets[$i]) ) {
if( !empty($this->csimwintargets[$i]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$i],$this->csimwintargets[$i]);
}
else {
$this->mark->SetCSIMTarget($this->csimtargets[$i]);
}
$this->mark->SetCSIMAlt($this->csimalts[$i]);
}
 
if( isset($this->coords[1]) ) {
$this->mark->SetCSIMAltVal($this->coords[0][$i],$this->coords[1][$i]);
}
else {
$this->mark->SetCSIMAltVal($this->coords[0][$i],$i);
}
 
$this->mark->Stroke($img,$xt,$yt);
 
$this->csimareas .= $this->mark->GetCSIMAreas();
$this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
 
$xt_old = $xt;
$yt_old = $yt;
}
}
 
// Framework function
function Legend($aGraph) {
if( $this->legend != "" ) {
$aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
} // Class
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_ttf.inc.php
New file
0,0 → 1,617
<?php
//=======================================================================
// File: jpgraph_ttf.inc.php
// Description: Handling of TTF fonts
// Created: 2006-11-19
// Ver: $Id: jpgraph_ttf.inc.php 1858 2009-09-28 14:39:51Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
// TTF Font families
define("FF_COURIER",10);
define("FF_VERDANA",11);
define("FF_TIMES",12);
define("FF_COMIC",14);
define("FF_ARIAL",15);
define("FF_GEORGIA",16);
define("FF_TREBUCHE",17);
 
// Gnome Vera font
// Available from http://www.gnome.org/fonts/
define("FF_VERA",18);
define("FF_VERAMONO",19);
define("FF_VERASERIF",20);
 
// Chinese font
define("FF_SIMSUN",30);
define("FF_CHINESE",31);
define("FF_BIG5",32);
 
// Japanese font
define("FF_MINCHO",40);
define("FF_PMINCHO",41);
define("FF_GOTHIC",42);
define("FF_PGOTHIC",43);
 
// Hebrew fonts
define("FF_DAVID",44);
define("FF_MIRIAM",45);
define("FF_AHRON",46);
 
// Dejavu-fonts http://sourceforge.net/projects/dejavu
define("FF_DV_SANSSERIF",47);
define("FF_DV_SERIF",48);
define("FF_DV_SANSSERIFMONO",49);
define("FF_DV_SERIFCOND",50);
define("FF_DV_SANSSERIFCOND",51);
 
// Extra fonts
// Download fonts from
// http://www.webfontlist.com
// http://www.webpagepublicity.com/free-fonts.html
// http://www.fontonic.com/fonts.asp?width=d&offset=120
// http://www.fontspace.com/category/famous
 
// define("FF_SPEEDO",71); // This font is also known as Bauer (Used for development gauge fascia)
define("FF_DIGITAL",72); // Digital readout font
define("FF_COMPUTER",73); // The classic computer font
define("FF_CALCULATOR",74); // Triad font
 
define("FF_USERFONT",90);
define("FF_USERFONT1",90);
define("FF_USERFONT2",91);
define("FF_USERFONT3",92);
 
// Limits for fonts
define("_FIRST_FONT",10);
define("_LAST_FONT",99);
 
// TTF Font styles
define("FS_NORMAL",9001);
define("FS_BOLD",9002);
define("FS_ITALIC",9003);
define("FS_BOLDIT",9004);
define("FS_BOLDITALIC",9004);
 
//Definitions for internal font
define("FF_FONT0",1);
define("FF_FONT1",2);
define("FF_FONT2",4);
 
//------------------------------------------------------------------------
// Defines for font setup
//------------------------------------------------------------------------
 
// Actual name of the TTF file used together with FF_CHINESE aka FF_BIG5
// This is the TTF file being used when the font family is specified as
// either FF_CHINESE or FF_BIG5
define('CHINESE_TTF_FONT','bkai00mp.ttf');
 
// Special unicode greek language support
define("LANGUAGE_GREEK",false);
 
// If you are setting this config to true the conversion of greek characters
// will assume that the input text is windows 1251
define("GREEK_FROM_WINDOWS",false);
 
// Special unicode cyrillic language support
define("LANGUAGE_CYRILLIC",false);
 
// If you are setting this config to true the conversion
// will assume that the input text is windows 1251, if
// false it will assume koi8-r
define("CYRILLIC_FROM_WINDOWS",false);
 
// The following constant is used to auto-detect
// whether cyrillic conversion is really necessary
// if enabled. Just replace 'windows-1251' with a variable
// containing the input character encoding string
// of your application calling jpgraph.
// A typical such string would be 'UTF-8' or 'utf-8'.
// The comparison is case-insensitive.
// If this charset is not a 'koi8-r' or 'windows-1251'
// derivate then no conversion is done.
//
// This constant can be very important in multi-user
// multi-language environments where a cyrillic conversion
// could be needed for some cyrillic people
// and resulting in just erraneous conversions
// for not-cyrillic language based people.
//
// Example: In the free project management
// software dotproject.net $locale_char_set is dynamically
// set by the language environment the user has chosen.
//
// Usage: define('LANGUAGE_CHARSET', $locale_char_set);
//
// where $locale_char_set is a GLOBAL (string) variable
// from the application including JpGraph.
//
define('LANGUAGE_CHARSET', null);
 
// Japanese TrueType font used with FF_MINCHO, FF_PMINCHO, FF_GOTHIC, FF_PGOTHIC
// Standard fonts from Infomation-technology Promotion Agency (IPA)
// See http://mix-mplus-ipa.sourceforge.jp/
define('MINCHO_TTF_FONT','ipam.ttf');
define('PMINCHO_TTF_FONT','ipamp.ttf');
define('GOTHIC_TTF_FONT','ipag.ttf');
define('PGOTHIC_TTF_FONT','ipagp.ttf');
 
// Assume that Japanese text have been entered in EUC-JP encoding.
// If this define is true then conversion from EUC-JP to UTF8 is done
// automatically in the library using the mbstring module in PHP.
define('ASSUME_EUCJP_ENCODING',false);
 
 
//=================================================================
// CLASS LanguageConv
// Description:
// Converts various character encoding into proper
// UTF-8 depending on how the library have been configured and
// what font family is being used
//=================================================================
class LanguageConv {
private $g2312 = null ;
 
function Convert($aTxt,$aFF) {
if( LANGUAGE_GREEK ) {
if( GREEK_FROM_WINDOWS ) {
$unistring = LanguageConv::gr_win2uni($aTxt);
} else {
$unistring = LanguageConv::gr_iso2uni($aTxt);
}
return $unistring;
} elseif( LANGUAGE_CYRILLIC ) {
if( CYRILLIC_FROM_WINDOWS && (!defined('LANGUAGE_CHARSET') || stristr(LANGUAGE_CHARSET, 'windows-1251')) ) {
$aTxt = convert_cyr_string($aTxt, "w", "k");
}
if( !defined('LANGUAGE_CHARSET') || stristr(LANGUAGE_CHARSET, 'koi8-r') || stristr(LANGUAGE_CHARSET, 'windows-1251')) {
$isostring = convert_cyr_string($aTxt, "k", "i");
$unistring = LanguageConv::iso2uni($isostring);
}
else {
$unistring = $aTxt;
}
return $unistring;
}
elseif( $aFF === FF_SIMSUN ) {
// Do Chinese conversion
if( $this->g2312 == null ) {
include_once 'jpgraph_gb2312.php' ;
$this->g2312 = new GB2312toUTF8();
}
return $this->g2312->gb2utf8($aTxt);
}
elseif( $aFF === FF_BIG5 ) {
if( !function_exists('iconv') ) {
JpGraphError::RaiseL(25006);
//('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).');
}
return iconv('BIG5','UTF-8',$aTxt);
}
elseif( ASSUME_EUCJP_ENCODING &&
($aFF == FF_MINCHO || $aFF == FF_GOTHIC || $aFF == FF_PMINCHO || $aFF == FF_PGOTHIC) ) {
if( !function_exists('mb_convert_encoding') ) {
JpGraphError::RaiseL(25127);
}
return mb_convert_encoding($aTxt, 'UTF-8','EUC-JP');
}
elseif( $aFF == FF_DAVID || $aFF == FF_MIRIAM || $aFF == FF_AHRON ) {
return LanguageConv::heb_iso2uni($aTxt);
}
else
return $aTxt;
}
 
// Translate iso encoding to unicode
public static function iso2uni ($isoline){
$uniline='';
for ($i=0; $i < strlen($isoline); $i++){
$thischar=substr($isoline,$i,1);
$charcode=ord($thischar);
$uniline.=($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar;
}
return $uniline;
}
 
// Translate greek iso encoding to unicode
public static function gr_iso2uni ($isoline) {
$uniline='';
for ($i=0; $i < strlen($isoline); $i++) {
$thischar=substr($isoline,$i,1);
$charcode=ord($thischar);
$uniline.=($charcode>179 && $charcode!=183 && $charcode!=187 && $charcode!=189) ? "&#" . (900+($charcode-180)). ";" : $thischar;
}
return $uniline;
}
 
// Translate greek win encoding to unicode
public static function gr_win2uni ($winline) {
$uniline='';
for ($i=0; $i < strlen($winline); $i++) {
$thischar=substr($winline,$i,1);
$charcode=ord($thischar);
if ($charcode==161 || $charcode==162) {
$uniline.="&#" . (740+$charcode). ";";
}
else {
$uniline.=(($charcode>183 && $charcode!=187 && $charcode!=189) || $charcode==180) ? "&#" . (900+($charcode-180)). ";" : $thischar;
}
}
return $uniline;
}
 
public static function heb_iso2uni($isoline) {
$isoline = hebrev($isoline);
$o = '';
 
$n = strlen($isoline);
for($i=0; $i < $n; $i++) {
$c=ord( substr($isoline,$i,1) );
$o .= ($c > 223) && ($c < 251) ? '&#'.(1264+$c).';' : chr($c);
}
return utf8_encode($o);
}
}
 
//=============================================================
// CLASS TTF
// Description: Handle TTF font names and mapping and loading of
// font files
//=============================================================
class TTF {
private $font_files,$style_names;
 
function __construct() {
 
// String names for font styles to be used in error messages
$this->style_names=array(
FS_NORMAL =>'normal',
FS_BOLD =>'bold',
FS_ITALIC =>'italic',
FS_BOLDITALIC =>'bolditalic');
 
// File names for available fonts
$this->font_files=array(
FF_COURIER => array(FS_NORMAL =>'cour.ttf',
FS_BOLD =>'courbd.ttf',
FS_ITALIC =>'couri.ttf',
FS_BOLDITALIC =>'courbi.ttf' ),
FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf',
FS_BOLD =>'georgiab.ttf',
FS_ITALIC =>'georgiai.ttf',
FS_BOLDITALIC =>'' ),
FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf',
FS_BOLD =>'trebucbd.ttf',
FS_ITALIC =>'trebucit.ttf',
FS_BOLDITALIC =>'trebucbi.ttf' ),
FF_VERDANA => array(FS_NORMAL =>'verdana.ttf',
FS_BOLD =>'verdanab.ttf',
FS_ITALIC =>'verdanai.ttf',
FS_BOLDITALIC =>'' ),
FF_TIMES => array(FS_NORMAL =>'times.ttf',
FS_BOLD =>'timesbd.ttf',
FS_ITALIC =>'timesi.ttf',
FS_BOLDITALIC =>'timesbi.ttf' ),
FF_COMIC => array(FS_NORMAL =>'comic.ttf',
FS_BOLD =>'comicbd.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_ARIAL => array(FS_NORMAL =>'arial.ttf',
FS_BOLD =>'arialbd.ttf',
FS_ITALIC =>'ariali.ttf',
FS_BOLDITALIC =>'arialbi.ttf' ) ,
FF_VERA => array(FS_NORMAL =>'Vera.ttf',
FS_BOLD =>'VeraBd.ttf',
FS_ITALIC =>'VeraIt.ttf',
FS_BOLDITALIC =>'VeraBI.ttf' ),
FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf',
FS_BOLD =>'VeraMoBd.ttf',
FS_ITALIC =>'VeraMoIt.ttf',
FS_BOLDITALIC =>'VeraMoBI.ttf' ),
FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf',
FS_BOLD =>'VeraSeBd.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ) ,
 
/* Chinese fonts */
FF_SIMSUN => array(
FS_NORMAL =>'simsun.ttc',
FS_BOLD =>'simhei.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_CHINESE => array(
FS_NORMAL =>CHINESE_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_BIG5 => array(
FS_NORMAL =>CHINESE_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Japanese fonts */
FF_MINCHO => array(
FS_NORMAL =>MINCHO_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_PMINCHO => array(
FS_NORMAL =>PMINCHO_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_GOTHIC => array(
FS_NORMAL =>GOTHIC_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_PGOTHIC => array(
FS_NORMAL =>PGOTHIC_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Hebrew fonts */
FF_DAVID => array(
FS_NORMAL =>'DAVIDNEW.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_MIRIAM => array(
FS_NORMAL =>'MRIAMY.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_AHRON => array(
FS_NORMAL =>'ahronbd.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Misc fonts */
FF_DIGITAL => array(
FS_NORMAL =>'DIGIRU__.TTF',
FS_BOLD =>'Digirtu_.ttf',
FS_ITALIC =>'Digir___.ttf',
FS_BOLDITALIC =>'DIGIRT__.TTF' ),
 
/* This is an experimental font for the speedometer development
FF_SPEEDO => array(
FS_NORMAL =>'Speedo.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
*/
 
FF_COMPUTER => array(
FS_NORMAL =>'COMPUTER.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_CALCULATOR => array(
FS_NORMAL =>'Triad_xs.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Dejavu fonts */
FF_DV_SANSSERIF => array(
FS_NORMAL =>array('DejaVuSans.ttf'),
FS_BOLD =>array('DejaVuSans-Bold.ttf','DejaVuSansBold.ttf'),
FS_ITALIC =>array('DejaVuSans-Oblique.ttf','DejaVuSansOblique.ttf'),
FS_BOLDITALIC =>array('DejaVuSans-BoldOblique.ttf','DejaVuSansBoldOblique.ttf') ),
 
FF_DV_SANSSERIFMONO => array(
FS_NORMAL =>array('DejaVuSansMono.ttf','DejaVuMonoSans.ttf'),
FS_BOLD =>array('DejaVuSansMono-Bold.ttf','DejaVuMonoSansBold.ttf'),
FS_ITALIC =>array('DejaVuSansMono-Oblique.ttf','DejaVuMonoSansOblique.ttf'),
FS_BOLDITALIC =>array('DejaVuSansMono-BoldOblique.ttf','DejaVuMonoSansBoldOblique.ttf') ),
 
FF_DV_SANSSERIFCOND => array(
FS_NORMAL =>array('DejaVuSansCondensed.ttf','DejaVuCondensedSans.ttf'),
FS_BOLD =>array('DejaVuSansCondensed-Bold.ttf','DejaVuCondensedSansBold.ttf'),
FS_ITALIC =>array('DejaVuSansCondensed-Oblique.ttf','DejaVuCondensedSansOblique.ttf'),
FS_BOLDITALIC =>array('DejaVuSansCondensed-BoldOblique.ttf','DejaVuCondensedSansBoldOblique.ttf') ),
 
FF_DV_SERIF => array(
FS_NORMAL =>array('DejaVuSerif.ttf'),
FS_BOLD =>array('DejaVuSerif-Bold.ttf','DejaVuSerifBold.ttf'),
FS_ITALIC =>array('DejaVuSerif-Italic.ttf','DejaVuSerifItalic.ttf'),
FS_BOLDITALIC =>array('DejaVuSerif-BoldItalic.ttf','DejaVuSerifBoldItalic.ttf') ),
 
FF_DV_SERIFCOND => array(
FS_NORMAL =>array('DejaVuSerifCondensed.ttf','DejaVuCondensedSerif.ttf'),
FS_BOLD =>array('DejaVuSerifCondensed-Bold.ttf','DejaVuCondensedSerifBold.ttf'),
FS_ITALIC =>array('DejaVuSerifCondensed-Italic.ttf','DejaVuCondensedSerifItalic.ttf'),
FS_BOLDITALIC =>array('DejaVuSerifCondensed-BoldItalic.ttf','DejaVuCondensedSerifBoldItalic.ttf') ),
 
 
/* Placeholders for defined fonts */
FF_USERFONT1 => array(
FS_NORMAL =>'',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_USERFONT2 => array(
FS_NORMAL =>'',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_USERFONT3 => array(
FS_NORMAL =>'',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
);
}
 
//---------------
// PUBLIC METHODS
// Create the TTF file from the font specification
function File($family,$style=FS_NORMAL) {
$fam = @$this->font_files[$family];
if( !$fam ) {
JpGraphError::RaiseL(25046,$family);//("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/");
}
$ff = @$fam[$style];
 
if( is_array($ff) ) {
// There are several optional file names. They are tried in order
// and the first one found is used
$n = count($ff);
} else {
$n = 1;
$ff = array($ff);
}
$i = 0;
do {
$f = $ff[$i];
// All font families are guaranteed to have the normal style
 
if( $f==='' )
JpGraphError::RaiseL(25047,$this->style_names[$style],$this->font_files[$family][FS_NORMAL]);//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.');
if( !$f ) {
JpGraphError::RaiseL(25048,$fam);//("Unknown font style specification [$fam].");
}
 
if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {
$f = MBTTF_DIR.$f;
} else {
$f = TTF_DIR.$f;
}
++$i;
} while( $i < $n && (file_exists($f) === false || is_readable($f) === false) );
 
if( !file_exists($f) ) {
JpGraphError::RaiseL(25049,$f);//("Font file \"$f\" is not readable or does not exist.");
}
return $f;
}
 
function SetUserFont($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->font_files[FF_USERFONT] =
array(FS_NORMAL => $aNormal,
FS_BOLD => $aBold,
FS_ITALIC => $aItalic,
FS_BOLDITALIC => $aBoldIt ) ;
}
 
function SetUserFont1($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->font_files[FF_USERFONT1] =
array(FS_NORMAL => $aNormal,
FS_BOLD => $aBold,
FS_ITALIC => $aItalic,
FS_BOLDITALIC => $aBoldIt ) ;
}
 
function SetUserFont2($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->font_files[FF_USERFONT2] =
array(FS_NORMAL => $aNormal,
FS_BOLD => $aBold,
FS_ITALIC => $aItalic,
FS_BOLDITALIC => $aBoldIt ) ;
}
 
function SetUserFont3($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->font_files[FF_USERFONT3] =
array(FS_NORMAL => $aNormal,
FS_BOLD => $aBold,
FS_ITALIC => $aItalic,
FS_BOLDITALIC => $aBoldIt ) ;
}
 
} // Class
 
 
//=============================================================================
// CLASS SymChar
// Description: Code values for some commonly used characters that
// normally isn't available directly on the keyboard, for example
// mathematical and greek symbols.
//=============================================================================
class SymChar {
static function Get($aSymb,$aCapital=FALSE) {
$iSymbols = array(
/* Greek */
array('alpha','03B1','0391'),
array('beta','03B2','0392'),
array('gamma','03B3','0393'),
array('delta','03B4','0394'),
array('epsilon','03B5','0395'),
array('zeta','03B6','0396'),
array('ny','03B7','0397'),
array('eta','03B8','0398'),
array('theta','03B8','0398'),
array('iota','03B9','0399'),
array('kappa','03BA','039A'),
array('lambda','03BB','039B'),
array('mu','03BC','039C'),
array('nu','03BD','039D'),
array('xi','03BE','039E'),
array('omicron','03BF','039F'),
array('pi','03C0','03A0'),
array('rho','03C1','03A1'),
array('sigma','03C3','03A3'),
array('tau','03C4','03A4'),
array('upsilon','03C5','03A5'),
array('phi','03C6','03A6'),
array('chi','03C7','03A7'),
array('psi','03C8','03A8'),
array('omega','03C9','03A9'),
/* Money */
array('euro','20AC'),
array('yen','00A5'),
array('pound','20A4'),
/* Math */
array('approx','2248'),
array('neq','2260'),
array('not','2310'),
array('def','2261'),
array('inf','221E'),
array('sqrt','221A'),
array('int','222B'),
/* Misc */
array('copy','00A9'),
array('para','00A7'),
array('tm','2122'), /* Trademark symbol */
array('rtm','00AE'), /* Registered trademark */
array('degree','00b0'),
array('lte','2264'), /* Less than or equal */
array('gte','2265'), /* Greater than or equal */
 
);
 
$n = count($iSymbols);
$i=0;
$found = false;
$aSymb = strtolower($aSymb);
while( $i < $n && !$found ) {
$found = $aSymb === $iSymbols[$i++][0];
}
if( $found ) {
$ca = $iSymbols[--$i];
if( $aCapital && count($ca)==3 )
$s = $ca[2];
else
$s = $ca[1];
return sprintf('&#%04d;',hexdec($s));
}
else
return '';
}
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_meshinterpolate.inc.php
New file
0,0 → 1,105
<?php
/*=======================================================================
// File: JPGRAPH_MESHINTERPOLATE.INC.PHP
// Description: Utility class to do mesh linear interpolation of a matrix
// Created: 2009-03-09
// Ver: $Id: jpgraph_meshinterpolate.inc.php 1709 2009-07-30 08:00:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
/**
* Utility function to do linear mesh interpolation
* @param $aDat Matrix to interpolate
* @param $aFactor Interpolation factor
*/
function doMeshInterpolate( &$aData, $aFactor ) {
$m = new MeshInterpolate();
$aData = $m->Linear($aData,$aFactor);
}
 
/**
* Utility class to interpolate a given data matrix
*
*/
class MeshInterpolate {
private $data = array();
 
/**
* Calculate the mid points of the given rectangle which has its top left
* corner at $row,$col. The $aFactordecides how many spliots should be done.
* i.e. how many more divisions should be done recursively
*
* @param $row Top left corner of square to work with
* @param $col Top left corner of square to work with
* $param $aFactor In how many subsquare should we split this square. A value of 1 indicates that no action
*/
function IntSquare( $aRow, $aCol, $aFactor ) {
if ( $aFactor <= 1 )
return;
 
$step = pow( 2, $aFactor-1 );
 
$v0 = $this->data[$aRow][$aCol];
$v1 = $this->data[$aRow][$aCol + $step];
$v2 = $this->data[$aRow + $step][$aCol];
$v3 = $this->data[$aRow + $step][$aCol + $step];
 
$this->data[$aRow][$aCol + $step / 2] = ( $v0 + $v1 ) / 2;
$this->data[$aRow + $step / 2][$aCol] = ( $v0 + $v2 ) / 2;
$this->data[$aRow + $step][$aCol + $step / 2] = ( $v2 + $v3 ) / 2;
$this->data[$aRow + $step / 2][$aCol + $step] = ( $v1 + $v3 ) / 2;
$this->data[$aRow + $step / 2][$aCol + $step / 2] = ( $v0 + $v1 + $v2 + $v3 ) / 4;
 
$this->IntSquare( $aRow, $aCol, $aFactor-1 );
$this->IntSquare( $aRow, $aCol + $step / 2, $aFactor-1 );
$this->IntSquare( $aRow + $step / 2, $aCol, $aFactor-1 );
$this->IntSquare( $aRow + $step / 2, $aCol + $step / 2, $aFactor-1 );
}
 
/**
* Interpolate values in a matrice so that the total number of data points
* in vert and horizontal axis are $aIntNbr more. For example $aIntNbr=2 will
* make the data matrice have tiwce as many vertical and horizontal dta points.
*
* Note: This will blow up the matrcide in memory size in the order of $aInNbr^2
*
* @param $ &$aData The original data matricde
* @param $aInNbr Interpolation factor
* @return the interpolated matrice
*/
function Linear( &$aData, $aIntFactor ) {
$step = pow( 2, $aIntFactor-1 );
 
$orig_cols = count( $aData[0] );
$orig_rows = count( $aData );
// Number of new columns/rows
// N = (a-1) * 2^(f-1) + 1
$p = pow( 2, $aIntFactor-1 );
$new_cols = $p * ( $orig_cols - 1 ) + 1;
$new_rows = $p * ( $orig_rows - 1 ) + 1;
 
$this->data = array_fill( 0, $new_rows, array_fill( 0, $new_cols, 0 ) );
// Initialize the new matrix with the values that we know
for ( $i = 0; $i < $new_rows; $i++ ) {
for ( $j = 0; $j < $new_cols; $j++ ) {
$v = 0 ;
if ( ( $i % $step == 0 ) && ( $j % $step == 0 ) ) {
$v = $aData[$i / $step][$j / $step];
}
$this->data[$i][$j] = $v;
}
}
 
for ( $i = 0; $i < $new_rows-1; $i += $step ) {
for ( $j = 0; $j < $new_cols-1; $j += $step ) {
$this->IntSquare( $i, $j, $aIntFactor );
}
}
 
return $this->data;
}
}
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_gantt.php
New file
0,0 → 1,3955
<?php
/*=======================================================================
// File: JPGRAPH_GANTT.PHP
// Description: JpGraph Gantt plot extension
// Created: 2001-11-12
// Ver: $Id: jpgraph_gantt.php 1809 2009-09-09 13:07:33Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotband.php');
require_once('jpgraph_iconplot.php');
require_once('jpgraph_plotmark.inc.php');
 
// Maximum size for Automatic Gantt chart
define('MAX_GANTTIMG_SIZE_W',8000);
define('MAX_GANTTIMG_SIZE_H',5000);
 
// Scale Header types
define("GANTT_HDAY",1);
define("GANTT_HWEEK",2);
define("GANTT_HMONTH",4);
define("GANTT_HYEAR",8);
define("GANTT_HHOUR",16);
define("GANTT_HMIN",32);
 
// Bar patterns
define("GANTT_RDIAG",BAND_RDIAG); // Right diagonal lines
define("GANTT_LDIAG",BAND_LDIAG); // Left diagonal lines
define("GANTT_SOLID",BAND_SOLID); // Solid one color
define("GANTT_VLINE",BAND_VLINE); // Vertical lines
define("GANTT_HLINE",BAND_HLINE); // Horizontal lines
define("GANTT_3DPLANE",BAND_3DPLANE); // "3D" Plane
define("GANTT_HVCROSS",BAND_HVCROSS); // Vertical/Hor crosses
define("GANTT_DIAGCROSS",BAND_DIAGCROSS); // Diagonal crosses
 
// Conversion constant
define("SECPERDAY",3600*24);
 
// Locales. ONLY KEPT FOR BACKWARDS COMPATIBILITY
// You should use the proper locale strings directly
// from now on.
define("LOCALE_EN","en_UK");
define("LOCALE_SV","sv_SE");
 
// Layout of bars
define("GANTT_EVEN",1);
define("GANTT_FROMTOP",2);
 
// Style for minute header
define("MINUTESTYLE_MM",0); // 15
define("MINUTESTYLE_CUSTOM",2); // Custom format
 
 
// Style for hour header
define("HOURSTYLE_HM24",0); // 13:10
define("HOURSTYLE_HMAMPM",1); // 1:10pm
define("HOURSTYLE_H24",2); // 13
define("HOURSTYLE_HAMPM",3); // 1pm
define("HOURSTYLE_CUSTOM",4); // User defined
 
// Style for day header
define("DAYSTYLE_ONELETTER",0); // "M"
define("DAYSTYLE_LONG",1); // "Monday"
define("DAYSTYLE_LONGDAYDATE1",2); // "Monday 23 Jun"
define("DAYSTYLE_LONGDAYDATE2",3); // "Monday 23 Jun 2003"
define("DAYSTYLE_SHORT",4); // "Mon"
define("DAYSTYLE_SHORTDAYDATE1",5); // "Mon 23/6"
define("DAYSTYLE_SHORTDAYDATE2",6); // "Mon 23 Jun"
define("DAYSTYLE_SHORTDAYDATE3",7); // "Mon 23"
define("DAYSTYLE_SHORTDATE1",8); // "23/6"
define("DAYSTYLE_SHORTDATE2",9); // "23 Jun"
define("DAYSTYLE_SHORTDATE3",10); // "Mon 23"
define("DAYSTYLE_SHORTDATE4",11); // "23"
define("DAYSTYLE_CUSTOM",12); // "M"
 
// Styles for week header
define("WEEKSTYLE_WNBR",0);
define("WEEKSTYLE_FIRSTDAY",1);
define("WEEKSTYLE_FIRSTDAY2",2);
define("WEEKSTYLE_FIRSTDAYWNBR",3);
define("WEEKSTYLE_FIRSTDAY2WNBR",4);
 
// Styles for month header
define("MONTHSTYLE_SHORTNAME",0);
define("MONTHSTYLE_LONGNAME",1);
define("MONTHSTYLE_LONGNAMEYEAR2",2);
define("MONTHSTYLE_SHORTNAMEYEAR2",3);
define("MONTHSTYLE_LONGNAMEYEAR4",4);
define("MONTHSTYLE_SHORTNAMEYEAR4",5);
define("MONTHSTYLE_FIRSTLETTER",6);
 
 
// Types of constrain links
define('CONSTRAIN_STARTSTART',0);
define('CONSTRAIN_STARTEND',1);
define('CONSTRAIN_ENDSTART',2);
define('CONSTRAIN_ENDEND',3);
 
// Arrow direction for constrain links
define('ARROW_DOWN',0);
define('ARROW_UP',1);
define('ARROW_LEFT',2);
define('ARROW_RIGHT',3);
 
// Arrow type for constrain type
define('ARROWT_SOLID',0);
define('ARROWT_OPEN',1);
 
// Arrow size for constrain lines
define('ARROW_S1',0);
define('ARROW_S2',1);
define('ARROW_S3',2);
define('ARROW_S4',3);
define('ARROW_S5',4);
 
// Activity types for use with utility method CreateSimple()
define('ACTYPE_NORMAL',0);
define('ACTYPE_GROUP',1);
define('ACTYPE_MILESTONE',2);
 
define('ACTINFO_3D',1);
define('ACTINFO_2D',0);
 
 
// Check if array_fill() exists
if (!function_exists('array_fill')) {
function array_fill($iStart, $iLen, $vValue) {
$aResult = array();
for ($iCount = $iStart; $iCount < $iLen + $iStart; $iCount++) {
$aResult[$iCount] = $vValue;
}
return $aResult;
}
}
 
//===================================================
// CLASS GanttActivityInfo
// Description:
//===================================================
class GanttActivityInfo {
public $iShow=true;
public $iLeftColMargin=4,$iRightColMargin=1,$iTopColMargin=1,$iBottomColMargin=3;
public $vgrid = null;
private $iColor='black';
private $iBackgroundColor='lightgray';
private $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10,$iFontColor='black';
private $iTitles=array();
private $iWidth=array(),$iHeight=-1;
private $iTopHeaderMargin = 4;
private $iStyle=1;
private $iHeaderAlign='center';
 
function __construct() {
$this->vgrid = new LineProperty();
}
 
function Hide($aF=true) {
$this->iShow=!$aF;
}
 
function Show($aF=true) {
$this->iShow=$aF;
}
 
// Specify font
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
 
function SetColumnMargin($aLeft,$aRight) {
$this->iLeftColMargin = $aLeft;
$this->iRightColMargin = $aRight;
}
 
function SetFontColor($aFontColor) {
$this->iFontColor = $aFontColor;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetBackgroundColor($aColor) {
$this->iBackgroundColor = $aColor;
}
 
function SetColTitles($aTitles,$aWidth=null) {
$this->iTitles = $aTitles;
$this->iWidth = $aWidth;
}
 
function SetMinColWidth($aWidths) {
$n = min(count($this->iTitles),count($aWidths));
for($i=0; $i < $n; ++$i ) {
if( !empty($aWidths[$i]) ) {
if( empty($this->iWidth[$i]) ) {
$this->iWidth[$i] = $aWidths[$i];
}
else {
$this->iWidth[$i] = max($this->iWidth[$i],$aWidths[$i]);
}
}
}
}
 
function GetWidth($aImg) {
$txt = new TextProperty();
$txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$n = count($this->iTitles) ;
$rm=$this->iRightColMargin;
$w = 0;
for($h=0, $i=0; $i < $n; ++$i ) {
$w += $this->iLeftColMargin;
$txt->Set($this->iTitles[$i]);
if( !empty($this->iWidth[$i]) ) {
$w1 = max($txt->GetWidth($aImg)+$rm,$this->iWidth[$i]);
}
else {
$w1 = $txt->GetWidth($aImg)+$rm;
}
$this->iWidth[$i] = $w1;
$w += $w1;
$h = max($h,$txt->GetHeight($aImg));
}
$this->iHeight = $h+$this->iTopHeaderMargin;
$txt='';
return $w;
}
 
function GetColStart($aImg,&$aStart,$aAddLeftMargin=false) {
$n = count($this->iTitles) ;
$adj = $aAddLeftMargin ? $this->iLeftColMargin : 0;
$aStart=array($aImg->left_margin+$adj);
for( $i=1; $i < $n; ++$i ) {
$aStart[$i] = $aStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1];
}
}
 
// Adjust headers left, right or centered
function SetHeaderAlign($aAlign) {
$this->iHeaderAlign=$aAlign;
}
 
function Stroke($aImg,$aXLeft,$aYTop,$aXRight,$aYBottom,$aUseTextHeight=false) {
 
if( !$this->iShow ) return;
 
$txt = new TextProperty();
$txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$txt->SetColor($this->iFontColor);
$txt->SetAlign($this->iHeaderAlign,'top');
$n=count($this->iTitles);
 
if( $n == 0 )
return;
 
$x = $aXLeft;
$h = $this->iHeight;
$yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ;
 
if( $h < 0 ) {
JpGraphError::RaiseL(6001);
//('Internal error. Height for ActivityTitles is < 0');
}
 
$aImg->SetLineWeight(1);
// Set background color
$aImg->SetColor($this->iBackgroundColor);
$aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1);
 
if( $this->iStyle == 1 ) {
// Make a 3D effect
$aImg->SetColor('white');
$aImg->Line($aXLeft,$yTop+1,$aXRight,$yTop+1);
}
 
for($i=0; $i < $n; ++$i ) {
if( $this->iStyle == 1 ) {
// Make a 3D effect
$aImg->SetColor('white');
$aImg->Line($x+1,$yTop,$x+1,$aYBottom);
}
$x += $this->iLeftColMargin;
$txt->Set($this->iTitles[$i]);
 
// Adjust the text anchor position according to the choosen alignment
$xp = $x;
if( $this->iHeaderAlign == 'center' ) {
$xp = (($x-$this->iLeftColMargin)+($x+$this->iWidth[$i]))/2;
}
elseif( $this->iHeaderAlign == 'right' ) {
$xp = $x +$this->iWidth[$i]-$this->iRightColMargin;
}
 
$txt->Stroke($aImg,$xp,$yTop+$this->iTopHeaderMargin);
$x += $this->iWidth[$i];
if( $i < $n-1 ) {
$aImg->SetColor($this->iColor);
$aImg->Line($x,$yTop,$x,$aYBottom);
}
}
 
$aImg->SetColor($this->iColor);
$aImg->Line($aXLeft,$yTop, $aXRight,$yTop);
 
// Stroke vertical column dividers
$cols=array();
$this->GetColStart($aImg,$cols);
$n=count($cols);
for( $i=1; $i < $n; ++$i ) {
$this->vgrid->Stroke($aImg,$cols[$i],$aYBottom,$cols[$i],
$aImg->height - $aImg->bottom_margin);
}
}
}
 
 
//===================================================
// CLASS GanttGraph
// Description: Main class to handle gantt graphs
//===================================================
class GanttGraph extends Graph {
public $scale; // Public accessible
public $hgrid=null;
private $iObj=array(); // Gantt objects
private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels
private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label
private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN
private $iSimpleFont = FF_FONT1,$iSimpleFontSize=11;
private $iSimpleStyle=GANTT_RDIAG,$iSimpleColor='yellow',$iSimpleBkgColor='red';
private $iSimpleProgressBkgColor='gray',$iSimpleProgressColor='darkgreen';
private $iSimpleProgressStyle=GANTT_SOLID;
private $iZoomFactor = 1.0;
//---------------
// CONSTRUCTOR
// Create a new gantt graph
function __construct($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) {
 
// Backward compatibility
if( $aWidth == -1 ) $aWidth=0;
if( $aHeight == -1 ) $aHeight=0;
 
if( $aWidth< 0 || $aHeight < 0 ) {
JpgraphError::RaiseL(6002);
//("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.");
}
parent::__construct($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline);
$this->scale = new GanttScale($this->img);
 
// Default margins
$this->img->SetMargin(15,17,25,15);
 
$this->hgrid = new HorizontalGridLine();
 
$this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY);
$this->SetBox();
}
 
//---------------
// PUBLIC METHODS
 
//
 
function SetSimpleFont($aFont,$aSize) {
$this->iSimpleFont = $aFont;
$this->iSimpleFontSize = $aSize;
}
 
function SetSimpleStyle($aBand,$aColor,$aBkgColor) {
$this->iSimpleStyle = $aBand;
$this->iSimpleColor = $aColor;
$this->iSimpleBkgColor = $aBkgColor;
}
 
// A utility function to help create basic Gantt charts
function CreateSimple($data,$constrains=array(),$progress=array()) {
$num = count($data);
for( $i=0; $i < $num; ++$i) {
switch( $data[$i][1] ) {
case ACTYPE_GROUP:
// Create a slightly smaller height bar since the
// "wings" at the end will make it look taller
$a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',8);
$a->title->SetFont($this->iSimpleFont,FS_BOLD,$this->iSimpleFontSize);
$a->rightMark->Show();
$a->rightMark->SetType(MARK_RIGHTTRIANGLE);
$a->rightMark->SetWidth(8);
$a->rightMark->SetColor('black');
$a->rightMark->SetFillColor('black');
 
$a->leftMark->Show();
$a->leftMark->SetType(MARK_LEFTTRIANGLE);
$a->leftMark->SetWidth(8);
$a->leftMark->SetColor('black');
$a->leftMark->SetFillColor('black');
 
$a->SetPattern(BAND_SOLID,'black');
$csimpos = 6;
break;
 
case ACTYPE_NORMAL:
$a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',10);
$a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$a->SetPattern($this->iSimpleStyle,$this->iSimpleColor);
$a->SetFillColor($this->iSimpleBkgColor);
// Check if this activity should have a constrain line
$n = count($constrains);
for( $j=0; $j < $n; ++$j ) {
if( empty($constrains[$j]) || (count($constrains[$j]) != 3) ) {
JpGraphError::RaiseL(6003,$j);
//("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)");
}
if( $constrains[$j][0]==$data[$i][0] ) {
$a->SetConstrain($constrains[$j][1],$constrains[$j][2],'black',ARROW_S2,ARROWT_SOLID);
}
}
 
// Check if this activity have a progress bar
$n = count($progress);
for( $j=0; $j < $n; ++$j ) {
 
if( empty($progress[$j]) || (count($progress[$j]) != 2) ) {
JpGraphError::RaiseL(6004,$j);
//("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)");
}
if( $progress[$j][0]==$data[$i][0] ) {
$a->progress->Set($progress[$j][1]);
$a->progress->SetPattern($this->iSimpleProgressStyle,
$this->iSimpleProgressColor);
$a->progress->SetFillColor($this->iSimpleProgressBkgColor);
//$a->progress->SetPattern($progress[$j][2],$progress[$j][3]);
break;
}
}
$csimpos = 6;
break;
 
case ACTYPE_MILESTONE:
$a = new MileStone($data[$i][0],$data[$i][2],$data[$i][3]);
$a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$a->caption->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$csimpos = 5;
break;
default:
die('Unknown activity type');
break;
}
 
// Setup caption
$a->caption->Set($data[$i][$csimpos-1]);
 
// Check if this activity should have a CSIM target�?
if( !empty($data[$i][$csimpos]) ) {
$a->SetCSIMTarget($data[$i][$csimpos]);
$a->SetCSIMAlt($data[$i][$csimpos+1]);
}
if( !empty($data[$i][$csimpos+2]) ) {
$a->title->SetCSIMTarget($data[$i][$csimpos+2]);
$a->title->SetCSIMAlt($data[$i][$csimpos+3]);
}
 
$this->Add($a);
}
}
 
// Set user specified scale zoom factor when auto sizing is used
function SetZoomFactor($aZoom) {
$this->iZoomFactor = $aZoom;
}
 
 
// Set what headers should be shown
function ShowHeaders($aFlg) {
$this->scale->ShowHeaders($aFlg);
}
 
// Specify the fraction of the font height that should be added
// as vertical margin
function SetLabelVMarginFactor($aVal) {
$this->iLabelVMarginFactor = $aVal;
}
 
// Synonym to the method above
function SetVMarginFactor($aVal) {
$this->iLabelVMarginFactor = $aVal;
}
 
 
// Add a new Gantt object
function Add($aObject) {
if( is_array($aObject) && count($aObject) > 0 ) {
$cl = $aObject[0];
if( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) {
$this->AddIcon($aObject);
}
elseif( class_exists('Text',false) && ($cl instanceof Text) ) {
$this->AddText($aObject);
}
else {
$n = count($aObject);
for($i=0; $i < $n; ++$i)
$this->iObj[] = $aObject[$i];
}
}
else {
if( class_exists('IconPlot',false) && ($aObject instanceof IconPlot) ) {
$this->AddIcon($aObject);
}
elseif( class_exists('Text',false) && ($aObject instanceof Text) ) {
$this->AddText($aObject);
}
else {
$this->iObj[] = $aObject;
}
}
}
 
function StrokeTexts() {
// Stroke any user added text objects
if( $this->texts != null ) {
$n = count($this->texts);
for($i=0; $i < $n; ++$i) {
if( $this->texts[$i]->iScalePosX !== null && $this->texts[$i]->iScalePosY !== null ) {
$x = $this->scale->TranslateDate($this->texts[$i]->iScalePosX);
$y = $this->scale->TranslateVertPos($this->texts[$i]->iScalePosY);
$y -= $this->scale->GetVertSpacing()/2;
}
else {
$x = $y = null;
}
$this->texts[$i]->Stroke($this->img,$x,$y);
}
}
}
 
// Override inherit method from Graph and give a warning message
function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) {
JpGraphError::RaiseL(6005);
//("SetScale() is not meaningfull with Gantt charts.");
}
 
// Specify the date range for Gantt graphs (if this is not set it will be
// automtically determined from the input data)
function SetDateRange($aStart,$aEnd) {
// Adjust the start and end so that the indicate the
// begining and end of respective start and end days
if( strpos($aStart,':') === false )
$aStart = date('Y-m-d 00:00',strtotime($aStart));
if( strpos($aEnd,':') === false )
$aEnd = date('Y-m-d 23:59',strtotime($aEnd));
$this->scale->SetRange($aStart,$aEnd);
}
 
// Get the maximum width of the activity titles columns for the bars
// The name is lightly misleading since we from now on can have
// multiple columns in the label section. When this was first written
// it only supported a single label, hence the name.
function GetMaxLabelWidth() {
$m=10;
if( $this->iObj != null ) {
$marg = $this->scale->actinfo->iLeftColMargin+$this->scale->actinfo->iRightColMargin;
$n = count($this->iObj);
for($i=0; $i < $n; ++$i) {
if( !empty($this->iObj[$i]->title) ) {
if( $this->iObj[$i]->title->HasTabs() ) {
list($tot,$w) = $this->iObj[$i]->title->GetWidth($this->img,true);
$m=max($m,$tot);
}
else
$m=max($m,$this->iObj[$i]->title->GetWidth($this->img));
}
}
}
return $m;
}
 
// Get the maximum height of the titles for the bars
function GetMaxLabelHeight() {
$m=10;
if( $this->iObj != null ) {
$n = count($this->iObj);
// We can not include the title of GnttVLine since that title is stroked at the bottom
// of the Gantt bar and not in the activity title columns
for($i=0; $i < $n; ++$i) {
if( !empty($this->iObj[$i]->title) && !($this->iObj[$i] instanceof GanttVLine) ) {
$m=max($m,$this->iObj[$i]->title->GetHeight($this->img));
}
}
}
return $m;
}
 
function GetMaxBarAbsHeight() {
$m=0;
if( $this->iObj != null ) {
$m = $this->iObj[0]->GetAbsHeight($this->img);
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
$m=max($m,$this->iObj[$i]->GetAbsHeight($this->img));
}
}
return $m;
}
 
// Get the maximum used line number (vertical position) for bars
function GetBarMaxLineNumber() {
$m=1;
if( $this->iObj != null ) {
$m = $this->iObj[0]->GetLineNbr();
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
$m=max($m,$this->iObj[$i]->GetLineNbr());
}
}
return $m;
}
 
// Get the minumum and maximum used dates for all bars
function GetBarMinMax() {
$start = 0 ;
$n = count($this->iObj);
while( $start < $n && $this->iObj[$start]->GetMaxDate() === false )
++$start;
if( $start >= $n ) {
JpgraphError::RaiseL(6006);
//('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]');
}
 
$max=$this->scale->NormalizeDate($this->iObj[$start]->GetMaxDate());
$min=$this->scale->NormalizeDate($this->iObj[$start]->GetMinDate());
 
for($i=$start+1; $i < $n; ++$i) {
$rmax = $this->scale->NormalizeDate($this->iObj[$i]->GetMaxDate());
if( $rmax != false )
$max=Max($max,$rmax);
$rmin = $this->scale->NormalizeDate($this->iObj[$i]->GetMinDate());
if( $rmin != false )
$min=Min($min,$rmin);
}
$minDate = date("Y-m-d",$min);
$min = strtotime($minDate);
$maxDate = date("Y-m-d 23:59",$max);
$max = strtotime($maxDate);
return array($min,$max);
}
 
// Create a new auto sized canvas if the user hasn't specified a size
// The size is determined by what scale the user has choosen and hence
// the minimum width needed to display the headers. Some margins are
// also added to make it better looking.
function AutoSize() {
 
if( $this->img->img == null ) {
// The predefined left, right, top, bottom margins.
// Note that the top margin might incease depending on
// the title.
$hadj = $vadj = 0;
if( $this->doshadow ) {
$hadj = $this->shadow_width;
$vadj = $this->shadow_width+5;
}
 
$lm = $this->img->left_margin;
$rm = $this->img->right_margin +$hadj;
$rm += 2 ;
$tm = $this->img->top_margin;
$bm = $this->img->bottom_margin + $vadj;
$bm += 2;
 
// If there are any added GanttVLine we must make sure that the
// bottom margin is wide enough to hold a title.
$n = count($this->iObj);
for($i=0; $i < $n; ++$i) {
if( $this->iObj[$i] instanceof GanttVLine ) {
$bm = max($bm,$this->iObj[$i]->title->GetHeight($this->img)+10);
}
}
 
// First find out the height
$n=$this->GetBarMaxLineNumber()+1;
$m=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
$height=$n*((1+$this->iLabelVMarginFactor)*$m);
 
// Add the height of the scale titles
$h=$this->scale->GetHeaderHeight();
$height += $h;
 
// Calculate the top margin needed for title and subtitle
if( $this->title->t != "" ) {
$tm += $this->title->GetFontHeight($this->img);
}
if( $this->subtitle->t != "" ) {
$tm += $this->subtitle->GetFontHeight($this->img);
}
 
// ...and then take the bottom and top plot margins into account
$height += $tm + $bm + $this->scale->iTopPlotMargin + $this->scale->iBottomPlotMargin;
// Now find the minimum width for the chart required
 
// If day scale or smaller is shown then we use the day font width
// as the base size unit.
// If only weeks or above is displayed we use a modified unit to
// get a smaller image.
if( $this->scale->IsDisplayHour() || $this->scale->IsDisplayMinute() ) {
// Add 2 pixel margin on each side
$fw=$this->scale->day->GetFontWidth($this->img)+4;
}
elseif( $this->scale->IsDisplayWeek() ) {
$fw = 8;
}
elseif( $this->scale->IsDisplayMonth() ) {
$fw = 4;
}
else {
$fw = 2;
}
 
$nd=$this->scale->GetNumberOfDays();
 
if( $this->scale->IsDisplayDay() ) {
// If the days are displayed we also need to figure out
// how much space each day's title will require.
switch( $this->scale->day->iStyle ) {
case DAYSTYLE_LONG :
$txt = "Monday";
break;
case DAYSTYLE_LONGDAYDATE1 :
$txt = "Monday 23 Jun";
break;
case DAYSTYLE_LONGDAYDATE2 :
$txt = "Monday 23 Jun 2003";
break;
case DAYSTYLE_SHORT :
$txt = "Mon";
break;
case DAYSTYLE_SHORTDAYDATE1 :
$txt = "Mon 23/6";
break;
case DAYSTYLE_SHORTDAYDATE2 :
$txt = "Mon 23 Jun";
break;
case DAYSTYLE_SHORTDAYDATE3 :
$txt = "Mon 23";
break;
case DAYSTYLE_SHORTDATE1 :
$txt = "23/6";
break;
case DAYSTYLE_SHORTDATE2 :
$txt = "23 Jun";
break;
case DAYSTYLE_SHORTDATE3 :
$txt = "Mon 23";
break;
case DAYSTYLE_SHORTDATE4 :
$txt = "88";
break;
case DAYSTYLE_CUSTOM :
$txt = date($this->scale->day->iLabelFormStr,strtotime('2003-12-20 18:00'));
break;
case DAYSTYLE_ONELETTER :
default:
$txt = "M";
break;
}
$fw = $this->scale->day->GetStrWidth($this->img,$txt)+6;
}
 
// If we have hours enabled we must make sure that each day has enough
// space to fit the number of hours to be displayed.
if( $this->scale->IsDisplayHour() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->hour->iStyle ) {
case HOURSTYLE_HMAMPM:
$txt = '12:00pm';
break;
case HOURSTYLE_H24:
// 13
$txt = '24';
break;
case HOURSTYLE_HAMPM:
$txt = '12pm';
break;
case HOURSTYLE_CUSTOM:
$txt = date($this->scale->hour->iLabelFormStr,strtotime('2003-12-20 18:00'));
break;
case HOURSTYLE_HM24:
default:
$txt = '24:00';
break;
}
 
$hfw = $this->scale->hour->GetStrWidth($this->img,$txt)+6;
$mw = $hfw;
if( $this->scale->IsDisplayMinute() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->minute->iStyle ) {
case HOURSTYLE_CUSTOM:
$txt2 = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
break;
case MINUTESTYLE_MM:
default:
$txt2 = '15';
break;
}
 
$mfw = $this->scale->minute->GetStrWidth($this->img,$txt2)+6;
$n2 = ceil(60 / $this->scale->minute->GetIntervall() );
$mw = $n2 * $mfw;
}
$hfw = $hfw < $mw ? $mw : $hfw ;
$n = ceil(24*60 / $this->scale->TimeToMinutes($this->scale->hour->GetIntervall()) );
$hw = $n * $hfw;
$fw = $fw < $hw ? $hw : $fw ;
}
 
// We need to repeat this code block here as well.
// THIS iS NOT A MISTAKE !
// We really need it since we need to adjust for minutes both in the case
// where hour scale is shown and when it is not shown.
 
if( $this->scale->IsDisplayMinute() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->minute->iStyle ) {
case HOURSTYLE_CUSTOM:
$txt = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
break;
case MINUTESTYLE_MM:
default:
$txt = '15';
break;
}
 
$mfw = $this->scale->minute->GetStrWidth($this->img,$txt)+6;
$n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()) );
$mw = $n * $mfw;
$fw = $fw < $mw ? $mw : $fw ;
}
 
// If we display week we must make sure that 7*$fw is enough
// to fit up to 10 characters of the week font (if the week is enabled)
if( $this->scale->IsDisplayWeek() ) {
// Depending on what format the user has choose we need different amount
// of space
$fsw = strlen($this->scale->week->iLabelFormStr);
if( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$fsw += 8;
}
elseif( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) {
$fsw += 7;
}
else {
$fsw += 4;
}
 
$ww = $fsw*$this->scale->week->GetFontWidth($this->img);
if( 7*$fw < $ww ) {
$fw = ceil($ww/7);
}
}
 
if( !$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() &&
!( ($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek() ) ) {
// If we don't display the individual days we can shrink the
// scale a little bit. This is a little bit pragmatic at the
// moment and should be re-written to take into account
// a) What scales exactly are shown and
// b) what format do they use so we know how wide we need to
// make each scale text space at minimum.
$fw /= 2;
if( !$this->scale->IsDisplayWeek() ) {
$fw /= 1.8;
}
}
 
$cw = $this->GetMaxActInfoColWidth() ;
$this->scale->actinfo->SetMinColWidth($cw);
if( $this->img->width <= 0 ) {
// Now determine the width for the activity titles column
 
// Firdst find out the maximum width of each object column
$titlewidth = max(max($this->GetMaxLabelWidth(),
$this->scale->tableTitle->GetWidth($this->img)),
$this->scale->actinfo->GetWidth($this->img));
 
// Add the width of the vertivcal divider line
$titlewidth += $this->scale->divider->iWeight*2;
 
// Adjust the width by the user specified zoom factor
$fw *= $this->iZoomFactor;
 
// Now get the total width taking
// titlewidth, left and rigt margin, dayfont size
// into account
$width = $titlewidth + $nd*$fw + $lm+$rm;
}
else {
$width = $this->img->width;
}
 
$width = round($width);
$height = round($height);
// Make a sanity check on image size
if( $width > MAX_GANTTIMG_SIZE_W || $height > MAX_GANTTIMG_SIZE_H ) {
JpgraphError::RaiseL(6007,$width,$height);
//("Sanity check for automatic Gantt chart size failed. Either the width (=$width) or height (=$height) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.");
}
$this->img->CreateImgCanvas($width,$height);
$this->img->SetMargin($lm,$rm,$tm,$bm);
}
}
 
// Return an array width the maximum width for each activity
// column. This is used when we autosize the columns where we need
// to find out the maximum width of each column. In order to do that we
// must walk through all the objects, sigh...
function GetMaxActInfoColWidth() {
$n = count($this->iObj);
if( $n == 0 ) return;
$w = array();
$m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin;
 
for( $i=0; $i < $n; ++$i ) {
$tmp = $this->iObj[$i]->title->GetColWidth($this->img,$m);
$nn = count($tmp);
for( $j=0; $j < $nn; ++$j ) {
if( empty($w[$j]) )
$w[$j] = $tmp[$j];
else
$w[$j] = max($w[$j],$tmp[$j]);
}
}
return $w;
}
 
// Stroke the gantt chart
function Stroke($aStrokeFileName="") {
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// Should we autoscale dates?
 
if( !$this->scale->IsRangeSet() ) {
list($min,$max) = $this->GetBarMinMax();
$this->scale->SetRange($min,$max);
}
 
$this->scale->AdjustStartEndDay();
 
// Check if we should autoscale the image
$this->AutoSize();
 
// Should we start from the top or just spread the bars out even over the
// available height
$this->scale->SetVertLayout($this->iLayout);
if( $this->iLayout == GANTT_FROMTOP ) {
$maxheight=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
$this->scale->SetVertSpacing($maxheight*(1+$this->iLabelVMarginFactor));
}
// If it hasn't been set find out the maximum line number
if( $this->scale->iVertLines == -1 )
$this->scale->iVertLines = $this->GetBarMaxLineNumber()+1;
 
$maxwidth=max($this->scale->actinfo->GetWidth($this->img),
max($this->GetMaxLabelWidth(),
$this->scale->tableTitle->GetWidth($this->img)));
 
$this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor));
 
if( !$_csim ) {
$this->StrokePlotArea();
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
}
 
$this->scale->Stroke();
 
if( !$_csim ) {
// Due to a minor off by 1 bug we need to temporarily adjust the margin
$this->img->right_margin--;
$this->StrokePlotBox();
$this->img->right_margin++;
}
 
// Stroke Grid line
$this->hgrid->Stroke($this->img,$this->scale);
 
$n = count($this->iObj);
for($i=0; $i < $n; ++$i) {
//$this->iObj[$i]->SetLabelLeftMargin(round($maxwidth*$this->iLabelHMarginFactor/2));
$this->iObj[$i]->Stroke($this->img,$this->scale);
}
 
$this->StrokeTitles();
 
if( !$_csim ) {
$this->StrokeConstrains();
$this->footer->Stroke($this->img);
 
 
if( $this->iIconDepth == DEPTH_FRONT) {
$this->StrokeIcons();
}
 
// Stroke all added user texts
$this->StrokeTexts();
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans',false) ) {
require_once('jpgraph_imgtrans.php');
}
 
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
}
 
function StrokeConstrains() {
$n = count($this->iObj);
 
// Stroke all constrains
for($i=0; $i < $n; ++$i) {
 
// Some gantt objects may not have constraints associated with them
// for example we can add IconPlots which doesn't have this property.
if( empty($this->iObj[$i]->constraints) ) continue;
 
$numConstrains = count($this->iObj[$i]->constraints);
 
for( $k = 0; $k < $numConstrains; $k++ ) {
$vpos = $this->iObj[$i]->constraints[$k]->iConstrainRow;
if( $vpos >= 0 ) {
$c1 = $this->iObj[$i]->iConstrainPos;
 
// Find out which object is on the target row
$targetobj = -1;
for( $j=0; $j < $n && $targetobj == -1; ++$j ) {
if( $this->iObj[$j]->iVPos == $vpos ) {
$targetobj = $j;
}
}
if( $targetobj == -1 ) {
JpGraphError::RaiseL(6008,$this->iObj[$i]->iVPos,$vpos);
//('You have specifed a constrain from row='.$this->iObj[$i]->iVPos.' to row='.$vpos.' which does not have any activity.');
}
$c2 = $this->iObj[$targetobj]->iConstrainPos;
if( count($c1) == 4 && count($c2 ) == 4) {
switch( $this->iObj[$i]->constraints[$k]->iConstrainType ) {
case CONSTRAIN_ENDSTART:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[2],$c1[3],$c2[0],$c2[1]);
}
else {
$link = new GanttLink($c1[2],$c1[1],$c2[0],$c2[3]);
}
$link->SetPath(3);
break;
case CONSTRAIN_STARTEND:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[0],$c1[3],$c2[2],$c2[1]);
}
else {
$link = new GanttLink($c1[0],$c1[1],$c2[2],$c2[3]);
}
$link->SetPath(0);
break;
case CONSTRAIN_ENDEND:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[2],$c1[3],$c2[2],$c2[1]);
}
else {
$link = new GanttLink($c1[2],$c1[1],$c2[2],$c2[3]);
}
$link->SetPath(1);
break;
case CONSTRAIN_STARTSTART:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[0],$c1[3],$c2[0],$c2[1]);
}
else {
$link = new GanttLink($c1[0],$c1[1],$c2[0],$c2[3]);
}
$link->SetPath(3);
break;
default:
JpGraphError::RaiseL(6009,$this->iObj[$i]->iVPos,$vpos);
//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos);
break;
}
 
$link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor);
$link->SetArrow($this->iObj[$i]->constraints[$k]->iConstrainArrowSize,
$this->iObj[$i]->constraints[$k]->iConstrainArrowType);
 
$link->Stroke($this->img);
}
}
}
}
}
 
function GetCSIMAreas() {
if( !$this->iHasStroked )
$this->Stroke(_CSIM_SPECIALFILE);
 
$csim = $this->title->GetCSIMAreas();
$csim .= $this->subtitle->GetCSIMAreas();
$csim .= $this->subsubtitle->GetCSIMAreas();
 
$n = count($this->iObj);
for( $i=$n-1; $i >= 0; --$i )
$csim .= $this->iObj[$i]->GetCSIMArea();
return $csim;
}
}
 
//===================================================
// CLASS PredefIcons
// Description: Predefined icons for use with Gantt charts
//===================================================
define('GICON_WARNINGRED',0);
define('GICON_TEXT',1);
define('GICON_ENDCONS',2);
define('GICON_MAIL',3);
define('GICON_STARTCONS',4);
define('GICON_CALC',5);
define('GICON_MAGNIFIER',6);
define('GICON_LOCK',7);
define('GICON_STOP',8);
define('GICON_WARNINGYELLOW',9);
define('GICON_FOLDEROPEN',10);
define('GICON_FOLDER',11);
define('GICON_TEXTIMPORTANT',12);
 
class PredefIcons {
private $iBuiltinIcon = null, $iLen = -1 ;
 
function GetLen() {
return $this->iLen ;
}
 
function GetImg($aIdx) {
if( $aIdx < 0 || $aIdx >= $this->iLen ) {
JpGraphError::RaiseL(6010,$aIdx);
//('Illegal icon index for Gantt builtin icon ['.$aIdx.']');
}
return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1]));
}
 
function __construct() {
//==========================================================
// warning.png
//==========================================================
$this->iBuiltinIcon[0][0]= 1043 ;
$this->iBuiltinIcon[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'.
'0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'.
'5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'.
'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'.
'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'.
'/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'.
'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'.
'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'.
'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'.
'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'.
'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'.
'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'.
'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ;
 
//==========================================================
// edit.png
//==========================================================
$this->iBuiltinIcon[1][0]= 959 ;
$this->iBuiltinIcon[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'.
'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'.
'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'.
'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'.
'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'.
'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'.
'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'.
'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'.
'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'.
'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'.
'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'.
'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ;
 
//==========================================================
// endconstrain.png
//==========================================================
$this->iBuiltinIcon[2][0]= 666 ;
$this->iBuiltinIcon[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'.
'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'.
'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'.
'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'.
'7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'.
'7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'.
'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'.
'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ;
 
//==========================================================
// mail.png
//==========================================================
$this->iBuiltinIcon[3][0]= 1122 ;
$this->iBuiltinIcon[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'.
'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'.
'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'.
'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'.
'3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'.
'7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'.
'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'.
'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'.
'6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'.
'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'.
'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'.
'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'.
'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'.
'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ;
 
//==========================================================
// startconstrain.png
//==========================================================
$this->iBuiltinIcon[4][0]= 725 ;
$this->iBuiltinIcon[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'.
'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'.
'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'.
'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'.
'5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'.
'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'.
'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'.
'5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'.
'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ;
 
//==========================================================
// calc.png
//==========================================================
$this->iBuiltinIcon[5][0]= 589 ;
$this->iBuiltinIcon[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'.
'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'.
'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'.
'3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'.
'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'.
'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'.
'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'.
'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// mag.png
//==========================================================
$this->iBuiltinIcon[6][0]= 1415 ;
$this->iBuiltinIcon[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'.
'0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'.
'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'.
'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'.
'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'.
'8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'.
'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'.
'/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'.
'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'.
'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'.
'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'.
'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'.
'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'.
'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'.
'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'.
'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'.
'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'.
'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ;
 
//==========================================================
// lock.png
//==========================================================
$this->iBuiltinIcon[7][0]= 963 ;
$this->iBuiltinIcon[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'.
'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'.
'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'.
'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'.
'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'.
'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'.
'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'.
'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'.
'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'.
'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'.
'2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'.
'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ;
 
//==========================================================
// stop.png
//==========================================================
$this->iBuiltinIcon[8][0]= 889 ;
$this->iBuiltinIcon[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'.
'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'.
'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'.
'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'.
'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'.
'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'.
'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'.
'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'.
'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'.
'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'.
'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// error.png
//==========================================================
$this->iBuiltinIcon[9][0]= 541 ;
$this->iBuiltinIcon[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'.
'2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'.
'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'.
'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'.
'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'.
'iOsCHgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// openfolder.png
//==========================================================
$this->iBuiltinIcon[10][0]= 2040 ;
$this->iBuiltinIcon[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'.
'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'.
'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'.
'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'.
'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'.
'9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'.
'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'.
'4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'.
'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'.
'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'.
'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'.
'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'.
'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'.
'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'.
'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'.
'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'.
'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'.
'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'.
'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'.
'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'.
'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'.
'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'.
'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'.
'+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'.
'4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'.
'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'.
'dBntAAAAAElFTkSuQmCC' ;
 
//==========================================================
// folder.png
//==========================================================
$this->iBuiltinIcon[11][0]= 1824 ;
$this->iBuiltinIcon[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'.
'6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'.
'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'.
'309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'.
'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'.
'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'.
'3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'.
'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'.
'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'.
'/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'.
'4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'.
'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'.
'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'.
'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'.
'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'.
'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'.
'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'.
'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'.
'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'.
'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'.
'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'.
'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'.
'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'.
'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ;
 
//==========================================================
// file_important.png
//==========================================================
$this->iBuiltinIcon[12][0]= 1785 ;
$this->iBuiltinIcon[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'.
'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'.
'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'.
'1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'.
's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'.
'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'.
'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'.
'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'.
'73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'.
'4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'.
'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'.
'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'.
'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'.
'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'.
't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'.
'9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'.
'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'.
'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'.
'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'.
'8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'.
'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'.
'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'.
'7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ;
 
$this->iLen = count($this->iBuiltinIcon);
}
}
 
//===================================================
// Global cache for builtin images
//===================================================
$_gPredefIcons = new PredefIcons();
 
//===================================================
// CLASS IconImage
// Description: Holds properties for an icon image
//===================================================
class IconImage {
private $iGDImage=null;
private $iWidth,$iHeight;
private $ixalign='left',$iyalign='center';
private $iScale=1.0;
 
function __construct($aIcon,$aScale=1) {
GLOBAL $_gPredefIcons ;
if( is_string($aIcon) ) {
$this->iGDImage = Graph::LoadBkgImage('',$aIcon);
}
elseif( is_integer($aIcon) ) {
// Builtin image
$this->iGDImage = $_gPredefIcons->GetImg($aIcon);
}
else {
JpGraphError::RaiseL(6011);
//('Argument to IconImage must be string or integer');
}
$this->iScale = $aScale;
$this->iWidth = Image::GetWidth($this->iGDImage);
$this->iHeight = Image::GetHeight($this->iGDImage);
}
 
function GetWidth() {
return round($this->iScale*$this->iWidth);
}
 
function GetHeight() {
return round($this->iScale*$this->iHeight);
}
 
function SetAlign($aX='left',$aY='center') {
$this->ixalign = $aX;
$this->iyalign = $aY;
}
 
function Stroke($aImg,$x,$y) {
 
if( $this->ixalign == 'right' ) {
$x -= $this->iWidth;
}
elseif( $this->ixalign == 'center' ) {
$x -= round($this->iWidth/2*$this->iScale);
}
 
if( $this->iyalign == 'bottom' ) {
$y -= $this->iHeight;
}
elseif( $this->iyalign == 'center' ) {
$y -= round($this->iHeight/2*$this->iScale);
}
 
$aImg->Copy($this->iGDImage,
$x,$y,0,0,
round($this->iWidth*$this->iScale),round($this->iHeight*$this->iScale),
$this->iWidth,$this->iHeight);
}
}
 
 
//===================================================
// CLASS TextProperty
// Description: Holds properties for a text
//===================================================
class TextProperty {
public $iShow=true;
public $csimtarget='',$csimwintarget='',$csimalt='';
private $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10;
private $iFontArray=array();
private $iColor="black";
private $iText="";
private $iHAlign="left",$iVAlign="bottom";
 
//---------------
// CONSTRUCTOR
function __construct($aTxt='') {
$this->iText = $aTxt;
}
 
//---------------
// PUBLIC METHODS
function Set($aTxt) {
$this->iText = $aTxt;
}
 
function SetCSIMTarget($aTarget,$aAltText='',$aWinTarget='') {
if( is_string($aTarget) )
$aTarget = array($aTarget);
$this->csimtarget=$aTarget;
 
if( is_string($aWinTarget) )
$aWinTarget = array($aWinTarget);
$this->csimwintarget=$aWinTarget;
 
if( is_string($aAltText) )
$aAltText = array($aAltText);
$this->csimalt=$aAltText;
 
}
 
function SetCSIMAlt($aAltText) {
if( is_string($aAltText) )
$aAltText = array($aAltText);
$this->csimalt=$aAltText;
}
 
// Set text color
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function HasTabs() {
if( is_string($this->iText) ) {
return substr_count($this->iText,"\t") > 0;
}
elseif( is_array($this->iText) ) {
return false;
}
}
 
// Get number of tabs in string
function GetNbrTabs() {
if( is_string($this->iText) ) {
return substr_count($this->iText,"\t") ;
}
else{
return 0;
}
}
 
// Set alignment
function Align($aHAlign,$aVAlign="bottom") {
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
 
// Synonym
function SetAlign($aHAlign,$aVAlign="bottom") {
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
 
// Specify font
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function SetColumnFonts($aFontArray) {
if( !is_array($aFontArray) || count($aFontArray[0]) != 3 ) {
JpGraphError::RaiseL(6033);
// 'Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)'
}
$this->iFontArray = $aFontArray;
}
 
 
function IsColumns() {
return is_array($this->iText) ;
}
 
// Get width of text. If text contains several columns separated by
// tabs then return both the total width as well as an array with a
// width for each column.
function GetWidth($aImg,$aUseTabs=false,$aTabExtraMargin=1.1) {
$extra_margin=4;
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
if( is_string($this->iText) ) {
if( strlen($this->iText) == 0 ) return 0;
$tmp = preg_split('/\t/',$this->iText);
if( count($tmp) <= 1 || !$aUseTabs ) {
$w = $aImg->GetTextWidth($this->iText);
return $w + 2*$extra_margin;
}
else {
$tot=0;
$n = count($tmp);
for($i=0; $i < $n; ++$i) {
$res[$i] = $aImg->GetTextWidth($tmp[$i]);
$tot += $res[$i]*$aTabExtraMargin;
}
return array(round($tot),$res);
}
}
elseif( is_object($this->iText) ) {
// A single icon
return $this->iText->GetWidth()+2*$extra_margin;
}
elseif( is_array($this->iText) ) {
// Must be an array of texts. In this case we return the sum of the
// length + a fixed margin of 4 pixels on each text string
$n = count($this->iText);
$nf = count($this->iFontArray);
for( $i=0, $w=0; $i < $n; ++$i ) {
if( $i < $nf ) {
$aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]);
}
else {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
}
$tmp = $this->iText[$i];
if( is_string($tmp) ) {
$w += $aImg->GetTextWidth($tmp)+$extra_margin;
}
else {
if( is_object($tmp) === false ) {
JpGraphError::RaiseL(6012);
}
$w += $tmp->GetWidth()+$extra_margin;
}
}
return $w;
}
else {
JpGraphError::RaiseL(6012);
}
}
 
// for the case where we have multiple columns this function returns the width of each
// column individually. If there is no columns just return the width of the single
// column as an array of one
function GetColWidth($aImg,$aMargin=0) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
if( is_array($this->iText) ) {
$n = count($this->iText);
$nf = count($this->iFontArray);
for( $i=0, $w=array(); $i < $n; ++$i ) {
$tmp = $this->iText[$i];
if( is_string($tmp) ) {
if( $i < $nf ) {
$aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]);
}
else {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
}
$w[$i] = $aImg->GetTextWidth($tmp)+$aMargin;
}
else {
if( is_object($tmp) === false ) {
JpGraphError::RaiseL(6012);
}
$w[$i] = $tmp->GetWidth()+$aMargin;
}
}
return $w;
}
else {
return array($this->GetWidth($aImg));
}
}
 
// Get total height of text
function GetHeight($aImg) {
$nf = count($this->iFontArray);
$maxheight = -1;
 
if( $nf > 0 ) {
// We have to find out the largest font and take that one as the
// height of the row
for($i=0; $i < $nf; ++$i ) {
$aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]);
$height = $aImg->GetFontHeight();
$maxheight = max($height,$maxheight);
}
}
 
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$height = $aImg->GetFontHeight();
$maxheight = max($height,$maxheight);
return $maxheight;
}
 
// Unhide/hide the text
function Show($aShow=true) {
$this->iShow=$aShow;
}
 
// Stroke text at (x,y) coordinates. If the text contains tabs then the
// x parameter should be an array of positions to be used for each successive
// tab mark. If no array is supplied then the tabs will be ignored.
function Stroke($aImg,$aX,$aY) {
if( $this->iShow ) {
$aImg->SetColor($this->iColor);
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$aImg->SetTextAlign($this->iHAlign,$this->iVAlign);
if( $this->GetNbrTabs() < 1 ) {
if( is_string($this->iText) ) {
if( is_array($aX) ) $aX=$aX[0];
if( is_array($aY) ) $aY=$aY[0];
$aImg->StrokeText($aX,$aY,$this->iText);
}
elseif( is_array($this->iText) && ($n = count($this->iText)) > 0 ) {
$ax = is_array($aX) ;
$ay = is_array($aY) ;
if( $ax && $ay ) {
// Nothing; both are already arrays
}
elseif( $ax ) {
$aY = array_fill(0,$n,$aY);
}
elseif( $ay ) {
$aX = array_fill(0,$n,$aX);
}
else {
$aX = array_fill(0,$n,$aX);
$aY = array_fill(0,$n,$aY);
}
$n = min($n, count($aX) ) ;
$n = min($n, count($aY) ) ;
for($i=0; $i < $n; ++$i ) {
$tmp = $this->iText[$i];
if( is_object($tmp) ) {
$tmp->Stroke($aImg,$aX[$i],$aY[$i]);
}
else {
if( $i < count($this->iFontArray) ) {
$font = $this->iFontArray[$i];
$aImg->SetFont($font[0],$font[1],$font[2]);
}
else {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
}
$aImg->StrokeText($aX[$i],$aY[$i],str_replace("\t"," ",$tmp));
}
}
}
}
else {
$tmp = preg_split('/\t/',$this->iText);
$n = min(count($tmp),count($aX));
for($i=0; $i < $n; ++$i) {
if( $i < count($this->iFontArray) ) {
$font = $this->iFontArray[$i];
$aImg->SetFont($font[0],$font[1],$font[2]);
}
else {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
}
$aImg->StrokeText($aX[$i],$aY,$tmp[$i]);
}
}
}
}
}
 
//===================================================
// CLASS HeaderProperty
// Description: Data encapsulating class to hold property
// for each type of the scale headers
//===================================================
class HeaderProperty {
public $grid;
public $iShowLabels=true,$iShowGrid=true;
public $iTitleVertMargin=3,$iFFamily=FF_FONT0,$iFStyle=FS_NORMAL,$iFSize=8;
public $iStyle=0;
public $iFrameColor="black",$iFrameWeight=1;
public $iBackgroundColor="white";
public $iWeekendBackgroundColor="lightgray",$iSundayTextColor="red"; // these are only used with day scale
public $iTextColor="black";
public $iLabelFormStr="%d";
public $iIntervall = 1;
 
//---------------
// CONSTRUCTOR
function __construct() {
$this->grid = new LineProperty();
}
 
//---------------
// PUBLIC METHODS
function Show($aShow=true) {
$this->iShowLabels = $aShow;
}
 
function SetIntervall($aInt) {
$this->iIntervall = $aInt;
}
 
function SetInterval($aInt) {
$this->iIntervall = $aInt;
}
 
function GetIntervall() {
return $this->iIntervall ;
}
 
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function SetFontColor($aColor) {
$this->iTextColor = $aColor;
}
 
function GetFontHeight($aImg) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetFontHeight();
}
 
function GetFontWidth($aImg) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetFontWidth();
}
 
function GetStrWidth($aImg,$aStr) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetTextWidth($aStr);
}
 
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
 
function SetBackgroundColor($aColor) {
$this->iBackgroundColor=$aColor;
}
 
function SetFrameWeight($aWeight) {
$this->iFrameWeight=$aWeight;
}
 
function SetFrameColor($aColor) {
$this->iFrameColor=$aColor;
}
 
// Only used by day scale
function SetWeekendColor($aColor) {
$this->iWeekendBackgroundColor=$aColor;
}
 
// Only used by day scale
function SetSundayFontColor($aColor) {
$this->iSundayTextColor=$aColor;
}
 
function SetTitleVertMargin($aMargin) {
$this->iTitleVertMargin=$aMargin;
}
 
function SetLabelFormatString($aStr) {
$this->iLabelFormStr=$aStr;
}
 
function SetFormatString($aStr) {
$this->SetLabelFormatString($aStr);
}
 
 
}
 
//===================================================
// CLASS GanttScale
// Description: Responsible for calculating and showing
// the scale in a gantt chart. This includes providing methods for
// converting dates to position in the chart as well as stroking the
// date headers (days, week, etc).
//===================================================
class GanttScale {
public $minute,$hour,$day,$week,$month,$year;
public $divider,$dividerh,$tableTitle;
public $iStartDate=-1,$iEndDate=-1;
// Number of gantt bar position (n.b not necessariliy the same as the number of bars)
// we could have on bar in position 1, and one bar in position 5 then there are two
// bars but the number of bar positions is 5
public $actinfo;
public $iTopPlotMargin=10,$iBottomPlotMargin=15;
public $iVertLines=-1;
public $iVertHeaderSize=-1;
// The width of the labels (defaults to the widest of all labels)
private $iLabelWidth;
// Out image to stroke the scale to
private $iImg;
private $iTableHeaderBackgroundColor="white",$iTableHeaderFrameColor="black";
private $iTableHeaderFrameWeight=1;
private $iAvailableHeight=-1,$iVertSpacing=-1;
private $iDateLocale;
private $iVertLayout=GANTT_EVEN;
private $iUsePlotWeekendBackground=true;
private $iWeekStart = 1; // Default to have weekends start on Monday
 
//---------------
// CONSTRUCTOR
function __construct($aImg) {
$this->iImg = $aImg;
$this->iDateLocale = new DateLocale();
 
$this->minute = new HeaderProperty();
$this->minute->SetIntervall(15);
$this->minute->SetLabelFormatString('i');
$this->minute->SetFont(FF_FONT0);
$this->minute->grid->SetColor("gray");
 
$this->hour = new HeaderProperty();
$this->hour->SetFont(FF_FONT0);
$this->hour->SetIntervall(6);
$this->hour->SetStyle(HOURSTYLE_HM24);
$this->hour->SetLabelFormatString('H:i');
$this->hour->grid->SetColor("gray");
 
$this->day = new HeaderProperty();
$this->day->grid->SetColor("gray");
$this->day->SetLabelFormatString('l');
 
$this->week = new HeaderProperty();
$this->week->SetLabelFormatString("w%d");
$this->week->SetFont(FF_FONT1);
 
$this->month = new HeaderProperty();
$this->month->SetFont(FF_FONT1,FS_BOLD);
 
$this->year = new HeaderProperty();
$this->year->SetFont(FF_FONT1,FS_BOLD);
 
$this->divider=new LineProperty();
$this->dividerh=new LineProperty();
$this->dividerh->SetWeight(2);
$this->divider->SetWeight(6);
$this->divider->SetColor('gray');
$this->divider->SetStyle('fancy');
 
$this->tableTitle=new TextProperty();
$this->tableTitle->Show(false);
$this->actinfo = new GanttActivityInfo();
}
 
//---------------
// PUBLIC METHODS
// Specify what headers should be visible
function ShowHeaders($aFlg) {
$this->day->Show($aFlg & GANTT_HDAY);
$this->week->Show($aFlg & GANTT_HWEEK);
$this->month->Show($aFlg & GANTT_HMONTH);
$this->year->Show($aFlg & GANTT_HYEAR);
$this->hour->Show($aFlg & GANTT_HHOUR);
$this->minute->Show($aFlg & GANTT_HMIN);
 
// Make some default settings of gridlines whihc makes sense
if( $aFlg & GANTT_HWEEK ) {
$this->month->grid->Show(false);
$this->year->grid->Show(false);
}
if( $aFlg & GANTT_HHOUR ) {
$this->day->grid->SetColor("black");
}
}
 
// Should the weekend background stretch all the way down in the plotarea
function UseWeekendBackground($aShow) {
$this->iUsePlotWeekendBackground = $aShow;
}
 
// Have a range been specified?
function IsRangeSet() {
return $this->iStartDate!=-1 && $this->iEndDate!=-1;
}
 
// Should the layout be from top or even?
function SetVertLayout($aLayout) {
$this->iVertLayout = $aLayout;
}
 
// Which locale should be used?
function SetDateLocale($aLocale) {
$this->iDateLocale->Set($aLocale);
}
 
// Number of days we are showing
function GetNumberOfDays() {
return round(($this->iEndDate-$this->iStartDate)/SECPERDAY);
}
 
// The width of the actual plot area
function GetPlotWidth() {
$img=$this->iImg;
return $img->width - $img->left_margin - $img->right_margin;
}
 
// Specify the width of the titles(labels) for the activities
// (This is by default set to the minimum width enought for the
// widest title)
function SetLabelWidth($aLabelWidth) {
$this->iLabelWidth=$aLabelWidth;
}
 
// Which day should the week start?
// 0==Sun, 1==Monday, 2==Tuesday etc
function SetWeekStart($aStartDay) {
$this->iWeekStart = $aStartDay % 7;
 
//Recalculate the startday since this will change the week start
$this->SetRange($this->iStartDate,$this->iEndDate);
}
 
// Do we show min scale?
function IsDisplayMinute() {
return $this->minute->iShowLabels;
}
 
// Do we show day scale?
function IsDisplayHour() {
return $this->hour->iShowLabels;
}
 
 
// Do we show day scale?
function IsDisplayDay() {
return $this->day->iShowLabels;
}
 
// Do we show week scale?
function IsDisplayWeek() {
return $this->week->iShowLabels;
}
 
// Do we show month scale?
function IsDisplayMonth() {
return $this->month->iShowLabels;
}
 
// Do we show year scale?
function IsDisplayYear() {
return $this->year->iShowLabels;
}
 
// Specify spacing (in percent of bar height) between activity bars
function SetVertSpacing($aSpacing) {
$this->iVertSpacing = $aSpacing;
}
 
// Specify scale min and max date either as timestamp or as date strings
// Always round to the nearest week boundary
function SetRange($aMin,$aMax) {
$this->iStartDate = $this->NormalizeDate($aMin);
$this->iEndDate = $this->NormalizeDate($aMax);
}
 
 
// Adjust the start and end date so they fit to beginning/ending
// of the week taking the specified week start day into account.
function AdjustStartEndDay() {
 
if( !($this->IsDisplayYear() ||$this->IsDisplayMonth() || $this->IsDisplayWeek()) ) {
// Don't adjust
return;
}
 
// Get day in week for start and ending date (Sun==0)
$ds=strftime("%w",$this->iStartDate);
$de=strftime("%w",$this->iEndDate);
 
// We want to start on iWeekStart day. But first we subtract a week
// if the startdate is "behind" the day the week start at.
// This way we ensure that the given start date is always included
// in the range. If we don't do this the nearest correct weekday in the week
// to start at might be later than the start date.
if( $ds < $this->iWeekStart )
$d = strtotime('-7 day',$this->iStartDate);
else
$d = $this->iStartDate;
$adjdate = strtotime(($this->iWeekStart-$ds).' day',$d /*$this->iStartDate*/ );
$this->iStartDate = $adjdate;
 
// We want to end on the last day of the week
$preferredEndDay = ($this->iWeekStart+6)%7;
if( $preferredEndDay != $de ) {
// Solve equivalence eq: $de + x ~ $preferredDay (mod 7)
$adj = (7+($preferredEndDay - $de)) % 7;
$adjdate = strtotime("+$adj day",$this->iEndDate);
$this->iEndDate = $adjdate;
}
}
 
// Specify background for the table title area (upper left corner of the table)
function SetTableTitleBackground($aColor) {
$this->iTableHeaderBackgroundColor = $aColor;
}
 
///////////////////////////////////////
// PRIVATE Methods
 
// Determine the height of all the scale headers combined
function GetHeaderHeight() {
$img=$this->iImg;
$height=1;
if( $this->minute->iShowLabels ) {
$height += $this->minute->GetFontHeight($img);
$height += $this->minute->iTitleVertMargin;
}
if( $this->hour->iShowLabels ) {
$height += $this->hour->GetFontHeight($img);
$height += $this->hour->iTitleVertMargin;
}
if( $this->day->iShowLabels ) {
$height += $this->day->GetFontHeight($img);
$height += $this->day->iTitleVertMargin;
}
if( $this->week->iShowLabels ) {
$height += $this->week->GetFontHeight($img);
$height += $this->week->iTitleVertMargin;
}
if( $this->month->iShowLabels ) {
$height += $this->month->GetFontHeight($img);
$height += $this->month->iTitleVertMargin;
}
if( $this->year->iShowLabels ) {
$height += $this->year->GetFontHeight($img);
$height += $this->year->iTitleVertMargin;
}
return $height;
}
 
// Get width (in pixels) for a single day
function GetDayWidth() {
return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays();
}
 
// Get width (in pixels) for a single hour
function GetHourWidth() {
return $this->GetDayWidth() / 24 ;
}
 
function GetMinuteWidth() {
return $this->GetHourWidth() / 60 ;
}
 
// Nuber of days in a year
function GetNumDaysInYear($aYear) {
if( $this->IsLeap($aYear) )
return 366;
else
return 365;
}
 
// Get week number
function GetWeekNbr($aDate,$aSunStart=true) {
// We can't use the internal strftime() since it gets the weeknumber
// wrong since it doesn't follow ISO on all systems since this is
// system linrary dependent.
// Even worse is that this works differently if we are on a Windows
// or UNIX box (it even differs between UNIX boxes how strftime()
// is natively implemented)
//
// Credit to Nicolas Hoizey <nhoizey@phpheaven.net> for this elegant
// version of Week Nbr calculation.
 
$day = $this->NormalizeDate($aDate);
if( $aSunStart )
$day += 60*60*24;
 
/*-------------------------------------------------------------------------
According to ISO-8601 :
"Week 01 of a year is per definition the first week that has the Thursday in this year,
which is equivalent to the week that contains the fourth day of January.
In other words, the first week of a new year is the week that has the majority of its
days in the new year."
 
Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!!
 
day of year = date("z", $day) + 1
offset to thursday = 3 - (date("w", $day) + 6) % 7
first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7
week number = (thursday's day of year - first thursday's day of year) / 7 + 1
---------------------------------------------------------------------------*/
 
$thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday
$week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7;
 
return $week;
}
 
// Is year a leap year?
function IsLeap($aYear) {
// Is the year a leap year?
//$year = 0+date("Y",$aDate);
if( $aYear % 4 == 0)
if( !($aYear % 100 == 0) || ($aYear % 400 == 0) )
return true;
return false;
}
 
// Get current year
function GetYear($aDate) {
return 0+Date("Y",$aDate);
}
 
// Return number of days in a year
function GetNumDaysInMonth($aMonth,$aYear) {
$days=array(31,28,31,30,31,30,31,31,30,31,30,31);
$daysl=array(31,29,31,30,31,30,31,31,30,31,30,31);
if( $this->IsLeap($aYear))
return $daysl[$aMonth];
else
return $days[$aMonth];
}
 
// Get day in month
function GetMonthDayNbr($aDate) {
return 0+strftime("%d",$aDate);
}
 
// Get day in year
function GetYearDayNbr($aDate) {
return 0+strftime("%j",$aDate);
}
 
// Get month number
function GetMonthNbr($aDate) {
return 0+strftime("%m",$aDate);
}
 
// Translate a date to screen coordinates (horizontal scale)
function TranslateDate($aDate) {
//
// In order to handle the problem with Daylight savings time
// the scale written with equal number of seconds per day beginning
// with the start date. This means that we "cement" the state of
// DST as it is in the start date. If later the scale includes the
// switchover date (depends on the locale) we need to adjust back
// if the date we try to translate has a different DST status since
// we would otherwise be off by one hour.
$aDate = $this->NormalizeDate($aDate);
$tmp = localtime($aDate);
$cloc = $tmp[8];
$tmp = localtime($this->iStartDate);
$sloc = $tmp[8];
$offset = 0;
if( $sloc != $cloc) {
if( $sloc )
$offset = 3600;
else
$offset = -3600;
}
$img=$this->iImg;
return ($aDate-$this->iStartDate-$offset)/SECPERDAY*$this->GetDayWidth()+$img->left_margin+$this->iLabelWidth;;
}
 
// Get screen coordinatesz for the vertical position for a bar
function TranslateVertPos($aPos,$atTop=false) {
$img=$this->iImg;
if( $aPos > $this->iVertLines )
JpGraphError::RaiseL(6015,$aPos);
// 'Illegal vertical position %d'
if( $this->iVertLayout == GANTT_EVEN ) {
// Position the top bar at 1 vert spacing from the scale
$pos = round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing);
}
else {
// position the top bar at 1/2 a vert spacing from the scale
$pos = round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing);
}
 
if( $atTop )
$pos -= $this->iVertSpacing;
 
return $pos;
}
 
// What is the vertical spacing?
function GetVertSpacing() {
return $this->iVertSpacing;
}
 
// Convert a date to timestamp
function NormalizeDate($aDate) {
if( $aDate === false ) return false;
if( is_string($aDate) ) {
$t = strtotime($aDate);
if( $t === FALSE || $t === -1 ) {
JpGraphError::RaiseL(6016,$aDate);
//("Date string ($aDate) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30");
}
return $t;
}
elseif( is_int($aDate) || is_float($aDate) )
return $aDate;
else
JpGraphError::RaiseL(6017,$aDate);
//Unknown date format in GanttScale ($aDate).");
}
 
 
// Convert a time string to minutes
 
function TimeToMinutes($aTimeString) {
// Split in hours and minutes
$pos=strpos($aTimeString,':');
$minint=60;
if( $pos === false ) {
$hourint = $aTimeString;
$minint = 0;
}
else {
$hourint = floor(substr($aTimeString,0,$pos));
$minint = floor(substr($aTimeString,$pos+1));
}
$minint += 60 * $hourint;
return $minint;
}
 
// Stroke the day scale (including gridlines)
function StrokeMinutes($aYCoord,$getHeight=false) {
$img=$this->iImg;
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->minute->iShowLabels ) {
$img->SetFont($this->minute->iFFamily,$this->minute->iFStyle,$this->minute->iFSize);
$yb = $yt + $img->GetFontHeight() +
$this->minute->iTitleVertMargin + $this->minute->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb = $img->width-$img->right_margin+1;
$img->SetColor($this->minute->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$day = date('w',$this->iStartDate);
$minint = $this->minute->GetIntervall() ;
 
if( 60 % $minint !== 0 ) {
JpGraphError::RaiseL(6018,$minint);
//'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.');
}
 
 
$n = 60 / $minint;
$datestamp = $this->iStartDate;
$width = $this->GetHourWidth() / $n ;
if( $width < 8 ) {
// TO small width to draw minute scale
JpGraphError::RaiseL(6019,$width);
//('The available width ('.$width.') for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.');
}
 
$nh = ceil(24*60 / $this->TimeToMinutes($this->hour->GetIntervall()) );
$nd = $this->GetNumberOfDays();
// Convert to intervall to seconds
$minint *= 60;
for($j=0; $j < $nd; ++$j, $day += 1, $day %= 7) {
for( $k=0; $k < $nh; ++$k ) {
for($i=0; $i < $n ;++$i, $x+=$width, $datestamp += $minint ) {
if( $day==6 || $day==0 ) {
 
$img->PushColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground )
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight);
$img->PopColor();
 
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
 
switch( $this->minute->iStyle ) {
case MINUTESTYLE_CUSTOM:
$txt = date($this->minute->iLabelFormStr,$datestamp);
break;
case MINUTESTYLE_MM:
default:
// 15
$txt = date('i',$datestamp);
break;
}
$img->StrokeText(round($x+$width/2),round($yb-$this->minute->iTitleVertMargin),$txt);
 
// Fix a rounding problem the wrong way ..
// If we also have hour scale then don't draw the firsta or last
// gridline since that will be overwritten by the hour scale gridline if such exists.
// However, due to the propagation of rounding of the 'x+=width' term in the loop
// this might sometimes be one pixel of so we fix this by not drawing it.
// The proper way to fix it would be to re-calculate the scale for each step and
// not using the additive term.
if( !(($i == $n || $i==0) && $this->hour->iShowLabels && $this->hour->grid->iShow) ) {
$img->SetColor($this->minute->grid->iColor);
$img->SetLineWeight($this->minute->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->minute->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
}
}
}
}
$img->SetColor($this->minute->iFrameColor);
$img->SetLineWeight($this->minute->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
 
// Stroke the day scale (including gridlines)
function StrokeHours($aYCoord,$getHeight=false) {
$img=$this->iImg;
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->hour->iShowLabels ) {
$img->SetFont($this->hour->iFFamily,$this->hour->iFStyle,$this->hour->iFSize);
$yb = $yt + $img->GetFontHeight() +
$this->hour->iTitleVertMargin + $this->hour->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb = $img->width-$img->right_margin+1;
$img->SetColor($this->hour->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$tmp = $this->hour->GetIntervall() ;
$minint = $this->TimeToMinutes($tmp);
if( 1440 % $minint !== 0 ) {
JpGraphError::RaiseL(6020,$tmp);
//('Intervall for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an intervall of '.$tmp);
}
 
$n = ceil(24*60 / $minint );
$datestamp = $this->iStartDate;
$day = date('w',$this->iStartDate);
$doback = !$this->minute->iShowLabels;
$width = $this->GetDayWidth() / $n ;
for($j=0; $j < $this->GetNumberOfDays(); ++$j, $day += 1,$day %= 7) {
for($i=0; $i < $n ;++$i, $x+=$width) {
if( $day==6 || $day==0 ) {
 
$img->PushColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground && $doback )
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight);
$img->PopColor();
 
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
 
switch( $this->hour->iStyle ) {
case HOURSTYLE_HMAMPM:
// 1:35pm
$txt = date('g:ia',$datestamp);
break;
case HOURSTYLE_H24:
// 13
$txt = date('H',$datestamp);
break;
case HOURSTYLE_HAMPM:
$txt = date('ga',$datestamp);
break;
case HOURSTYLE_CUSTOM:
$txt = date($this->hour->iLabelFormStr,$datestamp);
break;
case HOURSTYLE_HM24:
default:
$txt = date('H:i',$datestamp);
break;
}
$img->StrokeText(round($x+$width/2),round($yb-$this->hour->iTitleVertMargin),$txt);
$img->SetColor($this->hour->grid->iColor);
$img->SetLineWeight($this->hour->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->hour->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
//$datestamp += $minint*60
$datestamp = mktime(date('H',$datestamp),date('i',$datestamp)+$minint,0,
date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp));
 
}
}
$img->SetColor($this->hour->iFrameColor);
$img->SetLineWeight($this->hour->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
 
 
// Stroke the day scale (including gridlines)
function StrokeDays($aYCoord,$getHeight=false) {
$img=$this->iImg;
$daywidth=$this->GetDayWidth();
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->day->iShowLabels ) {
$img->SetFont($this->day->iFFamily,$this->day->iFStyle,$this->day->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->day->iTitleVertMargin + $this->day->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb=$img->width-$img->right_margin+1;
$img->SetColor($this->day->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$day = date('w',$this->iStartDate);
$datestamp = $this->iStartDate;
 
$doback = !($this->hour->iShowLabels || $this->minute->iShowLabels);
 
setlocale(LC_TIME,$this->iDateLocale->iLocale);
 
for($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) {
if( $day==6 || $day==0 ) {
$img->SetColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground && $doback)
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,
$x+$daywidth,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,
$x+$daywidth,$yb-$this->day->iFrameWeight);
}
 
$mn = strftime('%m',$datestamp);
if( $mn[0]=='0' )
$mn = $mn[1];
 
switch( $this->day->iStyle ) {
case DAYSTYLE_LONG:
// "Monday"
$txt = strftime('%A',$datestamp);
break;
case DAYSTYLE_SHORT:
// "Mon"
$txt = strftime('%a',$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE1:
// "Mon 23/6"
$txt = strftime('%a %d/'.$mn,$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE2:
// "Mon 23 Jun"
$txt = strftime('%a %d %b',$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE3:
// "Mon 23 Jun 2003"
$txt = strftime('%a %d %b %Y',$datestamp);
break;
case DAYSTYLE_LONGDAYDATE1:
// "Monday 23 Jun"
$txt = strftime('%A %d %b',$datestamp);
break;
case DAYSTYLE_LONGDAYDATE2:
// "Monday 23 Jun 2003"
$txt = strftime('%A %d %b %Y',$datestamp);
break;
case DAYSTYLE_SHORTDATE1:
// "23/6"
$txt = strftime('%d/'.$mn,$datestamp);
break;
case DAYSTYLE_SHORTDATE2:
// "23 Jun"
$txt = strftime('%d %b',$datestamp);
break;
case DAYSTYLE_SHORTDATE3:
// "Mon 23"
$txt = strftime('%a %d',$datestamp);
break;
case DAYSTYLE_SHORTDATE4:
// "23"
$txt = strftime('%d',$datestamp);
break;
case DAYSTYLE_CUSTOM:
// Custom format
$txt = strftime($this->day->iLabelFormStr,$datestamp);
break;
case DAYSTYLE_ONELETTER:
default:
// "M"
$txt = strftime('%A',$datestamp);
$txt = strtoupper($txt[0]);
break;
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
$img->StrokeText(round($x+$daywidth/2+1),
round($yb-$this->day->iTitleVertMargin),$txt);
$img->SetColor($this->day->grid->iColor);
$img->SetLineWeight($this->day->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->day->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$datestamp = mktime(0,0,0,date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp));
//$datestamp += SECPERDAY;
 
}
$img->SetColor($this->day->iFrameColor);
$img->SetLineWeight($this->day->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
 
// Stroke week header and grid
function StrokeWeeks($aYCoord,$getHeight=false) {
if( $this->week->iShowLabels ) {
$img=$this->iImg;
$yt=$aYCoord+$img->top_margin;
$img->SetFont($this->week->iFFamily,$this->week->iFStyle,$this->week->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->week->iTitleVertMargin + $this->week->iFrameWeight;
 
if( $getHeight ) {
return $yb - $img->top_margin;
}
 
$xt=$img->left_margin+$this->iLabelWidth;
$weekwidth=$this->GetDayWidth()*7;
$wdays=$this->iDateLocale->GetDayAbb();
$xb=$img->width-$img->right_margin+1;
$week = $this->iStartDate;
$weeknbr=$this->GetWeekNbr($week);
$img->SetColor($this->week->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$img->SetColor($this->week->grid->iColor);
$x = $xt;
if( $this->week->iStyle==WEEKSTYLE_WNBR ) {
$img->SetTextAlign("center");
$txtOffset = $weekwidth/2+1;
}
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$img->SetTextAlign("left");
$txtOffset = 3;
}
else {
JpGraphError::RaiseL(6021);
//("Unknown formatting style for week.");
}
 
for($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) {
$img->PushColor($this->week->iTextColor);
 
if( $this->week->iStyle==WEEKSTYLE_WNBR )
$txt = sprintf($this->week->iLabelFormStr,$weeknbr);
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR )
$txt = date("j/n",$week);
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$monthnbr = date("n",$week)-1;
$shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr);
$txt = Date("j",$week)." ".$shortmonth;
}
 
if( $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$w = sprintf($this->week->iLabelFormStr,$weeknbr);
$txt .= ' '.$w;
}
 
$img->StrokeText(round($x+$txtOffset),
round($yb-$this->week->iTitleVertMargin),$txt);
 
$week = strtotime('+7 day',$week);
$weeknbr = $this->GetWeekNbr($week);
$img->PopColor();
$img->SetLineWeight($this->week->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->week->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
}
$img->SetColor($this->week->iFrameColor);
$img->SetLineWeight($this->week->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
 
// Format the mont scale header string
function GetMonthLabel($aMonthNbr,$year) {
$sn = $this->iDateLocale->GetShortMonthName($aMonthNbr);
$ln = $this->iDateLocale->GetLongMonthName($aMonthNbr);
switch($this->month->iStyle) {
case MONTHSTYLE_SHORTNAME:
$m=$sn;
break;
case MONTHSTYLE_LONGNAME:
$m=$ln;
break;
case MONTHSTYLE_SHORTNAMEYEAR2:
$m=$sn." '".substr("".$year,2);
break;
case MONTHSTYLE_SHORTNAMEYEAR4:
$m=$sn." ".$year;
break;
case MONTHSTYLE_LONGNAMEYEAR2:
$m=$ln." '".substr("".$year,2);
break;
case MONTHSTYLE_LONGNAMEYEAR4:
$m=$ln." ".$year;
break;
case MONTHSTYLE_FIRSTLETTER:
$m=$sn[0];
break;
}
return $m;
}
 
// Stroke month scale and gridlines
function StrokeMonths($aYCoord,$getHeight=false) {
if( $this->month->iShowLabels ) {
$img=$this->iImg;
$img->SetFont($this->month->iFFamily,$this->month->iFStyle,$this->month->iFSize);
$yt=$aYCoord+$img->top_margin;
$yb=$yt + $img->GetFontHeight() + $this->month->iTitleVertMargin + $this->month->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$monthnbr = $this->GetMonthNbr($this->iStartDate)-1;
$xt=$img->left_margin+$this->iLabelWidth;
$xb=$img->width-$img->right_margin+1;
 
$img->SetColor($this->month->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$img->SetLineWeight($this->month->grid->iWeight);
$img->SetColor($this->month->iTextColor);
$year = 0+strftime("%Y",$this->iStartDate);
$img->SetTextAlign("center");
if( $this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate)
&& $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate) ) {
$monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1);
}
else {
$monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr,$year)-$this->GetMonthDayNbr($this->iStartDate)+1);
}
// Is it enough space to stroke the first month?
$monthName = $this->GetMonthLabel($monthnbr,$year);
if( $monthwidth >= 1.2*$img->GetTextWidth($monthName) ) {
$img->SetColor($this->month->iTextColor);
$img->StrokeText(round($xt+$monthwidth/2+1),
round($yb-$this->month->iTitleVertMargin),
$monthName);
}
$x = $xt + $monthwidth;
while( $x < $xb ) {
$img->SetColor($this->month->grid->iColor);
$img->Line($x,$yt,$x,$yb);
$this->month->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$monthnbr++;
if( $monthnbr==12 ) {
$monthnbr=0;
$year++;
}
$monthName = $this->GetMonthLabel($monthnbr,$year);
$monthwidth=$this->GetDayWidth()*$this->GetNumDaysInMonth($monthnbr,$year);
if( $x + $monthwidth < $xb )
$w = $monthwidth;
else
$w = $xb-$x;
if( $w >= 1.2*$img->GetTextWidth($monthName) ) {
$img->SetColor($this->month->iTextColor);
$img->StrokeText(round($x+$w/2+1),
round($yb-$this->month->iTitleVertMargin),$monthName);
}
$x += $monthwidth;
}
$img->SetColor($this->month->iFrameColor);
$img->SetLineWeight($this->month->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
 
// Stroke year scale and gridlines
function StrokeYears($aYCoord,$getHeight=false) {
if( $this->year->iShowLabels ) {
$img=$this->iImg;
$yt=$aYCoord+$img->top_margin;
$img->SetFont($this->year->iFFamily,$this->year->iFStyle,$this->year->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->year->iTitleVertMargin + $this->year->iFrameWeight;
 
if( $getHeight ) {
return $yb - $img->top_margin;
}
 
$xb=$img->width-$img->right_margin+1;
$xt=$img->left_margin+$this->iLabelWidth;
$year = $this->GetYear($this->iStartDate);
$img->SetColor($this->year->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$img->SetLineWeight($this->year->grid->iWeight);
$img->SetTextAlign("center");
if( $year == $this->GetYear($this->iEndDate) )
$yearwidth=$this->GetDayWidth()*($this->GetYearDayNbr($this->iEndDate)-$this->GetYearDayNbr($this->iStartDate)+1);
else
$yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1);
 
// The space for a year must be at least 20% bigger than the actual text
// so we allow 10% margin on each side
if( $yearwidth >= 1.20*$img->GetTextWidth("".$year) ) {
$img->SetColor($this->year->iTextColor);
$img->StrokeText(round($xt+$yearwidth/2+1),
round($yb-$this->year->iTitleVertMargin),
$year);
}
$x = $xt + $yearwidth;
while( $x < $xb ) {
$img->SetColor($this->year->grid->iColor);
$img->Line($x,$yt,$x,$yb);
$this->year->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$year += 1;
$yearwidth=$this->GetDayWidth()*$this->GetNumDaysInYear($year);
if( $x + $yearwidth < $xb )
$w = $yearwidth;
else
$w = $xb-$x;
if( $w >= 1.2*$img->GetTextWidth("".$year) ) {
$img->SetColor($this->year->iTextColor);
$img->StrokeText(round($x+$w/2+1),
round($yb-$this->year->iTitleVertMargin),
$year);
}
$x += $yearwidth;
}
$img->SetColor($this->year->iFrameColor);
$img->SetLineWeight($this->year->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
 
// Stroke table title (upper left corner)
function StrokeTableHeaders($aYBottom) {
$img=$this->iImg;
$xt=$img->left_margin;
$yt=$img->top_margin;
$xb=$xt+$this->iLabelWidth;
$yb=$aYBottom+$img->top_margin;
 
if( $this->tableTitle->iShow ) {
$img->SetColor($this->iTableHeaderBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$this->tableTitle->Align("center","top");
$this->tableTitle->Stroke($img,$xt+($xb-$xt)/2+1,$yt+2);
$img->SetColor($this->iTableHeaderFrameColor);
$img->SetLineWeight($this->iTableHeaderFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
}
 
$this->actinfo->Stroke($img,$xt,$yt,$xb,$yb,$this->tableTitle->iShow);
 
 
// Draw the horizontal dividing line
$this->dividerh->Stroke($img,$xt,$yb,$img->width-$img->right_margin,$yb);
 
// Draw the vertical dividing line
// We do the width "manually" since we want the line only to grow
// to the left
$fancy = $this->divider->iStyle == 'fancy' ;
if( $fancy ) {
$this->divider->iStyle = 'solid';
}
 
$tmp = $this->divider->iWeight;
$this->divider->iWeight=1;
$y = $img->height-$img->bottom_margin;
for($i=0; $i < $tmp; ++$i ) {
$this->divider->Stroke($img,$xb-$i,$yt,$xb-$i,$y);
}
 
// Should we draw "fancy" divider
if( $fancy ) {
$img->SetLineWeight(1);
$img->SetColor($this->iTableHeaderFrameColor);
$img->Line($xb,$yt,$xb,$y);
$img->Line($xb-$tmp+1,$yt,$xb-$tmp+1,$y);
$img->SetColor('white');
$img->Line($xb-$tmp+2,$yt,$xb-$tmp+2,$y);
}
}
 
// Main entry point to stroke scale
function Stroke() {
if( !$this->IsRangeSet() ) {
JpGraphError::RaiseL(6022);
//("Gantt scale has not been specified.");
}
$img=$this->iImg;
 
// If minutes are displayed then hour interval must be 1
if( $this->IsDisplayMinute() && $this->hour->GetIntervall() > 1 ) {
JpGraphError::RaiseL(6023);
//('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).');
}
 
// Stroke all headers. As argument we supply the offset from the
// top which depends on any previous headers
 
// First find out the height of each header
$offy=$this->StrokeYears(0,true);
$offm=$this->StrokeMonths($offy,true);
$offw=$this->StrokeWeeks($offm,true);
$offd=$this->StrokeDays($offw,true);
$offh=$this->StrokeHours($offd,true);
$offmin=$this->StrokeMinutes($offh,true);
 
 
// ... then we can stroke them in the "backwards order to ensure that
// the larger scale gridlines is stroked over the smaller scale gridline
$this->StrokeMinutes($offh);
$this->StrokeHours($offd);
$this->StrokeDays($offw);
$this->StrokeWeeks($offm);
$this->StrokeMonths($offy);
$this->StrokeYears(0);
 
// Now when we now the oaverall size of the scale headers
// we can stroke the overall table headers
$this->StrokeTableHeaders($offmin);
 
// Now we can calculate the correct scaling factor for each vertical position
$this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd;
 
$this->iVertHeaderSize = $offmin;
if( $this->iVertSpacing == -1 )
$this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines;
}
}
 
 
//===================================================
// CLASS GanttConstraint
// Just a structure to store all the values for a constraint
//===================================================
class GanttConstraint {
public $iConstrainRow;
public $iConstrainType;
public $iConstrainColor;
public $iConstrainArrowSize;
public $iConstrainArrowType;
 
//---------------
// CONSTRUCTOR
function __construct($aRow,$aType,$aColor,$aArrowSize,$aArrowType){
$this->iConstrainType = $aType;
$this->iConstrainRow = $aRow;
$this->iConstrainColor=$aColor;
$this->iConstrainArrowSize=$aArrowSize;
$this->iConstrainArrowType=$aArrowType;
}
}
 
 
//===================================================
// CLASS GanttPlotObject
// The common signature for a Gantt object
//===================================================
class GanttPlotObject {
public $title,$caption;
public $csimarea='',$csimtarget='',$csimwintarget='',$csimalt='';
public $constraints = array();
public $iCaptionMargin=5;
public $iConstrainPos=array();
protected $iStart=""; // Start date
public $iVPos=0; // Vertical position
protected $iLabelLeftMargin=2; // Title margin
 
function __construct() {
$this->title = new TextProperty();
$this->title->Align('left','center');
$this->caption = new TextProperty();
}
 
function GetCSIMArea() {
return $this->csimarea;
}
 
function SetCSIMTarget($aTarget,$aAlt='',$aWinTarget='') {
if( !is_string($aTarget) ) {
$tv = substr(var_export($aTarget,true),0,40);
JpGraphError::RaiseL(6024,$tv);
//('CSIM Target must be specified as a string.'."\nStart of target is:\n$tv");
}
if( !is_string($aAlt) ) {
$tv = substr(var_export($aAlt,true),0,40);
JpGraphError::RaiseL(6025,$tv);
//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv");
}
 
$this->csimtarget=$aTarget;
$this->csimwintarget=$aWinTarget;
$this->csimalt=$aAlt;
}
 
function SetCSIMAlt($aAlt) {
if( !is_string($aAlt) ) {
$tv = substr(var_export($aAlt,true),0,40);
JpGraphError::RaiseL(6025,$tv);
//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv");
}
$this->csimalt=$aAlt;
}
 
function SetConstrain($aRow,$aType,$aColor='black',$aArrowSize=ARROW_S2,$aArrowType=ARROWT_SOLID) {
$this->constraints[] = new GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType);
}
 
function SetConstrainPos($xt,$yt,$xb,$yb) {
$this->iConstrainPos = array($xt,$yt,$xb,$yb);
}
 
function GetMinDate() {
return $this->iStart;
}
 
function GetMaxDate() {
return $this->iStart;
}
 
function SetCaptionMargin($aMarg) {
$this->iCaptionMargin=$aMarg;
}
 
function GetAbsHeight($aImg) {
return 0;
}
 
function GetLineNbr() {
return $this->iVPos;
}
 
function SetLabelLeftMargin($aOff) {
$this->iLabelLeftMargin=$aOff;
}
 
function StrokeActInfo($aImg,$aScale,$aYPos) {
$cols=array();
$aScale->actinfo->GetColStart($aImg,$cols,true);
$this->title->Stroke($aImg,$cols,$aYPos);
}
}
 
//===================================================
// CLASS Progress
// Holds parameters for the progress indicator
// displyed within a bar
//===================================================
class Progress {
public $iProgress=-1;
public $iPattern=GANTT_SOLID;
public $iColor="black", $iFillColor='black';
public $iDensity=98, $iHeight=0.65;
 
function Set($aProg) {
if( $aProg < 0.0 || $aProg > 1.0 ) {
JpGraphError::RaiseL(6027);
//("Progress value must in range [0, 1]");
}
$this->iProgress = $aProg;
}
 
function SetPattern($aPattern,$aColor="blue",$aDensity=98) {
$this->iPattern = $aPattern;
$this->iColor = $aColor;
$this->iDensity = $aDensity;
}
 
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
 
function SetHeight($aHeight) {
$this->iHeight = $aHeight;
}
}
 
define('GANTT_HGRID1',0);
define('GANTT_HGRID2',1);
 
//===================================================
// CLASS HorizontalGridLine
// Responsible for drawinf horizontal gridlines and filled alternatibg rows
//===================================================
class HorizontalGridLine {
private $iGraph=NULL;
private $iRowColor1 = '', $iRowColor2 = '';
private $iShow=false;
private $line=null;
private $iStart=0; // 0=from left margin, 1=just along header
 
function __construct() {
$this->line = new LineProperty();
$this->line->SetColor('gray@0.4');
$this->line->SetStyle('dashed');
}
 
function Show($aShow=true) {
$this->iShow = $aShow;
}
 
function SetRowFillColor($aColor1,$aColor2='') {
$this->iRowColor1 = $aColor1;
$this->iRowColor2 = $aColor2;
}
 
function SetStart($aStart) {
$this->iStart = $aStart;
}
 
function Stroke($aImg,$aScale) {
 
if( ! $this->iShow ) return;
 
// Get horizontal width of line
/*
$limst = $aScale->iStartDate;
$limen = $aScale->iEndDate;
$xt = round($aScale->TranslateDate($aScale->iStartDate));
$xb = round($aScale->TranslateDate($limen));
*/
 
if( $this->iStart === 0 ) {
$xt = $aImg->left_margin-1;
}
else {
$xt = round($aScale->TranslateDate($aScale->iStartDate))+1;
}
 
$xb = $aImg->width-$aImg->right_margin;
 
$yt = round($aScale->TranslateVertPos(0));
$yb = round($aScale->TranslateVertPos(1));
$height = $yb - $yt;
 
// Loop around for all lines in the chart
for($i=0; $i < $aScale->iVertLines; ++$i ) {
$yb = $yt - $height;
$this->line->Stroke($aImg,$xt,$yb,$xb,$yb);
if( $this->iRowColor1 !== '' ) {
if( $i % 2 == 0 ) {
$aImg->PushColor($this->iRowColor1);
$aImg->FilledRectangle($xt,$yt,$xb,$yb);
$aImg->PopColor();
}
elseif( $this->iRowColor2 !== '' ) {
$aImg->PushColor($this->iRowColor2);
$aImg->FilledRectangle($xt,$yt,$xb,$yb);
$aImg->PopColor();
}
}
$yt = round($aScale->TranslateVertPos($i+1));
}
$yb = $yt - $height;
$this->line->Stroke($aImg,$xt,$yb,$xb,$yb);
}
}
 
 
//===================================================
// CLASS GanttBar
// Responsible for formatting individual gantt bars
//===================================================
class GanttBar extends GanttPlotObject {
public $progress;
public $leftMark,$rightMark;
private $iEnd;
private $iHeightFactor=0.5;
private $iFillColor="white",$iFrameColor="black";
private $iShadow=false,$iShadowColor="darkgray",$iShadowWidth=1,$iShadowFrame="black";
private $iPattern=GANTT_RDIAG,$iPatternColor="blue",$iPatternDensity=95;
private $iBreakStyle=false, $iBreakLineStyle='dotted',$iBreakLineWeight=1;
//---------------
// CONSTRUCTOR
function __construct($aPos,$aLabel,$aStart,$aEnd,$aCaption="",$aHeightFactor=0.6) {
parent::__construct();
$this->iStart = $aStart;
// Is the end date given as a date or as number of days added to start date?
if( is_string($aEnd) ) {
// If end date has been specified without a time we will asssume
// end date is at the end of that date
if( strpos($aEnd,':') === false ) {
$this->iEnd = strtotime($aEnd)+SECPERDAY-1;
}
else {
$this->iEnd = $aEnd;
}
}
elseif(is_int($aEnd) || is_float($aEnd) ) {
$this->iEnd = strtotime($aStart)+round($aEnd*SECPERDAY);
}
$this->iVPos = $aPos;
$this->iHeightFactor = $aHeightFactor;
$this->title->Set($aLabel);
$this->caption = new TextProperty($aCaption);
$this->caption->Align("left","center");
$this->leftMark =new PlotMark();
$this->leftMark->Hide();
$this->rightMark=new PlotMark();
$this->rightMark->Hide();
$this->progress = new Progress();
}
 
//---------------
// PUBLIC METHODS
function SetShadow($aShadow=true,$aColor="gray") {
$this->iShadow=$aShadow;
$this->iShadowColor=$aColor;
}
 
function SetBreakStyle($aFlg=true,$aLineStyle='dotted',$aLineWeight=1) {
$this->iBreakStyle = $aFlg;
$this->iBreakLineStyle = $aLineStyle;
$this->iBreakLineWeight = $aLineWeight;
}
 
function GetMaxDate() {
return $this->iEnd;
}
 
function SetHeight($aHeight) {
$this->iHeightFactor = $aHeight;
}
 
function SetColor($aColor) {
$this->iFrameColor = $aColor;
}
 
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
 
function GetAbsHeight($aImg) {
if( is_int($this->iHeightFactor) || $this->leftMark->show || $this->rightMark->show ) {
$m=-1;
if( is_int($this->iHeightFactor) )
$m = $this->iHeightFactor;
if( $this->leftMark->show )
$m = max($m,$this->leftMark->width*2);
if( $this->rightMark->show )
$m = max($m,$this->rightMark->width*2);
return $m;
}
else
return -1;
}
 
function SetPattern($aPattern,$aColor="blue",$aDensity=95) {
$this->iPattern = $aPattern;
$this->iPatternColor = $aColor;
$this->iPatternDensity = $aDensity;
}
 
function Stroke($aImg,$aScale) {
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern,$this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
 
// If height factor is specified as a float between 0,1 then we take it as meaning
// percetage of the scale width between horizontal line.
// If it is an integer > 1 we take it to mean the absolute height in pixels
if( $this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1)
$vs = $aScale->GetVertSpacing()*$this->iHeightFactor;
elseif(is_int($this->iHeightFactor) && $this->iHeightFactor>2 && $this->iHeightFactor < 200 )
$vs = $this->iHeightFactor;
else {
JpGraphError::RaiseL(6028,$this->iHeightFactor);
// ("Specified height (".$this->iHeightFactor.") for gantt bar is out of range.");
}
 
// Clip date to min max dates to show
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
 
$limst = max($st,$aScale->iStartDate);
$limen = min($en,$aScale->iEndDate);
 
$xt = round($aScale->TranslateDate($limst));
$xb = round($aScale->TranslateDate($limen));
$yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2));
$yb = round($aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2-$vs/2));
$middle = round($yt+($yb-$yt)/2);
$this->StrokeActInfo($aImg,$aScale,$middle);
 
// CSIM for title
if( ! empty($this->title->csimtarget) ) {
$colwidth = $this->title->GetColWidth($aImg);
$colstarts=array();
$aScale->actinfo->GetColStart($aImg,$colstarts,true);
$n = min(count($colwidth),count($this->title->csimtarget));
for( $i=0; $i < $n; ++$i ) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb";
 
if( ! empty($this->title->csimtarget[$i]) ) {
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->title->csimtarget[$i]."\"";
 
if( ! empty($this->title->csimwintarget[$i]) ) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" ";
}
 
if( ! empty($this->title->csimalt[$i]) ) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
}
}
}
 
// Check if the bar is totally outside the current scale range
if( $en < $aScale->iStartDate || $st > $aScale->iEndDate )
return;
 
 
// Remember the positions for the bar
$this->SetConstrainPos($xt,$yt,$xb,$yb);
 
 
 
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if( $this->iBreakStyle ) {
$aImg->SetColor($this->iFrameColor);
$olds = $aImg->SetLineStyle($this->iBreakLineStyle);
$oldw = $aImg->SetLineWeight($this->iBreakLineWeight);
$aImg->StyleLine($xt,$yt,$xb,$yt);
$aImg->StyleLine($xt,$yb,$xb,$yb);
$aImg->SetLineStyle($olds);
$aImg->SetLineWeight($oldw);
}
else {
if( $this->iShadow ) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt,$yt,$xb,$yb,$this->iFillColor,$this->iShadowWidth,$this->iShadowColor);
$prect->SetPos(new Rectangle($xt+1,$yt+1,$xb-$xt-$this->iShadowWidth-2,$yb-$yt-$this->iShadowWidth-2));
$prect->Stroke($aImg);
}
else {
$prect->SetPos(new Rectangle($xt,$yt,$xb-$xt+1,$yb-$yt+1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt,$yt,$xb,$yb);
}
}
// CSIM for bar
if( ! empty($this->csimtarget) ) {
 
$coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb";
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtarget."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimarea .= " target=\"".$this->csimwintarget."\" ";
}
 
if( $this->csimalt != '' ) {
$tmp = $this->csimalt;
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
}
 
// Draw progress bar inside activity bar
if( $this->progress->iProgress > 0 ) {
 
$xtp = $aScale->TranslateDate($st);
$xbp = $aScale->TranslateDate($en);
$len = ($xbp-$xtp)*$this->progress->iProgress;
 
$endpos = $xtp+$len;
if( $endpos > $xt ) {
 
// Take away the length of the progress that is not visible (before the start date)
$len -= ($xt-$xtp);
 
// Is the the progress bar visible after the start date?
if( $xtp < $xt )
$xtp = $xt;
 
// Make sure that the progess bar doesn't extend over the end date
if( $xtp+$len-1 > $xb )
$len = $xb - $xtp ;
 
$prog = $factory->Create($this->progress->iPattern,$this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$prog->SetBackground($this->progress->iFillColor);
$barheight = ($yb-$yt+1);
if( $this->iShadow )
$barheight -= $this->iShadowWidth;
$progressheight = floor($barheight*$this->progress->iHeight);
$marg = ceil(($barheight-$progressheight)/2);
$pos = new Rectangle($xtp,$yt + $marg, $len,$barheight-2*$marg);
$prog->SetPos($pos);
$prog->Stroke($aImg);
}
}
 
// We don't plot the end mark if the bar has been capped
if( $limst == $st ) {
$y = $middle;
// We treat the RIGHT and LEFT triangle mark a little bi
// special so that these marks are placed right under the
// bar.
if( $this->leftMark->GetType() == MARK_LEFTTRIANGLE ) {
$y = $yb ;
}
$this->leftMark->Stroke($aImg,$xt,$y);
}
if( $limen == $en ) {
$y = $middle;
// We treat the RIGHT and LEFT triangle mark a little bi
// special so that these marks are placed right under the
// bar.
if( $this->rightMark->GetType() == MARK_RIGHTTRIANGLE ) {
$y = $yb ;
}
$this->rightMark->Stroke($aImg,$xb,$y);
 
$margin = $this->iCaptionMargin;
if( $this->rightMark->show )
$margin += $this->rightMark->GetWidth();
$this->caption->Stroke($aImg,$xb+$margin,$middle);
}
}
}
 
//===================================================
// CLASS MileStone
// Responsible for formatting individual milestones
//===================================================
class MileStone extends GanttPlotObject {
public $mark;
 
//---------------
// CONSTRUCTOR
function __construct($aVPos,$aLabel,$aDate,$aCaption="") {
GanttPlotObject::__construct();
$this->caption->Set($aCaption);
$this->caption->Align("left","center");
$this->caption->SetFont(FF_FONT1,FS_BOLD);
$this->title->Set($aLabel);
$this->title->SetColor("darkred");
$this->mark = new PlotMark();
$this->mark->SetWidth(10);
$this->mark->SetType(MARK_DIAMOND);
$this->mark->SetColor("darkred");
$this->mark->SetFillColor("darkred");
$this->iVPos = $aVPos;
$this->iStart = $aDate;
}
 
//---------------
// PUBLIC METHODS
 
function GetAbsHeight($aImg) {
return max($this->title->GetHeight($aImg),$this->mark->GetWidth());
}
 
function Stroke($aImg,$aScale) {
// Put the mark in the middle at the middle of the day
$d = $aScale->NormalizeDate($this->iStart)+SECPERDAY/2;
$x = $aScale->TranslateDate($d);
$y = $aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2);
 
$this->StrokeActInfo($aImg,$aScale,$y);
 
// CSIM for title
if( ! empty($this->title->csimtarget) ) {
 
$yt = round($y - $this->title->GetHeight($aImg)/2);
$yb = round($y + $this->title->GetHeight($aImg)/2);
 
$colwidth = $this->title->GetColWidth($aImg);
$colstarts=array();
$aScale->actinfo->GetColStart($aImg,$colstarts,true);
$n = min(count($colwidth),count($this->title->csimtarget));
for( $i=0; $i < $n; ++$i ) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb";
 
if( !empty($this->title->csimtarget[$i]) ) {
 
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->title->csimtarget[$i]."\"";
 
if( !empty($this->title->csimwintarget[$i]) ) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\"";
}
 
if( ! empty($this->title->csimalt[$i]) ) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
}
}
}
 
if( $d < $aScale->iStartDate || $d > $aScale->iEndDate )
return;
 
// Remember the coordinates for any constrains linking to
// this milestone
$w = $this->mark->GetWidth()/2;
$this->SetConstrainPos($x,round($y-$w),$x,round($y+$w));
 
// Setup CSIM
if( $this->csimtarget != '' ) {
$this->mark->SetCSIMTarget( $this->csimtarget );
$this->mark->SetCSIMAlt( $this->csimalt );
}
 
$this->mark->Stroke($aImg,$x,$y);
$this->caption->Stroke($aImg,$x+$this->mark->width/2+$this->iCaptionMargin,$y);
 
$this->csimarea .= $this->mark->GetCSIMAreas();
}
}
 
 
//===================================================
// CLASS GanttVLine
// Responsible for formatting individual milestones
//===================================================
 
class TextPropertyBelow extends TextProperty {
function __construct($aTxt='') {
parent::__construct($aTxt);
}
 
function GetColWidth($aImg,$aMargin=0) {
// Since we are not stroking the title in the columns
// but rather under the graph we want this to return 0.
return array(0);
}
}
 
class GanttVLine extends GanttPlotObject {
 
private $iLine,$title_margin=3, $iDayOffset=0.5;
private $iStartRow = -1, $iEndRow = -1;
 
//---------------
// CONSTRUCTOR
function __construct($aDate,$aTitle="",$aColor="darkred",$aWeight=2,$aStyle="solid") {
GanttPlotObject::__construct();
$this->iLine = new LineProperty();
$this->iLine->SetColor($aColor);
$this->iLine->SetWeight($aWeight);
$this->iLine->SetStyle($aStyle);
$this->iStart = $aDate;
$this->title = new TextPropertyBelow();
$this->title->Set($aTitle);
}
 
//---------------
// PUBLIC METHODS
 
// Set start and end rows for the VLine. By default the entire heigh of the
// Gantt chart is used
function SetRowSpan($aStart, $aEnd=-1) {
$this->iStartRow = $aStart;
$this->iEndRow = $aEnd;
}
 
function SetDayOffset($aOff=0.5) {
if( $aOff < 0.0 || $aOff > 1.0 ) {
JpGraphError::RaiseL(6029);
//("Offset for vertical line must be in range [0,1]");
}
$this->iDayOffset = $aOff;
}
 
function SetTitleMargin($aMarg) {
$this->title_margin = $aMarg;
}
 
function SetWeight($aWeight) {
$this->iLine->SetWeight($aWeight);
}
 
function Stroke($aImg,$aScale) {
$d = $aScale->NormalizeDate($this->iStart);
if( $d < $aScale->iStartDate || $d > $aScale->iEndDate )
return;
if($this->iDayOffset != 0.0)
$d += 24*60*60*$this->iDayOffset;
$x = $aScale->TranslateDate($d);//d=1006858800,
 
if( $this->iStartRow > -1 ) {
$y1 = $aScale->TranslateVertPos($this->iStartRow,true) ;
}
else {
$y1 = $aScale->iVertHeaderSize+$aImg->top_margin;
}
 
if( $this->iEndRow > -1 ) {
$y2 = $aScale->TranslateVertPos($this->iEndRow);
}
else {
$y2 = $aImg->height - $aImg->bottom_margin;
}
 
$this->iLine->Stroke($aImg,$x,$y1,$x,$y2);
$this->title->Align("center","top");
$this->title->Stroke($aImg,$x,$y2+$this->title_margin);
}
}
 
//===================================================
// CLASS LinkArrow
// Handles the drawing of a an arrow
//===================================================
class LinkArrow {
private $ix,$iy;
private $isizespec = array(
array(2,3),array(3,5),array(3,8),array(6,15),array(8,22));
private $iDirection=ARROW_DOWN,$iType=ARROWT_SOLID,$iSize=ARROW_S2;
private $iColor='black';
 
function __construct($x,$y,$aDirection,$aType=ARROWT_SOLID,$aSize=ARROW_S2) {
$this->iDirection = $aDirection;
$this->iType = $aType;
$this->iSize = $aSize;
$this->ix = $x;
$this->iy = $y;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetSize($aSize) {
$this->iSize = $aSize;
}
 
function SetType($aType) {
$this->iType = $aType;
}
 
function Stroke($aImg) {
list($dx,$dy) = $this->isizespec[$this->iSize];
$x = $this->ix;
$y = $this->iy;
switch ( $this->iDirection ) {
case ARROW_DOWN:
$c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y);
break;
case ARROW_UP:
$c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y);
break;
case ARROW_LEFT:
$c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y);
break;
case ARROW_RIGHT:
$c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y);
break;
default:
JpGraphError::RaiseL(6030);
//('Unknown arrow direction for link.');
die();
break;
}
$aImg->SetColor($this->iColor);
switch( $this->iType ) {
case ARROWT_SOLID:
$aImg->FilledPolygon($c);
break;
case ARROWT_OPEN:
$aImg->Polygon($c);
break;
default:
JpGraphError::RaiseL(6031);
//('Unknown arrow type for link.');
die();
break;
}
}
}
 
//===================================================
// CLASS GanttLink
// Handles the drawing of a link line between 2 points
//===================================================
 
class GanttLink {
private $ix1,$ix2,$iy1,$iy2;
private $iPathType=2,$iPathExtend=15;
private $iColor='black',$iWeight=1;
private $iArrowSize=ARROW_S2,$iArrowType=ARROWT_SOLID;
 
function __construct($x1=0,$y1=0,$x2=0,$y2=0) {
$this->ix1 = $x1;
$this->ix2 = $x2;
$this->iy1 = $y1;
$this->iy2 = $y2;
}
 
function SetPos($x1,$y1,$x2,$y2) {
$this->ix1 = $x1;
$this->ix2 = $x2;
$this->iy1 = $y1;
$this->iy2 = $y2;
}
 
function SetPath($aPath) {
$this->iPathType = $aPath;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetArrow($aSize,$aType=ARROWT_SOLID) {
$this->iArrowSize = $aSize;
$this->iArrowType = $aType;
}
 
function SetWeight($aWeight) {
$this->iWeight = $aWeight;
}
 
function Stroke($aImg) {
// The way the path for the arrow is constructed is partly based
// on some heuristics. This is not an exact science but draws the
// path in a way that, for me, makes esthetic sence. For example
// if the start and end activities are very close we make a small
// detour to endter the target horixontally. If there are more
// space between axctivities then no suh detour is made and the
// target is "hit" directly vertical. I have tried to keep this
// simple. no doubt this could become almost infinitive complex
// and have some real AI. Feel free to modify this.
// This will no-doubt be tweaked as times go by. One design aim
// is to avoid having the user choose what types of arrow
// he wants.
 
// The arrow is drawn between (x1,y1) to (x2,y2)
$x1 = $this->ix1 ;
$x2 = $this->ix2 ;
$y1 = $this->iy1 ;
$y2 = $this->iy2 ;
 
// Depending on if the target is below or above we have to
// handle thi different.
if( $y2 > $y1 ) {
$arrowtype = ARROW_DOWN;
$midy = round(($y2-$y1)/2+$y1);
if( $x2 > $x1 ) {
switch ( $this->iPathType ) {
case 0:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 1:
case 2:
case 3:
$c = array($x1,$y1,$x2,$y1,$x2,$y2);
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type (='.$this->iPathType .') specified for link.');
exit(1);
break;
}
}
else {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 2:
// Always extend out horizontally a bit from the first point
// If we draw a link back in time (end to start) and the bars
// are very close we also change the path so it comes in from
// the left on the activity
$c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
$x1+$this->iPathExtend,$midy,
$x2,$midy,$x2,$y2);
break;
case 3:
if( $y2-$midy < 6 ) {
$c = array($x1,$y1,$x1,$midy,
$x2-$this->iPathExtend,$midy,
$x2-$this->iPathExtend,$y2,
$x2,$y2);
$arrowtype = ARROW_RIGHT;
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
exit(1);
break;
}
}
$arrow = new LinkArrow($x2,$y2,$arrowtype);
}
else {
// Y2 < Y1
$arrowtype = ARROW_UP;
$midy = round(($y1-$y2)/2+$y2);
if( $x2 > $x1 ) {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 3:
if( $midy-$y2 < 8 ) {
$arrowtype = ARROW_RIGHT;
$c = array($x1,$y1,$x1,$y2,$x2,$y2);
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
break;
}
}
else {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 2:
// Always extend out horizontally a bit from the first point
$c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
$x1+$this->iPathExtend,$midy,
$x2,$midy,$x2,$y2);
break;
case 3:
if( $midy-$y2 < 16 ) {
$arrowtype = ARROW_RIGHT;
$c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy,
$x2-$this->iPathExtend,$y2,
$x2,$y2);
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
break;
}
}
$arrow = new LinkArrow($x2,$y2,$arrowtype);
}
$aImg->SetColor($this->iColor);
$aImg->SetLineWeight($this->iWeight);
$aImg->Polygon($c);
$aImg->SetLineWeight(1);
$arrow->SetColor($this->iColor);
$arrow->SetSize($this->iArrowSize);
$arrow->SetType($this->iArrowType);
$arrow->Stroke($aImg);
}
}
 
// <EOF>
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_date.php
New file
0,0 → 1,499
<?php
/*=======================================================================
// File: JPGRAPH_DATE.PHP
// Description: Classes to handle Date scaling
// Created: 2005-05-02
// Ver: $Id: jpgraph_date.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
define('HOURADJ_1',0+30);
define('HOURADJ_2',1+30);
define('HOURADJ_3',2+30);
define('HOURADJ_4',3+30);
define('HOURADJ_6',4+30);
define('HOURADJ_12',5+30);
 
define('MINADJ_1',0+20);
define('MINADJ_5',1+20);
define('MINADJ_10',2+20);
define('MINADJ_15',3+20);
define('MINADJ_30',4+20);
 
define('SECADJ_1',0);
define('SECADJ_5',1);
define('SECADJ_10',2);
define('SECADJ_15',3);
define('SECADJ_30',4);
 
 
define('YEARADJ_1',0+30);
define('YEARADJ_2',1+30);
define('YEARADJ_5',2+30);
 
define('MONTHADJ_1',0+20);
define('MONTHADJ_6',1+20);
 
define('DAYADJ_1',0);
define('DAYADJ_WEEK',1);
define('DAYADJ_7',1);
 
define('SECPERYEAR',31536000);
define('SECPERDAY',86400);
define('SECPERHOUR',3600);
define('SECPERMIN',60);
 
 
class DateScale extends LinearScale {
private $date_format = '';
private $iStartAlign = false, $iEndAlign = false;
private $iStartTimeAlign = false, $iEndTimeAlign = false;
 
//---------------
// CONSTRUCTOR
function __construct($aMin=0,$aMax=0,$aType='x') {
assert($aType=="x");
assert($aMin<=$aMax);
 
$this->type=$aType;
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->ticks = new LinearTicks();
$this->intscale=true;
}
 
 
//------------------------------------------------------------------------------------------
// Utility Function AdjDate()
// Description: Will round a given time stamp to an even year, month or day
// argument.
//------------------------------------------------------------------------------------------
 
function AdjDate($aTime,$aRound=0,$aYearType=false,$aMonthType=false,$aDayType=false) {
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h=0;$i=0;$s=0;
if( $aYearType !== false ) {
$yearAdj = array(0=>1, 1=>2, 2=>5);
if( $aRound == 0 ) {
$y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
}
else {
++$y;
$y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
}
$m=1;$d=1;
}
elseif( $aMonthType !== false ) {
$monthAdj = array(0=>1, 1=>6);
if( $aRound == 0 ) {
$m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
$d=1;
}
else {
++$m;
$m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
$d=1;
}
}
elseif( $aDayType !== false ) {
if( $aDayType == 0 ) {
if( $aRound == 1 ) {
//++$d;
$h=23;$i=59;$s=59;
}
}
else {
// Adjust to an even week boundary.
$w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat
if( true ) { // Adjust to start on Mon
if( $w==0 ) $w=6;
else --$w;
}
if( $aRound == 0 ) {
$d -= $w;
}
else {
$d += (7-$w);
$h=23;$i=59;$s=59;
}
}
}
return mktime($h,$i,$s,$m,$d,$y);
 
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjDate that will round a timestamp to an even date rounding
// it downwards.
//------------------------------------------------------------------------------------------
function AdjStartDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjDate that will round a timestamp to an even date rounding
// it upwards
//------------------------------------------------------------------------------------------
function AdjEndDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType);
}
 
//------------------------------------------------------------------------------------------
// Utility Function AdjTime()
// Description: Will round a given time stamp to an even time according to
// argument.
//------------------------------------------------------------------------------------------
 
function AdjTime($aTime,$aRound=0,$aHourType=false,$aMinType=false,$aSecType=false) {
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime);
if( $aHourType !== false ) {
$aHourType %= 6;
$hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12);
if( $aRound == 0 )
$h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
else {
if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) {
$h++;
}
$h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
if( $h >= 24 ) {
$aTime += 86400;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h -= 24;
}
}
$i=0;$s=0;
}
elseif( $aMinType !== false ) {
$aMinType %= 5;
$minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
if( $aRound == 0 ) {
$i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType];
}
else {
if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) {
$i++;
}
$i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType];
if( $i >= 60) {
$aTime += 3600;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = 0;
}
}
$s=0;
}
elseif( $aSecType !== false ) {
$aSecType %= 5;
$secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
if( $aRound == 0 ) {
$s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType];
}
else {
$s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType];
if( $s >= 60) {
$s=0;
$aTime += 60;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = (int)date('i',$aTime);
}
}
}
return mktime($h,$i,$s,$m,$d,$y);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjTime that will round a timestamp to an even time rounding
// it downwards.
// Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20
//------------------------------------------------------------------------------------------
function AdjStartTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjTime that will round a timestamp to an even time rounding
// it upwards
// Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30
//------------------------------------------------------------------------------------------
function AdjEndTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType);
}
 
//------------------------------------------------------------------------------------------
// DateAutoScale
// Autoscale a date axis given start and end time
// Returns an array ($start,$end,$major,$minor,$format)
//------------------------------------------------------------------------------------------
function DoDateAutoScale($aStartTime,$aEndTime,$aDensity=0,$aAdjust=true) {
// Format of array
// array ( Decision point, array( array( Major-scale-step-array ),
// array( Minor-scale-step-array ),
// array( 0=date-adjust, 1=time-adjust, adjustment-alignment) )
//
$scalePoints =
array(
/* Intervall larger than 10 years */
SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2),
array(SECPERYEAR),
array(0,YEARADJ_1, 0,YEARADJ_1) ),
 
/* Intervall larger than 2 years */
SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR),
array(0,YEARADJ_1) ),
 
/* Intervall larger than 90 days (approx 3 month) */
SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY),
array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY),
array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)),
 
/* Intervall larger than 30 days (approx 1 month) */
SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY),
array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY),
array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)),
 
/* Intervall larger than 7 days */
SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2),
array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR),
array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)),
 
/* Intervall larger than 1 day */
SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR),
array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR),
array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)),
 
/* Intervall larger than 12 hours */
SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600),
array(1800,1800,900,300,300),
array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 2 hours */
SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300),
array(1800,900,300,120,60),
array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 1 hours */
SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60),
array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 30 min */
SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN),
array(300,300,60,10),
array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)),
 
/* Intervall larger than 1 min */
SECPERMIN,array(array(SECPERMIN,15,10,5),
array(15,5,2,1),
array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)),
 
/* Intervall larger than 10 sec */
10,array(array(5,2),
array(1,1),
array(1,SECADJ_5, 1,SECADJ_1)),
 
/* Intervall larger than 1 sec */
1,array(array(1),
array(1),
array(1,SECADJ_1)),
);
 
$ns = count($scalePoints);
// Establish major and minor scale units for the date scale
$diff = $aEndTime - $aStartTime;
if( $diff < 1 ) return false;
$done=false;
$i=0;
while( ! $done ) {
if( $diff > $scalePoints[2*$i] ) {
// Get major and minor scale for this intervall
$scaleSteps = $scalePoints[2*$i+1];
$major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)];
// Try to find out which minor step looks best
$minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)];
if( $aAdjust ) {
// Find out how we should align the start and end timestamps
$idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1);
if( $scaleSteps[2][$idx] === 0 ) {
// Use date adjustment
$adj = $scaleSteps[2][$idx+1];
if( $adj >= 30 ) {
$start = $this->AdjStartDate($aStartTime,$adj-30);
$end = $this->AdjEndDate($aEndTime,$adj-30);
}
elseif( $adj >= 20 ) {
$start = $this->AdjStartDate($aStartTime,false,$adj-20);
$end = $this->AdjEndDate($aEndTime,false,$adj-20);
}
else {
$start = $this->AdjStartDate($aStartTime,false,false,$adj);
$end = $this->AdjEndDate($aEndTime,false,false,$adj);
// We add 1 second for date adjustment to make sure we end on 00:00 the following day
// This makes the final major tick be srawn when we step day-by-day instead of ending
// on xx:59:59 which would not draw the final major tick
$end++;
}
}
else {
// Use time adjustment
$adj = $scaleSteps[2][$idx+1];
if( $adj >= 30 ) {
$start = $this->AdjStartTime($aStartTime,$adj-30);
$end = $this->AdjEndTime($aEndTime,$adj-30);
}
elseif( $adj >= 20 ) {
$start = $this->AdjStartTime($aStartTime,false,$adj-20);
$end = $this->AdjEndTime($aEndTime,false,$adj-20);
}
else {
$start = $this->AdjStartTime($aStartTime,false,false,$adj);
$end = $this->AdjEndTime($aEndTime,false,false,$adj);
}
}
}
// If the overall date span is larger than 1 day ten we show date
$format = '';
if( ($end-$start) > SECPERDAY ) {
$format = 'Y-m-d ';
}
// If the major step is less than 1 day we need to whow hours + min
if( $major < SECPERDAY ) {
$format .= 'H:i';
}
// If the major step is less than 1 min we need to show sec
if( $major < 60 ) {
$format .= ':s';
}
$done=true;
}
++$i;
}
return array($start,$end,$major,$minor,$format);
}
 
// Overrides the automatic determined date format. Must be a valid date() format string
function SetDateFormat($aFormat) {
$this->date_format = $aFormat;
$this->ticks->SetLabelDateFormat($this->date_format);
}
 
function AdjustForDST($aFlg=true) {
$this->ticks->AdjustForDST($aFlg);
}
 
 
function SetDateAlign($aStartAlign,$aEndAlign=false) {
if( $aEndAlign === false ) {
$aEndAlign=$aStartAlign;
}
$this->iStartAlign = $aStartAlign;
$this->iEndAlign = $aEndAlign;
}
 
function SetTimeAlign($aStartAlign,$aEndAlign=false) {
if( $aEndAlign === false ) {
$aEndAlign=$aStartAlign;
}
$this->iStartTimeAlign = $aStartAlign;
$this->iEndTimeAlign = $aEndAlign;
}
 
 
function AutoScale($img,$aStartTime,$aEndTime,$aNumSteps,$_adummy=false) {
// We need to have one dummy argument to make the signature of AutoScale()
// identical to LinearScale::AutoScale
if( $aStartTime == $aEndTime ) {
// Special case when we only have one data point.
// Create a small artifical intervall to do the autoscaling
$aStartTime -= 10;
$aEndTime += 10;
}
$done=false;
$i=0;
while( ! $done && $i < 5) {
list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i);
$n = floor(($adjend-$adjstart)/$maj);
if( $n * 1.7 > $aNumSteps ) {
$done=true;
}
$i++;
}
 
/*
if( 0 ) { // DEBUG
echo " Start =".date("Y-m-d H:i:s",$aStartTime)."<br>";
echo " End =".date("Y-m-d H:i:s",$aEndTime)."<br>";
echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."<br>";
echo "Adj End =".date("Y-m-d H:i:s",$adjend)."<p>";
echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day<br>";
echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day<br>";
echo "Format=$format<p>";
}
*/
 
if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) {
JpGraphError::RaiseL(3001);
//('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
}
 
if( $this->iStartTimeAlign !== false ) {
if( $this->iStartTimeAlign >= 30 ) {
$adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30);
}
elseif( $this->iStartTimeAlign >= 20 ) {
$adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20);
}
else {
$adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign);
}
}
if( $this->iEndTimeAlign !== false ) {
if( $this->iEndTimeAlign >= 30 ) {
$adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30);
}
elseif( $this->iEndTimeAlign >= 20 ) {
$adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20);
}
else {
$adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign);
}
}
 
 
 
if( $this->iStartAlign !== false ) {
if( $this->iStartAlign >= 30 ) {
$adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30);
}
elseif( $this->iStartAlign >= 20 ) {
$adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20);
}
else {
$adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign);
}
}
if( $this->iEndAlign !== false ) {
if( $this->iEndAlign >= 30 ) {
$adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30);
}
elseif( $this->iEndAlign >= 20 ) {
$adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20);
}
else {
$adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign);
}
}
$this->Update($img,$adjstart,$adjend);
if( ! $this->ticks->IsSpecified() )
$this->ticks->Set($maj,$min);
if( $this->date_format == '' )
$this->ticks->SetLabelDateFormat($format);
else
$this->ticks->SetLabelDateFormat($this->date_format);
}
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_mgraph.php
New file
0,0 → 1,345
<?php
/*=======================================================================
// File: JPGRAPH_MGRAPH.PHP
// Description: Class to handle multiple graphs in the same image
// Created: 2006-01-15
// Ver: $Id: jpgraph_mgraph.php 1770 2009-08-17 06:10:22Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//=============================================================================
// CLASS MGraph
// Description: Create a container image that can hold several graph
//=============================================================================
class MGraph {
 
public $title = null, $subtitle = null, $subsubtitle = null;
 
protected $img=NULL;
protected $iCnt=0,$iGraphs = array(); // image_handle, x, y, fx, fy, sizex, sizey
protected $iFillColor='white', $iCurrentColor=0;
protected $lm=4,$rm=4,$tm=4,$bm=4;
protected $iDoFrame = FALSE, $iFrameColor = 'black', $iFrameWeight = 1;
protected $iLineWeight = 1;
protected $expired=false;
protected $cache=null,$cache_name = '',$inline=true;
protected $image_format='png',$image_quality=75;
protected $iWidth=NULL,$iHeight=NULL;
protected $background_image='',$background_image_center=true,
$backround_image_format='',$background_image_mix=100,
$background_image_y=NULL, $background_image_x=NULL;
private $doshadow=false, $shadow_width=4, $shadow_color='gray@0.5';
public $footer;
 
 
// Create a new instane of the combined graph
function __construct($aWidth=NULL,$aHeight=NULL,$aCachedName='',$aTimeOut=0,$aInline=true) {
$this->iWidth = $aWidth;
$this->iHeight = $aHeight;
 
// If the cached version exist just read it directly from the
// cache, stream it back to browser and exit
if( $aCachedName!='' && READ_CACHE && $aInline ) {
$this->cache = new ImgStreamCache();
$this->cache->SetTimeOut($aTimeOut);
$image = new Image();
if( $this->cache->GetAndStream($image,$aCachedName) ) {
exit();
}
}
$this->inline = $aInline;
$this->cache_name = $aCachedName;
 
$this->title = new Text();
$this->title->ParagraphAlign('center');
$this->title->SetFont(FF_FONT2,FS_BOLD);
$this->title->SetMargin(3);
$this->title->SetAlign('center');
 
$this->subtitle = new Text();
$this->subtitle->ParagraphAlign('center');
$this->subtitle->SetFont(FF_FONT1,FS_BOLD);
$this->subtitle->SetMargin(3);
$this->subtitle->SetAlign('center');
 
$this->subsubtitle = new Text();
$this->subsubtitle->ParagraphAlign('center');
$this->subsubtitle->SetFont(FF_FONT1,FS_NORMAL);
$this->subsubtitle->SetMargin(3);
$this->subsubtitle->SetAlign('center');
 
$this->footer = new Footer();
 
}
 
// Specify background fill color for the combined graph
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
 
// Add a frame around the combined graph
function SetFrame($aFlg,$aColor='black',$aWeight=1) {
$this->iDoFrame = $aFlg;
$this->iFrameColor = $aColor;
$this->iFrameWeight = $aWeight;
}
 
// Specify a background image blend
function SetBackgroundImageMix($aMix) {
$this->background_image_mix = $aMix ;
}
 
// Specify a background image
function SetBackgroundImage($aFileName,$aCenter_aX=NULL,$aY=NULL) {
// Second argument can be either a boolean value or
// a numeric
$aCenter=TRUE;
$aX=NULL;
 
if( is_numeric($aCenter_aX) ) {
$aX=$aCenter_aX;
}
 
// Get extension to determine image type
$e = explode('.',$aFileName);
if( !$e ) {
JpGraphError::RaiseL(12002,$aFileName);
//('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type');
}
 
$valid_formats = array('png', 'jpg', 'gif');
$aImgFormat = strtolower($e[count($e)-1]);
if ($aImgFormat == 'jpeg') {
$aImgFormat = 'jpg';
}
elseif (!in_array($aImgFormat, $valid_formats) ) {
JpGraphError::RaiseL(12003,$aImgFormat,$aFileName);
//('Unknown file extension ($aImgFormat) in MGraph::SetBackgroundImage() for filename: '.$aFileName);
}
 
$this->background_image = $aFileName;
$this->background_image_center=$aCenter;
$this->background_image_format=$aImgFormat;
$this->background_image_x = $aX;
$this->background_image_y = $aY;
}
 
function _strokeBackgroundImage() {
if( $this->background_image == '' ) return;
 
$bkgimg = Graph::LoadBkgImage('',$this->background_image);
 
// Background width & Heoght
$bw = imagesx($bkgimg);
$bh = imagesy($bkgimg);
 
// Canvas width and height
$cw = imagesx($this->img);
$ch = imagesy($this->img);
 
if( $this->doshadow ) {
$cw -= $this->shadow_width;
$ch -= $this->shadow_width;
}
 
if( $this->background_image_x === NULL || $this->background_image_y === NULL ) {
if( $this->background_image_center ) {
// Center original image in the plot area
$x = round($cw/2-$bw/2); $y = round($ch/2-$bh/2);
}
else {
// Just copy the image from left corner, no resizing
$x=0; $y=0;
}
}
else {
$x = $this->background_image_x;
$y = $this->background_image_y;
}
imagecopymerge($this->img,$bkgimg,$x,$y,0,0,$bw,$bh,$this->background_image_mix);
}
 
function AddMix($aGraph,$x=0,$y=0,$mix=100,$fx=0,$fy=0,$w=0,$h=0) {
$this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h,$mix);
}
 
function Add($aGraph,$x=0,$y=0,$fx=0,$fy=0,$w=0,$h=0) {
$this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h);
}
 
function _gdImgHandle($agdCanvas,$x,$y,$fx=0,$fy=0,$w=0,$h=0,$mix=100) {
if( $w == 0 ) {
$w = @imagesx($agdCanvas);
}
if( $w === NULL ) {
JpGraphError::RaiseL(12007);
//('Argument to MGraph::Add() is not a valid GD image handle.');
return;
}
if( $h == 0 ) {
$h = @imagesy($agdCanvas);
}
$this->iGraphs[$this->iCnt++] = array($agdCanvas,$x,$y,$fx,$fy,$w,$h,$mix);
}
 
function SetMargin($lm,$rm,$tm,$bm) {
$this->lm = $lm;
$this->rm = $rm;
$this->tm = $tm;
$this->bm = $bm;
}
 
function SetExpired($aFlg=true) {
$this->expired = $aFlg;
}
 
function SetImgFormat($aFormat,$aQuality=75) {
$this->image_format = $aFormat;
$this->image_quality = $aQuality;
}
 
// Set the shadow around the whole image
function SetShadow($aShowShadow=true,$aShadowWidth=4,$aShadowColor='gray@0.3') {
$this->doshadow = $aShowShadow;
$this->shadow_color = $aShadowColor;
$this->shadow_width = $aShadowWidth;
$this->footer->iBottomMargin += $aShadowWidth;
$this->footer->iRightMargin += $aShadowWidth;
}
 
function StrokeTitle($image,$w,$h) {
// Stroke title
if( $this->title->t !== '' ) {
 
$margin = 3;
 
$y = $this->title->margin;
if( $this->title->halign == 'center' ) {
$this->title->Center(0,$w,$y);
}
elseif( $this->title->halign == 'left' ) {
$this->title->SetPos($this->title->margin+2,$y);
}
elseif( $this->title->halign == 'right' ) {
$indent = 0;
if( $this->doshadow ) {
$indent = $this->shadow_width+2;
}
$this->title->SetPos($w-$this->title->margin-$indent,$y,'right');
}
$this->title->Stroke($image);
 
// ... and subtitle
$y += $this->title->GetTextHeight($image) + $margin + $this->subtitle->margin;
if( $this->subtitle->halign == 'center' ) {
$this->subtitle->Center(0,$w,$y);
}
elseif( $this->subtitle->halign == 'left' ) {
$this->subtitle->SetPos($this->subtitle->margin+2,$y);
}
elseif( $this->subtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow ) {
$indent = $this->shadow_width+2;
}
$this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right');
}
$this->subtitle->Stroke($image);
 
// ... and subsubtitle
$y += $this->subtitle->GetTextHeight($image) + $margin + $this->subsubtitle->margin;
if( $this->subsubtitle->halign == 'center' ) {
$this->subsubtitle->Center(0,$w,$y);
}
elseif( $this->subsubtitle->halign == 'left' ) {
$this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y);
}
elseif( $this->subsubtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow ) {
$indent = $this->shadow_width+2;
}
$this->subsubtitle->SetPos($w-$this->subsubtitle->margin-$indent,$y,'right');
}
$this->subsubtitle->Stroke($image);
 
}
}
 
function Stroke($aFileName='') {
// Find out the necessary size for the container image
$w=0; $h=0;
for($i=0; $i < $this->iCnt; ++$i ) {
$maxw = $this->iGraphs[$i][1]+$this->iGraphs[$i][5];
$maxh = $this->iGraphs[$i][2]+$this->iGraphs[$i][6];
$w = max( $w, $maxw );
$h = max( $h, $maxh );
}
$w += $this->lm+$this->rm;
$h += $this->tm+$this->bm;
 
// User specified width,height overrides
if( $this->iWidth !== NULL && $this->iWidth !== 0 ) $w = $this->iWidth;
if( $this->iHeight!== NULL && $this->iHeight !== 0) $h = $this->iHeight;
 
if( $this->doshadow ) {
$w += $this->shadow_width;
$h += $this->shadow_width;
}
 
$image = new Image($w,$h);
$image->SetImgFormat( $this->image_format,$this->image_quality);
 
if( $this->doshadow ) {
$image->SetColor($this->iFrameColor);
$image->ShadowRectangle(0,0,$w-1,$h-1,$this->iFillColor,$this->shadow_width,$this->shadow_color);
$w -= $this->shadow_width;
$h -= $this->shadow_width;
}
else {
$image->SetColor($this->iFillColor);
$image->FilledRectangle(0,0,$w-1,$h-1);
}
$image->SetExpired($this->expired);
 
$this->img = $image->img;
$this->_strokeBackgroundImage();
 
if( $this->iDoFrame && ! $this->doshadow ) {
$image->SetColor($this->iFrameColor);
$image->SetLineWeight($this->iFrameWeight);
$image->Rectangle(0,0,$w-1,$h-1);
}
 
// Copy all sub graphs to the container
for($i=0; $i < $this->iCnt; ++$i ) {
$image->CopyMerge($this->iGraphs[$i][0],
$this->iGraphs[$i][1]+$this->lm,$this->iGraphs[$i][2]+$this->tm,
$this->iGraphs[$i][3],$this->iGraphs[$i][4],
$this->iGraphs[$i][5],$this->iGraphs[$i][6],
-1,-1, /* Full from width and height */
$this->iGraphs[$i][7]);
 
 
}
 
$this->StrokeTitle($image,$w,$h);
$this->footer->Stroke($image);
 
// Output image
if( $aFileName == _IMG_HANDLER ) {
return $image->img;
}
else {
//Finally stream the generated picture
$this->cache = new ImgStreamCache();
$this->cache->PutAndStream($image,$this->cache_name,$this->inline,$aFileName);
}
}
}
 
// EOF
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph.php
New file
0,0 → 1,5401
<?php
//=======================================================================
// File: JPGRAPH.PHP
// Description: PHP Graph Plotting library. Base module.
// Created: 2001-01-08
// Ver: $Id: jpgraph.php 1924 2010-01-11 14:03:26Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
require_once('jpg-config.inc.php');
require_once('jpgraph_gradient.php');
require_once('jpgraph_errhandler.inc.php');
require_once('jpgraph_ttf.inc.php');
require_once('jpgraph_rgb.inc.php');
require_once('jpgraph_text.inc.php');
require_once('jpgraph_legend.inc.php');
require_once('gd_image.inc.php');
 
// Version info
define('JPG_VERSION','3.0.7');
 
// Minimum required PHP version
define('MIN_PHPVERSION','5.1.0');
 
// Special file name to indicate that we only want to calc
// the image map in the call to Graph::Stroke() used
// internally from the GetHTMLCSIM() method.
define('_CSIM_SPECIALFILE','_csim_special_');
 
// HTTP GET argument that is used with image map
// to indicate to the script to just generate the image
// and not the full CSIM HTML page.
define('_CSIM_DISPLAY','_jpg_csimd');
 
// Special filename for Graph::Stroke(). If this filename is given
// then the image will NOT be streamed to browser of file. Instead the
// Stroke call will return the handler for the created GD image.
define('_IMG_HANDLER','__handle');
 
// Special filename for Graph::Stroke(). If this filename is given
// the image will be stroked to a file with a name based on the script name.
define('_IMG_AUTO','auto');
 
// Tick density
define("TICKD_DENSE",1);
define("TICKD_NORMAL",2);
define("TICKD_SPARSE",3);
define("TICKD_VERYSPARSE",4);
 
// Side for ticks and labels.
define("SIDE_LEFT",-1);
define("SIDE_RIGHT",1);
define("SIDE_DOWN",-1);
define("SIDE_BOTTOM",-1);
define("SIDE_UP",1);
define("SIDE_TOP",1);
 
// Legend type stacked vertical or horizontal
define("LEGEND_VERT",0);
define("LEGEND_HOR",1);
 
// Mark types for plot marks
define("MARK_SQUARE",1);
define("MARK_UTRIANGLE",2);
define("MARK_DTRIANGLE",3);
define("MARK_DIAMOND",4);
define("MARK_CIRCLE",5);
define("MARK_FILLEDCIRCLE",6);
define("MARK_CROSS",7);
define("MARK_STAR",8);
define("MARK_X",9);
define("MARK_LEFTTRIANGLE",10);
define("MARK_RIGHTTRIANGLE",11);
define("MARK_FLASH",12);
define("MARK_IMG",13);
define("MARK_FLAG1",14);
define("MARK_FLAG2",15);
define("MARK_FLAG3",16);
define("MARK_FLAG4",17);
 
// Builtin images
define("MARK_IMG_PUSHPIN",50);
define("MARK_IMG_SPUSHPIN",50);
define("MARK_IMG_LPUSHPIN",51);
define("MARK_IMG_DIAMOND",52);
define("MARK_IMG_SQUARE",53);
define("MARK_IMG_STAR",54);
define("MARK_IMG_BALL",55);
define("MARK_IMG_SBALL",55);
define("MARK_IMG_MBALL",56);
define("MARK_IMG_LBALL",57);
define("MARK_IMG_BEVEL",58);
 
// Inline defines
define("INLINE_YES",1);
define("INLINE_NO",0);
 
// Format for background images
define("BGIMG_FILLPLOT",1);
define("BGIMG_FILLFRAME",2);
define("BGIMG_COPY",3);
define("BGIMG_CENTER",4);
define("BGIMG_FREE",5);
 
// Depth of objects
define("DEPTH_BACK",0);
define("DEPTH_FRONT",1);
 
// Direction
define("VERTICAL",1);
define("HORIZONTAL",0);
 
// Axis styles for scientific style axis
define('AXSTYLE_SIMPLE',1);
define('AXSTYLE_BOXIN',2);
define('AXSTYLE_BOXOUT',3);
define('AXSTYLE_YBOXIN',4);
define('AXSTYLE_YBOXOUT',5);
 
// Style for title backgrounds
define('TITLEBKG_STYLE1',1);
define('TITLEBKG_STYLE2',2);
define('TITLEBKG_STYLE3',3);
define('TITLEBKG_FRAME_NONE',0);
define('TITLEBKG_FRAME_FULL',1);
define('TITLEBKG_FRAME_BOTTOM',2);
define('TITLEBKG_FRAME_BEVEL',3);
define('TITLEBKG_FILLSTYLE_HSTRIPED',1);
define('TITLEBKG_FILLSTYLE_VSTRIPED',2);
define('TITLEBKG_FILLSTYLE_SOLID',3);
 
// Styles for axis labels background
define('LABELBKG_NONE',0);
define('LABELBKG_XAXIS',1);
define('LABELBKG_YAXIS',2);
define('LABELBKG_XAXISFULL',3);
define('LABELBKG_YAXISFULL',4);
define('LABELBKG_XYFULL',5);
define('LABELBKG_XY',6);
 
 
// Style for background gradient fills
define('BGRAD_FRAME',1);
define('BGRAD_MARGIN',2);
define('BGRAD_PLOT',3);
 
// Width of tab titles
define('TABTITLE_WIDTHFIT',0);
define('TABTITLE_WIDTHFULL',-1);
 
// Defines for 3D skew directions
define('SKEW3D_UP',0);
define('SKEW3D_DOWN',1);
define('SKEW3D_LEFT',2);
define('SKEW3D_RIGHT',3);
 
// For internal use only
define("_JPG_DEBUG",false);
define("_FORCE_IMGTOFILE",false);
define("_FORCE_IMGDIR",'/tmp/jpgimg/');
 
//
// Automatic settings of path for cache and font directory
// if they have not been previously specified
//
if(USE_CACHE) {
if (!defined('CACHE_DIR')) {
if ( strstr( PHP_OS, 'WIN') ) {
if( empty($_SERVER['TEMP']) ) {
$t = new ErrMsgText();
$msg = $t->Get(11,$file,$lineno);
die($msg);
}
else {
define('CACHE_DIR', $_SERVER['TEMP'] . '/');
}
} else {
define('CACHE_DIR','/tmp/jpgraph_cache/');
}
}
}
elseif( !defined('CACHE_DIR') ) {
define('CACHE_DIR', '');
}
 
//
// Setup path for western/latin TTF fonts
//
if (!defined('TTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
define('TTF_DIR', $sroot.'/fonts/');
}
} else {
define('TTF_DIR','/usr/share/fonts/truetype/');
}
}
 
//
// Setup path for MultiByte TTF fonts (japanese, chinese etc.)
//
if (!defined('MBTTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
define('MBTTF_DIR', $sroot.'/fonts/');
}
} else {
define('MBTTF_DIR','/usr/share/fonts/truetype/');
}
}
 
//
// Check minimum PHP version
//
function CheckPHPVersion($aMinVersion) {
list($majorC, $minorC, $editC) = preg_split('/[\/.-]/', PHP_VERSION);
list($majorR, $minorR, $editR) = preg_split('/[\/.-]/', $aMinVersion);
 
if ($majorC != $majorR) return false;
if ($majorC < $majorR) return false;
// same major - check minor
if ($minorC > $minorR) return true;
if ($minorC < $minorR) return false;
// and same minor
if ($editC >= $editR) return true;
return true;
}
 
//
// Make sure PHP version is high enough
//
if( !CheckPHPVersion(MIN_PHPVERSION) ) {
JpGraphError::RaiseL(13,PHP_VERSION,MIN_PHPVERSION);
die();
}
 
//
// Make GD sanity check
//
if( !function_exists("imagetypes") || !function_exists('imagecreatefromstring') ) {
JpGraphError::RaiseL(25001);
//("This PHP installation is not configured with the GD library. Please recompile PHP with GD support to run JpGraph. (Neither function imagetypes() nor imagecreatefromstring() does exist)");
}
 
//
// Setup PHP error handler
//
function _phpErrorHandler($errno,$errmsg,$filename, $linenum, $vars) {
// Respect current error level
if( $errno & error_reporting() ) {
JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg);
}
}
 
if( INSTALL_PHP_ERR_HANDLER ) {
set_error_handler("_phpErrorHandler");
}
 
//
// Check if there were any warnings, perhaps some wrong includes by the user. In this
// case we raise it immediately since otherwise the image will not show and makes
// debugging difficult. This is controlled by the user setting CATCH_PHPERRMSG
//
if( isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg']) ) {
JpGraphError::RaiseL(25004,$GLOBALS['php_errormsg']);
}
 
// Useful mathematical function
function sign($a) {return $a >= 0 ? 1 : -1;}
 
//
// Utility function to generate an image name based on the filename we
// are running from and assuming we use auto detection of graphic format
// (top level), i.e it is safe to call this function
// from a script that uses JpGraph
//
function GenImgName() {
// Determine what format we should use when we save the images
$supported = imagetypes();
if( $supported & IMG_PNG ) $img_format="png";
elseif( $supported & IMG_GIF ) $img_format="gif";
elseif( $supported & IMG_JPG ) $img_format="jpeg";
elseif( $supported & IMG_WBMP ) $img_format="wbmp";
elseif( $supported & IMG_XPM ) $img_format="xpm";
 
 
if( !isset($_SERVER['PHP_SELF']) ) {
JpGraphError::RaiseL(25005);
//(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files.");
}
$fname = basename($_SERVER['PHP_SELF']);
if( !empty($_SERVER['QUERY_STRING']) ) {
$q = @$_SERVER['QUERY_STRING'];
$fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format;
}
else {
$fname = substr($fname,0,strlen($fname)-4).'.'.$img_format;
}
return $fname;
}
 
//===================================================
// CLASS JpgTimer
// Description: General timing utility class to handle
// time measurement of generating graphs. Multiple
// timers can be started.
//===================================================
class JpgTimer {
private $start, $idx;
 
function __construct() {
$this->idx=0;
}
 
// Push a new timer start on stack
function Push() {
list($ms,$s)=explode(" ",microtime());
$this->start[$this->idx++]=floor($ms*1000) + 1000*$s;
}
 
// Pop the latest timer start and return the diff with the
// current time
function Pop() {
assert($this->idx>0);
list($ms,$s)=explode(" ",microtime());
$etime=floor($ms*1000) + (1000*$s);
$this->idx--;
return $etime-$this->start[$this->idx];
}
} // Class
 
//===================================================
// CLASS DateLocale
// Description: Hold localized text used in dates
//===================================================
class DateLocale {
 
public $iLocale = 'C'; // environmental locale be used by default
private $iDayAbb = null, $iShortDay = null, $iShortMonth = null, $iMonthName = null;
 
function __construct() {
settype($this->iDayAbb, 'array');
settype($this->iShortDay, 'array');
settype($this->iShortMonth, 'array');
settype($this->iMonthName, 'array');
$this->Set('C');
}
 
function Set($aLocale) {
if ( in_array($aLocale, array_keys($this->iDayAbb)) ){
$this->iLocale = $aLocale;
return TRUE; // already cached nothing else to do!
}
 
$pLocale = setlocale(LC_TIME, 0); // get current locale for LC_TIME
 
if (is_array($aLocale)) {
foreach ($aLocale as $loc) {
$res = @setlocale(LC_TIME, $loc);
if ( $res ) {
$aLocale = $loc;
break;
}
}
}
else {
$res = @setlocale(LC_TIME, $aLocale);
}
 
if ( ! $res ) {
JpGraphError::RaiseL(25007,$aLocale);
//("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region.");
return FALSE;
}
 
$this->iLocale = $aLocale;
for( $i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++ ) {
$day = strftime('%a', strtotime("$ofs day"));
$day[0] = strtoupper($day[0]);
$this->iDayAbb[$aLocale][]= $day[0];
$this->iShortDay[$aLocale][]= $day;
}
 
for($i=1; $i<=12; ++$i) {
list($short ,$full) = explode('|', strftime("%b|%B",strtotime("2001-$i-01")));
$this->iShortMonth[$aLocale][] = ucfirst($short);
$this->iMonthName [$aLocale][] = ucfirst($full);
}
 
setlocale(LC_TIME, $pLocale);
 
return TRUE;
}
 
 
function GetDayAbb() {
return $this->iDayAbb[$this->iLocale];
}
 
function GetShortDay() {
return $this->iShortDay[$this->iLocale];
}
 
function GetShortMonth() {
return $this->iShortMonth[$this->iLocale];
}
 
function GetShortMonthName($aNbr) {
return $this->iShortMonth[$this->iLocale][$aNbr];
}
 
function GetLongMonthName($aNbr) {
return $this->iMonthName[$this->iLocale][$aNbr];
}
 
function GetMonth() {
return $this->iMonthName[$this->iLocale];
}
}
 
// Global object handlers
$gDateLocale = new DateLocale();
$gJpgDateLocale = new DateLocale();
 
//=======================================================
// CLASS Footer
// Description: Encapsulates the footer line in the Graph
//=======================================================
class Footer {
public $iLeftMargin = 3, $iRightMargin = 3, $iBottomMargin = 3 ;
public $left,$center,$right;
private $iTimer=null, $itimerpoststring='';
 
function __construct() {
$this->left = new Text();
$this->left->ParagraphAlign('left');
$this->center = new Text();
$this->center->ParagraphAlign('center');
$this->right = new Text();
$this->right->ParagraphAlign('right');
}
 
function SetTimer($aTimer,$aTimerPostString='') {
$this->iTimer = $aTimer;
$this->itimerpoststring = $aTimerPostString;
}
 
function SetMargin($aLeft=3,$aRight=3,$aBottom=3) {
$this->iLeftMargin = $aLeft;
$this->iRightMargin = $aRight;
$this->iBottomMargin = $aBottom;
}
 
function Stroke($aImg) {
$y = $aImg->height - $this->iBottomMargin;
$x = $this->iLeftMargin;
$this->left->Align('left','bottom');
$this->left->Stroke($aImg,$x,$y);
 
$x = ($aImg->width - $this->iLeftMargin - $this->iRightMargin)/2;
$this->center->Align('center','bottom');
$this->center->Stroke($aImg,$x,$y);
 
$x = $aImg->width - $this->iRightMargin;
$this->right->Align('right','bottom');
if( $this->iTimer != null ) {
$this->right->Set( $this->right->t . sprintf('%.3f',$this->iTimer->Pop()/1000.0) . $this->itimerpoststring );
}
$this->right->Stroke($aImg,$x,$y);
}
}
 
 
//===================================================
// CLASS Graph
// Description: Main class to handle graphs
//===================================================
class Graph {
public $cache=null; // Cache object (singleton)
public $img=null; // Img object (singleton)
public $plots=array(); // Array of all plot object in the graph (for Y 1 axis)
public $y2plots=array(); // Array of all plot object in the graph (for Y 2 axis)
public $ynplots=array();
public $xscale=null; // X Scale object (could be instance of LinearScale or LogScale
public $yscale=null,$y2scale=null, $ynscale=array();
public $iIcons = array(); // Array of Icons to add to
public $cache_name; // File name to be used for the current graph in the cache directory
public $xgrid=null; // X Grid object (linear or logarithmic)
public $ygrid=null,$y2grid=null; //dito for Y
public $doframe=true,$frame_color='black', $frame_weight=1; // Frame around graph
public $boxed=false, $box_color='black', $box_weight=1; // Box around plot area
public $doshadow=false,$shadow_width=4,$shadow_color='gray@0.5'; // Shadow for graph
public $xaxis=null; // X-axis (instane of Axis class)
public $yaxis=null, $y2axis=null, $ynaxis=array(); // Y axis (instance of Axis class)
public $margin_color=array(230,230,230); // Margin color of graph
public $plotarea_color=array(255,255,255); // Plot area color
public $title,$subtitle,$subsubtitle; // Title and subtitle(s) text object
public $axtype="linlin"; // Type of axis
public $xtick_factor,$ytick_factor; // Factor to determine the maximum number of ticks depending on the plot width
public $texts=null, $y2texts=null; // Text object to ge shown in the graph
public $lines=null, $y2lines=null;
public $bands=null, $y2bands=null;
public $text_scale_off=0, $text_scale_abscenteroff=-1; // Text scale in fractions and for centering bars
public $background_image='',$background_image_type=-1,$background_image_format="png";
public $background_image_bright=0,$background_image_contr=0,$background_image_sat=0;
public $background_image_xpos=0,$background_image_ypos=0;
public $image_bright=0, $image_contr=0, $image_sat=0;
public $inline;
public $showcsim=0,$csimcolor="red";//debug stuff, draw the csim boundaris on the image if <>0
public $grid_depth=DEPTH_BACK; // Draw grid under all plots as default
public $iAxisStyle = AXSTYLE_SIMPLE;
public $iCSIMdisplay=false,$iHasStroked = false;
public $footer;
public $csimcachename = '', $csimcachetimeout = 0, $iCSIMImgAlt='';
public $iDoClipping = false;
public $y2orderback=true;
public $tabtitle;
public $bkg_gradtype=-1,$bkg_gradstyle=BGRAD_MARGIN;
public $bkg_gradfrom='navy', $bkg_gradto='silver';
public $plot_gradtype=-1,$plot_gradstyle=BGRAD_MARGIN;
public $plot_gradfrom='silver', $plot_gradto='navy';
 
public $titlebackground = false;
public $titlebackground_color = 'lightblue',
$titlebackground_style = 1,
$titlebackground_framecolor = 'blue',
$titlebackground_framestyle = 2,
$titlebackground_frameweight = 1,
$titlebackground_bevelheight = 3 ;
public $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID;
public $titlebkg_scolor1='black',$titlebkg_scolor2='white';
public $framebevel = false, $framebeveldepth = 2 ;
public $framebevelborder = false, $framebevelbordercolor='black';
public $framebevelcolor1='white@0.4', $framebevelcolor2='black@0.4';
public $background_image_mix=100;
public $background_cflag = '';
public $background_cflag_type = BGIMG_FILLPLOT;
public $background_cflag_mix = 100;
public $iImgTrans=false,
$iImgTransHorizon = 100,$iImgTransSkewDist=150,
$iImgTransDirection = 1, $iImgTransMinSize = true,
$iImgTransFillColor='white',$iImgTransHighQ=false,
$iImgTransBorder=false,$iImgTransHorizonPos=0.5;
public $legend;
protected $iYAxisDeltaPos=50;
protected $iIconDepth=DEPTH_BACK;
protected $iAxisLblBgType = 0,
$iXAxisLblBgFillColor = 'lightgray', $iXAxisLblBgColor = 'black',
$iYAxisLblBgFillColor = 'lightgray', $iYAxisLblBgColor = 'black';
protected $iTables=NULL;
 
// aWIdth Width in pixels of image
// aHeight Height in pixels of image
// aCachedName Name for image file in cache directory
// aTimeOut Timeout in minutes for image in cache
// aInline If true the image is streamed back in the call to Stroke()
// If false the image is just created in the cache
function __construct($aWidth=300,$aHeight=200,$aCachedName='',$aTimeout=0,$aInline=true) {
 
if( !is_numeric($aWidth) || !is_numeric($aHeight) ) {
JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric');
}
 
// Automatically generate the image file name based on the name of the script that
// generates the graph
if( $aCachedName == 'auto' ) {
$aCachedName=GenImgName();
}
 
// Should the image be streamed back to the browser or only to the cache?
$this->inline=$aInline;
 
$this->img = new RotImage($aWidth,$aHeight);
$this->cache = new ImgStreamCache();
 
// Window doesn't like '?' in the file name so replace it with an '_'
$aCachedName = str_replace("?","_",$aCachedName);
$this->SetupCache($aCachedName, $aTimeout);
 
$this->title = new Text();
$this->title->ParagraphAlign('center');
$this->title->SetFont(FF_FONT2,FS_BOLD);
$this->title->SetMargin(5);
$this->title->SetAlign('center');
 
$this->subtitle = new Text();
$this->subtitle->ParagraphAlign('center');
$this->subtitle->SetMargin(3);
$this->subtitle->SetAlign('center');
 
$this->subsubtitle = new Text();
$this->subsubtitle->ParagraphAlign('center');
$this->subsubtitle->SetMargin(3);
$this->subsubtitle->SetAlign('center');
 
$this->legend = new Legend();
$this->footer = new Footer();
 
// If the cached version exist just read it directly from the
// cache, stream it back to browser and exit
if( $aCachedName!='' && READ_CACHE && $aInline ) {
if( $this->cache->GetAndStream($this->img,$aCachedName) ) {
exit();
}
}
 
$this->SetTickDensity(); // Normal density
 
$this->tabtitle = new GraphTabTitle();
}
 
function SetupCache($aFilename,$aTimeout=60) {
$this->cache_name = $aFilename;
$this->cache->SetTimeOut($aTimeout);
}
 
// Enable final image perspective transformation
function Set3DPerspective($aDir=1,$aHorizon=100,$aSkewDist=120,$aQuality=false,$aFillColor='#FFFFFF',$aBorder=false,$aMinSize=true,$aHorizonPos=0.5) {
$this->iImgTrans = true;
$this->iImgTransHorizon = $aHorizon;
$this->iImgTransSkewDist= $aSkewDist;
$this->iImgTransDirection = $aDir;
$this->iImgTransMinSize = $aMinSize;
$this->iImgTransFillColor=$aFillColor;
$this->iImgTransHighQ=$aQuality;
$this->iImgTransBorder=$aBorder;
$this->iImgTransHorizonPos=$aHorizonPos;
}
 
function SetUserFont($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->img->ttf->SetUserFont($aNormal,$aBold,$aItalic,$aBoldIt);
}
 
function SetUserFont1($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->img->ttf->SetUserFont1($aNormal,$aBold,$aItalic,$aBoldIt);
}
 
function SetUserFont2($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->img->ttf->SetUserFont2($aNormal,$aBold,$aItalic,$aBoldIt);
}
 
function SetUserFont3($aNormal,$aBold='',$aItalic='',$aBoldIt='') {
$this->img->ttf->SetUserFont3($aNormal,$aBold,$aItalic,$aBoldIt);
}
 
// Set Image format and optional quality
function SetImgFormat($aFormat,$aQuality=75) {
$this->img->SetImgFormat($aFormat,$aQuality);
}
 
// Should the grid be in front or back of the plot?
function SetGridDepth($aDepth) {
$this->grid_depth=$aDepth;
}
 
function SetIconDepth($aDepth) {
$this->iIconDepth=$aDepth;
}
 
// Specify graph angle 0-360 degrees.
function SetAngle($aAngle) {
$this->img->SetAngle($aAngle);
}
 
function SetAlphaBlending($aFlg=true) {
$this->img->SetAlphaBlending($aFlg);
}
 
// Shortcut to image margin
function SetMargin($lm,$rm,$tm,$bm) {
$this->img->SetMargin($lm,$rm,$tm,$bm);
}
 
function SetY2OrderBack($aBack=true) {
$this->y2orderback = $aBack;
}
 
// Rotate the graph 90 degrees and set the margin
// when we have done a 90 degree rotation
function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) {
$lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ;
$rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ;
$tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ;
$bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ;
 
$adj = ($this->img->height - $this->img->width)/2;
$this->img->SetMargin($tm-$adj,$bm-$adj,$rm+$adj,$lm+$adj);
$this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2));
$this->SetAngle(90);
if( empty($this->yaxis) || empty($this->xaxis) ) {
JpgraphError::RaiseL(25009);//('You must specify what scale to use with a call to Graph::SetScale()');
}
$this->xaxis->SetLabelAlign('right','center');
$this->yaxis->SetLabelAlign('center','bottom');
}
 
function SetClipping($aFlg=true) {
$this->iDoClipping = $aFlg ;
}
 
// Add a plot object to the graph
function Add($aPlot) {
if( $aPlot == null ) {
JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph.");
}
if( is_array($aPlot) && count($aPlot) > 0 ) {
$cl = $aPlot[0];
}
else {
$cl = $aPlot;
}
 
if( $cl instanceof Text ) $this->AddText($aPlot);
elseif( class_exists('PlotLine',false) && ($cl instanceof PlotLine) ) $this->AddLine($aPlot);
elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) $this->AddBand($aPlot);
elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) $this->AddIcon($aPlot);
elseif( class_exists('GTextTable',false) && ($cl instanceof GTextTable) ) $this->AddTable($aPlot);
else {
if( is_array($aPlot) ) {
$this->plots = array_merge($this->plots,$aPlot);
}
else {
$this->plots[] = $aPlot;
}
}
}
 
function AddTable($aTable) {
if( is_array($aTable) ) {
for($i=0; $i < count($aTable); ++$i ) {
$this->iTables[]=$aTable[$i];
}
}
else {
$this->iTables[] = $aTable ;
}
}
 
function AddIcon($aIcon) {
if( is_array($aIcon) ) {
for($i=0; $i < count($aIcon); ++$i ) {
$this->iIcons[]=$aIcon[$i];
}
}
else {
$this->iIcons[] = $aIcon ;
}
}
 
// Add plot to second Y-scale
function AddY2($aPlot) {
if( $aPlot == null ) {
JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph.");
}
 
if( is_array($aPlot) && count($aPlot) > 0 ) {
$cl = $aPlot[0];
}
else {
$cl = $aPlot;
}
 
if( $cl instanceof Text ) {
$this->AddText($aPlot,true);
}
elseif( class_exists('PlotLine',false) && ($cl instanceof PlotLine) ) {
$this->AddLine($aPlot,true);
}
elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) {
$this->AddBand($aPlot,true);
}
else {
$this->y2plots[] = $aPlot;
}
}
 
// Add plot to the extra Y-axises
function AddY($aN,$aPlot) {
 
if( $aPlot == null ) {
JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph.");
}
 
if( is_array($aPlot) && count($aPlot) > 0 ) {
$cl = $aPlot[0];
}
else {
$cl = $aPlot;
}
 
if( ($cl instanceof Text) ||
(class_exists('PlotLine',false) && ($cl instanceof PlotLine)) ||
(class_exists('PlotBand',false) && ($cl instanceof PlotBand)) ) {
JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis');
}
else {
$this->ynplots[$aN][] = $aPlot;
}
}
 
// Add text object to the graph
function AddText($aTxt,$aToY2=false) {
if( $aTxt == null ) {
JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph.");
}
if( $aToY2 ) {
if( is_array($aTxt) ) {
for($i=0; $i < count($aTxt); ++$i ) {
$this->y2texts[]=$aTxt[$i];
}
}
else {
$this->y2texts[] = $aTxt;
}
}
else {
if( is_array($aTxt) ) {
for($i=0; $i < count($aTxt); ++$i ) {
$this->texts[]=$aTxt[$i];
}
}
else {
$this->texts[] = $aTxt;
}
}
}
 
// Add a line object (class PlotLine) to the graph
function AddLine($aLine,$aToY2=false) {
if( $aLine == null ) {
JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph.");
}
 
if( $aToY2 ) {
if( is_array($aLine) ) {
for($i=0; $i < count($aLine); ++$i ) {
//$this->y2lines[]=$aLine[$i];
$this->y2plots[]=$aLine[$i];
}
}
else {
//$this->y2lines[] = $aLine;
$this->y2plots[]=$aLine;
}
}
else {
if( is_array($aLine) ) {
for($i=0; $i<count($aLine); ++$i ) {
//$this->lines[]=$aLine[$i];
$this->plots[]=$aLine[$i];
}
}
else {
//$this->lines[] = $aLine;
$this->plots[] = $aLine;
}
}
}
 
// Add vertical or horizontal band
function AddBand($aBand,$aToY2=false) {
if( $aBand == null ) {
JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph.");
}
 
if( $aToY2 ) {
if( is_array($aBand) ) {
for($i=0; $i < count($aBand); ++$i ) {
$this->y2bands[] = $aBand[$i];
}
}
else {
$this->y2bands[] = $aBand;
}
}
else {
if( is_array($aBand) ) {
for($i=0; $i < count($aBand); ++$i ) {
$this->bands[] = $aBand[$i];
}
}
else {
$this->bands[] = $aBand;
}
}
}
 
function SetPlotGradient($aFrom='navy',$aTo='silver',$aGradType=2) {
$this->plot_gradtype=$aGradType;
$this->plot_gradfrom = $aFrom;
$this->plot_gradto = $aTo;
}
 
function SetBackgroundGradient($aFrom='navy',$aTo='silver',$aGradType=2,$aStyle=BGRAD_FRAME) {
$this->bkg_gradtype=$aGradType;
$this->bkg_gradstyle=$aStyle;
$this->bkg_gradfrom = $aFrom;
$this->bkg_gradto = $aTo;
}
 
// Set a country flag in the background
function SetBackgroundCFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) {
$this->background_cflag = $aName;
$this->background_cflag_type = $aBgType;
$this->background_cflag_mix = $aMix;
}
 
// Alias for the above method
function SetBackgroundCountryFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) {
$this->background_cflag = $aName;
$this->background_cflag_type = $aBgType;
$this->background_cflag_mix = $aMix;
}
 
 
// Specify a background image
function SetBackgroundImage($aFileName,$aBgType=BGIMG_FILLPLOT,$aImgFormat='auto') {
 
// Get extension to determine image type
if( $aImgFormat == 'auto' ) {
$e = explode('.',$aFileName);
if( !$e ) {
JpGraphError::RaiseL(25018,$aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type');
}
 
$valid_formats = array('png', 'jpg', 'gif');
$aImgFormat = strtolower($e[count($e)-1]);
if ($aImgFormat == 'jpeg') {
$aImgFormat = 'jpg';
}
elseif (!in_array($aImgFormat, $valid_formats) ) {
JpGraphError::RaiseL(25019,$aImgFormat);//('Unknown file extension ($aImgFormat) in Graph::SetBackgroundImage() for filename: '.$aFileName);
}
}
 
$this->background_image = $aFileName;
$this->background_image_type=$aBgType;
$this->background_image_format=$aImgFormat;
}
 
function SetBackgroundImageMix($aMix) {
$this->background_image_mix = $aMix ;
}
 
// Adjust background image position
function SetBackgroundImagePos($aXpos,$aYpos) {
$this->background_image_xpos = $aXpos ;
$this->background_image_ypos = $aYpos ;
}
 
// Specify axis style (boxed or single)
function SetAxisStyle($aStyle) {
$this->iAxisStyle = $aStyle ;
}
 
// Set a frame around the plot area
function SetBox($aDrawPlotFrame=true,$aPlotFrameColor=array(0,0,0),$aPlotFrameWeight=1) {
$this->boxed = $aDrawPlotFrame;
$this->box_weight = $aPlotFrameWeight;
$this->box_color = $aPlotFrameColor;
}
 
// Specify color for the plotarea (not the margins)
function SetColor($aColor) {
$this->plotarea_color=$aColor;
}
 
// Specify color for the margins (all areas outside the plotarea)
function SetMarginColor($aColor) {
$this->margin_color=$aColor;
}
 
// Set a frame around the entire image
function SetFrame($aDrawImgFrame=true,$aImgFrameColor=array(0,0,0),$aImgFrameWeight=1) {
$this->doframe = $aDrawImgFrame;
$this->frame_color = $aImgFrameColor;
$this->frame_weight = $aImgFrameWeight;
}
 
function SetFrameBevel($aDepth=3,$aBorder=false,$aBorderColor='black',$aColor1='white@0.4',$aColor2='darkgray@0.4',$aFlg=true) {
$this->framebevel = $aFlg ;
$this->framebeveldepth = $aDepth ;
$this->framebevelborder = $aBorder ;
$this->framebevelbordercolor = $aBorderColor ;
$this->framebevelcolor1 = $aColor1 ;
$this->framebevelcolor2 = $aColor2 ;
 
$this->doshadow = false ;
}
 
// Set the shadow around the whole image
function SetShadow($aShowShadow=true,$aShadowWidth=5,$aShadowColor='darkgray') {
$this->doshadow = $aShowShadow;
$this->shadow_color = $aShadowColor;
$this->shadow_width = $aShadowWidth;
$this->footer->iBottomMargin += $aShadowWidth;
$this->footer->iRightMargin += $aShadowWidth;
}
 
// Specify x,y scale. Note that if you manually specify the scale
// you must also specify the tick distance with a call to Ticks::Set()
function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) {
$this->axtype = $aAxisType;
 
if( $aYMax < $aYMin || $aXMax < $aXMin ) {
JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.');
}
 
$yt=substr($aAxisType,-3,3);
if( $yt == 'lin' ) {
$this->yscale = new LinearScale($aYMin,$aYMax);
}
elseif( $yt == 'int' ) {
$this->yscale = new LinearScale($aYMin,$aYMax);
$this->yscale->SetIntScale();
}
elseif( $yt == 'log' ) {
$this->yscale = new LogScale($aYMin,$aYMax);
}
else {
JpGraphError::RaiseL(25021,$aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)");
}
 
$xt=substr($aAxisType,0,3);
if( $xt == 'lin' || $xt == 'tex' ) {
$this->xscale = new LinearScale($aXMin,$aXMax,'x');
$this->xscale->textscale = ($xt == 'tex');
}
elseif( $xt == 'int' ) {
$this->xscale = new LinearScale($aXMin,$aXMax,'x');
$this->xscale->SetIntScale();
}
elseif( $xt == 'dat' ) {
$this->xscale = new DateScale($aXMin,$aXMax,'x');
}
elseif( $xt == 'log' ) {
$this->xscale = new LogScale($aXMin,$aXMax,'x');
}
else {
JpGraphError::RaiseL(25022,$aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)");
}
 
$this->xaxis = new Axis($this->img,$this->xscale);
$this->yaxis = new Axis($this->img,$this->yscale);
$this->xgrid = new Grid($this->xaxis);
$this->ygrid = new Grid($this->yaxis);
$this->ygrid->Show();
}
 
// Specify secondary Y scale
function SetY2Scale($aAxisType='lin',$aY2Min=1,$aY2Max=1) {
if( $aAxisType == 'lin' ) {
$this->y2scale = new LinearScale($aY2Min,$aY2Max);
}
elseif( $aAxisType == 'int' ) {
$this->y2scale = new LinearScale($aY2Min,$aY2Max);
$this->y2scale->SetIntScale();
}
elseif( $aAxisType == 'log' ) {
$this->y2scale = new LogScale($aY2Min,$aY2Max);
}
else {
JpGraphError::RaiseL(25023,$aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)");
}
 
$this->y2axis = new Axis($this->img,$this->y2scale);
$this->y2axis->scale->ticks->SetDirection(SIDE_LEFT);
$this->y2axis->SetLabelSide(SIDE_RIGHT);
$this->y2axis->SetPos('max');
$this->y2axis->SetTitleSide(SIDE_RIGHT);
 
// Deafult position is the max x-value
$this->y2grid = new Grid($this->y2axis);
}
 
// Set the delta position (in pixels) between the multiple Y-axis
function SetYDeltaDist($aDist) {
$this->iYAxisDeltaPos = $aDist;
}
 
// Specify secondary Y scale
function SetYScale($aN,$aAxisType="lin",$aYMin=1,$aYMax=1) {
 
if( $aAxisType == 'lin' ) {
$this->ynscale[$aN] = new LinearScale($aYMin,$aYMax);
}
elseif( $aAxisType == 'int' ) {
$this->ynscale[$aN] = new LinearScale($aYMin,$aYMax);
$this->ynscale[$aN]->SetIntScale();
}
elseif( $aAxisType == 'log' ) {
$this->ynscale[$aN] = new LogScale($aYMin,$aYMax);
}
else {
JpGraphError::RaiseL(25024,$aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)");
}
 
$this->ynaxis[$aN] = new Axis($this->img,$this->ynscale[$aN]);
$this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT);
$this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT);
}
 
// Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse'
// The dividing factor have been determined heuristically according to my aesthetic
// sense (or lack off) y.m.m.v !
function SetTickDensity($aYDensity=TICKD_NORMAL,$aXDensity=TICKD_NORMAL) {
$this->xtick_factor=30;
$this->ytick_factor=25;
switch( $aYDensity ) {
case TICKD_DENSE:
$this->ytick_factor=12;
break;
case TICKD_NORMAL:
$this->ytick_factor=25;
break;
case TICKD_SPARSE:
$this->ytick_factor=40;
break;
case TICKD_VERYSPARSE:
$this->ytick_factor=100;
break;
default:
JpGraphError::RaiseL(25025,$densy);//("JpGraph: Unsupported Tick density: $densy");
}
switch( $aXDensity ) {
case TICKD_DENSE:
$this->xtick_factor=15;
break;
case TICKD_NORMAL:
$this->xtick_factor=30;
break;
case TICKD_SPARSE:
$this->xtick_factor=45;
break;
case TICKD_VERYSPARSE:
$this->xtick_factor=60;
break;
default:
JpGraphError::RaiseL(25025,$densx);//("JpGraph: Unsupported Tick density: $densx");
}
}
 
 
// Get a string of all image map areas
function GetCSIMareas() {
if( !$this->iHasStroked ) {
$this->Stroke(_CSIM_SPECIALFILE);
}
 
$csim = $this->title->GetCSIMAreas();
$csim .= $this->subtitle->GetCSIMAreas();
$csim .= $this->subsubtitle->GetCSIMAreas();
$csim .= $this->legend->GetCSIMAreas();
 
if( $this->y2axis != NULL ) {
$csim .= $this->y2axis->title->GetCSIMAreas();
}
 
if( $this->texts != null ) {
$n = count($this->texts);
for($i=0; $i < $n; ++$i ) {
$csim .= $this->texts[$i]->GetCSIMAreas();
}
}
 
if( $this->y2texts != null && $this->y2scale != null ) {
$n = count($this->y2texts);
for($i=0; $i < $n; ++$i ) {
$csim .= $this->y2texts[$i]->GetCSIMAreas();
}
}
 
if( $this->yaxis != null && $this->xaxis != null ) {
$csim .= $this->yaxis->title->GetCSIMAreas();
$csim .= $this->xaxis->title->GetCSIMAreas();
}
 
$n = count($this->plots);
for( $i=0; $i < $n; ++$i ) {
$csim .= $this->plots[$i]->GetCSIMareas();
}
 
$n = count($this->y2plots);
for( $i=0; $i < $n; ++$i ) {
$csim .= $this->y2plots[$i]->GetCSIMareas();
}
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$m = count($this->ynplots[$i]);
for($j=0; $j < $m; ++$j ) {
$csim .= $this->ynplots[$i][$j]->GetCSIMareas();
}
}
 
$n = count($this->iTables);
for( $i=0; $i < $n; ++$i ) {
$csim .= $this->iTables[$i]->GetCSIMareas();
}
 
return $csim;
}
 
// Get a complete <MAP>..</MAP> tag for the final image map
function GetHTMLImageMap($aMapName) {
$im = "<map name=\"$aMapName\" id=\"$aMapName\" >\n";
$im .= $this->GetCSIMareas();
$im .= "</map>";
return $im;
}
 
function CheckCSIMCache($aCacheName,$aTimeOut=60) {
global $_SERVER;
 
if( $aCacheName=='auto' ) {
$aCacheName=basename($_SERVER['PHP_SELF']);
}
 
$urlarg = $this->GetURLArguments();
$this->csimcachename = CSIMCACHE_DIR.$aCacheName.$urlarg;
$this->csimcachetimeout = $aTimeOut;
 
// First determine if we need to check for a cached version
// This differs from the standard cache in the sense that the
// image and CSIM map HTML file is written relative to the directory
// the script executes in and not the specified cache directory.
// The reason for this is that the cache directory is not necessarily
// accessible from the HTTP server.
if( $this->csimcachename != '' ) {
$dir = dirname($this->csimcachename);
$base = basename($this->csimcachename);
$base = strtok($base,'.');
$suffix = strtok('.');
$basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html';
$baseimg = $dir.'/'.$base.'?'.$urlarg.'.'.$this->img->img_format;
 
$timedout=false;
// Does it exist at all ?
 
if( file_exists($basecsim) && file_exists($baseimg) ) {
// Check that it hasn't timed out
$diff=time()-filemtime($basecsim);
if( $this->csimcachetimeout>0 && ($diff > $this->csimcachetimeout*60) ) {
$timedout=true;
@unlink($basecsim);
@unlink($baseimg);
}
else {
if ($fh = @fopen($basecsim, "r")) {
fpassthru($fh);
return true;
}
else {
JpGraphError::RaiseL(25027,$basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading.");
}
}
}
}
return false;
}
 
// Build the argument string to be used with the csim images
static function GetURLArguments($aAddRecursiveBlocker=false) {
 
if( $aAddRecursiveBlocker ) {
// This is a JPGRAPH internal defined that prevents
// us from recursively coming here again
$urlarg = _CSIM_DISPLAY.'=1';
}
 
// Now reconstruct any user URL argument
reset($_GET);
while( list($key,$value) = each($_GET) ) {
if( is_array($value) ) {
foreach ( $value as $k => $v ) {
$urlarg .= '&amp;'.$key.'%5B'.$k.'%5D='.urlencode($v);
}
}
else {
$urlarg .= '&amp;'.$key.'='.urlencode($value);
}
}
 
// It's not ideal to convert POST argument to GET arguments
// but there is little else we can do. One idea for the
// future might be recreate the POST header in case.
reset($_POST);
while( list($key,$value) = each($_POST) ) {
if( is_array($value) ) {
foreach ( $value as $k => $v ) {
$urlarg .= '&amp;'.$key.'%5B'.$k.'%5D='.urlencode($v);
}
}
else {
$urlarg .= '&amp;'.$key.'='.urlencode($value);
}
}
 
return $urlarg;
}
 
function SetCSIMImgAlt($aAlt) {
$this->iCSIMImgAlt = $aAlt;
}
 
function StrokeCSIM($aScriptName='auto',$aCSIMName='',$aBorder=0) {
if( $aCSIMName=='' ) {
// create a random map name
srand ((double) microtime() * 1000000);
$r = rand(0,100000);
$aCSIMName='__mapname'.$r.'__';
}
 
if( $aScriptName=='auto' ) {
$aScriptName=basename($_SERVER['PHP_SELF']);
}
 
$urlarg = $this->GetURLArguments(true);
 
if( empty($_GET[_CSIM_DISPLAY]) ) {
// First determine if we need to check for a cached version
// This differs from the standard cache in the sense that the
// image and CSIM map HTML file is written relative to the directory
// the script executes in and not the specified cache directory.
// The reason for this is that the cache directory is not necessarily
// accessible from the HTTP server.
if( $this->csimcachename != '' ) {
$dir = dirname($this->csimcachename);
$base = basename($this->csimcachename);
$base = strtok($base,'.');
$suffix = strtok('.');
$basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html';
$baseimg = $base.'?'.$urlarg.'.'.$this->img->img_format;
 
// Check that apache can write to directory specified
 
if( file_exists($dir) && !is_writeable($dir) ) {
JpgraphError::RaiseL(25028,$dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.');
}
 
// Make sure directory exists
$this->cache->MakeDirs($dir);
 
// Write the image file
$this->Stroke(CSIMCACHE_DIR.$baseimg);
 
// Construct wrapper HTML and write to file and send it back to browser
 
// In the src URL we must replace the '?' with its encoding to prevent the arguments
// to be converted to real arguments.
$tmp = str_replace('?','%3f',$baseimg);
$htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n".
'<img src="'.CSIMCACHE_HTTP_DIR.$tmp.'" ismap="ismap" usemap="#'.$aCSIMName.' width="'.$this->img->width.'" height="'.$this->img->height."\" alt=\"".$this->iCSIMImgAlt."\" />\n";
 
if($fh = @fopen($basecsim,'w') ) {
fwrite($fh,$htmlwrap);
fclose($fh);
echo $htmlwrap;
}
else {
JpGraphError::RaiseL(25029,$basecsim);//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions.");
}
}
else {
 
if( $aScriptName=='' ) {
JpGraphError::RaiseL(25030);//('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().');
}
echo $this->GetHTMLImageMap($aCSIMName) . $this->GetCSIMImgHTML($aCSIMName, $aScriptName, $aBorder);
}
}
else {
$this->Stroke();
}
}
 
function StrokeCSIMImage() {
if( @$_GET[_CSIM_DISPLAY] == 1 ) {
$this->Stroke();
}
}
 
function GetCSIMImgHTML($aCSIMName, $aScriptName='auto', $aBorder=0 ) {
if( $aScriptName=='auto' ) {
$aScriptName=basename($_SERVER['PHP_SELF']);
}
$urlarg = $this->GetURLArguments(true);
return "<img src=\"".$aScriptName.'?'.$urlarg."\" ismap=\"ismap\" usemap=\"#".$aCSIMName.'" height="'.$this->img->height."\" alt=\"".$this->iCSIMImgAlt."\" />\n";
}
 
function GetTextsYMinMax($aY2=false) {
if( $aY2 ) {
$txts = $this->y2texts;
}
else {
$txts = $this->texts;
}
$n = count($txts);
$min=null;
$max=null;
for( $i=0; $i < $n; ++$i ) {
if( $txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null ) {
if( $min === null ) {
$min = $max = $txts[$i]->iScalePosY ;
}
else {
$min = min($min,$txts[$i]->iScalePosY);
$max = max($max,$txts[$i]->iScalePosY);
}
}
}
if( $min !== null ) {
return array($min,$max);
}
else {
return null;
}
}
 
function GetTextsXMinMax($aY2=false) {
if( $aY2 ) {
$txts = $this->y2texts;
}
else {
$txts = $this->texts;
}
$n = count($txts);
$min=null;
$max=null;
for( $i=0; $i < $n; ++$i ) {
if( $txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null ) {
if( $min === null ) {
$min = $max = $txts[$i]->iScalePosX ;
}
else {
$min = min($min,$txts[$i]->iScalePosX);
$max = max($max,$txts[$i]->iScalePosX);
}
}
}
if( $min !== null ) {
return array($min,$max);
}
else {
return null;
}
}
 
function GetXMinMax() {
 
list($min,$ymin) = $this->plots[0]->Min();
list($max,$ymax) = $this->plots[0]->Max();
 
$i=0;
// Some plots, e.g. PlotLine should not affect the scale
// and will return (null,null). We should ignore those
// values.
while( ($min===null || $max === null) && ($i < count($this->plots)-1) ) {
++$i;
list($min,$ymin) = $this->plots[$i]->Min();
list($max,$ymax) = $this->plots[$i]->Max();
}
 
foreach( $this->plots as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
 
if( $xmin !== null && $xmax !== null ) {
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
}
 
if( $this->y2axis != null ) {
foreach( $this->y2plots as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
}
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null) {
foreach( $this->ynplots[$i] as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
}
}
return array($min,$max);
}
 
function AdjustMarginsForTitles() {
$totrequired = ($this->title->t != '' ? $this->title->GetTextHeight($this->img) + $this->title->margin + 5 : 0 ) +
($this->subtitle->t != '' ? $this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 : 0 ) +
($this->subsubtitle->t != '' ? $this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 : 0 ) ;
 
$btotrequired = 0;
if($this->xaxis != null && !$this->xaxis->hide && !$this->xaxis->hide_labels ) {
// Minimum bottom margin
if( $this->xaxis->title->t != '' ) {
if( $this->img->a == 90 ) {
$btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 7 ;
}
else {
$btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 7 ;
}
}
else {
$btotrequired = 0;
}
 
if( $this->img->a == 90 ) {
$this->img->SetFont($this->yaxis->font_family,$this->yaxis->font_style,
$this->yaxis->font_size);
$lh = $this->img->GetTextHeight('Mg',$this->yaxis->label_angle);
}
else {
$this->img->SetFont($this->xaxis->font_family,$this->xaxis->font_style,
$this->xaxis->font_size);
$lh = $this->img->GetTextHeight('Mg',$this->xaxis->label_angle);
}
 
$btotrequired += $lh + 6;
}
 
if( $this->img->a == 90 ) {
// DO Nothing. It gets too messy to do this properly for 90 deg...
}
else{
if( $this->img->top_margin < $totrequired ) {
$this->SetMargin($this->img->left_margin,$this->img->right_margin,
$totrequired,$this->img->bottom_margin);
}
if( $this->img->bottom_margin < $btotrequired ) {
$this->SetMargin($this->img->left_margin,$this->img->right_margin,
$this->img->top_margin,$btotrequired);
}
}
}
 
function StrokeStore($aStrokeFileName) {
// Get the handler to prevent the library from sending the
// image to the browser
$ih = $this->Stroke(_IMG_HANDLER);
 
// Stroke it to a file
$this->img->Stream($aStrokeFileName);
 
// Send it back to browser
$this->img->Headers();
$this->img->Stream();
}
 
function doAutoscaleXAxis() {
//Check if we should autoscale x-axis
if( !$this->xscale->IsSpecified() ) {
if( substr($this->axtype,0,4) == "text" ) {
$max=0;
$n = count($this->plots);
for($i=0; $i < $n; ++$i ) {
$p = $this->plots[$i];
// We need some unfortunate sub class knowledge here in order
// to increase number of data points in case it is a line plot
// which has the barcenter set. If not it could mean that the
// last point of the data is outside the scale since the barcenter
// settings means that we will shift the entire plot half a tick step
// to the right in oder to align with the center of the bars.
if( class_exists('BarPlot',false) ) {
$cl = strtolower(get_class($p));
if( (class_exists('BarPlot',false) && ($p instanceof BarPlot)) || empty($p->barcenter) ) {
$max=max($max,$p->numpoints-1);
}
else {
$max=max($max,$p->numpoints);
}
}
else {
if( empty($p->barcenter) ) {
$max=max($max,$p->numpoints-1);
}
else {
$max=max($max,$p->numpoints);
}
}
}
$min=0;
if( $this->y2axis != null ) {
foreach( $this->y2plots as $p ) {
$max=max($max,$p->numpoints-1);
}
}
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null) {
foreach( $this->ynplots[$i] as $p ) {
$max=max($max,$p->numpoints-1);
}
}
}
 
$this->xscale->Update($this->img,$min,$max);
$this->xscale->ticks->Set($this->xaxis->tick_step,1);
$this->xscale->ticks->SupressMinorTickMarks();
}
else {
list($min,$max) = $this->GetXMinMax();
 
$lres = $this->GetLinesXMinMax($this->lines);
if( $lres ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
 
$lres = $this->GetLinesXMinMax($this->y2lines);
if( $lres ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
 
$tres = $this->GetTextsXMinMax();
if( $tres ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
 
$tres = $this->GetTextsXMinMax(true);
if( $tres ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
 
$this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor));
}
 
//Adjust position of y-axis and y2-axis to minimum/maximum of x-scale
if( !is_numeric($this->yaxis->pos) && !is_string($this->yaxis->pos) ) {
$this->yaxis->SetPos($this->xscale->GetMinVal());
}
}
elseif( $this->xscale->IsSpecified() &&
( $this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->xscale->scale[0];
$max = $this->xscale->scale[1];
$this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor),false);
 
// Now make sure we show enough precision to accurate display the
// labels. If this is not done then the user might end up with
// a scale that might actually start with, say 13.5, butdue to rounding
// the scale label will ony show 14.
if( abs(floor($min)-$min) > 0 ) {
 
// If the user has set a format then we bail out
if( $this->xscale->ticks->label_formatstr == '' && $this->xscale->ticks->label_dateformatstr == '' ) {
$this->xscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1;
}
}
}
 
// Position the optional Y2 and Yn axis to the rightmost position of the x-axis
if( $this->y2axis != null ) {
if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) ) {
$this->y2axis->SetPos($this->xscale->GetMaxVal());
}
$this->y2axis->SetTitleSide(SIDE_RIGHT);
}
 
$n = count($this->ynaxis);
$nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0;
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null ) {
if( !is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos) ) {
$this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal());
$this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj);
}
$this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT);
}
}
}
 
 
function doAutoScaleYnAxis() {
 
if( $this->y2scale != null) {
if( !$this->y2scale->IsSpecified() && count($this->y2plots)>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->y2plots);
 
$lres = $this->GetLinesYMinMax($this->y2lines);
if( is_array($lres) ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
$tres = $this->GetTextsYMinMax(true);
if( is_array($tres) ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
$this->y2scale->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->y2scale->IsSpecified() && ( $this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->y2scale->scale[0];
$max = $this->y2scale->scale[1];
$this->y2scale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->y2scale->auto_ticks);
 
// Now make sure we show enough precision to accurate display the
// labels. If this is not done then the user might end up with
// a scale that might actually start with, say 13.5, butdue to rounding
// the scale label will ony show 14.
if( abs(floor($min)-$min) > 0 ) {
// If the user has set a format then we bail out
if( $this->y2scale->ticks->label_formatstr == '' && $this->y2scale->ticks->label_dateformatstr == '' ) {
$this->y2scale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1;
}
}
 
}
}
 
 
//
// Autoscale the extra Y-axises
//
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynscale[$i] != null) {
if( !$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->ynplots[$i]);
$this->ynscale[$i]->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->ynscale[$i]->IsSpecified() && ( $this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->ynscale[$i]->scale[0];
$max = $this->ynscale[$i]->scale[1];
$this->ynscale[$i]->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->ynscale[$i]->auto_ticks);
 
// Now make sure we show enough precision to accurate display the
// labels. If this is not done then the user might end up with
// a scale that might actually start with, say 13.5, butdue to rounding
// the scale label will ony show 14.
if( abs(floor($min)-$min) > 0 ) {
// If the user has set a format then we bail out
if( $this->ynscale[$i]->ticks->label_formatstr == '' && $this->ynscale[$i]->ticks->label_dateformatstr == '' ) {
$this->ynscale[$i]->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1;
}
}
}
}
}
}
 
function doAutoScaleYAxis() {
 
//Check if we should autoscale y-axis
if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->plots);
$lres = $this->GetLinesYMinMax($this->lines);
if( is_array($lres) ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
$tres = $this->GetTextsYMinMax();
if( is_array($tres) ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
$this->yscale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->yscale->IsSpecified() && ( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->yscale->scale[0];
$max = $this->yscale->scale[1];
$this->yscale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->yscale->auto_ticks);
 
// Now make sure we show enough precision to accurate display the
// labels. If this is not done then the user might end up with
// a scale that might actually start with, say 13.5, butdue to rounding
// the scale label will ony show 14.
if( abs(floor($min)-$min) > 0 ) {
 
// If the user has set a format then we bail out
if( $this->yscale->ticks->label_formatstr == '' && $this->yscale->ticks->label_dateformatstr == '' ) {
$this->yscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1;
}
}
}
 
}
 
function InitScaleConstants() {
// Setup scale constants
if( $this->yscale ) $this->yscale->InitConstants($this->img);
if( $this->xscale ) $this->xscale->InitConstants($this->img);
if( $this->y2scale ) $this->y2scale->InitConstants($this->img);
 
$n=count($this->ynscale);
for($i=0; $i < $n; ++$i) {
if( $this->ynscale[$i] ) {
$this->ynscale[$i]->InitConstants($this->img);
}
}
}
 
function doPrestrokeAdjustments() {
 
// Do any pre-stroke adjustment that is needed by the different plot types
// (i.e bar plots want's to add an offset to the x-labels etc)
for($i=0; $i < count($this->plots) ; ++$i ) {
$this->plots[$i]->PreStrokeAdjust($this);
$this->plots[$i]->DoLegend($this);
}
 
// Any plots on the second Y scale?
if( $this->y2scale != null ) {
for($i=0; $i<count($this->y2plots) ; ++$i ) {
$this->y2plots[$i]->PreStrokeAdjust($this);
$this->y2plots[$i]->DoLegend($this);
}
}
 
// Any plots on the extra Y axises?
$n = count($this->ynaxis);
for($i=0; $i<$n ; ++$i ) {
if( $this->ynplots == null || $this->ynplots[$i] == null) {
JpGraphError::RaiseL(25032,$i);//("No plots for Y-axis nbr:$i");
}
$m = count($this->ynplots[$i]);
for($j=0; $j < $m; ++$j ) {
$this->ynplots[$i][$j]->PreStrokeAdjust($this);
$this->ynplots[$i][$j]->DoLegend($this);
}
}
}
 
function StrokeBands($aDepth,$aCSIM) {
// Stroke bands
if( $this->bands != null && !$aCSIM) {
for($i=0; $i < count($this->bands); ++$i) {
// Stroke all bands that asks to be in the background
if( $this->bands[$i]->depth == $aDepth ) {
$this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale);
}
}
}
 
if( $this->y2bands != null && $this->y2scale != null && !$aCSIM ) {
for($i=0; $i < count($this->y2bands); ++$i) {
// Stroke all bands that asks to be in the foreground
if( $this->y2bands[$i]->depth == $aDepth ) {
$this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
}
}
}
}
 
 
// Stroke the graph
// $aStrokeFileName If != "" the image will be written to this file and NOT
// streamed back to the browser
function Stroke($aStrokeFileName='') {
 
// Fist make a sanity check that user has specified a scale
if( empty($this->yscale) ) {
JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().');
}
 
// Start by adjusting the margin so that potential titles will fit.
$this->AdjustMarginsForTitles();
 
// Give the plot a chance to do any scale adjuments the individual plots
// wants to do. Right now this is only used by the contour plot to set scale
// limits
for($i=0; $i < count($this->plots) ; ++$i ) {
$this->plots[$i]->PreScaleSetup($this);
}
 
// Init scale constants that are used to calculate the transformation from
// world to pixel coordinates
$this->InitScaleConstants();
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// If we are called the second time (perhaps the user has called GetHTMLImageMap()
// himself then the legends have alsready been populated once in order to get the
// CSIM coordinats. Since we do not want the legends to be populated a second time
// we clear the legends
$this->legend->Clear();
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
// Setup pre-stroked adjustments and Legends
$this->doPrestrokeAdjustments();
 
// Bail out if any of the Y-axis not been specified and
// has no plots. (This means it is impossible to do autoscaling and
// no other scale was given so we can't possible draw anything). If you use manual
// scaling you also have to supply the tick steps as well.
if( (!$this->yscale->IsSpecified() && count($this->plots)==0) ||
($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0) ) {
//$e = "n=".count($this->y2plots)."\n";
// $e = "Can't draw unspecified Y-scale.<br>\nYou have either:<br>\n";
// $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots<br>\n";
// $e .= "2. Specified a scale manually but have forgot to specify the tick steps";
JpGraphError::RaiseL(25026);
}
 
// Bail out if no plots and no specified X-scale
if( (!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0) ) {
JpGraphError::RaiseL(25034);//("<strong>JpGraph: Can't draw unspecified X-scale.</strong><br>No plots.<br>");
}
 
// Autoscale the normal Y-axis
$this->doAutoScaleYAxis();
 
// Autoscale all additiopnal y-axis
$this->doAutoScaleYnAxis();
 
// Autoscale the regular x-axis and position the y-axis properly
$this->doAutoScaleXAxis();
 
// If we have a negative values and x-axis position is at 0
// we need to supress the first and possible the last tick since
// they will be drawn on top of the y-axis (and possible y2 axis)
// The test below might seem strange the reasone being that if
// the user hasn't specified a value for position this will not
// be set until we do the stroke for the axis so as of now it
// is undefined.
// For X-text scale we ignore all this since the tick are usually
// much further in and not close to the Y-axis. Hence the test
// for 'text'
if( ($this->yaxis->pos==$this->xscale->GetMinVal() || (is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) &&
!is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 &&
substr($this->axtype,0,4) != 'text' && $this->xaxis->pos != 'min' ) {
 
//$this->yscale->ticks->SupressZeroLabel(false);
$this->xscale->ticks->SupressFirst();
if( $this->y2axis != null ) {
$this->xscale->ticks->SupressLast();
}
}
elseif( !is_numeric($this->yaxis->pos) && $this->yaxis->pos=='max' ) {
$this->xscale->ticks->SupressLast();
}
 
if( !$_csim ) {
$this->StrokePlotArea();
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
}
$this->StrokeAxis(false);
 
// Stroke colored bands
$this->StrokeBands(DEPTH_BACK,$_csim);
 
if( $this->grid_depth == DEPTH_BACK && !$_csim) {
$this->ygrid->Stroke();
$this->xgrid->Stroke();
}
 
// Stroke Y2-axis
if( $this->y2axis != null && !$_csim) {
$this->y2axis->Stroke($this->xscale);
$this->y2grid->Stroke();
}
 
// Stroke yn-axis
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$this->ynaxis[$i]->Stroke($this->xscale);
}
 
$oldoff=$this->xscale->off;
if( substr($this->axtype,0,4) == 'text' ) {
if( $this->text_scale_abscenteroff > -1 ) {
// For a text scale the scale factor is the number of pixel per step.
// Hence we can use the scale factor as a substitute for number of pixels
// per major scale step and use that in order to adjust the offset so that
// an object of width "abscenteroff" becomes centered.
$this->xscale->off += round($this->xscale->scale_factor/2)-round($this->text_scale_abscenteroff/2);
}
else {
$this->xscale->off += ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step);
}
}
 
if( $this->iDoClipping ) {
$oldimage = $this->img->CloneCanvasH();
}
 
if( ! $this->y2orderback ) {
// Stroke all plots for Y1 axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale);
$this->plots[$i]->StrokeMargin($this->img);
}
}
 
// Stroke all plots for Y2 axis
if( $this->y2scale != null ) {
for($i=0; $i< count($this->y2plots); ++$i ) {
$this->y2plots[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
}
}
 
if( $this->y2orderback ) {
// Stroke all plots for Y1 axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale);
$this->plots[$i]->StrokeMargin($this->img);
}
}
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$m = count($this->ynplots[$i]);
for( $j=0; $j < $m; ++$j ) {
$this->ynplots[$i][$j]->Stroke($this->img,$this->xscale,$this->ynscale[$i]);
$this->ynplots[$i][$j]->StrokeMargin($this->img);
}
}
 
if( $this->iIconDepth == DEPTH_FRONT) {
$this->StrokeIcons();
}
 
if( $this->iDoClipping ) {
// Clipping only supports graphs at 0 and 90 degrees
if( $this->img->a == 0 ) {
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->left_margin,$this->img->top_margin,
$this->img->left_margin,$this->img->top_margin,
$this->img->plotwidth+1,$this->img->plotheight);
}
elseif( $this->img->a == 90 ) {
$adj = ($this->img->height - $this->img->width)/2;
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->plotheight+1,$this->img->plotwidth);
}
else {
JpGraphError::RaiseL(25035,$this->img->a);//('You have enabled clipping. Cliping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (='.$this->img->a.' degrees) or disable clipping.');
}
$this->img->Destroy();
$this->img->SetCanvasH($oldimage);
}
 
$this->xscale->off=$oldoff;
 
if( $this->grid_depth == DEPTH_FRONT && !$_csim ) {
$this->ygrid->Stroke();
$this->xgrid->Stroke();
}
 
// Stroke colored bands
$this->StrokeBands(DEPTH_FRONT,$_csim);
 
// Finally draw the axis again since some plots may have nagged
// the axis in the edges.
if( !$_csim ) {
$this->StrokeAxis();
}
 
if( $this->y2scale != null && !$_csim ) {
$this->y2axis->Stroke($this->xscale,false);
}
 
if( !$_csim ) {
$this->StrokePlotBox();
}
 
// The titles and legends never gets rotated so make sure
// that the angle is 0 before stroking them
$aa = $this->img->SetAngle(0);
$this->StrokeTitles();
$this->footer->Stroke($this->img);
$this->legend->Stroke($this->img);
$this->img->SetAngle($aa);
$this->StrokeTexts();
$this->StrokeTables();
 
if( !$_csim ) {
 
$this->img->SetAngle($aa);
 
// Draw an outline around the image map
if(_JPG_DEBUG) {
$this->DisplayClientSideaImageMapAreas();
}
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans',false) ) {
require_once('jpgraph_imgtrans.php');
//JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.');
}
 
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
}
}
}
 
function SetAxisLabelBackground($aType,$aXFColor='lightgray',$aXColor='black',$aYFColor='lightgray',$aYColor='black') {
$this->iAxisLblBgType = $aType;
$this->iXAxisLblBgFillColor = $aXFColor;
$this->iXAxisLblBgColor = $aXColor;
$this->iYAxisLblBgFillColor = $aYFColor;
$this->iYAxisLblBgColor = $aYColor;
}
 
function StrokeAxisLabelBackground() {
// Types
// 0 = No background
// 1 = Only X-labels, length of axis
// 2 = Only Y-labels, length of axis
// 3 = As 1 but extends to width of graph
// 4 = As 2 but extends to height of graph
// 5 = Combination of 3 & 4
// 6 = Combination of 1 & 2
 
$t = $this->iAxisLblBgType ;
if( $t < 1 ) return;
 
// Stroke optional X-axis label background color
if( $t == 1 || $t == 3 || $t == 5 || $t == 6 ) {
$this->img->PushColor($this->iXAxisLblBgFillColor);
if( $t == 1 || $t == 6 ) {
$xl = $this->img->left_margin;
$yu = $this->img->height - $this->img->bottom_margin + 1;
$xr = $this->img->width - $this->img->right_margin ;
$yl = $this->img->height-1-$this->frame_weight;
}
else { // t==3 || t==5
$xl = $this->frame_weight;
$yu = $this->img->height - $this->img->bottom_margin + 1;
$xr = $this->img->width - 1 - $this->frame_weight;
$yl = $this->img->height-1-$this->frame_weight;
}
 
$this->img->FilledRectangle($xl,$yu,$xr,$yl);
$this->img->PopColor();
 
// Check if we should add the vertical lines at left and right edge
if( $this->iXAxisLblBgColor !== '' ) {
// Hardcode to one pixel wide
$this->img->SetLineWeight(1);
$this->img->PushColor($this->iXAxisLblBgColor);
if( $t == 1 || $t == 6 ) {
$this->img->Line($xl,$yu,$xl,$yl);
$this->img->Line($xr,$yu,$xr,$yl);
}
else {
$xl = $this->img->width - $this->img->right_margin ;
$this->img->Line($xl,$yu-1,$xr,$yu-1);
}
$this->img->PopColor();
}
}
 
if( $t == 2 || $t == 4 || $t == 5 || $t == 6 ) {
$this->img->PushColor($this->iYAxisLblBgFillColor);
if( $t == 2 || $t == 6 ) {
$xl = $this->frame_weight;
$yu = $this->frame_weight+$this->img->top_margin;
$xr = $this->img->left_margin - 1;
$yl = $this->img->height - $this->img->bottom_margin + 1;
}
else {
$xl = $this->frame_weight;
$yu = $this->frame_weight;
$xr = $this->img->left_margin - 1;
$yl = $this->img->height-1-$this->frame_weight;
}
 
$this->img->FilledRectangle($xl,$yu,$xr,$yl);
$this->img->PopColor();
 
// Check if we should add the vertical lines at left and right edge
if( $this->iXAxisLblBgColor !== '' ) {
$this->img->PushColor($this->iXAxisLblBgColor);
if( $t == 2 || $t == 6 ) {
$this->img->Line($xl,$yu-1,$xr,$yu-1);
$this->img->Line($xl,$yl-1,$xr,$yl-1);
}
else {
$this->img->Line($xr+1,$yu,$xr+1,$this->img->top_margin);
}
$this->img->PopColor();
}
 
}
}
 
function StrokeAxis($aStrokeLabels=true) {
 
if( $aStrokeLabels ) {
$this->StrokeAxisLabelBackground();
}
 
// Stroke axis
if( $this->iAxisStyle != AXSTYLE_SIMPLE ) {
switch( $this->iAxisStyle ) {
case AXSTYLE_BOXIN :
$toppos = SIDE_DOWN;
$bottompos = SIDE_UP;
$leftpos = SIDE_RIGHT;
$rightpos = SIDE_LEFT;
break;
case AXSTYLE_BOXOUT :
$toppos = SIDE_UP;
$bottompos = SIDE_DOWN;
$leftpos = SIDE_LEFT;
$rightpos = SIDE_RIGHT;
break;
case AXSTYLE_YBOXIN:
$toppos = FALSE;
$bottompos = SIDE_UP;
$leftpos = SIDE_RIGHT;
$rightpos = SIDE_LEFT;
break;
case AXSTYLE_YBOXOUT:
$toppos = FALSE;
$bottompos = SIDE_DOWN;
$leftpos = SIDE_LEFT;
$rightpos = SIDE_RIGHT;
break;
default:
JpGRaphError::RaiseL(25036,$this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle);
break;
}
 
// By default we hide the first label so it doesn't cross the
// Y-axis in case the positon hasn't been set by the user.
// However, if we use a box we always want the first value
// displayed so we make sure it will be displayed.
$this->xscale->ticks->SupressFirst(false);
 
// Now draw the bottom X-axis
$this->xaxis->SetPos('min');
$this->xaxis->SetLabelSide(SIDE_DOWN);
$this->xaxis->scale->ticks->SetSide($bottompos);
$this->xaxis->Stroke($this->yscale,$aStrokeLabels);
 
if( $toppos !== FALSE ) {
// We also want a top X-axis
$this->xaxis = $this->xaxis;
$this->xaxis->SetPos('max');
$this->xaxis->SetLabelSide(SIDE_UP);
// No title for the top X-axis
if( $aStrokeLabels ) {
$this->xaxis->title->Set('');
}
$this->xaxis->scale->ticks->SetSide($toppos);
$this->xaxis->Stroke($this->yscale,$aStrokeLabels);
}
 
// Stroke the left Y-axis
$this->yaxis->SetPos('min');
$this->yaxis->SetLabelSide(SIDE_LEFT);
$this->yaxis->scale->ticks->SetSide($leftpos);
$this->yaxis->Stroke($this->xscale,$aStrokeLabels);
 
// Stroke the right Y-axis
$this->yaxis->SetPos('max');
// No title for the right side
if( $aStrokeLabels ) {
$this->yaxis->title->Set('');
}
$this->yaxis->SetLabelSide(SIDE_RIGHT);
$this->yaxis->scale->ticks->SetSide($rightpos);
$this->yaxis->Stroke($this->xscale,$aStrokeLabels);
}
else {
$this->xaxis->Stroke($this->yscale,$aStrokeLabels);
$this->yaxis->Stroke($this->xscale,$aStrokeLabels);
}
}
 
 
// Private helper function for backgound image
static function LoadBkgImage($aImgFormat='',$aFile='',$aImgStr='') {
if( $aImgStr != '' ) {
return Image::CreateFromString($aImgStr);
}
 
// Remove case sensitivity and setup appropriate function to create image
// Get file extension. This should be the LAST '.' separated part of the filename
$e = explode('.',$aFile);
$ext = strtolower($e[count($e)-1]);
if ($ext == "jpeg") {
$ext = "jpg";
}
 
if( trim($ext) == '' ) {
$ext = 'png'; // Assume PNG if no extension specified
}
 
if( $aImgFormat == '' ) {
$imgtag = $ext;
}
else {
$imgtag = $aImgFormat;
}
 
$supported = imagetypes();
if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) ||
( $ext == 'gif' && !($supported & IMG_GIF) ) ||
( $ext == 'png' && !($supported & IMG_PNG) ) ||
( $ext == 'bmp' && !($supported & IMG_WBMP) ) ||
( $ext == 'xpm' && !($supported & IMG_XPM) ) ) {
 
JpGraphError::RaiseL(25037,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. ');
}
 
 
if( $imgtag == "jpg" || $imgtag == "jpeg") {
$f = "imagecreatefromjpeg";
$imgtag = "jpg";
}
else {
$f = "imagecreatefrom".$imgtag;
}
 
// Compare specified image type and file extension
if( $imgtag != $ext ) {
//$t = "Background image seems to be of different type (has different file extension) than specified imagetype. Specified: '".$aImgFormat."'File: '".$aFile."'";
JpGraphError::RaiseL(25038, $aImgFormat, $aFile);
}
 
$img = @$f($aFile);
if( !$img ) {
JpGraphError::RaiseL(25039,$aFile);//(" Can't read background image: '".$aFile."'");
}
return $img;
}
 
function StrokePlotGrad() {
if( $this->plot_gradtype < 0 )
return;
$grad = new Gradient($this->img);
$xl = $this->img->left_margin;
$yt = $this->img->top_margin;
$xr = $xl + $this->img->plotwidth+1 ;
$yb = $yt + $this->img->plotheight ;
$grad->FilledRectangle($xl,$yt,$xr,$yb,$this->plot_gradfrom,$this->plot_gradto,$this->plot_gradtype);
 
}
 
function StrokeBackgroundGrad() {
if( $this->bkg_gradtype < 0 )
return;
 
$grad = new Gradient($this->img);
if( $this->bkg_gradstyle == BGRAD_PLOT ) {
$xl = $this->img->left_margin;
$yt = $this->img->top_margin;
$xr = $xl + $this->img->plotwidth+1 ;
$yb = $yt + $this->img->plotheight ;
$grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype);
}
else {
$xl = 0;
$yt = 0;
$xr = $xl + $this->img->width - 1;
$yb = $yt + $this->img->height - 1 ;
if( $this->doshadow ) {
$xr -= $this->shadow_width;
$yb -= $this->shadow_width;
}
if( $this->doframe ) {
$yt += $this->frame_weight;
$yb -= $this->frame_weight;
$xl += $this->frame_weight;
$xr -= $this->frame_weight;
}
$aa = $this->img->SetAngle(0);
$grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype);
$aa = $this->img->SetAngle($aa);
}
}
 
function StrokeFrameBackground() {
if( $this->background_image != '' && $this->background_cflag != '' ) {
JpGraphError::RaiseL(25040);//('It is not possible to specify both a background image and a background country flag.');
}
if( $this->background_image != '' ) {
$bkgimg = $this->LoadBkgImage($this->background_image_format,$this->background_image);
}
elseif( $this->background_cflag != '' ) {
if( ! class_exists('FlagImages',false) ) {
JpGraphError::RaiseL(25041);//('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.');
}
$fobj = new FlagImages(FLAGSIZE4);
$dummy='';
$bkgimg = $fobj->GetImgByName($this->background_cflag,$dummy);
$this->background_image_mix = $this->background_cflag_mix;
$this->background_image_type = $this->background_cflag_type;
}
else {
return ;
}
 
$bw = ImageSX($bkgimg);
$bh = ImageSY($bkgimg);
 
// No matter what the angle is we always stroke the image and frame
// assuming it is 0 degree
$aa = $this->img->SetAngle(0);
 
switch( $this->background_image_type ) {
case BGIMG_FILLPLOT: // Resize to just fill the plotarea
$this->FillMarginArea();
$this->StrokeFrame();
// Special case to hande 90 degree rotated graph corectly
if( $aa == 90 ) {
$this->img->SetAngle(90);
$this->FillPlotArea();
$aa = $this->img->SetAngle(0);
$adj = ($this->img->height - $this->img->width)/2;
$this->img->CopyMerge($bkgimg,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
0,0,
$this->img->plotheight+1,$this->img->plotwidth,
$bw,$bh,$this->background_image_mix);
}
else {
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,
$this->img->left_margin,$this->img->top_margin+1,
0,0,$this->img->plotwidth+1,$this->img->plotheight,
$bw,$bh,$this->background_image_mix);
}
break;
case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit
$hadj=0; $vadj=0;
if( $this->doshadow ) {
$hadj = $this->shadow_width;
$vadj = $this->shadow_width;
}
$this->FillMarginArea();
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,0,0,0,0,$this->img->width-$hadj,$this->img->height-$vadj,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
case BGIMG_COPY: // Just copy the image from left corner, no resizing
$this->FillMarginArea();
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,0,0,0,0,$bw,$bh,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
case BGIMG_CENTER: // Center original image in the plot area
$this->FillMarginArea();
$this->FillPlotArea();
$centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2);
$centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2);
$this->img->CopyMerge($bkgimg,$centerx,$centery,0,0,$bw,$bh,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
case BGIMG_FREE: // Just copy the image to the specified location
$this->img->CopyMerge($bkgimg,
$this->background_image_xpos,$this->background_image_ypos,
0,0,$bw,$bh,$bw,$bh,$this->background_image_mix);
$this->StrokeFrame(); // New
break;
default:
JpGraphError::RaiseL(25042);//(" Unknown background image layout");
}
$this->img->SetAngle($aa);
}
 
// Private
// Draw a frame around the image
function StrokeFrame() {
if( !$this->doframe ) return;
 
if( $this->background_image_type <= 1 && ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT)) ) {
$c = $this->margin_color;
}
else {
$c = false;
}
 
if( $this->doshadow ) {
$this->img->SetColor($this->frame_color);
$this->img->ShadowRectangle(0,0,$this->img->width,$this->img->height,
$c,$this->shadow_width,$this->shadow_color);
}
elseif( $this->framebevel ) {
if( $c ) {
$this->img->SetColor($this->margin_color);
$this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1);
}
$this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2,
$this->framebeveldepth,
$this->framebevelcolor1,$this->framebevelcolor2);
if( $this->framebevelborder ) {
$this->img->SetColor($this->framebevelbordercolor);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
else {
$this->img->SetLineWeight($this->frame_weight);
if( $c ) {
$this->img->SetColor($this->margin_color);
$this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1);
}
$this->img->SetColor($this->frame_color);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
 
function FillMarginArea() {
$hadj=0; $vadj=0;
if( $this->doshadow ) {
$hadj = $this->shadow_width;
$vadj = $this->shadow_width;
}
 
$this->img->SetColor($this->margin_color);
// $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->height-1-$vadj);
 
$this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->top_margin);
$this->img->FilledRectangle(0,$this->img->top_margin,$this->img->left_margin,$this->img->height-1-$hadj);
$this->img->FilledRectangle($this->img->left_margin+1,
$this->img->height-$this->img->bottom_margin,
$this->img->width-1-$hadj,
$this->img->height-1-$hadj);
$this->img->FilledRectangle($this->img->width-$this->img->right_margin,
$this->img->top_margin+1,
$this->img->width-1-$hadj,
$this->img->height-$this->img->bottom_margin-1);
}
 
function FillPlotArea() {
$this->img->PushColor($this->plotarea_color);
$this->img->FilledRectangle($this->img->left_margin,
$this->img->top_margin,
$this->img->width-$this->img->right_margin,
$this->img->height-$this->img->bottom_margin);
$this->img->PopColor();
}
 
// Stroke the plot area with either a solid color or a background image
function StrokePlotArea() {
// Note: To be consistent we really should take a possible shadow
// into account. However, that causes some problem for the LinearScale class
// since in the current design it does not have any links to class Graph which
// means it has no way of compensating for the adjusted plotarea in case of a
// shadow. So, until I redesign LinearScale we can't compensate for this.
// So just set the two adjustment parameters to zero for now.
$boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ;
$adj = 0; //$this->doshadow ? $this->shadow_width : 0 ;
 
if( $this->background_image != '' || $this->background_cflag != '' ) {
$this->StrokeFrameBackground();
}
else {
$aa = $this->img->SetAngle(0);
$this->StrokeFrame();
$aa = $this->img->SetAngle($aa);
$this->StrokeBackgroundGrad();
if( $this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN) ) {
$this->FillPlotArea();
}
$this->StrokePlotGrad();
}
}
 
function StrokeIcons() {
$n = count($this->iIcons);
for( $i=0; $i < $n; ++$i ) {
$this->iIcons[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
 
function StrokePlotBox() {
// Should we draw a box around the plot area?
if( $this->boxed ) {
$this->img->SetLineWeight(1);
$this->img->SetLineStyle('solid');
$this->img->SetColor($this->box_color);
for($i=0; $i < $this->box_weight; ++$i ) {
$this->img->Rectangle(
$this->img->left_margin-$i,$this->img->top_margin-$i,
$this->img->width-$this->img->right_margin+$i,
$this->img->height-$this->img->bottom_margin+$i);
}
}
}
 
function SetTitleBackgroundFillStyle($aStyle,$aColor1='black',$aColor2='white') {
$this->titlebkg_fillstyle = $aStyle;
$this->titlebkg_scolor1 = $aColor1;
$this->titlebkg_scolor2 = $aColor2;
}
 
function SetTitleBackground($aBackColor='gray', $aStyle=TITLEBKG_STYLE1, $aFrameStyle=TITLEBKG_FRAME_NONE, $aFrameColor='black', $aFrameWeight=1, $aBevelHeight=3, $aEnable=true) {
$this->titlebackground = $aEnable;
$this->titlebackground_color = $aBackColor;
$this->titlebackground_style = $aStyle;
$this->titlebackground_framecolor = $aFrameColor;
$this->titlebackground_framestyle = $aFrameStyle;
$this->titlebackground_frameweight = $aFrameWeight;
$this->titlebackground_bevelheight = $aBevelHeight ;
}
 
 
function StrokeTitles() {
 
$margin=3;
 
if( $this->titlebackground ) {
// Find out height
$this->title->margin += 2 ;
$h = $this->title->GetTextHeight($this->img)+$this->title->margin+$margin;
if( $this->subtitle->t != '' && !$this->subtitle->hide ) {
$h += $this->subtitle->GetTextHeight($this->img)+$margin+
$this->subtitle->margin;
$h += 2;
}
if( $this->subsubtitle->t != '' && !$this->subsubtitle->hide ) {
$h += $this->subsubtitle->GetTextHeight($this->img)+$margin+
$this->subsubtitle->margin;
$h += 2;
}
$this->img->PushColor($this->titlebackground_color);
if( $this->titlebackground_style === TITLEBKG_STYLE1 ) {
// Inside the frame
if( $this->framebevel ) {
$x1 = $y1 = $this->framebeveldepth + 1 ;
$x2 = $this->img->width - $this->framebeveldepth - 2 ;
$this->title->margin += $this->framebeveldepth + 1 ;
$h += $y1 ;
$h += 2;
}
else {
$x1 = $y1 = $this->frame_weight;
$x2 = $this->img->width - $this->frame_weight-1;
}
}
elseif( $this->titlebackground_style === TITLEBKG_STYLE2 ) {
// Cover the frame as well
$x1 = $y1 = 0;
$x2 = $this->img->width - 1 ;
}
elseif( $this->titlebackground_style === TITLEBKG_STYLE3 ) {
// Cover the frame as well (the difference is that
// for style==3 a bevel frame border is on top
// of the title background)
$x1 = $y1 = 0;
$x2 = $this->img->width - 1 ;
$h += $this->framebeveldepth ;
$this->title->margin += $this->framebeveldepth ;
}
else {
JpGraphError::RaiseL(25043);//('Unknown title background style.');
}
 
if( $this->titlebackground_framestyle === 3 ) {
$h += $this->titlebackground_bevelheight*2 + 1 ;
$this->title->margin += $this->titlebackground_bevelheight ;
}
 
if( $this->doshadow ) {
$x2 -= $this->shadow_width ;
}
 
$indent=0;
if( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) {
$indent = $this->titlebackground_bevelheight;
}
 
if( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_HSTRIPED ) {
$this->img->FilledRectangle2($x1+$indent,$y1+$indent,$x2-$indent,$h-$indent,
$this->titlebkg_scolor1,
$this->titlebkg_scolor2);
}
elseif( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_VSTRIPED ) {
$this->img->FilledRectangle2($x1+$indent,$y1+$indent,$x2-$indent,$h-$indent,
$this->titlebkg_scolor1,
$this->titlebkg_scolor2,2);
}
else {
// Solid fill
$this->img->FilledRectangle($x1,$y1,$x2,$h);
}
$this->img->PopColor();
 
$this->img->PushColor($this->titlebackground_framecolor);
$this->img->SetLineWeight($this->titlebackground_frameweight);
if( $this->titlebackground_framestyle == TITLEBKG_FRAME_FULL ) {
// Frame background
$this->img->Rectangle($x1,$y1,$x2,$h);
}
elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BOTTOM ) {
// Bottom line only
$this->img->Line($x1,$h,$x2,$h);
}
elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) {
$this->img->Bevel($x1,$y1,$x2,$h,$this->titlebackground_bevelheight);
}
$this->img->PopColor();
 
// This is clumsy. But we neeed to stroke the whole graph frame if it is
// set to bevel to get the bevel shading on top of the text background
if( $this->framebevel && $this->doframe && $this->titlebackground_style === 3 ) {
$this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2,
$this->framebeveldepth,
$this->framebevelcolor1,$this->framebevelcolor2);
if( $this->framebevelborder ) {
$this->img->SetColor($this->framebevelbordercolor);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
}
 
// Stroke title
$y = $this->title->margin;
if( $this->title->halign == 'center' ) {
$this->title->Center(0,$this->img->width,$y);
}
elseif( $this->title->halign == 'left' ) {
$this->title->SetPos($this->title->margin+2,$y);
}
elseif( $this->title->halign == 'right' ) {
$indent = 0;
if( $this->doshadow ) {
$indent = $this->shadow_width+2;
}
$this->title->SetPos($this->img->width-$this->title->margin-$indent,$y,'right');
}
$this->title->Stroke($this->img);
 
// ... and subtitle
$y += $this->title->GetTextHeight($this->img) + $margin + $this->subtitle->margin;
if( $this->subtitle->halign == 'center' ) {
$this->subtitle->Center(0,$this->img->width,$y);
}
elseif( $this->subtitle->halign == 'left' ) {
$this->subtitle->SetPos($this->subtitle->margin+2,$y);
}
elseif( $this->subtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow )
$indent = $this->shadow_width+2;
$this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right');
}
$this->subtitle->Stroke($this->img);
 
// ... and subsubtitle
$y += $this->subtitle->GetTextHeight($this->img) + $margin + $this->subsubtitle->margin;
if( $this->subsubtitle->halign == 'center' ) {
$this->subsubtitle->Center(0,$this->img->width,$y);
}
elseif( $this->subsubtitle->halign == 'left' ) {
$this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y);
}
elseif( $this->subsubtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow )
$indent = $this->shadow_width+2;
$this->subsubtitle->SetPos($this->img->width-$this->subsubtitle->margin-$indent,$y,'right');
}
$this->subsubtitle->Stroke($this->img);
 
// ... and fancy title
$this->tabtitle->Stroke($this->img);
 
}
 
function StrokeTexts() {
// Stroke any user added text objects
if( $this->texts != null ) {
for($i=0; $i < count($this->texts); ++$i) {
$this->texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
 
if( $this->y2texts != null && $this->y2scale != null ) {
for($i=0; $i < count($this->y2texts); ++$i) {
$this->y2texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->y2scale);
}
}
 
}
 
function StrokeTables() {
if( $this->iTables != null ) {
$n = count($this->iTables);
for( $i=0; $i < $n; ++$i ) {
$this->iTables[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
}
 
function DisplayClientSideaImageMapAreas() {
// Debug stuff - display the outline of the image map areas
$csim='';
foreach ($this->plots as $p) {
$csim.= $p->GetCSIMareas();
}
$csim .= $this->legend->GetCSIMareas();
if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) {
$this->img->SetColor($this->csimcolor);
$n = count($coords[0]);
for ($i=0; $i < $n; $i++) {
if ( $coords[1][$i] == 'poly' ) {
preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts);
$this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]);
$m = count($pts[0]);
for ($j=0; $j < $m; $j++) {
$this->img->LineTo($pts[1][$j],$pts[2][$j]);
}
} elseif ( $coords[1][$i] == 'rect' ) {
$pts = preg_split('/,/', $coords[2][$i]);
$this->img->SetStartPoint($pts[0],$pts[1]);
$this->img->LineTo($pts[2],$pts[1]);
$this->img->LineTo($pts[2],$pts[3]);
$this->img->LineTo($pts[0],$pts[3]);
$this->img->LineTo($pts[0],$pts[1]);
}
}
}
}
 
// Text scale offset in world coordinates
function SetTextScaleOff($aOff) {
$this->text_scale_off = $aOff;
$this->xscale->text_scale_off = $aOff;
}
 
// Text width of bar to be centered in absolute pixels
function SetTextScaleAbsCenterOff($aOff) {
$this->text_scale_abscenteroff = $aOff;
}
 
// Get Y min and max values for added lines
function GetLinesYMinMax( $aLines ) {
$n = count($aLines);
if( $n == 0 ) return false;
$min = $aLines[0]->scaleposition ;
$max = $min ;
$flg = false;
for( $i=0; $i < $n; ++$i ) {
if( $aLines[$i]->direction == HORIZONTAL ) {
$flg = true ;
$v = $aLines[$i]->scaleposition ;
if( $min > $v ) $min = $v ;
if( $max < $v ) $max = $v ;
}
}
return $flg ? array($min,$max) : false ;
}
 
// Get X min and max values for added lines
function GetLinesXMinMax( $aLines ) {
$n = count($aLines);
if( $n == 0 ) return false ;
$min = $aLines[0]->scaleposition ;
$max = $min ;
$flg = false;
for( $i=0; $i < $n; ++$i ) {
if( $aLines[$i]->direction == VERTICAL ) {
$flg = true ;
$v = $aLines[$i]->scaleposition ;
if( $min > $v ) $min = $v ;
if( $max < $v ) $max = $v ;
}
}
return $flg ? array($min,$max) : false ;
}
 
// Get min and max values for all included plots
function GetPlotsYMinMax($aPlots) {
$n = count($aPlots);
$i=0;
do {
list($xmax,$max) = $aPlots[$i]->Max();
} while( ++$i < $n && !is_numeric($max) );
 
$i=0;
do {
list($xmin,$min) = $aPlots[$i]->Min();
} while( ++$i < $n && !is_numeric($min) );
 
if( !is_numeric($min) || !is_numeric($max) ) {
JpGraphError::RaiseL(25044);//('Cannot use autoscaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).');
}
 
for($i=0; $i < $n; ++$i ) {
list($xmax,$ymax)=$aPlots[$i]->Max();
list($xmin,$ymin)=$aPlots[$i]->Min();
if (is_numeric($ymax)) $max=max($max,$ymax);
if (is_numeric($ymin)) $min=min($min,$ymin);
}
if( $min == '' ) $min = 0;
if( $max == '' ) $max = 0;
if( $min == 0 && $max == 0 ) {
// Special case if all values are 0
$min=0;$max=1;
}
return array($min,$max);
}
 
} // Class
 
//===================================================
// CLASS LineProperty
// Description: Holds properties for a line
//===================================================
class LineProperty {
public $iWeight=1, $iColor='black', $iStyle='solid', $iShow=true;
 
function __construct($aWeight=1,$aColor='black',$aStyle='solid') {
$this->iWeight = $aWeight;
$this->iColor = $aColor;
$this->iStyle = $aStyle;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetWeight($aWeight) {
$this->iWeight = $aWeight;
}
 
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
 
function Show($aShow=true) {
$this->iShow=$aShow;
}
 
function Stroke($aImg,$aX1,$aY1,$aX2,$aY2) {
if( $this->iShow ) {
$aImg->PushColor($this->iColor);
$oldls = $aImg->line_style;
$oldlw = $aImg->line_weight;
$aImg->SetLineWeight($this->iWeight);
$aImg->SetLineStyle($this->iStyle);
$aImg->StyleLine($aX1,$aY1,$aX2,$aY2);
$aImg->PopColor($this->iColor);
$aImg->line_style = $oldls;
$aImg->line_weight = $oldlw;
 
}
}
}
 
//===================================================
// CLASS GraphTabTitle
// Description: Draw "tab" titles on top of graphs
//===================================================
class GraphTabTitle extends Text{
private $corner = 6 , $posx = 7, $posy = 4;
private $fillcolor='lightyellow',$bordercolor='black';
private $align = 'left', $width=TABTITLE_WIDTHFIT;
function __construct() {
$this->t = '';
$this->font_style = FS_BOLD;
$this->hide = true;
$this->color = 'darkred';
}
 
function SetColor($aTxtColor,$aFillColor='lightyellow',$aBorderColor='black') {
$this->color = $aTxtColor;
$this->fillcolor = $aFillColor;
$this->bordercolor = $aBorderColor;
}
 
function SetFillColor($aFillColor) {
$this->fillcolor = $aFillColor;
}
 
function SetTabAlign($aAlign) {
$this->align = $aAlign;
}
 
function SetWidth($aWidth) {
$this->width = $aWidth ;
}
 
function Set($t) {
$this->t = $t;
$this->hide = false;
}
 
function SetCorner($aD) {
$this->corner = $aD ;
}
 
function Stroke($aImg,$aDummy1=null,$aDummy2=null) {
if( $this->hide )
return;
$this->boxed = false;
$w = $this->GetWidth($aImg) + 2*$this->posx;
$h = $this->GetTextHeight($aImg) + 2*$this->posy;
 
$x = $aImg->left_margin;
$y = $aImg->top_margin;
 
if( $this->width === TABTITLE_WIDTHFIT ) {
if( $this->align == 'left' ) {
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
elseif( $this->align == 'center' ) {
$x += round($aImg->plotwidth/2) - round($w/2);
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner, $y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
else {
$x += $aImg->plotwidth -$w;
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
}
else {
if( $this->width === TABTITLE_WIDTHFULL ) {
$w = $aImg->plotwidth ;
}
else {
$w = $this->width ;
}
 
// Make the tab fit the width of the plot area
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
 
}
if( $this->halign == 'left' ) {
$aImg->SetTextAlign('left','bottom');
$x += $this->posx;
$y -= $this->posy;
}
elseif( $this->halign == 'center' ) {
$aImg->SetTextAlign('center','bottom');
$x += $w/2;
$y -= $this->posy;
}
else {
$aImg->SetTextAlign('right','bottom');
$x += $w - $this->posx;
$y -= $this->posy;
}
 
$aImg->SetColor($this->fillcolor);
$aImg->FilledPolygon($p);
 
$aImg->SetColor($this->bordercolor);
$aImg->Polygon($p,true);
 
$aImg->SetColor($this->color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->StrokeText($x,$y,$this->t,0,'center');
}
 
}
 
//===================================================
// CLASS SuperScriptText
// Description: Format a superscript text
//===================================================
class SuperScriptText extends Text {
private $iSuper='';
private $sfont_family='',$sfont_style='',$sfont_size=8;
private $iSuperMargin=2,$iVertOverlap=4,$iSuperScale=0.65;
private $iSDir=0;
private $iSimple=false;
 
function __construct($aTxt='',$aSuper='',$aXAbsPos=0,$aYAbsPos=0) {
parent::__construct($aTxt,$aXAbsPos,$aYAbsPos);
$this->iSuper = $aSuper;
}
 
function FromReal($aVal,$aPrecision=2) {
// Convert a floating point number to scientific notation
$neg=1.0;
if( $aVal < 0 ) {
$neg = -1.0;
$aVal = -$aVal;
}
 
$l = floor(log10($aVal));
$a = sprintf("%0.".$aPrecision."f",round($aVal / pow(10,$l),$aPrecision));
$a *= $neg;
if( $this->iSimple && ($a == 1 || $a==-1) ) $a = '';
 
if( $a != '' ) {
$this->t = $a.' * 10';
}
else {
if( $neg == 1 ) {
$this->t = '10';
}
else {
$this->t = '-10';
}
}
$this->iSuper = $l;
}
 
function Set($aTxt,$aSuper='') {
$this->t = $aTxt;
$this->iSuper = $aSuper;
}
 
function SetSuperFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=8) {
$this->sfont_family = $aFontFam;
$this->sfont_style = $aFontStyle;
$this->sfont_size = $aFontSize;
}
 
// Total width of text
function GetWidth($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$w = $aImg->GetTextWidth($this->t);
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$w += $aImg->GetTextWidth($this->iSuper);
$w += $this->iSuperMargin;
return $w;
}
 
// Hight of font (approximate the height of the text)
function GetFontHeight($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetFontHeight();
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$h += $aImg->GetFontHeight();
return $h;
}
 
// Hight of text
function GetTextHeight($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t);
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$h += $aImg->GetTextHeight($this->iSuper);
return $h;
}
 
function Stroke($aImg,$ax=-1,$ay=-1) {
 
// To position the super script correctly we need different
// cases to handle the alignmewnt specified since that will
// determine how we can interpret the x,y coordinates
 
$w = parent::GetWidth($aImg);
$h = parent::GetTextHeight($aImg);
switch( $this->valign ) {
case 'top':
$sy = $this->y;
break;
case 'center':
$sy = $this->y - $h/2;
break;
case 'bottom':
$sy = $this->y - $h;
break;
default:
JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text');
break;
}
 
switch( $this->halign ) {
case 'left':
$sx = $this->x + $w;
break;
case 'center':
$sx = $this->x + $w/2;
break;
case 'right':
$sx = $this->x;
break;
default:
JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text');
break;
}
 
$sx += $this->iSuperMargin;
$sy += $this->iVertOverlap;
 
// Should we automatically determine the font or
// has the user specified it explicetly?
if( $this->sfont_family == '' ) {
if( $this->font_family <= FF_FONT2 ) {
if( $this->font_family == FF_FONT0 ) {
$sff = FF_FONT0;
}
elseif( $this->font_family == FF_FONT1 ) {
if( $this->font_style == FS_NORMAL ) {
$sff = FF_FONT0;
}
else {
$sff = FF_FONT1;
}
}
else {
$sff = FF_FONT1;
}
$sfs = $this->font_style;
$sfz = $this->font_size;
}
else {
// TTF fonts
$sff = $this->font_family;
$sfs = $this->font_style;
$sfz = floor($this->font_size*$this->iSuperScale);
if( $sfz < 8 ) $sfz = 8;
}
$this->sfont_family = $sff;
$this->sfont_style = $sfs;
$this->sfont_size = $sfz;
}
else {
$sff = $this->sfont_family;
$sfs = $this->sfont_style;
$sfz = $this->sfont_size;
}
 
parent::Stroke($aImg,$ax,$ay);
 
// For the builtin fonts we need to reduce the margins
// since the bounding bx reported for the builtin fonts
// are much larger than for the TTF fonts.
if( $sff <= FF_FONT2 ) {
$sx -= 2;
$sy += 3;
}
 
$aImg->SetTextAlign('left','bottom');
$aImg->SetFont($sff,$sfs,$sfz);
$aImg->PushColor($this->color);
$aImg->StrokeText($sx,$sy,$this->iSuper,$this->iSDir,'left');
$aImg->PopColor();
}
}
 
 
//===================================================
// CLASS Grid
// Description: responsible for drawing grid lines in graph
//===================================================
class Grid {
protected $img;
protected $scale;
protected $majorcolor='#DDDDDD',$minorcolor='#EEEEEE';
protected $majortype='solid',$minortype='solid';
protected $show=false, $showMinor=false,$majorweight=1,$minorweight=1;
protected $fill=false,$fillcolor=array('#EFEFEF','#BBCCFF');
 
function __construct($aAxis) {
$this->scale = $aAxis->scale;
$this->img = $aAxis->img;
}
 
function SetColor($aMajColor,$aMinColor=false) {
$this->majorcolor=$aMajColor;
if( $aMinColor === false ) {
$aMinColor = $aMajColor ;
}
$this->minorcolor = $aMinColor;
}
 
function SetWeight($aMajorWeight,$aMinorWeight=1) {
$this->majorweight=$aMajorWeight;
$this->minorweight=$aMinorWeight;
}
 
// Specify if grid should be dashed, dotted or solid
function SetLineStyle($aMajorType,$aMinorType='solid') {
$this->majortype = $aMajorType;
$this->minortype = $aMinorType;
}
 
function SetStyle($aMajorType,$aMinorType='solid') {
$this->SetLineStyle($aMajorType,$aMinorType);
}
 
// Decide if both major and minor grid should be displayed
function Show($aShowMajor=true,$aShowMinor=false) {
$this->show=$aShowMajor;
$this->showMinor=$aShowMinor;
}
 
function SetFill($aFlg=true,$aColor1='lightgray',$aColor2='lightblue') {
$this->fill = $aFlg;
$this->fillcolor = array( $aColor1, $aColor2 );
}
 
// Display the grid
function Stroke() {
if( $this->showMinor && !$this->scale->textscale ) {
$this->DoStroke($this->scale->ticks->ticks_pos,$this->minortype,$this->minorcolor,$this->minorweight);
$this->DoStroke($this->scale->ticks->maj_ticks_pos,$this->majortype,$this->majorcolor,$this->majorweight);
}
else {
$this->DoStroke($this->scale->ticks->maj_ticks_pos,$this->majortype,$this->majorcolor,$this->majorweight);
}
}
 
//--------------
// Private methods
// Draw the grid
function DoStroke($aTicksPos,$aType,$aColor,$aWeight) {
if( !$this->show ) return;
$nbrgrids = count($aTicksPos);
 
if( $this->scale->type == 'y' ) {
$xl=$this->img->left_margin;
$xr=$this->img->width-$this->img->right_margin;
 
if( $this->fill ) {
// Draw filled areas
$y2 = $aTicksPos[0];
$i=1;
while( $i < $nbrgrids ) {
$y1 = $y2;
$y2 = $aTicksPos[$i++];
$this->img->SetColor($this->fillcolor[$i & 1]);
$this->img->FilledRectangle($xl,$y1,$xr,$y2);
}
}
 
$this->img->SetColor($aColor);
$this->img->SetLineWeight($aWeight);
 
// Draw grid lines
switch( $aType ) {
case 'solid': $style = LINESTYLE_SOLID; break;
case 'dotted': $style = LINESTYLE_DOTTED; break;
case 'dashed': $style = LINESTYLE_DASHED; break;
case 'longdashed': $style = LINESTYLE_LONGDASH; break;
default:
$style = LINESTYLE_SOLID; break;
}
 
for($i=0; $i < $nbrgrids; ++$i) {
$y=$aTicksPos[$i];
$this->img->StyleLine($xl,$y,$xr,$y,$style);
}
}
elseif( $this->scale->type == 'x' ) {
$yu=$this->img->top_margin;
$yl=$this->img->height-$this->img->bottom_margin;
$limit=$this->img->width-$this->img->right_margin;
 
if( $this->fill ) {
// Draw filled areas
$x2 = $aTicksPos[0];
$i=1;
while( $i < $nbrgrids ) {
$x1 = $x2;
$x2 = min($aTicksPos[$i++],$limit) ;
$this->img->SetColor($this->fillcolor[$i & 1]);
$this->img->FilledRectangle($x1,$yu,$x2,$yl);
}
}
 
$this->img->SetColor($aColor);
$this->img->SetLineWeight($aWeight);
 
// We must also test for limit since we might have
// an offset and the number of ticks is calculated with
// assumption offset==0 so we might end up drawing one
// to many gridlines
$i=0;
$x=$aTicksPos[$i];
while( $i<count($aTicksPos) && ($x=$aTicksPos[$i]) <= $limit ) {
if ( $aType == 'solid' ) $this->img->Line($x,$yl,$x,$yu);
elseif( $aType == 'dotted' ) $this->img->DashedLine($x,$yl,$x,$yu,1,6);
elseif( $aType == 'dashed' ) $this->img->DashedLine($x,$yl,$x,$yu,2,4);
elseif( $aType == 'longdashed' ) $this->img->DashedLine($x,$yl,$x,$yu,8,6);
++$i;
}
}
else {
JpGraphError::RaiseL(25054,$this->scale->type);//('Internal error: Unknown grid axis ['.$this->scale->type.']');
}
return true;
}
} // Class
 
//===================================================
// CLASS Axis
// Description: Defines X and Y axis. Notes that at the
// moment the code is not really good since the axis on
// several occasion must know wheter it's an X or Y axis.
// This was a design decision to make the code easier to
// follow.
//===================================================
class AxisPrototype {
public $scale=null;
public $img=null;
public $hide=false,$hide_labels=false;
public $title=null;
public $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12,$label_angle=0;
public $tick_step=1;
public $pos = false;
public $ticks_label = array();
 
protected $weight=1;
protected $color=array(0,0,0),$label_color=array(0,0,0);
protected $ticks_label_colors=null;
protected $show_first_label=true,$show_last_label=true;
protected $label_step=1; // Used by a text axis to specify what multiple of major steps
// should be labeled.
protected $labelPos=0; // Which side of the axis should the labels be?
protected $title_adjust,$title_margin,$title_side=SIDE_LEFT;
protected $tick_label_margin=5;
protected $label_halign = '',$label_valign = '', $label_para_align='left';
protected $hide_line=false;
protected $iDeltaAbsPos=0;
 
function __construct($img,$aScale,$color = array(0,0,0)) {
$this->img = $img;
$this->scale = $aScale;
$this->color = $color;
$this->title=new Text('');
 
if( $aScale->type == 'y' ) {
$this->title_margin = 25;
$this->title_adjust = 'middle';
$this->title->SetOrientation(90);
$this->tick_label_margin=7;
$this->labelPos=SIDE_LEFT;
}
else {
$this->title_margin = 5;
$this->title_adjust = 'high';
$this->title->SetOrientation(0);
$this->tick_label_margin=5;
$this->labelPos=SIDE_DOWN;
$this->title_side=SIDE_DOWN;
}
}
 
function SetLabelFormat($aFormStr) {
$this->scale->ticks->SetLabelFormat($aFormStr);
}
 
function SetLabelFormatString($aFormStr,$aDate=false) {
$this->scale->ticks->SetLabelFormat($aFormStr,$aDate);
}
 
function SetLabelFormatCallback($aFuncName) {
$this->scale->ticks->SetFormatCallback($aFuncName);
}
 
function SetLabelAlign($aHAlign,$aVAlign='top',$aParagraphAlign='left') {
$this->label_halign = $aHAlign;
$this->label_valign = $aVAlign;
$this->label_para_align = $aParagraphAlign;
}
 
// Don't display the first label
function HideFirstTickLabel($aShow=false) {
$this->show_first_label=$aShow;
}
 
function HideLastTickLabel($aShow=false) {
$this->show_last_label=$aShow;
}
 
// Manually specify the major and (optional) minor tick position and labels
function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) {
$this->scale->ticks->SetTickPositions($aMajPos,$aMinPos,$aLabels);
}
 
// Manually specify major tick positions and optional labels
function SetMajTickPositions($aMajPos,$aLabels=NULL) {
$this->scale->ticks->SetTickPositions($aMajPos,NULL,$aLabels);
}
 
// Hide minor or major tick marks
function HideTicks($aHideMinor=true,$aHideMajor=true) {
$this->scale->ticks->SupressMinorTickMarks($aHideMinor);
$this->scale->ticks->SupressTickMarks($aHideMajor);
}
 
// Hide zero label
function HideZeroLabel($aFlag=true) {
$this->scale->ticks->SupressZeroLabel();
}
 
function HideFirstLastLabel() {
// The two first calls to ticks method will supress
// automatically generated scale values. However, that
// will not affect manually specified value, e.g text-scales.
// therefor we also make a kludge here to supress manually
// specified scale labels.
$this->scale->ticks->SupressLast();
$this->scale->ticks->SupressFirst();
$this->show_first_label = false;
$this->show_last_label = false;
}
 
// Hide the axis
function Hide($aHide=true) {
$this->hide=$aHide;
}
 
// Hide the actual axis-line, but still print the labels
function HideLine($aHide=true) {
$this->hide_line = $aHide;
}
 
function HideLabels($aHide=true) {
$this->hide_labels = $aHide;
}
 
// Weight of axis
function SetWeight($aWeight) {
$this->weight = $aWeight;
}
 
// Axis color
function SetColor($aColor,$aLabelColor=false) {
$this->color = $aColor;
if( !$aLabelColor ) $this->label_color = $aColor;
else $this->label_color = $aLabelColor;
}
 
// Title on axis
function SetTitle($aTitle,$aAdjustAlign='high') {
$this->title->Set($aTitle);
$this->title_adjust=$aAdjustAlign;
}
 
// Specify distance from the axis
function SetTitleMargin($aMargin) {
$this->title_margin=$aMargin;
}
 
// Which side of the axis should the axis title be?
function SetTitleSide($aSideOfAxis) {
$this->title_side = $aSideOfAxis;
}
 
function SetTickSide($aDir) {
$this->scale->ticks->SetSide($aDir);
}
 
function SetTickSize($aMajSize,$aMinSize=3) {
$this->scale->ticks->SetSize($aMajSize,$aMinSize=3);
}
 
// Specify text labels for the ticks. One label for each data point
function SetTickLabels($aLabelArray,$aLabelColorArray=null) {
$this->ticks_label = $aLabelArray;
$this->ticks_label_colors = $aLabelColorArray;
}
 
function SetLabelMargin($aMargin) {
$this->tick_label_margin=$aMargin;
}
 
// Specify that every $step of the ticks should be displayed starting
// at $start
function SetTextTickInterval($aStep,$aStart=0) {
$this->scale->ticks->SetTextLabelStart($aStart);
$this->tick_step=$aStep;
}
 
// Specify that every $step tick mark should have a label
// should be displayed starting
function SetTextLabelInterval($aStep) {
if( $aStep < 1 ) {
JpGraphError::RaiseL(25058);//(" Text label interval must be specified >= 1.");
}
$this->label_step=$aStep;
}
 
function SetLabelSide($aSidePos) {
$this->labelPos=$aSidePos;
}
 
// Set the font
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family = $aFamily;
$this->font_style = $aStyle;
$this->font_size = $aSize;
}
 
// Position for axis line on the "other" scale
function SetPos($aPosOnOtherScale) {
$this->pos=$aPosOnOtherScale;
}
 
// Set the position of the axis to be X-pixels delta to the right
// of the max X-position (used to position the multiple Y-axis)
function SetPosAbsDelta($aDelta) {
$this->iDeltaAbsPos=$aDelta;
}
 
// Specify the angle for the tick labels
function SetLabelAngle($aAngle) {
$this->label_angle = $aAngle;
}
 
} // Class
 
 
//===================================================
// CLASS Axis
// Description: Defines X and Y axis. Notes that at the
// moment the code is not really good since the axis on
// several occasion must know wheter it's an X or Y axis.
// This was a design decision to make the code easier to
// follow.
//===================================================
class Axis extends AxisPrototype {
 
function __construct($img,$aScale,$color='black') {
parent::__construct($img,$aScale,$color);
}
 
// Stroke the axis.
function Stroke($aOtherAxisScale,$aStrokeLabels=true) {
if( $this->hide )
return;
if( is_numeric($this->pos) ) {
$pos=$aOtherAxisScale->Translate($this->pos);
}
else { // Default to minimum of other scale if pos not set
if( ($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos == 'min' ) {
$pos = $aOtherAxisScale->scale_abs[0];
}
elseif($this->pos == "max") {
$pos = $aOtherAxisScale->scale_abs[1];
}
else { // If negative set x-axis at 0
$this->pos=0;
$pos=$aOtherAxisScale->Translate(0);
}
}
$pos += $this->iDeltaAbsPos;
$this->img->SetLineWeight($this->weight);
$this->img->SetColor($this->color);
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
if( $this->scale->type == "x" ) {
if( !$this->hide_line ) {
$this->img->FilledRectangle($this->img->left_margin,$pos,$this->img->width-$this->img->right_margin,$pos+$this->weight-1);
}
if( $this->title_side == SIDE_DOWN ) {
$y = $pos + $this->img->GetFontHeight() + $this->title_margin + $this->title->margin;
$yalign = 'top';
}
else {
$y = $pos - $this->img->GetFontHeight() - $this->title_margin - $this->title->margin;
$yalign = 'bottom';
}
 
if( $this->title_adjust=='high' ) {
$this->title->SetPos($this->img->width-$this->img->right_margin,$y,'right',$yalign);
}
elseif( $this->title_adjust=='middle' || $this->title_adjust=='center' ) {
$this->title->SetPos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin,$y,'center',$yalign);
}
elseif($this->title_adjust=='low') {
$this->title->SetPos($this->img->left_margin,$y,'left',$yalign);
}
else {
JpGraphError::RaiseL(25060,$this->title_adjust);//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')');
}
}
elseif( $this->scale->type == "y" ) {
// Add line weight to the height of the axis since
// the x-axis could have a width>1 and we want the axis to fit nicely together.
if( !$this->hide_line ) {
$this->img->FilledRectangle($pos-$this->weight+1,$this->img->top_margin,$pos,$this->img->height-$this->img->bottom_margin+$this->weight-1);
}
$x=$pos ;
if( $this->title_side == SIDE_LEFT ) {
$x -= $this->title_margin;
$x -= $this->title->margin;
$halign = 'right';
}
else {
$x += $this->title_margin;
$x += $this->title->margin;
$halign = 'left';
}
// If the user has manually specified an hor. align
// then we override the automatic settings with this
// specifed setting. Since default is 'left' we compare
// with that. (This means a manually set 'left' align
// will have no effect.)
if( $this->title->halign != 'left' ) {
$halign = $this->title->halign;
}
if( $this->title_adjust == 'high' ) {
$this->title->SetPos($x,$this->img->top_margin,$halign,'top');
}
elseif($this->title_adjust=='middle' || $this->title_adjust=='center') {
$this->title->SetPos($x,($this->img->height-$this->img->top_margin-$this->img->bottom_margin)/2+$this->img->top_margin,$halign,"center");
}
elseif($this->title_adjust=='low') {
$this->title->SetPos($x,$this->img->height-$this->img->bottom_margin,$halign,'bottom');
}
else {
JpGraphError::RaiseL(25061,$this->title_adjust);//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')');
}
}
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
if( $aStrokeLabels ) {
if( !$this->hide_labels ) {
$this->StrokeLabels($pos);
}
$this->title->Stroke($this->img);
}
}
 
//---------------
// PRIVATE METHODS
// Draw all the tick labels on major tick marks
function StrokeLabels($aPos,$aMinor=false,$aAbsLabel=false) {
 
if( is_array($this->label_color) && count($this->label_color) > 3 ) {
$this->ticks_label_colors = $this->label_color;
$this->img->SetColor($this->label_color[0]);
}
else {
$this->img->SetColor($this->label_color);
}
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
$yoff=$this->img->GetFontHeight()/2;
 
// Only draw labels at major tick marks
$nbr = count($this->scale->ticks->maj_ticks_label);
 
// We have the option to not-display the very first mark
// (Usefull when the first label might interfere with another
// axis.)
$i = $this->show_first_label ? 0 : 1 ;
if( !$this->show_last_label ) {
--$nbr;
}
// Now run through all labels making sure we don't overshoot the end
// of the scale.
$ncolor=0;
if( isset($this->ticks_label_colors) ) {
$ncolor=count($this->ticks_label_colors);
}
while( $i < $nbr ) {
// $tpos holds the absolute text position for the label
$tpos=$this->scale->ticks->maj_ticklabels_pos[$i];
 
// Note. the $limit is only used for the x axis since we
// might otherwise overshoot if the scale has been centered
// This is due to us "loosing" the last tick mark if we center.
if( $this->scale->type == 'x' && $tpos > $this->img->width-$this->img->right_margin+1 ) {
return;
}
// we only draw every $label_step label
if( ($i % $this->label_step)==0 ) {
 
// Set specific label color if specified
if( $ncolor > 0 ) {
$this->img->SetColor($this->ticks_label_colors[$i % $ncolor]);
}
 
// If the label has been specified use that and in other case
// just label the mark with the actual scale value
$m=$this->scale->ticks->GetMajor();
 
// ticks_label has an entry for each data point and is the array
// that holds the labels set by the user. If the user hasn't
// specified any values we use whats in the automatically asigned
// labels in the maj_ticks_label
if( isset($this->ticks_label[$i*$m]) ) {
$label=$this->ticks_label[$i*$m];
}
else {
if( $aAbsLabel ) {
$label=abs($this->scale->ticks->maj_ticks_label[$i]);
}
else {
$label=$this->scale->ticks->maj_ticks_label[$i];
}
 
// We number the scale from 1 and not from 0 so increase by one
if( $this->scale->textscale &&
$this->scale->ticks->label_formfunc == '' &&
! $this->scale->ticks->HaveManualLabels() ) {
 
++$label;
}
}
 
if( $this->scale->type == "x" ) {
if( $this->labelPos == SIDE_DOWN ) {
if( $this->label_angle==0 || $this->label_angle==90 ) {
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign('center','top');
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
 
}
else {
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign("right","top");
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
}
$this->img->StrokeText($tpos,$aPos+$this->tick_label_margin,$label,
$this->label_angle,$this->label_para_align);
}
else {
if( $this->label_angle==0 || $this->label_angle==90 ) {
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign("center","bottom");
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
}
else {
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign("right","bottom");
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
}
$this->img->StrokeText($tpos,$aPos-$this->tick_label_margin-1,$label,
$this->label_angle,$this->label_para_align);
}
}
else {
// scale->type == "y"
//if( $this->label_angle!=0 )
//JpGraphError::Raise(" Labels at an angle are not supported on Y-axis");
if( $this->labelPos == SIDE_LEFT ) { // To the left of y-axis
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign("right","center");
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
$this->img->StrokeText($aPos-$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align);
}
else { // To the right of the y-axis
if( $this->label_halign=='' && $this->label_valign=='') {
$this->img->SetTextAlign("left","center");
}
else {
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
$this->img->StrokeText($aPos+$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align);
}
}
}
++$i;
}
}
 
}
 
 
//===================================================
// CLASS Ticks
// Description: Abstract base class for drawing linear and logarithmic
// tick marks on axis
//===================================================
class Ticks {
public $label_formatstr=''; // C-style format string to use for labels
public $label_formfunc='';
public $label_dateformatstr='';
public $direction=1; // Should ticks be in(=1) the plot area or outside (=-1)
public $supress_last=false,$supress_tickmarks=false,$supress_minor_tickmarks=false;
public $maj_ticks_pos = array(), $maj_ticklabels_pos = array(),
$ticks_pos = array(), $maj_ticks_label = array();
public $precision;
 
protected $minor_abs_size=3, $major_abs_size=5;
protected $scale;
protected $is_set=false;
protected $supress_zerolabel=false,$supress_first=false;
protected $mincolor='',$majcolor='';
protected $weight=1;
protected $label_usedateformat=FALSE;
 
function __construct($aScale) {
$this->scale=$aScale;
$this->precision = -1;
}
 
// Set format string for automatic labels
function SetLabelFormat($aFormatString,$aDate=FALSE) {
$this->label_formatstr=$aFormatString;
$this->label_usedateformat=$aDate;
}
 
function SetLabelDateFormat($aFormatString) {
$this->label_dateformatstr=$aFormatString;
}
 
function SetFormatCallback($aCallbackFuncName) {
$this->label_formfunc = $aCallbackFuncName;
}
 
// Don't display the first zero label
function SupressZeroLabel($aFlag=true) {
$this->supress_zerolabel=$aFlag;
}
 
// Don't display minor tick marks
function SupressMinorTickMarks($aHide=true) {
$this->supress_minor_tickmarks=$aHide;
}
 
// Don't display major tick marks
function SupressTickMarks($aHide=true) {
$this->supress_tickmarks=$aHide;
}
 
// Hide the first tick mark
function SupressFirst($aHide=true) {
$this->supress_first=$aHide;
}
 
// Hide the last tick mark
function SupressLast($aHide=true) {
$this->supress_last=$aHide;
}
 
// Size (in pixels) of minor tick marks
function GetMinTickAbsSize() {
return $this->minor_abs_size;
}
 
// Size (in pixels) of major tick marks
function GetMajTickAbsSize() {
return $this->major_abs_size;
}
 
function SetSize($aMajSize,$aMinSize=3) {
$this->major_abs_size = $aMajSize;
$this->minor_abs_size = $aMinSize;
}
 
// Have the ticks been specified
function IsSpecified() {
return $this->is_set;
}
 
function SetSide($aSide) {
$this->direction=$aSide;
}
 
// Which side of the axis should the ticks be on
function SetDirection($aSide=SIDE_RIGHT) {
$this->direction=$aSide;
}
 
// Set colors for major and minor tick marks
function SetMarkColor($aMajorColor,$aMinorColor='') {
$this->SetColor($aMajorColor,$aMinorColor);
}
 
function SetColor($aMajorColor,$aMinorColor='') {
$this->majcolor=$aMajorColor;
 
// If not specified use same as major
if( $aMinorColor == '' ) {
$this->mincolor=$aMajorColor;
}
else {
$this->mincolor=$aMinorColor;
}
}
 
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
 
} // Class
 
//===================================================
// CLASS LinearTicks
// Description: Draw linear ticks on axis
//===================================================
class LinearTicks extends Ticks {
public $minor_step=1, $major_step=2;
public $xlabel_offset=0,$xtick_offset=0;
private $label_offset=0; // What offset should the displayed label have
// i.e should we display 0,1,2 or 1,2,3,4 or 2,3,4 etc
private $text_label_start=0;
private $iManualTickPos = NULL, $iManualMinTickPos = NULL, $iManualTickLabels = NULL;
private $iAdjustForDST = false; // If a date falls within the DST period add one hour to the diaplyed time
 
function __construct() {
$this->precision = -1;
}
 
// Return major step size in world coordinates
function GetMajor() {
return $this->major_step;
}
 
// Return minor step size in world coordinates
function GetMinor() {
return $this->minor_step;
}
 
// Set Minor and Major ticks (in world coordinates)
function Set($aMajStep,$aMinStep=false) {
if( $aMinStep==false ) {
$aMinStep=$aMajStep;
}
 
if( $aMajStep <= 0 || $aMinStep <= 0 ) {
JpGraphError::RaiseL(25064);
//(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem.");
}
 
$this->major_step=$aMajStep;
$this->minor_step=$aMinStep;
$this->is_set = true;
}
 
function SetMajTickPositions($aMajPos,$aLabels=NULL) {
$this->SetTickPositions($aMajPos,NULL,$aLabels);
}
 
function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) {
if( !is_array($aMajPos) || ($aMinPos!==NULL && !is_array($aMinPos)) ) {
JpGraphError::RaiseL(25065);//('Tick positions must be specifued as an array()');
return;
}
$n=count($aMajPos);
if( is_array($aLabels) && (count($aLabels) != $n) ) {
JpGraphError::RaiseL(25066);//('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.');
}
$this->iManualTickPos = $aMajPos;
$this->iManualMinTickPos = $aMinPos;
$this->iManualTickLabels = $aLabels;
}
 
function HaveManualLabels() {
return count($this->iManualTickLabels) > 0;
}
 
// Specify all the tick positions manually and possible also the exact labels
function _doManualTickPos($aScale) {
$n=count($this->iManualTickPos);
$m=count($this->iManualMinTickPos);
$doLbl=count($this->iManualTickLabels) > 0;
 
$this->maj_ticks_pos = array();
$this->maj_ticklabels_pos = array();
$this->ticks_pos = array();
 
// Now loop through the supplied positions and translate them to screen coordinates
// and store them in the maj_label_positions
$minScale = $aScale->scale[0];
$maxScale = $aScale->scale[1];
$j=0;
for($i=0; $i < $n ; ++$i ) {
// First make sure that the first tick is not lower than the lower scale value
if( !isset($this->iManualTickPos[$i]) || $this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) {
continue;
}
 
$this->maj_ticks_pos[$j] = $aScale->Translate($this->iManualTickPos[$i]);
$this->maj_ticklabels_pos[$j] = $this->maj_ticks_pos[$j];
 
// Set the minor tick marks the same as major if not specified
if( $m <= 0 ) {
$this->ticks_pos[$j] = $this->maj_ticks_pos[$j];
}
if( $doLbl ) {
$this->maj_ticks_label[$j] = $this->iManualTickLabels[$i];
}
else {
$this->maj_ticks_label[$j]=$this->_doLabelFormat($this->iManualTickPos[$i],$i,$n);
}
++$j;
}
 
// Some sanity check
if( count($this->maj_ticks_pos) < 2 ) {
JpGraphError::RaiseL(25067);//('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tickl marks.');
}
 
// Setup the minor tick marks
$j=0;
for($i=0; $i < $m; ++$i ) {
if( empty($this->iManualMinTickPos[$i]) || $this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale) {
continue;
}
$this->ticks_pos[$j] = $aScale->Translate($this->iManualMinTickPos[$i]);
++$j;
}
}
 
function _doAutoTickPos($aScale) {
$maj_step_abs = $aScale->scale_factor*$this->major_step;
$min_step_abs = $aScale->scale_factor*$this->minor_step;
 
if( $min_step_abs==0 || $maj_step_abs==0 ) {
JpGraphError::RaiseL(25068);//("A plot has an illegal scale. This could for example be that you are trying to use text autoscaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only '-' or 'x')");
}
// We need to make this an int since comparing it below
// with the result from round() can give wrong result, such that
// (40 < 40) == TRUE !!!
$limit = (int)$aScale->scale_abs[1];
 
if( $aScale->textscale ) {
// This can only be true for a X-scale (horizontal)
// Define ticks for a text scale. This is slightly different from a
// normal linear type of scale since the position might be adjusted
// and the labels start at on
$label = (float)$aScale->GetMinVal()+$this->text_label_start+$this->label_offset;
$start_abs=$aScale->scale_factor*$this->text_label_start;
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
 
$x = $aScale->scale_abs[0]+$start_abs+$this->xlabel_offset*$min_step_abs;
for( $i=0; $label <= $aScale->GetMaxVal()+$this->label_offset; ++$i ) {
// Apply format to label
$this->maj_ticks_label[$i]=$this->_doLabelFormat($label,$i,$nbrmajticks);
$label+=$this->major_step;
 
// The x-position of the tick marks can be different from the labels.
// Note that we record the tick position (not the label) so that the grid
// happen upon tick marks and not labels.
$xtick=$aScale->scale_abs[0]+$start_abs+$this->xtick_offset*$min_step_abs+$i*$maj_step_abs;
$this->maj_ticks_pos[$i]=$xtick;
$this->maj_ticklabels_pos[$i] = round($x);
$x += $maj_step_abs;
}
}
else {
$label = $aScale->GetMinVal();
$abs_pos = $aScale->scale_abs[0];
$j=0; $i=0;
$step = round($maj_step_abs/$min_step_abs);
if( $aScale->type == "x" ) {
// For a normal linear type of scale the major ticks will always be multiples
// of the minor ticks. In order to avoid any rounding issues the major ticks are
// defined as every "step" minor ticks and not calculated separately
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
while( round($abs_pos) <= $limit ) {
$this->ticks_pos[] = round($abs_pos);
$this->ticks_label[] = $label;
if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks ) {
$this->maj_ticks_pos[$j] = round($abs_pos);
$this->maj_ticklabels_pos[$j] = round($abs_pos);
$this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks);
++$j;
}
++$i;
$abs_pos += $min_step_abs;
$label+=$this->minor_step;
}
}
elseif( $aScale->type == "y" ) {
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal())/$this->major_step)+1;
while( round($abs_pos) >= $limit ) {
$this->ticks_pos[$i] = round($abs_pos);
$this->ticks_label[$i]=$label;
if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks) {
$this->maj_ticks_pos[$j] = round($abs_pos);
$this->maj_ticklabels_pos[$j] = round($abs_pos);
$this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks);
++$j;
}
++$i;
$abs_pos += $min_step_abs;
$label += $this->minor_step;
}
}
}
}
 
function AdjustForDST($aFlg=true) {
$this->iAdjustForDST = $aFlg;
}
 
 
function _doLabelFormat($aVal,$aIdx,$aNbrTicks) {
 
// If precision hasn't been specified set it to a sensible value
if( $this->precision==-1 ) {
$t = log10($this->minor_step);
if( $t > 0 ) {
$precision = 0;
}
else {
$precision = -floor($t);
}
}
else {
$precision = $this->precision;
}
 
if( $this->label_formfunc != '' ) {
$f=$this->label_formfunc;
if( $this->label_formatstr == '' ) {
$l = call_user_func($f,$aVal);
}
else {
$l = sprintf($this->label_formatstr, call_user_func($f,$aVal));
}
}
elseif( $this->label_formatstr != '' || $this->label_dateformatstr != '' ) {
if( $this->label_usedateformat ) {
// Adjust the value to take daylight savings into account
if (date("I",$aVal)==1 && $this->iAdjustForDST ) {
// DST
$aVal+=3600;
}
 
$l = date($this->label_formatstr,$aVal);
if( $this->label_formatstr == 'W' ) {
// If we use week formatting then add a single 'w' in front of the
// week number to differentiate it from dates
$l = 'w'.$l;
}
}
else {
if( $this->label_dateformatstr !== '' ) {
// Adjust the value to take daylight savings into account
if (date("I",$aVal)==1 && $this->iAdjustForDST ) {
// DST
$aVal+=3600;
}
 
$l = date($this->label_dateformatstr,$aVal);
if( $this->label_formatstr == 'W' ) {
// If we use week formatting then add a single 'w' in front of the
// week number to differentiate it from dates
$l = 'w'.$l;
}
}
else {
$l = sprintf($this->label_formatstr,$aVal);
}
}
}
else {
$l = sprintf('%01.'.$precision.'f',round($aVal,$precision));
}
 
if( ($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) || ($this->supress_last && $aIdx==$aNbrTicks-1) ) {
$l='';
}
return $l;
}
 
// Stroke ticks on either X or Y axis
function _StrokeTicks($aImg,$aScale,$aPos) {
$hor = $aScale->type == 'x';
$aImg->SetLineWeight($this->weight);
 
// We need to make this an int since comparing it below
// with the result from round() can give wrong result, such that
// (40 < 40) == TRUE !!!
$limit = (int)$aScale->scale_abs[1];
 
// A text scale doesn't have any minor ticks
if( !$aScale->textscale ) {
// Stroke minor ticks
$yu = $aPos - $this->direction*$this->GetMinTickAbsSize();
$xr = $aPos + $this->direction*$this->GetMinTickAbsSize();
$n = count($this->ticks_pos);
for($i=0; $i < $n; ++$i ) {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor != '') {
$aImg->PushColor($this->mincolor);
}
if( $hor ) {
//if( $this->ticks_pos[$i] <= $limit )
$aImg->Line($this->ticks_pos[$i],$aPos,$this->ticks_pos[$i],$yu);
}
else {
//if( $this->ticks_pos[$i] >= $limit )
$aImg->Line($aPos,$this->ticks_pos[$i],$xr,$this->ticks_pos[$i]);
}
if( $this->mincolor != '' ) {
$aImg->PopColor();
}
}
}
}
 
// Stroke major ticks
$yu = $aPos - $this->direction*$this->GetMajTickAbsSize();
$xr = $aPos + $this->direction*$this->GetMajTickAbsSize();
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
$n = count($this->maj_ticks_pos);
for($i=0; $i < $n ; ++$i ) {
if(!($this->xtick_offset > 0 && $i==$nbrmajticks-1) && !$this->supress_tickmarks) {
if( $this->majcolor != '') {
$aImg->PushColor($this->majcolor);
}
if( $hor ) {
//if( $this->maj_ticks_pos[$i] <= $limit )
$aImg->Line($this->maj_ticks_pos[$i],$aPos,$this->maj_ticks_pos[$i],$yu);
}
else {
//if( $this->maj_ticks_pos[$i] >= $limit )
$aImg->Line($aPos,$this->maj_ticks_pos[$i],$xr,$this->maj_ticks_pos[$i]);
}
if( $this->majcolor != '') {
$aImg->PopColor();
}
}
}
 
}
 
// Draw linear ticks
function Stroke($aImg,$aScale,$aPos) {
if( $this->iManualTickPos != NULL ) {
$this->_doManualTickPos($aScale);
}
else {
$this->_doAutoTickPos($aScale);
}
$this->_StrokeTicks($aImg,$aScale,$aPos, $aScale->type == 'x' );
}
 
//---------------
// PRIVATE METHODS
// Spoecify the offset of the displayed tick mark with the tick "space"
// Legal values for $o is [0,1] used to adjust where the tick marks and label
// should be positioned within the major tick-size
// $lo specifies the label offset and $to specifies the tick offset
// this comes in handy for example in bar graphs where we wont no offset for the
// tick but have the labels displayed halfway under the bars.
function SetXLabelOffset($aLabelOff,$aTickOff=-1) {
$this->xlabel_offset=$aLabelOff;
if( $aTickOff==-1 ) {
// Same as label offset
$this->xtick_offset=$aLabelOff;
}
else {
$this->xtick_offset=$aTickOff;
}
if( $aLabelOff>0 ) {
$this->SupressLast(); // The last tick wont fit
}
}
 
// Which tick label should we start with?
function SetTextLabelStart($aTextLabelOff) {
$this->text_label_start=$aTextLabelOff;
}
 
} // Class
 
//===================================================
// CLASS LinearScale
// Description: Handle linear scaling between screen and world
//===================================================
class LinearScale {
public $textscale=false; // Just a flag to let the Plot class find out if
// we are a textscale or not. This is a cludge since
// this information is available in Graph::axtype but
// we don't have access to the graph object in the Plots
// stroke method. So we let graph store the status here
// when the linear scale is created. A real cludge...
public $type; // is this x or y scale ?
public $ticks=null; // Store ticks
public $text_scale_off = 0;
public $scale_abs=array(0,0);
public $scale_factor; // Scale factor between world and screen
public $off; // Offset between image edge and plot area
public $scale=array(0,0);
public $name = 'lin';
public $auto_ticks=false; // When using manual scale should the ticks be automatically set?
public $world_abs_size; // Plot area size in pixels (Needed public in jpgraph_radar.php)
public $world_size; // Plot area size in world coordinates
public $intscale=false; // Restrict autoscale to integers
protected $autoscale_min=false; // Forced minimum value, auto determine max
protected $autoscale_max=false; // Forced maximum value, auto determine min
private $gracetop=0,$gracebottom=0;
 
function __construct($aMin=0,$aMax=0,$aType='y') {
assert($aType=='x' || $aType=='y' );
assert($aMin<=$aMax);
 
$this->type=$aType;
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->ticks = new LinearTicks();
}
 
// Check if scale is set or if we should autoscale
// We should do this is either scale or ticks has not been set
function IsSpecified() {
if( $this->GetMinVal()==$this->GetMaxVal() ) { // Scale not set
return false;
}
return true;
}
 
// Set the minimum data value when the autoscaling is used.
// Usefull if you want a fix minimum (like 0) but have an
// automatic maximum
function SetAutoMin($aMin) {
$this->autoscale_min=$aMin;
}
 
// Set the minimum data value when the autoscaling is used.
// Usefull if you want a fix minimum (like 0) but have an
// automatic maximum
function SetAutoMax($aMax) {
$this->autoscale_max=$aMax;
}
 
// If the user manually specifies a scale should the ticks
// still be set automatically?
function SetAutoTicks($aFlag=true) {
$this->auto_ticks = $aFlag;
}
 
// Specify scale "grace" value (top and bottom)
function SetGrace($aGraceTop,$aGraceBottom=0) {
if( $aGraceTop<0 || $aGraceBottom < 0 ) {
JpGraphError::RaiseL(25069);//(" Grace must be larger then 0");
}
$this->gracetop=$aGraceTop;
$this->gracebottom=$aGraceBottom;
}
 
// Get the minimum value in the scale
function GetMinVal() {
return $this->scale[0];
}
 
// get maximum value for scale
function GetMaxVal() {
return $this->scale[1];
}
 
// Specify a new min/max value for sclae
function Update($aImg,$aMin,$aMax) {
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->InitConstants($aImg);
}
 
// Translate between world and screen
function Translate($aCoord) {
if( !is_numeric($aCoord) ) {
if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) {
JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.');
}
return 0;
}
else {
return round($this->off+($aCoord - $this->scale[0]) * $this->scale_factor);
}
}
 
// Relative translate (don't include offset) usefull when we just want
// to know the relative position (in pixels) on the axis
function RelTranslate($aCoord) {
if( !is_numeric($aCoord) ) {
if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) {
JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.');
}
return 0;
}
else {
return ($aCoord - $this->scale[0]) * $this->scale_factor;
}
}
 
// Restrict autoscaling to only use integers
function SetIntScale($aIntScale=true) {
$this->intscale=$aIntScale;
}
 
// Calculate an integer autoscale
function IntAutoScale($img,$min,$max,$maxsteps,$majend=true) {
// Make sure limits are integers
$min=floor($min);
$max=ceil($max);
if( abs($min-$max)==0 ) {
--$min; ++$max;
}
$maxsteps = floor($maxsteps);
 
$gracetop=round(($this->gracetop/100.0)*abs($max-$min));
$gracebottom=round(($this->gracebottom/100.0)*abs($max-$min));
if( is_numeric($this->autoscale_min) ) {
$min = ceil($this->autoscale_min);
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
}
 
if( is_numeric($this->autoscale_max) ) {
$max = ceil($this->autoscale_max);
if( $min >= $max ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
}
 
if( abs($min-$max ) == 0 ) {
++$max;
--$min;
}
 
$min -= $gracebottom;
$max += $gracetop;
 
// First get tickmarks as multiples of 1, 10, ...
if( $majend ) {
list($num1steps,$adj1min,$adj1max,$maj1step) = $this->IntCalcTicks($maxsteps,$min,$max,1);
}
else {
$adj1min = $min;
$adj1max = $max;
list($num1steps,$maj1step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,1);
}
 
if( abs($min-$max) > 2 ) {
// Then get tick marks as 2:s 2, 20, ...
if( $majend ) {
list($num2steps,$adj2min,$adj2max,$maj2step) = $this->IntCalcTicks($maxsteps,$min,$max,5);
}
else {
$adj2min = $min;
$adj2max = $max;
list($num2steps,$maj2step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,5);
}
}
else {
$num2steps = 10000; // Dummy high value so we don't choose this
}
 
if( abs($min-$max) > 5 ) {
// Then get tickmarks as 5:s 5, 50, 500, ...
if( $majend ) {
list($num5steps,$adj5min,$adj5max,$maj5step) = $this->IntCalcTicks($maxsteps,$min,$max,2);
}
else {
$adj5min = $min;
$adj5max = $max;
list($num5steps,$maj5step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,2);
}
}
else {
$num5steps = 10000; // Dummy high value so we don't choose this
}
 
// Check to see whichof 1:s, 2:s or 5:s fit better with
// the requested number of major ticks
$match1=abs($num1steps-$maxsteps);
$match2=abs($num2steps-$maxsteps);
if( !empty($maj5step) && $maj5step > 1 ) {
$match5=abs($num5steps-$maxsteps);
}
else {
$match5=10000; // Dummy high value
}
 
// Compare these three values and see which is the closest match
// We use a 0.6 weight to gravitate towards multiple of 5:s
if( $match1 < $match2 ) {
if( $match1 < $match5 ) $r=1;
else $r=3;
}
else {
if( $match2 < $match5 ) $r=2;
else $r=3;
}
// Minsteps are always the same as maxsteps for integer scale
switch( $r ) {
case 1:
$this->ticks->Set($maj1step,$maj1step);
$this->Update($img,$adj1min,$adj1max);
break;
case 2:
$this->ticks->Set($maj2step,$maj2step);
$this->Update($img,$adj2min,$adj2max);
break;
case 3:
$this->ticks->Set($maj5step,$maj5step);
$this->Update($img,$adj5min,$adj5max);
break;
default:
JpGraphError::RaiseL(25073,$r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)');
}
}
 
 
// Calculate autoscale. Used if user hasn't given a scale and ticks
// $maxsteps is the maximum number of major tickmarks allowed.
function AutoScale($img,$min,$max,$maxsteps,$majend=true) {
 
if( !is_numeric($min) || !is_numeric($max) ) {
JpGraphError::Raise(25044);
}
 
if( $this->intscale ) {
$this->IntAutoScale($img,$min,$max,$maxsteps,$majend);
return;
}
if( abs($min-$max) < 0.00001 ) {
// We need some difference to be able to autoscale
// make it 5% above and 5% below value
if( $min==0 && $max==0 ) { // Special case
$min=-1; $max=1;
}
else {
$delta = (abs($max)+abs($min))*0.005;
$min -= $delta;
$max += $delta;
}
}
 
$gracetop=($this->gracetop/100.0)*abs($max-$min);
$gracebottom=($this->gracebottom/100.0)*abs($max-$min);
if( is_numeric($this->autoscale_min) ) {
$min = $this->autoscale_min;
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
if( abs($min-$max ) < 0.001 ) {
$max *= 1.2;
}
}
 
if( is_numeric($this->autoscale_max) ) {
$max = $this->autoscale_max;
if( $min >= $max ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
if( abs($min-$max ) < 0.001 ) {
$min *= 0.8;
}
}
 
$min -= $gracebottom;
$max += $gracetop;
 
// First get tickmarks as multiples of 0.1, 1, 10, ...
if( $majend ) {
list($num1steps,$adj1min,$adj1max,$min1step,$maj1step) = $this->CalcTicks($maxsteps,$min,$max,1,2);
}
else {
$adj1min=$min;
$adj1max=$max;
list($num1steps,$min1step,$maj1step) = $this->CalcTicksFreeze($maxsteps,$min,$max,1,2,false);
}
 
// Then get tick marks as 2:s 0.2, 2, 20, ...
if( $majend ) {
list($num2steps,$adj2min,$adj2max,$min2step,$maj2step) = $this->CalcTicks($maxsteps,$min,$max,5,2);
}
else {
$adj2min=$min;
$adj2max=$max;
list($num2steps,$min2step,$maj2step) = $this->CalcTicksFreeze($maxsteps,$min,$max,5,2,false);
}
 
// Then get tickmarks as 5:s 0.05, 0.5, 5, 50, ...
if( $majend ) {
list($num5steps,$adj5min,$adj5max,$min5step,$maj5step) = $this->CalcTicks($maxsteps,$min,$max,2,5);
}
else {
$adj5min=$min;
$adj5max=$max;
list($num5steps,$min5step,$maj5step) = $this->CalcTicksFreeze($maxsteps,$min,$max,2,5,false);
}
 
// Check to see whichof 1:s, 2:s or 5:s fit better with
// the requested number of major ticks
$match1=abs($num1steps-$maxsteps);
$match2=abs($num2steps-$maxsteps);
$match5=abs($num5steps-$maxsteps);
 
// Compare these three values and see which is the closest match
// We use a 0.8 weight to gravitate towards multiple of 5:s
$r=$this->MatchMin3($match1,$match2,$match5,0.8);
switch( $r ) {
case 1:
$this->Update($img,$adj1min,$adj1max);
$this->ticks->Set($maj1step,$min1step);
break;
case 2:
$this->Update($img,$adj2min,$adj2max);
$this->ticks->Set($maj2step,$min2step);
break;
case 3:
$this->Update($img,$adj5min,$adj5max);
$this->ticks->Set($maj5step,$min5step);
break;
}
}
 
//---------------
// PRIVATE METHODS
 
// This method recalculates all constants that are depending on the
// margins in the image. If the margins in the image are changed
// this method should be called for every scale that is registred with
// that image. Should really be installed as an observer of that image.
function InitConstants($img) {
if( $this->type=='x' ) {
$this->world_abs_size=$img->width - $img->left_margin - $img->right_margin;
$this->off=$img->left_margin;
$this->scale_factor = 0;
if( $this->world_size > 0 ) {
$this->scale_factor=$this->world_abs_size/($this->world_size*1.0);
}
}
else { // y scale
$this->world_abs_size=$img->height - $img->top_margin - $img->bottom_margin;
$this->off=$img->top_margin+$this->world_abs_size;
$this->scale_factor = 0;
if( $this->world_size > 0 ) {
$this->scale_factor=-$this->world_abs_size/($this->world_size*1.0);
}
}
$size = $this->world_size * $this->scale_factor;
$this->scale_abs=array($this->off,$this->off + $size);
}
 
// Initialize the conversion constants for this scale
// This tries to pre-calculate as much as possible to speed up the
// actual conversion (with Translate()) later on
// $start =scale start in absolute pixels (for x-scale this is an y-position
// and for an y-scale this is an x-position
// $len =absolute length in pixels of scale
function SetConstants($aStart,$aLen) {
$this->world_abs_size=$aLen;
$this->off=$aStart;
 
if( $this->world_size<=0 ) {
// This should never ever happen !!
JpGraphError::RaiseL(25074);
//("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale] <br> Please report Bug #01 to jpgraph@aditus.nu and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail.");
}
 
// scale_factor = number of pixels per world unit
$this->scale_factor=$this->world_abs_size/($this->world_size*1.0);
 
// scale_abs = start and end points of scale in absolute pixels
$this->scale_abs=array($this->off,$this->off+$this->world_size*$this->scale_factor);
}
 
 
// Calculate number of ticks steps with a specific division
// $a is the divisor of 10**x to generate the first maj tick intervall
// $a=1, $b=2 give major ticks with multiple of 10, ...,0.1,1,10,...
// $a=5, $b=2 give major ticks with multiple of 2:s ...,0.2,2,20,...
// $a=2, $b=5 give major ticks with multiple of 5:s ...,0.5,5,50,...
// We return a vector of
// [$numsteps,$adjmin,$adjmax,$minstep,$majstep]
// If $majend==true then the first and last marks on the axis will be major
// labeled tick marks otherwise it will be adjusted to the closest min tick mark
function CalcTicks($maxsteps,$min,$max,$a,$b,$majend=true) {
$diff=$max-$min;
if( $diff==0 ) {
$ld=0;
}
else {
$ld=floor(log10($diff));
}
 
// Gravitate min towards zero if we are close
if( $min>0 && $min < pow(10,$ld) ) $min=0;
 
//$majstep=pow(10,$ld-1)/$a;
$majstep=pow(10,$ld)/$a;
$minstep=$majstep/$b;
 
$adjmax=ceil($max/$minstep)*$minstep;
$adjmin=floor($min/$minstep)*$minstep;
$adjdiff = $adjmax-$adjmin;
$numsteps=$adjdiff/$majstep;
 
while( $numsteps>$maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=$adjdiff/$majstep;
++$ld;
}
 
$minstep=$majstep/$b;
$adjmin=floor($min/$minstep)*$minstep;
$adjdiff = $adjmax-$adjmin;
if( $majend ) {
$adjmin = floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin;
}
else {
$adjmax=ceil($max/$minstep)*$minstep;
}
 
return array($numsteps,$adjmin,$adjmax,$minstep,$majstep);
}
 
function CalcTicksFreeze($maxsteps,$min,$max,$a,$b) {
// Same as CalcTicks but don't adjust min/max values
$diff=$max-$min;
if( $diff==0 ) {
$ld=0;
}
else {
$ld=floor(log10($diff));
}
 
//$majstep=pow(10,$ld-1)/$a;
$majstep=pow(10,$ld)/$a;
$minstep=$majstep/$b;
$numsteps=floor($diff/$majstep);
 
while( $numsteps > $maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=floor($diff/$majstep);
++$ld;
}
$minstep=$majstep/$b;
return array($numsteps,$minstep,$majstep);
}
 
 
function IntCalcTicks($maxsteps,$min,$max,$a,$majend=true) {
$diff=$max-$min;
if( $diff==0 ) {
JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.');
}
else {
$ld=floor(log10($diff));
}
 
// Gravitate min towards zero if we are close
if( $min>0 && $min < pow(10,$ld) ) {
$min=0;
}
if( $ld == 0 ) {
$ld=1;
}
if( $a == 1 ) {
$majstep = 1;
}
else {
$majstep=pow(10,$ld)/$a;
}
$adjmax=ceil($max/$majstep)*$majstep;
 
$adjmin=floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$numsteps=$adjdiff/$majstep;
while( $numsteps>$maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=$adjdiff/$majstep;
++$ld;
}
 
$adjmin=floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
if( $majend ) {
$adjmin = floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin;
}
else {
$adjmax=ceil($max/$majstep)*$majstep;
}
 
return array($numsteps,$adjmin,$adjmax,$majstep);
}
 
 
function IntCalcTicksFreeze($maxsteps,$min,$max,$a) {
// Same as IntCalcTick but don't change min/max values
$diff=$max-$min;
if( $diff==0 ) {
JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.');
}
else {
$ld=floor(log10($diff));
}
if( $ld == 0 ) {
$ld=1;
}
if( $a == 1 ) {
$majstep = 1;
}
else {
$majstep=pow(10,$ld)/$a;
}
 
$numsteps=floor($diff/$majstep);
while( $numsteps > $maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=floor($diff/$majstep);
++$ld;
}
 
return array($numsteps,$majstep);
}
 
// Determine the minimum of three values witha weight for last value
function MatchMin3($a,$b,$c,$weight) {
if( $a < $b ) {
if( $a < ($c*$weight) ) {
return 1; // $a smallest
}
else {
return 3; // $c smallest
}
}
elseif( $b < ($c*$weight) ) {
return 2; // $b smallest
}
return 3; // $c smallest
}
} // Class
 
 
//===================================================
// CLASS DisplayValue
// Description: Used to print data values at data points
//===================================================
class DisplayValue {
public $margin=5;
public $show=false;
public $valign='',$halign='center';
public $format='%.1f',$negformat='';
private $ff=FF_FONT1,$fs=FS_NORMAL,$fsize=10;
private $iFormCallback='';
private $angle=0;
private $color='navy',$negcolor='';
private $iHideZero=false;
public $txt=null;
 
function __construct() {
$this->txt = new Text();
}
 
function Show($aFlag=true) {
$this->show=$aFlag;
}
 
function SetColor($aColor,$aNegcolor='') {
$this->color = $aColor;
$this->negcolor = $aNegcolor;
}
 
function SetFont($aFontFamily,$aFontStyle=FS_NORMAL,$aFontSize=10) {
$this->ff=$aFontFamily;
$this->fs=$aFontStyle;
$this->fsize=$aFontSize;
}
 
function ApplyFont($aImg) {
$aImg->SetFont($this->ff,$this->fs,$this->fsize);
}
 
function SetMargin($aMargin) {
$this->margin = $aMargin;
}
 
function SetAngle($aAngle) {
$this->angle = $aAngle;
}
 
function SetAlign($aHAlign,$aVAlign='') {
$this->halign = $aHAlign;
$this->valign = $aVAlign;
}
 
function SetFormat($aFormat,$aNegFormat='') {
$this->format= $aFormat;
$this->negformat= $aNegFormat;
}
 
function SetFormatCallback($aFunc) {
$this->iFormCallback = $aFunc;
}
 
function HideZero($aFlag=true) {
$this->iHideZero=$aFlag;
}
 
function Stroke($img,$aVal,$x,$y) {
 
if( $this->show )
{
if( $this->negformat=='' ) {
$this->negformat=$this->format;
}
if( $this->negcolor=='' ) {
$this->negcolor=$this->color;
}
 
if( $aVal===NULL || (is_string($aVal) && ($aVal=='' || $aVal=='-' || $aVal=='x' ) ) ) {
return;
}
 
if( is_numeric($aVal) && $aVal==0 && $this->iHideZero ) {
return;
}
 
// Since the value is used in different cirumstances we need to check what
// kind of formatting we shall use. For example, to display values in a line
// graph we simply display the formatted value, but in the case where the user
// has already specified a text string we don't fo anything.
if( $this->iFormCallback != '' ) {
$f = $this->iFormCallback;
$sval = call_user_func($f,$aVal);
}
elseif( is_numeric($aVal) ) {
if( $aVal >= 0 ) {
$sval=sprintf($this->format,$aVal);
}
else {
$sval=sprintf($this->negformat,$aVal);
}
}
else {
$sval=$aVal;
}
 
$y = $y-sign($aVal)*$this->margin;
 
$this->txt->Set($sval);
$this->txt->SetPos($x,$y);
$this->txt->SetFont($this->ff,$this->fs,$this->fsize);
if( $this->valign == '' ) {
if( $aVal >= 0 ) {
$valign = "bottom";
}
else {
$valign = "top";
}
}
else {
$valign = $this->valign;
}
$this->txt->Align($this->halign,$valign);
 
$this->txt->SetOrientation($this->angle);
if( $aVal > 0 ) {
$this->txt->SetColor($this->color);
}
else {
$this->txt->SetColor($this->negcolor);
}
$this->txt->Stroke($img);
}
}
}
 
//===================================================
// CLASS Plot
// Description: Abstract base class for all concrete plot classes
//===================================================
class Plot {
public $numpoints=0;
public $value;
public $legend='';
public $coords=array();
public $color='black';
public $hidelegend=false;
public $line_weight=1;
public $csimtargets=array(),$csimwintargets=array(); // Array of targets for CSIM
public $csimareas=''; // Resultant CSIM area tags
public $csimalts=null; // ALT:s for corresponding target
public $legendcsimtarget='',$legendcsimwintarget='';
public $legendcsimalt='';
protected $weight=1;
protected $center=false;
 
function __construct($aDatay,$aDatax=false) {
$this->numpoints = count($aDatay);
if( $this->numpoints==0 ) {
JpGraphError::RaiseL(25121);//("Empty input data array specified for plot. Must have at least one data point.");
}
$this->coords[0]=$aDatay;
if( is_array($aDatax) ) {
$this->coords[1]=$aDatax;
$n = count($aDatax);
for( $i=0; $i < $n; ++$i ) {
if( !is_numeric($aDatax[$i]) ) {
JpGraphError::RaiseL(25070);
}
}
}
$this->value = new DisplayValue();
}
 
// Stroke the plot
// "virtual" function which must be implemented by
// the subclasses
function Stroke($aImg,$aXScale,$aYScale) {
JpGraphError::RaiseL(25122);//("JpGraph: Stroke() must be implemented by concrete subclass to class Plot");
}
 
function HideLegend($f=true) {
$this->hidelegend = $f;
}
 
function DoLegend($graph) {
if( !$this->hidelegend )
$this->Legend($graph);
}
 
function StrokeDataValue($img,$aVal,$x,$y) {
$this->value->Stroke($img,$aVal,$x,$y);
}
 
// Set href targets for CSIM
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets=$aTargets;
$this->csimwintargets=$aWinTargets;
$this->csimalts=$aAlts;
}
 
// Get all created areas
function GetCSIMareas() {
return $this->csimareas;
}
 
// "Virtual" function which gets called before any scale
// or axis are stroked used to do any plot specific adjustment
function PreStrokeAdjust($aGraph) {
if( substr($aGraph->axtype,0,4) == "text" && (isset($this->coords[1])) ) {
JpGraphError::RaiseL(25123);//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead.");
}
return true;
}
 
// Virtual function to the the concrete plot class to make any changes to the graph
// and scale before the stroke process begins
function PreScaleSetup($aGraph) {
// Empty
}
 
// Get minimum values in plot
function Min() {
if( isset($this->coords[1]) ) {
$x=$this->coords[1];
}
else {
$x='';
}
if( $x != '' && count($x) > 0 ) {
$xm=min($x);
}
else {
$xm=0;
}
$y=$this->coords[0];
$cnt = count($y);
if( $cnt > 0 ) {
$i=0;
while( $i<$cnt && !is_numeric($ym=$y[$i]) ) {
$i++;
}
while( $i < $cnt) {
if( is_numeric($y[$i]) ) {
$ym=min($ym,$y[$i]);
}
++$i;
}
}
else {
$ym='';
}
return array($xm,$ym);
}
 
// Get maximum value in plot
function Max() {
if( isset($this->coords[1]) ) {
$x=$this->coords[1];
}
else {
$x='';
}
 
if( $x!='' && count($x) > 0 ) {
$xm=max($x);
}
else {
$xm = $this->numpoints-1;
}
$y=$this->coords[0];
if( count($y) > 0 ) {
$cnt = count($y);
$i=0;
while( $i<$cnt && !is_numeric($ym=$y[$i]) ) {
$i++;
}
while( $i < $cnt ) {
if( is_numeric($y[$i]) ) {
$ym=max($ym,$y[$i]);
}
++$i;
}
}
else {
$ym='';
}
return array($xm,$ym);
}
 
function SetColor($aColor) {
$this->color=$aColor;
}
 
function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimwintarget = $aCSIMWinTarget;
$this->legendcsimalt = $aCSIMAlt;
}
 
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
 
function SetLineWeight($aWeight=1) {
$this->line_weight=$aWeight;
}
 
function SetCenter($aCenter=true) {
$this->center = $aCenter;
}
 
// This method gets called by Graph class to plot anything that should go
// into the margin after the margin color has been set.
function StrokeMargin($aImg) {
return true;
}
 
// Framework function the chance for each plot class to set a legend
function Legend($aGraph) {
if( $this->legend != '' ) {
$aGraph->legend->Add($this->legend,$this->color,'',0,$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
 
} // Class
 
 
// Provide a deterministic list of new colors whenever the getColor() method
// is called. Used to automatically set colors of plots.
class ColorFactory {
 
static private $iIdx = 0;
static private $iColorList = array(
'black',
'blue',
'orange',
'darkgreen',
'red',
'AntiqueWhite3',
'aquamarine3',
'azure4',
'brown',
'cadetblue3',
'chartreuse4',
'chocolate',
'darkblue',
'darkgoldenrod3',
'darkorchid3',
'darksalmon',
'darkseagreen4',
'deepskyblue2',
'dodgerblue4',
'gold3',
'hotpink',
'lawngreen',
'lightcoral',
'lightpink3',
'lightseagreen',
'lightslateblue',
'mediumpurple',
'olivedrab',
'orangered1',
'peru',
'slategray',
'yellow4',
'springgreen2');
static private $iNum = 33;
 
static function getColor() {
if( ColorFactory::$iIdx >= ColorFactory::$iNum )
ColorFactory::$iIdx = 0;
return ColorFactory::$iColorList[ColorFactory::$iIdx++];
}
 
}
 
// <EOF>
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpg-config.inc.php
New file
0,0 → 1,132
<?php
//=======================================================================
// File: JPG-CONFIG.INC
// Description: Configuration file for JpGraph library
// Created: 2004-03-27
// Ver: $Id: jpg-config.inc.php 1871 2009-09-29 05:56:39Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//------------------------------------------------------------------------
// Directories for cache and font directory.
//
// CACHE_DIR:
// The full absolute name of the directory to be used to store the
// cached image files. This directory will not be used if the USE_CACHE
// define (further down) is false. If you enable the cache please note that
// this directory MUST be readable and writable for the process running PHP.
// Must end with '/'
//
// TTF_DIR:
// Directory where TTF fonts can be found. Must end with '/'
//
// The default values used if these defines are left commented out are:
//
// UNIX:
// CACHE_DIR /tmp/jpgraph_cache/
// TTF_DIR /usr/share/fonts/truetype/
// MBTTF_DIR /usr/share/fonts/truetype/
//
// WINDOWS:
// CACHE_DIR $SERVER_TEMP/jpgraph_cache/
// TTF_DIR $SERVER_SYSTEMROOT/fonts/
// MBTTF_DIR $SERVER_SYSTEMROOT/fonts/
//
//------------------------------------------------------------------------
// define('CACHE_DIR','/tmp/jpgraph_cache/');
// define('TTF_DIR','/usr/share/fonts/truetype/');
// define('MBTTF_DIR','/usr/share/fonts/truetype/');
 
//-------------------------------------------------------------------------
// Cache directory specification for use with CSIM graphs that are
// using the cache.
// The directory must be the filesysystem name as seen by PHP
// and the 'http' version must be the same directory but as
// seen by the HTTP server relative to the 'htdocs' ddirectory.
// If a relative path is specified it is taken to be relative from where
// the image script is executed.
// Note: The default setting is to create a subdirectory in the
// directory from where the image script is executed and store all files
// there. As ususal this directory must be writeable by the PHP process.
define('CSIMCACHE_DIR','csimcache/');
define('CSIMCACHE_HTTP_DIR','csimcache/');
 
//------------------------------------------------------------------------
// Various JpGraph Settings. Adjust accordingly to your
// preferences. Note that cache functionality is turned off by
// default (Enable by setting USE_CACHE to true)
//------------------------------------------------------------------------
 
// Deafult locale for error messages.
// This defaults to English = 'en'
define('DEFAULT_ERR_LOCALE','en');
 
// Deafult graphic format set to 'auto' which will automatically
// choose the best available format in the order png,gif,jpeg
// (The supported format depends on what your PHP installation supports)
define('DEFAULT_GFORMAT','auto');
 
// Should the cache be used at all? By setting this to false no
// files will be generated in the cache directory.
// The difference from READ_CACHE being that setting READ_CACHE to
// false will still create the image in the cache directory
// just not use it. By setting USE_CACHE=false no files will even
// be generated in the cache directory.
define('USE_CACHE',false);
 
// Should we try to find an image in the cache before generating it?
// Set this define to false to bypass the reading of the cache and always
// regenerate the image. Note that even if reading the cache is
// disabled the cached will still be updated with the newly generated
// image. Set also 'USE_CACHE' below.
define('READ_CACHE',true);
 
// Determine if the error handler should be image based or purely
// text based. Image based makes it easier since the script will
// always return an image even in case of errors.
define('USE_IMAGE_ERROR_HANDLER',true);
 
// Should the library examine the global php_errmsg string and convert
// any error in it to a graphical representation. This is handy for the
// occasions when, for example, header files cannot be found and this results
// in the graph not being created and just a 'red-cross' image would be seen.
// This should be turned off for a production site.
define('CATCH_PHPERRMSG',true);
 
// Determine if the library should also setup the default PHP
// error handler to generate a graphic error mesage. This is useful
// during development to be able to see the error message as an image
// instead as a 'red-cross' in a page where an image is expected.
define('INSTALL_PHP_ERR_HANDLER',false);
 
// Should usage of deprecated functions and parameters give a fatal error?
// (Useful to check if code is future proof.)
define('ERR_DEPRECATED',true);
 
// The builtin GD function imagettfbbox() fuction which calculates the bounding box for
// text using TTF fonts is buggy. By setting this define to true the library
// uses its own compensation for this bug. However this will give a
// slightly different visual apparance than not using this compensation.
// Enabling this compensation will in general give text a bit more space to more
// truly reflect the actual bounding box which is a bit larger than what the
// GD function thinks.
define('USE_LIBRARY_IMAGETTFBBOX',true);
 
//------------------------------------------------------------------------
// The following constants should rarely have to be changed !
//------------------------------------------------------------------------
 
// What group should the cached file belong to
// (Set to '' will give the default group for the 'PHP-user')
// Please note that the Apache user must be a member of the
// specified group since otherwise it is impossible for Apache
// to set the specified group.
define('CACHE_FILE_GROUP','www');
 
// What permissions should the cached file have
// (Set to '' will give the default persmissions for the 'PHP-user')
define('CACHE_FILE_MOD',0664);
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/lang/en.inc.php
New file
0,0 → 1,536
<?php
/*=======================================================================
// File: EN.INC.PHP
// Description: English language file for error messages
// Created: 2006-01-25
// Ver: $Id: en.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// Note: Format of each error message is array(<error message>,<number of arguments>)
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border="1"><tr><td style="color:darkred; font-size:1.2em;"><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup errors
*/
11 => array('No path specified for CACHE_DIR. Please specify CACHE_DIR manually in jpg-config.inc',0),
12 => array('No path specified for TTF_DIR and path can not be determined automatically. Please specify TTF_DIR manually (in jpg-config.inc).',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
 
 
/*
** jpgraph_bar
*/
 
2001 => array('Number of colors is not the same as the number of patterns in BarPlot::SetPattern()',0),
2002 => array('Unknown pattern specified in call to BarPlot::SetPattern()',0),
2003 => array('Number of X and Y points are not equal. Number of X-points: %d Number of Y-points: %d',2),
2004 => array('All values for a barplot must be numeric. You have specified value nr [%d] == %s',2),
2005 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2006 => array('Unknown position for values on bars : %s',1),
2007 => array('Cannot create GroupBarPlot from empty plot array.',0),
2008 => array('Group bar plot element nbr %d is undefined or empty.',0),
2009 => array('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the GroupBar plot from an array of BarPlot or AccBarPlot objects. (Class = %s)',1),
2010 => array('Cannot create AccBarPlot from empty plot array.',0),
2011 => array('Acc bar plot element nbr %d is undefined or empty.',1),
2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1),
2013 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2014 => array('Number of datapoints for each data set in accbarplot must be the same',0),
2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unknown flag size (%d).',1),
5002 => array('Flag index %s does not exist.',1),
5003 => array('Invalid ordinal number (%d) specified for flag index.',1),
5004 => array('The (partial) country name %s does not have a corresponding flag image. The flag may still exist but under another name, e.g. instead of "usa" try "united states".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Internal error. Height for ActivityTitles is < 0',0),
6002 => array('You can\'t specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.',0),
6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1),
6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1),
6005 => array('SetScale() is not meaningful with Gantt charts.',0),
6006 => array('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]',0),
6007 => array('Sanity check for automatic Gantt chart size failed. Either the width (=%d) or height (=%d) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.',2),
6008 => array('You have specified a constrain from row=%d to row=%d which does not have any activity',2),
6009 => array('Unknown constrain type specified from row=%d to row=%d',2),
6010 => array('Illegal icon index for Gantt builtin icon [%d]',1),
6011 => array('Argument to IconImage must be string or integer',0),
6012 => array('Unknown type in Gantt object title specification',0),
6015 => array('Illegal vertical position %d',1),
6016 => array('Date string (%s) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30',1),
6017 => array('Unknown date format in GanttScale (%s).',1),
6018 => array('Interval for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an interval of %d minutes.',1),
6019 => array('The available width (%d) for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.',1),
6020 => array('Interval for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an interval of %d',1),
6021 => array('Unknown formatting style for week.',0),
6022 => array('Gantt scale has not been specified.',0),
6023 => array('If you display both hour and minutes the hour interval must be 1 (Otherwise it doesn\'t make sense to display minutes).',0),
6024 => array('CSIM Target must be specified as a string. Start of target is: %d',1),
6025 => array('CSIM Alt text must be specified as a string. Start of alt text is: %d',1),
6027 => array('Progress value must in range [0, 1]',0),
6028 => array('Specified height (%d) for gantt bar is out of range.',1),
6029 => array('Offset for vertical line must be in range [0,1]',0),
6030 => array('Unknown arrow direction for link.',0),
6031 => array('Unknown arrow type for link.',0),
6032 => array('Internal error: Unknown path type (=%d) specified for link.',1),
6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unknown gradient style (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Mix value for icon must be between 0 and 100.',0),
8002 => array('Anchor position for icons must be one of "top", "bottom", "left", "right" or "center"',0),
8003 => array('It is not possible to specify both an image file and a country flag for the same icon.',0),
8004 => array('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Value for image transformation out of bounds. Vanishing point on horizon must be specified as a value between 0 and 1.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('LinePlot::SetFilled() is deprecated. Use SetFillColor()',0),
10002 => array('Plot too complicated for fast line Stroke. Use standard Stroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
 
/*
** jpgraph_log
*/
 
11001 => array('Your data contains non-numeric values.',0),
11002 => array('Negative data values can not be used in a log scale.',0),
11003 => array('Your data contains non-numeric values.',0),
11004 => array('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.',0),
11005 => array('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.',0),
 
/*
** jpgraph_mgraph
*/
 
12001 => array("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.",0),
12002 => array('Incorrect file name for MGraph::SetBackgroundImage() : %s Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
12003 => array('Unknown file extension (%s) in MGraph::SetBackgroundImage() for filename: %s',2),
12004 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
12005 => array('Can\'t read background image: %s',1),
12006 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
12007 => array('Argument to MGraph::Add() is not a valid GD image handle.',0),
12008 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats.',0),
12009 => array('Your PHP installation does not support the chosen graphic format: %s',1),
12010 => array('Can\'t create or stream image to file %s Check that PHP has enough permission to write a file to the current directory.',1),
12011 => array('Can\'t create truecolor image. Check that you really have GD2 library installed.',0),
12012 => array('Can\'t create image. Check that you really have GD2 library installed.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.',0),
14002 => array('PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.',0),
14003 => array('Internal assertion failed. Pie3D::Pie3DSlice',0),
14004 => array('Slice start angle must be between 0 and 360 degrees.',0),
14005 => array('Pie3D Internal error: Trying to wrap twice when looking for start index',0,),
14006 => array('Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.',0),
14007 => array('Width for 3D Pie is 0. Specify a size > 0',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unknown theme: %s',1),
15002 => array('Argument to PiePlot::ExplodeSlice() must be an integer',0),
15003 => array('Argument to PiePlot::Explode() must be an array with integer distances.',0),
15004 => array('Slice start angle must be between 0 and 360 degrees.',0),
15005 => array('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.',0),
15006 => array('PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]',0),
15007 => array('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.',0),
15008 => array('PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not %d).',1),
15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0),
15010 => array('Sum of all data is 0 for Pie.',0),
15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Density for pattern must be between 1 and 100. (You tried %f)',1),
16002 => array('No positions specified for pattern.',0),
16003 => array('Unknown pattern specification (%d)',0),
16004 => array('Min value for plotband is larger than specified max value. Please correct.',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).',0),
17002 => array('Unknown alignment specified for X-axis title. (%s)',1),
//17003 => array('Set90AndMargin() is not supported for polar graphs.',0),
17004 => array('Unknown scale type for polar graph. Must be "lin" or "log"',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('Client side image maps not supported for RadarPlots.',0),
18002 => array('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.',0),
18003 => array('Illegal scale for radarplot (%s). Must be \'lin\' or \'log\'',1),
18004 => array('Radar Plot size must be between 0.1 and 1. (Your value=%f)',1),
18005 => array('RadarPlot Unsupported Tick density: %d',1),
18006 => array('Minimum data %f (Radar plots should only be used when all data points > 0)',1),
18007 => array('Number of titles does not match number of points in plot.',0),
18008 => array('Each radar plot must have the same number of data points.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Number of X and Y coordinates must be the same',0),
19002 => array('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.',0),
19003 => array('Bezier: Number of X and Y coordinates must be the same',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots must have equal number of X and Y points.',0),
20002 => array('Fieldplots must have an angle specified for each X and Y points.',0),
20003 => array('Scatterplot must have equal number of X and Y points.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Data values for Stock charts must contain an even multiple of %d data points.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('This marker "%s" does not exist in color with index: %d',2),
23002 => array('Mark color index too large for marker "%s"',1),
23003 => array('A filename must be specified if you set the mark type to MARK_IMG.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : No function specified. ',0),
24002 => array('FuncGenerator : Syntax error in function specification ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
24004 => array('ReadCSV2: Column count mismatch in %s line %d',2),
/*
** jpgraph
*/
 
25001 => array('This PHP installation is not configured with the GD library. Please recompile PHP with GD support to run JpGraph. (Neither function imagetypes() nor imagecreatefromstring() does exist)',0),
25002 => array('Your PHP installation does not seem to have the required GD library. Please see the PHP documentation on how to install and enable the GD library.',0),
25003 => array('General PHP error : At %s:%d : %s',3),
25004 => array('General PHP error : %s ',1),
25005 => array('Can\'t access PHP_SELF, PHP global variable. You can\'t run PHP from command line if you want to use the \'auto\' naming of cache or image files.',0),
25006 => array('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).',0),
25007 => array('You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use \'\' to indicate the default locale for this geographic region.',1),
25008 => array('Image width/height argument in Graph::Graph() must be numeric',0),
25009 => array('You must specify what scale to use with a call to Graph::SetScale()',0),
 
25010 => array('Graph::Add() You tried to add a null plot to the graph.',0),
25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0),
25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0),
25013 => array('You can only add standard plots to multiple Y-axis',0),
25014 => array('Graph::AddText() You tried to add a null text to the graph.',0),
25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0),
25016 => array('Graph::AddBand() You tried to add a null band to the graph.',0),
25017 => array('You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.',0),
25018 => array('Incorrect file name for Graph::SetBackgroundImage() : "%s" Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
25019 => array('Unknown file extension (%s) in Graph::SetBackgroundImage() for filename: "%s"',2),
 
25020 => array('Graph::SetScale(): Specified Max value must be larger than the specified Min value.',0),
25021 => array('Unknown scale specification for Y-scale. (%s)',1),
25022 => array('Unknown scale specification for X-scale. (%s)',1),
25023 => array('Unsupported Y2 axis type: "%s" Must be one of (lin,log,int)',1),
25024 => array('Unsupported Y axis type: "%s" Must be one of (lin,log,int)',1),
25025 => array('Unsupported Tick density: %d',1),
25026 => array('Can\'t draw unspecified Y-scale. You have either: 1. Specified an Y axis for auto scaling but have not supplied any plots. 2. Specified a scale manually but have forgot to specify the tick steps',0),
25027 => array('Can\'t open cached CSIM "%s" for reading.',1),
25028 => array('Apache/PHP does not have permission to write to the CSIM cache directory (%s). Check permissions.',1),
25029 => array('Can\'t write CSIM "%s" for writing. Check free space and permissions.',1),
 
25030 => array('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().',0),
25031 => array('You must specify what scale to use with a call to Graph::SetScale().',0),
25032 => array('No plots for Y-axis nbr:%d',1),
25033 => array('',0),
25034 => array('Can\'t draw unspecified X-scale. No plots specified.',0),
25035 => array('You have enabled clipping. Clipping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (=%d degrees) or disable clipping.',1),
25036 => array('Unknown AxisStyle() : %s',1),
25037 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
25038 => array('Background image seems to be of different type (has different file extension) than specified imagetype. Specified: %s File: %s',2),
25039 => array('Can\'t read background image: "%s"',1),
 
25040 => array('It is not possible to specify both a background image and a background country flag.',0),
25041 => array('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.',0),
25042 => array('Unknown background image layout',0),
25043 => array('Unknown title background style.',0),
25044 => array('Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).',0),
25045 => array('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/',0),
25046 => array('Specified TTF font family (id=%d) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/',1),
25047 => array('Style %s is not available for font family %s',2),
25048 => array('Unknown font style specification [%s].',1),
25049 => array('Font file "%s" is not readable or does not exist.',1),
 
25050 => array('First argument to Text::Text() must be a string.',0),
25051 => array('Invalid direction specified for text.',0),
25052 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text',0),
25053 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text',0),
25054 => array('Internal error: Unknown grid axis %s',1),
25055 => array('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead',0),
25056 => array('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.',0),
25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0),
25058 => array('Text label interval must be specified >= 1.',0),
25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0),
 
25060 => array('Unknown alignment specified for X-axis title. (%s)',1),
25061 => array('Unknown alignment specified for Y-axis title. (%s)',1),
25062 => array('Labels at an angle are not supported on Y-axis',0),
25063 => array('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead',0),
25064 => array('Minor or major step size is 0. Check that you haven\'t got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem',0),
25065 => array('Tick positions must be specified as an array()',0),
25066 => array('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.',0),
25067 => array('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.',0),
25068 => array('A plot has an illegal scale. This could for example be that you are trying to use text auto scaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only \'-\' or \'x\')',0),
25069 => array('Grace must be larger then 0',0),
25070 => array('Either X or Y data arrays contains non-numeric values. Check that the data is really specified as numeric data and not as strings. It is an error to specify data for example as \'-2345.2\' (using quotes).',0),
25071 => array('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.',0),
25072 => array('You have specified a max value with SetAutoMax() which is smaller than the minimum value used for the scale. This is not possible.',0),
25073 => array('Internal error. Integer scale algorithm comparison out of bound (r=%f)',1),
25074 => array('Internal error. The scale range is negative (%f) [for %s scale] This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the auto scaling to fail.',2),
25075 => array('Can\'t automatically determine ticks since min==max.',0),
25077 => array('Adjustment factor for color must be > 0',0),
25078 => array('Unknown color: %s',1),
25079 => array('Unknown color specification: %s, size=%d',2),
 
25080 => array('Alpha parameter for color must be between 0.0 and 1.0',0),
25081 => array('Selected graphic format is either not supported or unknown [%s]',1),
25082 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
25083 => array('Illegal image size when copying image. Size for copied to image is 1 pixel or less.',0),
25084 => array('Failed to create temporary GD canvas. Possible Out of memory problem.',0),
25085 => array('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.',0),
25086 => array('You only seem to have GD 1.x installed. To enable Alphablending requires GD 2.x or higher. Please install GD or make sure the constant USE_GD2 is specified correctly to reflect your installation. By default it tries to auto detect what version of GD you have installed. On some very rare occasions it may falsely detect GD2 where only GD1 is installed. You must then set USE_GD2 to false.',0),
25087 => array('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.',0),
25088 => array('You have a misconfigured GD font support. The call to imagefontwidth() fails.',0),
25089 => array('You have a misconfigured GD font support. The call to imagefontheight() fails.',0),
 
25090 => array('Unknown direction specified in call to StrokeBoxedText() [%s]',1),
25091 => array('Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.',0),
25092 => array('There is either a configuration problem with TrueType or a problem reading font file "%s" Make sure file exists and is in a readable place for the HTTP process. (If \'basedir\' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try upgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.',1),
25093 => array('Can not read font file "%s" in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.',1),
25094 => array('Direction for text most be given as an angle between 0 and 90.',0),
25095 => array('Unknown font font family specification. ',0),
25096 => array('Can\'t allocate any more colors in palette image. Image has already allocated maximum of %d colors and the palette is now full. Change to a truecolor image instead',0),
25097 => array('Color specified as empty string in PushColor().',0),
25098 => array('Negative Color stack index. Unmatched call to PopColor()',0),
25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0),
 
25100 => array('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.',0),
25101 => array('Illegal numeric argument to SetLineStyle(): (%d)',1),
25102 => array('Illegal string argument to SetLineStyle(): %s',1),
25103 => array('Illegal argument to SetLineStyle %s',1),
25104 => array('Unknown line style: %s',1),
25105 => array('NULL data specified for a filled polygon. Check that your data is not NULL.',0),
25106 => array('Image::FillToBorder : Can not allocate more colors',0),
25107 => array('Can\'t write to file "%s". Check that the process running PHP has enough permission.',1),
25108 => array('Can\'t stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.',0),
25109 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.',0),
 
25110 => array('Your PHP installation does not support the chosen graphic format: %s',1),
25111 => array('Can\'t delete cached image %s. Permission problem?',1),
25112 => array('Cached imagefile (%s) has file date in the future.',1),
25113 => array('Can\'t delete cached image "%s". Permission problem?',1),
25114 => array('PHP has not enough permissions to write to the cache file "%s". Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.',1),
25115 => array('Can\'t set permission for cached image "%s". Permission problem?',1),
25116 => array('Cant open file from cache "%s"',1),
25117 => array('Can\'t open cached image "%s" for reading.',1),
25118 => array('Can\'t create directory "%s". Make sure PHP has write permission to this directory.',1),
25119 => array('Can\'t set permissions for "%s". Permission problems?',1),
 
25120 => array('Position for legend must be given as percentage in range 0-1',0),
25121 => array('Empty input data array specified for plot. Must have at least one data point.',0),
25122 => array('Stroke() must be implemented by concrete subclass to class Plot',0),
25123 => array('You can\'t use a text X-scale with specified X-coords. Use a "int" or "lin" scale instead.',0),
25124 => array('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)',0),
25125 => array('Illegal direction for static line',0),
25126 => array('Can\'t create truecolor image. Check that the GD2 library is properly setup with PHP.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0),
25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0),
25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2),
 
25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0),
 
/*
** jpgraph_led
*/
 
25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0),
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0),
27002 => array('GTextTable: Invalid argument to Set()',0),
27003 => array('GTextTable: Wrong number of arguments to GTextTable::SetColor()',0),
27004 => array('GTextTable: Specified cell range to be merged is not valid.',0),
27005 => array('GTextTable: Cannot merge already merged cells in the range: (%d,%d) to (%d,%d)',4),
27006 => array('GTextTable: Column argument = %d is outside specified table size.',1),
27007 => array('GTextTable: Row argument = %d is outside specified table size.',1),
27008 => array('GTextTable: Column and row size arrays must match the dimensions of the table',0),
27009 => array('GTextTable: Number of table columns or rows are 0. Make sure Init() or Set() is called.',0),
27010 => array('GTextTable: No alignment specified in call to SetAlign()',0),
27011 => array('GTextTable: Unknown alignment specified in SetAlign(). Horizontal=%s, Vertical=%s',2),
27012 => array('GTextTable: Internal error. Invalid alignment specified =%s',1),
27013 => array('GTextTable: Argument to FormatNumber() must be a string.',0),
27014 => array('GTextTable: Table is not initilaized with either a call to Set() or Init()',0),
27015 => array('GTextTable: Cell image constrain type must be TIMG_WIDTH or TIMG_HEIGHT',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Total percentage for all windrose legs in a windrose plot can not exceed 100%% !\n(Current max is: %d)',1),
22002 => array('Graph is too small to have a scale. Please make the graph larger.',0),
22004 => array('Label specification for windrose directions must have 16 values (one for each compass direction).',0),
22005 => array('Line style for radial lines must be on of ("solid","dotted","dashed","longdashed") ',0),
22006 => array('Illegal windrose type specified.',0),
22007 => array('To few values for the range legend.',0),
22008 => array('Internal error: Trying to plot free Windrose even though type is not a free windrose',0),
22009 => array('You have specified the same direction twice, once with an angle and once with a compass direction (%f degrees)',0),
22010 => array('Direction must either be a numeric value or one of the 16 compass directions',0),
22011 => array('Windrose index must be numeric or direction label. You have specified index=%d',1),
22012 => array('Windrose radial axis specification contains a direction which is not enabled.',0),
22013 => array('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index=%d)',1),
22014 => array('Index for compass direction must be between 0 and 15.',0),
22015 => array('You have specified an undefined Windrose plot type.',0),
22016 => array('Windrose leg index must be numeric or direction label.',0),
22017 => array('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.',0),
22018 => array('You have specified data for the same compass direction twice, once with text and once with index (Index=%d)',1),
22019 => array('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.',0),
22020 => array('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
/*
** jpgraph_odometer
*/
 
13001 => array('Unknown needle style (%d).',1),
13002 => array('Value for odometer (%f) is outside specified scale [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unknown encoder specification: %s',1),
1002 => array('Data validation failed. Can\'t encode [%s] using encoding "%s"',2),
1003 => array('Internal encoding error. Trying to encode %s is not possible in Code 128',1),
1004 => array('Internal barcode error. Unknown UPC-E encoding type: %s',1),
1005 => array('Internal error. Can\'t encode character tuple (%s, %s) in Code-128 charset C',2),
1006 => array('Internal encoding error for CODE 128. Trying to encode control character in CHARSET != A',0),
1007 => array('Internal encoding error for CODE 128. Trying to encode DEL in CHARSET != B',0),
1008 => array('Internal encoding error for CODE 128. Trying to encode small letters in CHARSET != B',0),
1009 => array('Encoding using CODE 93 is not yet supported.',0),
1010 => array('Encoding using POSTNET is not yet supported.',0),
1011 => array('Non supported barcode backend for type %s',1),
 
/*
** PDF417
*/
26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0),
26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0),
26002 => array('PDF417: Error level must be between 0 and 8',0),
26003 => array('PDF417: Invalid format for input data to encode with PDF417',0),
26004 => array('PDF417: Can\'t encode given data with error level %d and %d columns since it results in too many symbols or more than 90 rows.',2),
26005 => array('PDF417: Can\'t open file "%s" for writing',1),
26006 => array('PDF417: Internal error. Data files for PDF417 cluster %d is corrupted.',1),
26007 => array('PDF417: Internal error. GetPattern: Illegal Code Value = %d (row=%d)',2),
26008 => array('PDF417: Internal error. Mode not found in mode list!! mode=%d',1),
26009 => array('PDF417: Encode error: Illegal character. Can\'t encode character with ASCII code=%d',1),
26010 => array('PDF417: Internal error: No input data in decode.',0),
26011 => array('PDF417: Encoding error. Can\'t use numeric encoding on non-numeric data.',0),
26012 => array('PDF417: Internal error. No input data to decode for Binary compressor.',0),
26013 => array('PDF417: Internal error. Checksum error. Coefficient tables corrupted.',0),
26014 => array('PDF417: Internal error. No data to calculate codewords on.',0),
26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1),
26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0),
 
/*
** jpgraph_contour
*/
 
28001 => array('Third argument to Contour must be an array of colors.',0),
28002 => array('Number of colors must equal the number of isobar lines specified',0),
28003 => array('ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)',1),
28004 => array('ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)',1),
28005 => array('ContourPlot Internal Error: isobarVCrossing: Row index too large (%d)',1),
28006 => array('ContourPlot Internal Error: isobarVCrossing: Col index too large (%d)',1),
28007 => array('ContourPlot interpolation factor is too large (>5)',0),
 
/*
* jpgraph_matrix and colormap
*/
29201 => array('Min range value must be less or equal to max range value for colormaps',0),
29202 => array('The distance between min and max value is too small for numerical precision',0),
29203 => array('Number of color quantification level must be at least %d',1),
29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3),
29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1),
29206 => array('Invalid object added to MatrixGraph',0),
29207 => array('Empty input data specified for MatrixPlot',0),
29208 => array('Unknown side specifiction for matrix labels "%s"',1),
29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4),
29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2),
 
);
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/lang/prod.inc.php
New file
0,0 → 1,383
<?php
/*=======================================================================
// File: PROD.INC.PHP
// Description: Special localization file with the same error messages
// for all errors.
// Created: 2006-02-18
// Ver: $Id: prod.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// The single error message for all errors
DEFINE('DEFAULT_ERROR_MESSAGE','We are sorry but the system could not generate the requested image. Please contact site support to resolve this problem. Problem no: #');
 
// Note: Format of each error message is array(<error message>,<number of arguments>)
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border=1><tr><td><font color=darkred size=4><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</font></td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
 
11 => array(DEFAULT_ERROR_MESSAGE.'11',0),
12 => array(DEFAULT_ERROR_MESSAGE.'12',0),
13 => array(DEFAULT_ERROR_MESSAGE.'13',0),
2001 => array(DEFAULT_ERROR_MESSAGE.'2001',0),
2002 => array(DEFAULT_ERROR_MESSAGE.'2002',0),
2003 => array(DEFAULT_ERROR_MESSAGE.'2003',0),
2004 => array(DEFAULT_ERROR_MESSAGE.'2004',0),
2005 => array(DEFAULT_ERROR_MESSAGE.'2005',0),
2006 => array(DEFAULT_ERROR_MESSAGE.'2006',0),
2007 => array(DEFAULT_ERROR_MESSAGE.'2007',0),
2008 => array(DEFAULT_ERROR_MESSAGE.'2008',0),
2009 => array(DEFAULT_ERROR_MESSAGE.'2009',0),
2010 => array(DEFAULT_ERROR_MESSAGE.'2010',0),
2011 => array(DEFAULT_ERROR_MESSAGE.'2011',0),
2012 => array(DEFAULT_ERROR_MESSAGE.'2012',0),
2013 => array(DEFAULT_ERROR_MESSAGE.'2013',0),
2014 => array(DEFAULT_ERROR_MESSAGE.'2014',0),
3001 => array(DEFAULT_ERROR_MESSAGE.'3001',0),
4002 => array(DEFAULT_ERROR_MESSAGE.'4002',0),
5001 => array(DEFAULT_ERROR_MESSAGE.'5001',0),
5002 => array(DEFAULT_ERROR_MESSAGE.'5002',0),
5003 => array(DEFAULT_ERROR_MESSAGE.'5003',0),
5004 => array(DEFAULT_ERROR_MESSAGE.'5004',0),
6001 => array(DEFAULT_ERROR_MESSAGE.'6001',0),
6002 => array(DEFAULT_ERROR_MESSAGE.'6002',0),
6003 => array(DEFAULT_ERROR_MESSAGE.'6003',0),
6004 => array(DEFAULT_ERROR_MESSAGE.'6004',0),
6005 => array(DEFAULT_ERROR_MESSAGE.'6005',0),
6006 => array(DEFAULT_ERROR_MESSAGE.'6006',0),
6007 => array(DEFAULT_ERROR_MESSAGE.'6007',0),
6008 => array(DEFAULT_ERROR_MESSAGE.'6008',0),
6009 => array(DEFAULT_ERROR_MESSAGE.'6009',0),
6010 => array(DEFAULT_ERROR_MESSAGE.'6010',0),
6011 => array(DEFAULT_ERROR_MESSAGE.'6011',0),
6012 => array(DEFAULT_ERROR_MESSAGE.'6012',0),
6015 => array(DEFAULT_ERROR_MESSAGE.'6015',0),
6016 => array(DEFAULT_ERROR_MESSAGE.'6016',0),
6017 => array(DEFAULT_ERROR_MESSAGE.'6017',0),
6018 => array(DEFAULT_ERROR_MESSAGE.'6018',0),
6019 => array(DEFAULT_ERROR_MESSAGE.'6019',0),
6020 => array(DEFAULT_ERROR_MESSAGE.'6020',0),
6021 => array(DEFAULT_ERROR_MESSAGE.'6021',0),
6022 => array(DEFAULT_ERROR_MESSAGE.'6022',0),
6023 => array(DEFAULT_ERROR_MESSAGE.'6023',0),
6024 => array(DEFAULT_ERROR_MESSAGE.'6024',0),
6025 => array(DEFAULT_ERROR_MESSAGE.'6025',0),
6027 => array(DEFAULT_ERROR_MESSAGE.'6027',0),
6028 => array(DEFAULT_ERROR_MESSAGE.'6028',0),
6029 => array(DEFAULT_ERROR_MESSAGE.'6029',0),
6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0),
6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0),
6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0),
6033 => array(DEFAULT_ERROR_MESSAGE.'6033',0),
7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0),
8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0),
8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0),
8003 => array(DEFAULT_ERROR_MESSAGE.'8003',0),
8004 => array(DEFAULT_ERROR_MESSAGE.'8004',0),
9001 => array(DEFAULT_ERROR_MESSAGE.'9001',0),
10001 => array(DEFAULT_ERROR_MESSAGE.'10001',0),
10002 => array(DEFAULT_ERROR_MESSAGE.'10002',0),
10003 => array(DEFAULT_ERROR_MESSAGE.'10003',0),
11001 => array(DEFAULT_ERROR_MESSAGE.'11001',0),
11002 => array(DEFAULT_ERROR_MESSAGE.'11002',0),
11003 => array(DEFAULT_ERROR_MESSAGE.'11003',0),
11004 => array(DEFAULT_ERROR_MESSAGE.'11004',0),
11005 => array(DEFAULT_ERROR_MESSAGE.'11005',0),
12001 => array(DEFAULT_ERROR_MESSAGE.'12001',0),
12002 => array(DEFAULT_ERROR_MESSAGE.'12002',0),
12003 => array(DEFAULT_ERROR_MESSAGE.'12003',0),
12004 => array(DEFAULT_ERROR_MESSAGE.'12004',0),
12005 => array(DEFAULT_ERROR_MESSAGE.'12005',0),
12006 => array(DEFAULT_ERROR_MESSAGE.'12006',0),
12007 => array(DEFAULT_ERROR_MESSAGE.'12007',0),
12008 => array(DEFAULT_ERROR_MESSAGE.'12008',0),
12009 => array(DEFAULT_ERROR_MESSAGE.'12009',0),
12010 => array(DEFAULT_ERROR_MESSAGE.'12010',0),
12011 => array(DEFAULT_ERROR_MESSAGE.'12011',0),
12012 => array(DEFAULT_ERROR_MESSAGE.'12012',0),
14001 => array(DEFAULT_ERROR_MESSAGE.'14001',0),
14002 => array(DEFAULT_ERROR_MESSAGE.'14002',0),
14003 => array(DEFAULT_ERROR_MESSAGE.'14003',0),
14004 => array(DEFAULT_ERROR_MESSAGE.'14004',0),
14005 => array(DEFAULT_ERROR_MESSAGE.'14005',0),
14006 => array(DEFAULT_ERROR_MESSAGE.'14006',0),
14007 => array(DEFAULT_ERROR_MESSAGE.'14007',0),
15001 => array(DEFAULT_ERROR_MESSAGE.'15001',0),
15002 => array(DEFAULT_ERROR_MESSAGE.'15002',0),
15003 => array(DEFAULT_ERROR_MESSAGE.'15003',0),
15004 => array(DEFAULT_ERROR_MESSAGE.'15004',0),
15005 => array(DEFAULT_ERROR_MESSAGE.'15005',0),
15006 => array(DEFAULT_ERROR_MESSAGE.'15006',0),
15007 => array(DEFAULT_ERROR_MESSAGE.'15007',0),
15008 => array(DEFAULT_ERROR_MESSAGE.'15008',0),
15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0),
15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0),
15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0),
16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0),
16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0),
16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0),
16004 => array(DEFAULT_ERROR_MESSAGE.'16004',0),
17001 => array(DEFAULT_ERROR_MESSAGE.'17001',0),
17002 => array(DEFAULT_ERROR_MESSAGE.'17002',0),
17004 => array(DEFAULT_ERROR_MESSAGE.'17004',0),
18001 => array(DEFAULT_ERROR_MESSAGE.'18001',0),
18002 => array(DEFAULT_ERROR_MESSAGE.'18002',0),
18003 => array(DEFAULT_ERROR_MESSAGE.'18003',0),
18004 => array(DEFAULT_ERROR_MESSAGE.'18004',0),
18005 => array(DEFAULT_ERROR_MESSAGE.'18005',0),
18006 => array(DEFAULT_ERROR_MESSAGE.'18006',0),
18007 => array(DEFAULT_ERROR_MESSAGE.'18007',0),
18008 => array(DEFAULT_ERROR_MESSAGE.'18008',0),
19001 => array(DEFAULT_ERROR_MESSAGE.'19001',0),
19002 => array(DEFAULT_ERROR_MESSAGE.'19002',0),
19003 => array(DEFAULT_ERROR_MESSAGE.'19003',0),
20001 => array(DEFAULT_ERROR_MESSAGE.'20001',0),
20002 => array(DEFAULT_ERROR_MESSAGE.'20002',0),
20003 => array(DEFAULT_ERROR_MESSAGE.'20003',0),
21001 => array(DEFAULT_ERROR_MESSAGE.'21001',0),
23001 => array(DEFAULT_ERROR_MESSAGE.'23001',0),
23002 => array(DEFAULT_ERROR_MESSAGE.'23002',0),
23003 => array(DEFAULT_ERROR_MESSAGE.'23003',0),
24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0),
24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0),
25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0),
25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0),
25004 => array(DEFAULT_ERROR_MESSAGE.'25004',0),
25005 => array(DEFAULT_ERROR_MESSAGE.'25005',0),
25006 => array(DEFAULT_ERROR_MESSAGE.'25006',0),
25007 => array(DEFAULT_ERROR_MESSAGE.'25007',0),
25008 => array(DEFAULT_ERROR_MESSAGE.'25008',0),
25009 => array(DEFAULT_ERROR_MESSAGE.'25009',0),
25010 => array(DEFAULT_ERROR_MESSAGE.'25010',0),
25011 => array(DEFAULT_ERROR_MESSAGE.'25011',0),
25012 => array(DEFAULT_ERROR_MESSAGE.'25012',0),
25013 => array(DEFAULT_ERROR_MESSAGE.'25013',0),
25014 => array(DEFAULT_ERROR_MESSAGE.'25014',0),
25015 => array(DEFAULT_ERROR_MESSAGE.'25015',0),
25016 => array(DEFAULT_ERROR_MESSAGE.'25016',0),
25017 => array(DEFAULT_ERROR_MESSAGE.'25017',0),
25018 => array(DEFAULT_ERROR_MESSAGE.'25018',0),
25019 => array(DEFAULT_ERROR_MESSAGE.'25019',0),
25020 => array(DEFAULT_ERROR_MESSAGE.'25020',0),
25021 => array(DEFAULT_ERROR_MESSAGE.'25021',0),
25022 => array(DEFAULT_ERROR_MESSAGE.'25022',0),
25023 => array(DEFAULT_ERROR_MESSAGE.'25023',0),
25024 => array(DEFAULT_ERROR_MESSAGE.'25024',0),
25025 => array(DEFAULT_ERROR_MESSAGE.'25025',0),
25026 => array(DEFAULT_ERROR_MESSAGE.'25026',0),
25027 => array(DEFAULT_ERROR_MESSAGE.'25027',0),
25028 => array(DEFAULT_ERROR_MESSAGE.'25028',0),
25029 => array(DEFAULT_ERROR_MESSAGE.'25029',0),
25030 => array(DEFAULT_ERROR_MESSAGE.'25030',0),
25031 => array(DEFAULT_ERROR_MESSAGE.'25031',0),
25032 => array(DEFAULT_ERROR_MESSAGE.'25032',0),
25033 => array(DEFAULT_ERROR_MESSAGE.'25033',0),
25034 => array(DEFAULT_ERROR_MESSAGE.'25034',0),
25035 => array(DEFAULT_ERROR_MESSAGE.'25035',0),
25036 => array(DEFAULT_ERROR_MESSAGE.'25036',0),
25037 => array(DEFAULT_ERROR_MESSAGE.'25037',0),
25038 => array(DEFAULT_ERROR_MESSAGE.'25038',0),
25039 => array(DEFAULT_ERROR_MESSAGE.'25039',0),
25040 => array(DEFAULT_ERROR_MESSAGE.'25040',0),
25041 => array(DEFAULT_ERROR_MESSAGE.'25041',0),
25042 => array(DEFAULT_ERROR_MESSAGE.'25042',0),
25043 => array(DEFAULT_ERROR_MESSAGE.'25043',0),
25044 => array(DEFAULT_ERROR_MESSAGE.'25044',0),
25045 => array(DEFAULT_ERROR_MESSAGE.'25045',0),
25046 => array(DEFAULT_ERROR_MESSAGE.'25046',0),
25047 => array(DEFAULT_ERROR_MESSAGE.'25047',0),
25048 => array(DEFAULT_ERROR_MESSAGE.'25048',0),
25049 => array(DEFAULT_ERROR_MESSAGE.'25049',0),
25050 => array(DEFAULT_ERROR_MESSAGE.'25050',0),
25051 => array(DEFAULT_ERROR_MESSAGE.'25051',0),
25052 => array(DEFAULT_ERROR_MESSAGE.'25052',0),
25053 => array(DEFAULT_ERROR_MESSAGE.'25053',0),
25054 => array(DEFAULT_ERROR_MESSAGE.'25054',0),
25055 => array(DEFAULT_ERROR_MESSAGE.'25055',0),
25056 => array(DEFAULT_ERROR_MESSAGE.'25056',0),
25057 => array(DEFAULT_ERROR_MESSAGE.'25057',0),
25058 => array(DEFAULT_ERROR_MESSAGE.'25058',0),
25059 => array(DEFAULT_ERROR_MESSAGE.'25059',0),
25060 => array(DEFAULT_ERROR_MESSAGE.'25060',0),
25061 => array(DEFAULT_ERROR_MESSAGE.'25061',0),
25062 => array(DEFAULT_ERROR_MESSAGE.'25062',0),
25063 => array(DEFAULT_ERROR_MESSAGE.'25063',0),
25064 => array(DEFAULT_ERROR_MESSAGE.'25064',0),
25065 => array(DEFAULT_ERROR_MESSAGE.'25065',0),
25066 => array(DEFAULT_ERROR_MESSAGE.'25066',0),
25067 => array(DEFAULT_ERROR_MESSAGE.'25067',0),
25068 => array(DEFAULT_ERROR_MESSAGE.'25068',0),
25069 => array(DEFAULT_ERROR_MESSAGE.'25069',0),
25070 => array(DEFAULT_ERROR_MESSAGE.'25070',0),
25071 => array(DEFAULT_ERROR_MESSAGE.'25071',0),
25072 => array(DEFAULT_ERROR_MESSAGE.'25072',0),
25073 => array(DEFAULT_ERROR_MESSAGE.'25073',0),
25074 => array(DEFAULT_ERROR_MESSAGE.'25074',0),
25075 => array(DEFAULT_ERROR_MESSAGE.'25075',0),
25077 => array(DEFAULT_ERROR_MESSAGE.'25077',0),
25078 => array(DEFAULT_ERROR_MESSAGE.'25078',0),
25079 => array(DEFAULT_ERROR_MESSAGE.'25079',0),
25080 => array(DEFAULT_ERROR_MESSAGE.'25080',0),
25081 => array(DEFAULT_ERROR_MESSAGE.'25081',0),
25082 => array(DEFAULT_ERROR_MESSAGE.'25082',0),
25083 => array(DEFAULT_ERROR_MESSAGE.'25083',0),
25084 => array(DEFAULT_ERROR_MESSAGE.'25084',0),
25085 => array(DEFAULT_ERROR_MESSAGE.'25085',0),
25086 => array(DEFAULT_ERROR_MESSAGE.'25086',0),
25087 => array(DEFAULT_ERROR_MESSAGE.'25087',0),
25088 => array(DEFAULT_ERROR_MESSAGE.'25088',0),
25089 => array(DEFAULT_ERROR_MESSAGE.'25089',0),
25090 => array(DEFAULT_ERROR_MESSAGE.'25090',0),
25091 => array(DEFAULT_ERROR_MESSAGE.'25091',0),
25092 => array(DEFAULT_ERROR_MESSAGE.'25092',0),
25093 => array(DEFAULT_ERROR_MESSAGE.'25093',0),
25094 => array(DEFAULT_ERROR_MESSAGE.'25094',0),
25095 => array(DEFAULT_ERROR_MESSAGE.'25095',0),
25096 => array(DEFAULT_ERROR_MESSAGE.'25096',0),
25097 => array(DEFAULT_ERROR_MESSAGE.'25097',0),
25098 => array(DEFAULT_ERROR_MESSAGE.'25098',0),
25099 => array(DEFAULT_ERROR_MESSAGE.'25099',0),
25100 => array(DEFAULT_ERROR_MESSAGE.'25100',0),
25101 => array(DEFAULT_ERROR_MESSAGE.'25101',0),
25102 => array(DEFAULT_ERROR_MESSAGE.'25102',0),
25103 => array(DEFAULT_ERROR_MESSAGE.'25103',0),
25104 => array(DEFAULT_ERROR_MESSAGE.'25104',0),
25105 => array(DEFAULT_ERROR_MESSAGE.'25105',0),
25106 => array(DEFAULT_ERROR_MESSAGE.'25106',0),
25107 => array(DEFAULT_ERROR_MESSAGE.'25107',0),
25108 => array(DEFAULT_ERROR_MESSAGE.'25108',0),
25109 => array(DEFAULT_ERROR_MESSAGE.'25109',0),
25110 => array(DEFAULT_ERROR_MESSAGE.'25110',0),
25111 => array(DEFAULT_ERROR_MESSAGE.'25111',0),
25112 => array(DEFAULT_ERROR_MESSAGE.'25112',0),
25113 => array(DEFAULT_ERROR_MESSAGE.'25113',0),
25114 => array(DEFAULT_ERROR_MESSAGE.'25114',0),
25115 => array(DEFAULT_ERROR_MESSAGE.'25115',0),
25116 => array(DEFAULT_ERROR_MESSAGE.'25116',0),
25117 => array(DEFAULT_ERROR_MESSAGE.'25117',0),
25118 => array(DEFAULT_ERROR_MESSAGE.'25118',0),
25119 => array(DEFAULT_ERROR_MESSAGE.'25119',0),
25120 => array(DEFAULT_ERROR_MESSAGE.'25120',0),
25121 => array(DEFAULT_ERROR_MESSAGE.'25121',0),
25122 => array(DEFAULT_ERROR_MESSAGE.'25122',0),
25123 => array(DEFAULT_ERROR_MESSAGE.'25123',0),
25124 => array(DEFAULT_ERROR_MESSAGE.'25124',0),
25125 => array(DEFAULT_ERROR_MESSAGE.'25125',0),
25126 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
25127 => array(DEFAULT_ERROR_MESSAGE.'25127',0),
25128 => array(DEFAULT_ERROR_MESSAGE.'25128',0),
25129 => array(DEFAULT_ERROR_MESSAGE.'25129',0),
25130 => array(DEFAULT_ERROR_MESSAGE.'25130',0),
25131 => array(DEFAULT_ERROR_MESSAGE.'25131',0),
25500 => array(DEFAULT_ERROR_MESSAGE.'25500',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0),
24006 => array(DEFAULT_ERROR_MESSAGE.'24006',0),
24007 => array(DEFAULT_ERROR_MESSAGE.'24007',0),
24008 => array(DEFAULT_ERROR_MESSAGE.'24008',0),
24009 => array(DEFAULT_ERROR_MESSAGE.'24009',0),
24010 => array(DEFAULT_ERROR_MESSAGE.'24010',0),
24011 => array(DEFAULT_ERROR_MESSAGE.'24011',0),
24012 => array(DEFAULT_ERROR_MESSAGE.'24012',0),
24013 => array(DEFAULT_ERROR_MESSAGE.'24013',0),
24014 => array(DEFAULT_ERROR_MESSAGE.'24014',0),
24015 => array(DEFAULT_ERROR_MESSAGE.'24015',0),
22001 => array(DEFAULT_ERROR_MESSAGE.'22001',0),
22002 => array(DEFAULT_ERROR_MESSAGE.'22002',0),
22004 => array(DEFAULT_ERROR_MESSAGE.'22004',0),
22005 => array(DEFAULT_ERROR_MESSAGE.'22005',0),
22006 => array(DEFAULT_ERROR_MESSAGE.'22006',0),
22007 => array(DEFAULT_ERROR_MESSAGE.'22007',0),
22008 => array(DEFAULT_ERROR_MESSAGE.'22008',0),
22009 => array(DEFAULT_ERROR_MESSAGE.'22009',0),
22010 => array(DEFAULT_ERROR_MESSAGE.'22010',0),
22011 => array(DEFAULT_ERROR_MESSAGE.'22011',0),
22012 => array(DEFAULT_ERROR_MESSAGE.'22012',0),
22013 => array(DEFAULT_ERROR_MESSAGE.'22013',0),
22014 => array(DEFAULT_ERROR_MESSAGE.'22014',0),
22015 => array(DEFAULT_ERROR_MESSAGE.'22015',0),
22016 => array(DEFAULT_ERROR_MESSAGE.'22016',0),
22017 => array(DEFAULT_ERROR_MESSAGE.'22017',0),
22018 => array(DEFAULT_ERROR_MESSAGE.'22018',0),
22019 => array(DEFAULT_ERROR_MESSAGE.'22019',0),
22020 => array(DEFAULT_ERROR_MESSAGE.'22020',0),
13001 => array(DEFAULT_ERROR_MESSAGE.'13001',0),
13002 => array(DEFAULT_ERROR_MESSAGE.'13002',0),
1001 => array(DEFAULT_ERROR_MESSAGE.'1001',0),
1002 => array(DEFAULT_ERROR_MESSAGE.'1002',0),
1003 => array(DEFAULT_ERROR_MESSAGE.'1003',0),
1004 => array(DEFAULT_ERROR_MESSAGE.'1004',0),
1005 => array(DEFAULT_ERROR_MESSAGE.'1005',0),
1006 => array(DEFAULT_ERROR_MESSAGE.'1006',0),
1007 => array(DEFAULT_ERROR_MESSAGE.'1007',0),
1008 => array(DEFAULT_ERROR_MESSAGE.'1008',0),
1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0),
1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0),
1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0),
26000 => array(DEFAULT_ERROR_MESSAGE.'26000',0),
26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0),
26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0),
26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0),
26004 => array(DEFAULT_ERROR_MESSAGE.'26004',0),
26005 => array(DEFAULT_ERROR_MESSAGE.'26005',0),
26006 => array(DEFAULT_ERROR_MESSAGE.'26006',0),
26007 => array(DEFAULT_ERROR_MESSAGE.'26007',0),
26008 => array(DEFAULT_ERROR_MESSAGE.'26008',0),
26009 => array(DEFAULT_ERROR_MESSAGE.'26009',0),
26010 => array(DEFAULT_ERROR_MESSAGE.'26010',0),
26011 => array(DEFAULT_ERROR_MESSAGE.'26011',0),
26012 => array(DEFAULT_ERROR_MESSAGE.'26012',0),
26013 => array(DEFAULT_ERROR_MESSAGE.'26013',0),
26014 => array(DEFAULT_ERROR_MESSAGE.'26014',0),
26015 => array(DEFAULT_ERROR_MESSAGE.'26015',0),
26016 => array(DEFAULT_ERROR_MESSAGE.'26016',0),
 
27001 => array(DEFAULT_ERROR_MESSAGE.'27001',0),
27002 => array(DEFAULT_ERROR_MESSAGE.'27002',0),
27003 => array(DEFAULT_ERROR_MESSAGE.'27003',0),
27004 => array(DEFAULT_ERROR_MESSAGE.'27004',0),
27005 => array(DEFAULT_ERROR_MESSAGE.'27005',0),
27006 => array(DEFAULT_ERROR_MESSAGE.'27006',0),
27007 => array(DEFAULT_ERROR_MESSAGE.'27007',0),
27008 => array(DEFAULT_ERROR_MESSAGE.'27008',0),
27009 => array(DEFAULT_ERROR_MESSAGE.'27009',0),
27010 => array(DEFAULT_ERROR_MESSAGE.'27010',0),
27011 => array(DEFAULT_ERROR_MESSAGE.'27011',0),
27012 => array(DEFAULT_ERROR_MESSAGE.'27012',0),
27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0),
27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0),
27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0),
 
28001 => array(DEFAULT_ERROR_MESSAGE.'28001',0),
28002 => array(DEFAULT_ERROR_MESSAGE.'28002',0),
28003 => array(DEFAULT_ERROR_MESSAGE.'28003',0),
28004 => array(DEFAULT_ERROR_MESSAGE.'28004',0),
28005 => array(DEFAULT_ERROR_MESSAGE.'28005',0),
28006 => array(DEFAULT_ERROR_MESSAGE.'28006',0),
28007 => array(DEFAULT_ERROR_MESSAGE.'28007',0),
 
29201 => array(DEFAULT_ERROR_MESSAGE.'28001',0),
29202 => array(DEFAULT_ERROR_MESSAGE.'28002',0),
29203 => array(DEFAULT_ERROR_MESSAGE.'28003',0),
29204 => array(DEFAULT_ERROR_MESSAGE.'28004',0),
29205 => array(DEFAULT_ERROR_MESSAGE.'28005',0),
29206 => array(DEFAULT_ERROR_MESSAGE.'28006',0),
29207 => array(DEFAULT_ERROR_MESSAGE.'28007',0),
29208 => array(DEFAULT_ERROR_MESSAGE.'28008',0),
29209 => array(DEFAULT_ERROR_MESSAGE.'28009',0),
29210 => array(DEFAULT_ERROR_MESSAGE.'28010',0),
 
);
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/lang/de.inc.php
New file
0,0 → 1,542
<?php
/*=======================================================================
// File: DE.INC.PHP
// Description: German language file for error messages
// Created: 2006-03-06
// Author: Timo Leopold (timo@leopold-hh.de)
// Johan Persson (ljp@localhost.nil)
// Ver: $Id: de.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c)
//========================================================================
*/
 
// Notiz: Das Format fuer jede Fehlermeldung ist array(<Fehlermeldung>,<Anzahl der Argumente>)
$_jpg_messages = array(
 
/*
** Headers wurden bereits gesendet - Fehler. Dies wird als HTML formatiert, weil es direkt als text zurueckgesendet wird
*/
10 => array('<table border="1"><tr><td style="color:darkred;font-size:1.2em;"><b>JpGraph Fehler:</b>
HTTP header wurden bereits gesendet.<br>Fehler in der Datei <b>%s</b> in der Zeile <b>%d</b>.</td></tr><tr><td><b>Erklärung:</b><br>HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).<p>Wahrscheinlich steht Text im Skript bevor <i>Graph::Stroke()</i> aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden. <p>Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor <i>Graph::Stroke()</i> zu lassen."<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup Fehler
*/
11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0),
12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
 
/*
** jpgraph_bar
*/
 
2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0),
2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0),
2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2),
2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2),
2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2006 => array('Unbekannte Position für die Werte der Balken: %s.',1),
2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0),
2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1),
2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1),
2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1),
2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0),
2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Fehler bei den Eingabedaten von LineErrorPlot. Die Anzahl der Datenpunkte mus ein Mehrfaches von drei sein!',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unbekannte Flaggen-Größe (%d).',1),
5002 => array('Der Flaggen-Index %s existiert nicht.',1),
5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1),
5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0),
6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0),
6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1),
6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1),
6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0),
6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0),
6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2),
6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2),
6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2),
6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1),
6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0),
6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0),
6015 => array('Ungültige vertikale Position %d',1),
6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1),
6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1),
6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1),
6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1),
6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1),
6021 => array('Unbekanntes Format für die Woche.',0),
6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0),
6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0),
6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1),
6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1),
6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0),
6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1),
6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0),
6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0),
6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0),
6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1),
6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unbekannter Gradiententyp (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0),
8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0),
8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0),
8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0),
10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
/*
** jpgraph_log
*/
 
11001 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0),
11003 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0),
11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0),
 
/*
** jpgraph_mgraph
*/
 
12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0),
12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1),
12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2),
12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1),
12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2),
12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0),
12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0),
12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1),
12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1),
12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0),
14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0),
14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0),
14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,),
14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0),
14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1),
15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0),
15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0),
15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0),
15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0),
15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0),
15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1),
15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0),
15010 => array('Die Summe aller Daten ist Null.',0),
15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1),
16002 => array('Es wurde keine Position für das Pattern angegeben.',0),
16003 => array('Unbekannte Pattern-Definition (%d)',0),
16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0),
17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1),
//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0),
17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0),
18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0),
18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1),
18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1),
18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1),
18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1),
18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0),
18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0),
19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0),
20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0),
20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2),
23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1),
23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : Keine Funktion definiert. ',0),
24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
24004 => array('ReadCSV2: Die anzahl der spalten fehler in %s reihe %d',2),
/*
** jpgraph
*/
 
25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0),
25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0),
25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3),
25004 => array('Genereller PHP Fehler : %s ',1),
25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0),
25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0),
25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1),
25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0),
25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0),
 
25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0),
25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0),
25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0),
25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0),
25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0),
25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1),
25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2),
 
25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0),
25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1),
25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1),
25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25025 => array('Nicht unterstützte Tick-Dichte: %d',1),
25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0),
25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1),
25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1),
25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1),
 
25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0),
25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0),
25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1),
25033 => array('',0),
25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0),
25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1),
25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1),
25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2),
25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1),
 
25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0),
25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0),
25042 => array('Unbekanntes Hintergrundbild-Layout',0),
25043 => array('Unbekannter Titelhintergrund-Stil.',0),
25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0),
25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0),
25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1),
25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2),
25048 => array('Unbekannte Schriftstildefinition [%s].',1),
25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1),
 
25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0),
25051 => array('Ungültige Richtung angegeben für Text.',0),
25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0),
25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0),
25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1),
25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0),
25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0),
25057 => array('SetTextTicks() sollte nicht mehr verwendet werden. Benutze stattdessen SetTextTickInterval().',0),
25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0),
25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0),
 
25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1),
25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1),
25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0),
25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0),
25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0),
25065 => array('Tick-Positionen müssen als array() angegeben werden',0),
25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0),
25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0),
25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0),
25069 => array('Grace muss größer sein als 0',0),
 
25070 => array('Deine Daten enthalten nicht-numerische Werte.',0),
25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0),
25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0),
25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1),
25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2),
25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0),
25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0),
25078 => array('Unbekannte Farbe: %s',1),
25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2),
 
25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0),
25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1),
25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2),
25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0),
25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0),
25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0),
25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0),
25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0),
25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0),
25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0),
 
25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1),
25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0),
25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1),
25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1),
25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0),
25095 => array('Unbekannte Schriftfamilien-Definition. ',0),
25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0),
25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0),
25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0),
25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0),
 
25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0),
25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1),
25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1),
25103 => array('Ungültiges Argument für SetLineStyle %s',1),
25104 => array('Unbekannter Linientyp: %s',1),
25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0),
25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0),
25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1),
25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0),
25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0),
 
25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1),
25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1),
25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1),
25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1),
25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1),
25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1),
25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1),
25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1),
 
25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0),
25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0),
25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0),
25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0),
25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0),
25125 => array('Ungültige Richtung für statische Linie.',0),
25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0),
25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0),
25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2),
 
25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0),
 
/*
** jpgraph_led
*/
 
25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0),
 
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0),
27002 => array('GTextTable: Ungültiges Argument für Set()',0),
27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0),
27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0),
27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4),
27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0),
27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0),
27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0),
27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2),
27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1),
27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0),
27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0),
27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1),
22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0),
22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0),
22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0),
22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0),
22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0),
22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0),
22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0),
22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0),
22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1),
22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0),
22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0),
22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0),
22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0),
22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0),
22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0),
22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
 
/*
** jpgraph_odometer
*/
 
13001 => array('Unbekannter Nadeltypstil (%d).',1),
13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unbekannte Kodier-Specifikation: %s',1),
1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2),
1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1),
1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1),
1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2),
1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0),
1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0),
1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0),
1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0),
1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0),
1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1),
 
/*
** PDF417
*/
 
26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0),
26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0),
26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0),
26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0),
26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2),
26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1),
26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1),
26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2),
26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1),
26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1),
26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0),
26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0),
26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0),
26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0),
26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0),
26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1),
26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0),
 
 
/*
** jpgraph_contour
*/
 
28001 => array('Dritten parameter fur Contour muss ein vector der fargen sind.',0),
28002 => array('Die anzahlen der farges jeder isobar linien muss gleich sein.',0),
28003 => array('ContourPlot Interner Fehler: isobarHCrossing: Spalten index ist zu hoch (%d)',1),
28004 => array('ContourPlot Interner Fehler: isobarHCrossing: Reihe index ist zu hoch (%d)',1),
28005 => array('ContourPlot Interner Fehler: isobarVCrossing: Reihe index ist zu hoch (%d)',1),
28006 => array('ContourPlot Interner Fehler: isobarVCrossing: Spalten index ist zu hoch (%d)',1),
28007 => array('ContourPlot. Interpolation faktor ist zu hoch (>5)',0),
 
 
/*
* jpgraph_matrix and colormap
*/
29201 => array('Min range value must be less or equal to max range value for colormaps',0),
29202 => array('The distance between min and max value is too small for numerical precision',0),
29203 => array('Number of color quantification level must be at least %d',1),
29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3),
29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1),
29206 => array('Invalid object added to MatrixGraph',0),
29207 => array('Empty input data specified for MatrixPlot',0),
29208 => array('Unknown side specifiction for matrix labels "%s"',1),
29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4),
29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2),
 
);
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_diamonds.inc.php
New file
0,0 → 1,177
<?php
//=======================================================================
// File: IMGDATA_DIAMONDS.INC
// Description: Base64 encoded images for diamonds
// Created: 2003-03-20
// Ver: $Id: imgdata_diamonds.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Diamonds extends ImgData {
protected $name = 'Diamonds';
protected $an = array(MARK_IMG_DIAMOND =>'imgdata');
protected $colors = array('lightblue','darkblue','gray',
'blue','pink','purple','red','yellow');
protected $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6,
'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3);
 
protected $maxidx = 7 ;
protected $imgdata ;
 
function __construct() {
//==========================================================
// File: diam_red.png
//==========================================================
$this->imgdata[0][0]= 668 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'.
'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'.
'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'.
'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'.
'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'.
'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'.
'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'.
'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'.
'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'.
'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'.
'1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'.
'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'.
'/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'.
'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'.
'+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'.
'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'.
'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'.
'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_pink.png
//==========================================================
$this->imgdata[1][0]= 262 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_blue.png
//==========================================================
$this->imgdata[2][0]= 662 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'.
'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'.
'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'.
'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'.
'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'.
'/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'.
'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'.
'9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'.
'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'.
'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'.
'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'.
'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'.
'6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'.
'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'.
'5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'.
'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_yellow.png
//==========================================================
$this->imgdata[3][0]= 262 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_lightblue.png
//==========================================================
$this->imgdata[4][0]= 671 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'.
'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'.
'//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'.
'8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'.
'//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'.
'8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'.
'1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'.
'+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'.
'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'.
'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'.
'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'.
'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'.
'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'.
'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'.
'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'.
'7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_purple.png
//==========================================================
$this->imgdata[5][0]= 657 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'.
'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'.
'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'.
'+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'.
'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'.
'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'.
'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'.
'/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'.
'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'.
'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'.
'1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'.
'+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'.
'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'.
'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'.
'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'.
'25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'.
'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'.
'EdF1ECWW1SAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: diam_gray.png
//==========================================================
$this->imgdata[6][0]= 262 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_blgr.png
//==========================================================
$this->imgdata[7][0]= 262 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_rgb.inc.php
New file
0,0 → 1,615
<?php
//=======================================================================
// File: JPGRAPH_RGB.INC.PHP
// Description: Class to handle RGb color space specification and
// named colors
// Created: 2001-01-08 (Refactored to separate file 2008-08-01)
// Ver: $Id: jpgraph_rgb.inc.php 1893 2009-10-02 23:15:25Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
/*===================================================
// CLASS RGB
// Description: Color definitions as RGB triples
//===================================================
*/
 
class RGB {
public $rgb_table;
public $img;
 
function __construct($aImg=null) {
$this->img = $aImg;
 
// Conversion array between color names and RGB
$this->rgb_table = array(
'aqua'=> array(0,255,255),
'lime'=> array(0,255,0),
'teal'=> array(0,128,128),
'whitesmoke'=>array(245,245,245),
'gainsboro'=>array(220,220,220),
'oldlace'=>array(253,245,230),
'linen'=>array(250,240,230),
'antiquewhite'=>array(250,235,215),
'papayawhip'=>array(255,239,213),
'blanchedalmond'=>array(255,235,205),
'bisque'=>array(255,228,196),
'peachpuff'=>array(255,218,185),
'navajowhite'=>array(255,222,173),
'moccasin'=>array(255,228,181),
'cornsilk'=>array(255,248,220),
'ivory'=>array(255,255,240),
'lemonchiffon'=>array(255,250,205),
'seashell'=>array(255,245,238),
'mintcream'=>array(245,255,250),
'azure'=>array(240,255,255),
'aliceblue'=>array(240,248,255),
'lavender'=>array(230,230,250),
'lavenderblush'=>array(255,240,245),
'mistyrose'=>array(255,228,225),
'white'=>array(255,255,255),
'black'=>array(0,0,0),
'darkslategray'=>array(47,79,79),
'dimgray'=>array(105,105,105),
'slategray'=>array(112,128,144),
'lightslategray'=>array(119,136,153),
'gray'=>array(190,190,190),
'lightgray'=>array(211,211,211),
'midnightblue'=>array(25,25,112),
'navy'=>array(0,0,128),
'indigo'=>array(75,0,130),
'electricindigo'=>array(102,0,255),
'deepindigo'=>array(138,43,226),
'pigmentindigo'=>array(75,0,130),
'indigodye'=>array(0,65,106),
'cornflowerblue'=>array(100,149,237),
'darkslateblue'=>array(72,61,139),
'slateblue'=>array(106,90,205),
'mediumslateblue'=>array(123,104,238),
'lightslateblue'=>array(132,112,255),
'mediumblue'=>array(0,0,205),
'royalblue'=>array(65,105,225),
'blue'=>array(0,0,255),
'dodgerblue'=>array(30,144,255),
'deepskyblue'=>array(0,191,255),
'skyblue'=>array(135,206,235),
'lightskyblue'=>array(135,206,250),
'steelblue'=>array(70,130,180),
'lightred'=>array(211,167,168),
'lightsteelblue'=>array(176,196,222),
'lightblue'=>array(173,216,230),
'powderblue'=>array(176,224,230),
'paleturquoise'=>array(175,238,238),
'darkturquoise'=>array(0,206,209),
'mediumturquoise'=>array(72,209,204),
'turquoise'=>array(64,224,208),
'cyan'=>array(0,255,255),
'lightcyan'=>array(224,255,255),
'cadetblue'=>array(95,158,160),
'mediumaquamarine'=>array(102,205,170),
'aquamarine'=>array(127,255,212),
'darkgreen'=>array(0,100,0),
'darkolivegreen'=>array(85,107,47),
'darkseagreen'=>array(143,188,143),
'seagreen'=>array(46,139,87),
'mediumseagreen'=>array(60,179,113),
'lightseagreen'=>array(32,178,170),
'palegreen'=>array(152,251,152),
'springgreen'=>array(0,255,127),
'lawngreen'=>array(124,252,0),
'green'=>array(0,255,0),
'chartreuse'=>array(127,255,0),
'mediumspringgreen'=>array(0,250,154),
'greenyellow'=>array(173,255,47),
'limegreen'=>array(50,205,50),
'yellowgreen'=>array(154,205,50),
'forestgreen'=>array(34,139,34),
'olivedrab'=>array(107,142,35),
'darkkhaki'=>array(189,183,107),
'khaki'=>array(240,230,140),
'palegoldenrod'=>array(238,232,170),
'lightgoldenrodyellow'=>array(250,250,210),
'lightyellow'=>array(255,255,200),
'yellow'=>array(255,255,0),
'gold'=>array(255,215,0),
'lightgoldenrod'=>array(238,221,130),
'goldenrod'=>array(218,165,32),
'darkgoldenrod'=>array(184,134,11),
'rosybrown'=>array(188,143,143),
'indianred'=>array(205,92,92),
'saddlebrown'=>array(139,69,19),
'sienna'=>array(160,82,45),
'peru'=>array(205,133,63),
'burlywood'=>array(222,184,135),
'beige'=>array(245,245,220),
'wheat'=>array(245,222,179),
'sandybrown'=>array(244,164,96),
'tan'=>array(210,180,140),
'chocolate'=>array(210,105,30),
'firebrick'=>array(178,34,34),
'brown'=>array(165,42,42),
'darksalmon'=>array(233,150,122),
'salmon'=>array(250,128,114),
'lightsalmon'=>array(255,160,122),
'orange'=>array(255,165,0),
'darkorange'=>array(255,140,0),
'coral'=>array(255,127,80),
'lightcoral'=>array(240,128,128),
'tomato'=>array(255,99,71),
'orangered'=>array(255,69,0),
'red'=>array(255,0,0),
'hotpink'=>array(255,105,180),
'deeppink'=>array(255,20,147),
'pink'=>array(255,192,203),
'lightpink'=>array(255,182,193),
'palevioletred'=>array(219,112,147),
'maroon'=>array(176,48,96),
'mediumvioletred'=>array(199,21,133),
'violetred'=>array(208,32,144),
'magenta'=>array(255,0,255),
'violet'=>array(238,130,238),
'plum'=>array(221,160,221),
'orchid'=>array(218,112,214),
'mediumorchid'=>array(186,85,211),
'darkorchid'=>array(153,50,204),
'darkviolet'=>array(148,0,211),
'blueviolet'=>array(138,43,226),
'purple'=>array(160,32,240),
'mediumpurple'=>array(147,112,219),
'thistle'=>array(216,191,216),
'snow1'=>array(255,250,250),
'snow2'=>array(238,233,233),
'snow3'=>array(205,201,201),
'snow4'=>array(139,137,137),
'seashell1'=>array(255,245,238),
'seashell2'=>array(238,229,222),
'seashell3'=>array(205,197,191),
'seashell4'=>array(139,134,130),
'AntiqueWhite1'=>array(255,239,219),
'AntiqueWhite2'=>array(238,223,204),
'AntiqueWhite3'=>array(205,192,176),
'AntiqueWhite4'=>array(139,131,120),
'bisque1'=>array(255,228,196),
'bisque2'=>array(238,213,183),
'bisque3'=>array(205,183,158),
'bisque4'=>array(139,125,107),
'peachPuff1'=>array(255,218,185),
'peachpuff2'=>array(238,203,173),
'peachpuff3'=>array(205,175,149),
'peachpuff4'=>array(139,119,101),
'navajowhite1'=>array(255,222,173),
'navajowhite2'=>array(238,207,161),
'navajowhite3'=>array(205,179,139),
'navajowhite4'=>array(139,121,94),
'lemonchiffon1'=>array(255,250,205),
'lemonchiffon2'=>array(238,233,191),
'lemonchiffon3'=>array(205,201,165),
'lemonchiffon4'=>array(139,137,112),
'ivory1'=>array(255,255,240),
'ivory2'=>array(238,238,224),
'ivory3'=>array(205,205,193),
'ivory4'=>array(139,139,131),
'honeydew'=>array(193,205,193),
'lavenderblush1'=>array(255,240,245),
'lavenderblush2'=>array(238,224,229),
'lavenderblush3'=>array(205,193,197),
'lavenderblush4'=>array(139,131,134),
'mistyrose1'=>array(255,228,225),
'mistyrose2'=>array(238,213,210),
'mistyrose3'=>array(205,183,181),
'mistyrose4'=>array(139,125,123),
'azure1'=>array(240,255,255),
'azure2'=>array(224,238,238),
'azure3'=>array(193,205,205),
'azure4'=>array(131,139,139),
'slateblue1'=>array(131,111,255),
'slateblue2'=>array(122,103,238),
'slateblue3'=>array(105,89,205),
'slateblue4'=>array(71,60,139),
'royalblue1'=>array(72,118,255),
'royalblue2'=>array(67,110,238),
'royalblue3'=>array(58,95,205),
'royalblue4'=>array(39,64,139),
'dodgerblue1'=>array(30,144,255),
'dodgerblue2'=>array(28,134,238),
'dodgerblue3'=>array(24,116,205),
'dodgerblue4'=>array(16,78,139),
'steelblue1'=>array(99,184,255),
'steelblue2'=>array(92,172,238),
'steelblue3'=>array(79,148,205),
'steelblue4'=>array(54,100,139),
'deepskyblue1'=>array(0,191,255),
'deepskyblue2'=>array(0,178,238),
'deepskyblue3'=>array(0,154,205),
'deepskyblue4'=>array(0,104,139),
'skyblue1'=>array(135,206,255),
'skyblue2'=>array(126,192,238),
'skyblue3'=>array(108,166,205),
'skyblue4'=>array(74,112,139),
'lightskyblue1'=>array(176,226,255),
'lightskyblue2'=>array(164,211,238),
'lightskyblue3'=>array(141,182,205),
'lightskyblue4'=>array(96,123,139),
'slategray1'=>array(198,226,255),
'slategray2'=>array(185,211,238),
'slategray3'=>array(159,182,205),
'slategray4'=>array(108,123,139),
'lightsteelblue1'=>array(202,225,255),
'lightsteelblue2'=>array(188,210,238),
'lightsteelblue3'=>array(162,181,205),
'lightsteelblue4'=>array(110,123,139),
'lightblue1'=>array(191,239,255),
'lightblue2'=>array(178,223,238),
'lightblue3'=>array(154,192,205),
'lightblue4'=>array(104,131,139),
'lightcyan1'=>array(224,255,255),
'lightcyan2'=>array(209,238,238),
'lightcyan3'=>array(180,205,205),
'lightcyan4'=>array(122,139,139),
'paleturquoise1'=>array(187,255,255),
'paleturquoise2'=>array(174,238,238),
'paleturquoise3'=>array(150,205,205),
'paleturquoise4'=>array(102,139,139),
'cadetblue1'=>array(152,245,255),
'cadetblue2'=>array(142,229,238),
'cadetblue3'=>array(122,197,205),
'cadetblue4'=>array(83,134,139),
'turquoise1'=>array(0,245,255),
'turquoise2'=>array(0,229,238),
'turquoise3'=>array(0,197,205),
'turquoise4'=>array(0,134,139),
'cyan1'=>array(0,255,255),
'cyan2'=>array(0,238,238),
'cyan3'=>array(0,205,205),
'cyan4'=>array(0,139,139),
'darkslategray1'=>array(151,255,255),
'darkslategray2'=>array(141,238,238),
'darkslategray3'=>array(121,205,205),
'darkslategray4'=>array(82,139,139),
'aquamarine1'=>array(127,255,212),
'aquamarine2'=>array(118,238,198),
'aquamarine3'=>array(102,205,170),
'aquamarine4'=>array(69,139,116),
'darkseagreen1'=>array(193,255,193),
'darkseagreen2'=>array(180,238,180),
'darkseagreen3'=>array(155,205,155),
'darkseagreen4'=>array(105,139,105),
'seagreen1'=>array(84,255,159),
'seagreen2'=>array(78,238,148),
'seagreen3'=>array(67,205,128),
'seagreen4'=>array(46,139,87),
'palegreen1'=>array(154,255,154),
'palegreen2'=>array(144,238,144),
'palegreen3'=>array(124,205,124),
'palegreen4'=>array(84,139,84),
'springgreen1'=>array(0,255,127),
'springgreen2'=>array(0,238,118),
'springgreen3'=>array(0,205,102),
'springgreen4'=>array(0,139,69),
'chartreuse1'=>array(127,255,0),
'chartreuse2'=>array(118,238,0),
'chartreuse3'=>array(102,205,0),
'chartreuse4'=>array(69,139,0),
'olivedrab1'=>array(192,255,62),
'olivedrab2'=>array(179,238,58),
'olivedrab3'=>array(154,205,50),
'olivedrab4'=>array(105,139,34),
'darkolivegreen1'=>array(202,255,112),
'darkolivegreen2'=>array(188,238,104),
'darkolivegreen3'=>array(162,205,90),
'darkolivegreen4'=>array(110,139,61),
'khaki1'=>array(255,246,143),
'khaki2'=>array(238,230,133),
'khaki3'=>array(205,198,115),
'khaki4'=>array(139,134,78),
'lightgoldenrod1'=>array(255,236,139),
'lightgoldenrod2'=>array(238,220,130),
'lightgoldenrod3'=>array(205,190,112),
'lightgoldenrod4'=>array(139,129,76),
'yellow1'=>array(255,255,0),
'yellow2'=>array(238,238,0),
'yellow3'=>array(205,205,0),
'yellow4'=>array(139,139,0),
'gold1'=>array(255,215,0),
'gold2'=>array(238,201,0),
'gold3'=>array(205,173,0),
'gold4'=>array(139,117,0),
'goldenrod1'=>array(255,193,37),
'goldenrod2'=>array(238,180,34),
'goldenrod3'=>array(205,155,29),
'goldenrod4'=>array(139,105,20),
'darkgoldenrod1'=>array(255,185,15),
'darkgoldenrod2'=>array(238,173,14),
'darkgoldenrod3'=>array(205,149,12),
'darkgoldenrod4'=>array(139,101,8),
'rosybrown1'=>array(255,193,193),
'rosybrown2'=>array(238,180,180),
'rosybrown3'=>array(205,155,155),
'rosybrown4'=>array(139,105,105),
'indianred1'=>array(255,106,106),
'indianred2'=>array(238,99,99),
'indianred3'=>array(205,85,85),
'indianred4'=>array(139,58,58),
'sienna1'=>array(255,130,71),
'sienna2'=>array(238,121,66),
'sienna3'=>array(205,104,57),
'sienna4'=>array(139,71,38),
'burlywood1'=>array(255,211,155),
'burlywood2'=>array(238,197,145),
'burlywood3'=>array(205,170,125),
'burlywood4'=>array(139,115,85),
'wheat1'=>array(255,231,186),
'wheat2'=>array(238,216,174),
'wheat3'=>array(205,186,150),
'wheat4'=>array(139,126,102),
'tan1'=>array(255,165,79),
'tan2'=>array(238,154,73),
'tan3'=>array(205,133,63),
'tan4'=>array(139,90,43),
'chocolate1'=>array(255,127,36),
'chocolate2'=>array(238,118,33),
'chocolate3'=>array(205,102,29),
'chocolate4'=>array(139,69,19),
'firebrick1'=>array(255,48,48),
'firebrick2'=>array(238,44,44),
'firebrick3'=>array(205,38,38),
'firebrick4'=>array(139,26,26),
'brown1'=>array(255,64,64),
'brown2'=>array(238,59,59),
'brown3'=>array(205,51,51),
'brown4'=>array(139,35,35),
'salmon1'=>array(255,140,105),
'salmon2'=>array(238,130,98),
'salmon3'=>array(205,112,84),
'salmon4'=>array(139,76,57),
'lightsalmon1'=>array(255,160,122),
'lightsalmon2'=>array(238,149,114),
'lightsalmon3'=>array(205,129,98),
'lightsalmon4'=>array(139,87,66),
'orange1'=>array(255,165,0),
'orange2'=>array(238,154,0),
'orange3'=>array(205,133,0),
'orange4'=>array(139,90,0),
'darkorange1'=>array(255,127,0),
'darkorange2'=>array(238,118,0),
'darkorange3'=>array(205,102,0),
'darkorange4'=>array(139,69,0),
'coral1'=>array(255,114,86),
'coral2'=>array(238,106,80),
'coral3'=>array(205,91,69),
'coral4'=>array(139,62,47),
'tomato1'=>array(255,99,71),
'tomato2'=>array(238,92,66),
'tomato3'=>array(205,79,57),
'tomato4'=>array(139,54,38),
'orangered1'=>array(255,69,0),
'orangered2'=>array(238,64,0),
'orangered3'=>array(205,55,0),
'orangered4'=>array(139,37,0),
'deeppink1'=>array(255,20,147),
'deeppink2'=>array(238,18,137),
'deeppink3'=>array(205,16,118),
'deeppink4'=>array(139,10,80),
'hotpink1'=>array(255,110,180),
'hotpink2'=>array(238,106,167),
'hotpink3'=>array(205,96,144),
'hotpink4'=>array(139,58,98),
'pink1'=>array(255,181,197),
'pink2'=>array(238,169,184),
'pink3'=>array(205,145,158),
'pink4'=>array(139,99,108),
'lightpink1'=>array(255,174,185),
'lightpink2'=>array(238,162,173),
'lightpink3'=>array(205,140,149),
'lightpink4'=>array(139,95,101),
'palevioletred1'=>array(255,130,171),
'palevioletred2'=>array(238,121,159),
'palevioletred3'=>array(205,104,137),
'palevioletred4'=>array(139,71,93),
'maroon1'=>array(255,52,179),
'maroon2'=>array(238,48,167),
'maroon3'=>array(205,41,144),
'maroon4'=>array(139,28,98),
'violetred1'=>array(255,62,150),
'violetred2'=>array(238,58,140),
'violetred3'=>array(205,50,120),
'violetred4'=>array(139,34,82),
'magenta1'=>array(255,0,255),
'magenta2'=>array(238,0,238),
'magenta3'=>array(205,0,205),
'magenta4'=>array(139,0,139),
'mediumred'=>array(140,34,34),
'orchid1'=>array(255,131,250),
'orchid2'=>array(238,122,233),
'orchid3'=>array(205,105,201),
'orchid4'=>array(139,71,137),
'plum1'=>array(255,187,255),
'plum2'=>array(238,174,238),
'plum3'=>array(205,150,205),
'plum4'=>array(139,102,139),
'mediumorchid1'=>array(224,102,255),
'mediumorchid2'=>array(209,95,238),
'mediumorchid3'=>array(180,82,205),
'mediumorchid4'=>array(122,55,139),
'darkorchid1'=>array(191,62,255),
'darkorchid2'=>array(178,58,238),
'darkorchid3'=>array(154,50,205),
'darkorchid4'=>array(104,34,139),
'purple1'=>array(155,48,255),
'purple2'=>array(145,44,238),
'purple3'=>array(125,38,205),
'purple4'=>array(85,26,139),
'mediumpurple1'=>array(171,130,255),
'mediumpurple2'=>array(159,121,238),
'mediumpurple3'=>array(137,104,205),
'mediumpurple4'=>array(93,71,139),
'thistle1'=>array(255,225,255),
'thistle2'=>array(238,210,238),
'thistle3'=>array(205,181,205),
'thistle4'=>array(139,123,139),
'gray1'=>array(10,10,10),
'gray2'=>array(40,40,30),
'gray3'=>array(70,70,70),
'gray4'=>array(100,100,100),
'gray5'=>array(130,130,130),
'gray6'=>array(160,160,160),
'gray7'=>array(190,190,190),
'gray8'=>array(210,210,210),
'gray9'=>array(240,240,240),
'darkgray'=>array(100,100,100),
'darkblue'=>array(0,0,139),
'darkcyan'=>array(0,139,139),
'darkmagenta'=>array(139,0,139),
'darkred'=>array(139,0,0),
'silver'=>array(192, 192, 192),
'eggplant'=>array(144,176,168),
'lightgreen'=>array(144,238,144));
}
 
 
//----------------
// PUBLIC METHODS
// Colors can be specified as either
// 1. #xxxxxx HTML style
// 2. "colorname" as a named color
// 3. array(r,g,b) RGB triple
// This function translates this to a native RGB format and returns an
// RGB triple.
 
function Color($aColor) {
if (is_string($aColor)) {
$matches = array();
// this regex will parse a color string and fill the $matches array as such:
// 0: the full match if any
// 1: a hex string preceded by a hash, can be 3 characters (#fff) or 6 (#ffffff) (4 or 5 also accepted but...)
// 2,3,4: r,g,b values in hex if the first character of the string is #
// 5: all alpha-numeric characters at the beginning of the string if string does not start with #
// 6: alpha value prefixed by @ if supplied
// 7: alpha value with @ stripped
// 8: adjust value prefixed with : if supplied
// 9: adjust value with : stripped
$regex = '/(#([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2}))?([\w]+)?(@([\d\.,]+))?(:([\d\.,]+))?/';
if(!preg_match($regex, $aColor, $matches)) {
JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor");
}
if(empty($matches[5])) {
$r = strlen($matches[2]) == 1 ? $matches[2].$matches[2] : $matches[2];
$g = strlen($matches[3]) == 1 ? $matches[3].$matches[3] : $matches[3];
$b = strlen($matches[4]) == 1 ? $matches[4].$matches[4] : $matches[4];
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
}else {
if(!isset($this->rgb_table[$matches[5]]) ) {
JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor");
}
$r = $this->rgb_table[$matches[5]][0];
$g = $this->rgb_table[$matches[5]][1];
$b = $this->rgb_table[$matches[5]][2];
}
$alpha = isset($matches[7]) ? str_replace(',','.',$matches[7]) : 0;
$adj = isset($matches[9]) ? str_replace(',','.',$matches[9]) : 1.0;
 
if( $adj < 0 ) {
JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0');
}
 
// Scale adj so that an adj=2 always
// makes the color 100% white (i.e. 255,255,255.
// and adj=1 neutral and adj=0 black.
if( $adj == 1) {
return array($r,$g,$b,$alpha);
}
elseif( $adj > 1 ) {
$m = ($adj-1.0)*(255-min(255,min($r,min($g,$b))));
return array(min(255,$r+$m), min(255,$g+$m), min(255,$b+$m),$alpha);
}
elseif( $adj < 1 ) {
$m = ($adj-1.0)*max(255,max($r,max($g,$b)));
return array(max(0,$r+$m), max(0,$g+$m), max(0,$b+$m),$alpha);
}
} elseif( is_array($aColor) ) {
if(!isset($aColor[3])) $aColor[3] = 0;
return $aColor;
}
else {
JpGraphError::RaiseL(25079,$aColor,count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor));
}
}
 
// Compare two colors
// return true if equal
function Equal($aCol1,$aCol2) {
$c1 = $this->Color($aCol1);
$c2 = $this->Color($aCol2);
return $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ;
}
 
// Allocate a new color in the current image
// Return new color index, -1 if no more colors could be allocated
function Allocate($aColor,$aAlpha=0.0) {
list ($r, $g, $b, $a) = $this->color($aColor);
// If alpha is specified in the color string then this
// takes precedence over the second argument
if( $a > 0 ) {
$aAlpha = $a;
}
if( $aAlpha < 0 || $aAlpha > 1 ) {
JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0');
}
return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127));
}
 
// Try to convert an array with three valid numbers to the corresponding hex array
// This is currenly only used in processing the colors for barplots in order to be able
// to handle the case where the color might be specified as an array of colros as well.
// In that case we must be able to find out if an array of values should be interpretated as
// a single color (specifeid as an RGB triple)
static function tryHexConversion($aColor) {
if( is_array( $aColor ) ) {
if( count( $aColor ) == 3 ) {
if( is_numeric($aColor[0]) && is_numeric($aColor[1]) && is_numeric($aColor[2]) ) {
if( ($aColor[0] >= 0 && $aColor[0] <= 255) &&
($aColor[1] >= 0 && $aColor[1] <= 255) &&
($aColor[2] >= 0 && $aColor[2] <= 255) ) {
return sprintf('#%02x%02x%02x',$aColor[0],$aColor[1],$aColor[2]);
}
}
}
}
return $aColor;
}
 
// Return a RGB tripple corresponding to a position in the normal light spectrum
// The argumen values is in the range [0, 1] where a value of 0 correponds to blue and
// a value of 1 corresponds to red. Values in betwen is mapped to a linear interpolation
// of the constituting colors in the visible color spectra.
// The $aDynamicRange specified how much of the dynamic range we shold use
// a value of 1.0 give the full dyanmic range and a lower value give more dark
// colors. In the extreme of 0.0 then all colors will be black.
static function GetSpectrum($aVal,$aDynamicRange=1.0) {
if( $aVal < 0 || $aVal > 1.0001 ) {
return array(0,0,0); // Invalid case - just return black
}
 
$sat = round(255*$aDynamicRange);
$a = 0.25;
if( $aVal <= 0.25 ) {
return array(0, round($sat*$aVal/$a), $sat);
}
elseif( $aVal <= 0.5 ) {
return array(0, $sat, round($sat-$sat*($aVal-0.25)/$a));
}
elseif( $aVal <= 0.75 ) {
return array(round($sat*($aVal-0.5)/$a), $sat, 0);
}
else {
return array($sat, round($sat-$sat*($aVal-0.75)/$a), 0);
}
}
 
} // Class
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_stock.php
New file
0,0 → 1,198
<?php
/*=======================================================================
// File: JPGRAPH_STOCK.PHP
// Description: Stock plot extension for JpGraph
// Created: 2003-01-27
// Ver: $Id: jpgraph_stock.php 1364 2009-06-24 07:07:44Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS StockPlot
//===================================================
class StockPlot extends Plot {
protected $iTupleSize = 4;
private $iWidth=9;
private $iEndLines=1;
private $iStockColor1='white',$iStockColor2='darkred',$iStockColor3='darkred';
//---------------
// CONSTRUCTOR
function __construct($datay,$datax=false) {
if( count($datay) % $this->iTupleSize ) {
JpGraphError::RaiseL(21001,$this->iTupleSize);
//('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.');
}
parent::__construct($datay,$datax);
$this->numpoints /= $this->iTupleSize;
}
//---------------
// PUBLIC METHODS
 
function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') {
$this->color = $aColor;
$this->iStockColor1 = $aColor1;
$this->iStockColor2 = $aColor2;
$this->iStockColor3 = $aColor3;
}
 
function SetWidth($aWidth) {
// Make sure it's odd
$this->iWidth = 2*floor($aWidth/2)+1;
}
 
function HideEndLines($aHide=true) {
$this->iEndLines = !$aHide;
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust($graph) {
if( $this->center ) {
$a=0.5; $b=0.5;
$this->numpoints++;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
}
 
// Method description
function Stroke($img,$xscale,$yscale) {
$n=$this->numpoints;
if( $this->center ) $n--;
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$n ) {
JpGraphError::RaiseL(2003,count($this->coords[1]),$n);
// ("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
}
else {
$exist_x = true;
}
}
else {
$exist_x = false;
}
 
if( $exist_x ) {
$xs=$this->coords[1][0];
}
else {
$xs=0;
}
 
$ts = $this->iTupleSize;
$this->csimareas = '';
for( $i=0; $i<$n; ++$i) {
 
//If value is NULL, then don't draw a bar at all
if ($this->coords[0][$i*$ts] === null) continue;
 
if( $exist_x ) {
$x=$this->coords[1][$i];
if ($x === null) continue;
}
else {
$x=$i;
}
$xt = $xscale->Translate($x);
 
$neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ;
$yopen = $yscale->Translate($this->coords[0][$i*$ts]);
$yclose = $yscale->Translate($this->coords[0][$i*$ts+1]);
$ymin = $yscale->Translate($this->coords[0][$i*$ts+2]);
$ymax = $yscale->Translate($this->coords[0][$i*$ts+3]);
 
$dx = floor($this->iWidth/2);
$xl = $xt - $dx;
$xr = $xt + $dx;
 
if( $neg ) {
$img->SetColor($this->iStockColor3);
}
else {
$img->SetColor($this->iStockColor1);
}
$img->FilledRectangle($xl,$yopen,$xr,$yclose);
$img->SetLineWeight($this->weight);
if( $neg ) {
$img->SetColor($this->iStockColor2);
}
else {
$img->SetColor($this->color);
}
 
$img->Rectangle($xl,$yopen,$xr,$yclose);
 
if( $yopen < $yclose ) {
$ytop = $yopen ;
$ybottom = $yclose ;
}
else {
$ytop = $yclose ;
$ybottom = $yopen ;
}
$img->SetColor($this->color);
$img->Line($xt,$ytop,$xt,$ymax);
$img->Line($xt,$ybottom,$xt,$ymin);
 
if( $this->iEndLines ) {
$img->Line($xl,$ymax,$xr,$ymax);
$img->Line($xl,$ymin,$xr,$ymin);
}
 
// A chance for subclasses to add things to the bar
// for data point i
$this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg);
 
// Setup image maps
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas.= '<area shape="rect" coords="'.
round($xl).','.round($ytop).','.
round($xr).','.round($ybottom).'" ';
$this->csimareas .= ' href="'.$this->csimtargets[$i].'"';
if( !empty($this->csimalts[$i]) ) {
$sval=$this->csimalts[$i];
$this->csimareas .= " title=\"$sval\" alt=\"$sval\" ";
}
$this->csimareas.= " />\n";
}
}
return true;
}
 
// A hook for subclasses to modify the plot
function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {}
 
} // Class
 
//===================================================
// CLASS BoxPlot
//===================================================
class BoxPlot extends StockPlot {
private $iPColor='black',$iNColor='white';
 
function __construct($datay,$datax=false) {
$this->iTupleSize=5;
parent::__construct($datay,$datax);
}
 
function SetMedianColor($aPos,$aNeg) {
$this->iPColor = $aPos;
$this->iNColor = $aNeg;
}
 
function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {
if( $neg )
$img->SetColor($this->iNColor);
else
$img->SetColor($this->iPColor);
 
$y = $yscale->Translate($this->coords[0][$i*5+4]);
$img->Line($xl,$y,$xr,$y);
}
}
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_imgtrans.php
New file
0,0 → 1,223
<?php
//=======================================================================
// File: JPGRAPH_IMGTRANS.PHP
// Description: Extension for JpGraph to do some simple img transformations
// Created: 2003-09-06
// Ver: $Id: jpgraph_imgtrans.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
//------------------------------------------------------------------------
// Class ImgTrans
// Perform some simple image transformations.
//------------------------------------------------------------------------
class ImgTrans {
private $gdImg=null;
 
function __construct($aGdImg) {
// Constructor
$this->gdImg = $aGdImg;
}
 
// --------------------------------------------------------------------
// _TransVert3D() and _TransHor3D() are helper methods to
// Skew3D().
// --------------------------------------------------------------------
function _TransVert3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_DOWN,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) {
 
 
// Parameter check
if( $aHorizonPos < 0 || $aHorizonPos > 1.0 ) {
JpGraphError::RaiseL(9001);
//("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1.");
}
 
$w = imagesx($aGdImg);
$h = imagesy($aGdImg);
 
// Create new image
$ww = $w;
if( $aMinSize )
$hh = ceil($h * $aHorizon / ($aSkewDist+$h));
else
$hh = $h;
 
$newgdh = imagecreatetruecolor($ww,$hh);
$crgb = new RGB( $newgdh );
$fillColor = $crgb->Allocate($aFillColor);
imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor);
 
if( $aBorder ) {
$colidx = $crgb->Allocate($aBorder);
imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx);
}
 
$mid = round($w * $aHorizonPos);
 
$last=$h;
for($y=0; $y < $h; ++$y) {
 
$yp = $h-$y-1;
$yt = floor($yp * $aHorizon / ($aSkewDist + $yp));
 
if( !$aQuality ) {
if( $last <= $yt ) continue ;
$last = $yt;
}
 
for($x=0; $x < $w; ++$x) {
$xt = ($x-$mid) * $aSkewDist / ($aSkewDist + $yp);
if( $aDir == SKEW3D_UP )
$rgb = imagecolorat($aGdImg,$x,$h-$y-1);
else
$rgb = imagecolorat($aGdImg,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colidx = imagecolorallocate($newgdh,$r,$g,$b);
$xt = round($xt+$mid);
if( $aDir == SKEW3D_UP ) {
$syt = $yt;
}
else {
$syt = $hh-$yt-1;
}
 
if( !empty($set[$yt]) ) {
$nrgb = imagecolorat($newgdh,$xt,$syt);
$nr = ($nrgb >> 16) & 0xFF;
$ng = ($nrgb >> 8) & 0xFF;
$nb = $nrgb & 0xFF;
$colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2),
floor(($g+$ng)/2),floor(($b+$nb)/2));
}
 
imagesetpixel($newgdh,$xt,$syt,$colidx);
}
 
$set[$yt] = true;
}
 
return $newgdh;
}
 
// --------------------------------------------------------------------
// _TransVert3D() and _TransHor3D() are helper methods to
// Skew3D().
// --------------------------------------------------------------------
function _TransHor3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_LEFT,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) {
 
$w = imagesx($aGdImg);
$h = imagesy($aGdImg);
 
// Create new image
$hh = $h;
if( $aMinSize )
$ww = ceil($w * $aHorizon / ($aSkewDist+$w));
else
$ww = $w;
 
$newgdh = imagecreatetruecolor($ww,$hh);
$crgb = new RGB( $newgdh );
$fillColor = $crgb->Allocate($aFillColor);
imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor);
 
if( $aBorder ) {
$colidx = $crgb->Allocate($aBorder);
imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx);
}
 
$mid = round($h * $aHorizonPos);
 
$last = -1;
for($x=0; $x < $w-1; ++$x) {
$xt = floor($x * $aHorizon / ($aSkewDist + $x));
if( !$aQuality ) {
if( $last >= $xt ) continue ;
$last = $xt;
}
 
for($y=0; $y < $h; ++$y) {
$yp = $h-$y-1;
$yt = ($yp-$mid) * $aSkewDist / ($aSkewDist + $x);
 
if( $aDir == SKEW3D_RIGHT )
$rgb = imagecolorat($aGdImg,$w-$x-1,$y);
else
$rgb = imagecolorat($aGdImg,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colidx = imagecolorallocate($newgdh,$r,$g,$b);
$yt = floor($hh-$yt-$mid-1);
if( $aDir == SKEW3D_RIGHT ) {
$sxt = $ww-$xt-1;
}
else
$sxt = $xt ;
 
if( !empty($set[$xt]) ) {
$nrgb = imagecolorat($newgdh,$sxt,$yt);
$nr = ($nrgb >> 16) & 0xFF;
$ng = ($nrgb >> 8) & 0xFF;
$nb = $nrgb & 0xFF;
$colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2),
floor(($g+$ng)/2),floor(($b+$nb)/2));
}
imagesetpixel($newgdh,$sxt,$yt,$colidx);
}
 
$set[$xt] = true;
}
 
return $newgdh;
}
 
// --------------------------------------------------------------------
// Skew image for the apperance of a 3D effect
// This transforms an image into a 3D-skewed version
// of the image. The transformation is specified by giving the height
// of the artificial horizon and specifying a "skew" factor which
// is the distance on the horizon line between the point of
// convergence and perspective line.
//
// The function returns the GD handle of the transformed image
// leaving the original image untouched.
//
// Parameters:
// * $aGdImg, GD handle to the image to be transformed
// * $aHorizon, Distance to the horizon
// * $aSkewDist, Distance from the horizon point of convergence
// on the horizon line to the perspective points. A larger
// value will fore-shorten the image more
// * $aDir, parameter specifies type of convergence. This of this
// as the walls in a room you are looking at. This specifies if the
// image should be applied on the left,right,top or bottom walls.
// * $aMinSize, true=make the new image just as big as needed,
// false = keep the image the same size as the original image
// * $aFillColor, Background fill color in the image
// * $aHiQuality, true=performa some interpolation that improves
// the image quality but at the expense of performace. Enabling
// high quality will have a dramatic effect on the time it takes
// to transform an image.
// * $aBorder, if set to anything besides false this will draw a
// a border of the speciied color around the image
// --------------------------------------------------------------------
function Skew3D($aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) {
return $this->_Skew3D($this->gdImg,$aHorizon,$aSkewDist,$aDir,$aHiQuality,
$aMinSize,$aFillColor,$aBorder);
}
 
function _Skew3D($aGdImg,$aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) {
if( $aDir == SKEW3D_DOWN || $aDir == SKEW3D_UP )
return $this->_TransVert3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder);
else
return $this->_TransHor3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder);
 
}
 
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/contour_dev/findpolygon.php
New file
0,0 → 1,798
<?php
require_once '../jpgraph.php';
require_once '../jpgraph_canvas.php';
require_once '../jpgraph_canvtools.php';
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
 
/**
* Description of test_findpolygon
*
* @author ljp
*/
class Findpolygon {
private $nbrContours=-1;
public $contourCoord=array();
private $scale = array(0,6,0,8);
 
function flattenEdges($p) {
$fp=array();
for ($i = 0 ; $i < count($p) ; $i++) {
$fp[] = $p[$i][0];
$fp[] = $p[$i][1];
}
return $fp;
}
 
function SetupTestData() {
// for($i=0; $i<count($this->contourCoord[0]); ++$i) {
// echo '('.$this->contourCoord[0][$i][0][0].','.$this->contourCoord[0][$i][0][1].') -> '.
// '('.$this->contourCoord[0][$i][1][0].','.$this->contourCoord[0][$i][1][1].")\n";
// }
//
 
$c=0;
$p[$c] = array(0.6,1, 1,0.5, 2,0.5, 3,0.5, 3.5,1, 3.5,2, 3,2.5, 2,2.5, 1,2.5, 0.5,2, 0.6,1);
$c++;
$p[$c] = array(6,0.5, 5.5,1, 5.5,2, 6,2.5);
 
$this->nbrContours = $c+1;
 
for ($c = 0 ; $c < count($p) ; $c++) {
$n=count($p[$c]);
 
$this->contourCoord[$c][0] = array(array($p[$c][0],$p[$c][1]),array($p[$c][2],$p[$c][3]));
$k=1;
for ($i = 0; $i < ($n-4)/2; $i++, $k++) {
$this->contourCoord[$c][$k] = array($this->contourCoord[$c][$k-1][1], array($p[$c][2*$k+2],$p[$c][2*$k+1+2]));
}
 
// Swap edges order at random
$n = count($this->contourCoord[$c]);
for($i=0; $i < floor($n/2); ++$i) {
$swap1 = rand(0,$n-1);
$t = $this->contourCoord[$c][$swap1];
while( $swap1 == ($swap2 = rand(0,$n-1)) )
;
$this->contourCoord[$c][$swap1] = $this->contourCoord[$c][$swap2];
$this->contourCoord[$c][$swap2] = $t;
}
 
// Swap vector direction on 1/3 of the edges
for ($i = 0 ; $i < floor(count($this->contourCoord[$c])/3) ; $i++) {
$e = rand(0, count($this->contourCoord[$c])-1);
$edge = $this->contourCoord[$c][$e];
$v1 = $edge[0]; $v2 = $edge[1];
$this->contourCoord[$c][$e][0] = $v2;
$this->contourCoord[$c][$e][1] = $v1;
}
}
 
$pp = array();
for($j=0; $j < count($p); ++$j ) {
for( $i=0; $i < count($p[$j])/2; ++$i ) {
$pp[$j][$i] = array($p[$j][2*$i],$p[$j][2*$i+1]);
}
}
return $pp;
}
 
function p_edges($v) {
for ($i = 0 ; $i < count($v) ; $i++) {
echo "(".$v[$i][0][0].",".$v[$i][0][1].") -> (".$v[$i][1][0].",".$v[$i][1][1].")\n";
}
echo "\n";
}
 
function CompareCyclic($a,$b,$forward=true) {
 
// We assume disjoint vertices and if last==first this just means
// that the polygon is closed. For this comparison it must be unique
// elements
if( $a[count($a)-1] == $a[0] ) {
array_pop($a);
}
if( $b[count($b)-1] == $b[0] ) {
array_pop($b);
}
 
$n1 = count($a); $n2 = count($b);
if( $n1 != $n2 )
return false;
 
$i=0;
while( ($i < $n2) && ($a[0] != $b[$i]) )
++$i;
 
if( $i >= $n2 )
return false;
 
$j=0;
if( $forward ) {
while( ($j < $n1) && ($a[$j] == $b[$i]) ) {
$i = ($i + 1) % $n2;
++$j;
}
}
else {
while( ($j < $n1) && ($a[$j] == $b[$i]) ) {
--$i;
if( $i < 0 ) {
$i = $n2-1;
}
++$j;
}
}
return $j >= $n1;
}
 
function dbg($s) {
// echo $s."\n";
}
 
function IsVerticeOnBorder($x1,$y1) {
// Check if the vertice lies on any of the four border
if( $x1==$this->scale[0] || $x1==$this->scale[1] ) {
return true;
}
if( $y1==$this->scale[2] || $y1==$this->scale[3] ) {
return true;
}
return false;
}
 
function FindPolygons($debug=false) {
 
$pol = 0;
for ($c = 0; $c < $this->nbrContours; $c++) {
 
$this->dbg("\n** Searching polygon chain $c ... ");
$this->dbg("------------------------------------------\n");
 
$edges = $this->contourCoord[$c];
while( count($edges) > 0 ) {
 
$edge = array_shift($edges);
list($x1,$y1) = $edge[0];
list($x2,$y2) = $edge[1];
$polygons[$pol]=array(
array($x1,$y1),array($x2,$y2)
);
 
$this->dbg("Searching on second vertice.");
 
$found=false;
if( ! $this->IsVerticeOnBorder($x2,$y2) ) {
do {
 
$this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)");
 
$found=false;
$nn = count($edges);
for( $i=0; $i < $nn && !$found; ++$i ) {
$edge = $edges[$i];
if( $found = ($x2==$edge[0][0] && $y2==$edge[0][1]) ) {
$polygons[$pol][] = array($edge[1][0],$edge[1][1]);
$x1 = $x2; $y1 = $y2;
$x2 = $edge[1][0]; $y2 = $edge[1][1];
}
elseif( $found = ($x2==$edge[1][0] && $y2==$edge[1][1]) ) {
$polygons[$pol][] = array($edge[0][0],$edge[0][1]);
$x1 = $x2; $y1 = $y2;
$x2 = $edge[0][0]; $y2 = $edge[0][1];
}
if( $found ) {
$this->dbg(" --Found next edge: [i=$i], (%,%) -> ($x2,$y2)");
unset($edges[$i]);
$edges = array_values($edges);
}
}
 
} while( $found );
}
 
if( !$found && count($edges)>0 ) {
$this->dbg("Searching on first vertice.");
list($x1,$y1) = $polygons[$pol][0];
list($x2,$y2) = $polygons[$pol][1];
 
if( ! $this->IsVerticeOnBorder($x1,$y1) ) {
do {
 
$this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)");
 
$found=false;
$nn = count($edges);
for( $i=0; $i < $nn && !$found; ++$i ) {
$edge = $edges[$i];
if( $found = ($x1==$edge[0][0] && $y1==$edge[0][1]) ) {
array_unshift($polygons[$pol],array($edge[1][0],$edge[1][1]));
$x2 = $x1; $y2 = $y1;
$x1 = $edge[1][0]; $y1 = $edge[1][1];
}
elseif( $found = ($x1==$edge[1][0] && $y1==$edge[1][1]) ) {
array_unshift($polygons[$pol],array($edge[0][0],$edge[0][1]));
$x2 = $x1; $y2 = $y1;
$x1 = $edge[0][0]; $y1 = $edge[0][1];
}
if( $found ) {
$this->dbg(" --Found next edge: [i=$i], ($x1,$y1) -> (%,%)");
unset($edges[$i]);
$edges = array_values($edges);
}
}
 
} while( $found );
}
 
}
 
$pol++;
}
}
 
return $polygons;
}
 
}
define('HORIZ_EDGE',0);
define('VERT_EDGE',1);
 
class FillGridRect {
private $edges,$dataPoints,$colors,$isoBars;
private $invert=false;
 
function __construct(&$edges,&$dataPoints,$isoBars,$colors) {
$this->edges = $edges;
$this->dataPoints = $dataPoints;
$this->colors = $colors;
$this->isoBars = $isoBars;
}
 
function GetIsobarColor($val) {
for ($i = 0 ; $i < count($this->isoBars) ; $i++) {
if( $val <= $this->isoBars[$i] ) {
return $this->colors[$i];
}
}
return $this->colors[$i]; // The color for all values above the highest isobar
}
 
function GetIsobarVal($a,$b) {
// Get the isobar that is between the values a and b
// If there are more isobars then return the one with lowest index
if( $b < $a ) {
$t=$a; $a=$b; $b=$t;
}
$i = 0 ;
$n = count($this->isoBars);
while( $i < $n && $this->isoBars[$i] < $a ) {
++$i;
}
if( $i >= $n )
die("Internal error. Cannot find isobar values for ($a,$b)");
return $this->isoBars[$i];
}
 
function getCrossingCoord($aRow,$aCol,$aEdgeDir,$aIsobarVal) {
// In order to avoid numerical problem when two vertices are very close
// we have to check and avoid dividing by close to zero denumerator.
if( $aEdgeDir == HORIZ_EDGE ) {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]);
if( $d > 0.001 ) {
$xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$xcoord = $aCol;
}
$ycoord = $aRow;
}
else {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]);
if( $d > 0.001 ) {
$ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$ycoord = $aRow;
}
$xcoord = $aCol;
}
if( $this->invert ) {
$ycoord = $this->nbrRows-1 - $ycoord;
}
return array($xcoord,$ycoord);
}
 
function Fill(ContCanvas $canvas) {
 
$nx_vertices = count($this->dataPoints[0]);
$ny_vertices = count($this->dataPoints);
 
// Loop through all squares in the grid
for($col=0; $col < $nx_vertices-1; ++$col) {
for($row=0; $row < $ny_vertices-1; ++$row) {
 
$n = 0;$quad_edges=array();
if ( $this->edges[VERT_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, VERT_EDGE);
if ( $this->edges[VERT_EDGE][$row][$col+1] ) $quad_edges[$n++] = array($row, $col+1,VERT_EDGE);
if ( $this->edges[HORIZ_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, HORIZ_EDGE);
if ( $this->edges[HORIZ_EDGE][$row+1][$col] ) $quad_edges[$n++] = array($row+1,$col, HORIZ_EDGE);
 
if( $n == 0 ) {
// Easy, fill the entire quadrant with one color since we have no crossings
// Select the top left datapoint as representing this quadrant
// color for this quadrant
$color = $this->GetIsobarColor($this->dataPoints[$row][$col]);
$polygon = array($col,$row,$col,$row+1,$col+1,$row+1,$col+1,$row,$col,$row);
$canvas->FilledPolygon($polygon,$color);
 
} elseif( $n==2 ) {
 
// There is one isobar edge crossing this quadrant. In order to fill we need to
// find out the orientation of the two areas this edge is separating in order to
// construct the two polygons that define the two areas to be filled
// There are six possible variants
// 0) North-South
// 1) West-East
// 2) West-North
// 3) East-North
// 4) West-South
// 5) East-South
$type=-1;
if( $this->edges[HORIZ_EDGE][$row][$col] ) {
if( $this->edges[HORIZ_EDGE][$row+1][$col] ) $type=0; // North-South
elseif( $this->edges[VERT_EDGE][$row][$col] ) $type=2;
elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=3;
}
elseif( $this->edges[HORIZ_EDGE][$row+1][$col] ) {
if( $this->edges[VERT_EDGE][$row][$col] ) $type=4;
elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=5;
}
else {
$type=1;
}
if( $type==-1 ) {
die('Internal error: n=2 but no edges in the quadrant was find to determine type.');
}
 
switch( $type ) {
case 0: //North-South
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row+1,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($col+1,$row,$x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 1: // West-East
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col+1,$row,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1,$col,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
break;
 
case 2: // West-North
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$col+1,$row+1,$col,$row+1,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 3: // East-North
 
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** East-North<br>";
// }
 
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
//
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** E_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** E($x1,$y1)<br>";
// }
 
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** N_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** N($x2,$y2)<br>";
// }
// if( $row==3 && $col==1 && $n==2 )
// $canvas->Line($x1,$y1,$x2,$y2,'blue');
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
$polygon = array($col,$row,$x2,$y2,$x1,$y1,$col+1,$row+1,$col,$row+1,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
break;
 
case 4: // West-South
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row,$col,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 5: // East-South
 
//
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** Sout-East<br>";
// }
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
 
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** E_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** E($x1,$y1)<br>";
// }
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** S_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** S($x2,$y2)<br>";
// }
 
$polygon = array($col+1,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
$polygon = array($x1,$y1,$x2,$y2,$col,$row+1,$col,$row,$col+1,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
break;
 
}
 
}
 
}
}
 
}
}
 
 
class ContCanvas {
public $g;
public $shape,$scale;
function __construct($xmax=6,$ymax=6,$width=400,$height=400) {
 
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(5,5,5,5);
$this->g->SetMarginColor('white@1');
$this->g->InitFrame();
 
 
$this->shape->SetColor('gray');
for( $col=1; $col<$xmax; ++$col ) {
$this->shape->Line($col, 0, $col, $ymax);
}
for( $row=1; $row<$ymax; ++$row ) {
$this->shape->Line(0, $row, $xmax, $row);
}
}
 
function SetDatapoints($datapoints) {
$ny=count($datapoints);
$nx=count($datapoints[0]);
$t = new Text();
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
for( $x=0; $x < $nx; ++$x ) {
for( $y=0; $y < $ny; ++$y ) {
list($x1,$y1) = $this->scale->Translate($x,$y);
 
if( $datapoints[$y][$x] > 0 )
$t->SetColor('blue');
else
$t->SetColor('black');
$t->SetFont(FF_ARIAL,FS_BOLD,8);
$t->Set($datapoints[$y][$x]);
$t->Stroke($this->g->img,$x1,$y1);
 
$t->SetColor('gray');
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
$t->Set("($y,$x)");
$t->Stroke($this->g->img,$x1+10,$y1);
 
}
}
}
 
function DrawLinePolygons($p,$color='red') {
$this->shape->SetColor($color);
for ($i = 0 ; $i < count($p) ; $i++) {
$x1 = $p[$i][0][0]; $y1 = $p[$i][0][1];
for ($j = 1 ; $j < count($p[$i]) ; $j++) {
$x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1];
$this->shape->Line($x1, $y1, $x2, $y2);
$x1=$x2; $y1=$y2;
}
}
}
 
function Line($x1,$y1,$x2,$y2,$color='red') {
$this->shape->SetColor($color);
$this->shape->Line($x1, $y1, $x2, $y2);
}
function Polygon($p,$color='blue') {
$this->shape->SetColor($color);
$this->shape->Polygon($p);
}
 
function FilledPolygon($p,$color='lightblue') {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
 
function Point($x,$y,$color) {
list($x1,$y1) = $this->scale->Translate($x, $y);
$this->shape->SetColor($color);
$this->g->img->Point($x1,$y1);
}
 
function Stroke() {
$this->g->Stroke();
}
 
}
 
 
class PixelFill {
 
private $edges,$dataPoints,$colors,$isoBars;
 
function __construct(&$edges,&$dataPoints,$isoBars,$colors) {
$this->edges = $edges;
$this->dataPoints = $dataPoints;
$this->colors = $colors;
$this->isoBars = $isoBars;
}
 
function GetIsobarColor($val) {
for ($i = 0 ; $i < count($this->isoBars) ; $i++) {
if( $val <= $this->isoBars[$i] ) {
return $this->colors[$i];
}
}
return $this->colors[$i]; // The color for all values above the highest isobar
}
 
function Fill(ContCanvas $canvas) {
 
$nx_vertices = count($this->dataPoints[0]);
$ny_vertices = count($this->dataPoints);
 
// Loop through all squares in the grid
for($col=0; $col < $nx_vertices-1; ++$col) {
for($row=0; $row < $ny_vertices-1; ++$row) {
 
$v=array(
$this->dataPoints[$row][$col],
$this->dataPoints[$row][$col+1],
$this->dataPoints[$row+1][$col+1],
$this->dataPoints[$row+1][$col],
);
list($x1,$y1) = $canvas->scale->Translate($col, $row);
list($x2,$y2) = $canvas->scale->Translate($col+1, $row+1);
 
for( $x=$x1; $x < $x2; ++$x ) {
for( $y=$y1; $y < $y2; ++$y ) {
 
$v1 = $v[0] + ($v[1]-$v[0])*($x-$x1)/($x2-$x1);
$v2 = $v[3] + ($v[2]-$v[3])*($x-$x1)/($x2-$x1);
$val = $v1 + ($v2-$v1)*($y-$y1)/($y2-$y1);
 
if( $row==2 && $col==2 ) {
//echo " ($val ($x,$y)) (".$v[0].",".$v[1].",".$v[2].",".$v[3].")<br>";
}
$color = $this->GetIsobarColor($val);
$canvas->g->img->SetColor($color);
$canvas->g->img->Point($x, $y);
}
}
}
}
 
}
 
}
 
$edges=array(array(),array(),array());
$datapoints=array();
for($col=0; $col<6; $col++) {
for($row=0; $row<6; $row++) {
$datapoints[$row][$col]=0;
$edges[VERT_EDGE][$row][$col] = false;
$edges[HORIZ_EDGE][$row][$col] = false;
}
}
 
$datapoints[1][2] = 2;
$datapoints[2][1] = 1;
$datapoints[2][2] = 7;
$datapoints[2][3] = 2;
$datapoints[3][1] = 2;
$datapoints[3][2] = 17;
$datapoints[3][3] = 4;
$datapoints[4][2] = 3;
 
$datapoints[1][4] = 12;
 
$edges[VERT_EDGE][1][2] = true;
$edges[VERT_EDGE][3][2] = true;
 
$edges[HORIZ_EDGE][2][1] = true;
$edges[HORIZ_EDGE][2][2] = true;
$edges[HORIZ_EDGE][3][1] = true;
$edges[HORIZ_EDGE][3][2] = true;
 
 
 
$isobars = array(5,10,15);
$colors = array('lightgray','lightblue','lightred','red');
 
$engine = new PixelFill($edges, $datapoints, $isobars, $colors);
$canvas = new ContCanvas();
$engine->Fill($canvas);
$canvas->SetDatapoints($datapoints);
$canvas->Stroke();
die();
 
 
//$tst = new Findpolygon();
//$p1 = $tst->SetupTestData();
//
//$canvas = new ContCanvas();
//for ($i = 0 ; $i < count($tst->contourCoord); $i++) {
// $canvas->DrawLinePolygons($tst->contourCoord[$i]);
//}
//
//$p2 = $tst->FindPolygons();
//for ($i = 0 ; $i < count($p2) ; $i++) {
// $canvas->FilledPolygon($tst->flattenEdges($p2[$i]));
//}
//
//for ($i = 0 ; $i < count($p2) ; $i++) {
// $canvas->Polygon($tst->flattenEdges($p2[$i]));
//}
//
//$canvas->Stroke();
//die();
 
 
//for( $trial = 0; $trial < 1; ++$trial ) {
// echo "\nTest $trial:\n";
// echo "========================================\n";
// $tst = new Findpolygon();
// $p1 = $tst->SetupTestData();
//
// // for ($i = 0 ; $i < count($p1) ; $i++) {
// // echo "Test polygon $i:\n";
// // echo "---------------------\n";
// // $tst->p_edges($tst->contourCoord[$i]);
// // echo "\n";
// // }
// //
// $p2 = $tst->FindPolygons();
// $npol = count($p2);
// //echo "\n** Found $npol separate polygon chains.\n\n";
//
// for( $i=0; $i<$npol; ++$i ) {
//
// $res_forward = $tst->CompareCyclic($p1[$i], $p2[$i],true);
// $res_backward = $tst->CompareCyclic($p1[$i], $p2[$i],false);
// if( $res_backward || $res_forward ) {
// // if( $res_forward )
// // echo "Forward matches!\n";
// // else
// // echo "Backward matches!\n";
// }
// else {
// echo "********** NO MATCH!!.\n\n";
// echo "\nBefore find:\n";
// for ($j = 0 ; $j < count($p1[$i]) ; $j++) {
// echo "(".$p1[$i][$j][0].','.$p1[$i][$j][1]."), ";
// }
// echo "\n";
//
// echo "\nAfter find:\n";
// for ($j = 0 ; $j < count($p2[$i]) ; $j++) {
// echo "(".$p2[$i][$j][0].','.$p2[$i][$j][1]."), ";
// }
// echo "\n";
// }
//
// }
//}
//
//echo "\n\nAll tests ready.\n\n";
//
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/contour_dev/tri-quad.php
New file
0,0 → 1,790
<?php
require_once '../jpgraph.php';
require_once '../jpgraph_canvas.php';
require_once '../jpgraph_canvtools.php';
 
 
class ContCanvas {
public $g;
public $shape,$scale;
function __construct($xmax=5,$ymax=5,$width=350,$height=350) {
 
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(2,2,2,2);
$this->g->SetMarginColor('white@1');
$this->g->InitFrame();
}
 
function StrokeGrid() {
list($xmin,$xmax,$ymin,$ymax) = $this->scale->Get();
$this->shape->SetColor('gray');
for( $col=1; $col<$xmax; ++$col ) {
$this->shape->Line($col, 0, $col, $ymax);
}
for( $row=1; $row<$ymax; ++$row ) {
$this->shape->Line(0, $row, $xmax, $row);
}
}
 
function SetDatapoints($datapoints) {
$ny=count($datapoints);
$nx=count($datapoints[0]);
$t = new Text();
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
for( $x=0; $x < $nx; ++$x ) {
for( $y=0; $y < $ny; ++$y ) {
list($x1,$y1) = $this->scale->Translate($x,$y);
 
if( $datapoints[$y][$x] > 0 )
$t->SetColor('blue');
else
$t->SetColor('black');
$t->SetFont(FF_ARIAL,FS_BOLD,8);
$t->Set($datapoints[$y][$x]);
$t->Stroke($this->g->img,$x1,$y1);
 
$t->SetColor('gray');
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
$t->Set("($y,$x)");
$t->Stroke($this->g->img,$x1+10,$y1);
 
}
}
}
 
function DrawLinePolygons($p,$color='red') {
$this->shape->SetColor($color);
for ($i = 0 ; $i < count($p) ; $i++) {
$x1 = $p[$i][0][0]; $y1 = $p[$i][0][1];
for ($j = 1 ; $j < count($p[$i]) ; $j++) {
$x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1];
$this->shape->Line($x1, $y1, $x2, $y2);
$x1=$x2; $y1=$y2;
}
}
}
 
function Line($x1,$y1,$x2,$y2,$color='red') {
$this->shape->SetColor($color);
$this->shape->Line($x1, $y1, $x2, $y2);
}
function Polygon($p,$color='blue') {
$this->shape->SetColor($color);
$this->shape->Polygon($p);
}
 
function FilledPolygon($p,$color='lightblue') {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
 
function Point($x,$y,$color) {
list($x1,$y1) = $this->scale->Translate($x, $y);
$this->shape->SetColor($color);
$this->g->img->Point($x1,$y1);
}
 
function Stroke() {
$this->g->Stroke();
}
 
}
 
// Calculate the area for a simple polygon. This will not work for
// non-simple polygons, i.e. self crossing.
function polygonArea($aX, $aY) {
$n = count($aX);
$area = 0 ;
$j = 0 ;
for ($i=0; $i < $n; $i++) {
$j++;
if ( $j == $n) {
$j=0;
}
$area += ($aX[i]+$aX[j])*($aY[i]-$aY[j]);
}
return area*.5;
}
 
class SingleTestTriangle {
const contval=5;
static $maxdepth=2;
static $cnt=0;
static $t;
public $g;
public $shape,$scale;
public $cont = array(2,4,5);
public $contcolors = array('yellow','purple','seagreen','green','lightblue','blue','teal','orange','red','darkred','brown');
public $dofill=false;
public $showtriangulation=false,$triangulation_color="lightgray";
public $showannotation=false;
public $contlinecolor='black',$showcontlines=true;
private $labels = array(), $showlabels=false;
private $labelColor='black',$labelFF=FF_ARIAL,$labelFS=FS_BOLD,$labelFSize=9;
 
function __construct($width,$height,$nx,$ny) {
$xmax=$nx+0.1;$ymax=$ny+0.1;
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, -0.1, $xmax, -0.1, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(2,2,2,2);
$this->g->SetMarginColor('white@1');
//$this->g->InitFrame();
 
self::$t = new Text();
self::$t->SetColor('black');
self::$t->SetFont(FF_ARIAL,FS_BOLD,9);
self::$t->SetAlign('center','center');
}
 
function getPlotSize() {
return array($this->g->img->width,$this->g->img->height);
}
 
function SetContours($c) {
$this->cont = $c;
}
 
function ShowLabels($aFlg=true) {
$this->showlabels = $aFlg;
}
 
function ShowLines($aFlg=true) {
$this->showcontlines=$aFlg;
}
 
function SetFilled($f=true) {
$this->dofill = $f;
}
 
function ShowTriangulation($f=true) {
$this->showtriangulation = $f;
}
 
function Stroke() {
$this->g->Stroke();
}
 
function FillPolygon($color,&$p) {
self::$cnt++;
if( $this->dofill ) {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
if( $this->showtriangulation ) {
$this->shape->SetColor($this->triangulation_color);
$this->shape->Polygon($p);
}
}
function GetNextHigherContourIdx($val) {
for( $i=0; $i < count($this->cont); ++$i ) {
if( $val < $this->cont[$i] ) return $i;
}
return count($this->cont);
}
 
function GetContVal($v1) {
for( $i=0; $i < count($this->cont); ++$i ) {
if( $this->cont[$i] > $v1 ) {
return $this->cont[$i];
}
}
die('No contour value is larger or equal than : '.$v1);
}
function GetColor($v) {
return $this->contcolors[$this->GetNextHigherContourIdx($v)];
}
 
function storeAnnotation($x1,$y1,$v1,$angle) {
$this->labels[$this->GetNextHigherContourIdx($v1)][] = array($x1,$y1,$v1,$angle);
}
 
function labelProx($x1,$y1,$v1) {
 
list($w,$h) = $this->getPlotSize();
 
 
if( $x1 < 20 || $x1 > $w-20 )
return true;
 
if( $y1 < 20 || $y1 > $h-20 )
return true;
if( !isset ($this->labels[$this->GetNextHigherContourIdx($v1)]) ) {
return false;
}
$p = $this->labels[$this->GetNextHigherContourIdx($v1)];
$n = count($p);
$d = 999999;
for ($i = 0 ; $i < $n ; $i++) {
$xp = $p[$i][0];
$yp = $p[$i][1];
$d = min($d, ($x1-$xp)*($x1-$xp) + ($y1-$yp)*($y1-$yp));
}
$limit = $w*$h/9;
$limit = max(min($limit,20000),3500);
if( $d < $limit ) return true;
else return false;
}
 
function putLabel($x1,$y1,$x2,$y2,$v1) {
 
$angle = 0;
if( $x2 - $x1 != 0 ) {
$grad = ($y2-$y1)/($x2-$x1);
$angle = -(atan($grad) * 180/M_PI);
self::$t->SetAngle($angle);
}
 
$x = $this->scale->TranslateX($x1);
$y = $this->scale->TranslateY($y1);
if( !$this->labelProx($x, $y, $v1) ) {
$this->storeAnnotation($x, $y, $v1, $angle);
}
}
 
function strokeLabels() {
$t = new Text();
$t->SetColor($this->labelColor);
$t->SetFont($this->labelFF,$this->labelFS,$this->labelFSize);
$t->SetAlign('center','center');
 
foreach ($this->labels as $cont_idx => $pos) {
if( $cont_idx >= 10 ) return;
foreach ($pos as $idx => $coord) {
$t->Set( sprintf("%.1f",$coord[2]) );
$t->SetAngle($coord[3]);
$t->Stroke($this->g->img,$coord[0],$coord[1]);
}
}
}
 
function annotate($x1,$y1,$x2,$y2,$x1p,$y1p,$v1,$v2,$v1p) {
if( !$this->showannotation ) return;
/*
$this->g->img->SetColor('green');
$this->g->img->FilledCircle($this->scale->TranslateX($x1),$this->scale->TranslateY($y1), 4);
$this->g->img->FilledCircle($this->scale->TranslateX($x2),$this->scale->TranslateY($y2), 4);
 
$this->g->img->SetColor('red');
$this->g->img->FilledCircle($this->scale->TranslateX($x1p),$this->scale->TranslateY($y1p), 4);
*/
//self::$t->Set(sprintf("%.1f",$v1,$this->VC($v1)));
//self::$t->Stroke($this->g->img,$this->scale->TranslateX($x1),$this->scale->TranslateY($y1));
//self::$t->Set(sprintf("%.1f",$v2,$this->VC($v2)));
//self::$t->Stroke($this->g->img,$this->scale->TranslateX($x2),$this->scale->TranslateY($y2));
 
$x = $this->scale->TranslateX($x1p);
$y = $this->scale->TranslateY($y1p);
if( !$this->labelProx($x, $y, $v1p) ) {
$this->storeAnnotation($x, $y, $v1p);
self::$t->Set(sprintf("%.1f",$v1p,$this->VC($v1p)));
self::$t->Stroke($this->g->img,$x,$y);
}
}
 
function Pertubate(&$v1,&$v2,&$v3,&$v4) {
$pert = 0.9999;
$n = count($this->cont);
for($i=0; $i < $n; ++$i) {
if( $v1==$this->cont[$i] ) {
$v1 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v2==$this->cont[$i] ) {
$v2 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v3==$this->cont[$i] ) {
$v3 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v4==$this->cont[$i] ) {
$v4 *= $pert;
break;
}
}
}
 
function interp2($x1,$y1,$x2,$y2,$v1,$v2) {
$cv = $this->GetContVal(min($v1,$v2));
$alpha = ($v1-$cv)/($v1-$v2);
$x1p = $x1*(1-$alpha) + $x2*$alpha;
$y1p = $y1*(1-$alpha) + $y2*$alpha;
$v1p = $v1 + $alpha*($v2-$v1);
return array($x1p,$y1p,$v1p);
}
 
function RectFill($v1,$v2,$v3,$v4,$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4,$depth) {
if( $depth >= self::$maxdepth ) {
// Abort and just appoximate the color of this area
// with the average of the three values
$color = $this->GetColor(($v1+$v2+$v3+$v4)/4);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
 
$this->Pertubate($v1,$v2,$v3,$v4);
 
$fcnt = 0 ;
$vv1 = $this->GetNextHigherContourIdx($v1);
$vv2 = $this->GetNextHigherContourIdx($v2);
$vv3 = $this->GetNextHigherContourIdx($v3);
$vv4 = $this->GetNextHigherContourIdx($v4);
$eps = 0.0001;
 
if( $vv1 == $vv2 && $vv2 == $vv3 && $vv3 == $vv4 ) {
$color = $this->GetColor($v1);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
 
$dv1 = abs($vv1-$vv2);
$dv2 = abs($vv2-$vv3);
$dv3 = abs($vv3-$vv4);
$dv4 = abs($vv1-$vv4);
if( $dv1 == 1 ) {
list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2);
$fcnt++;
}
if( $dv2 == 1 ) {
list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3);
$fcnt++;
}
if( $dv3 == 1 ) {
list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x4,$y4,$v3,$v4);
$fcnt++;
}
 
if( $dv4 == 1 ) {
list($x4p,$y4p,$v4p) = $this->interp2($x4,$y4,$x1,$y1,$v4,$v1);
$fcnt++;
}
 
$totdv = $dv1 + $dv2 + $dv3 + $dv4 ;
if( ($fcnt == 2 && $totdv==2) || ($fcnt == 4 && $totdv==4) ) {
 
if( $fcnt == 2 && $totdv==2 ) {
 
if( $dv1 == 1 && $dv2 == 1) {
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
$color2 = $this->GetColor($v4);
$p2 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x1,$y1);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x2p,$y2p);
$v = $v1p;
}
elseif( $dv1 == 1 && $dv3 == 1 ) {
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p);
$color2 = $this->GetColor($v4);
$p2 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x4,$y4,$x1,$y1);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x3p,$y3p);
$v = $v1p;
}
elseif( $dv1 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x4p,$y4p);
$v = $v1p;
}
elseif( $dv2 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x4p,$y4p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x4p,$y4p);
 
$color = $this->GetColor($v2p);
$p = array($x2p,$y2p,$x4p,$y4p);
$v = $v2p;
}
elseif( $dv2 == 1 && $dv3 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$color = $this->GetColor($v2p);
$p = array($x2p,$y2p,$x3p,$y3p);
$v = $v2p;
}
elseif( $dv3 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v4);
$p2 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$color = $this->GetColor($v4p);
$p = array($x4p,$y4p,$x3p,$y3p);
$v = $v4p;
}
 
$this->FillPolygon($color1,$p1);
$this->FillPolygon($color2,$p2);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
}
else {
$this->shape->SetColor($color);
}
$this->shape->Line($p[0],$p[1],$p[2],$p[3]);
}
if( $this->showlabels ) {
$this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2],$p[3] , $v);
}
}
elseif( $fcnt == 4 && $totdv==4 ) {
$vc = ($v1+$v2+$v3+$v4)/4;
 
if( $v1p == $v2p && $v2p == $v3p && $v3p == $v4p ) {
// Four edge crossings (saddle point) of the same contour
// so we first need to
// find out how the saddle is crossing "/" or "\"
 
if( $this->GetNextHigherContourIdx($vc) == $this->GetNextHigherContourIdx($v1) ) {
// "\"
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
 
$color2 = $this->GetColor($v2);
$p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color3 = $color1;
$p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x4p,$y4p);
$colorl2 = $this->GetColor($v2p);
$pl2 = array($x2p,$y2p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v2p;
 
}
else {
// "/"
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
 
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p);
 
$color3 = $color1;
$p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x2p,$y2p);
$colorl2 = $this->GetColor($v4p);
$pl2 = array($x4p,$y4p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v4p;
}
}
else {
// There are two different contours crossing so we need to find
// out which belongs to which
if( $v1p == $v2p ) {
// "/"
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
 
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p);
 
$color3 = $this->GetColor($v4);
$p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x2p,$y2p);
$colorl2 = $this->GetColor($v4p);
$pl2 = array($x4p,$y4p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v4p;
}
else { //( $v1p == $v4p )
// "\"
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
 
$color2 = $this->GetColor($v2);
$p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color3 = $this->GetColor($v3);
$p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x4p,$y4p);
$colorl2 = $this->GetColor($v2p);
$pl2 = array($x2p,$y2p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v2p;
}
}
$this->FillPolygon($color1,$p1);
$this->FillPolygon($color2,$p2);
$this->FillPolygon($color3,$p3);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
$this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]);
$this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]);
}
else {
$this->shape->SetColor($colorl1);
$this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]);
$this->shape->SetColor($colorl2);
$this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]);
}
}
if( $this->showlabels ) {
$this->putLabel( ($pl1[0]+$pl1[2])/2, ($pl1[1]+$pl1[3])/2, $pl1[2], $pl1[3], $vl1);
$this->putLabel( ($pl2[0]+$pl2[2])/2, ($pl2[1]+$pl2[3])/2, $pl2[2], $pl2[3],$vl2);
}
}
}
else {
$vc = ($v1+$v2+$v3+$v4)/4;
$xc = ($x1+$x4)/2;
$yc = ($y1+$y2)/2;
 
// Top left
$this->RectFill(($v1+$v2)/2, $v2, ($v2+$v3)/2, $vc,
$x1,$yc, $x2,$y2, $xc,$y2, $xc,$yc, $depth+1);
// Top right
$this->RectFill($vc, ($v2+$v3)/2, $v3, ($v3+$v4)/2,
$xc,$yc, $xc,$y2, $x3,$y3, $x3,$yc, $depth+1);
 
// Bottom left
$this->RectFill($v1, ($v1+$v2)/2, $vc, ($v1+$v4)/2,
$x1,$y1, $x1,$yc, $xc,$yc, $xc,$y4, $depth+1);
 
// Bottom right
$this->RectFill(($v1+$v4)/2, $vc, ($v3+$v4)/2, $v4,
$xc,$y1, $xc,$yc, $x3,$yc, $x4,$y4, $depth+1);
 
}
}
}
}
 
function TriFill($v1,$v2,$v3,$x1,$y1,$x2,$y2,$x3,$y3,$depth) {
if( $depth >= self::$maxdepth ) {
// Abort and just appoximate the color of this area
// with the average of the three values
$color = $this->GetColor(($v1+$v2+$v3)/3);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
// In order to avoid some real unpleasentness in case a vertice is exactly
// the same value as a contour we pertuberate them so that we do not end up
// in udefined situation. This will only affect the calculations and not the
// visual appearance
 
$dummy=0;
$this->Pertubate($v1,$v2,$v3,$dummy);
 
$fcnt = 0 ;
$vv1 = $this->GetNextHigherContourIdx($v1);
$vv2 = $this->GetNextHigherContourIdx($v2);
$vv3 = $this->GetNextHigherContourIdx($v3);
$eps = 0.0001;
 
if( $vv1 == $vv2 && $vv2 == $vv3 ) {
$color = $this->GetColor($v1);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
$dv1 = abs($vv1-$vv2);
$dv2 = abs($vv2-$vv3);
$dv3 = abs($vv1-$vv3);
 
if( $dv1 == 1 ) {
list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2);
$fcnt++;
}
else {
$x1p = ($x1+$x2)/2;
$y1p = ($y1+$y2)/2;
$v1p = ($v1+$v2)/2;
}
 
if( $dv2 == 1 ) {
list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3);
$fcnt++;
}
else {
$x2p = ($x2+$x3)/2;
$y2p = ($y2+$y3)/2;
$v2p = ($v2+$v3)/2;
}
 
if( $dv3 == 1 ) {
list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x1,$y1,$v3,$v1);
$fcnt++;
}
else {
$x3p = ($x3+$x1)/2;
$y3p = ($y3+$y1)/2;
$v3p = ($v3+$v1)/2;
}
 
if( $fcnt == 2 &&
((abs($v1p-$v2p) < $eps && $dv1 ==1 && $dv2==1 ) ||
(abs($v1p-$v3p) < $eps && $dv1 ==1 && $dv3==1 ) ||
(abs($v2p-$v3p) < $eps && $dv2 ==1 && $dv3==1 )) ) {
 
// This means that the contour line crosses exactly two sides
// and that the values of each vertice is such that only this
// contour line will cross this section.
// We can now be smart. The cotour line will simply divide the
// area in two polygons that we can fill and then return. There is no
// need to recurse.
// First find out which two sides the contour is crossing
if( abs($v1p-$v2p) < $eps ) {
$p4 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x1,$y1);
$color4 = $this->GetColor($v1);
$p3 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
$color3 = $this->GetColor($v2);
 
$p = array($x1p,$y1p,$x2p,$y2p);
$color = $this->GetColor($v1p);
$v = $v1p;
}
elseif( abs($v1p-$v3p) < $eps ) {
$p4 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p);
$color4 = $this->GetColor($v2);
$p3 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x1,$y1);
$color3 = $this->GetColor($v1);
 
$p = array($x1p,$y1p,$x3p,$y3p);
$color = $this->GetColor($v1p);
$v = $v1p;
}
else {
$p4 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x1,$y1);
$color4 = $this->GetColor($v2);
 
$p3 = array($x3p,$y3p,$x2p,$y2p,$x3,$y3,$x3p,$y3p);
$color3 = $this->GetColor($v3);
 
$p = array($x3p,$y3p,$x2p,$y2p);
$color = $this->GetColor($v3p);
$v = $v3p;
}
$this->FillPolygon($color4,$p4);
$this->FillPolygon($color3,$p3);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
}
else {
$this->shape->SetColor($color);
}
$this->shape->Line($p[0],$p[1],$p[2],$p[3]);
}
if( $this->showlabels ) {
$this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2], $p[3], $v);
}
}
else {
$this->TriFill($v1, $v1p, $v3p, $x1, $y1, $x1p, $y1p, $x3p, $y3p, $depth+1);
$this->TriFill($v1p, $v2, $v2p, $x1p, $y1p, $x2, $y2, $x2p, $y2p, $depth+1);
$this->TriFill($v3p, $v1p, $v2p, $x3p, $y3p, $x1p, $y1p, $x2p, $y2p, $depth+1);
$this->TriFill($v3p, $v2p, $v3, $x3p, $y3p, $x2p, $y2p, $x3, $y3, $depth+1);
}
}
}
}
 
function Fill($v1,$v2,$v3,$maxdepth) {
$x1=0; $y1=1;
$x2=1; $y2=0;
$x3=1; $y3=1;
self::$maxdepth = $maxdepth;
$this->TriFill($v1, $v2, $v3, $x1, $y1, $x2, $y2, $x3, $y3, 0);
}
 
function Fillmesh($meshdata,$maxdepth,$method='tri') {
$nx = count($meshdata[0]);
$ny = count($meshdata);
self::$maxdepth = $maxdepth;
for( $x=0; $x < $nx-1; ++$x ) {
for( $y=0; $y < $ny-1; ++$y ) {
$v1 = $meshdata[$y][$x];
$v2 = $meshdata[$y][$x+1];
$v3 = $meshdata[$y+1][$x+1];
$v4 = $meshdata[$y+1][$x];
 
if( $method == 'tri' ) {
// Fill upper and lower triangle
$this->TriFill($v4, $v1, $v2, $x, $y+1, $x, $y, $x+1, $y, 0);
$this->TriFill($v4, $v2, $v3, $x, $y+1, $x+1, $y, $x+1, $y+1, 0);
}
else {
$this->RectFill($v4, $v1, $v2, $v3, $x, $y+1, $x, $y, $x+1, $y, $x+1, $y+1, 0);
}
}
}
if( $this->showlabels ) {
$this->strokeLabels();
}
}
}
 
$meshdata = array(
array (12,12,10,10),
array (10,10,8,14),
array (7,7,13,17),
array (4,5,8,12),
array (10,8,7,8));
 
$tt = new SingleTestTriangle(400,400,count($meshdata[0])-1,count($meshdata)-1);
$tt->SetContours(array(4.7, 6.0, 7.2, 8.6, 9.9, 11.2, 12.5, 13.8, 15.1, 16.4));
$tt->SetFilled(true);
 
//$tt->ShowTriangulation(true);
$tt->ShowLines(true);
 
//$tt->ShowLabels(true);
$tt->Fillmesh($meshdata, 8, 'rect');
 
//$tt->Fill(4.0,3.0,7.0, 4);
//$tt->Fill(7,4,1,5);
//$tt->Fill(1,7,4,5);
 
$tt->Stroke();
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_line.php
New file
0,0 → 1,682
<?php
/*=======================================================================
// File: JPGRAPH_LINE.PHP
// Description: Line plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_line.php 1921 2009-12-11 11:46:39Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once ('jpgraph_plotmark.inc.php');
 
// constants for the (filled) area
DEFINE("LP_AREA_FILLED", true);
DEFINE("LP_AREA_NOT_FILLED", false);
DEFINE("LP_AREA_BORDER",false);
DEFINE("LP_AREA_NO_BORDER",true);
 
//===================================================
// CLASS LinePlot
// Description:
//===================================================
class LinePlot extends Plot{
public $mark=null;
protected $filled=false;
protected $fill_color='blue';
protected $step_style=false, $center=false;
protected $line_style=1; // Default to solid
protected $filledAreas = array(); // array of arrays(with min,max,col,filled in them)
public $barcenter=false; // When we mix line and bar. Should we center the line in the bar.
protected $fillFromMin = false, $fillFromMax = false;
protected $fillgrad=false,$fillgrad_fromcolor='navy',$fillgrad_tocolor='silver',$fillgrad_numcolors=100;
protected $iFastStroke=false;
 
//---------------
// CONSTRUCTOR
function LinePlot($datay,$datax=false) {
parent::__construct($datay,$datax);
$this->mark = new PlotMark() ;
$this->color = ColorFactory::getColor();
$this->fill_color = $this->color;
}
//---------------
// PUBLIC METHODS
 
function SetFilled($aFlg=true) {
$this->filled = $aFlg;
}
 
function SetBarCenter($aFlag=true) {
$this->barcenter=$aFlag;
}
 
function SetStyle($aStyle) {
$this->line_style=$aStyle;
}
 
function SetStepStyle($aFlag=true) {
$this->step_style = $aFlag;
}
 
function SetColor($aColor) {
parent::SetColor($aColor);
}
 
function SetFillFromYMin($f=true) {
$this->fillFromMin = $f ;
}
 
function SetFillFromYMax($f=true) {
$this->fillFromMax = $f ;
}
 
function SetFillColor($aColor,$aFilled=true) {
//$this->color = $aColor;
$this->fill_color=$aColor;
$this->filled=$aFilled;
}
 
function SetFillGradient($aFromColor,$aToColor,$aNumColors=100,$aFilled=true) {
$this->fillgrad_fromcolor = $aFromColor;
$this->fillgrad_tocolor = $aToColor;
$this->fillgrad_numcolors = $aNumColors;
$this->filled = $aFilled;
$this->fillgrad = true;
}
 
function Legend($graph) {
if( $this->legend!="" ) {
if( $this->filled && !$this->fillgrad ) {
$graph->legend->Add($this->legend,
$this->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->fillgrad ) {
$color=array($this->fillgrad_fromcolor,$this->fillgrad_tocolor);
// In order to differentiate between gradients and cooors specified as an RGB triple
$graph->legend->Add($this->legend,$color,"",-2 /* -GRAD_HOR */,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
} else {
$graph->legend->Add($this->legend,
$this->color,$this->mark,$this->line_style,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
function AddArea($aMin=0,$aMax=0,$aFilled=LP_AREA_NOT_FILLED,$aColor="gray9",$aBorder=LP_AREA_BORDER) {
if($aMin > $aMax) {
// swap
$tmp = $aMin;
$aMin = $aMax;
$aMax = $tmp;
}
$this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder);
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust($graph) {
 
// If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
if( empty($graph->xaxis->scale->ticks->xlabel_offset) || $graph->xaxis->scale->ticks->xlabel_offset == 0 ) {
if( $this->center ) {
++$this->numpoints;
$a=0.5; $b=0.5;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
}
 
function SetFastStroke($aFlg=true) {
$this->iFastStroke = $aFlg;
}
 
function FastStroke($img,$xscale,$yscale,$aStartPoint=0,$exist_x=true) {
// An optimized stroke for many data points with no extra
// features but 60% faster. You can't have values or line styles, or null
// values in plots.
$numpoints=count($this->coords[0]);
if( $this->barcenter ) {
$textadj = 0.5-$xscale->text_scale_off;
}
else {
$textadj = 0;
}
 
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$pnts=$aStartPoint;
while( $pnts < $numpoints ) {
if( $exist_x ) {
$x=$this->coords[1][$pnts];
}
else {
$x=$pnts+$textadj;
}
$xt = $xscale->Translate($x);
$y=$this->coords[0][$pnts];
$yt = $yscale->Translate($y);
if( is_numeric($y) ) {
$cord[] = $xt;
$cord[] = $yt;
}
elseif( $y == '-' && $pnts > 0 ) {
// Just ignore
}
else {
JpGraphError::RaiseL(10002);//('Plot too complicated for fast line Stroke. Use standard Stroke()');
}
++$pnts;
} // WHILE
 
$img->Polygon($cord,false,true);
}
 
function Stroke($img,$xscale,$yscale) {
$idx=0;
$numpoints=count($this->coords[0]);
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints ) {
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
}
else {
$exist_x = true;
}
}
else {
$exist_x = false;
}
 
if( $this->barcenter ) {
$textadj = 0.5-$xscale->text_scale_off;
}
else {
$textadj = 0;
}
 
// Find the first numeric data point
$startpoint=0;
while( $startpoint < $numpoints && !is_numeric($this->coords[0][$startpoint]) ) {
++$startpoint;
}
 
// Bail out if no data points
if( $startpoint == $numpoints ) return;
 
if( $this->iFastStroke ) {
$this->FastStroke($img,$xscale,$yscale,$startpoint,$exist_x);
return;
}
 
if( $exist_x ) {
$xs=$this->coords[1][$startpoint];
}
else {
$xs= $textadj+$startpoint;
}
 
$img->SetStartPoint($xscale->Translate($xs),
$yscale->Translate($this->coords[0][$startpoint]));
 
if( $this->filled ) {
if( $this->fillFromMax ) {
//$max = $yscale->GetMaxVal();
$cord[$idx++] = $xscale->Translate($xs);
$cord[$idx++] = $yscale->scale_abs[1];
}
else {
$min = $yscale->GetMinVal();
if( $min > 0 || $this->fillFromMin ) {
$fillmin = $yscale->scale_abs[0];//Translate($min);
}
else {
$fillmin = $yscale->Translate(0);
}
 
$cord[$idx++] = $xscale->Translate($xs);
$cord[$idx++] = $fillmin;
}
}
$xt = $xscale->Translate($xs);
$yt = $yscale->Translate($this->coords[0][$startpoint]);
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
$yt_old = $yt;
$xt_old = $xt;
$y_old = $this->coords[0][$startpoint];
 
$this->value->Stroke($img,$this->coords[0][$startpoint],$xt,$yt);
 
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$img->SetLineStyle($this->line_style);
$pnts=$startpoint+1;
$firstnonumeric = false;
 
 
while( $pnts < $numpoints ) {
 
if( $exist_x ) {
$x=$this->coords[1][$pnts];
}
else {
$x=$pnts+$textadj;
}
$xt = $xscale->Translate($x);
$yt = $yscale->Translate($this->coords[0][$pnts]);
 
$y=$this->coords[0][$pnts];
if( $this->step_style ) {
// To handle null values within step style we need to record the
// first non numeric value so we know from where to start if the
// non value is '-'.
if( is_numeric($y) ) {
$firstnonumeric = false;
if( is_numeric($y_old) ) {
$img->StyleLine($xt_old,$yt_old,$xt,$yt_old);
$img->StyleLine($xt,$yt_old,$xt,$yt);
}
elseif( $y_old == '-' ) {
$img->StyleLine($xt_first,$yt_first,$xt,$yt_first);
$img->StyleLine($xt,$yt_first,$xt,$yt);
}
else {
$yt_old = $yt;
$xt_old = $xt;
}
$cord[$idx++] = $xt;
$cord[$idx++] = $yt_old;
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
elseif( $firstnonumeric==false ) {
$firstnonumeric = true;
$yt_first = $yt_old;
$xt_first = $xt_old;
}
}
else {
$tmp1=$y;
$prev=$this->coords[0][$pnts-1];
if( $tmp1==='' || $tmp1===NULL || $tmp1==='X' ) $tmp1 = 'x';
if( $prev==='' || $prev===null || $prev==='X' ) $prev = 'x';
 
if( is_numeric($y) || (is_string($y) && $y != '-') ) {
if( is_numeric($y) && (is_numeric($prev) || $prev === '-' ) ) {
$img->StyleLineTo($xt,$yt);
}
else {
$img->SetStartPoint($xt,$yt);
}
}
if( $this->filled && $tmp1 !== '-' ) {
if( $tmp1 === 'x' ) {
$cord[$idx++] = $cord[$idx-3];
$cord[$idx++] = $fillmin;
}
elseif( $prev === 'x' ) {
$cord[$idx++] = $xt;
$cord[$idx++] = $fillmin;
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
else {
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
}
else {
if( is_numeric($tmp1) && (is_numeric($prev) || $prev === '-' ) ) {
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
}
}
$yt_old = $yt;
$xt_old = $xt;
$y_old = $y;
 
$this->StrokeDataValue($img,$this->coords[0][$pnts],$xt,$yt);
 
++$pnts;
}
 
if( $this->filled ) {
$cord[$idx++] = $xt;
if( $this->fillFromMax ) {
$cord[$idx++] = $yscale->scale_abs[1];
}
else {
if( $min > 0 || $this->fillFromMin ) {
$cord[$idx++] = $yscale->Translate($min);
}
else {
$cord[$idx++] = $yscale->Translate(0);
}
}
if( $this->fillgrad ) {
$img->SetLineWeight(1);
$grad = new Gradient($img);
$grad->SetNumColors($this->fillgrad_numcolors);
$grad->FilledFlatPolygon($cord,$this->fillgrad_fromcolor,$this->fillgrad_tocolor);
$img->SetLineWeight($this->weight);
}
else {
$img->SetColor($this->fill_color);
$img->FilledPolygon($cord);
}
if( $this->weight > 0 ) {
$img->SetLineWeight($this->weight);
$img->SetColor($this->color);
// Remove first and last coordinate before drawing the line
// sine we otherwise get the vertical start and end lines which
// doesn't look appropriate
$img->Polygon(array_slice($cord,2,count($cord)-4));
}
}
 
if(!empty($this->filledAreas)) {
 
$minY = $yscale->Translate($yscale->GetMinVal());
$factor = ($this->step_style ? 4 : 2);
 
for($i = 0; $i < sizeof($this->filledAreas); ++$i) {
// go through all filled area elements ordered by insertion
// fill polygon array
$areaCoords[] = $cord[$this->filledAreas[$i][0] * $factor];
$areaCoords[] = $minY;
 
$areaCoords =
array_merge($areaCoords,
array_slice($cord,
$this->filledAreas[$i][0] * $factor,
($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor));
$areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x
$areaCoords[] = $minY; // last y
 
if($this->filledAreas[$i][3]) {
$img->SetColor($this->filledAreas[$i][2]);
$img->FilledPolygon($areaCoords);
$img->SetColor($this->color);
}
// Check if we should draw the frame.
// If not we still re-draw the line since it might have been
// partially overwritten by the filled area and it doesn't look
// very good.
if( $this->filledAreas[$i][4] ) {
$img->Polygon($areaCoords);
}
else {
$img->Polygon($cord);
}
 
$areaCoords = array();
}
}
 
if( $this->mark->type == -1 || $this->mark->show == false )
return;
 
for( $pnts=0; $pnts<$numpoints; ++$pnts) {
 
if( $exist_x ) {
$x=$this->coords[1][$pnts];
}
else {
$x=$pnts+$textadj;
}
$xt = $xscale->Translate($x);
$yt = $yscale->Translate($this->coords[0][$pnts]);
 
if( is_numeric($this->coords[0][$pnts]) ) {
if( !empty($this->csimtargets[$pnts]) ) {
if( !empty($this->csimwintargets[$pnts]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$pnts],$this->csimwintargets[$pnts]);
}
else {
$this->mark->SetCSIMTarget($this->csimtargets[$pnts]);
}
$this->mark->SetCSIMAlt($this->csimalts[$pnts]);
}
if( $exist_x ) {
$x=$this->coords[1][$pnts];
}
else {
$x=$pnts;
}
$this->mark->SetCSIMAltVal($this->coords[0][$pnts],$x);
$this->mark->Stroke($img,$xt,$yt);
$this->csimareas .= $this->mark->GetCSIMAreas();
}
}
}
} // Class
 
 
//===================================================
// CLASS AccLinePlot
// Description:
//===================================================
class AccLinePlot extends Plot {
protected $plots=null,$nbrplots=0;
private $iStartEndZero=true;
//---------------
// CONSTRUCTOR
function __construct($plots) {
$this->plots = $plots;
$this->nbrplots = count($plots);
$this->numpoints = $plots[0]->numpoints;
 
// Verify that all plots have the same number of data points
for( $i=1; $i < $this->nbrplots; ++$i ) {
if( $plots[$i]->numpoints != $this->numpoints ) {
JpGraphError::RaiseL(10003);//('Each plot in an accumulated lineplot must have the same number of data points',0)
}
}
 
for($i=0; $i < $this->nbrplots; ++$i ) {
$this->LineInterpolate($this->plots[$i]->coords[0]);
}
}
 
//---------------
// PUBLIC METHODS
function Legend($graph) {
foreach( $this->plots as $p ) {
$p->DoLegend($graph);
}
}
 
function Max() {
list($xmax) = $this->plots[0]->Max();
$nmax=0;
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$nc = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$nc);
list($x) = $this->plots[$i]->Max();
$xmax = Max($xmax,$x);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for line $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymax[$i] = $y;
}
$ymax = max($ymax);
return array($xmax,$ymax);
}
 
function Min() {
$nmax=0;
list($xmin,$ysetmin) = $this->plots[0]->Min();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$nc = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$nc);
list($x,$y) = $this->plots[$i]->Min();
$xmin = Min($xmin,$x);
$ysetmin = Min($y,$ysetmin);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for line $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots min y-value since that
// would in most cases give to small y-value.
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymin[$i] = $y;
}
$ymin = Min($ysetmin,Min($ymin));
return array($xmin,$ymin);
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust($graph) {
 
// If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
 
if( empty($graph->xaxis->scale->ticks->xlabel_offset) ||
$graph->xaxis->scale->ticks->xlabel_offset == 0 ) {
if( $this->center ) {
++$this->numpoints;
$a=0.5; $b=0.5;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
 
}
 
function SetInterpolateMode($aIntMode) {
$this->iStartEndZero=$aIntMode;
}
 
// Replace all '-' with an interpolated value. We use straightforward
// linear interpolation. If the data starts with one or several '-' they
// will be replaced by the the first valid data point
function LineInterpolate(&$aData) {
 
$n=count($aData);
$i=0;
 
// If first point is undefined we will set it to the same as the first
// valid data
if( $aData[$i]==='-' ) {
// Find the first valid data
while( $i < $n && $aData[$i]==='-' ) {
++$i;
}
if( $i < $n ) {
for($j=0; $j < $i; ++$j ) {
if( $this->iStartEndZero )
$aData[$i] = 0;
else
$aData[$j] = $aData[$i];
}
}
else {
// All '-' => Error
return false;
}
}
 
while($i < $n) {
while( $i < $n && $aData[$i] !== '-' ) {
++$i;
}
if( $i < $n ) {
$pstart=$i-1;
 
// Now see how long this segment of '-' are
while( $i < $n && $aData[$i] === '-' ) {
++$i;
}
if( $i < $n ) {
$pend=$i;
$size=$pend-$pstart;
$k=($aData[$pend]-$aData[$pstart])/$size;
// Replace the segment of '-' with a linear interpolated value.
for($j=1; $j < $size; ++$j ) {
$aData[$pstart+$j] = $aData[$pstart] + $j*$k ;
}
}
else {
// There are no valid end point. The '-' goes all the way to the end
// In that case we just set all the remaining values the the same as the
// last valid data point.
for( $j=$pstart+1; $j < $n; ++$j )
if( $this->iStartEndZero ) {
$aData[$j] = 0;
}
else {
$aData[$j] = $aData[$pstart] ;
}
}
}
}
return true;
}
 
// To avoid duplicate of line drawing code here we just
// change the y-values for each plot and then restore it
// after we have made the stroke. We must do this copy since
// it wouldn't be possible to create an acc line plot
// with the same graphs, i.e AccLinePlot(array($pl,$pl,$pl));
// since this method would have a side effect.
function Stroke($img,$xscale,$yscale) {
$img->SetLineWeight($this->weight);
$this->numpoints = count($this->plots[0]->coords[0]);
// Allocate array
$coords[$this->nbrplots][$this->numpoints]=0;
for($i=0; $i<$this->numpoints; $i++) {
$coords[0][$i]=$this->plots[0]->coords[0][$i];
$accy=$coords[0][$i];
for($j=1; $j<$this->nbrplots; ++$j ) {
$coords[$j][$i] = $this->plots[$j]->coords[0][$i]+$accy;
$accy = $coords[$j][$i];
}
}
for($j=$this->nbrplots-1; $j>=0; --$j) {
$p=$this->plots[$j];
for( $i=0; $i<$this->numpoints; ++$i) {
$tmp[$i]=$p->coords[0][$i];
$p->coords[0][$i]=$coords[$j][$i];
}
$p->Stroke($img,$xscale,$yscale);
for( $i=0; $i<$this->numpoints; ++$i) {
$p->coords[0][$i]=$tmp[$i];
}
$p->coords[0][]=$tmp;
}
}
} // Class
 
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_radar.php
New file
0,0 → 1,861
<?php
/*=======================================================================
// File: JPGRAPH_RADAR.PHP
// Description: Radar plot extension for JpGraph
// Created: 2001-02-04
// Ver: $Id: jpgraph_radar.php 1783 2009-08-25 11:41:01Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotmark.inc.php');
 
//===================================================
// CLASS RadarLogTicks
// Description: Logarithmic ticks
//===================================================
class RadarLogTicks extends Ticks {
 
function __construct() {
// Empty
}
 
function Stroke($aImg,&$grid,$aPos,$aAxisAngle,$aScale,&$aMajPos,&$aMajLabel) {
$start = $aScale->GetMinVal();
$limit = $aScale->GetMaxVal();
$nextMajor = 10*$start;
$step = $nextMajor / 10.0;
$count=1;
 
$ticklen_maj=5;
$dx_maj=round(sin($aAxisAngle)*$ticklen_maj);
$dy_maj=round(cos($aAxisAngle)*$ticklen_maj);
$ticklen_min=3;
$dx_min=round(sin($aAxisAngle)*$ticklen_min);
$dy_min=round(cos($aAxisAngle)*$ticklen_min);
 
$aMajPos=array();
$aMajLabel=array();
 
if( $this->supress_first ) {
$aMajLabel[] = '';
}
else {
$aMajLabel[]=$start;
}
 
$yr=$aScale->RelTranslate($start);
$xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($yr*sin($aAxisAngle));
$aMajPos[]=$xt+2*$dx_maj;
$aMajPos[]=$yt-$aImg->GetFontheight()/2;
$grid[]=$xt;
$grid[]=$yt;
 
$aImg->SetLineWeight($this->weight);
 
for($y=$start; $y<=$limit; $y+=$step,++$count ) {
$yr=$aScale->RelTranslate($y);
$xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($yr*sin($aAxisAngle));
if( $count % 10 == 0 ) {
$grid[]=$xt;
$grid[]=$yt;
$aMajPos[]=$xt+2*$dx_maj;
$aMajPos[]=$yt-$aImg->GetFontheight()/2;
if( !$this->supress_tickmarks ) {
if( $this->majcolor != '' ) {
$aImg->PushColor($this->majcolor);
}
$aImg->Line($xt+$dx_maj,$yt+$dy_maj,$xt-$dx_maj,$yt-$dy_maj);
if( $this->majcolor != '' ) {
$aImg->PopColor();
}
}
if( $this->label_formfunc != '' ) {
$f=$this->label_formfunc;
$l = call_user_func($f,$nextMajor);
}
else {
$l = $nextMajor;
}
 
$aMajLabel[]=$l;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else {
if( !$this->supress_minor_tickmarks ) {
if( $this->mincolor != '' ) {
$aImg->PushColor($this->mincolor);
}
$aImg->Line($xt+$dx_min,$yt+$dy_min,$xt-$dx_min,$yt-$dy_min);
if( $this->mincolor != '' ) {
$aImg->PopColor();
}
}
}
}
}
}
 
//===================================================
// CLASS RadarLinear
// Description: Linear ticks
//===================================================
class RadarLinearTicks extends Ticks {
 
private $minor_step=1, $major_step=2;
private $xlabel_offset=0,$xtick_offset=0;
 
function __construct() {
// Empty
}
 
// Return major step size in world coordinates
function GetMajor() {
return $this->major_step;
}
 
// Return minor step size in world coordinates
function GetMinor() {
return $this->minor_step;
}
 
// Set Minor and Major ticks (in world coordinates)
function Set($aMajStep,$aMinStep=false) {
if( $aMinStep==false ) {
$aMinStep=$aMajStep;
}
 
if( $aMajStep <= 0 || $aMinStep <= 0 ) {
JpGraphError::RaiseL(25064);
//JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem.");
}
 
$this->major_step=$aMajStep;
$this->minor_step=$aMinStep;
$this->is_set = true;
}
 
function Stroke($aImg,&$grid,$aPos,$aAxisAngle,$aScale,&$aMajPos,&$aMajLabel) {
// Prepare to draw linear ticks
$maj_step_abs = abs($aScale->scale_factor*$this->major_step);
$min_step_abs = abs($aScale->scale_factor*$this->minor_step);
$nbrmaj = round($aScale->world_abs_size/$maj_step_abs);
$nbrmin = round($aScale->world_abs_size/$min_step_abs);
$skip = round($nbrmin/$nbrmaj); // Don't draw minor on top of major
 
// Draw major ticks
$ticklen2=$this->major_abs_size;
$dx=round(sin($aAxisAngle)*$ticklen2);
$dy=round(cos($aAxisAngle)*$ticklen2);
$label=$aScale->scale[0]+$this->major_step;
 
$aImg->SetLineWeight($this->weight);
 
$aMajPos = array();
$aMajLabel = array();
 
for($i=1; $i<=$nbrmaj; ++$i) {
$xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle));
 
if( $this->label_formfunc != '' ) {
$f=$this->label_formfunc;
$l = call_user_func($f,$label);
}
else {
$l = $label;
}
 
$aMajLabel[]=$l;
$label += $this->major_step;
$grid[]=$xt;
$grid[]=$yt;
$aMajPos[($i-1)*2]=$xt+2*$dx;
$aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2;
if( !$this->supress_tickmarks ) {
if( $this->majcolor != '' ) {
$aImg->PushColor($this->majcolor);
}
$aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy);
if( $this->majcolor != '' ) {
$aImg->PopColor();
}
}
}
 
// Draw minor ticks
$ticklen2=$this->minor_abs_size;
$dx=round(sin($aAxisAngle)*$ticklen2);
$dy=round(cos($aAxisAngle)*$ticklen2);
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor != '' ) {
$aImg->PushColor($this->mincolor);
}
for($i=1; $i<=$nbrmin; ++$i) {
if( ($i % $skip) == 0 ) {
continue;
}
$xt=round($i*$min_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle));
$aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy);
}
if( $this->mincolor != '' ) {
$aImg->PopColor();
}
}
}
}
 
 
//===================================================
// CLASS RadarAxis
// Description: Implements axis for the radar graph
//===================================================
class RadarAxis extends AxisPrototype {
public $title=null;
private $title_color='navy';
private $len=0;
 
function __construct($img,$aScale,$color=array(0,0,0)) {
parent::__construct($img,$aScale,$color);
$this->len = $img->plotheight;
$this->title = new Text();
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->color = array(0,0,0);
}
 
// Stroke the axis
// $pos = Vertical position of axis
// $aAxisAngle = Axis angle
// $grid = Returns an array with positions used to draw the grid
// $lf = Label flag, TRUE if the axis should have labels
function Stroke($pos,$aAxisAngle,&$grid,$title,$lf) {
$this->img->SetColor($this->color);
 
// Determine end points for the axis
$x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]);
$y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle));
 
// Draw axis
$this->img->SetColor($this->color);
$this->img->SetLineWeight($this->weight);
if( !$this->hide ) {
$this->img->Line($this->scale->scale_abs[0],$pos,$x,$y);
}
 
$this->scale->ticks->Stroke($this->img,$grid,$pos,$aAxisAngle,$this->scale,$majpos,$majlabel);
$ncolor=0;
if( isset($this->ticks_label_colors) ) {
$ncolor=count($this->ticks_label_colors);
}
 
// Draw labels
if( $lf && !$this->hide ) {
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
$this->img->SetTextAlign('left','top');
$this->img->SetColor($this->label_color);
 
// majpos contains (x,y) coordinates for labels
if( ! $this->hide_labels ) {
$n = floor(count($majpos)/2);
for($i=0; $i < $n; ++$i) {
// Set specific label color if specified
if( $ncolor > 0 ) {
$this->img->SetColor($this->ticks_label_colors[$i % $ncolor]);
}
 
if( $this->ticks_label != null && isset($this->ticks_label[$i]) ) {
$this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$this->ticks_label[$i]);
}
else {
$this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$majlabel[$i]);
}
}
}
}
$this->_StrokeAxisTitle($pos,$aAxisAngle,$title);
}
 
function _StrokeAxisTitle($pos,$aAxisAngle,$title) {
$this->title->Set($title);
$marg=6+$this->title->margin;
$xt=round(($this->scale->world_abs_size+$marg)*cos($aAxisAngle)+$this->scale->scale_abs[0]);
$yt=round($pos-($this->scale->world_abs_size+$marg)*sin($aAxisAngle));
 
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
if( $this->title->iWordwrap > 0 ) {
$title = wordwrap($title,$this->title->iWordwrap,"\n");
}
 
$h=$this->img->GetTextHeight($title)*1.2;
$w=$this->img->GetTextWidth($title)*1.2;
 
while( $aAxisAngle > 2*M_PI )
$aAxisAngle -= 2*M_PI;
 
// Around 3 a'clock
if( $aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4 ) $dx=-0.15; // Small trimming to make the dist to the axis more even
 
// Around 12 a'clock
if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dx=($aAxisAngle-M_PI/4)*2/M_PI;
 
// Around 9 a'clock
if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dx=1;
 
// Around 6 a'clock
if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI);
 
if( $aAxisAngle>=7*M_PI/4 ) $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI;
if( $aAxisAngle<=M_PI/12 ) $dy=(0.5-$aAxisAngle*2/M_PI);
if( $aAxisAngle<=M_PI/4 && $aAxisAngle > M_PI/12) $dy=(1-$aAxisAngle*2/M_PI);
if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dy=1;
if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dy=(1-($aAxisAngle-3*M_PI/4)*2/M_PI);
if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dy=0;
 
if( !$this->hide ) {
$this->title->Stroke($this->img,$xt-$dx*$w,$yt-$dy*$h,$title);
}
}
 
} // Class
 
 
//===================================================
// CLASS RadarGrid
// Description: Draws grid for the radar graph
//===================================================
class RadarGrid { //extends Grid {
private $type='solid';
private $grid_color='#DDDDDD';
private $show=false, $weight=1;
 
function __construct() {
// Empty
}
 
function SetColor($aMajColor) {
$this->grid_color = $aMajColor;
}
 
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
 
// Specify if grid should be dashed, dotted or solid
function SetLineStyle($aType) {
$this->type = $aType;
}
 
// Decide if both major and minor grid should be displayed
function Show($aShowMajor=true) {
$this->show=$aShowMajor;
}
 
function Stroke($img,$grid) {
if( !$this->show ) {
return;
}
 
$nbrticks = count($grid[0])/2;
$nbrpnts = count($grid);
$img->SetColor($this->grid_color);
$img->SetLineWeight($this->weight);
 
for($i=0; $i<$nbrticks; ++$i) {
for($j=0; $j<$nbrpnts; ++$j) {
$pnts[$j*2]=$grid[$j][$i*2];
$pnts[$j*2+1]=$grid[$j][$i*2+1];
}
for($k=0; $k<$nbrpnts; ++$k ){
$l=($k+1)%$nbrpnts;
if( $this->type == 'solid' )
$img->Line($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1]);
elseif( $this->type == 'dotted' )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],1,6);
elseif( $this->type == 'dashed' )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],2,4);
elseif( $this->type == 'longdashed' )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],8,6);
}
$pnts=array();
}
}
} // Class
 
 
//===================================================
// CLASS RadarPlot
// Description: Plot a radarplot
//===================================================
class RadarPlot {
public $mark=null;
public $legend='';
public $legendcsimtarget='';
public $legendcsimalt='';
public $csimtargets=array(); // Array of targets for CSIM
public $csimareas=""; // Resultant CSIM area tags
public $csimalts=null; // ALT:s for corresponding target
private $data=array();
private $fill=false, $fill_color=array(200,170,180);
private $color=array(0,0,0);
private $weight=1;
private $linestyle='solid';
 
//---------------
// CONSTRUCTOR
function __construct($data) {
$this->data = $data;
$this->mark = new PlotMark();
}
 
function Min() {
return Min($this->data);
}
 
function Max() {
return Max($this->data);
}
 
function SetLegend($legend) {
$this->legend=$legend;
}
 
function SetLineStyle($aStyle) {
$this->linestyle=$aStyle;
}
 
function SetLineWeight($w) {
$this->weight=$w;
}
 
function SetFillColor($aColor) {
$this->fill_color = $aColor;
$this->fill = true;
}
 
function SetFill($f=true) {
$this->fill = $f;
}
 
function SetColor($aColor,$aFillColor=false) {
$this->color = $aColor;
if( $aFillColor ) {
$this->SetFillColor($aFillColor);
$this->fill = true;
}
}
 
// Set href targets for CSIM
function SetCSIMTargets($aTargets,$aAlts=null) {
$this->csimtargets=$aTargets;
$this->csimalts=$aAlts;
}
 
// Get all created areas
function GetCSIMareas() {
return $this->csimareas;
}
 
function Stroke($img, $pos, $scale, $startangle) {
$nbrpnts = count($this->data);
$astep=2*M_PI/$nbrpnts;
$a=$startangle;
 
for($i=0; $i<$nbrpnts; ++$i) {
 
// Rotate each non null point to the correct axis-angle
$cs=$scale->RelTranslate($this->data[$i]);
$x=round($cs*cos($a)+$scale->scale_abs[0]);
$y=round($pos-$cs*sin($a));
 
$pnts[$i*2]=$x;
$pnts[$i*2+1]=$y;
 
// If the next point is null then we draw this polygon segment
// to the center, skip the next and draw the next segment from
// the center up to the point on the axis with the first non-null
// value and continues from that point. Some additoinal logic is necessary
// to handle the boundary conditions
if( $i < $nbrpnts-1 ) {
if( is_null($this->data[$i+1]) ) {
$cs = 0;
$x=round($cs*cos($a)+$scale->scale_abs[0]);
$y=round($pos-$cs*sin($a));
$pnts[$i*2]=$x;
$pnts[$i*2+1]=$y;
$a += $astep;
}
}
 
$a += $astep;
}
 
if( $this->fill ) {
$img->SetColor($this->fill_color);
$img->FilledPolygon($pnts);
}
 
$img->SetLineWeight($this->weight);
$img->SetColor($this->color);
$img->SetLineStyle($this->linestyle);
$pnts[] = $pnts[0];
$pnts[] = $pnts[1];
$img->Polygon($pnts);
$img->SetLineStyle('solid'); // Reset line style to default
 
// Add plotmarks on top
if( $this->mark->show ) {
for($i=0; $i < $nbrpnts; ++$i) {
if( isset($this->csimtargets[$i]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$i]);
$this->mark->SetCSIMAlt($this->csimalts[$i]);
$this->mark->SetCSIMAltVal($pnts[$i*2], $pnts[$i*2+1]);
$this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]);
$this->csimareas .= $this->mark->GetCSIMAreas();
}
else {
$this->mark->Stroke($img,$pnts[$i*2],$pnts[$i*2+1]);
}
}
}
 
}
 
function GetCount() {
return count($this->data);
}
 
function Legend($graph) {
if( $this->legend == '' ) {
return;
}
if( $this->fill ) {
$graph->legend->Add($this->legend,$this->fill_color,$this->mark);
} else {
$graph->legend->Add($this->legend,$this->color,$this->mark);
}
}
 
} // Class
 
//===================================================
// CLASS RadarGraph
// Description: Main container for a radar graph
//===================================================
class RadarGraph extends Graph {
public $grid,$axis=null;
private $posx,$posy;
private $len;
private $axis_title=null;
 
function __construct($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) {
parent::__construct($width,$height,$cachedName,$timeout,$inline);
$this->posx = $width/2;
$this->posy = $height/2;
$this->len = min($width,$height)*0.35;
$this->SetColor(array(255,255,255));
$this->SetTickDensity(TICKD_NORMAL);
$this->SetScale('lin');
$this->SetGridDepth(DEPTH_FRONT);
}
 
function HideTickMarks($aFlag=true) {
$this->axis->scale->ticks->SupressTickMarks($aFlag);
}
 
function ShowMinorTickmarks($aFlag=true) {
$this->yscale->ticks->SupressMinorTickMarks(!$aFlag);
}
 
function SetScale($axtype,$ymin=1,$ymax=1,$dummy1=null,$dumy2=null) {
if( $axtype != 'lin' && $axtype != 'log' ) {
JpGraphError::RaiseL(18003,$axtype);
//("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\"");
}
if( $axtype == 'lin' ) {
$this->yscale = new LinearScale($ymin,$ymax);
$this->yscale->ticks = new RadarLinearTicks();
$this->yscale->ticks->SupressMinorTickMarks();
}
elseif( $axtype == 'log' ) {
$this->yscale = new LogScale($ymin,$ymax);
$this->yscale->ticks = new RadarLogTicks();
}
 
$this->axis = new RadarAxis($this->img,$this->yscale);
$this->grid = new RadarGrid();
}
 
function SetSize($aSize) {
if( $aSize < 0.1 || $aSize>1 ) {
JpGraphError::RaiseL(18004,$aSize);
//("Radar Plot size must be between 0.1 and 1. (Your value=$s)");
}
$this->len=min($this->img->width,$this->img->height)*$aSize/2;
}
 
function SetPlotSize($aSize) {
$this->SetSize($aSize);
}
 
function SetTickDensity($densy=TICKD_NORMAL,$dummy1=null) {
$this->ytick_factor=25;
switch( $densy ) {
case TICKD_DENSE:
$this->ytick_factor=12;
break;
case TICKD_NORMAL:
$this->ytick_factor=25;
break;
case TICKD_SPARSE:
$this->ytick_factor=40;
break;
case TICKD_VERYSPARSE:
$this->ytick_factor=70;
break;
default:
JpGraphError::RaiseL(18005,$densy);
//("RadarPlot Unsupported Tick density: $densy");
}
}
 
function SetPos($px,$py=0.5) {
$this->SetCenter($px,$py);
}
 
function SetCenter($px,$py=0.5) {
if( $px >= 0 && $px <= 1 ) {
$this->posx = $this->img->width*$px;
}
else {
$this->posx = $px;
}
if( $py >= 0 && $py <= 1 ) {
$this->posy = $this->img->height*$py;
}
else {
$this->posy = $py;
}
}
 
function SetColor($aColor) {
$this->SetMarginColor($aColor);
}
 
function SetTitles($aTitleArray) {
$this->axis_title = $aTitleArray;
}
 
function Add($aPlot) {
if( $aPlot == null ) {
JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph.");
}
if( is_array($aPlot) && count($aPlot) > 0 ) {
$cl = $aPlot[0];
}
else {
$cl = $aPlot;
}
 
if( $cl instanceof Text ) $this->AddText($aPlot);
elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) $this->AddIcon($aPlot);
else {
$this->plots[] = $aPlot;
}
}
 
function GetPlotsYMinMax($aPlots) {
$min=$aPlots[0]->Min();
$max=$aPlots[0]->Max();
foreach( $this->plots as $p ) {
$max=max($max,$p->Max());
$min=min($min,$p->Min());
}
if( $min < 0 ) {
JpGraphError::RaiseL(18006,$min);
//("Minimum data $min (Radar plots should only be used when all data points > 0)");
}
return array($min,$max);
}
 
function StrokeIcons() {
if( $this->iIcons != null ) {
$n = count($this->iIcons);
for( $i=0; $i < $n; ++$i ) {
$this->iIcons[$i]->Stroke($this->img);
}
}
}
 
function StrokeTexts() {
if( $this->texts != null ) {
$n = count($this->texts);
for( $i=0; $i < $n; ++$i ) {
$this->texts[$i]->Stroke($this->img);
}
}
}
 
// Stroke the Radar graph
function Stroke($aStrokeFileName='') {
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ( $aStrokeFileName === _CSIM_SPECIALFILE );
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
$n = count($this->plots);
// Set Y-scale
 
if( !$this->yscale->IsSpecified() && count($this->plots) > 0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->plots);
$this->yscale->AutoScale($this->img,0,$max,$this->len/$this->ytick_factor);
}
elseif( $this->yscale->IsSpecified() &&
( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) {
 
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->yscale->scale[0];
$max = $this->yscale->scale[1];
$this->yscale->AutoScale($this->img,$min,$max,
$this->len/$this->ytick_factor,
$this->yscale->auto_ticks);
}
 
// Set start position end length of scale (in absolute pixels)
$this->yscale->SetConstants($this->posx,$this->len);
 
// We need as many axis as there are data points
$nbrpnts=$this->plots[0]->GetCount();
 
// If we have no titles just number the axis 1,2,3,...
if( $this->axis_title==null ) {
for($i=0; $i < $nbrpnts; ++$i ) {
$this->axis_title[$i] = $i+1;
}
}
elseif( count($this->axis_title) < $nbrpnts) {
JpGraphError::RaiseL(18007);
// ("Number of titles does not match number of points in plot.");
}
for( $i=0; $i < $n; ++$i ) {
if( $nbrpnts != $this->plots[$i]->GetCount() ) {
JpGraphError::RaiseL(18008);
//("Each radar plot must have the same number of data points.");
}
}
 
if( !$_csim ) {
if( $this->background_image != '' ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
$this->StrokeBackgroundGrad();
}
}
$astep=2*M_PI/$nbrpnts;
 
if( !$_csim ) {
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
 
 
// Prepare legends
for($i=0; $i < $n; ++$i) {
$this->plots[$i]->Legend($this);
}
$this->legend->Stroke($this->img);
$this->footer->Stroke($this->img);
}
 
if( !$_csim ) {
if( $this->grid_depth == DEPTH_BACK ) {
// Draw axis and grid
for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) {
$this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0);
}
$this->grid->Stroke($this->img,$grid);
}
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
 
}
 
// Plot points
$a=M_PI/2;
for($i=0; $i < $n; ++$i ) {
$this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a);
}
 
if( !$_csim ) {
if( $this->grid_depth != DEPTH_BACK ) {
// Draw axis and grid
for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) {
$this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0);
}
$this->grid->Stroke($this->img,$grid);
}
 
$this->StrokeTitles();
$this->StrokeTexts();
if( $this->iIconDepth == DEPTH_FRONT ) {
$this->StrokeIcons();
}
}
 
// Should we do any final image transformation
if( $this->iImgTrans && !$_csim ) {
if( !class_exists('ImgTrans',false) ) {
require_once('jpgraph_imgtrans.php');
}
 
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
if( !$_csim ) {
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
}
}
}
} // Class
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_contour.php
New file
0,0 → 1,587
<?php
/*=======================================================================
// File: JPGRAPH_CONTOUR.PHP
// Description: Contour plot
// Created: 2009-03-08
// Ver: $Id: jpgraph_contour.php 1870 2009-09-29 04:24:18Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
require_once('jpgraph_meshinterpolate.inc.php');
define('HORIZ_EDGE',0);
define('VERT_EDGE',1);
 
/**
* This class encapsulates the core contour plot algorithm. It will find the path
* of the specified isobars in the data matrix specified. It is assumed that the
* data matrix models an equspaced X-Y mesh of datavalues corresponding to the Z
* values.
*
*/
class Contour {
 
private $dataPoints = array();
private $nbrCols=0,$nbrRows=0;
private $horizEdges = array(), $vertEdges=array();
private $isobarValues = array();
private $stack = null;
private $isobarCoord = array();
private $nbrIsobars = 10, $isobarColors = array();
private $invert = true;
private $highcontrast = false, $highcontrastbw = false;
 
/**
* Create a new contour level "algorithm machine".
* @param $aMatrix The values to find the contour from
* @param $aIsobars Mixed. If integer it determines the number of isobars to be used. The levels are determined
* automatically as equdistance between the min and max value of the matrice.
* If $aIsobars is an array then this is interpretated as an array of values to be used as isobars in the
* contour plot.
* @return an instance of the contour algorithm
*/
function __construct($aMatrix,$aIsobars=10, $aColors=null) {
 
$this->nbrRows = count($aMatrix);
$this->nbrCols = count($aMatrix[0]);
$this->dataPoints = $aMatrix;
 
if( is_array($aIsobars) ) {
// use the isobar values supplied
$this->nbrIsobars = count($aIsobars);
$this->isobarValues = $aIsobars;
}
else {
// Determine the isobar values automatically
$this->nbrIsobars = $aIsobars;
list($min,$max) = $this->getMinMaxVal();
$stepSize = ($max-$min) / $aIsobars ;
$isobar = $min+$stepSize/2;
for ($i = 0; $i < $aIsobars; $i++) {
$this->isobarValues[$i] = $isobar;
$isobar += $stepSize;
}
}
 
if( $aColors !== null && count($aColors) > 0 ) {
 
if( !is_array($aColors) ) {
JpGraphError::RaiseL(28001);
//'Third argument to Contour must be an array of colors.'
}
 
if( count($aColors) != count($this->isobarValues) ) {
JpGraphError::RaiseL(28002);
//'Number of colors must equal the number of isobar lines specified';
}
 
$this->isobarColors = $aColors;
}
}
 
/**
* Flip the plot around the Y-coordinate. This has the same affect as flipping the input
* data matrice
*
* @param $aFlg If true the the vertice in input data matrice position (0,0) corresponds to the top left
* corner of teh plot otherwise it will correspond to the bottom left corner (a horizontal flip)
*/
function SetInvert($aFlg=true) {
$this->invert = $aFlg;
}
 
/**
* Find the min and max values in the data matrice
*
* @return array(min_value,max_value)
*/
function getMinMaxVal() {
$min = $this->dataPoints[0][0];
$max = $this->dataPoints[0][0];
for ($i = 0; $i < $this->nbrRows; $i++) {
if( ($mi=min($this->dataPoints[$i])) < $min ) $min = $mi;
if( ($ma=max($this->dataPoints[$i])) > $max ) $max = $ma;
}
return array($min,$max);
}
 
/**
* Reset the two matrices that keeps track on where the isobars crosses the
* horizontal and vertical edges
*/
function resetEdgeMatrices() {
for ($k = 0; $k < 2; $k++) {
for ($i = 0; $i <= $this->nbrRows; $i++) {
for ($j = 0; $j <= $this->nbrCols; $j++) {
$this->edges[$k][$i][$j] = false;
}
}
}
}
 
/**
* Determine if the specified isobar crosses the horizontal edge specified by its row and column
*
* @param $aRow Row index of edge to be checked
* @param $aCol Col index of edge to be checked
* @param $aIsobar Isobar value
* @return true if the isobar is crossing this edge
*/
function isobarHCrossing($aRow,$aCol,$aIsobar) {
 
if( $aCol >= $this->nbrCols-1 ) {
JpGraphError::RaiseL(28003,$aCol);
//'ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)'
}
if( $aRow >= $this->nbrRows ) {
JpGraphError::RaiseL(28004,$aRow);
//'ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)'
}
 
$v1 = $this->dataPoints[$aRow][$aCol];
$v2 = $this->dataPoints[$aRow][$aCol+1];
 
return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ;
 
}
 
/**
* Determine if the specified isobar crosses the vertical edge specified by its row and column
*
* @param $aRow Row index of edge to be checked
* @param $aCol Col index of edge to be checked
* @param $aIsobar Isobar value
* @return true if the isobar is crossing this edge
*/
function isobarVCrossing($aRow,$aCol,$aIsobar) {
 
if( $aRow >= $this->nbrRows-1) {
JpGraphError::RaiseL(28005,$aRow);
//'isobarVCrossing: Row index too large
}
if( $aCol >= $this->nbrCols ) {
JpGraphError::RaiseL(28006,$aCol);
//'isobarVCrossing: Col index too large
}
 
$v1 = $this->dataPoints[$aRow][$aCol];
$v2 = $this->dataPoints[$aRow+1][$aCol];
 
return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ;
 
}
 
/**
* Determine all edges, horizontal and vertical that the specified isobar crosses. The crossings
* are recorded in the two edge matrices.
*
* @param $aIsobar The value of the isobar to be checked
*/
function determineIsobarEdgeCrossings($aIsobar) {
 
$ib = $this->isobarValues[$aIsobar];
 
for ($i = 0; $i < $this->nbrRows-1; $i++) {
for ($j = 0; $j < $this->nbrCols-1; $j++) {
$this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($i,$j,$ib);
$this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i,$j,$ib);
}
}
 
// We now have the bottom and rightmost edges unsearched
for ($i = 0; $i < $this->nbrRows-1; $i++) {
$this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i,$this->nbrCols-1,$ib);
}
for ($j = 0; $j < $this->nbrCols-1; $j++) {
$this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($this->nbrRows-1,$j,$ib);
}
 
}
 
/**
* Return the normalized coordinates for the crossing of the specified edge with the specified
* isobar- The crossing is simpy detrmined with a linear interpolation between the two vertices
* on each side of the edge and the value of the isobar
*
* @param $aRow Row of edge
* @param $aCol Column of edge
* @param $aEdgeDir Determine if this is a horizontal or vertical edge
* @param $ib The isobar value
* @return unknown_type
*/
function getCrossingCoord($aRow,$aCol,$aEdgeDir,$aIsobarVal) {
 
// In order to avoid numerical problem when two vertices are very close
// we have to check and avoid dividing by close to zero denumerator.
if( $aEdgeDir == HORIZ_EDGE ) {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]);
if( $d > 0.001 ) {
$xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$xcoord = $aCol;
}
$ycoord = $aRow;
}
else {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]);
if( $d > 0.001 ) {
$ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$ycoord = $aRow;
}
$xcoord = $aCol;
}
if( $this->invert ) {
$ycoord = $this->nbrRows-1 - $ycoord;
}
return array($xcoord,$ycoord);
 
}
 
/**
* In order to avoid all kinds of unpleasent extra checks and complex boundary
* controls for the degenerated case where the contour levels exactly crosses
* one of the vertices we add a very small delta (0.1%) to the data point value.
* This has no visible affect but it makes the code sooooo much cleaner.
*
*/
function adjustDataPointValues() {
 
$ni = count($this->isobarValues);
for ($k = 0; $k < $ni; $k++) {
$ib = $this->isobarValues[$k];
for ($row = 0 ; $row < $this->nbrRows-1; ++$row) {
for ($col = 0 ; $col < $this->nbrCols-1; ++$col ) {
if( abs($this->dataPoints[$row][$col] - $ib) < 0.0001 ) {
$this->dataPoints[$row][$col] += $this->dataPoints[$row][$col]*0.001;
}
}
}
}
 
}
 
/**
* @param $aFlg
* @param $aBW
* @return unknown_type
*/
function UseHighContrastColor($aFlg=true,$aBW=false) {
$this->highcontrast = $aFlg;
$this->highcontrastbw = $aBW;
}
 
/**
* Calculate suitable colors for each defined isobar
*
*/
function CalculateColors() {
if ( $this->highcontrast ) {
if ( $this->highcontrastbw ) {
for ($ib = 0; $ib < $this->nbrIsobars; $ib++) {
$this->isobarColors[$ib] = 'black';
}
}
else {
// Use only blue/red scale
$step = round(255/($this->nbrIsobars-1));
for ($ib = 0; $ib < $this->nbrIsobars; $ib++) {
$this->isobarColors[$ib] = array($ib*$step, 50, 255-$ib*$step);
}
}
}
else {
$n = $this->nbrIsobars;
$v = 0; $step = 1 / ($this->nbrIsobars-1);
for ($ib = 0; $ib < $this->nbrIsobars; $ib++) {
$this->isobarColors[$ib] = RGB::GetSpectrum($v);
$v += $step;
}
}
}
 
/**
* This is where the main work is done. For each isobar the crossing of the edges are determined
* and then each cell is analyzed to find the 0, 2 or 4 crossings. Then the normalized coordinate
* for the crossings are determined and pushed on to the isobar stack. When the method is finished
* the $isobarCoord will hold one arrayfor each isobar where all the line segments that makes
* up the contour plot are stored.
*
* @return array( $isobarCoord, $isobarValues, $isobarColors )
*/
function getIsobars() {
 
$this->adjustDataPointValues();
 
for ($isobar = 0; $isobar < $this->nbrIsobars; $isobar++) {
 
$ib = $this->isobarValues[$isobar];
$this->resetEdgeMatrices();
$this->determineIsobarEdgeCrossings($isobar);
$this->isobarCoord[$isobar] = array();
 
$ncoord = 0;
 
for ($row = 0 ; $row < $this->nbrRows-1; ++$row) {
for ($col = 0 ; $col < $this->nbrCols-1; ++$col ) {
 
// Find out how many crossings around the edges
$n = 0;
if ( $this->edges[HORIZ_EDGE][$row][$col] ) $neigh[$n++] = array($row, $col, HORIZ_EDGE);
if ( $this->edges[HORIZ_EDGE][$row+1][$col] ) $neigh[$n++] = array($row+1,$col, HORIZ_EDGE);
if ( $this->edges[VERT_EDGE][$row][$col] ) $neigh[$n++] = array($row, $col, VERT_EDGE);
if ( $this->edges[VERT_EDGE][$row][$col+1] ) $neigh[$n++] = array($row, $col+1,VERT_EDGE);
 
if ( $n == 2 ) {
$n1=0; $n2=1;
$this->isobarCoord[$isobar][$ncoord++] = array(
$this->getCrossingCoord($neigh[$n1][0],$neigh[$n1][1],$neigh[$n1][2],$ib),
$this->getCrossingCoord($neigh[$n2][0],$neigh[$n2][1],$neigh[$n2][2],$ib) );
}
elseif ( $n == 4 ) {
// We must determine how to connect the edges either northwest->southeast or
// northeast->southwest. We do that by calculating the imaginary middle value of
// the cell by averaging the for corners. This will compared with the value of the
// top left corner will help determine the orientation of the ridge/creek
$midval = ($this->dataPoints[$row][$col]+$this->dataPoints[$row][$col+1]+$this->dataPoints[$row+1][$col]+$this->dataPoints[$row+1][$col+1])/4;
$v = $this->dataPoints[$row][$col];
if( $midval == $ib ) {
// Orientation "+"
$n1=0; $n2=1; $n3=2; $n4=3;
} elseif ( ($midval > $ib && $v > $ib) || ($midval < $ib && $v < $ib) ) {
// Orientation of ridge/valley = "\"
$n1=0; $n2=3; $n3=2; $n4=1;
} elseif ( ($midval > $ib && $v < $ib) || ($midval < $ib && $v > $ib) ) {
// Orientation of ridge/valley = "/"
$n1=0; $n2=2; $n3=3; $n4=1;
}
 
$this->isobarCoord[$isobar][$ncoord++] = array(
$this->getCrossingCoord($neigh[$n1][0],$neigh[$n1][1],$neigh[$n1][2],$ib),
$this->getCrossingCoord($neigh[$n2][0],$neigh[$n2][1],$neigh[$n2][2],$ib) );
 
$this->isobarCoord[$isobar][$ncoord++] = array(
$this->getCrossingCoord($neigh[$n3][0],$neigh[$n3][1],$neigh[$n3][2],$ib),
$this->getCrossingCoord($neigh[$n4][0],$neigh[$n4][1],$neigh[$n4][2],$ib) );
 
}
}
}
}
 
if( count($this->isobarColors) == 0 ) {
// No manually specified colors. Calculate them automatically.
$this->CalculateColors();
}
return array( $this->isobarCoord, $this->isobarValues, $this->isobarColors );
}
}
 
 
/**
* This class represent a plotting of a contour outline of data given as a X-Y matrice
*
*/
class ContourPlot extends Plot {
 
private $contour, $contourCoord, $contourVal, $contourColor;
private $nbrCountours = 0 ;
private $dataMatrix = array();
private $invertLegend = false;
private $interpFactor = 1;
private $flipData = false;
private $isobar = 10;
private $showLegend = false;
private $highcontrast = false, $highcontrastbw = false;
private $manualIsobarColors = array();
 
/**
* Construct a contour plotting algorithm. The end result of the algorithm is a sequence of
* line segments for each isobar given as two vertices.
*
* @param $aDataMatrix The Z-data to be used
* @param $aIsobar A mixed variable, if it is an integer then this specified the number of isobars to use.
* The values of the isobars are automatically detrmined to be equ-spaced between the min/max value of the
* data. If it is an array then it explicetely gives the isobar values
* @param $aInvert By default the matrice with row index 0 corresponds to Y-value 0, i.e. in the bottom of
* the plot. If this argument is true then the row with the highest index in the matrice corresponds to
* Y-value 0. In affect flipping the matrice around an imaginary horizontal axis.
* @param $aHighContrast Use high contrast colors (blue/red:ish)
* @param $aHighContrastBW Use only black colors for contours
* @return an instance of the contour plot algorithm
*/
function __construct($aDataMatrix, $aIsobar=10, $aFactor=1, $aInvert=false, $aIsobarColors=array()) {
 
$this->dataMatrix = $aDataMatrix;
$this->flipData = $aInvert;
$this->isobar = $aIsobar;
$this->interpFactor = $aFactor;
 
if ( $this->interpFactor > 1 ) {
 
if( $this->interpFactor > 5 ) {
JpGraphError::RaiseL(28007);// ContourPlot interpolation factor is too large (>5)
}
 
$ip = new MeshInterpolate();
$this->dataMatrix = $ip->Linear($this->dataMatrix, $this->interpFactor);
}
 
$this->contour = new Contour($this->dataMatrix,$this->isobar,$aIsobarColors);
 
if( is_array($aIsobar) )
$this->nbrContours = count($aIsobar);
else
$this->nbrContours = $aIsobar;
}
 
 
/**
* Flipe the data around the center
*
* @param $aFlg
*
*/
function SetInvert($aFlg=true) {
$this->flipData = $aFlg;
}
 
/**
* Set the colors for the isobar lines
*
* @param $aColorArray
*
*/
function SetIsobarColors($aColorArray) {
$this->manualIsobarColors = $aColorArray;
}
 
/**
* Show the legend
*
* @param $aFlg true if the legend should be shown
*
*/
function ShowLegend($aFlg=true) {
$this->showLegend = $aFlg;
}
 
 
/**
* @param $aFlg true if the legend should start with the lowest isobar on top
* @return unknown_type
*/
function Invertlegend($aFlg=true) {
$this->invertLegend = $aFlg;
}
 
/* Internal method. Give the min value to be used for the scaling
*
*/
function Min() {
return array(0,0);
}
 
/* Internal method. Give the max value to be used for the scaling
*
*/
function Max() {
return array(count($this->dataMatrix[0])-1,count($this->dataMatrix)-1);
}
 
/**
* Internal ramewrok method to setup the legend to be used for this plot.
* @param $aGraph The parent graph class
*/
function Legend($aGraph) {
 
if( ! $this->showLegend )
return;
 
if( $this->invertLegend ) {
for ($i = 0; $i < $this->nbrContours; $i++) {
$aGraph->legend->Add(sprintf('%.1f',$this->contourVal[$i]), $this->contourColor[$i]);
}
}
else {
for ($i = $this->nbrContours-1; $i >= 0 ; $i--) {
$aGraph->legend->Add(sprintf('%.1f',$this->contourVal[$i]), $this->contourColor[$i]);
}
}
}
 
 
/**
* Framework function which gets called before the Stroke() method is called
*
* @see Plot#PreScaleSetup($aGraph)
*
*/
function PreScaleSetup($aGraph) {
$xn = count($this->dataMatrix[0])-1;
$yn = count($this->dataMatrix)-1;
 
$aGraph->xaxis->scale->Update($aGraph->img,0,$xn);
$aGraph->yaxis->scale->Update($aGraph->img,0,$yn);
 
$this->contour->SetInvert($this->flipData);
list($this->contourCoord,$this->contourVal,$this->contourColor) = $this->contour->getIsobars();
}
 
/**
* Use high contrast color schema
*
* @param $aFlg True, to use high contrast color
* @param $aBW True, Use only black and white color schema
*/
function UseHighContrastColor($aFlg=true,$aBW=false) {
$this->highcontrast = $aFlg;
$this->highcontrastbw = $aBW;
$this->contour->UseHighContrastColor($this->highcontrast,$this->highcontrastbw);
}
 
/**
* Internal method. Stroke the contour plot to the graph
*
* @param $img Image handler
* @param $xscale Instance of the xscale to use
* @param $yscale Instance of the yscale to use
*/
function Stroke($img,$xscale,$yscale) {
 
if( count($this->manualIsobarColors) > 0 ) {
$this->contourColor = $this->manualIsobarColors;
if( count($this->manualIsobarColors) != $this->nbrContours ) {
JpGraphError::RaiseL(28002);
}
}
 
$img->SetLineWeight($this->line_weight);
 
for ($c = 0; $c < $this->nbrContours; $c++) {
 
$img->SetColor( $this->contourColor[$c] );
 
$n = count($this->contourCoord[$c]);
$i = 0;
while ( $i < $n ) {
list($x1,$y1) = $this->contourCoord[$c][$i][0];
$x1t = $xscale->Translate($x1);
$y1t = $yscale->Translate($y1);
 
list($x2,$y2) = $this->contourCoord[$c][$i++][1];
$x2t = $xscale->Translate($x2);
$y2t = $yscale->Translate($y2);
 
$img->Line($x1t,$y1t,$x2t,$y2t);
}
 
}
}
 
}
 
// EOF
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_error.php
New file
0,0 → 1,157
<?php
/*=======================================================================
// File: JPGRAPH_ERROR.PHP
// Description: Error plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_error.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
//===================================================
// CLASS ErrorPlot
// Description: Error plot with min/max value for
// each datapoint
//===================================================
class ErrorPlot extends Plot {
private $errwidth=2;
//---------------
// CONSTRUCTOR
function __construct($datay,$datax=false) {
parent::__construct($datay,$datax);
$this->numpoints /= 2;
}
//---------------
// PUBLIC METHODS
 
// Gets called before any axis are stroked
function PreStrokeAdjust($graph) {
if( $this->center ) {
$a=0.5; $b=0.5;
++$this->numpoints;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
 
// Method description
function Stroke($img,$xscale,$yscale) {
$numpoints=count($this->coords[0])/2;
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
 
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints )
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
else
$exist_x = true;
}
else
$exist_x = false;
 
for( $i=0; $i<$numpoints; ++$i) {
if( $exist_x )
$x=$this->coords[1][$i];
else
$x=$i;
 
if( !is_numeric($x) ||
!is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1]) ) {
continue;
}
 
$xt = $xscale->Translate($x);
$yt1 = $yscale->Translate($this->coords[0][$i*2]);
$yt2 = $yscale->Translate($this->coords[0][$i*2+1]);
$img->Line($xt,$yt1,$xt,$yt2);
$img->Line($xt-$this->errwidth,$yt1,$xt+$this->errwidth,$yt1);
$img->Line($xt-$this->errwidth,$yt2,$xt+$this->errwidth,$yt2);
}
return true;
}
} // Class
 
 
//===================================================
// CLASS ErrorLinePlot
// Description: Combine a line and error plot
// THIS IS A DEPRECATED PLOT TYPE JUST KEPT FOR
// BACKWARD COMPATIBILITY
//===================================================
class ErrorLinePlot extends ErrorPlot {
public $line=null;
//---------------
// CONSTRUCTOR
function __construct($datay,$datax=false) {
parent::__construct($datay,$datax);
// Calculate line coordinates as the average of the error limits
$n = count($datay);
for($i=0; $i < $n; $i+=2 ) {
$ly[]=($datay[$i]+$datay[$i+1])/2;
}
$this->line=new LinePlot($ly,$datax);
}
 
//---------------
// PUBLIC METHODS
function Legend($graph) {
if( $this->legend != "" )
$graph->legend->Add($this->legend,$this->color);
$this->line->Legend($graph);
}
function Stroke($img,$xscale,$yscale) {
parent::Stroke($img,$xscale,$yscale);
$this->line->Stroke($img,$xscale,$yscale);
}
} // Class
 
 
//===================================================
// CLASS LineErrorPlot
// Description: Combine a line and error plot
//===================================================
class LineErrorPlot extends ErrorPlot {
public $line=null;
//---------------
// CONSTRUCTOR
// Data is (val, errdeltamin, errdeltamax)
function __construct($datay,$datax=false) {
$ly=array(); $ey=array();
$n = count($datay);
if( $n % 3 != 0 ) {
JpGraphError::RaiseL(4002);
//('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3');
}
for($i=0; $i < $n; $i+=3 ) {
$ly[]=$datay[$i];
$ey[]=$datay[$i]+$datay[$i+1];
$ey[]=$datay[$i]+$datay[$i+2];
}
parent::__construct($ey,$datax);
$this->line=new LinePlot($ly,$datax);
}
 
//---------------
// PUBLIC METHODS
function Legend($graph) {
if( $this->legend != "" )
$graph->legend->Add($this->legend,$this->color);
$this->line->Legend($graph);
}
function Stroke($img,$xscale,$yscale) {
parent::Stroke($img,$xscale,$yscale);
$this->line->Stroke($img,$xscale,$yscale);
}
} // Class
 
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_pushpins.inc.php
New file
0,0 → 1,517
<?php
//=======================================================================
// File: IMGDATA_PUSHPINS.INC
// Description: Base64 encoded images for pushpins
// Created: 2003-03-20
// Ver: $Id: imgdata_pushpins.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_PushPins extends ImgData {
protected $name = 'Push pins';
protected $an = array(MARK_IMG_PUSHPIN => 'imgdata_small',
MARK_IMG_SPUSHPIN => 'imgdata_small',
MARK_IMG_LPUSHPIN => 'imgdata_large');
 
protected $colors = array('blue','green','orange','pink','red');
protected $index = array('red' => 0, 'orange' => 1, 'pink' => 2, 'blue' => 3, 'green' => 4 ) ;
protected $maxidx = 4 ;
protected $imgdata_large, $imgdata_small ;
 
function __construct() {
 
// The anchor should be where the needle "hits" the paper
// (bottom left corner)
$this->anchor_x = 0;
$this->anchor_y = 1;
 
//==========================================================
// File: ppl_red.png
//==========================================================
$this->imgdata_large[0][0]= 2490 ;
$this->imgdata_large[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'.
'4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'.
'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'.
'6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'.
'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'.
'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'.
'8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'.
'4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'.
'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'.
'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'.
'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'.
'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'.
'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'.
'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'.
'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'.
'73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'.
'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'.
'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'.
'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'.
'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'.
'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'.
'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'.
'86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'.
'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'.
'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'.
'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'.
'/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'.
'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'.
'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'.
'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'.
'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'.
'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'.
'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'.
'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'.
'5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'.
'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'.
'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'.
'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'.
'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'.
'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'.
'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'.
'/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'.
'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'.
'2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'.
'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'.
'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'.
'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'.
'4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'.
'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'.
'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'.
'+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'.
'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'.
'2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'.
'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'.
'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'.
'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'.
'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'.
'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'.
'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'.
'5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'.
'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'.
'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'.
'7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'.
'928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'.
'Nqn4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: ppl_orange.png
//==========================================================
$this->imgdata_large[1][0]= 2753 ;
$this->imgdata_large[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'.
'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'.
'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'.
'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'.
'4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'.
'8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'.
'/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'.
'35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'.
'6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'.
'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'.
'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'.
'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'.
'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'.
'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'.
'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'.
'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'.
'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'.
'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'.
'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'.
'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'.
'1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'.
'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'.
'+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'.
'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'.
'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'.
'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'.
'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'.
'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'.
'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'.
'+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'.
'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'.
'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'.
'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'.
'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'.
'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'.
'1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'.
'1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'.
'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'.
'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'.
'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'.
'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'.
'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'.
'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'.
'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'.
'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'.
'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'.
'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'.
'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'.
'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'.
'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'.
'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'.
'3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'.
'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'.
'3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'.
'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'.
'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'.
'8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'.
'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'.
'7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'.
'+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'.
'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'.
'7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'.
'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'.
'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'.
'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'.
'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'.
'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'.
'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'.
'1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'.
'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'.
'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'.
'n5N4cAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: ppl_pink.png
//==========================================================
$this->imgdata_large[2][0]= 2779 ;
$this->imgdata_large[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'.
'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'.
'660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'.
'8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'.
'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'.
'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'.
'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'.
'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'.
'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'.
'2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'.
'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'.
'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'.
'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'.
'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'.
'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'.
'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'.
'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'.
'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'.
'4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'.
'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'.
'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'.
'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'.
'1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'.
'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'.
'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'.
'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'.
'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'.
'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'.
'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'.
'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'.
'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'.
'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'.
'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'.
'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'.
'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'.
'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'.
'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'.
'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'.
'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'.
'59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'.
'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'.
'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'.
'3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'.
'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'.
'9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'.
'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'.
'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'.
'1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'.
'+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'.
'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'.
'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'.
'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'.
'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'.
'6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'.
'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'.
'2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'.
'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'.
'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'.
'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'.
'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'.
'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'.
'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'.
'++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'.
'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'.
'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'.
'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'.
'+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'.
'9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'.
'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'.
'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'.
'1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'.
'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'.
'rkJggg==' ;
 
//==========================================================
// File: ppl_blue.png
//==========================================================
$this->imgdata_large[3][0]= 2284 ;
$this->imgdata_large[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'.
'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'.
'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'.
'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'.
'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'.
'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'.
'7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'.
'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'.
'7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'.
'7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'.
'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'.
'+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'.
'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'.
'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'.
'7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'.
'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'.
'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'.
'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'.
'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'.
'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'.
'6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'.
'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'.
'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'.
'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'.
'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'.
'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'.
'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'.
'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'.
'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'.
'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'.
'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'.
'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'.
'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'.
'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'.
'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'.
'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'.
'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'.
'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'.
'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'.
't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'.
'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'.
'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'.
'5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'.
'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'.
'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'.
'/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'.
'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'.
'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'.
'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'.
'5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'.
'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'.
'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'.
'4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'.
'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'.
'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'.
'6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'.
'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'.
'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'.
'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: ppl_green.png
//==========================================================
$this->imgdata_large[4][0]= 2854 ;
$this->imgdata_large[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'.
'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'.
'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'.
'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'.
'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'.
'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'.
'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'.
'6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'.
'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'.
'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'.
'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'.
'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'.
'4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'.
'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'.
'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'.
'26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'.
'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'.
'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'.
'3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'.
'3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'.
'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'.
'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'.
'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'.
'+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'.
'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'.
'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'.
'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'.
'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'.
'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'.
'82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'.
'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'.
'/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'.
'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'.
'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'.
'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'.
'44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'.
'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'.
'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'.
'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'.
'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'.
'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'.
'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'.
'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'.
'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'.
'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'.
'8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'.
'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'.
'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'.
'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'.
'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'.
'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'.
'6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'.
'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'.
'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'.
'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'.
'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'.
'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'.
'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'.
'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'.
'6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'.
'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'.
'9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'.
'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'.
'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'.
'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'.
'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'.
'2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'.
'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'.
'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'.
'/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'.
'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'.
'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'.
'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'.
'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'.
'rkJggg==' ;
 
 
//==========================================================
// File: pp_red.png
//==========================================================
$this->imgdata_small[0][0]= 384 ;
$this->imgdata_small[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'.
'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'.
'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'.
'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'.
'3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'.
'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'.
'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'.
's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'.
'AElFTkSuQmCC' ;
 
//==========================================================
// File: pp_orange.png
//==========================================================
$this->imgdata_small[1][0]= 403 ;
$this->imgdata_small[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'.
'3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'.
'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'.
'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'.
'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'.
'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'.
'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'.
'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'.
'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: pp_pink.png
//==========================================================
$this->imgdata_small[2][0]= 419 ;
$this->imgdata_small[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'.
'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'.
'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'.
'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'.
'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'.
'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'.
'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'.
'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'.
'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'.
'VORK5CYII=' ;
 
 
//==========================================================
// File: pp_blue.png
//==========================================================
$this->imgdata_small[3][0]= 883 ;
$this->imgdata_small[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'.
'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'.
'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'.
'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'.
'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'.
'9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'.
'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'.
'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'.
'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'.
'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'.
'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'.
'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'.
'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'.
'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'.
'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'.
'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'.
'//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'.
'+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'.
'/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'.
'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'.
'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'.
'bN4SMue4/KbwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: pp_green.png
//==========================================================
$this->imgdata_small[4][0]= 447 ;
$this->imgdata_small[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'.
'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'.
'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'.
'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'.
'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'.
'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'.
'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'.
'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'.
'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'.
'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_text.inc.php
New file
0,0 → 1,302
<?php
//=======================================================================
// File: JPGRAPH_TEXT.INC.PHP
// Description: Class to handle text as object in the graph.
// The low level text layout engine is handled by the GD class
// Created: 2001-01-08 (Refactored to separate file 2008-08-01)
// Ver: $Id: jpgraph_text.inc.php 1844 2009-09-26 17:05:31Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//===================================================
// CLASS Text
// Description: Arbitrary text object that can be added to the graph
//===================================================
class Text {
public $t,$margin=0;
public $x=0,$y=0,$halign="left",$valign="top",$color=array(0,0,0);
public $hide=false, $dir=0;
public $iScalePosY=null,$iScalePosX=null;
public $iWordwrap=0;
public $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12;
protected $boxed=false; // Should the text be boxed
protected $paragraph_align="left";
protected $icornerradius=0,$ishadowwidth=3;
protected $fcolor='white',$bcolor='black',$shadow=false;
protected $iCSIMarea='',$iCSIMalt='',$iCSIMtarget='',$iCSIMWinTarget='';
private $iBoxType = 1; // Which variant of filled box around text we want
 
//---------------
// CONSTRUCTOR
 
// Create new text at absolute pixel coordinates
function __construct($aTxt="",$aXAbsPos=0,$aYAbsPos=0) {
if( ! is_string($aTxt) ) {
JpGraphError::RaiseL(25050);//('First argument to Text::Text() must be s atring.');
}
$this->t = $aTxt;
$this->x = round($aXAbsPos);
$this->y = round($aYAbsPos);
$this->margin = 0;
}
//---------------
// PUBLIC METHODS
// Set the string in the text object
function Set($aTxt) {
$this->t = $aTxt;
}
 
// Alias for Pos()
function SetPos($aXAbsPos=0,$aYAbsPos=0,$aHAlign="left",$aVAlign="top") {
//$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign);
$this->x = $aXAbsPos;
$this->y = $aYAbsPos;
$this->halign = $aHAlign;
$this->valign = $aVAlign;
}
 
function SetScalePos($aX,$aY) {
$this->iScalePosX = $aX;
$this->iScalePosY = $aY;
}
 
// Specify alignment for the text
function Align($aHAlign,$aVAlign="top",$aParagraphAlign="") {
$this->halign = $aHAlign;
$this->valign = $aVAlign;
if( $aParagraphAlign != "" )
$this->paragraph_align = $aParagraphAlign;
}
 
// Alias
function SetAlign($aHAlign,$aVAlign="top",$aParagraphAlign="") {
$this->Align($aHAlign,$aVAlign,$aParagraphAlign);
}
 
// Specifies the alignment for a multi line text
function ParagraphAlign($aAlign) {
$this->paragraph_align = $aAlign;
}
 
// Specifies the alignment for a multi line text
function SetParagraphAlign($aAlign) {
$this->paragraph_align = $aAlign;
}
 
function SetShadow($aShadowColor='gray',$aShadowWidth=3) {
$this->ishadowwidth=$aShadowWidth;
$this->shadow=$aShadowColor;
$this->boxed=true;
}
 
function SetWordWrap($aCol) {
$this->iWordwrap = $aCol ;
}
 
// Specify that the text should be boxed. fcolor=frame color, bcolor=border color,
// $shadow=drop shadow should be added around the text.
function SetBox($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) {
if( $aFrameColor === false ) {
$this->boxed=false;
}
else {
$this->boxed=true;
}
$this->fcolor=$aFrameColor;
$this->bcolor=$aBorderColor;
// For backwards compatibility when shadow was just true or false
if( $aShadowColor === true ) {
$aShadowColor = 'gray';
}
$this->shadow=$aShadowColor;
$this->icornerradius=$aCornerRadius;
$this->ishadowwidth=$aShadowWidth;
}
 
function SetBox2($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) {
$this->iBoxType=2;
$this->SetBox($aFrameColor,$aBorderColor,$aShadowColor,$aCornerRadius,$aShadowWidth);
}
 
// Hide the text
function Hide($aHide=true) {
$this->hide=$aHide;
}
 
// This looks ugly since it's not a very orthogonal design
// but I added this "inverse" of Hide() to harmonize
// with some classes which I designed more recently (especially)
// jpgraph_gantt
function Show($aShow=true) {
$this->hide=!$aShow;
}
 
// Specify font
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family=$aFamily;
$this->font_style=$aStyle;
$this->font_size=$aSize;
}
 
// Center the text between $left and $right coordinates
function Center($aLeft,$aRight,$aYAbsPos=false) {
$this->x = $aLeft + ($aRight-$aLeft )/2;
$this->halign = "center";
if( is_numeric($aYAbsPos) )
$this->y = $aYAbsPos;
}
 
// Set text color
function SetColor($aColor) {
$this->color = $aColor;
}
 
function SetAngle($aAngle) {
$this->SetOrientation($aAngle);
}
 
// Orientation of text. Note only TTF fonts can have an arbitrary angle
function SetOrientation($aDirection=0) {
if( is_numeric($aDirection) )
$this->dir=$aDirection;
elseif( $aDirection=="h" )
$this->dir = 0;
elseif( $aDirection=="v" )
$this->dir = 90;
else
JpGraphError::RaiseL(25051);//(" Invalid direction specified for text.");
}
 
// Total width of text
function GetWidth($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$w = $aImg->GetTextWidth($this->t,$this->dir);
return $w;
}
 
// Hight of font
function GetFontHeight($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetFontHeight();
return $h;
 
}
 
function GetTextHeight($aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t,$this->dir);
return $h;
}
 
function GetHeight($aImg) {
// Synonym for GetTextHeight()
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t,$this->dir);
return $h;
}
 
// Set the margin which will be interpretated differently depending
// on the context.
function SetMargin($aMarg) {
$this->margin = $aMarg;
}
 
function StrokeWithScale($aImg,$axscale,$ayscale) {
if( $this->iScalePosX === null || $this->iScalePosY === null ) {
$this->Stroke($aImg);
}
else {
$this->Stroke($aImg,
round($axscale->Translate($this->iScalePosX)),
round($ayscale->Translate($this->iScalePosY)));
}
}
 
function SetCSIMTarget($aURITarget,$aAlt='',$aWinTarget='') {
$this->iCSIMtarget = $aURITarget;
$this->iCSIMalt = $aAlt;
$this->iCSIMWinTarget = $aWinTarget;
}
 
function GetCSIMareas() {
if( $this->iCSIMtarget !== '' ) {
return $this->iCSIMarea;
}
else {
return '';
}
}
 
// Display text in image
function Stroke($aImg,$x=null,$y=null) {
 
if( $x !== null ) $this->x = round($x);
if( $y !== null ) $this->y = round($y);
 
// Insert newlines
if( $this->iWordwrap > 0 ) {
$this->t = wordwrap($this->t,$this->iWordwrap,"\n");
}
 
// If position been given as a fraction of the image size
// calculate the absolute position
if( $this->x < 1 && $this->x > 0 ) $this->x *= $aImg->width;
if( $this->y < 1 && $this->y > 0 ) $this->y *= $aImg->height;
 
$aImg->PushColor($this->color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->SetTextAlign($this->halign,$this->valign);
 
if( $this->boxed ) {
if( $this->fcolor=="nofill" ) {
$this->fcolor=false;
}
 
$oldweight=$aImg->SetLineWeight(1);
 
if( $this->iBoxType == 2 && $this->font_family > FF_FONT2+2 ) {
 
$bbox = $aImg->StrokeBoxedText2($this->x, $this->y,
$this->t, $this->dir,
$this->fcolor,
$this->bcolor,
$this->shadow,
$this->paragraph_align,
2,4,
$this->icornerradius,
$this->ishadowwidth);
}
else {
$bbox = $aImg->StrokeBoxedText($this->x,$this->y,$this->t,
$this->dir,$this->fcolor,$this->bcolor,$this->shadow,
$this->paragraph_align,3,3,$this->icornerradius,
$this->ishadowwidth);
}
 
$aImg->SetLineWeight($oldweight);
}
else {
$debug=false;
$bbox = $aImg->StrokeText($this->x,$this->y,$this->t,$this->dir,$this->paragraph_align,$debug);
}
 
// Create CSIM targets
$coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7];
$this->iCSIMarea = "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($this->iCSIMtarget)."\" ";
if( trim($this->iCSIMalt) != '' ) {
$this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" ";
$this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" ";
}
if( trim($this->iCSIMWinTarget) != '' ) {
$this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" ";
}
$this->iCSIMarea .= " />\n";
 
$aImg->PopColor($this->color);
}
} // Class
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_gradient.php
New file
0,0 → 1,434
<?php
/*=======================================================================
// File: JPGRAPH_GRADIENT.PHP
// Description: Create a color gradient
// Created: 2003-02-01
// Ver: $Id: jpgraph_gradient.php 1761 2009-08-01 08:31:28Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// Styles for gradient color fill
define("GRAD_VER",1);
define("GRAD_VERT",1);
define("GRAD_HOR",2);
define("GRAD_MIDHOR",3);
define("GRAD_MIDVER",4);
define("GRAD_CENTER",5);
define("GRAD_WIDE_MIDVER",6);
define("GRAD_WIDE_MIDHOR",7);
define("GRAD_LEFT_REFLECTION",8);
define("GRAD_RIGHT_REFLECTION",9);
define("GRAD_RAISED_PANEL",10);
define("GRAD_DIAGONAL",11);
 
//===================================================
// CLASS Gradient
// Description: Handles gradient fills. This is to be
// considered a "friend" class of Class Image.
//===================================================
class Gradient {
private $img=null, $numcolors=100;
//---------------
// CONSTRUCTOR
function __construct(&$img) {
$this->img = $img;
}
 
 
function SetNumColors($aNum) {
$this->numcolors=$aNum;
}
//---------------
// PUBLIC METHODS
// Produce a gradient filled rectangle with a smooth transition between
// two colors.
// ($xl,$yt) Top left corner
// ($xr,$yb) Bottom right
// $from_color Starting color in gradient
// $to_color End color in the gradient
// $style Which way is the gradient oriented?
function FilledRectangle($xl,$yt,$xr,$yb,$from_color,$to_color,$style=1) {
$this->img->SetLineWeight(1);
switch( $style ) {
case GRAD_VER:
$steps = ceil(abs($xr-$xl)+1);
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for( $i=0, $x=$xl; $i < $steps; ++$i ) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yt,$x,$yb);
$x += $delta;
}
break;
 
case GRAD_HOR:
$steps = ceil(abs($yb-$yt)+1);
$delta = $yb >= $yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($i=0,$y=$yt; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
break;
 
case GRAD_MIDHOR:
$steps = ceil(abs($yb-$yt)/2);
$delta = $yb >= $yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
--$i;
if( abs($yb-$yt) % 2 == 1 ) {
--$steps;
}
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
$this->img->Line($xl,$y,$xr,$y);
break;
 
case GRAD_MIDVER:
$steps = ceil(abs($xr-$xl)/2);
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
--$i;
if( abs($xr-$xl) % 2 == 1 ) {
--$steps;
}
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$this->img->Line($x,$yb,$x,$yt);
break;
 
case GRAD_WIDE_MIDVER:
$diff = ceil(abs($xr-$xl));
$steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ;
$delta = $xr >= $xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
--$i;
$this->img->current_color = $colors[$i];
for($j=0; $j< $steps; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
 
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_WIDE_MIDHOR:
$diff = ceil(abs($yb-$yt));
$steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ;
$delta = $yb >= $yt? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
--$i;
$this->img->current_color = $colors[$i];
for($j=0; $j < $steps; ++$j) {
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
break;
 
case GRAD_LEFT_REFLECTION:
$steps1 = ceil(0.3*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1;
 
$from_color = $this->img->rgb->Color($from_color);
$adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color2 = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
 
$this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps2 = max(1,ceil(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_RIGHT_REFLECTION:
$steps1 = ceil(0.7*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1;
 
$this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps2 = max(1,ceil(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
 
$from_color = $this->img->rgb->Color($from_color);
$adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
 
$steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_CENTER:
$steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2);
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
$dx = ($xr-$xl)/2;
$dy = ($yb-$yt)/2;
$x=$xl;$y=$yt;$x2=$xr;$y2=$yb;
$n = count($colors);
for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Rectangle($x,$y,$x2,$y2);
}
$this->img->Line($x,$y,$x2,$y2);
break;
 
case GRAD_RAISED_PANEL:
// right to left
$steps1 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
 
// left to right
$xr -= 3;
$xl += 3;
$yb -= 3;
$yt += 3;
$steps2 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
for($x=$xl, $j=$steps2; $j >= 0; --$j) {
$this->img->current_color = $colors[$j];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_DIAGONAL:
// use the longer dimension to determine the required number of steps.
// first loop draws from one corner to the mid-diagonal and the second
// loop draws from the mid-diagonal to the opposing corner.
if($xr-$xl > $yb - $yt) {
// width is greater than height -> use x-dimension for steps
$steps = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors);
 
for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yt,$xl,$y);
$x += $delta;
}
 
for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yb,$xr,$y);
$x += $delta;
}
} else {
// height is greater than width -> use y-dimension for steps
$steps = $yb-$yt;
$delta = $yb>=$yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors);
 
for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yt,$xl,$y);
$y += $delta;
}
 
for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yb,$xr,$y);
$x += $delta;
}
 
}
break;
 
default:
JpGraphError::RaiseL(7001,$style);
//("Unknown gradient style (=$style).");
break;
}
}
 
// Fill a special case of a polygon with a flat bottom
// with a gradient. Can be used for filled line plots.
// Please note that this is NOT a generic gradient polygon fill
// routine. It assumes that the bottom is flat (like a drawing
// of a mountain)
function FilledFlatPolygon($pts,$from_color,$to_color) {
if( count($pts) == 0 ) return;
 
$maxy=$pts[1];
$miny=$pts[1];
$n = count($pts) ;
for( $i=0, $idx=0; $i < $n; $i += 2) {
$x = round($pts[$i]);
$y = round($pts[$i+1]);
$miny = min($miny,$y);
$maxy = max($maxy,$y);
}
 
$colors = array();
$this->GetColArray($from_color,$to_color,abs($maxy-$miny)+1,$colors,$this->numcolors);
for($i=$miny, $idx=0; $i <= $maxy; ++$i ) {
$colmap[$i] = $colors[$idx++];
}
 
$n = count($pts)/2 ;
$idx = 0 ;
while( $idx < $n-1 ) {
$p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1]));
$p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1]));
 
// Find the largest rectangle we can fill
$y = max($p1[1],$p2[1]) ;
for($yy=$maxy; $yy > $y; --$yy) {
$this->img->current_color = $colmap[$yy];
$this->img->Line($p1[0],$yy,$p2[0]-1,$yy);
}
 
if( $p1[1] == $p2[1] ) {
continue;
}
 
// Fill the rest using lines (slow...)
$slope = ($p2[0]-$p1[0])/($p1[1]-$p2[1]);
$x1 = $p1[0];
$x2 = $p2[0]-1;
$start = $y;
if( $p1[1] > $p2[1] ) {
while( $y >= $p2[1] ) {
$x1=$slope*($start-$y)+$p1[0];
$this->img->current_color = $colmap[$y];
$this->img->Line($x1,$y,$x2,$y);
--$y;
}
}
else {
while( $y >= $p1[1] ) {
$x2=$p2[0]+$slope*($start-$y);
$this->img->current_color = $colmap[$y];
$this->img->Line($x1,$y,$x2,$y);
--$y;
}
}
}
}
 
//---------------
// PRIVATE METHODS
// Add to the image color map the necessary colors to do the transition
// between the two colors using $numcolors intermediate colors
function GetColArray($from_color,$to_color,$arr_size,&$colors,$numcols=100) {
if( $arr_size==0 ) {
return;
}
 
// If color is given as text get it's corresponding r,g,b values
$from_color = $this->img->rgb->Color($from_color);
$to_color = $this->img->rgb->Color($to_color);
 
$rdelta=($to_color[0]-$from_color[0])/$numcols;
$gdelta=($to_color[1]-$from_color[1])/$numcols;
$bdelta=($to_color[2]-$from_color[2])/$numcols;
$colorsperstep = $numcols/$arr_size;
$prevcolnum = -1;
$from_alpha = $from_color[3];
$to_alpha = $to_color[3];
$adelta = ( $to_alpha - $from_alpha ) / $numcols ;
for ($i=0; $i < $arr_size; ++$i) {
$colnum = floor($colorsperstep*$i);
if ( $colnum == $prevcolnum ) {
$colors[$i] = $colidx;
}
else {
$r = floor($from_color[0] + $colnum*$rdelta);
$g = floor($from_color[1] + $colnum*$gdelta);
$b = floor($from_color[2] + $colnum*$bdelta);
$alpha = $from_alpha + $colnum*$adelta;
$colidx = $this->img->rgb->Allocate(sprintf("#%02x%02x%02x",$r,$g,$b),$alpha);
$colors[$i] = $colidx;
}
$prevcolnum = $colnum;
}
}
} // Class
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_errhandler.inc.php
New file
0,0 → 1,368
<?php
//=======================================================================
// File: JPGRAPH_ERRHANDLER.PHP
// Description: Error handler class together with handling of localized
// error messages. All localized error messages are stored
// in a separate file under the "lang/" subdirectory.
// Created: 2006-09-24
// Ver: $Id: jpgraph_errhandler.inc.php 1920 2009-12-08 10:02:26Z ljp $
//
// Copyright 2006 (c) Aditus Consulting. All rights reserved.
//========================================================================
 
if( !defined('DEFAULT_ERR_LOCALE') ) {
define('DEFAULT_ERR_LOCALE','en');
}
 
if( !defined('USE_IMAGE_ERROR_HANDLER') ) {
define('USE_IMAGE_ERROR_HANDLER',true);
}
 
GLOBAL $__jpg_err_locale ;
$__jpg_err_locale = DEFAULT_ERR_LOCALE;
 
class ErrMsgText {
private $lt=NULL;
function __construct() {
GLOBAL $__jpg_err_locale;
$file = 'lang/'.$__jpg_err_locale.'.inc.php';
 
// If the chosen locale doesn't exist try english
if( !file_exists(dirname(__FILE__).'/'.$file) ) {
$__jpg_err_locale = 'en';
}
 
$file = 'lang/'.$__jpg_err_locale.'.inc.php';
if( !file_exists(dirname(__FILE__).'/'.$file) ) {
die('Chosen locale file ("'.$file.'") for error messages does not exist or is not readable for the PHP process. Please make sure that the file exists and that the file permissions are such that the PHP process is allowed to read this file.');
}
require($file);
$this->lt = $_jpg_messages;
}
 
function Get($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
GLOBAL $__jpg_err_locale;
if( !isset($this->lt[$errnbr]) ) {
return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')';
}
$ea = $this->lt[$errnbr];
$j=0;
if( $a1 !== null ) {
$argv[$j++] = $a1;
if( $a2 !== null ) {
$argv[$j++] = $a2;
if( $a3 !== null ) {
$argv[$j++] = $a3;
if( $a4 !== null ) {
$argv[$j++] = $a4;
if( $a5 !== null ) {
$argv[$j++] = $a5;
}
}
}
}
}
$numargs = $j;
if( $ea[1] != $numargs ) {
// Error message argument count do not match.
// Just return the error message without arguments.
return $ea[0];
}
switch( $numargs ) {
case 1:
$msg = sprintf($ea[0],$argv[0]);
break;
case 2:
$msg = sprintf($ea[0],$argv[0],$argv[1]);
break;
case 3:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]);
break;
case 4:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]);
break;
case 5:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]);
break;
case 0:
default:
$msg = sprintf($ea[0]);
break;
}
return $msg;
}
}
//
// A wrapper class that is used to access the specified error object
// (to hide the global error parameter and avoid having a GLOBAL directive
// in all methods.
//
class JpGraphError {
private static $__iImgFlg = true;
private static $__iLogFile = '';
private static $__iTitle = 'JpGraph Error: ';
public static function Raise($aMsg,$aHalt=true){
throw new JpGraphException($aMsg);
}
public static function SetErrLocale($aLoc) {
GLOBAL $__jpg_err_locale ;
$__jpg_err_locale = $aLoc;
}
public static function RaiseL($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
throw new JpGraphExceptionL($errnbr,$a1,$a2,$a3,$a4,$a5);
}
public static function SetImageFlag($aFlg=true) {
self::$__iImgFlg = $aFlg;
}
public static function GetImageFlag() {
return self::$__iImgFlg;
}
public static function SetLogFile($aFile) {
self::$__iLogFile = $aFile;
}
public static function GetLogFile() {
return self::$__iLogFile;
}
public static function SetTitle($aTitle) {
self::$__iTitle = $aTitle;
}
public static function GetTitle() {
return self::$__iTitle;
}
}
 
class JpGraphException extends Exception {
// Redefine the exception so message isn't optional
public function __construct($message, $code = 0) {
// make sure everything is assigned properly
parent::__construct($message, $code);
}
// custom string representation of object
public function _toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message} at " . basename($this->getFile()) . ":" . $this->getLine() . "\n" . $this->getTraceAsString() . "\n";
}
// custom representation of error as an image
public function Stroke() {
if( JpGraphError::GetImageFlag() ) {
$errobj = new JpGraphErrObjectImg();
$errobj->SetTitle(JpGraphError::GetTitle());
}
else {
$errobj = new JpGraphErrObject();
$errobj->SetTitle(JpGraphError::GetTitle());
$errobj->SetStrokeDest(JpGraphError::GetLogFile());
}
$errobj->Raise($this->getMessage());
}
static public function defaultHandler(Exception $exception) {
global $__jpg_OldHandler;
if( $exception instanceof JpGraphException ) {
$exception->Stroke();
}
else {
// Restore old handler
if( $__jpg_OldHandler !== NULL ) {
set_exception_handler($__jpg_OldHandler);
}
throw $exception;
}
}
}
 
class JpGraphExceptionL extends JpGraphException {
// Redefine the exception so message isn't optional
public function __construct($errcode,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
// make sure everything is assigned properly
$errtxt = new ErrMsgText();
JpGraphError::SetTitle('JpGraph Error: '.$errcode);
parent::__construct($errtxt->Get($errcode,$a1,$a2,$a3,$a4,$a5), 0);
}
}
 
// Setup the default handler
global $__jpg_OldHandler;
$__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandler'));
 
//
// First of all set up a default error handler
//
 
//=============================================================
// The default trivial text error handler.
//=============================================================
class JpGraphErrObject {
 
protected $iTitle = "JpGraph error: ";
protected $iDest = false;
 
 
function __construct() {
// Empty. Reserved for future use
}
 
function SetTitle($aTitle) {
$this->iTitle = $aTitle;
}
 
function SetStrokeDest($aDest) {
$this->iDest = $aDest;
}
 
// If aHalt is true then execution can't continue. Typical used for fatal errors
function Raise($aMsg,$aHalt=false) {
if( $this->iDest != '' ) {
if( $this->iDest == 'syslog' ) {
error_log($this->iTitle.$aMsg);
}
else {
$str = '['.date('r').'] '.$this->iTitle.$aMsg."\n";
$f = @fopen($this->iDest,'a');
if( $f ) {
@fwrite($f,$str);
@fclose($f);
}
}
}
else {
$aMsg = $this->iTitle.$aMsg;
// Check SAPI and if we are called from the command line
// send the error to STDERR instead
if( PHP_SAPI == 'cli' ) {
fwrite(STDERR,$aMsg);
}
else {
echo $aMsg;
}
}
if( $aHalt )
exit(1);
}
}
 
//==============================================================
// An image based error handler
//==============================================================
class JpGraphErrObjectImg extends JpGraphErrObject {
function __construct() {
parent::__construct();
// Empty. Reserved for future use
}
 
function Raise($aMsg,$aHalt=true) {
$img_iconerror =
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
'2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
'6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
'qL72fwAAAABJRU5ErkJggg==' ;
 
if( function_exists("imagetypes") ) {
$supported = imagetypes();
} else {
$supported = 0;
}
 
if( !function_exists('imagecreatefromstring') ) {
$supported = 0;
}
if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) {
// Special case for headers already sent or that the installation doesn't support
// the PNG format (which the error icon is encoded in).
// Dont return an image since it can't be displayed
die($this->iTitle.' '.$aMsg);
}
 
$aMsg = wordwrap($aMsg,55);
$lines = substr_count($aMsg,"\n");
 
// Create the error icon GD
$erricon = Image::CreateFromString(base64_decode($img_iconerror));
 
// Create an image that contains the error text.
$w=400;
$h=100 + 15*max(0,$lines-3);
 
$img = new Image($w,$h);
 
 
// Drop shadow
$img->SetColor("gray");
$img->FilledRectangle(5,5,$w-1,$h-1,10);
$img->SetColor("gray:0.7");
$img->FilledRectangle(5,5,$w-3,$h-3,10);
 
// Window background
$img->SetColor("lightblue");
$img->FilledRectangle(1,1,$w-5,$h-5);
$img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40);
 
// Window border
$img->SetColor("black");
$img->Rectangle(1,1,$w-5,$h-5);
$img->Rectangle(0,0,$w-4,$h-4);
 
// Window top row
$img->SetColor("darkred");
for($y=3; $y < 18; $y += 2 )
$img->Line(1,$y,$w-6,$y);
 
// "White shadow"
$img->SetColor("white");
 
// Left window edge
$img->Line(2,2,2,$h-5);
$img->Line(2,2,$w-6,2);
 
// "Gray button shadow"
$img->SetColor("darkgray");
 
// Gray window shadow
$img->Line(2,$h-6,$w-5,$h-6);
$img->Line(3,$h-7,$w-5,$h-7);
 
// Window title
$m = floor($w/2-5);
$l = 110;
$img->SetColor("lightgray:1.3");
$img->FilledRectangle($m-$l,2,$m+$l,16);
 
// Stroke text
$img->SetColor("darkred");
$img->SetFont(FF_FONT2,FS_BOLD);
$img->StrokeText($m-90,15,$this->iTitle);
$img->SetColor("black");
$img->SetFont(FF_FONT1,FS_NORMAL);
$txt = new Text($aMsg,52,25);
$txt->Align("left","top");
$txt->Stroke($img);
if ($this->iDest) {
$img->Stream($this->iDest);
} else {
$img->Headers();
$img->Stream();
}
if( $aHalt )
die();
}
}
 
 
 
if( ! USE_IMAGE_ERROR_HANDLER ) {
JpGraphError::SetImageFlag(false);
}
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_plotband.php
New file
0,0 → 1,635
<?php
//=======================================================================
// File: JPGRAPH_PLOTBAND.PHP
// Description: PHP4 Graph Plotting library. Extension module.
// Created: 2004-02-18
// Ver: $Id: jpgraph_plotband.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
// Constants for types of static bands in plot area
define("BAND_RDIAG",1); // Right diagonal lines
define("BAND_LDIAG",2); // Left diagonal lines
define("BAND_SOLID",3); // Solid one color
define("BAND_VLINE",4); // Vertical lines
define("BAND_HLINE",5); // Horizontal lines
define("BAND_3DPLANE",6); // "3D" Plane
define("BAND_HVCROSS",7); // Vertical/Hor crosses
define("BAND_DIAGCROSS",8); // Diagonal crosses
 
 
// Utility class to hold coordinates for a rectangle
class Rectangle {
public $x,$y,$w,$h;
public $xe, $ye;
function __construct($aX,$aY,$aWidth,$aHeight) {
$this->x=$aX;
$this->y=$aY;
$this->w=$aWidth;
$this->h=$aHeight;
$this->xe=$aX+$aWidth-1;
$this->ye=$aY+$aHeight-1;
}
}
 
//=====================================================================
// Class RectPattern
// Base class for pattern hierarchi that is used to display patterned
// bands on the graph. Any subclass that doesn't override Stroke()
// must at least implement method DoPattern($aImg) which is responsible
// for drawing the pattern onto the graph.
//=====================================================================
class RectPattern {
protected $color;
protected $weight;
protected $rect=null;
protected $doframe=true;
protected $linespacing; // Line spacing in pixels
protected $iBackgroundColor=-1; // Default is no background fill
 
function __construct($aColor,$aWeight=1) {
$this->color = $aColor;
$this->weight = $aWeight;
}
 
function SetBackground($aBackgroundColor) {
$this->iBackgroundColor=$aBackgroundColor;
}
 
function SetPos($aRect) {
$this->rect = $aRect;
}
 
function ShowFrame($aShow=true) {
$this->doframe=$aShow;
}
 
function SetDensity($aDens) {
if( $aDens < 1 || $aDens > 100 )
JpGraphError::RaiseL(16001,$aDens);
//(" Desity for pattern must be between 1 and 100. (You tried $aDens)");
// 1% corresponds to linespacing=50
// 100 % corresponds to linespacing 1
$this->linespacing = floor(((100-$aDens)/100.0)*50)+1;
 
}
 
function Stroke($aImg) {
if( $this->rect == null )
JpGraphError::RaiseL(16002);
//(" No positions specified for pattern.");
 
if( !(is_numeric($this->iBackgroundColor) && $this->iBackgroundColor==-1) ) {
$aImg->SetColor($this->iBackgroundColor);
$aImg->FilledRectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye);
}
 
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->weight);
 
// Virtual function implemented by subclass
$this->DoPattern($aImg);
 
// Frame around the pattern area
if( $this->doframe )
$aImg->Rectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye);
}
 
}
 
 
//=====================================================================
// Class RectPatternSolid
// Implements a solid band
//=====================================================================
class RectPatternSolid extends RectPattern {
 
function __construct($aColor="black",$aWeight=1) {
parent::__construct($aColor,$aWeight);
}
 
function DoPattern($aImg) {
$aImg->SetColor($this->color);
$aImg->FilledRectangle($this->rect->x,$this->rect->y,
$this->rect->xe,$this->rect->ye);
}
}
 
//=====================================================================
// Class RectPatternHor
// Implements horizontal line pattern
//=====================================================================
class RectPatternHor extends RectPattern {
 
function __construct($aColor="black",$aWeight=1,$aLineSpacing=7) {
parent::__construct($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
 
function DoPattern($aImg) {
$x0 = $this->rect->x;
$x1 = $this->rect->xe;
$y = $this->rect->y;
while( $y < $this->rect->ye ) {
$aImg->Line($x0,$y,$x1,$y);
$y += $this->linespacing;
}
}
}
 
//=====================================================================
// Class RectPatternVert
// Implements vertical line pattern
//=====================================================================
class RectPatternVert extends RectPattern {
 
function __construct($aColor="black",$aWeight=1,$aLineSpacing=7) {
parent::__construct($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
 
//--------------------
// Private methods
//
function DoPattern($aImg) {
$x = $this->rect->x;
$y0 = $this->rect->y;
$y1 = $this->rect->ye;
while( $x < $this->rect->xe ) {
$aImg->Line($x,$y0,$x,$y1);
$x += $this->linespacing;
}
}
}
 
 
//=====================================================================
// Class RectPatternRDiag
// Implements right diagonal pattern
//=====================================================================
class RectPatternRDiag extends RectPattern {
 
function __construct($aColor="black",$aWeight=1,$aLineSpacing=12) {
parent::__construct($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
 
function DoPattern($aImg) {
// --------------------
// | / / / / /|
// |/ / / / / |
// | / / / / |
// --------------------
$xe = $this->rect->xe;
$ye = $this->rect->ye;
$x0 = $this->rect->x + round($this->linespacing/2);
$y0 = $this->rect->y;
$x1 = $this->rect->x;
$y1 = $this->rect->y + round($this->linespacing/2);
 
while($x0<=$xe && $y1<=$ye) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$y1 += $this->linespacing;
}
 
if( $xe-$x1 > $ye-$y0 ) {
// Width larger than height
$x1 = $this->rect->x + ($y1-$ye);
$y1 = $ye;
$y0 = $this->rect->y;
while( $x0 <= $xe ) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$x1 += $this->linespacing;
}
$y0=$this->rect->y + ($x0-$xe);
$x0=$xe;
}
else {
// Height larger than width
$diff = $x0-$xe;
$y0 = $diff+$this->rect->y;
$x0 = $xe;
$x1 = $this->rect->x;
while( $y1 <= $ye ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y1 += $this->linespacing;
$y0 += $this->linespacing;
}
$diff = $y1-$ye;
$y1 = $ye;
$x1 = $diff + $this->rect->x;
}
 
while( $y0 <= $ye ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 += $this->linespacing;
$x1 += $this->linespacing;
}
}
}
 
//=====================================================================
// Class RectPatternLDiag
// Implements left diagonal pattern
//=====================================================================
class RectPatternLDiag extends RectPattern {
 
function __construct($aColor="black",$aWeight=1,$aLineSpacing=12) {
$this->linespacing = $aLineSpacing;
parent::__construct($aColor,$aWeight);
}
 
function DoPattern($aImg) {
// --------------------
// |\ \ \ \ \ |
// | \ \ \ \ \|
// | \ \ \ \ |
// |------------------|
$xe = $this->rect->xe;
$ye = $this->rect->ye;
$x0 = $this->rect->x + round($this->linespacing/2);
$y0 = $this->rect->ye;
$x1 = $this->rect->x;
$y1 = $this->rect->ye - round($this->linespacing/2);
 
while($x0<=$xe && $y1>=$this->rect->y) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$y1 -= $this->linespacing;
}
if( $xe-$x1 > $ye-$this->rect->y ) {
// Width larger than height
$x1 = $this->rect->x + ($this->rect->y-$y1);
$y0=$ye; $y1=$this->rect->y;
while( $x0 <= $xe ) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$x1 += $this->linespacing;
}
$y0=$this->rect->ye - ($x0-$xe);
$x0=$xe;
}
else {
// Height larger than width
$diff = $x0-$xe;
$y0 = $ye-$diff;
$x0 = $xe;
while( $y1 >= $this->rect->y ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 -= $this->linespacing;
$y1 -= $this->linespacing;
}
$diff = $this->rect->y - $y1;
$x1 = $this->rect->x + $diff;
$y1 = $this->rect->y;
}
while( $y0 >= $this->rect->y ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 -= $this->linespacing;
$x1 += $this->linespacing;
}
}
}
 
//=====================================================================
// Class RectPattern3DPlane
// Implements "3D" plane pattern
//=====================================================================
class RectPattern3DPlane extends RectPattern {
private $alpha=50; // Parameter that specifies the distance
// to "simulated" horizon in pixel from the
// top of the band. Specifies how fast the lines
// converge.
 
function __construct($aColor="black",$aWeight=1) {
parent::__construct($aColor,$aWeight);
$this->SetDensity(10); // Slightly larger default
}
 
function SetHorizon($aHorizon) {
$this->alpha=$aHorizon;
}
 
function DoPattern($aImg) {
// "Fake" a nice 3D grid-effect.
$x0 = $this->rect->x + $this->rect->w/2;
$y0 = $this->rect->y;
$x1 = $x0;
$y1 = $this->rect->ye;
$x0_right = $x0;
$x1_right = $x1;
 
// BTW "apa" means monkey in Swedish but is really a shortform for
// "alpha+a" which was the labels I used on paper when I derived the
// geometric to get the 3D perspective right.
// $apa is the height of the bounding rectangle plus the distance to the
// artifical horizon (alpha)
$apa = $this->rect->h + $this->alpha;
 
// Three cases and three loops
// 1) The endpoint of the line ends on the bottom line
// 2) The endpoint ends on the side
// 3) Horizontal lines
 
// Endpoint falls on bottom line
$middle=$this->rect->x + $this->rect->w/2;
$dist=$this->linespacing;
$factor=$this->alpha /($apa);
while($x1>$this->rect->x) {
$aImg->Line($x0,$y0,$x1,$y1);
$aImg->Line($x0_right,$y0,$x1_right,$y1);
$x1 = $middle - $dist;
$x0 = $middle - $dist * $factor;
$x1_right = $middle + $dist;
$x0_right = $middle + $dist * $factor;
$dist += $this->linespacing;
}
 
// Endpoint falls on sides
$dist -= $this->linespacing;
$d=$this->rect->w/2;
$c = $apa - $d*$apa/$dist;
while( $x0>$this->rect->x ) {
$aImg->Line($x0,$y0,$this->rect->x,$this->rect->ye-$c);
$aImg->Line($x0_right,$y0,$this->rect->xe,$this->rect->ye-$c);
$dist += $this->linespacing;
$x0 = $middle - $dist * $factor;
$x1 = $middle - $dist;
$x0_right = $middle + $dist * $factor;
$c = $apa - $d*$apa/$dist;
}
 
// Horizontal lines
// They need some serious consideration since they are a function
// of perspective depth (alpha) and density (linespacing)
$x0=$this->rect->x;
$x1=$this->rect->xe;
$y=$this->rect->ye;
 
// The first line is drawn directly. Makes the loop below slightly
// more readable.
$aImg->Line($x0,$y,$x1,$y);
$hls = $this->linespacing;
 
// A correction factor for vertical "brick" line spacing to account for
// a) the difference in number of pixels hor vs vert
// b) visual apperance to make the first layer of "bricks" look more
// square.
$vls = $this->linespacing*0.6;
 
$ds = $hls*($apa-$vls)/$apa;
// Get the slope for the "perspective line" going from bottom right
// corner to top left corner of the "first" brick.
 
// Uncomment the following lines if you want to get a visual understanding
// of what this helpline does. BTW this mimics the way you would get the
// perspective right when drawing on paper.
/*
$x0 = $middle;
$y0 = $this->rect->ye;
$len=floor(($this->rect->ye-$this->rect->y)/$vls);
$x1 = $middle+round($len*$ds);
$y1 = $this->rect->ye-$len*$vls;
$aImg->PushColor("red");
$aImg->Line($x0,$y0,$x1,$y1);
$aImg->PopColor();
*/
 
$y -= $vls;
$k=($this->rect->ye-($this->rect->ye-$vls))/($middle-($middle-$ds));
$dist = $hls;
while( $y>$this->rect->y ) {
$aImg->Line($this->rect->x,$y,$this->rect->xe,$y);
$adj = $k*$dist/(1+$dist*$k/$apa);
if( $adj < 2 ) $adj=1;
$y = $this->rect->ye - round($adj);
$dist += $hls;
}
}
}
 
//=====================================================================
// Class RectPatternCross
// Vert/Hor crosses
//=====================================================================
class RectPatternCross extends RectPattern {
private $vert=null;
private $hor=null;
function __construct($aColor="black",$aWeight=1) {
parent::__construct($aColor,$aWeight);
$this->vert = new RectPatternVert($aColor,$aWeight);
$this->hor = new RectPatternHor($aColor,$aWeight);
}
 
function SetOrder($aDepth) {
$this->vert->SetOrder($aDepth);
$this->hor->SetOrder($aDepth);
}
 
function SetPos($aRect) {
parent::SetPos($aRect);
$this->vert->SetPos($aRect);
$this->hor->SetPos($aRect);
}
 
function SetDensity($aDens) {
$this->vert->SetDensity($aDens);
$this->hor->SetDensity($aDens);
}
 
function DoPattern($aImg) {
$this->vert->DoPattern($aImg);
$this->hor->DoPattern($aImg);
}
}
 
//=====================================================================
// Class RectPatternDiagCross
// Vert/Hor crosses
//=====================================================================
 
class RectPatternDiagCross extends RectPattern {
private $left=null;
private $right=null;
function __construct($aColor="black",$aWeight=1) {
parent::__construct($aColor,$aWeight);
$this->right = new RectPatternRDiag($aColor,$aWeight);
$this->left = new RectPatternLDiag($aColor,$aWeight);
}
 
function SetOrder($aDepth) {
$this->left->SetOrder($aDepth);
$this->right->SetOrder($aDepth);
}
 
function SetPos($aRect) {
parent::SetPos($aRect);
$this->left->SetPos($aRect);
$this->right->SetPos($aRect);
}
 
function SetDensity($aDens) {
$this->left->SetDensity($aDens);
$this->right->SetDensity($aDens);
}
 
function DoPattern($aImg) {
$this->left->DoPattern($aImg);
$this->right->DoPattern($aImg);
}
 
}
 
//=====================================================================
// Class RectPatternFactory
// Factory class for rectangular pattern
//=====================================================================
class RectPatternFactory {
function __construct() {
// Empty
}
function Create($aPattern,$aColor,$aWeight=1) {
switch($aPattern) {
case BAND_RDIAG:
$obj = new RectPatternRDiag($aColor,$aWeight);
break;
case BAND_LDIAG:
$obj = new RectPatternLDiag($aColor,$aWeight);
break;
case BAND_SOLID:
$obj = new RectPatternSolid($aColor,$aWeight);
break;
case BAND_VLINE:
$obj = new RectPatternVert($aColor,$aWeight);
break;
case BAND_HLINE:
$obj = new RectPatternHor($aColor,$aWeight);
break;
case BAND_3DPLANE:
$obj = new RectPattern3DPlane($aColor,$aWeight);
break;
case BAND_HVCROSS:
$obj = new RectPatternCross($aColor,$aWeight);
break;
case BAND_DIAGCROSS:
$obj = new RectPatternDiagCross($aColor,$aWeight);
break;
default:
JpGraphError::RaiseL(16003,$aPattern);
//(" Unknown pattern specification ($aPattern)");
}
return $obj;
}
}
 
 
//=====================================================================
// Class PlotBand
// Factory class which is used by the client.
// It is responsible for factoring the corresponding pattern
// concrete class.
//=====================================================================
class PlotBand {
public $depth; // Determine if band should be over or under the plots
private $prect=null;
private $dir, $min, $max;
 
function __construct($aDir,$aPattern,$aMin,$aMax,$aColor="black",$aWeight=1,$aDepth=DEPTH_BACK) {
$f = new RectPatternFactory();
$this->prect = $f->Create($aPattern,$aColor,$aWeight);
if( is_numeric($aMin) && is_numeric($aMax) && ($aMin > $aMax) )
JpGraphError::RaiseL(16004);
//('Min value for plotband is larger than specified max value. Please correct.');
$this->dir = $aDir;
$this->min = $aMin;
$this->max = $aMax;
$this->depth=$aDepth;
}
 
// Set position. aRect contains absolute image coordinates
function SetPos($aRect) {
assert( $this->prect != null ) ;
$this->prect->SetPos($aRect);
}
 
function ShowFrame($aFlag=true) {
$this->prect->ShowFrame($aFlag);
}
 
// Set z-order. In front of pplot or in the back
function SetOrder($aDepth) {
$this->depth=$aDepth;
}
 
function SetDensity($aDens) {
$this->prect->SetDensity($aDens);
}
 
function GetDir() {
return $this->dir;
}
 
function GetMin() {
return $this->min;
}
 
function GetMax() {
return $this->max;
}
 
function PreStrokeAdjust($aGraph) {
// Nothing to do
}
 
// Display band
function Stroke($aImg,$aXScale,$aYScale) {
assert( $this->prect != null ) ;
if( $this->dir == HORIZONTAL ) {
if( $this->min === 'min' ) $this->min = $aYScale->GetMinVal();
if( $this->max === 'max' ) $this->max = $aYScale->GetMaxVal();
 
// Only draw the bar if it actually appears in the range
if ($this->min < $aYScale->GetMaxVal() && $this->max > $aYScale->GetMinVal()) {
// Trucate to limit of axis
$this->min = max($this->min, $aYScale->GetMinVal());
$this->max = min($this->max, $aYScale->GetMaxVal());
 
$x=$aXScale->scale_abs[0];
$y=$aYScale->Translate($this->max);
$width=$aXScale->scale_abs[1]-$aXScale->scale_abs[0]+1;
$height=abs($y-$aYScale->Translate($this->min))+1;
$this->prect->SetPos(new Rectangle($x,$y,$width,$height));
$this->prect->Stroke($aImg);
}
}
else { // VERTICAL
if( $this->min === 'min' ) $this->min = $aXScale->GetMinVal();
if( $this->max === 'max' ) $this->max = $aXScale->GetMaxVal();
 
// Only draw the bar if it actually appears in the range
if ($this->min < $aXScale->GetMaxVal() && $this->max > $aXScale->GetMinVal()) {
// Trucate to limit of axis
$this->min = max($this->min, $aXScale->GetMinVal());
$this->max = min($this->max, $aXScale->GetMaxVal());
 
$y=$aYScale->scale_abs[1];
$x=$aXScale->Translate($this->min);
$height=abs($aYScale->scale_abs[1]-$aYScale->scale_abs[0]);
$width=abs($x-$aXScale->Translate($this->max));
$this->prect->SetPos(new Rectangle($x,$y,$width,$height));
$this->prect->Stroke($aImg);
}
}
}
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_pie3d.php
New file
0,0 → 1,933
<?php
/*=======================================================================
// File: JPGRAPH_PIE3D.PHP
// Description: 3D Pie plot extension for JpGraph
// Created: 2001-03-24
// Ver: $Id: jpgraph_pie3d.php 1329 2009-06-20 19:23:30Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS PiePlot3D
// Description: Plots a 3D pie with a specified projection
// angle between 20 and 70 degrees.
//===================================================
class PiePlot3D extends PiePlot {
private $labelhintcolor="red",$showlabelhint=true;
private $angle=50;
private $edgecolor="", $edgeweight=1;
private $iThickness=false;
 
//---------------
// CONSTRUCTOR
function __construct($data) {
$this->radius = 0.5;
$this->data = $data;
$this->title = new Text("");
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->value = new DisplayValue();
$this->value->Show();
$this->value->SetFormat('%.0f%%');
}
 
//---------------
// PUBLIC METHODS
 
// Set label arrays
function SetLegends($aLegend) {
$this->legends = array_reverse(array_slice($aLegend,0,count($this->data)));
}
 
function SetSliceColors($aColors) {
$this->setslicecolors = $aColors;
}
 
function Legend($aGraph) {
parent::Legend($aGraph);
$aGraph->legend->txtcol = array_reverse($aGraph->legend->txtcol);
}
 
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets = $aTargets;
$this->csimwintargets = $aWinTargets;
$this->csimalts = $aAlts;
}
 
// Should the slices be separated by a line? If color is specified as "" no line
// will be used to separate pie slices.
function SetEdge($aColor='black',$aWeight=1) {
$this->edgecolor = $aColor;
$this->edgeweight = $aWeight;
}
 
// Specify projection angle for 3D in degrees
// Must be between 20 and 70 degrees
function SetAngle($a) {
if( $a<5 || $a>90 ) {
JpGraphError::RaiseL(14002);
//("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.");
}
else {
$this->angle = $a;
}
}
 
function Add3DSliceToCSIM($i,$xc,$yc,$height,$width,$thick,$sa,$ea) { //Slice number, ellipse centre (x,y), height, width, start angle, end angle
 
$sa *= M_PI/180;
$ea *= M_PI/180;
 
//add coordinates of the centre to the map
$coords = "$xc, $yc";
 
//add coordinates of the first point on the arc to the map
$xp = floor($width*cos($sa)/2+$xc);
$yp = floor($yc-$height*sin($sa)/2);
$coords.= ", $xp, $yp";
 
//If on the front half, add the thickness offset
if ($sa >= M_PI && $sa <= 2*M_PI*1.01) {
$yp = floor($yp+$thick);
$coords.= ", $xp, $yp";
}
 
//add coordinates every 0.2 radians
$a=$sa+0.2;
while ($a<$ea) {
$xp = floor($width*cos($a)/2+$xc);
if ($a >= M_PI && $a <= 2*M_PI*1.01) {
$yp = floor($yc-($height*sin($a)/2)+$thick);
} else {
$yp = floor($yc-$height*sin($a)/2);
}
$coords.= ", $xp, $yp";
$a += 0.2;
}
 
//Add the last point on the arc
$xp = floor($width*cos($ea)/2+$xc);
$yp = floor($yc-$height*sin($ea)/2);
 
 
if ($ea >= M_PI && $ea <= 2*M_PI*1.01) {
$coords.= ", $xp, ".floor($yp+$thick);
}
$coords.= ", $xp, $yp";
$alt='';
 
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtargets[$i]."\"";
 
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
 
}
 
function SetLabels($aLabels,$aLblPosAdj="auto") {
$this->labels = $aLabels;
$this->ilabelposadj=$aLblPosAdj;
}
 
 
// Distance from the pie to the labels
function SetLabelMargin($m) {
$this->value->SetMargin($m);
}
 
// Show a thin line from the pie to the label for a specific slice
function ShowLabelHint($f=true) {
$this->showlabelhint=$f;
}
 
// Set color of hint line to label for each slice
function SetLabelHintColor($c) {
$this->labelhintcolor=$c;
}
 
function SetHeight($aHeight) {
$this->iThickness = $aHeight;
}
 
 
// Normalize Angle between 0-360
function NormAngle($a) {
// Normalize anle to 0 to 2M_PI
//
if( $a > 0 ) {
while($a > 360) $a -= 360;
}
else {
while($a < 0) $a += 360;
}
if( $a < 0 )
$a = 360 + $a;
 
if( $a == 360 ) $a=0;
return $a;
}
 
 
 
// Draw one 3D pie slice at position ($xc,$yc) with height $z
function Pie3DSlice($img,$xc,$yc,$w,$h,$sa,$ea,$z,$fillcolor,$shadow=0.65) {
 
// Due to the way the 3D Pie algorithm works we are
// guaranteed that any slice we get into this method
// belongs to either the left or right side of the
// pie ellipse. Hence, no slice will cross 90 or 270
// point.
if( ($sa < 90 && $ea > 90) || ( ($sa > 90 && $sa < 270) && $ea > 270) ) {
JpGraphError::RaiseL(14003);//('Internal assertion failed. Pie3D::Pie3DSlice');
exit(1);
}
 
$p[] = array();
 
// Setup pre-calculated values
$rsa = $sa/180*M_PI; // to Rad
$rea = $ea/180*M_PI; // to Rad
$sinsa = sin($rsa);
$cossa = cos($rsa);
$sinea = sin($rea);
$cosea = cos($rea);
 
// p[] is the points for the overall slice and
// pt[] is the points for the top pie
 
// Angular step when approximating the arc with a polygon train.
$step = 0.05;
 
if( $sa >= 270 ) {
if( $ea > 360 || ($ea > 0 && $ea <= 90) ) {
if( $ea > 0 && $ea <= 90 ) {
// Adjust angle to simplify conditions in loops
$rea += 2*M_PI;
}
 
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa);
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
 
for( $a=$rsa; $a < 2*M_PI; $a += $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w;
$pt[] = $yc;
 
$p[] = $xc+$w;
$p[] = $z+$yc;
$p[] = $xc+$w;
$p[] = $yc;
$p[] = $xc;
$p[] = $yc;
 
for( $a=2*M_PI+$step; $a < $rea; $a += $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
 
}
else {
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa);
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
 
$rea = $rea == 0.0 ? 2*M_PI : $rea;
for( $a=$rsa; $a < $rea; $a += $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
 
$p[] = $xc+$w*$cosea;
$p[] = $z+$yc-$h*$sinea;
$p[] = $xc+$w*$cosea;
$p[] = $yc-$h*$sinea;
$p[] = $xc;
$p[] = $yc;
}
}
elseif( $sa >= 180 ) {
$p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
 
for( $a=$rea; $a>$rsa; $a -= $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
 
$p[] = $xc+$w*$cossa;
$p[] = $z+$yc-$h*$sinsa;
$p[] = $xc+$w*$cossa;
$p[] = $yc-$h*$sinsa;
$p[] = $xc;
$p[] = $yc;
 
}
elseif( $sa >= 90 ) {
if( $ea > 180 ) {
$p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
 
for( $a=$rea; $a > M_PI; $a -= $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z + $yc - $h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$p[] = $xc-$w;
$p[] = $z+$yc;
$p[] = $xc-$w;
$p[] = $yc;
$p[] = $xc;
$p[] = $yc;
 
$pt[] = $xc-$w;
$pt[] = $z+$yc;
$pt[] = $xc-$w;
$pt[] = $yc;
 
for( $a=M_PI-$step; $a > $rsa; $a -= $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
 
}
else { // $sa >= 90 && $ea <= 180
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cosea,$z+$yc-$h*$sinea,
$xc+$w*$cosea,$yc-$h*$sinea,
$xc,$yc);
 
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
 
for( $a=$rea; $a>$rsa; $a -= $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
 
}
}
else { // sa > 0 && ea < 90
 
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa,
$xc+$w*$cossa,$yc-$h*$sinsa,
$xc,$yc);
 
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
 
for( $a=$rsa; $a < $rea; $a += $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
}
$img->PushColor($fillcolor.":".$shadow);
$img->FilledPolygon($p);
$img->PopColor();
 
$img->PushColor($fillcolor);
$img->FilledPolygon($pt);
$img->PopColor();
}
 
function SetStartAngle($aStart) {
if( $aStart < 0 || $aStart > 360 ) {
JpGraphError::RaiseL(14004);//('Slice start angle must be between 0 and 360 degrees.');
}
$this->startangle = $aStart;
}
 
// Draw a 3D Pie
function Pie3D($aaoption,$img,$data,$colors,$xc,$yc,$d,$angle,$z,
$shadow=0.65,$startangle=0,$edgecolor="",$edgeweight=1) {
 
//---------------------------------------------------------------------------
// As usual the algorithm get more complicated than I originally
// envisioned. I believe that this is as simple as it is possible
// to do it with the features I want. It's a good exercise to start
// thinking on how to do this to convince your self that all this
// is really needed for the general case.
//
// The algorithm two draw 3D pies without "real 3D" is done in
// two steps.
// First imagine the pie cut in half through a thought line between
// 12'a clock and 6'a clock. It now easy to imagine that we can plot
// the individual slices for each half by starting with the topmost
// pie slice and continue down to 6'a clock.
//
// In the algortithm this is done in three principal steps
// Step 1. Do the knife cut to ensure by splitting slices that extends
// over the cut line. This is done by splitting the original slices into
// upto 3 subslices.
// Step 2. Find the top slice for each half
// Step 3. Draw the slices from top to bottom
//
// The thing that slightly complicates this scheme with all the
// angle comparisons below is that we can have an arbitrary start
// angle so we must take into account the different equivalence classes.
// For the same reason we must walk through the angle array in a
// modulo fashion.
//
// Limitations of algorithm:
// * A small exploded slice which crosses the 270 degree point
// will get slightly nagged close to the center due to the fact that
// we print the slices in Z-order and that the slice left part
// get printed first and might get slightly nagged by a larger
// slice on the right side just before the right part of the small
// slice. Not a major problem though.
//---------------------------------------------------------------------------
 
 
// Determine the height of the ellippse which gives an
// indication of the inclination angle
$h = ($angle/90.0)*$d;
$sum = 0;
for($i=0; $i<count($data); ++$i ) {
$sum += $data[$i];
}
 
// Special optimization
if( $sum==0 ) return;
 
if( $this->labeltype == 2 ) {
$this->adjusted_data = $this->AdjPercentage($data);
}
 
// Setup the start
$accsum = 0;
$a = $startangle;
$a = $this->NormAngle($a);
 
//
// Step 1 . Split all slices that crosses 90 or 270
//
$idx=0;
$adjexplode=array();
$numcolors = count($colors);
for($i=0; $i<count($data); ++$i, ++$idx ) {
$da = $data[$i]/$sum * 360;
 
if( empty($this->explode_radius[$i]) ) {
$this->explode_radius[$i]=0;
}
 
$expscale=1;
if( $aaoption == 1 ) {
$expscale=2;
}
 
$la = $a + $da/2;
$explode = array( $xc + $this->explode_radius[$i]*cos($la*M_PI/180)*$expscale,
$yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale );
$adjexplode[$idx] = $explode;
$labeldata[$i] = array($la,$explode[0],$explode[1]);
$originalangles[$i] = array($a,$a+$da);
 
$ne = $this->NormAngle($a+$da);
if( $da <= 180 ) {
// If the slice size is <= 90 it can at maximum cut across
// one boundary (either 90 or 270) where it needs to be split
$split=-1; // no split
if( ($da<=90 && ($a <= 90 && $ne > 90)) ||
(($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90)) ) {
$split = 90;
}
elseif( ($da<=90 && ($a <= 270 && $ne > 270)) ||
(($da<=180 && $da>90) && ($a >= 90 && $a < 270 && ($a+$da) > 270 )) ) {
$split = 270;
}
if( $split > 0 ) { // split in two
$angles[$idx] = array($a,$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
$angles[++$idx] = array($split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
else { // no split
$angles[$idx] = array($a,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
}
else {
// da>180
// Slice may, depending on position, cross one or two
// bonudaries
 
if( $a < 90 ) $split = 90;
elseif( $a <= 270 ) $split = 270;
else $split = 90;
 
$angles[$idx] = array($a,$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
//if( $a+$da > 360-$split ) {
// For slices larger than 270 degrees we might cross
// another boundary as well. This means that we must
// split the slice further. The comparison gets a little
// bit complicated since we must take into accound that
// a pie might have a startangle >0 and hence a slice might
// wrap around the 0 angle.
// Three cases:
// a) Slice starts before 90 and hence gets a split=90, but
// we must also check if we need to split at 270
// b) Slice starts after 90 but before 270 and slices
// crosses 90 (after a wrap around of 0)
// c) If start is > 270 (hence the firstr split is at 90)
// and the slice is so large that it goes all the way
// around 270.
if( ($a < 90 && ($a+$da > 270)) || ($a > 90 && $a<=270 && ($a+$da>360+90) ) || ($a > 270 && $this->NormAngle($a+$da)>270) ) {
$angles[++$idx] = array($split,360-$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
$angles[++$idx] = array(360-$split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
else {
// Just a simple split to the previous decided
// angle.
$angles[++$idx] = array($split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
}
$a += $da;
$a = $this->NormAngle($a);
}
 
// Total number of slices
$n = count($angles);
 
for($i=0; $i<$n; ++$i) {
list($dbgs,$dbge) = $angles[$i];
}
 
//
// Step 2. Find start index (first pie that starts in upper left quadrant)
//
$minval = $angles[0][0];
$min = 0;
for( $i=0; $i<$n; ++$i ) {
if( $angles[$i][0] < $minval ) {
$minval = $angles[$i][0];
$min = $i;
}
}
$j = $min;
$cnt = 0;
while( $angles[$j][1] <= 90 ) {
$j++;
if( $j>=$n) {
$j=0;
}
if( $cnt > $n ) {
JpGraphError::RaiseL(14005);
//("Pie3D Internal error (#1). Trying to wrap twice when looking for start index");
}
++$cnt;
}
$start = $j;
 
//
// Step 3. Print slices in z-order
//
$cnt = 0;
 
// First stroke all the slices between 90 and 270 (left half circle)
// counterclockwise
while( $angles[$j][0] < 270 && $aaoption !== 2 ) {
 
list($x,$y) = $adjexplode[$j];
 
$this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1],
$z,$adjcolors[$j],$shadow);
 
$last = array($x,$y,$j);
 
$j++;
if( $j >= $n ) $j=0;
if( $cnt > $n ) {
JpGraphError::RaiseL(14006);
//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.");
}
++$cnt;
}
$slice_left = $n-$cnt;
$j=$start-1;
if($j<0) $j=$n-1;
$cnt = 0;
 
// The stroke all slices from 90 to -90 (right half circle)
// clockwise
while( $cnt < $slice_left && $aaoption !== 2 ) {
 
list($x,$y) = $adjexplode[$j];
 
$this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1],
$z,$adjcolors[$j],$shadow);
$j--;
if( $cnt > $n ) {
JpGraphError::RaiseL(14006);
//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.");
}
if($j<0) $j=$n-1;
$cnt++;
}
 
// Now do a special thing. Stroke the last slice on the left
// halfcircle one more time. This is needed in the case where
// the slice close to 270 have been exploded. In that case the
// part of the slice close to the center of the pie might be
// slightly nagged.
if( $aaoption !== 2 )
$this->Pie3DSlice($img,$last[0],$last[1],$d,$h,$angles[$last[2]][0],
$angles[$last[2]][1],$z,$adjcolors[$last[2]],$shadow);
 
 
if( $aaoption !== 1 ) {
// Now print possible labels and add csim
$this->value->ApplyFont($img);
$margin = $img->GetFontHeight()/2 + $this->value->margin ;
for($i=0; $i < count($data); ++$i ) {
$la = $labeldata[$i][0];
$x = $labeldata[$i][1] + cos($la*M_PI/180)*($d+$margin)*$this->ilabelposadj;
$y = $labeldata[$i][2] - sin($la*M_PI/180)*($h+$margin)*$this->ilabelposadj;
if( $this->ilabelposadj >= 1.0 ) {
if( $la > 180 && $la < 360 ) $y += $z;
}
if( $this->labeltype == 0 ) {
if( $sum > 0 ) $l = 100*$data[$i]/$sum;
else $l = 0;
}
elseif( $this->labeltype == 1 ) {
$l = $data[$i];
}
else {
$l = $this->adjusted_data[$i];
}
if( isset($this->labels[$i]) && is_string($this->labels[$i]) ) {
$l=sprintf($this->labels[$i],$l);
}
 
$this->StrokeLabels($l,$img,$labeldata[$i][0]*M_PI/180,$x,$y,$z);
$this->Add3DSliceToCSIM($i,$labeldata[$i][1],$labeldata[$i][2],$h*2,$d*2,$z,
$originalangles[$i][0],$originalangles[$i][1]);
}
}
 
//
// Finally add potential lines in pie
//
 
if( $edgecolor=="" || $aaoption !== 0 ) return;
 
$accsum = 0;
$a = $startangle;
$a = $this->NormAngle($a);
 
$a *= M_PI/180.0;
 
$idx=0;
$img->PushColor($edgecolor);
$img->SetLineWeight($edgeweight);
 
$fulledge = true;
for($i=0; $i < count($data) && $fulledge; ++$i ) {
if( empty($this->explode_radius[$i]) ) {
$this->explode_radius[$i]=0;
}
if( $this->explode_radius[$i] > 0 ) {
$fulledge = false;
}
}
 
for($i=0; $i < count($data); ++$i, ++$idx ) {
 
$da = $data[$i]/$sum * 2*M_PI;
$this->StrokeFullSliceFrame($img,$xc,$yc,$a,$a+$da,$d,$h,$z,$edgecolor,
$this->explode_radius[$i],$fulledge);
$a += $da;
}
$img->PopColor();
}
 
function StrokeFullSliceFrame($img,$xc,$yc,$sa,$ea,$w,$h,$z,$edgecolor,$exploderadius,$fulledge) {
$step = 0.02;
 
if( $exploderadius > 0 ) {
$la = ($sa+$ea)/2;
$xc += $exploderadius*cos($la);
$yc -= $exploderadius*sin($la) * ($h/$w) ;
}
 
$p = array($xc,$yc,$xc+$w*cos($sa),$yc-$h*sin($sa));
 
for($a=$sa; $a < $ea; $a += $step ) {
$p[] = $xc + $w*cos($a);
$p[] = $yc - $h*sin($a);
}
 
$p[] = $xc+$w*cos($ea);
$p[] = $yc-$h*sin($ea);
$p[] = $xc;
$p[] = $yc;
 
$img->SetColor($edgecolor);
$img->Polygon($p);
 
// Unfortunately we can't really draw the full edge around the whole of
// of the slice if any of the slices are exploded. The reason is that
// this algorithm is to simply. There are cases where the edges will
// "overwrite" other slices when they have been exploded.
// Doing the full, proper 3D hidden lines stiff is actually quite
// tricky. So for exploded pies we only draw the top edge. Not perfect
// but the "real" solution is much more complicated.
if( $fulledge && !( $sa > 0 && $sa < M_PI && $ea < M_PI) ) {
 
if($sa < M_PI && $ea > M_PI) {
$sa = M_PI;
}
 
if($sa < 2*M_PI && (($ea >= 2*M_PI) || ($ea > 0 && $ea < $sa ) ) ) {
$ea = 2*M_PI;
}
 
if( $sa >= M_PI && $ea <= 2*M_PI ) {
$p = array($xc + $w*cos($sa),$yc - $h*sin($sa),
$xc + $w*cos($sa),$z + $yc - $h*sin($sa));
 
for($a=$sa+$step; $a < $ea; $a += $step ) {
$p[] = $xc + $w*cos($a);
$p[] = $z + $yc - $h*sin($a);
}
$p[] = $xc + $w*cos($ea);
$p[] = $z + $yc - $h*sin($ea);
$p[] = $xc + $w*cos($ea);
$p[] = $yc - $h*sin($ea);
$img->SetColor($edgecolor);
$img->Polygon($p);
}
}
}
 
function Stroke($img,$aaoption=0) {
$n = count($this->data);
 
// If user hasn't set the colors use the theme array
if( $this->setslicecolors==null ) {
$colors = array_keys($img->rgb->rgb_table);
sort($colors);
$idx_a=$this->themearr[$this->theme];
$ca = array();
$m = count($idx_a);
for($i=0; $i < $m; ++$i) {
$ca[$i] = $colors[$idx_a[$i]];
}
$ca = array_reverse(array_slice($ca,0,$n));
}
else {
$ca = $this->setslicecolors;
}
 
 
if( $this->posx <= 1 && $this->posx > 0 ) {
$xc = round($this->posx*$img->width);
}
else {
$xc = $this->posx ;
}
 
if( $this->posy <= 1 && $this->posy > 0 ) {
$yc = round($this->posy*$img->height);
}
else {
$yc = $this->posy ;
}
 
if( $this->radius <= 1 ) {
$width = floor($this->radius*min($img->width,$img->height));
// Make sure that the pie doesn't overflow the image border
// The 0.9 factor is simply an extra margin to leave some space
// between the pie an the border of the image.
$width = min($width,min($xc*0.9,($yc*90/$this->angle-$width/4)*0.9));
}
else {
$width = $this->radius * ($aaoption === 1 ? 2 : 1 ) ;
}
 
// Add a sanity check for width
if( $width < 1 ) {
JpGraphError::RaiseL(14007);//("Width for 3D Pie is 0. Specify a size > 0");
}
 
// Establish a thickness. By default the thickness is a fifth of the
// pie slice width (=pie radius) but since the perspective depends
// on the inclination angle we use some heuristics to make the edge
// slightly thicker the less the angle.
 
// Has user specified an absolute thickness? In that case use
// that instead
 
if( $this->iThickness ) {
$thick = $this->iThickness;
$thick *= ($aaoption === 1 ? 2 : 1 );
}
else {
$thick = $width/12;
}
$a = $this->angle;
if( $a <= 30 ) $thick *= 1.6;
elseif( $a <= 40 ) $thick *= 1.4;
elseif( $a <= 50 ) $thick *= 1.2;
elseif( $a <= 60 ) $thick *= 1.0;
elseif( $a <= 70 ) $thick *= 0.8;
elseif( $a <= 80 ) $thick *= 0.7;
else $thick *= 0.6;
 
$thick = floor($thick);
 
if( $this->explode_all ) {
for($i=0; $i < $n; ++$i)
$this->explode_radius[$i]=$this->explode_r;
}
 
$this->Pie3D($aaoption,$img,$this->data, $ca, $xc, $yc, $width, $this->angle,
$thick, 0.65, $this->startangle, $this->edgecolor, $this->edgeweight);
 
// Adjust title position
if( $aaoption != 1 ) {
$this->title->SetPos($xc,$yc-$this->title->GetFontHeight($img)-$width/2-$this->title->margin, "center","bottom");
$this->title->Stroke($img);
}
}
 
//---------------
// PRIVATE METHODS
 
// Position the labels of each slice
function StrokeLabels($label,$img,$a,$xp,$yp,$z) {
$this->value->halign="left";
$this->value->valign="top";
 
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
$this->value->ApplyFont($img);
$h=$img->GetTextHeight($label);
// For numeric values the format of the display value
// must be taken into account
if( is_numeric($label) ) {
if( $label >= 0 ) {
$w=$img->GetTextWidth(sprintf($this->value->format,$label));
}
else {
$w=$img->GetTextWidth(sprintf($this->value->negformat,$label));
}
}
else {
$w=$img->GetTextWidth($label);
}
while( $a > 2*M_PI ) {
$a -= 2*M_PI;
}
if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0;
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1;
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI);
 
if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI;
if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI);
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI);
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0;
 
$x = round($xp-$dx*$w);
$y = round($yp-$dy*$h);
 
// Mark anchor point for debugging
/*
$img->SetColor('red');
$img->Line($xp-10,$yp,$xp+10,$yp);
$img->Line($xp,$yp-10,$xp,$yp+10);
*/
 
$oldmargin = $this->value->margin;
$this->value->margin=0;
$this->value->Stroke($img,$label,$x,$y);
$this->value->margin=$oldmargin;
 
}
} // Class
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_bar.php
New file
0,0 → 1,1136
<?php
/*=======================================================================
// File: JPGRAPH_BAR.PHP
// Description: Bar plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_bar.php 1905 2009-10-06 18:00:21Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotband.php');
 
// Pattern for Bars
DEFINE('PATTERN_DIAG1',1);
DEFINE('PATTERN_DIAG2',2);
DEFINE('PATTERN_DIAG3',3);
DEFINE('PATTERN_DIAG4',4);
DEFINE('PATTERN_CROSS1',5);
DEFINE('PATTERN_CROSS2',6);
DEFINE('PATTERN_CROSS3',7);
DEFINE('PATTERN_CROSS4',8);
DEFINE('PATTERN_STRIPE1',9);
DEFINE('PATTERN_STRIPE2',10);
 
//===================================================
// CLASS BarPlot
// Description: Main code to produce a bar plot
//===================================================
class BarPlot extends Plot {
public $fill=false,$fill_color="lightblue"; // Default is to fill with light blue
public $iPattern=-1,$iPatternDensity=80,$iPatternColor='black';
public $valuepos='top';
public $grad=false,$grad_style=1;
public $grad_fromcolor=array(50,50,200),$grad_tocolor=array(255,255,255);
public $ymin=0;
protected $width=0.4; // in percent of major ticks
protected $abswidth=-1; // Width in absolute pixels
protected $ybase=0; // Bars start at 0
protected $align="center";
protected $bar_shadow=false;
protected $bar_shadow_color="black";
protected $bar_shadow_hsize=3,$bar_shadow_vsize=3;
 
//---------------
// CONSTRUCTOR
function __construct($datay,$datax=false) {
parent::__construct($datay,$datax);
++$this->numpoints;
}
 
//---------------
// PUBLIC METHODS
 
// Set a drop shadow for the bar (or rather an "up-right" shadow)
function SetShadow($aColor="black",$aHSize=3,$aVSize=3,$aShow=true) {
$this->bar_shadow=$aShow;
$this->bar_shadow_color=$aColor;
$this->bar_shadow_vsize=$aVSize;
$this->bar_shadow_hsize=$aHSize;
 
// Adjust the value margin to compensate for shadow
$this->value->margin += $aVSize;
}
 
// DEPRECATED use SetYBase instead
function SetYMin($aYStartValue) {
//die("JpGraph Error: Deprecated function SetYMin. Use SetYBase() instead.");
$this->ybase=$aYStartValue;
}
 
// Specify the base value for the bars
function SetYBase($aYStartValue) {
$this->ybase=$aYStartValue;
}
 
// The method will take the specified pattern anre
// return a pattern index that corresponds to the original
// patterm being rotated 90 degreees. This is needed when plottin
// Horizontal bars
function RotatePattern($aPat,$aRotate=true) {
$rotate = array(1 => 2, 2 => 1, 3 => 3, 4 => 5, 5 => 4, 6 => 6, 7 => 7, 8 => 8);
if( $aRotate ) {
return $rotate[$aPat];
}
else {
return $aPat;
}
}
 
function Legend($graph) {
if( $this->grad && $this->legend!="" && !$this->fill ) {
$color=array($this->grad_fromcolor,$this->grad_tocolor);
// In order to differentiate between gradients and cooors specified as an RGB triple
$graph->legend->Add($this->legend,$color,"",-$this->grad_style,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->legend!="" && ($this->iPattern > -1 || is_array($this->iPattern)) ) {
if( is_array($this->iPattern) ) {
$p1 = $this->RotatePattern( $this->iPattern[0], $graph->img->a == 90 );
$p2 = $this->iPatternColor[0];
$p3 = $this->iPatternDensity[0];
}
else {
$p1 = $this->RotatePattern( $this->iPattern, $graph->img->a == 90 );
$p2 = $this->iPatternColor;
$p3 = $this->iPatternDensity;
}
if( $p3 < 90 ) $p3 += 5;
$color = array($p1,$p2,$p3,$this->fill_color);
// A kludge: Too mark that we add a pattern we use a type value of < 100
$graph->legend->Add($this->legend,$color,"",-101,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->fill_color && $this->legend!="" ) {
if( is_array($this->fill_color) ) {
$graph->legend->Add($this->legend,$this->fill_color[0],"",0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
else {
$graph->legend->Add($this->legend,$this->fill_color,"",0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust($graph) {
parent::PreStrokeAdjust($graph);
 
// If we are using a log Y-scale we want the base to be at the
// minimum Y-value unless the user have specifically set some other
// value than the default.
if( substr($graph->axtype,-3,3)=="log" && $this->ybase==0 )
$this->ybase = $graph->yaxis->scale->GetMinVal();
 
// For a "text" X-axis scale we will adjust the
// display of the bars a little bit.
if( substr($graph->axtype,0,3)=="tex" ) {
// Position the ticks between the bars
$graph->xaxis->scale->ticks->SetXLabelOffset(0.5,0);
 
// Center the bars
if( $this->abswidth > -1 ) {
$graph->SetTextScaleAbsCenterOff($this->abswidth);
}
else {
if( $this->align == "center" )
$graph->SetTextScaleOff(0.5-$this->width/2);
elseif( $this->align == "right" )
$graph->SetTextScaleOff(1-$this->width);
}
}
elseif( ($this instanceof AccBarPlot) || ($this instanceof GroupBarPlot) ) {
// We only set an absolute width for linear and int scale
// for text scale the width will be set to a fraction of
// the majstep width.
if( $this->abswidth == -1 ) {
// Not set
// set width to a visuable sensible default
$this->abswidth = $graph->img->plotwidth/(2*$this->numpoints);
}
}
}
 
function Min() {
$m = parent::Min();
if( $m[1] >= $this->ybase ) $m[1] = $this->ybase;
return $m;
}
 
function Max() {
$m = parent::Max();
if( $m[1] <= $this->ybase ) $m[1] = $this->ybase;
return $m;
}
 
// Specify width as fractions of the major stepo size
function SetWidth($aWidth) {
if( $aWidth > 1 ) {
// Interpret this as absolute width
$this->abswidth=$aWidth;
}
else {
$this->width=$aWidth;
}
}
 
// Specify width in absolute pixels. If specified this
// overrides SetWidth()
function SetAbsWidth($aWidth) {
$this->abswidth=$aWidth;
}
 
function SetAlign($aAlign) {
$this->align=$aAlign;
}
 
function SetNoFill() {
$this->grad = false;
$this->fill_color=false;
$this->fill=false;
}
 
function SetFillColor($aColor) {
// Do an extra error check if the color is specified as an RGB array triple
// In that case convert it to a hex string since it will otherwise be
// interpretated as an array of colors for each individual bar.
 
$aColor = RGB::tryHexConversion($aColor);
$this->fill = true ;
$this->fill_color=$aColor;
 
}
 
function SetFillGradient($aFromColor,$aToColor=null,$aStyle=null) {
$this->grad = true;
$this->grad_fromcolor = $aFromColor;
$this->grad_tocolor = $aToColor;
$this->grad_style = $aStyle;
}
 
function SetValuePos($aPos) {
$this->valuepos = $aPos;
}
 
function SetPattern($aPattern, $aColor='black'){
if( is_array($aPattern) ) {
$n = count($aPattern);
$this->iPattern = array();
$this->iPatternDensity = array();
if( is_array($aColor) ) {
$this->iPatternColor = array();
if( count($aColor) != $n ) {
JpGraphError::RaiseL(2001);//('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()');
}
}
else {
$this->iPatternColor = $aColor;
}
for( $i=0; $i < $n; ++$i ) {
$this->_SetPatternHelper($aPattern[$i], $this->iPattern[$i], $this->iPatternDensity[$i]);
if( is_array($aColor) ) {
$this->iPatternColor[$i] = $aColor[$i];
}
}
}
else {
$this->_SetPatternHelper($aPattern, $this->iPattern, $this->iPatternDensity);
$this->iPatternColor = $aColor;
}
}
 
function _SetPatternHelper($aPattern, &$aPatternValue, &$aDensity){
switch( $aPattern ) {
case PATTERN_DIAG1:
$aPatternValue= 1;
$aDensity = 92;
break;
case PATTERN_DIAG2:
$aPatternValue= 1;
$aDensity = 78;
break;
case PATTERN_DIAG3:
$aPatternValue= 2;
$aDensity = 92;
break;
case PATTERN_DIAG4:
$aPatternValue= 2;
$aDensity = 78;
break;
case PATTERN_CROSS1:
$aPatternValue= 8;
$aDensity = 90;
break;
case PATTERN_CROSS2:
$aPatternValue= 8;
$aDensity = 78;
break;
case PATTERN_CROSS3:
$aPatternValue= 8;
$aDensity = 65;
break;
case PATTERN_CROSS4:
$aPatternValue= 7;
$aDensity = 90;
break;
case PATTERN_STRIPE1:
$aPatternValue= 5;
$aDensity = 94;
break;
case PATTERN_STRIPE2:
$aPatternValue= 5;
$aDensity = 85;
break;
default:
JpGraphError::RaiseL(2002);
//('Unknown pattern specified in call to BarPlot::SetPattern()');
}
}
 
function Stroke($img,$xscale,$yscale) {
 
$numpoints = count($this->coords[0]);
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints ) {
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//"Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints");
}
else {
$exist_x = true;
}
}
else {
$exist_x = false;
}
 
 
$numbars=count($this->coords[0]);
 
// Use GetMinVal() instead of scale[0] directly since in the case
// of log scale we get a correct value. Log scales will have negative
// values for values < 1 while still not representing negative numbers.
if( $yscale->GetMinVal() >= 0 )
$zp=$yscale->scale_abs[0];
else {
$zp=$yscale->Translate(0);
}
 
if( $this->abswidth > -1 ) {
$abswidth=$this->abswidth;
}
else {
$abswidth=round($this->width*$xscale->scale_factor,0);
}
 
// Count pontetial pattern array to avoid doing the count for each iteration
if( is_array($this->iPattern) ) {
$np = count($this->iPattern);
}
 
$grad = null;
for($i=0; $i < $numbars; ++$i) {
 
// If value is NULL, or 0 then don't draw a bar at all
if ($this->coords[0][$i] === null || $this->coords[0][$i] === '' )
continue;
 
if( $exist_x ) {
$x=$this->coords[1][$i];
}
else {
$x=$i;
}
 
$x=$xscale->Translate($x);
 
// Comment Note: This confuses the positioning when using acc together with
// grouped bars. Workaround for fixing #191
/*
if( !$xscale->textscale ) {
if($this->align=="center")
$x -= $abswidth/2;
elseif($this->align=="right")
$x -= $abswidth;
}
*/
// Stroke fill color and fill gradient
$pts=array(
$x,$zp,
$x,$yscale->Translate($this->coords[0][$i]),
$x+$abswidth,$yscale->Translate($this->coords[0][$i]),
$x+$abswidth,$zp);
if( $this->grad ) {
if( $grad === null ) {
$grad = new Gradient($img);
}
if( is_array($this->grad_fromcolor) ) {
// The first argument (grad_fromcolor) can be either an array or a single color. If it is an array
// then we have two choices. It can either a) be a single color specified as an RGB triple or it can be
// an array to specify both (from, to style) for each individual bar. The way to know the difference is
// to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB
// triple.
$ng = count($this->grad_fromcolor);
if( $ng === 3 ) {
if( is_numeric($this->grad_fromcolor[0]) && $this->grad_fromcolor[0] > 0 && $this->grad_fromcolor[0] < 256 ) {
// RGB Triple
$fromcolor = $this->grad_fromcolor;
$tocolor = $this->grad_tocolor;
$style = $this->grad_style;
}
else {
$fromcolor = $this->grad_fromcolor[$i % $ng][0];
$tocolor = $this->grad_fromcolor[$i % $ng][1];
$style = $this->grad_fromcolor[$i % $ng][2];
}
}
else {
$fromcolor = $this->grad_fromcolor[$i % $ng][0];
$tocolor = $this->grad_fromcolor[$i % $ng][1];
$style = $this->grad_fromcolor[$i % $ng][2];
}
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$fromcolor,$tocolor,$style);
}
else {
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$this->grad_fromcolor,$this->grad_tocolor,$this->grad_style);
}
}
elseif( !empty($this->fill_color) ) {
if(is_array($this->fill_color)) {
$img->PushColor($this->fill_color[$i % count($this->fill_color)]);
} else {
$img->PushColor($this->fill_color);
}
$img->FilledPolygon($pts);
$img->PopColor();
}
 
 
// Remember value of this bar
$val=$this->coords[0][$i];
 
if( !empty($val) && !is_numeric($val) ) {
JpGraphError::RaiseL(2004,$i,$val);
//'All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\'');
}
 
// Determine the shadow
if( $this->bar_shadow && $val != 0) {
 
$ssh = $this->bar_shadow_hsize;
$ssv = $this->bar_shadow_vsize;
// Create points to create a "upper-right" shadow
if( $val > 0 ) {
$sp[0]=$pts[6]; $sp[1]=$pts[7];
$sp[2]=$pts[4]; $sp[3]=$pts[5];
$sp[4]=$pts[2]; $sp[5]=$pts[3];
$sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
$sp[8]=$pts[4]+$ssh; $sp[9]=$pts[5]-$ssv;
$sp[10]=$pts[6]+$ssh; $sp[11]=$pts[7]-$ssv;
}
elseif( $val < 0 ) {
$sp[0]=$pts[4]; $sp[1]=$pts[5];
$sp[2]=$pts[6]; $sp[3]=$pts[7];
$sp[4]=$pts[0]; $sp[5]=$pts[1];
$sp[6]=$pts[0]+$ssh; $sp[7]=$pts[1]-$ssv;
$sp[8]=$pts[6]+$ssh; $sp[9]=$pts[7]-$ssv;
$sp[10]=$pts[4]+$ssh; $sp[11]=$pts[5]-$ssv;
}
if( is_array($this->bar_shadow_color) ) {
$numcolors = count($this->bar_shadow_color);
if( $numcolors == 0 ) {
JpGraphError::RaiseL(2005);//('You have specified an empty array for shadow colors in the bar plot.');
}
$img->PushColor($this->bar_shadow_color[$i % $numcolors]);
}
else {
$img->PushColor($this->bar_shadow_color);
}
$img->FilledPolygon($sp);
$img->PopColor();
}
 
// Stroke the pattern
if( is_array($this->iPattern) ) {
$f = new RectPatternFactory();
if( is_array($this->iPatternColor) ) {
$pcolor = $this->iPatternColor[$i % $np];
}
else {
$pcolor = $this->iPatternColor;
}
$prect = $f->Create($this->iPattern[$i % $np],$pcolor,1);
$prect->SetDensity($this->iPatternDensity[$i % $np]);
 
if( $val < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
else {
if( $this->iPattern > -1 ) {
$f = new RectPatternFactory();
$prect = $f->Create($this->iPattern,$this->iPatternColor,1);
$prect->SetDensity($this->iPatternDensity);
if( $val < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
}
 
// Stroke the outline of the bar
if( is_array($this->color) ) {
$img->SetColor($this->color[$i % count($this->color)]);
}
else {
$img->SetColor($this->color);
}
 
$pts[] = $pts[0];
$pts[] = $pts[1];
 
if( $this->weight > 0 ) {
$img->SetLineWeight($this->weight);
$img->Polygon($pts);
}
 
// Determine how to best position the values of the individual bars
$x=$pts[2]+($pts[4]-$pts[2])/2;
$this->value->SetMargin(5);
 
if( $this->valuepos=='top' ) {
$y=$pts[3];
if( $img->a === 90 ) {
if( $val < 0 ) {
$this->value->SetAlign('right','center');
}
else {
$this->value->SetAlign('left','center');
}
 
}
else {
if( $val < 0 ) {
$this->value->SetMargin(-5);
$y=$pts[1];
$this->value->SetAlign('center','bottom');
}
else {
$this->value->SetAlign('center','bottom');
}
 
}
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='max' ) {
$y=$pts[3];
if( $img->a === 90 ) {
if( $val < 0 )
$this->value->SetAlign('left','center');
else
$this->value->SetAlign('right','center');
}
else {
if( $val < 0 ) {
$this->value->SetAlign('center','bottom');
}
else {
$this->value->SetAlign('center','top');
}
}
$this->value->SetMargin(-5);
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='center' ) {
$y = ($pts[3] + $pts[1])/2;
$this->value->SetAlign('center','center');
$this->value->SetMargin(0);
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) {
$y=$pts[1];
if( $img->a === 90 ) {
if( $val < 0 )
$this->value->SetAlign('right','center');
else
$this->value->SetAlign('left','center');
}
$this->value->SetMargin(3);
$this->value->Stroke($img,$val,$x,$y);
}
else {
JpGraphError::RaiseL(2006,$this->valuepos);
//'Unknown position for values on bars :'.$this->valuepos);
}
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord=round($rpts[0]).", ".round($rpts[1]);
for( $j=1; $j < 4; ++$j){
$csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]);
}
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= '<area shape="poly" coords="'.$csimcoord.'" ';
$this->csimareas .= " href=\"".htmlentities($this->csimtargets[$i])."\"";
 
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
 
$sval='';
if( !empty($this->csimalts[$i]) ) {
$sval=sprintf($this->csimalts[$i],$this->coords[0][$i]);
$this->csimareas .= " title=\"$sval\" alt=\"$sval\" ";
}
$this->csimareas .= " />\n";
}
}
return true;
}
} // Class
 
//===================================================
// CLASS GroupBarPlot
// Description: Produce grouped bar plots
//===================================================
class GroupBarPlot extends BarPlot {
private $plots, $nbrplots=0;
//---------------
// CONSTRUCTOR
function GroupBarPlot($plots) {
$this->width=0.7;
$this->plots = $plots;
$this->nbrplots = count($plots);
if( $this->nbrplots < 1 ) {
JpGraphError::RaiseL(2007);//('Cannot create GroupBarPlot from empty plot array.');
}
for($i=0; $i < $this->nbrplots; ++$i ) {
if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {
JpGraphError::RaiseL(2008,$i);//("Group bar plot element nbr $i is undefined or empty.");
}
}
$this->numpoints = $plots[0]->numpoints;
$this->width=0.7;
}
 
//---------------
// PUBLIC METHODS
function Legend($graph) {
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$c = get_class($this->plots[$i]);
if( !($this->plots[$i] instanceof BarPlot) ) {
JpGraphError::RaiseL(2009,$c);
//('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')');
}
$this->plots[$i]->DoLegend($graph);
}
}
 
function Min() {
list($xmin,$ymin) = $this->plots[0]->Min();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
list($xm,$ym) = $this->plots[$i]->Min();
$xmin = max($xmin,$xm);
$ymin = min($ymin,$ym);
}
return array($xmin,$ymin);
}
 
function Max() {
list($xmax,$ymax) = $this->plots[0]->Max();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
list($xm,$ym) = $this->plots[$i]->Max();
$xmax = max($xmax,$xm);
$ymax = max($ymax,$ym);
}
return array($xmax,$ymax);
}
 
function GetCSIMareas() {
$n = count($this->plots);
$csimareas='';
for($i=0; $i < $n; ++$i) {
$csimareas .= $this->plots[$i]->csimareas;
}
return $csimareas;
}
 
// Stroke all the bars next to each other
function Stroke($img,$xscale,$yscale) {
$tmp=$xscale->off;
$n = count($this->plots);
$subwidth = $this->width/$this->nbrplots ;
 
for( $i=0; $i < $n; ++$i ) {
$this->plots[$i]->ymin=$this->ybase;
$this->plots[$i]->SetWidth($subwidth);
 
// If the client have used SetTextTickInterval() then
// major_step will be > 1 and the positioning will fail.
// If we assume it is always one the positioning will work
// fine with a text scale but this will not work with
// arbitrary linear scale
$xscale->off = $tmp+$i*round($xscale->scale_factor* $subwidth);
$this->plots[$i]->Stroke($img,$xscale,$yscale);
}
$xscale->off=$tmp;
}
} // Class
 
//===================================================
// CLASS AccBarPlot
// Description: Produce accumulated bar plots
//===================================================
class AccBarPlot extends BarPlot {
private $plots=null,$nbrplots=0;
//---------------
// CONSTRUCTOR
function __construct($plots) {
$this->plots = $plots;
$this->nbrplots = count($plots);
if( $this->nbrplots < 1 ) {
JpGraphError::RaiseL(2010);//('Cannot create AccBarPlot from empty plot array.');
}
for($i=0; $i < $this->nbrplots; ++$i ) {
if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {
JpGraphError::RaiseL(2011,$i);//("Acc bar plot element nbr $i is undefined or empty.");
}
}
 
// We can only allow individual plost which do not have specified X-positions
for($i=0; $i < $this->nbrplots; ++$i ) {
if( !empty($this->plots[$i]->coords[1]) ) {
JpGraphError::RaiseL(2015);
//'Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-positions.');
}
}
 
// Use 0 weight by default which means that the individual bar
// weights will be used per part n the accumulated bar
$this->SetWeight(0);
 
$this->numpoints = $plots[0]->numpoints;
$this->value = new DisplayValue();
}
 
//---------------
// PUBLIC METHODS
function Legend($graph) {
$n = count($this->plots);
for( $i=$n-1; $i >= 0; --$i ) {
$c = get_class($this->plots[$i]);
if( !($this->plots[$i] instanceof BarPlot) ) {
JpGraphError::RaiseL(2012,$c);
//('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')');
}
$this->plots[$i]->DoLegend($graph);
}
}
 
function Max() {
list($xmax) = $this->plots[0]->Max();
$nmax=0;
for($i=0; $i < count($this->plots); ++$i) {
$n = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$n);
list($x) = $this->plots[$i]->Max();
$xmax = max($xmax,$x);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for bar $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=0;
if( !isset($this->plots[0]->coords[0][$i]) ) {
JpGraphError::RaiseL(2014);
}
if( $this->plots[0]->coords[0][$i] > 0 )
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
if( !isset($this->plots[$j]->coords[0][$i]) ) {
JpGraphError::RaiseL(2014);
}
if( $this->plots[$j]->coords[0][$i] > 0 )
$y += $this->plots[$j]->coords[0][$i];
}
$ymax[$i] = $y;
}
$ymax = max($ymax);
 
// Bar always start at baseline
if( $ymax <= $this->ybase )
$ymax = $this->ybase;
return array($xmax,$ymax);
}
 
function Min() {
$nmax=0;
list($xmin,$ysetmin) = $this->plots[0]->Min();
for($i=0; $i < count($this->plots); ++$i) {
$n = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$n);
list($x,$y) = $this->plots[$i]->Min();
$xmin = Min($xmin,$x);
$ysetmin = Min($y,$ysetmin);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for bar $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=0;
if( $this->plots[0]->coords[0][$i] < 0 )
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
if( $this->plots[$j]->coords[0][$i] < 0 )
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymin[$i] = $y;
}
$ymin = Min($ysetmin,Min($ymin));
// Bar always start at baseline
if( $ymin >= $this->ybase )
$ymin = $this->ybase;
return array($xmin,$ymin);
}
 
// Stroke acc bar plot
function Stroke($img,$xscale,$yscale) {
$pattern=NULL;
$img->SetLineWeight($this->weight);
$grad=null;
for($i=0; $i < $this->numpoints-1; $i++) {
$accy = 0;
$accy_neg = 0;
for($j=0; $j < $this->nbrplots; ++$j ) {
$img->SetColor($this->plots[$j]->color);
 
if ( $this->plots[$j]->coords[0][$i] >= 0) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
$accyt=$yscale->Translate($accy);
$accy+=$this->plots[$j]->coords[0][$i];
}
else {
//if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
$accyt=$yscale->Translate($accy_neg);
$accy_neg+=$this->plots[$j]->coords[0][$i];
}
 
$xt=$xscale->Translate($i);
 
if( $this->abswidth > -1 ) {
$abswidth=$this->abswidth;
}
else {
$abswidth=round($this->width*$xscale->scale_factor,0);
}
 
$pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt);
 
if( $this->bar_shadow ) {
$ssh = $this->bar_shadow_hsize;
$ssv = $this->bar_shadow_vsize;
 
// We must also differ if we are a positive or negative bar.
if( $j === 0 ) {
// This gets extra complicated since we have to
// see all plots to see if we are negative. It could
// for example be that all plots are 0 until the very
// last one. We therefore need to save the initial setup
// for both the negative and positive case
 
// In case the final bar is positive
$sp[0]=$pts[6]+1; $sp[1]=$pts[7];
$sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv;
 
// In case the final bar is negative
$nsp[0]=$pts[0]; $nsp[1]=$pts[1];
$nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv;
$nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv;
$nsp[10]=$pts[6]+1; $nsp[11]=$pts[7];
}
 
if( $j === $this->nbrplots-1 ) {
// If this is the last plot of the bar and
// the total value is larger than 0 then we
// add the shadow.
if( is_array($this->bar_shadow_color) ) {
$numcolors = count($this->bar_shadow_color);
if( $numcolors == 0 ) {
JpGraphError::RaiseL(2013);//('You have specified an empty array for shadow colors in the bar plot.');
}
$img->PushColor($this->bar_shadow_color[$i % $numcolors]);
}
else {
$img->PushColor($this->bar_shadow_color);
}
 
if( $accy > 0 ) {
$sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv;
$sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
$sp[8]=$pts[2]; $sp[9]=$pts[3]-1;
$sp[10]=$pts[4]+1; $sp[11]=$pts[5];
$img->FilledPolygon($sp,4);
}
elseif( $accy_neg < 0 ) {
$nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv;
$nsp[8]=$pts[4]+1; $nsp[9]=$pts[5];
$img->FilledPolygon($nsp,4);
}
$img->PopColor();
}
}
 
 
// If value is NULL or 0, then don't draw a bar at all
if ($this->plots[$j]->coords[0][$i] == 0 ) continue;
 
if( $this->plots[$j]->grad ) {
if( $grad === null ) {
$grad = new Gradient($img);
}
if( is_array($this->plots[$j]->grad_fromcolor) ) {
// The first argument (grad_fromcolor) can be either an array or a single color. If it is an array
// then we have two choices. It can either a) be a single color specified as an RGB triple or it can be
// an array to specify both (from, to style) for each individual bar. The way to know the difference is
// to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB
// triple.
$ng = count($this->plots[$j]->grad_fromcolor);
if( $ng === 3 ) {
if( is_numeric($this->plots[$j]->grad_fromcolor[0]) && $this->plots[$j]->grad_fromcolor[0] > 0 &&
$this->plots[$j]->grad_fromcolor[0] < 256 ) {
// RGB Triple
$fromcolor = $this->plots[$j]->grad_fromcolor;
$tocolor = $this->plots[$j]->grad_tocolor;
$style = $this->plots[$j]->grad_style;
}
else {
$fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0];
$tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1];
$style = $this->plots[$j]->grad_fromcolor[$i % $ng][2];
}
}
else {
$fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0];
$tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1];
$style = $this->plots[$j]->grad_fromcolor[$i % $ng][2];
}
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$fromcolor,$tocolor,$style);
}
else {
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$this->plots[$j]->grad_fromcolor,
$this->plots[$j]->grad_tocolor,
$this->plots[$j]->grad_style);
}
} else {
if (is_array($this->plots[$j]->fill_color) ) {
$numcolors = count($this->plots[$j]->fill_color);
$fillcolor = $this->plots[$j]->fill_color[$i % $numcolors];
// If the bar is specified to be non filled then the fill color is false
if( $fillcolor !== false ) {
$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);
}
}
else {
$fillcolor = $this->plots[$j]->fill_color;
if( $fillcolor !== false ) {
$img->SetColor($this->plots[$j]->fill_color);
}
}
if( $fillcolor !== false ) {
$img->FilledPolygon($pts);
}
}
 
$img->SetColor($this->plots[$j]->color);
 
// Stroke the pattern
if( $this->plots[$j]->iPattern > -1 ) {
if( $pattern===NULL ) {
$pattern = new RectPatternFactory();
}
 
$prect = $pattern->Create($this->plots[$j]->iPattern,$this->plots[$j]->iPatternColor,1);
$prect->SetDensity($this->plots[$j]->iPatternDensity);
if( $this->plots[$j]->coords[0][$i] < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
 
 
// CSIM array
 
if( $i < count($this->plots[$j]->csimtargets) ) {
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord=round($rpts[0]).", ".round($rpts[1]);
for( $k=1; $k < 4; ++$k){
$csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]);
}
if( ! empty($this->plots[$j]->csimtargets[$i]) ) {
$this->csimareas.= '<area shape="poly" coords="'.$csimcoord.'" ';
$this->csimareas.= " href=\"".$this->plots[$j]->csimtargets[$i]."\" ";
 
if( ! empty($this->plots[$j]->csimwintargets[$i]) ) {
$this->csimareas.= " target=\"".$this->plots[$j]->csimwintargets[$i]."\" ";
}
 
$sval='';
if( !empty($this->plots[$j]->csimalts[$i]) ) {
$sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]);
$this->csimareas .= " title=\"$sval\" ";
}
$this->csimareas .= " alt=\"$sval\" />\n";
}
}
 
$pts[] = $pts[0];
$pts[] = $pts[1];
$img->SetLineWeight($this->plots[$j]->weight);
$img->Polygon($pts);
$img->SetLineWeight(1);
}
 
// Daw potential bar around the entire accbar bar
if( $this->weight > 0 ) {
$y=$yscale->Translate(0);
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$img->Rectangle($pts[0],$y,$pts[6],$pts[5]);
}
 
// Draw labels for each acc.bar
 
$x=$pts[2]+($pts[4]-$pts[2])/2;
if($this->bar_shadow) $x += $ssh;
 
// First stroke the accumulated value for the entire bar
// This value is always placed at the top/bottom of the bars
if( $accy_neg < 0 ) {
$y=$yscale->Translate($accy_neg);
$this->value->Stroke($img,$accy_neg,$x,$y);
}
else {
$y=$yscale->Translate($accy);
$this->value->Stroke($img,$accy,$x,$y);
}
 
$accy = 0;
$accy_neg = 0;
for($j=0; $j < $this->nbrplots; ++$j ) {
 
// We don't print 0 values in an accumulated bar plot
if( $this->plots[$j]->coords[0][$i] == 0 ) continue;
 
if ($this->plots[$j]->coords[0][$i] > 0) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
$accyt=$yscale->Translate($accy);
if( $this->plots[$j]->valuepos=='center' ) {
$y = $accyt-($accyt-$yt)/2;
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$y = $accyt;
}
else { // top or max
$y = $accyt-($accyt-$yt);
}
$accy+=$this->plots[$j]->coords[0][$i];
if( $this->plots[$j]->valuepos=='center' ) {
$this->plots[$j]->value->SetAlign("center","center");
$this->plots[$j]->value->SetMargin(0);
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$this->plots[$j]->value->SetAlign('center','bottom');
$this->plots[$j]->value->SetMargin(2);
}
else {
$this->plots[$j]->value->SetAlign('center','top');
$this->plots[$j]->value->SetMargin(1);
}
} else {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
$accyt=$yscale->Translate($accy_neg);
$accy_neg+=$this->plots[$j]->coords[0][$i];
if( $this->plots[$j]->valuepos=='center' ) {
$y = $accyt-($accyt-$yt)/2;
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$y = $accyt;
}
else {
$y = $accyt-($accyt-$yt);
}
if( $this->plots[$j]->valuepos=='center' ) {
$this->plots[$j]->value->SetAlign("center","center");
$this->plots[$j]->value->SetMargin(0);
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$this->plots[$j]->value->SetAlign('center',$j==0 ? 'bottom':'top');
$this->plots[$j]->value->SetMargin(-2);
}
else {
$this->plots[$j]->value->SetAlign('center','bottom');
$this->plots[$j]->value->SetMargin(-1);
}
}
$this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y);
}
 
}
return true;
}
} // Class
 
/* EOF */
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_led.php
New file
0,0 → 1,311
<?php
//=======================================================================
// File: JPGRAPH_LED.PHP
// Description: Module to generate Dotted LED-like digits
// Created: 2006-11-26
// Ver: $Id: jpgraph_led.php 1674 2009-07-22 19:42:23Z ljp $
//
// Copyright 2006 (c) Aditus Consulting. All rights reserved.
//
// Changed: 2007-08-06 by Alexander Kurochkin (inspector@list.ru)
//========================================================================
 
// Constants for color schema
DEFINE('LEDC_RED', 0);
DEFINE('LEDC_GREEN', 1);
DEFINE('LEDC_BLUE', 2);
DEFINE('LEDC_YELLOW', 3);
DEFINE('LEDC_GRAY', 4);
DEFINE('LEDC_CHOCOLATE', 5);
DEFINE('LEDC_PERU', 6);
DEFINE('LEDC_GOLDENROD', 7);
DEFINE('LEDC_KHAKI', 8);
DEFINE('LEDC_OLIVE', 9);
DEFINE('LEDC_LIMEGREEN', 10);
DEFINE('LEDC_FORESTGREEN', 11);
DEFINE('LEDC_TEAL', 12);
DEFINE('LEDC_STEELBLUE', 13);
DEFINE('LEDC_NAVY', 14);
DEFINE('LEDC_INVERTGRAY', 15);
 
// Check that mb_strlen() is available
if( ! function_exists('mb_strlen') ) {
JpGraphError::RaiseL(25500);
//'Multibyte strings must be enabled in the PHP installation in order to run the LED module
// so that the function mb_strlen() is available. See PHP documentation for more information.'
}
 
//========================================================================
// CLASS DigitalLED74
// Description:
// Construct a number as an image that looks like LED numbers in a
// 7x4 digital matrix
//========================================================================
class DigitalLED74
{
private $iLED_X = 4, $iLED_Y=7,
 
// fg-up, fg-down, bg
$iColorSchema = array(
LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0
LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1
LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2
LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3
LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'),
LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'),
LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'),
LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'),
LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'),
LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'),
LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'),
LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'),
LEDC_TEAL => array('teal','teal:0.7','teal:0.5'),
LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'),
LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14
LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15
),
 
/* Each line of the character is encoded as a 4 bit value
0 ____
1 ___x
2 __x_
3 __xx
4 _x__
5 _x_x
6 _xx_
7 _xxx
8 x___
9 x__x
10 x_x_
11 x_xx
12 xx__
13 xx_x
14 xxx_
15 xxxx
*/
 
$iLEDSpec = array(
0 => array(6,9,11,15,13,9,6),
1 => array(2,6,10,2,2,2,2),
2 => array(6,9,1,2,4,8,15),
3 => array(6,9,1,6,1,9,6),
4 => array(1,3,5,9,15,1,1),
5 => array(15,8,8,14,1,9,6),
6 => array(6,8,8,14,9,9,6),
7 => array(15,1,1,2,4,4,4),
8 => array(6,9,9,6,9,9,6),
9 => array(6,9,9,7,1,1,6),
'!' => array(4,4,4,4,4,0,4),
'?' => array(6,9,1,2,2,0,2),
'#' => array(0,9,15,9,15,9,0),
'@' => array(6,9,11,11,10,9,6),
'-' => array(0,0,0,15,0,0,0),
'_' => array(0,0,0,0,0,0,15),
'=' => array(0,0,15,0,15,0,0),
'+' => array(0,0,4,14,4,0,0),
'|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Ы'
',' => array(0,0,0,0,0,12,4),
'.' => array(0,0,0,0,0,12,12),
':' => array(12,12,0,0,0,12,12),
';' => array(12,12,0,0,0,12,4),
'[' => array(3,2,2,2,2,2,3),
']' => array(12,4,4,4,4,4,12),
'(' => array(1,2,2,2,2,2,1),
')' => array(8,4,4,4,4,4,8),
'{' => array(3,2,2,6,2,2,3),
'}' => array(12,4,4,6,4,4,12),
'<' => array(1,2,4,8,4,2,1),
'>' => array(8,4,2,1,2,4,8),
'*' => array(9,6,15,6,9,0,0),
'"' => array(10,10,0,0,0,0,0),
'\'' => array(4,4,0,0,0,0,0),
'`' => array(4,2,0,0,0,0,0),
'~' => array(13,11,0,0,0,0,0),
'^' => array(4,10,0,0,0,0,0),
'\\' => array(8,8,4,6,2,1,1),
'/' => array(1,1,2,6,4,8,8),
'%' => array(1,9,2,6,4,9,8),
'&' => array(0,4,10,4,11,10,5),
'$' => array(2,7,8,6,1,14,4),
' ' => array(0,0,0,0,0,0,0),
'•' => array(0,0,6,6,0,0,0), //149
'°' => array(14,10,14,0,0,0,0), //176
'†' => array(4,4,14,4,4,4,4), //134
'‡' => array(4,4,14,4,14,4,4), //135
'±' => array(0,4,14,4,0,14,0), //177
'‰' => array(0,4,2,15,2,4,0), //137 show right arrow
'™' => array(0,2,4,15,4,2,0), //156 show left arrow
'Ў' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ф'
"\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'У'
"\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'М','Ш' ,'Щ'
"\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Ж'
"Ґ" => array(10,5,10,5,10,5,10), //chess
"µ" => array(15,0,15,0,15,0,15), //4 horizontal lines
// latin
'A' => array(6,9,9,15,9,9,9),
'B' => array(14,9,9,14,9,9,14),
'C' => array(6,9,8,8,8,9,6),
'D' => array(14,9,9,9,9,9,14),
'E' => array(15,8,8,14,8,8,15),
'F' => array(15,8,8,14,8,8,8),
'G' => array(6,9,8,8,11,9,6),
'H' => array(9,9,9,15,9,9,9),
'I' => array(14,4,4,4,4,4,14),
'J' => array(15,1,1,1,1,9,6),
'K' => array(8,9,10,12,12,10,9),
'L' => array(8,8,8,8,8,8,15),
'M' => array(8,13,10,8,8,8,8),// need to add \r
'N' => array(9,9,13,11,9,9,9),
'O' => array(6,9,9,9,9,9,6),
'P' => array(14,9,9,14,8,8,8),
'Q' => array(6,9,9,9,13,11,6),
'R' => array(14,9,9,14,12,10,9),
'S' => array(6,9,8,6,1,9,6),
'T' => array(14,4,4,4,4,4,4),
'U' => array(9,9,9,9,9,9,6),
'V' => array(0,0,0,10,10,10,4),
'W' => array(8,8,8,8,10,13,8),// need to add \r
'X' => array(9,9,6,6,6,9,9),
'Y' => array(10,10,10,10,4,4,4),
'Z' => array(15,1,2,6,4,8,15),
// russian utf-8
'А' => array(6,9,9,15,9,9,9),
'Б' => array(14,8,8,14,9,9,14),
'В' => array(14,9,9,14,9,9,14),
'Г' => array(15,8,8,8,8,8,8),
'Д' => array(14,9,9,9,9,9,14),
'Е' => array(15,8,8,14,8,8,15),
'Ё' => array(6,15,8,14,8,8,15),
//Ж is combine: >\n<
'З' => array(6,9,1,2,1,9,6),
'И' => array(9,9,9,11,13,9,9),
'Й' => array(13,9,9,11,13,9,9),
'К' => array(9,10,12,10,9,9,9),
'Л' => array(7,9,9,9,9,9,9),
'М' => array(8,13,10,8,8,8,8),// need to add \r
'Н' => array(9,9,9,15,9,9,9),
'О' => array(6,9,9,9,9,9,6),
'П' => array(15,9,9,9,9,9,9),
'Р' => array(14,9,9,14,8,8,8),
'С' => array(6,9,8,8,8,9,6),
'Т' => array(14,4,4,4,4,4,4),
'У' => array(9,9,9,7,1,9,6),
'Ф' => array(2,7,10,10,7,2,2),// need to add Ў
'Х' => array(9,9,6,6,6,9,9),
'Ц' => array(10,10,10,10,10,15,1),
'Ч' => array(9,9,9,7,1,1,1),
'Ш' => array(10,10,10,10,10,10,15),// \r
'Щ' => array(10,10,10,10,10,15,0),// need to add \r
'Ъ' => array(12,4,4,6,5,5,6),
'Ы' => array(8,8,8,14,9,9,14),// need to add |
'Ь' => array(8,8,8,14,9,9,14),
'Э' => array(6,9,1,7,1,9,6),
'Ю' => array(2,2,2,3,2,2,2),// need to add O
'Я' => array(7,9,9,7,3,5,9)
),
 
$iSuperSampling = 3, $iMarg = 1, $iRad = 4;
 
function __construct($aRadius = 2, $aMargin= 0.6) {
$this->iRad = $aRadius;
$this->iMarg = $aMargin;
}
 
function SetSupersampling($aSuperSampling = 2) {
$this->iSuperSampling = $aSuperSampling;
}
 
function _GetLED($aLedIdx, $aColor = 0) {
$width= $this->iLED_X*$this->iRad*2 + ($this->iLED_X+1)*$this->iMarg + $this->iRad ;
$height= $this->iLED_Y*$this->iRad*2 + ($this->iLED_Y)*$this->iMarg + $this->iRad * 2;
 
// Adjust radious for supersampling
$rad = $this->iRad * $this->iSuperSampling;
 
// Margin in between "Led" dots
$marg = $this->iMarg * $this->iSuperSampling;
 
$swidth = $width*$this->iSuperSampling;
$sheight = $height*$this->iSuperSampling;
 
$simg = new RotImage($swidth, $sheight, 0, DEFAULT_GFORMAT, false);
$simg->SetColor($this->iColorSchema[$aColor][2]);
$simg->FilledRectangle(0, 0, $swidth-1, $sheight-1);
 
if( array_key_exists($aLedIdx, $this->iLEDSpec) ) {
$d = $this->iLEDSpec[$aLedIdx];
}
else {
$d = array(0,0,0,0,0,0,0);
}
 
for($r = 0; $r < 7; ++$r) {
$dr = $d[$r];
for($c = 0; $c < 4; ++$c) {
if( ($dr & pow(2,3-$c)) !== 0 ) {
$color = $this->iColorSchema[$aColor][0];
}
else {
$color = $this->iColorSchema[$aColor][1];
}
 
$x = 2*$rad*$c+$rad + ($c+1)*$marg + $rad ;
$y = 2*$rad*$r+$rad + ($r+1)*$marg + $rad ;
 
$simg->SetColor($color);
$simg->FilledCircle($x,$y,$rad);
}
}
 
$img = new Image($width, $height, DEFAULT_GFORMAT, false);
$img->Copy($simg->img, 0, 0, 0, 0, $width, $height, $swidth, $sheight);
$simg->Destroy();
unset($simg);
return $img;
}
 
 
function Stroke($aValStr, $aColor = 0, $aFileName = '') {
$this->StrokeNumber($aValStr, $aColor, $aFileName);
}
 
 
function StrokeNumber($aValStr, $aColor = 0, $aFileName = '') {
if( $aColor < 0 || $aColor >= sizeof($this->iColorSchema) ) {
$aColor = 0;
}
 
if(($n = mb_strlen($aValStr,'utf8')) == 0) {
$aValStr = ' ';
$n = 1;
}
 
for($i = 0; $i < $n; ++$i) {
$d = mb_substr($aValStr, $i, 1, 'utf8');
if( ctype_digit($d) ) {
$d = (int)$d;
}
else {
$d = strtoupper($d);
}
$digit_img[$i] = $this->_GetLED($d, $aColor);
}
 
$w = imagesx($digit_img[0]->img);
$h = imagesy($digit_img[0]->img);
 
$number_img = new Image($w*$n, $h, DEFAULT_GFORMAT, false);
 
for($i = 0; $i < $n; ++$i) {
$number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h);
}
 
if( $aFileName != '' ) {
$number_img->Stream($aFileName);
} else {
$number_img->Headers();
$number_img->Stream();
}
}
}
?>
/tags/v1.1-andromede/composants/statistiques/lib/imgdata_squares.inc.php
New file
0,0 → 1,150
<?php
//=======================================================================
// File: IMGDATA_SQUARES.INC
// Description: Base64 encoded images for squares
// Created: 2003-03-20
// Ver: $Id: imgdata_squares.inc.php 1106 2009-02-22 20:16:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Squares extends ImgData {
protected $name = 'Squares';
protected $an = array(MARK_IMG_SQUARE =>'imgdata');
 
protected $colors = array('bluegreen','blue','green',
'lightblue','orange','purple','red','yellow');
protected $index = array('bluegreen' =>2,'blue'=>5,'green'=>6,
'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1);
protected $maxidx = 7 ;
protected $imgdata ;
 
function ImgData_Squares () {
//==========================================================
//sq_lblue.png
//==========================================================
$this->imgdata[0][0]= 362 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'.
'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'.
'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'.
'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'.
'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'.
'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'.
'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'.
'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ;
 
//==========================================================
//sq_yellow.png
//==========================================================
$this->imgdata[1][0]= 338 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'.
'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'.
'/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'.
'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'.
'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'.
'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'.
'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'.
'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'.
'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'.
'I=' ;
 
//==========================================================
//sq_blgr.png
//==========================================================
$this->imgdata[2][0]= 347 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'.
'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'.
'0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'.
'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'.
'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'.
'1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'.
'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'.
'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'.
'0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'.
'AASUVORK5CYII=' ;
 
//==========================================================
//sq_red.png
//==========================================================
$this->imgdata[3][0]= 324 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'.
'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'.
'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'.
'3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'.
'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'.
'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'.
'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'.
'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'.
'/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ;
 
//==========================================================
//sq_pink.png
//==========================================================
$this->imgdata[4][0]= 445 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'.
'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'.
'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'.
'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'.
'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'.
'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'.
'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'.
'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'.
'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'.
'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'.
'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'.
'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_blue.png
//==========================================================
$this->imgdata[5][0]= 283 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'.
'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'.
'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'.
'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'.
'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'.
'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'.
'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'.
'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_green.png
//==========================================================
$this->imgdata[6][0]= 325 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'.
'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'.
'6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'.
'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'.
'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'.
'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'.
'5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'.
'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'.
'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_orange.png
//==========================================================
$this->imgdata[7][0]= 321 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'.
'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'.
'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'.
'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'.
'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'.
'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'.
'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'.
'1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'.
'AbWuGMOr5COSAAAAAElFTkSuQmCC' ;
}
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_legend.inc.php
New file
0,0 → 1,484
<?php
//=======================================================================
// File: JPGRAPH_LEGEND.INC.PHP
// Description: Class to handle the legend box in the graph that gives
// names on the data series. The number of rows and columns
// in the legend are user specifyable.
// Created: 2001-01-08 (Refactored to separate file 2008-08-01)
// Ver: $Id: jpgraph_legend.inc.php 1926 2010-01-11 16:33:07Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
DEFINE('_DEFAULT_LPM_SIZE',8); // Default Legend Plot Mark size
 
 
//===================================================
// CLASS Legend
// Description: Responsible for drawing the box containing
// all the legend text for the graph
//===================================================
 
class Legend {
public $txtcol=array();
public $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12;
private $color=array(0,0,0); // Default fram color
private $fill_color=array(235,235,235); // Default fill color
private $shadow=true; // Shadow around legend "box"
private $shadow_color='darkgray';
private $mark_abs_hsize=_DEFAULT_LPM_SIZE,$mark_abs_vsize=_DEFAULT_LPM_SIZE;
private $xmargin=10,$ymargin=0,$shadow_width=2;
private $xlmargin=4;
private $ylinespacing=5;
// We need a separate margin since the baseline of the last text would coincide with the bottom otherwise
private $ybottom_margin = 8;
private $xpos=0.05, $ypos=0.15, $xabspos=-1, $yabspos=-1;
private $halign="right", $valign="top";
private $font_color='black';
private $hide=false,$layout_n=1;
private $weight=1,$frameweight=1;
private $csimareas='';
private $reverse = false ;
private $bkg_gradtype=-1, $bkg_gradfrom='lightgray', $bkg_gradto='gray';
 
//---------------
// CONSTRUCTOR
function __construct() {
// Empty
}
//---------------
// PUBLIC METHODS
function Hide($aHide=true) {
$this->hide=$aHide;
}
 
function SetHColMargin($aXMarg) {
$this->xmargin = $aXMarg;
}
 
function SetVColMargin($aSpacing) {
$this->ylinespacing = $aSpacing ;
}
 
function SetLeftMargin($aXMarg) {
$this->xlmargin = $aXMarg;
}
 
// Synonym
function SetLineSpacing($aSpacing) {
$this->ylinespacing = $aSpacing ;
}
 
function SetShadow($aShow='gray',$aWidth=4) {
if( is_string($aShow) ) {
$this->shadow_color = $aShow;
$this->shadow=true;
}
else {
$this->shadow = $aShow;
}
$this->shadow_width = $aWidth;
}
 
function SetMarkAbsSize($aSize) {
$this->mark_abs_vsize = $aSize ;
$this->mark_abs_hsize = $aSize ;
}
 
function SetMarkAbsVSize($aSize) {
$this->mark_abs_vsize = $aSize ;
}
 
function SetMarkAbsHSize($aSize) {
$this->mark_abs_hsize = $aSize ;
}
 
function SetLineWeight($aWeight) {
$this->weight = $aWeight;
}
 
function SetFrameWeight($aWeight) {
$this->frameweight = $aWeight;
}
 
function SetLayout($aDirection=LEGEND_VERT) {
$this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ;
}
 
function SetColumns($aCols) {
$this->layout_n = $aCols ;
}
 
function SetReverse($f=true) {
$this->reverse = $f ;
}
 
// Set color on frame around box
function SetColor($aFontColor,$aColor='black') {
$this->font_color=$aFontColor;
$this->color=$aColor;
}
 
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family = $aFamily;
$this->font_style = $aStyle;
$this->font_size = $aSize;
}
 
function SetPos($aX,$aY,$aHAlign='right',$aVAlign='top') {
$this->Pos($aX,$aY,$aHAlign,$aVAlign);
}
 
function SetAbsPos($aX,$aY,$aHAlign='right',$aVAlign='top') {
$this->xabspos=$aX;
$this->yabspos=$aY;
$this->halign=$aHAlign;
$this->valign=$aVAlign;
}
 
function Pos($aX,$aY,$aHAlign='right',$aVAlign='top') {
if( !($aX<1 && $aY<1) ) {
JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1");
}
$this->xpos=$aX;
$this->ypos=$aY;
$this->halign=$aHAlign;
$this->valign=$aVAlign;
}
 
function SetFillColor($aColor) {
$this->fill_color=$aColor;
}
 
function Clear() {
$this->txtcol = array();
}
 
function Add($aTxt,$aColor,$aPlotmark='',$aLinestyle=0,$csimtarget='',$csimalt='',$csimwintarget='') {
$this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget);
}
 
function GetCSIMAreas() {
return $this->csimareas;
}
 
function SetBackgroundGradient($aFrom='navy',$aTo='silver',$aGradType=2) {
$this->bkg_gradtype=$aGradType;
$this->bkg_gradfrom = $aFrom;
$this->bkg_gradto = $aTo;
}
 
function Stroke($aImg) {
// Constant
$fillBoxFrameWeight=1;
 
if( $this->hide ) return;
 
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
 
if( $this->reverse ) {
$this->txtcol = array_reverse($this->txtcol);
}
 
$n=count($this->txtcol);
if( $n == 0 ) return;
 
// Find out the max width and height of each column to be able
// to size the legend box.
$numcolumns = ($n > $this->layout_n ? $this->layout_n : $n);
for( $i=0; $i < $numcolumns; ++$i ) {
$colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) +
2*$this->xmargin + 2*$this->mark_abs_hsize;
$colheight[$i] = 0;
 
}
 
// Find our maximum height in each row
$rows = 0 ; $rowheight[0] = 0;
for( $i=0; $i < $n; ++$i ) {
$h = max($this->mark_abs_vsize,$aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ylinespacing;
 
// Makes sure we always have a minimum of 1/4 (1/2 on each side) of the mark as space
// between two vertical legend entries
//$h = round(max($h,$this->mark_abs_vsize+$this->ymargin));
//echo "Textheight #$i: tetxheight=".$aImg->GetTextHeight($this->txtcol[$i][0]).', ';
//echo "h=$h ({$this->mark_abs_vsize},{$this->ymargin})<br>";
if( $i % $numcolumns == 0 ) {
$rows++;
$rowheight[$rows-1] = 0;
}
$rowheight[$rows-1] = max($rowheight[$rows-1],$h);
}
 
$abs_height = 0;
for( $i=0; $i < $rows; ++$i ) {
$abs_height += $rowheight[$i] ;
}
 
// Make sure that the height is at least as high as mark size + ymargin
$abs_height = max($abs_height,$this->mark_abs_vsize);
$abs_height += $this->ybottom_margin;
 
// Find out the maximum width in each column
for( $i=$numcolumns; $i < $n; ++$i ) {
$colwidth[$i % $numcolumns] = max(
$aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize,
$colwidth[$i % $numcolumns]);
}
 
// Get the total width
$mtw = 0;
for( $i=0; $i < $numcolumns; ++$i ) {
$mtw += $colwidth[$i] ;
}
 
// remove the last rows interpace margin (since there is no next row)
$abs_height -= $this->ylinespacing;
 
 
// Find out maximum width we need for legend box
$abs_width = $mtw+$this->xlmargin+($numcolumns-1)*$this->mark_abs_hsize;
 
if( $this->xabspos === -1 && $this->yabspos === -1 ) {
$this->xabspos = $this->xpos*$aImg->width ;
$this->yabspos = $this->ypos*$aImg->height ;
}
 
// Positioning of the legend box
if( $this->halign == 'left' ) {
$xp = $this->xabspos;
}
elseif( $this->halign == 'center' ) {
$xp = $this->xabspos - $abs_width/2;
}
else {
$xp = $aImg->width - $this->xabspos - $abs_width;
}
 
$yp=$this->yabspos;
if( $this->valign == 'center' ) {
$yp-=$abs_height/2;
}
elseif( $this->valign == 'bottom' ) {
$yp-=$abs_height;
}
 
// Stroke legend box
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->frameweight);
$aImg->SetLineStyle('solid');
 
if( $this->shadow ) {
$aImg->ShadowRectangle($xp,$yp,
$xp+$abs_width+$this->shadow_width+2,
$yp+$abs_height+$this->shadow_width+2,
$this->fill_color,$this->shadow_width+2,$this->shadow_color);
}
else {
$aImg->SetColor($this->fill_color);
$aImg->FilledRectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height);
$aImg->SetColor($this->color);
$aImg->Rectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height);
}
 
if( $this->bkg_gradtype >= 0 ) {
$grad = new Gradient($aImg);
$grad->FilledRectangle($xp+1, $yp+1,
$xp+$abs_width-3, $yp+$abs_height-3,
$this->bkg_gradfrom, $this->bkg_gradto,
$this->bkg_gradtype);
}
 
// x1,y1 is the position for the legend marker + text
// The vertical position is the baseline position for the text
// and every marker is adjusted acording to that.
 
// For multiline texts this get more complicated.
 
$x1 = $xp + $this->xlmargin;
$y1 = $yp + $rowheight[0] - $this->ylinespacing + 2 ; // The ymargin is included in rowheight
 
// Now, y1 is the bottom vertical position of the first legend, i.e if
// the legend has multiple lines it is the bottom line.
 
$grad = new Gradient($aImg);
$patternFactory = null;
 
// Now stroke each legend in turn
// Each plot has added the following information to the legend
// p[0] = Legend text
// p[1] = Color,
// p[2] = For markers a reference to the PlotMark object
// p[3] = For lines the line style, for gradient the negative gradient style
// p[4] = CSIM target
// p[5] = CSIM Alt text
$i = 1 ; $row = 0;
foreach($this->txtcol as $p) {
 
// STROKE DEBUG BOX
if( _JPG_DEBUG ) {
$aImg->SetLineWeight(1);
$aImg->SetColor('red');
$aImg->SetLineStyle('solid');
$aImg->Rectangle($x1,$y1,$xp+$abs_width-1,$y1-$rowheight[$row]);
}
 
$aImg->SetLineWeight($this->weight);
$x1 = round($x1)+1; // We add one to not collide with the border
$y1=round($y1);
 
// This is the center offset up from the baseline which is
// considered the "center" of the marks. This gets slightly complicated since
// we need to consider if the text is a multiline paragraph or if it is only
// a single line. The reason is that for single line the y1 corresponds to the baseline
// and that is fine. However for a multiline paragraph there is no single baseline
// and in that case the y1 corresponds to the lowest y for the bounding box. In that
// case we center the mark in the middle of the paragraph
if( !preg_match('/\n/',$p[0]) ) {
// Single line
$marky = ceil($y1-$this->mark_abs_vsize/2)-1;
} else {
// Paragraph
$marky = $y1 - $aImg->GetTextHeight($p[0])/2;
 
// echo "y1=$y1, p[o]={$p[0]}, marky=$marky<br>";
}
 
//echo "<br>Mark #$i: marky=$marky<br>";
 
$x1 += $this->mark_abs_hsize;
if ( !empty($p[2]) && $p[2]->GetType() > -1 ) {
 
 
// Make a plot mark legend. This is constructed with a mark which
// is run through with a line
 
// First construct a bit of the line that looks exactly like the
// line in the plot
$aImg->SetColor($p[1]);
if( is_string($p[3]) || $p[3]>0 ) {
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1-$this->mark_abs_hsize,$marky,$x1+$this->mark_abs_hsize,$marky);
}
 
// Stroke a mark with the standard size
// (As long as it is not an image mark )
if( $p[2]->GetType() != MARK_IMG ) {
 
// Clear any user callbacks since we ont want them called for
// the legend marks
$p[2]->iFormatCallback = '';
$p[2]->iFormatCallback2 = '';
 
// Since size for circles is specified as the radius
// this means that we must half the size to make the total
// width behave as the other marks
if( $p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE ) {
$p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)/2);
$p[2]->Stroke($aImg,$x1,$marky);
}
else {
$p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize));
$p[2]->Stroke($aImg,$x1,$marky);
}
}
}
elseif ( !empty($p[2]) && (is_string($p[3]) || $p[3]>0 ) ) {
// Draw a styled line
$aImg->SetColor($p[1]);
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1-$this->mark_abs_hsize,$marky,$x1+$this->mark_abs_hsize,$marky);
$aImg->StyleLine($x1-$this->mark_abs_hsize,$marky+1,$x1+$this->mark_abs_hsize,$marky+1);
}
else {
// Draw a colored box
$color = $p[1] ;
 
// We make boxes slightly larger to better show
$boxsize = max($this->mark_abs_vsize,$this->mark_abs_hsize) + 2 ;
 
$ym = $marky-ceil($boxsize/2) ; // Marker y-coordinate
 
// We either need to plot a gradient or a
// pattern. To differentiate we use a kludge.
// Patterns have a p[3] value of < -100
if( $p[3] < -100 ) {
// p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity
if( $patternFactory == null ) {
$patternFactory = new RectPatternFactory();
}
$prect = $patternFactory->Create($p[1][0],$p[1][1],1);
$prect->SetBackground($p[1][3]);
$prect->SetDensity($p[1][2]+1);
$prect->SetPos(new Rectangle($x1,$ym,$boxsize,$boxsize));
$prect->Stroke($aImg);
$prect=null;
}
else {
if( is_array($color) && count($color)==2 ) {
// The client want a gradient color
$grad->FilledRectangle($x1-$boxsize/2,$ym,
$x1+$boxsize/2,$ym+$boxsize,
$color[0],$color[1],-$p[3]);
}
else {
$aImg->SetColor($p[1]);
$aImg->FilledRectangle($x1-$boxsize/2,$ym,
$x1+$boxsize/2,$ym+$boxsize);
}
$aImg->SetColor($this->color);
$aImg->SetLineWeight($fillBoxFrameWeight);
$aImg->Rectangle($x1-$boxsize/2,$ym,
$x1+$boxsize/2,$ym+$boxsize);
}
}
$aImg->SetColor($this->font_color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->SetTextAlign('left','baseline');
 
$debug=false;
$aImg->StrokeText($x1+$this->mark_abs_hsize+$this->xmargin,$y1,$p[0],
0,'left',$debug);
 
// Add CSIM for Legend if defined
if( !empty($p[4]) ) {
 
$xs = $x1 - $this->mark_abs_hsize ;
$ys = $y1 + 1 ;
$xe = $x1 + $aImg->GetTextWidth($p[0]) + $this->mark_abs_hsize + $this->xmargin ;
$ye = $y1-$rowheight[$row]+1;
$coords = "$xs,$ys,$xe,$y1,$xe,$ye,$xs,$ye";
if( ! empty($p[4]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($p[4])."\"";
 
if( !empty($p[6]) ) {
$this->csimareas .= " target=\"".$p[6]."\"";
}
 
if( !empty($p[5]) ) {
$tmp=sprintf($p[5],$p[0]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
 
if( $i >= $this->layout_n ) {
$x1 = $xp+$this->xlmargin;
$row++;
if( !empty($rowheight[$row]) )
$y1 += $rowheight[$row];
$i = 1;
}
else {
$x1 += $colwidth[($i-1) % $numcolumns] ;
++$i;
}
}
}
} // Class
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_utils.inc.php
New file
0,0 → 1,685
<?php
/*=======================================================================
// File: JPGRAPH_UTILS.INC
// Description: Collection of non-essential "nice to have" utilities
// Created: 2005-11-20
// Ver: $Id: jpgraph_utils.inc.php 1777 2009-08-23 17:34:36Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS FuncGenerator
// Description: Utility class to help generate data for function plots.
// The class supports both parametric and regular functions.
//===================================================
class FuncGenerator {
private $iFunc='',$iXFunc='',$iMin,$iMax,$iStepSize;
 
function __construct($aFunc,$aXFunc='') {
$this->iFunc = $aFunc;
$this->iXFunc = $aXFunc;
}
 
function E($aXMin,$aXMax,$aSteps=50) {
$this->iMin = $aXMin;
$this->iMax = $aXMax;
$this->iStepSize = ($aXMax-$aXMin)/$aSteps;
 
if( $this->iXFunc != '' )
$t = 'for($i='.$aXMin.'; $i<='.$aXMax.'; $i += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]='.$this->iXFunc.';}';
elseif( $this->iFunc != '' )
$t = 'for($x='.$aXMin.'; $x<='.$aXMax.'; $x += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]=$x;} $x='.$aXMax.';$ya[]='.$this->iFunc.';$xa[]=$x;';
else
JpGraphError::RaiseL(24001);//('FuncGenerator : No function specified. ');
 
@eval($t);
 
// If there is an error in the function specifcation this is the only
// way we can discover that.
if( empty($xa) || empty($ya) )
JpGraphError::RaiseL(24002);//('FuncGenerator : Syntax error in function specification ');
 
return array($xa,$ya);
}
}
 
 
//=============================================================================
// CLASS DateScaleUtils
// Description: Help to create a manual date scale
//=============================================================================
define('DSUTILS_MONTH',1); // Major and minor ticks on a monthly basis
define('DSUTILS_MONTH1',1); // Major and minor ticks on a monthly basis
define('DSUTILS_MONTH2',2); // Major ticks on a bi-monthly basis
define('DSUTILS_MONTH3',3); // Major icks on a tri-monthly basis
define('DSUTILS_MONTH6',4); // Major on a six-monthly basis
define('DSUTILS_WEEK1',5); // Major ticks on a weekly basis
define('DSUTILS_WEEK2',6); // Major ticks on a bi-weekly basis
define('DSUTILS_WEEK4',7); // Major ticks on a quod-weekly basis
define('DSUTILS_DAY1',8); // Major ticks on a daily basis
define('DSUTILS_DAY2',9); // Major ticks on a bi-daily basis
define('DSUTILS_DAY4',10); // Major ticks on a qoud-daily basis
define('DSUTILS_YEAR1',11); // Major ticks on a yearly basis
define('DSUTILS_YEAR2',12); // Major ticks on a bi-yearly basis
define('DSUTILS_YEAR5',13); // Major ticks on a five-yearly basis
 
 
class DateScaleUtils {
public static $iMin=0, $iMax=0;
 
private static $starthour,$startmonth, $startday, $startyear;
private static $endmonth, $endyear, $endday;
private static $tickPositions=array(),$minTickPositions=array();
private static $iUseWeeks = true;
 
static function UseWeekFormat($aFlg) {
self::$iUseWeeks = $aFlg;
}
 
static function doYearly($aType,$aMinor=false) {
$i=0; $j=0;
$m = self::$startmonth;
$y = self::$startyear;
 
if( self::$startday == 1 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
++$m;
 
 
switch( $aType ) {
case DSUTILS_YEAR1:
for($y=self::$startyear; $y <= self::$endyear; ++$y ) {
if( $aMinor ) {
while( $m <= 12 ) {
if( !($y == self::$endyear && $m > self::$endmonth) ) {
self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
++$m;
}
$m=1;
}
self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y);
}
break;
case DSUTILS_YEAR2:
$y=self::$startyear;
while( $y <= self::$endyear ) {
self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y);
for($k=0; $k < 1; ++$k ) {
++$y;
if( $aMinor ) {
self::$minTickPositions[$j++] = mktime(0,0,0,1,1,$y);
}
}
++$y;
}
break;
case DSUTILS_YEAR5:
$y=self::$startyear;
while( $y <= self::$endyear ) {
self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y);
for($k=0; $k < 4; ++$k ) {
++$y;
if( $aMinor ) {
self::$minTickPositions[$j++] = mktime(0,0,0,1,1,$y);
}
}
++$y;
}
break;
}
}
 
static function doDaily($aType,$aMinor=false) {
$m = self::$startmonth;
$y = self::$startyear;
$d = self::$startday;
$h = self::$starthour;
$i=0;$j=0;
 
if( $h == 0 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,$d,$y);
}
$t = mktime(0,0,0,$m,$d,$y);
 
switch($aType) {
case DSUTILS_DAY1:
while( $t <= self::$iMax ) {
$t = strtotime('+1 day',$t);
self::$tickPositions[$i++] = $t;
if( $aMinor ) {
self::$minTickPositions[$j++] = strtotime('+12 hours',$t);
}
}
break;
case DSUTILS_DAY2:
while( $t <= self::$iMax ) {
$t = strtotime('+1 day',$t);
if( $aMinor ) {
self::$minTickPositions[$j++] = $t;
}
$t = strtotime('+1 day',$t);
self::$tickPositions[$i++] = $t;
}
break;
case DSUTILS_DAY4:
while( $t <= self::$iMax ) {
for($k=0; $k < 3; ++$k ) {
$t = strtotime('+1 day',$t);
if( $aMinor ) {
self::$minTickPositions[$j++] = $t;
}
}
$t = strtotime('+1 day',$t);
self::$tickPositions[$i++] = $t;
}
break;
}
}
 
static function doWeekly($aType,$aMinor=false) {
$hpd = 3600*24;
$hpw = 3600*24*7;
// Find out week number of min date
$thursday = self::$iMin + $hpd * (3 - (date('w', self::$iMin) + 6) % 7);
$week = 1 + (date('z', $thursday) - (11 - date('w', mktime(0, 0, 0, 1, 1, date('Y', $thursday)))) % 7) / 7;
$daynumber = date('w',self::$iMin);
if( $daynumber == 0 ) $daynumber = 7;
$m = self::$startmonth;
$y = self::$startyear;
$d = self::$startday;
$i=0;$j=0;
// The assumption is that the weeks start on Monday. If the first day
// is later in the week then the first week tick has to be on the following
// week.
if( $daynumber == 1 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,$d,$y);
$t = mktime(0,0,0,$m,$d,$y) + $hpw;
}
else {
$t = mktime(0,0,0,$m,$d,$y) + $hpd*(8-$daynumber);
}
 
switch($aType) {
case DSUTILS_WEEK1:
$cnt=0;
break;
case DSUTILS_WEEK2:
$cnt=1;
break;
case DSUTILS_WEEK4:
$cnt=3;
break;
}
while( $t <= self::$iMax ) {
self::$tickPositions[$i++] = $t;
for($k=0; $k < $cnt; ++$k ) {
$t += $hpw;
if( $aMinor ) {
self::$minTickPositions[$j++] = $t;
}
}
$t += $hpw;
}
}
 
static function doMonthly($aType,$aMinor=false) {
$monthcount=0;
$m = self::$startmonth;
$y = self::$startyear;
$i=0; $j=0;
 
// Skip the first month label if it is before the startdate
if( self::$startday == 1 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
$monthcount=1;
}
if( $aType == 1 ) {
if( self::$startday < 15 ) {
self::$minTickPositions[$j++] = mktime(0,0,0,$m,15,$y);
}
}
++$m;
 
// Loop through all the years included in the scale
for($y=self::$startyear; $y <= self::$endyear; ++$y ) {
// Loop through all the months. There are three cases to consider:
// 1. We are in the first year and must start with the startmonth
// 2. We are in the end year and we must stop at last month of the scale
// 3. A year in between where we run through all the 12 months
$stopmonth = $y == self::$endyear ? self::$endmonth : 12;
while( $m <= $stopmonth ) {
switch( $aType ) {
case DSUTILS_MONTH1:
// Set minor tick at the middle of the month
if( $aMinor ) {
if( $m <= $stopmonth ) {
if( !($y==self::$endyear && $m==$stopmonth && self::$endday < 15) )
self::$minTickPositions[$j++] = mktime(0,0,0,$m,15,$y);
}
}
// Major at month
// Get timestamp of first hour of first day in each month
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
 
break;
case DSUTILS_MONTH2:
if( $aMinor ) {
// Set minor tick at start of each month
self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
 
// Major at every second month
// Get timestamp of first hour of first day in each month
if( $monthcount % 2 == 0 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
case DSUTILS_MONTH3:
if( $aMinor ) {
// Set minor tick at start of each month
self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
// Major at every third month
// Get timestamp of first hour of first day in each month
if( $monthcount % 3 == 0 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
case DSUTILS_MONTH6:
if( $aMinor ) {
// Set minor tick at start of each month
self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
// Major at every third month
// Get timestamp of first hour of first day in each month
if( $monthcount % 6 == 0 ) {
self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
}
++$m;
++$monthcount;
}
$m=1;
}
 
// For the case where all dates are within the same month
// we want to make sure we have at least two ticks on the scale
// since the scale want work properly otherwise
if(self::$startmonth == self::$endmonth && self::$startyear == self::$endyear && $aType==1 ) {
self::$tickPositions[$i++] = mktime(0 ,0 ,0, self::$startmonth + 1, 1, self::$startyear);
}
 
return array(self::$tickPositions,self::$minTickPositions);
}
 
static function GetTicks($aData,$aType=1,$aMinor=false,$aEndPoints=false) {
$n = count($aData);
return self::GetTicksFromMinMax($aData[0],$aData[$n-1],$aType,$aMinor,$aEndPoints);
}
 
static function GetAutoTicks($aMin,$aMax,$aMaxTicks=10,$aMinor=false) {
$diff = $aMax - $aMin;
$spd = 3600*24;
$spw = $spd*7;
$spm = $spd*30;
$spy = $spd*352;
 
if( self::$iUseWeeks )
$w = 'W';
else
$w = 'd M';
 
// Decision table for suitable scales
// First value: Main decision point
// Second value: Array of formatting depending on divisor for wanted max number of ticks. <divisor><formatting><format-string>,..
$tt = array(
array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')),
array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)),
array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w,30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')),
array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y',180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y')));
 
$ntt = count($tt);
$nd = floor($diff/$spd);
for($i=0; $i < $ntt; ++$i ) {
if( $diff <= $tt[$i][0] || $i==$ntt-1) {
$t = $tt[$i][1];
$n = count($t)/3;
for( $j=0; $j < $n; ++$j ) {
if( $nd/$t[3*$j] <= $aMaxTicks || $j==$n-1) {
$type = $t[3*$j+1];
$fs = $t[3*$j+2];
list($tickPositions,$minTickPositions) = self::GetTicksFromMinMax($aMin,$aMax,$type,$aMinor);
return array($fs,$tickPositions,$minTickPositions,$type);
}
}
}
}
}
 
static function GetTicksFromMinMax($aMin,$aMax,$aType,$aMinor=false,$aEndPoints=false) {
self::$starthour = date('G',$aMin);
self::$startmonth = date('n',$aMin);
self::$startday = date('j',$aMin);
self::$startyear = date('Y',$aMin);
self::$endmonth = date('n',$aMax);
self::$endyear = date('Y',$aMax);
self::$endday = date('j',$aMax);
self::$iMin = $aMin;
self::$iMax = $aMax;
 
if( $aType <= DSUTILS_MONTH6 ) {
self::doMonthly($aType,$aMinor);
}
elseif( $aType <= DSUTILS_WEEK4 ) {
self::doWeekly($aType,$aMinor);
}
elseif( $aType <= DSUTILS_DAY4 ) {
self::doDaily($aType,$aMinor);
}
elseif( $aType <= DSUTILS_YEAR5 ) {
self::doYearly($aType,$aMinor);
}
else {
JpGraphError::RaiseL(24003);
}
// put a label at the very left data pos
if( $aEndPoints ) {
$tickPositions[$i++] = $aData[0];
}
 
// put a label at the very right data pos
if( $aEndPoints ) {
$tickPositions[$i] = $aData[$n-1];
}
 
return array(self::$tickPositions,self::$minTickPositions);
}
}
 
//=============================================================================
// Class ReadFileData
//=============================================================================
Class ReadFileData {
//----------------------------------------------------------------------------
// Desciption:
// Read numeric data from a file.
// Each value should be separated by either a new line or by a specified
// separator character (default is ',').
// Before returning the data each value is converted to a proper float
// value. The routine is robust in the sense that non numeric data in the
// file will be discarded.
//
// Returns:
// The number of data values read on success, FALSE on failure
//----------------------------------------------------------------------------
static function FromCSV($aFile,&$aData,$aSepChar=',',$aMaxLineLength=1024) {
$rh = @fopen($aFile,'r');
if( $rh === false ) {
return false;
}
$tmp = array();
$lineofdata = fgetcsv($rh, 1000, ',');
while ( $lineofdata !== FALSE) {
$tmp = array_merge($tmp,$lineofdata);
$lineofdata = fgetcsv($rh, $aMaxLineLength, $aSepChar);
}
fclose($rh);
 
// Now make sure that all data is numeric. By default
// all data is read as strings
$n = count($tmp);
$aData = array();
$cnt=0;
for($i=0; $i < $n; ++$i) {
if( $tmp[$i] !== "" ) {
$aData[$cnt++] = floatval($tmp[$i]);
}
}
return $cnt;
}
 
//----------------------------------------------------------------------------
// Desciption:
// Read numeric data from a file.
// Each value should be separated by either a new line or by a specified
// separator character (default is ',').
// Before returning the data each value is converted to a proper float
// value. The routine is robust in the sense that non numeric data in the
// file will be discarded.
//
// Options:
// 'separator' => ',',
// 'enclosure' => '"',
// 'readlength' => 1024,
// 'ignore_first' => false,
// 'first_as_key' => false
// 'escape' => '\', # PHP >= 5.3 only
//
// Returns:
// The number of lines read on success, FALSE on failure
//----------------------------------------------------------------------------
static function FromCSV2($aFile, &$aData, $aOptions = array()) {
$aDefaults = array(
'separator' => ',',
'enclosure' => chr(34),
'escape' => chr(92),
'readlength' => 1024,
'ignore_first' => false,
'first_as_key' => false
);
 
$aOptions = array_merge(
$aDefaults, is_array($aOptions) ? $aOptions : array());
 
if( $aOptions['first_as_key'] ) {
$aOptions['ignore_first'] = true;
}
 
$rh = @fopen($aFile, 'r');
 
if( $rh === false ) {
return false;
}
 
$aData = array();
$aLine = fgetcsv($rh,
$aOptions['readlength'],
$aOptions['separator'],
$aOptions['enclosure']
/*, $aOptions['escape'] # PHP >= 5.3 only */
);
 
// Use numeric array keys for the columns by default
// If specified use first lines values as assoc keys instead
$keys = array_keys($aLine);
if( $aOptions['first_as_key'] ) {
$keys = array_values($aLine);
}
 
$num_lines = 0;
$num_cols = count($aLine);
 
while ($aLine !== false) {
if( is_array($aLine) && count($aLine) != $num_cols ) {
JpGraphError::RaiseL(24004);
// 'ReadCSV2: Column count mismatch in %s line %d'
}
 
// fgetcsv returns NULL for empty lines
if( !is_null($aLine) ) {
$num_lines++;
 
if( !($aOptions['ignore_first'] && $num_lines == 1) && is_numeric($aLine[0]) ) {
for( $i = 0; $i < $num_cols; $i++ ) {
$aData[ $keys[$i] ][] = floatval($aLine[$i]);
}
}
}
 
$aLine = fgetcsv($rh,
$aOptions['readlength'],
$aOptions['separator'],
$aOptions['enclosure']
/*, $aOptions['escape'] # PHP >= 5.3 only*/
);
}
 
fclose($rh);
 
if( $aOptions['ignore_first'] ) {
$num_lines--;
}
 
return $num_lines;
}
 
// Read data from two columns in a plain text file
static function From2Col($aFile, $aCol1, $aCol2, $aSepChar=' ') {
$lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
if( $lines === false ) {
return false;
}
$s = '/[\s]+/';
if( $aSepChar == ',' ) {
$s = '/[\s]*,[\s]*/';
}
elseif( $aSepChar == ';' ) {
$s = '/[\s]*;[\s]*/';
}
foreach( $lines as $line => $datarow ) {
$split = preg_split($s,$datarow);
$aCol1[] = floatval(trim($split[0]));
$aCol2[] = floatval(trim($split[1]));
}
 
return count($lines);
}
 
// Read data from one columns in a plain text file
static function From1Col($aFile, $aCol1) {
$lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
if( $lines === false ) {
return false;
}
foreach( $lines as $line => $datarow ) {
$aCol1[] = floatval(trim($datarow));
}
 
return count($lines);
}
 
static function FromMatrix($aFile,$aSepChar=' ') {
$lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
if( $lines === false ) {
return false;
}
$mat = array();
$reg = '/'.$aSepChar.'/';
foreach( $lines as $line => $datarow ) {
$row = preg_split($reg,trim($datarow));
foreach ($row as $key => $cell ) {
$row[$key] = floatval(trim($cell));
}
$mat[] = $row;
}
return $mat;
}
 
 
}
 
define('__LR_EPSILON', 1.0e-8);
//=============================================================================
// Class LinearRegression
//=============================================================================
class LinearRegression {
private $ix=array(),$iy=array();
private $ib=0, $ia=0;
private $icalculated=false;
public $iDet=0, $iCorr=0, $iStdErr=0;
 
public function __construct($aDataX,$aDataY) {
if( count($aDataX) !== count($aDataY) ) {
JpGraph::Raise('LinearRegression: X and Y data array must be of equal length.');
}
$this->ix = $aDataX;
$this->iy = $aDataY;
}
 
public function Calc() {
 
$this->icalculated = true;
 
$n = count($this->ix);
$sx2 = 0 ;
$sy2 = 0 ;
$sxy = 0 ;
$sx = 0 ;
$sy = 0 ;
 
for( $i=0; $i < $n; ++$i ) {
$sx2 += $this->ix[$i] * $this->ix[$i];
$sy2 += $this->iy[$i] * $this->iy[$i];
$sxy += $this->ix[$i] * $this->iy[$i];
$sx += $this->ix[$i];
$sy += $this->iy[$i];
}
 
if( $n*$sx2 - $sx*$sx > __LR_EPSILON ) {
$this->ib = ($n*$sxy - $sx*$sy) / ( $n*$sx2 - $sx*$sx );
$this->ia = ( $sy - $this->ib*$sx ) / $n;
 
$sx = $this->ib * ( $sxy - $sx*$sy/$n );
$sy2 = $sy2 - $sy*$sy/$n;
$sy = $sy2 - $sx;
 
$this->iDet = $sx / $sy2;
$this->iCorr = sqrt($this->iDet);
if( $n > 2 ) {
$this->iStdErr = sqrt( $sy / ($n-2) );
}
else {
$this->iStdErr = NAN ;
}
}
else {
$this->ib = 0;
$this->ia = 0;
}
 
}
 
public function GetAB() {
if( $this->icalculated == false )
$this->Calc();
return array($this->ia, $this->ib);
}
 
public function GetStat() {
if( $this->icalculated == false )
$this->Calc();
return array($this->iStdErr, $this->iCorr, $this->iDet);
}
 
public function GetY($aMinX, $aMaxX, $aStep=1) {
if( $this->icalculated == false )
$this->Calc();
 
$yy = array();
$i = 0;
for( $x=$aMinX; $x <= $aMaxX; $x += $aStep ) {
$xx[$i ] = $x;
$yy[$i++] = $this->ia + $this->ib * $x;
}
 
return array($xx,$yy);
}
 
}
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_canvtools.php
New file
0,0 → 1,523
<?php
/*=======================================================================
// File: JPGRAPH_CANVTOOLS.PHP
// Description: Some utilities for text and shape drawing on a canvas
// Created: 2002-08-23
// Ver: $Id: jpgraph_canvtools.php 1857 2009-09-28 14:38:14Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
define('CORNER_TOPLEFT',0);
define('CORNER_TOPRIGHT',1);
define('CORNER_BOTTOMRIGHT',2);
define('CORNER_BOTTOMLEFT',3);
 
 
//===================================================
// CLASS CanvasScale
// Description: Define a scale for canvas so we
// can abstract away with absolute pixels
//===================================================
 
class CanvasScale {
private $g;
private $w,$h;
private $ixmin=0,$ixmax=10,$iymin=0,$iymax=10;
 
function __construct($graph,$xmin=0,$xmax=10,$ymin=0,$ymax=10) {
$this->g = $graph;
$this->w = $graph->img->width;
$this->h = $graph->img->height;
$this->ixmin = $xmin;
$this->ixmax = $xmax;
$this->iymin = $ymin;
$this->iymax = $ymax;
}
 
function Set($xmin=0,$xmax=10,$ymin=0,$ymax=10) {
$this->ixmin = $xmin;
$this->ixmax = $xmax;
$this->iymin = $ymin;
$this->iymax = $ymax;
}
 
function Get() {
return array($this->ixmin,$this->ixmax,$this->iymin,$this->iymax);
}
 
function Translate($x,$y) {
$xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w);
$yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h);
return array($xp,$yp);
}
 
function TranslateX($x) {
$xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w);
return $xp;
}
 
function TranslateY($y) {
$yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h);
return $yp;
}
 
}
 
 
//===================================================
// CLASS Shape
// Description: Methods to draw shapes on canvas
//===================================================
class Shape {
private $img,$scale;
 
function __construct($aGraph,$scale) {
$this->img = $aGraph->img;
$this->img->SetColor('black');
$this->scale = $scale;
}
 
function SetColor($aColor) {
$this->img->SetColor($aColor);
}
 
function Line($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->Line($x1,$y1,$x2,$y2);
}
 
function SetLineWeight($aWeight) {
$this->img->SetLineWeight($aWeight);
}
 
function Polygon($p,$aClosed=false) {
$n=count($p);
for($i=0; $i < $n; $i+=2 ) {
$p[$i] = $this->scale->TranslateX($p[$i]);
$p[$i+1] = $this->scale->TranslateY($p[$i+1]);
}
$this->img->Polygon($p,$aClosed);
}
 
function FilledPolygon($p) {
$n=count($p);
for($i=0; $i < $n; $i+=2 ) {
$p[$i] = $this->scale->TranslateX($p[$i]);
$p[$i+1] = $this->scale->TranslateY($p[$i+1]);
}
$this->img->FilledPolygon($p);
}
 
 
// Draw a bezier curve with defining points in the $aPnts array
// using $aSteps steps.
// 0=x0, 1=y0
// 2=x1, 3=y1
// 4=x2, 5=y2
// 6=x3, 7=y3
function Bezier($p,$aSteps=40) {
$x0 = $p[0];
$y0 = $p[1];
// Calculate coefficients
$cx = 3*($p[2]-$p[0]);
$bx = 3*($p[4]-$p[2])-$cx;
$ax = $p[6]-$p[0]-$cx-$bx;
$cy = 3*($p[3]-$p[1]);
$by = 3*($p[5]-$p[3])-$cy;
$ay = $p[7]-$p[1]-$cy-$by;
 
// Step size
$delta = 1.0/$aSteps;
 
$x_old = $x0;
$y_old = $y0;
for($t=$delta; $t<=1.0; $t+=$delta) {
$tt = $t*$t; $ttt=$tt*$t;
$x = $ax*$ttt + $bx*$tt + $cx*$t + $x0;
$y = $ay*$ttt + $by*$tt + $cy*$t + $y0;
$this->Line($x_old,$y_old,$x,$y);
$x_old = $x;
$y_old = $y;
}
$this->Line($x_old,$y_old,$p[6],$p[7]);
}
 
function Rectangle($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->Rectangle($x1,$y1,$x2,$y2);
}
 
function FilledRectangle($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->FilledRectangle($x1,$y1,$x2,$y2);
}
 
function Circle($x1,$y1,$r) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
if( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->Circle($x1,$y1,$r);
}
 
function FilledCircle($x1,$y1,$r) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
if( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->FilledCircle($x1,$y1,$r);
}
 
function RoundedRectangle($x1,$y1,$x2,$y2,$r=null) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
 
if( $r == null )
$r = 5;
elseif( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->RoundedRectangle($x1,$y1,$x2,$y2,$r);
}
 
function FilledRoundedRectangle($x1,$y1,$x2,$y2,$r=null) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
 
if( $r == null )
$r = 5;
elseif( $r > 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->FilledRoundedRectangle($x1,$y1,$x2,$y2,$r);
}
 
function ShadowRectangle($x1,$y1,$x2,$y2,$fcolor=false,$shadow_width=null,$shadow_color=array(102,102,102)) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
if( $shadow_width == null )
$shadow_width=4;
else
$shadow_width=$this->scale->TranslateX($shadow_width);
$this->img->ShadowRectangle($x1,$y1,$x2,$y2,$fcolor,$shadow_width,$shadow_color);
}
 
function SetTextAlign($halign,$valign="bottom") {
$this->img->SetTextAlign($halign,$valign="bottom");
}
 
function StrokeText($x1,$y1,$txt,$dir=0,$paragraph_align="left") {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
$this->img->StrokeText($x1,$y1,$txt,$dir,$paragraph_align);
}
 
// A rounded rectangle where one of the corner has been moved "into" the
// rectangle 'iw' width and 'ih' height. Corners:
// 0=Top left, 1=top right, 2=bottom right, 3=bottom left
function IndentedRectangle($xt,$yt,$w,$h,$iw=0,$ih=0,$aCorner=3,$aFillColor="",$r=4) {
 
list($xt,$yt) = $this->scale->Translate($xt,$yt);
list($w,$h) = $this->scale->Translate($w,$h);
list($iw,$ih) = $this->scale->Translate($iw,$ih);
 
$xr = $xt + $w - 0;
$yl = $yt + $h - 0;
 
switch( $aCorner ) {
case 0: // Upper left
// Bottom line, left & right arc
$this->img->Line($xt+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Right line, Top right arc
$this->img->Line($xr,$yt+$r,$xr,$yl-$r);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Top line, Top left arc
$this->img->Line($xt+$iw+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$iw+$r,$yt+$r,$r*2,$r*2,180,270);
 
// Left line
$this->img->Line($xt,$yt+$ih+$r,$xt,$yl-$r);
 
// Indent horizontal, Lower left arc
$this->img->Line($xt+$r,$yt+$ih,$xt+$iw-$r,$yt+$ih);
$this->img->Arc($xt+$r,$yt+$ih+$r,$r*2,$r*2,180,270);
 
// Indent vertical, Indent arc
$this->img->Line($xt+$iw,$yt+$r,$xt+$iw,$yt+$ih-$r);
$this->img->Arc($xt+$iw-$r,$yt+$ih-$r,$r*2,$r*2,0,90);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xr-$r,$yl-$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 1: // Upper right
 
// Bottom line, left & right arc
$this->img->Line($xt+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Left line, Top left arc
$this->img->Line($xt,$yt+$r,$xt,$yl-$r);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
 
// Top line, Top right arc
$this->img->Line($xt+$r,$yt,$xr-$iw-$r,$yt);
$this->img->Arc($xr-$iw-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Right line
$this->img->Line($xr,$yt+$ih+$r,$xr,$yl-$r);
 
// Indent horizontal, Lower right arc
$this->img->Line($xr-$iw+$r,$yt+$ih,$xr-$r,$yt+$ih);
$this->img->Arc($xr-$r,$yt+$ih+$r,$r*2,$r*2,270,360);
 
// Indent vertical, Indent arc
$this->img->Line($xr-$iw,$yt+$r,$xr-$iw,$yt+$ih-$r);
$this->img->Arc($xr-$iw+$r,$yt+$ih-$r,$r*2,$r*2,90,180);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xt+$r,$yl-$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 2: // Lower right
// Top line, Top left & Top right arc
$this->img->Line($xt+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Left line, Bottom left arc
$this->img->Line($xt,$yt+$r,$xt,$yl-$r);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
 
// Bottom line, Bottom right arc
$this->img->Line($xt+$r,$yl,$xr-$iw-$r,$yl);
$this->img->Arc($xr-$iw-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Right line
$this->img->Line($xr,$yt+$r,$xr,$yl-$ih-$r);
// Indent horizontal, Lower right arc
$this->img->Line($xr-$r,$yl-$ih,$xr-$iw+$r,$yl-$ih);
$this->img->Arc($xr-$r,$yl-$ih-$r,$r*2,$r*2,0,90);
 
// Indent vertical, Indent arc
$this->img->Line($xr-$iw,$yl-$r,$xr-$iw,$yl-$ih+$r);
$this->img->Arc($xr-$iw+$r,$yl-$ih+$r,$r*2,$r*2,180,270);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xt+$r,$yt+$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 3: // Lower left
// Top line, Top left & Top right arc
$this->img->Line($xt+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Right line, Bottom right arc
$this->img->Line($xr,$yt+$r,$xr,$yl-$r);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Bottom line, Bottom left arc
$this->img->Line($xt+$iw+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$iw+$r,$yl-$r,$r*2,$r*2,90,180);
 
// Left line
$this->img->Line($xt,$yt+$r,$xt,$yl-$ih-$r);
// Indent horizontal, Lower left arc
$this->img->Line($xt+$r,$yl-$ih,$xt+$iw-$r,$yl-$ih);
$this->img->Arc($xt+$r,$yl-$ih-$r,$r*2,$r*2,90,180);
 
// Indent vertical, Indent arc
$this->img->Line($xt+$iw,$yl-$ih+$r,$xt+$iw,$yl-$r);
$this->img->Arc($xt+$iw-$r,$yl-$ih+$r,$r*2,$r*2,270,360);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xr-$r,$yt+$r,$bc);
$this->img->PopColor();
}
 
break;
}
}
}
 
 
//===================================================
// CLASS RectangleText
// Description: Draws a text paragraph inside a
// rounded, possible filled, rectangle.
//===================================================
class CanvasRectangleText {
private $ix,$iy,$iw,$ih,$ir=4;
private $iTxt,$iColor='black',$iFillColor='',$iFontColor='black';
private $iParaAlign='center';
private $iAutoBoxMargin=5;
private $iShadowWidth=3,$iShadowColor='';
 
function __construct($aTxt='',$xl=0,$yt=0,$w=0,$h=0) {
$this->iTxt = new Text($aTxt);
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function SetShadow($aColor='gray',$aWidth=3) {
$this->iShadowColor = $aColor;
$this->iShadowWidth = $aWidth;
}
 
function SetFont($FontFam,$aFontStyle,$aFontSize=12) {
$this->iTxt->SetFont($FontFam,$aFontStyle,$aFontSize);
}
 
function SetTxt($aTxt) {
$this->iTxt->Set($aTxt);
}
 
function ParagraphAlign($aParaAlign) {
$this->iParaAlign = $aParaAlign;
}
 
function SetFillColor($aFillColor) {
$this->iFillColor = $aFillColor;
}
 
function SetAutoMargin($aMargin) {
$this->iAutoBoxMargin=$aMargin;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetFontColor($aColor) {
$this->iFontColor = $aColor;
}
 
function SetPos($xl=0,$yt=0,$w=0,$h=0) {
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function Pos($xl=0,$yt=0,$w=0,$h=0) {
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function Set($aTxt,$xl,$yt,$w=0,$h=0) {
$this->iTxt->Set($aTxt);
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function SetCornerRadius($aRad=5) {
$this->ir = $aRad;
}
 
function Stroke($aImg,$scale) {
 
// If coordinates are specifed as negative this means we should
// treat them as abolsute (pixels) coordinates
if( $this->ix > 0 ) {
$this->ix = $scale->TranslateX($this->ix) ;
}
else {
$this->ix = -$this->ix;
}
 
if( $this->iy > 0 ) {
$this->iy = $scale->TranslateY($this->iy) ;
}
else {
$this->iy = -$this->iy;
}
list($this->iw,$this->ih) = $scale->Translate($this->iw,$this->ih) ;
 
if( $this->iw == 0 )
$this->iw = round($this->iTxt->GetWidth($aImg) + $this->iAutoBoxMargin);
if( $this->ih == 0 ) {
$this->ih = round($this->iTxt->GetTextHeight($aImg) + $this->iAutoBoxMargin);
}
 
if( $this->iShadowColor != '' ) {
$aImg->PushColor($this->iShadowColor);
$aImg->FilledRoundedRectangle($this->ix+$this->iShadowWidth,
$this->iy+$this->iShadowWidth,
$this->ix+$this->iw-1+$this->iShadowWidth,
$this->iy+$this->ih-1+$this->iShadowWidth,
$this->ir);
$aImg->PopColor();
}
 
if( $this->iFillColor != '' ) {
$aImg->PushColor($this->iFillColor);
$aImg->FilledRoundedRectangle($this->ix,$this->iy,
$this->ix+$this->iw-1,
$this->iy+$this->ih-1,
$this->ir);
$aImg->PopColor();
}
 
if( $this->iColor != '' ) {
$aImg->PushColor($this->iColor);
$aImg->RoundedRectangle($this->ix,$this->iy,
$this->ix+$this->iw-1,
$this->iy+$this->ih-1,
$this->ir);
$aImg->PopColor();
}
 
$this->iTxt->Align('center','center');
$this->iTxt->ParagraphAlign($this->iParaAlign);
$this->iTxt->SetColor($this->iFontColor);
$this->iTxt->Stroke($aImg, $this->ix+$this->iw/2, $this->iy+$this->ih/2);
 
return array($this->iw, $this->ih);
 
}
 
}
 
 
?>
/tags/v1.1-andromede/composants/statistiques/lib/jpgraph_regstat.php
New file
0,0 → 1,215
<?php
/*=======================================================================
// File: JPGRAPH_REGSTAT.PHP
// Description: Regression and statistical analysis helper classes
// Created: 2002-12-01
// Ver: $Id: jpgraph_regstat.php 1131 2009-03-11 20:08:24Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//------------------------------------------------------------------------
// CLASS Spline
// Create a new data array from an existing data array but with more points.
// The new points are interpolated using a cubic spline algorithm
//------------------------------------------------------------------------
class Spline {
// 3:rd degree polynom approximation
 
private $xdata,$ydata; // Data vectors
private $y2; // 2:nd derivate of ydata
private $n=0;
 
function __construct($xdata,$ydata) {
$this->y2 = array();
$this->xdata = $xdata;
$this->ydata = $ydata;
 
$n = count($ydata);
$this->n = $n;
if( $this->n !== count($xdata) ) {
JpGraphError::RaiseL(19001);
//('Spline: Number of X and Y coordinates must be the same');
}
 
// Natural spline 2:derivate == 0 at endpoints
$this->y2[0] = 0.0;
$this->y2[$n-1] = 0.0;
$delta[0] = 0.0;
 
// Calculate 2:nd derivate
for($i=1; $i < $n-1; ++$i) {
$d = ($xdata[$i+1]-$xdata[$i-1]);
if( $d == 0 ) {
JpGraphError::RaiseL(19002);
//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.');
}
$s = ($xdata[$i]-$xdata[$i-1])/$d;
$p = $s*$this->y2[$i-1]+2.0;
$this->y2[$i] = ($s-1.0)/$p;
$delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) -
($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]);
$delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p;
}
 
// Backward substitution
for( $j=$n-2; $j >= 0; --$j ) {
$this->y2[$j] = $this->y2[$j]*$this->y2[$j+1] + $delta[$j];
}
}
 
// Return the two new data vectors
function Get($num=50) {
$n = $this->n ;
$step = ($this->xdata[$n-1]-$this->xdata[0]) / ($num-1);
$xnew=array();
$ynew=array();
$xnew[0] = $this->xdata[0];
$ynew[0] = $this->ydata[0];
for( $j=1; $j < $num; ++$j ) {
$xnew[$j] = $xnew[0]+$j*$step;
$ynew[$j] = $this->Interpolate($xnew[$j]);
}
return array($xnew,$ynew);
}
 
// Return a single interpolated Y-value from an x value
function Interpolate($xpoint) {
 
$max = $this->n-1;
$min = 0;
 
// Binary search to find interval
while( $max-$min > 1 ) {
$k = ($max+$min) / 2;
if( $this->xdata[$k] > $xpoint )
$max=$k;
else
$min=$k;
}
 
// Each interval is interpolated by a 3:degree polynom function
$h = $this->xdata[$max]-$this->xdata[$min];
 
if( $h == 0 ) {
JpGraphError::RaiseL(19002);
//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.');
}
 
 
$a = ($this->xdata[$max]-$xpoint)/$h;
$b = ($xpoint-$this->xdata[$min])/$h;
return $a*$this->ydata[$min]+$b*$this->ydata[$max]+
(($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0;
}
}
 
//------------------------------------------------------------------------
// CLASS Bezier
// Create a new data array from a number of control points
//------------------------------------------------------------------------
class Bezier {
/**
* @author Thomas Despoix, openXtrem company
* @license released under QPL
* @abstract Bezier interoplated point generation,
* computed from control points data sets, based on Paul Bourke algorithm :
* http://local.wasp.uwa.edu.au/~pbourke/geometry/bezier/index2.html
*/
private $datax = array();
private $datay = array();
private $n=0;
 
function __construct($datax, $datay, $attraction_factor = 1) {
// Adding control point multiple time will raise their attraction power over the curve
$this->n = count($datax);
if( $this->n !== count($datay) ) {
JpGraphError::RaiseL(19003);
//('Bezier: Number of X and Y coordinates must be the same');
}
$idx=0;
foreach($datax as $datumx) {
for ($i = 0; $i < $attraction_factor; $i++) {
$this->datax[$idx++] = $datumx;
}
}
$idx=0;
foreach($datay as $datumy) {
for ($i = 0; $i < $attraction_factor; $i++) {
$this->datay[$idx++] = $datumy;
}
}
$this->n *= $attraction_factor;
}
 
/**
* Return a set of data points that specifies the bezier curve with $steps points
* @param $steps Number of new points to return
* @return array($datax, $datay)
*/
function Get($steps) {
$datax = array();
$datay = array();
for ($i = 0; $i < $steps; $i++) {
list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps);
$datax[$i] = $datumx;
$datay[$i] = $datumy;
}
$datax[] = end($this->datax);
$datay[] = end($this->datay);
return array($datax, $datay);
}
 
/**
* Return one point on the bezier curve. $mu is the position on the curve where $mu is in the
* range 0 $mu < 1 where 0 is tha start point and 1 is the end point. Note that every newly computed
* point depends on all the existing points
*
* @param $mu Position on the bezier curve
* @return array($x, $y)
*/
function GetPoint($mu) {
$n = $this->n - 1;
$k = 0;
$kn = 0;
$nn = 0;
$nkn = 0;
$blend = 0.0;
$newx = 0.0;
$newy = 0.0;
 
$muk = 1.0;
$munk = (double) pow(1-$mu,(double) $n);
 
for ($k = 0; $k <= $n; $k++) {
$nn = $n;
$kn = $k;
$nkn = $n - $k;
$blend = $muk * $munk;
$muk *= $mu;
$munk /= (1-$mu);
while ($nn >= 1) {
$blend *= $nn;
$nn--;
if ($kn > 1) {
$blend /= (double) $kn;
$kn--;
}
if ($nkn > 1) {
$blend /= (double) $nkn;
$nkn--;
}
}
$newx += $this->datax[$k] * $blend;
$newy += $this->datay[$k] * $blend;
}
 
return array($newx, $newy);
}
}
 
// EOF
?>
/tags/v1.1-andromede/composants/statistiques/Statistiques.php
New file
0,0 → 1,139
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class Statistiques {
 
const GRAPH_CAMEMBERT = 'pie';
const GRAPH_COURBE = 'courbe';
 
public function genererGraphique($type_graphique, $valeurs, $titre = '', $nom_axe_x = '', $nom_axe_y = '') {
 
// Inclusion de la librairie JpGraph
include_once("lib/jpgraph.php");
$graph = null;
 
switch($type_graphique) {
case Statistiques::GRAPH_CAMEMBERT:
$graph = $this->genererGraphiqueCamembert($valeurs, $titre);
break;
 
case Statistiques::GRAPH_COURBE:
$graph = $this->genererGraphiqueCourbe($valeurs, $titre, $nom_axe_x, $nom_axe_y);
break;
 
default:
$graph = $this->genererGraphiqueCourbe($valeurs);
break;
}
 
return $graph;
}
 
public function genererGraphiqueCamembert($valeurs, $titre) {
 
include_once("lib/jpgraph_pie.php");
$graph = new PieGraph(500,500);
 
$oPie = new PiePlot(array_values($valeurs));
$oPie->SetLegends(array_keys($valeurs));
 
// Ajouter le titre du graphique
$graph->title->Set($titre);
 
// position du graphique (légèrement à droite)
$oPie->SetCenter(0.4);
 
$oPie->SetValueType(PIE_VALUE_PER);
 
// Format des valeurs de type "entier"
$oPie->value->SetFormat('%d');
 
$graph->Add($oPie);
return $graph/*->Stroke(_IMG_HANDLER)*/;
}
 
public function genererGraphiqueCourbe($valeurs, $titre, $nom_axe_x, $nom_axe_y) {
 
include_once("lib/jpgraph_line.php");
 
// Création du conteneur
$graph = new Graph(500,500);
 
// Fixer les marges
$graph->img->SetMargin(40,30,50,40);
 
// Lissage sur fond blanc (évite la pixellisation)
$graph->img->SetAntiAliasing("white");
 
// A détailler
$graph->SetScale("textlin");
 
// Ajouter une ombre
$graph->SetShadow();
 
// Ajouter le titre du graphique
$graph->title->Set($titre);
 
// Afficher la grille de l'axe des ordonnées
$graph->ygrid->Show();
// Fixer la couleur de l'axe (bleu avec transparence : @0.7)
$graph->ygrid->SetColor('blue@0.7');
// Des tirets pour les lignes
$graph->ygrid->SetLineStyle('solid');
 
// Afficher la grille de l'axe des abscisses
$graph->xgrid->Show();
// Fixer la couleur de l'axe (rouge avec transparence : @0.7)
$graph->xgrid->SetColor('red@0.7');
// Des tirets pour les lignes
$graph->xgrid->SetLineStyle('solid');
 
// Créer une courbes
$courbe = new LinePlot(array_values($valeurs));
 
// Chaque point de la courbe ****
// Type de point
$courbe->mark->SetType(MARK_FILLEDCIRCLE);
// Couleur de remplissage
$courbe->mark->SetFillColor("green");
// Taille
$courbe->mark->SetWidth(5);
 
// Paramétrage des axes
$graph->xaxis->title->Set($nom_axe_x);
$graph->xaxis->SetTickLabels(array_keys($valeurs));
 
// Paramétrage des axes
$graph->yaxis->title->Set($nom_axe_y);
 
// Ajouter la courbe au conteneur
$graph->Add($courbe);
 
return $graph/*->Stroke(_IMG_HANDLER)*/;
}
 
public function combinerGraphiques($graph) {
 
include_once('lib/jpgraph_mgraph.php');
$mgraph = new MGraph(2000,2000);
$xpos1=3;$ypos1=3;
$xpos2=3;$ypos2=500;
$xpos3=3;$ypos3=1000;
$mgraph->Add($graph['pays'],$xpos1,$ypos1);
$mgraph->Add($graph['activite_bota'],$xpos2,$ypos2);
$mgraph->Add($graph['experience_bota'],$xpos3,$ypos3);
return $mgraph->Stroke(_IMG_HANDLER);
}
 
}
?>
/tags/v1.1-andromede/jrest/.htaccess
New file
0,0 → 1,4
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ /annuaire/jrest/index.php/
/tags/v1.1-andromede/jrest/jrest.ini.php
New file
0,0 → 1,35
;<?/*
[settings]
baseURL = "/annuaire/jrest/"
 
; Default
[appli]
phptype = mysql
username = aurelien
password = Canard
hostspec = localhost
database = tela_prod
 
; Identification
[database_ident]
phptype = mysql
username = aurelien
password = Canard
hostspec = localhost
database = tela_prod
annuaire = annuaire_tela
ann_id = U_MAIL
ann_pwd = U_PASSWD
pass_crypt_funct = md5
 
 
; LOGS
[log]
cheminlog = "/home/aurelien/Logs/"
timezone = "Europe/Paris"
taillemax = 100000
 
; ADMIN
[jrest_admin]
admin = aurelien@tela-botanica.org,david.delon@clapas.net,jpm@tela-botanica.org,marie@tela-botanica.org
;*/?>
/tags/v1.1-andromede/jrest/JRest.php
New file
0,0 → 1,302
<?php
// In : utf8 url_encoded (get et post)
// Out : utf8
 
// TODO : gerer les retours : dans ce controleur : code retour et envoi ...
class JRest {
 
/** Parsed configuration file */
private $config;
 
/** The HTTP request method used. */
private $method = 'GET';
 
/** The HTTP request data sent (if any). */
private $requestData = NULL;
 
/** Array of strings to convert into the HTTP response. */
private $output = array();
 
/** Nom resource. */
private $resource = NULL;
 
/** Identifiant unique resource. */
private $uid = NULL;
 
/**
* Constructor. Parses the configuration file "JRest.ini", grabs any request data sent, records the HTTP
* request method used and parses the request URL to find out the requested resource
* @param str iniFile Configuration file to use
*/
public function JRest($iniFile = 'jrest.ini.php') {
$this->config = parse_ini_file($iniFile, TRUE);
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && isset($_SERVER['QUERY_STRING'])) {
if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) {
$this->requestData = '';
$httpContent = fopen('php://input', 'r');
while ($data = fread($httpContent, 1024)) {
$this->requestData .= $data;
}
fclose($httpContent);
}
if (strlen($_SERVER['QUERY_STRING']) == 0) {
$len = strlen($_SERVER['REQUEST_URI']);
} else {
$len = -(strlen($_SERVER['QUERY_STRING']) + 1);
}
$urlString = substr($_SERVER['REQUEST_URI'], strlen($this->config['settings']['baseURL']), $len);
 
$urlParts = explode('/', $urlString);
 
if (isset($urlParts[0])) $this->resource = $urlParts[0];
if (count($urlParts) > 1 && $urlParts[1] != '') {
array_shift($urlParts);
foreach ($urlParts as $uid) {
if ($uid != '') {
$this->uid[] = urldecode($uid);
}
}
}
 
$this->method = $_SERVER['REQUEST_METHOD'];
} else {
trigger_error('I require the server variables REQUEST_URI, REQUEST_METHOD and QUERY_STRING to work.', E_USER_ERROR);
}
}
 
/**
* Execute the request.
*/
function exec() {
switch ($this->method) {
case 'GET':
$this->get();
break;
case 'POST':
$this->post();
break;
case 'DELETE':
$this->delete();
break;
case 'PUT':
$this->add();
break;
}
}
 
/**
* Execute a GET request. A GET request fetches a list of resource when no resource name is given, a list of element
* when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the
* database contents.
*/
private function get() {
if ($this->resource) {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if ($this->uid) { // get a resource element
if (method_exists($service, 'getElement')) {
$service->getElement($this->uid);
}
} elseif (method_exists($service, 'getRessource')) { // get all elements of a ressource
$service->getRessource();
}
}
}
} else { // get resources
// include set.jrest.php, instanticiation et appel
}
}
 
private function post() {
$pairs = array();
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST)
if ($this->requestData) {
$pairs = $this->parseRequestData();
}
 
// Ajout des informations concernant l'upload de fichier passées dans la variable $_FILE
if(isset($_FILES)) {
foreach ($_FILES as $v) {
$pairs[$v['name']] = $v;
}
 
// Ne pas effacer cette ligne ! Elle est indispensable pour les services du Carnet en ligne
// qui n'utilisent que le tableau pairs dans les posts
$pairs = array_merge($pairs, $_POST);
}
 
// gestion du contenu du post
if(isset($_POST))
{
// Safari ne sait pas envoyer des DELETE avec gwt...
// Nous utilisons le parametre "action" passé dans le POST qui doit contenir DELETE pour lancer la supression
if ($pairs['action'] == 'DELETE') {
$this->delete();
return;
}
 
if (count($pairs) != 0) {
if ($this->uid) { // get a resource element
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if (method_exists($service,'updateElement')) { // Update element
// TODO : a voir le retour ...
if ($service->updateElement($this->uid, $pairs)) {
$this->created();
}
}
}
}
} else { // get all elements of a ressource
$this->add($pairs);
}
} else {
$this->lengthRequired();
}
}
}
 
private function delete() {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if ($this->uid) { // get a resource element
if (method_exists($service, 'deleteElement')) { // Delete element
if ($service->deleteElement($this->uid)) {
$this->noContent();
}
}
}
}
}
}
 
private function add($pairs = null) {
if (is_null($pairs)) {
$pairs = array();
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST)
// FIXME : vérifier que l'on récupère bien les données passées par PUT
if ($this->requestData) {
$pairs = $this->parseRequestData();
}
}
 
if (count($pairs) != 0) {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if (method_exists($service,'createElement')) { // Create a new element
if ($service->createElement($pairs)) {
$this->created();
}
}
}
}
} else {
$this->lengthRequired();
}
}
 
/**
* Parse the HTTP request data.
* @return str[] Array of name value pairs
*/
private function parseRequestData() {
$values = array();
$pairs = explode('&', $this->requestData);
foreach ($pairs as $pair) {
$parts = explode('=', $pair);
if (isset($parts[0]) && isset($parts[1])) {
$parts[1] = rtrim(urldecode($parts[1]));
$values[$parts[0]] = $parts[1];
}
}
return $values;
}
 
/**
* Send a HTTP 201 response header.
*/
private function created($url = FALSE) {
header('HTTP/1.0 201 Created');
if ($url) {
header('Location: '.$url);
}
}
 
/**
* Send a HTTP 204 response header.
*/
private function noContent() {
header('HTTP/1.0 204 No Content');
}
 
/**
* Send a HTTP 400 response header.
*/
private function badRequest() {
header('HTTP/1.0 400 Bad Request');
}
 
/**
* Send a HTTP 401 response header.
*/
private function unauthorized($realm = 'JRest') {
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
header('WWW-Authenticate: Basic realm="'.$realm.'"');
}
header('HTTP/1.0 401 Unauthorized');
}
 
/**
* Send a HTTP 404 response header.
*/
private function notFound() {
header('HTTP/1.0 404 Not Found');
}
 
/**
* Send a HTTP 405 response header.
*/
private function methodNotAllowed($allowed = 'GET, HEAD') {
header('HTTP/1.0 405 Method Not Allowed');
header('Allow: '.$allowed);
}
 
/**
* Send a HTTP 406 response header.
*/
private function notAcceptable() {
header('HTTP/1.0 406 Not Acceptable');
echo join(', ', array_keys($this->config['renderers']));
}
 
/**
* Send a HTTP 411 response header.
*/
private function lengthRequired() {
header('HTTP/1.0 411 Length Required');
}
 
/**
* Send a HTTP 500 response header.
*/
private function internalServerError() {
header('HTTP/1.0 500 Internal Server Error');
}
}
?>
/tags/v1.1-andromede/jrest/index.php
New file
0,0 → 1,42
<?php
 
// Decommenter ces lignes si version de php < 5
//require_once 'lib/JSON.php';
 
// Lazy require
// TODO : voir si on ne peut pas dépacer ces inclusions directement dans les services.
//require_once 'lib/DBAccessor.php';
//require_once 'lib/SpreadsheetProductor.php';
//require_once 'lib/PDFProductor.php';
//require 'JRest.php';
 
/**
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code.
*
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
*
*@param string le nom de la classe appelée.
*@return void le fichier contenant la classe doit être inclu par la fonction.
*/
function __autoloadJRest($classe)
{
if (class_exists($classe)) {
return null;
}
 
$chemins = array('', 'services/', 'services/include/', 'lib/');
foreach ($chemins as $chemin) {
$chemin = $chemin.$classe.'.php';
if (file_exists($chemin)) {
require_once $chemin;
}
}
}
 
spl_autoload_register('__autoloadJRest');
 
require_once('../initialisation.php');
 
$jRest =& new JRest();
$jRest->exec();
?>
/tags/v1.1-andromede/jrest/util/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,40,47
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/util/images/pme-copy.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/pme-copy.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/pme-view.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/pme-view.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/alt/pme-copy.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/alt/pme-copy.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/alt/pme-view.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/alt/pme-view.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/alt/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,41,1
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/util/images/alt/pme-delete.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/alt/pme-delete.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/alt/pme-change.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/alt/pme-change.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/.directory
New file
0,0 → 1,2
[Dolphin]
Timestamp=2010,6,10,16,42,12
/tags/v1.1-andromede/jrest/util/images/pme-delete.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/pme-delete.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/images/pme-change.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/jrest/util/images/pme-change.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/jrest/util/cel_inventory.php
New file
0,0 → 1,252
<style type="text/css">
hr.pme-hr { border: 0px solid; padding: 0px; margin: 0px; border-top-width: 1px; height: 1px; }
table.pme-main { border: #004d9c 1px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; }
table.pme-navigation { border: #004d9c 0px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; }
th.pme-header { border: #004d9c 1px solid; padding: 4px; background: #add8e6; }
td.pme-key-0, td.pme-value-0, td.pme-help-0, td.pme-navigation-0, td.pme-cell-0,
td.pme-key-1, td.pme-value-1, td.pme-help-0, td.pme-navigation-1, td.pme-cell-1,
td.pme-sortinfo, td.pme-filter { border: #004d9c 1px solid; padding: 3px; }
td.pme-buttons { text-align: left; }
td.pme-message { text-align: center; }
td.pme-stats { text-align: right; }
</style><?php
 
/*
* IMPORTANT NOTE: This generated file contains only a subset of huge amount
* of options that can be used with phpMyEdit. To get information about all
* features offered by phpMyEdit, check official documentation. It is available
* online and also for download on phpMyEdit project management page:
*
* http://platon.sk/projects/main_page.php?project_id=5
*
* This file was generated by:
*
* phpMyEdit version: 5.6
* phpMyEdit.class.php core class: 1.188
* phpMyEditSetup.php script: 1.48
* generating setup script: 1.48
*/
 
// MySQL host name, user name, password, database, and table
$opts['hn'] = 'localhost';
$opts['un'] = 'root';
$opts['pw'] = '';
$opts['db'] = 'cel';
$opts['tb'] = 'cel_inventory';
 
// Name of field which is the unique key
$opts['key'] = 'id';
 
// Type of key field (int/real/string/date etc.)
$opts['key_type'] = 'int';
 
// Sorting field(s)
$opts['sort_field'] = array('id');
 
// Number of records to display on the screen
// Value of -1 lists all records in a table
$opts['inc'] = 15;
 
// Options you wish to give the users
// A - add, C - change, P - copy, V - view, D - delete,
// F - filter, I - initial sort suppressed
$opts['options'] = 'ACPVDF';
 
// Number of lines to display on multiple selection filters
$opts['multiple'] = '4';
 
// Navigation style: B - buttons (default), T - text links, G - graphic links
// Buttons position: U - up, D - down (default)
$opts['navigation'] = 'TB';
 
// Display special page elements
$opts['display'] = array(
'form' => true,
'query' => true,
'sort' => true,
'time' => true,
'tabs' => true
);
 
// Set default prefixes for variables
$opts['js']['prefix'] = 'PME_js_';
$opts['dhtml']['prefix'] = 'PME_dhtml_';
$opts['cgi']['prefix']['operation'] = 'PME_op_';
$opts['cgi']['prefix']['sys'] = 'PME_sys_';
$opts['cgi']['prefix']['data'] = 'PME_data_';
 
/* Get the user's default language and use it if possible or you can
specify particular one you want to use. Refer to official documentation
for list of available languages. */
$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
 
/* Table-level filter capability. If set, it is included in the WHERE clause
of any generated SELECT statement in SQL query. This gives you ability to
work only with subset of data from table.
 
$opts['filters'] = "column1 like '%11%' AND column2<17";
$opts['filters'] = "section_id = 9";
$opts['filters'] = "PMEtable0.sessions_count > 200";
*/
 
/* Field definitions
Fields will be displayed left to right on the screen in the order in which they
appear in generated list. Here are some most used field options documented.
 
['name'] is the title used for column headings, etc.;
['maxlen'] maximum length to display add/edit/search input boxes
['trimlen'] maximum length of string content to display in row listing
['width'] is an optional display width specification for the column
e.g. ['width'] = '100px';
['mask'] a string that is used by sprintf() to format field output
['sort'] true or false; means the users may sort the display on this column
['strip_tags'] true or false; whether to strip tags from content
['nowrap'] true or false; whether this field should get a NOWRAP
['select'] T - text, N - numeric, D - drop-down, M - multiple selection
['options'] optional parameter to control whether a field is displayed
L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view
Another flags are:
R - indicates that a field is read only
W - indicates that a field is a password field
H - indicates that a field is to be hidden and marked as hidden
['URL'] is used to make a field 'clickable' in the display
e.g.: 'mailto:$value', 'http://$value' or '$page?stuff';
['URLtarget'] HTML target link specification (for example: _blank)
['textarea']['rows'] and/or ['textarea']['cols']
specifies a textarea is to be used to give multi-line input
e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10
['values'] restricts user input to the specified constants,
e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99)
['values']['table'] and ['values']['column'] restricts user input
to the values found in the specified column of another table
['values']['description'] = 'desc_column'
The optional ['values']['description'] field allows the value(s) displayed
to the user to be different to those in the ['values']['column'] field.
This is useful for giving more meaning to column values. Multiple
descriptions fields are also possible. Check documentation for this.
*/
 
$opts['fdd']['id'] = array(
'name' => 'ID',
'select' => 'T',
'options' => 'AVCPDR', // auto increment
'maxlen' => 20,
'default' => '0',
'sort' => true
);
$opts['fdd']['identifiant'] = array(
'name' => 'Identifiant',
'select' => 'T',
'maxlen' => 128,
'sort' => true
);
$opts['fdd']['ordre'] = array(
'name' => 'Ordre',
'select' => 'T',
'maxlen' => 20,
'sort' => true
);
$opts['fdd']['nom_sel'] = array(
'name' => 'Nom sel',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['num_nom_sel'] = array(
'name' => 'Num nom sel',
'select' => 'T',
'maxlen' => 11,
'sort' => true
);
$opts['fdd']['nom_ret'] = array(
'name' => 'Nom ret',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['num_nom_ret'] = array(
'name' => 'Num nom ret',
'select' => 'T',
'maxlen' => 11,
'sort' => true
);
$opts['fdd']['num_taxon'] = array(
'name' => 'Num taxon',
'select' => 'T',
'maxlen' => 11,
'sort' => true
);
$opts['fdd']['famille'] = array(
'name' => 'Famille',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['location'] = array(
'name' => 'Location',
'select' => 'T',
'maxlen' => 50,
'sort' => true
);
$opts['fdd']['id_location'] = array(
'name' => 'ID location',
'select' => 'T',
'maxlen' => 10,
'sort' => true
);
$opts['fdd']['date_observation'] = array(
'name' => 'Date observation',
'select' => 'T',
'maxlen' => 19,
'sort' => true
);
$opts['fdd']['station'] = array(
'name' => 'Station',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['milieu'] = array(
'name' => 'Milieu',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['commentaire'] = array(
'name' => 'Commentaire',
'select' => 'T',
'maxlen' => 1024,
'sort' => true
);
$opts['fdd']['transmission'] = array(
'name' => 'Transmission',
'select' => 'T',
'maxlen' => 4,
'sort' => true
);
$opts['fdd']['date_creation'] = array(
'name' => 'Date creation',
'select' => 'T',
'maxlen' => 19,
'sort' => true
);
$opts['fdd']['date_modification'] = array(
'name' => 'Date modification',
'select' => 'T',
'maxlen' => 19,
'sort' => true
);
$opts['fdd']['date_transmission'] = array(
'name' => 'Date transmission',
'select' => 'T',
'maxlen' => 19,
'sort' => true
);
 
// Now important call to phpMyEdit
require_once 'phpMyEdit.class.php';
new phpMyEdit($opts);
 
?>
 
/tags/v1.1-andromede/jrest/util/phpMyEditSetup.php
New file
0,0 → 1,569
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* phpMyEditSetup.php - interactive table configuration utility (setup)
* ____________________________________________________________
*
* Copyright (c) 1999-2002 John McCreesh <jpmcc@users.sourceforge.net>
* Copyright (c) 2001-2002 Jim Kraai <jkraai@users.sourceforge.net>
* Versions 5.0 and higher developed by Ondrej Jombik <nepto@php.net>
* Copyright (c) 2002-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/phpMyEditSetup.php,v 1.48 2006-09-09 07:38:54 nepto Exp $ */
 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<title>phpMyEdit Setup</title>
<style type="text/css">
<!--
body { font-family: "Verdana", "Arial", "Sans-Serif"; text-align: left }
h1 { color: #004d9c; font-size: 13pt; font-weight: bold }
h2 { color: #004d9c; font-size: 11pt; font-weight: bold }
h3 { color: #004d9c; font-size: 11pt; }
p { color: #004d9c; font-size: 9pt; }
table { border: 1px solid #004d9c; border-collapse: collapse; border-spacing: 0px; }
td { border: 1px solid; padding: 3px; color: #004d9c; font-size: 9pt; }
hr
{
height: 1px;
background-color: #000000;
color: #000000;
border: solid #000000 0;
padding: 0;
margin: 0;
border-top-width: 1px;
}
-->
</style>
</head>
<body bgcolor="white">
 
<?php
 
if (! defined('PHP_EOL')) {
define('PHP_EOL', strtoupper(substr(PHP_OS, 0, 3) == 'WIN') ? "\r\n"
: strtoupper(substr(PHP_OS, 0, 3) == 'MAC') ? "\r" : "\n");
}
 
$hn = @$_POST['hn'];
$un = @$_POST['un'];
$pw = @$_POST['pw'];
if(strlen($_POST['db'])>0) $db = @$_POST['db'];
if(strlen($_POST['tb'])>0) $tb = @$_POST['tb'];
$id = @$_POST['id'];
$submit = @$_POST['submit'];
$options = @$_POST['options'];
$baseFilename = @$_POST['baseFilename'];
$pageTitle = @$_POST['pageTitle'];
$pageHeader = @$_POST['pageHeader'];
$HTMLissues = @$_POST['HTMLissues'];
$CSSstylesheet = @$_POST['CSSstylesheet'];
 
$phpExtension = '.php';
if (isset($baseFilename) && $baseFilename != '') {
$phpFile = $baseFilename.$phpExtension;
//$contentFile = $baseFilename.'Content.inc';
$contentFile = $baseFilename.'.php';
} elseif (isset($tb)) {
$phpFile = $tb.$phpExtension;
//$contentFile = $tb.'Content.inc';
$contentFile = $tb.'.php';
} else {
$phpFile = 'index'.$phpExtension;
//$contentFile = 'Content.inc';
$contentFile = 'phpMyEdit-content.php';
}
 
$buffer = '';
 
function echo_html($x)
{
echo htmlspecialchars($x),PHP_EOL;
}
 
function echo_buffer($x)
{
global $buffer;
$buffer .= $x.PHP_EOL;
}
 
#:#####################################:#
#:# Function: check_constraints #:#
#:# Parameters: tb=table name #:#
#:# fd=field name #:#
#:# return: lookup default for #:#
#:# said constraint #:#
#:# or null if no #:#
#:# constraint is found. #:#
#:# Contributed by Wade Ryan, #:#
#:# 20060906 #:#
#:#####################################:#
function check_constraints($tb,$fd)
{
$query = "show create table $tb";
$result = mysql_query($query);
$tableDef = preg_split('/\n/',mysql_result($result,0,1));
 
$constraint_arg="";
while (list($key,$val) = each($tableDef)) {
$words=preg_split("/[\s'`()]+/", $val);
if ($words[1] == "CONSTRAINT" && $words[6]=="REFERENCES") {
if ($words[5]==$fd) {
$constraint_arg=" 'values' => array(\n".
" 'table' => '$words[7]',\n".
" 'column' => '$words[8]'\n".
" ),\n";
}
 
}
}
return $constraint_arg;
}
 
function get_versions()
{
$ret_ar = array();
$dirname = dirname(__FILE__);
foreach (array(
'current' => __FILE__,
'setup' => "$dirname/phpMyEditSetup.php",
'core' => "$dirname/phpMyEdit.class.php",
'version' => "$dirname/doc/VERSION")
as $type => $file) {
if (@file_exists($file) && @is_readable($file)) {
if (($f = fopen($file, 'r')) == false) {
continue;
}
$str = trim(fread($f, 4096));
if (strpos($str, ' ') === false && strlen($str) < 10) {
$ret_ar[$type] = $str;
} else if (preg_match('|\$'.'Platon:\s+\S+,v\s+(\d+.\d+)\s+|', $str, $matches)) {
$ret_ar[$type] = $matches[1];
}
fclose($f);
}
}
return $ret_ar;
}
 
 
$self = basename($_SERVER['PHP_SELF']);
$dbl = @mysql_pconnect($hn, $un, $pw);
 
if ((!$dbl) or empty($submit)) {
echo '<h1>Please log in to your MySQL database</h1>';
if (!empty($submit)) {
echo '<h2>Sorry - login failed - please try again</h2>'.PHP_EOL;
}
if (! isset($hn)) {
$hn = 'localhost';
}
echo '
<form action="'.htmlspecialchars($self).'" method="POST">
<table border="1" cellpadding="1" cellspacing="0" summary="Login form">
<tr>
<td>Hostname:</td>
<td><input type="text" name="hn" value="'.htmlspecialchars($hn).'"></td>
</tr><tr>
<td>Username:</td>
<td><input type="text" name="un" value="'.htmlspecialchars($un).'"></td>
</tr><tr>
<td>Password:</td>
<td><input type="password" name="pw" value="'.htmlspecialchars($pw).'"></td>
</tr><tr>
<td>Database:</td>
<td><input type="text" name="db" value="'.htmlspecialchars($db).'"></td>
</tr><tr>
<td>Table:</td>
<td><input type="text" name="tb" value="'.htmlspecialchars($tb).'"></td>
</tr>
</table><br>
<input type="submit" name="submit" value="Submit">
</form>'.PHP_EOL;
} else if (! isset($db)) {
$dbs = @mysql_list_dbs($dbl);
$num_dbs = @mysql_num_rows($dbs);
echo '<h1>Please select a database</h1>
<form action="'.htmlspecialchars($self).'" method="POST">
<input type="hidden" name="hn" value="'.htmlspecialchars($hn).'">
<input type="hidden" name="un" value="'.htmlspecialchars($un).'">
<input type="hidden" name="pw" value="'.htmlspecialchars($pw).'">
<table border="1" cellpadding="1" cellspacing="1" summary="Database selection">'.PHP_EOL;
for ($i = 0; $i < $num_dbs; $i++) {
$db = @mysql_db_name($dbs, $i);
$checked = ! strcasecmp($un, $db) ? ' checked' : '';
$db = htmlspecialchars($db);
echo '<tr><td><input'.$checked.' type="radio" name="db" value="'.$db.'"></td><td>'.$db.'</td></tr>'.PHP_EOL;
}
echo '</table><br>
<input type="submit" name="submit" value="Submit">
<input type="submit" name="cancel" value="Cancel">
</form>'.PHP_EOL;
} else if (!isset($tb)) {
echo '<h1>Please select a table from database: '.htmlspecialchars($db).'</h1>
<form action="'.htmlspecialchars($self).'" method="POST">
<input type="hidden" name="hn" value="'.htmlspecialchars($hn).'">
<input type="hidden" name="un" value="'.htmlspecialchars($un).'">
<input type="hidden" name="pw" value="'.htmlspecialchars($pw).'">
<input type="hidden" name="db" value="'.htmlspecialchars($db).'">
<table border="1" cellpadding="1" cellspacing="1" summary="Table selection">'.PHP_EOL;
$tbs = @mysql_list_tables($db, $dbl);
$num_tbs = @mysql_num_rows($tbs);
for ($j = 0; $j < $num_tbs; $j++) {
$tb = @mysql_tablename($tbs, $j);
$tb = htmlspecialchars($tb);
$checked = $j == 0 ? ' checked' : '';
echo '<tr><td><input'.$checked.' type="radio" name="tb" value="'.$tb.'"></td><td>'.$tb.'</td></tr>'.PHP_EOL;
}
echo '</table><br>
<input type="submit" name="submit" value="Submit">
<input type="submit" name="cancel" value="Cancel">
</form>'.PHP_EOL;
} else if (!isset($id)) {
echo ' <h1>Please select an identifier from table: '.htmlspecialchars($tb).'</h1>
<p>
This field will be used in change, view, copy and delete operations.<br>
The field should be numeric and must uniquely identify a record.
</p>
<p>
Please note, that there were problems reported by phpMyEdit users
regarding using MySQL reserved word as unique key name (the example for
this is "key" name). Thus we recommend you to use another name
of unique key. Usage of "id" or "ID" should be safe and good idea.
</p>
<form action="'.htmlspecialchars($self).'" method="POST">
<input type="hidden" name="hn" value="'.htmlspecialchars($hn).'">
<input type="hidden" name="un" value="'.htmlspecialchars($un).'">
<input type="hidden" name="pw" value="'.htmlspecialchars($pw).'">
<input type="hidden" name="db" value="'.htmlspecialchars($db).'">
<input type="hidden" name="tb" value="'.htmlspecialchars($tb).'">
<table border="1" cellpadding="1" cellspacing="1" summary="Key selection">'.PHP_EOL;
// <tr><td><input type="radio" name="id" value="">
// <td><i>None</i></td><td><i>No id field required</i></td></tr>
@mysql_select_db($db);
$tb_desc = @mysql_query("DESCRIBE $tb");
$fds = @mysql_list_fields($db,$tb,$dbl);
for ($j = 0; ($fd = @mysql_field_name($fds, $j)) != false; $j++) {
$ff = @mysql_field_flags($fds, $j);
strlen($ff) <= 0 && $ff = '---';
$checked = stristr($ff, 'primary_key') ? ' checked' : '';
echo '<tr><td><input',$checked,' type="radio" name="id" value="',htmlspecialchars($fd),'"></td>';
echo '<td>',htmlspecialchars($fd),'</td>';
echo '<td>',htmlspecialchars($ff),'</td>';
$r = @mysql_fetch_array($tb_desc, $j);
}
echo '</table><br>
<input type="submit" name="submit" value="Submit">
<input type="submit" name="cancel" value="Cancel">
</form>'.PHP_EOL;
 
} else if (!isset($options)) {
echo '<h1>Please select additional options</h1>
<form action="'.htmlspecialchars($self).'" method="POST">
<input type="hidden" name="hn" value="'.htmlspecialchars($hn).'">
<input type="hidden" name="un" value="'.htmlspecialchars($un).'">
<input type="hidden" name="pw" value="'.htmlspecialchars($pw).'">
<input type="hidden" name="db" value="'.htmlspecialchars($db).'">
<input type="hidden" name="tb" value="'.htmlspecialchars($tb).'">
<input type="hidden" name="id" value="'.htmlspecialchars($id).'">
<table border="1" cellpadding="1" cellspacing="1" summary="Additional options">
<tr><td>Base filename</td><td><input type="text" name=baseFilename value ="'.htmlspecialchars($tb).'"></td></tr>
<tr><td>Page title</td><td><input type="text" name=pageTitle value ="'.htmlspecialchars($tb).'"></td></tr>
<tr><td>Page header</td><td><input type="checkbox" name=pageHeader></td></tr>
<tr><td>HTML header &amp; footer</td><td><input type="checkbox" name=HTMLissues></td></tr>
<tr><td>CSS basic stylesheet</td><td><input checked type="checkbox" name=CSSstylesheet></td></tr>
</table><br>
<input type="submit" name="submit" value="Submit">
<input type="submit" name="cancel" value="Cancel">
<input type="hidden" name="options" value="1">
</form>'.PHP_EOL;
} else {
echo '<h1>Here is your phpMyEdit calling program</h1>'.PHP_EOL;
echo '<h2>You may now copy and paste it into your PHP editor</h2>'.PHP_EOL;
if ($pageHeader) {
echo_buffer('<h3>'.$pageTitle.'</h3>');
}
$versions = '';
$versions_ar = get_versions();
foreach (array(
'version' => 'phpMyEdit version:',
'core' => 'phpMyEdit.class.php core class:',
'setup' => 'phpMyEditSetup.php script:',
'current' => 'generating setup script:')
as $type => $desc) {
$version = isset($versions_ar[$type]) ? $versions_ar[$type] : 'unknown';
$versions .= sprintf("\n * %36s %s", $desc, $version);
}
echo_buffer("<?php
 
/*
* IMPORTANT NOTE: This generated file contains only a subset of huge amount
* of options that can be used with phpMyEdit. To get information about all
* features offered by phpMyEdit, check official documentation. It is available
* online and also for download on phpMyEdit project management page:
*
* http://platon.sk/projects/main_page.php?project_id=5
*
* This file was generated by:
*$versions
*/
 
// MySQL host name, user name, password, database, and table
\$opts['hn'] = '$hn';
\$opts['un'] = '$un';
\$opts['pw'] = '$pw';
\$opts['db'] = '$db';
\$opts['tb'] = '$tb';
 
// Name of field which is the unique key
\$opts['key'] = '$id';
 
// Type of key field (int/real/string/date etc.)");
 
if ($id == '') {
echo_buffer("\$opts['key_type'] = '';");
} else {
$fds = @mysql_list_fields($db,$tb,$dbl);
for ($j = 0; ($fd = @mysql_field_name($fds, $j)) != ''; $j++) {
if ($fd == $id) {
echo_buffer("\$opts['key_type'] = '".@mysql_field_type($fds, $j)."';");
break;
}
}
}
echo_buffer("
// Sorting field(s)
\$opts['sort_field'] = array('$id');
 
// Number of records to display on the screen
// Value of -1 lists all records in a table
\$opts['inc'] = 15;
 
// Options you wish to give the users
// A - add, C - change, P - copy, V - view, D - delete,
// F - filter, I - initial sort suppressed
\$opts['options'] = 'ACPVDF';
 
// Number of lines to display on multiple selection filters
\$opts['multiple'] = '4';
 
// Navigation style: B - buttons (default), T - text links, G - graphic links
// Buttons position: U - up, D - down (default)
\$opts['navigation'] = 'DB';
 
// Display special page elements
\$opts['display'] = array(
'form' => true,
'query' => true,
'sort' => true,
'time' => true,
'tabs' => true
);
 
// Set default prefixes for variables
\$opts['js']['prefix'] = 'PME_js_';
\$opts['dhtml']['prefix'] = 'PME_dhtml_';
\$opts['cgi']['prefix']['operation'] = 'PME_op_';
\$opts['cgi']['prefix']['sys'] = 'PME_sys_';
\$opts['cgi']['prefix']['data'] = 'PME_data_';
 
/* Get the user's default language and use it if possible or you can
specify particular one you want to use. Refer to official documentation
for list of available languages. */
\$opts['language'] = \$_SERVER['HTTP_ACCEPT_LANGUAGE'];
 
/* Table-level filter capability. If set, it is included in the WHERE clause
of any generated SELECT statement in SQL query. This gives you ability to
work only with subset of data from table.
 
\$opts['filters'] = \"column1 like '%11%' AND column2<17\";
\$opts['filters'] = \"section_id = 9\";
\$opts['filters'] = \"PMEtable0.sessions_count > 200\";
*/
 
/* Field definitions
Fields will be displayed left to right on the screen in the order in which they
appear in generated list. Here are some most used field options documented.
 
['name'] is the title used for column headings, etc.;
['maxlen'] maximum length to display add/edit/search input boxes
['trimlen'] maximum length of string content to display in row listing
['width'] is an optional display width specification for the column
e.g. ['width'] = '100px';
['mask'] a string that is used by sprintf() to format field output
['sort'] true or false; means the users may sort the display on this column
['strip_tags'] true or false; whether to strip tags from content
['nowrap'] true or false; whether this field should get a NOWRAP
['select'] T - text, N - numeric, D - drop-down, M - multiple selection
['options'] optional parameter to control whether a field is displayed
L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view
Another flags are:
R - indicates that a field is read only
W - indicates that a field is a password field
H - indicates that a field is to be hidden and marked as hidden
['URL'] is used to make a field 'clickable' in the display
e.g.: 'mailto:\$value', 'http://\$value' or '\$page?stuff';
['URLtarget'] HTML target link specification (for example: _blank)
['textarea']['rows'] and/or ['textarea']['cols']
specifies a textarea is to be used to give multi-line input
e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10
['values'] restricts user input to the specified constants,
e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99)
['values']['table'] and ['values']['column'] restricts user input
to the values found in the specified column of another table
['values']['description'] = 'desc_column'
The optional ['values']['description'] field allows the value(s) displayed
to the user to be different to those in the ['values']['column'] field.
This is useful for giving more meaning to column values. Multiple
descriptions fields are also possible. Check documentation for this.
*/
");
 
@mysql_select_db($db);
$tb_desc = @mysql_query("DESCRIBE $tb");
$fds = @mysql_list_fields($db, $tb, $dbl);
$num_fds = @mysql_num_fields($fds);
$ts_cnt = 0;
for ($k = 0; $k < $num_fds; $k++) {
$fd = mysql_field_name($fds,$k);
$fm = mysql_fetch_field($fds,$k);
$fn = strtr($fd, '_-.', ' ');
$fn = preg_replace('/(^| +)id( +|$)/', '\\1ID\\2', $fn); // uppercase IDs
$fn = ucfirst($fn);
$row = @mysql_fetch_array($tb_desc);
echo_buffer('$opts[\'fdd\'][\''.$fd.'\'] = array('); // )
echo_buffer(" 'name' => '".str_replace('\'','\\\'',$fn)."',");
$auto_increment = strstr($row[5], 'auto_increment') ? 1 : 0;
if (substr($row[1],0,3) == 'set') {
echo_buffer(" 'select' => 'M',");
} else {
echo_buffer(" 'select' => 'T',");
}
if ($auto_increment) {
echo_buffer(" 'options' => 'AVCPDR', // auto increment");
}
// timestamps are read-only
else if (@mysql_field_type($fds, $k) == 'timestamp') {
if ($ts_cnt > 0) {
echo_buffer(" 'options' => 'AVCPD',");
} else { // first timestamp
echo_buffer(" 'options' => 'AVCPDR', // updated automatically (MySQL feature)");
}
$ts_cnt++;
}
echo_buffer(" 'maxlen' => ".@mysql_field_len($fds,$k).',');
// blobs -> textarea
if (@mysql_field_type($fds,$k) == 'blob') {
echo_buffer(" 'textarea' => array(");
echo_buffer(" 'rows' => 5,");
echo_buffer(" 'cols' => 50),");
}
// SETs and ENUMs get special treatment
if ((substr($row[1],0,3) == 'set' || substr($row[1],0,4) == 'enum')
&& ! (($pos = strpos($row[1], '(')) === false)) {
$indent = str_repeat(' ', 18);
$outstr = substr($row[1], $pos + 2, -2);
$outstr = explode("','", $outstr);
$outstr = str_replace("''", "'", $outstr);
$outstr = str_replace('"', '\\"', $outstr);
$outstr = implode('",'.PHP_EOL.$indent.'"', $outstr);
echo_buffer(" 'values' => array(".PHP_EOL.$indent.'"'.$outstr.'"),');
}
// automatic support for Default values
if ($row[4] != '' && $row[4] != 'NULL') {
echo_buffer(" 'default' => '".$row[4]."',");
} else if ($auto_increment) {
echo_buffer(" 'default' => '0',");
}
// check for table constraints
$outstr = check_constraints($tb, $fd);
if ($outstr != '') {
echo_buffer($outstr);
}
echo_buffer(" 'sort' => true");
//echo_buffer(" 'nowrap' => false,");
echo_buffer(');');
}
 
echo_buffer("
// Now important call to phpMyEdit
require_once 'phpMyEdit.class.php';
new phpMyEdit(\$opts);
 
?>
");
 
$css_directive = <<<END
<style type="text/css">
hr.pme-hr { border: 0px solid; padding: 0px; margin: 0px; border-top-width: 1px; height: 1px; }
table.pme-main { border: #004d9c 1px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; }
table.pme-navigation { border: #004d9c 0px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; }
th.pme-header { border: #004d9c 1px solid; padding: 4px; background: #add8e6; }
td.pme-key-0, td.pme-value-0, td.pme-help-0, td.pme-navigation-0, td.pme-cell-0,
td.pme-key-1, td.pme-value-1, td.pme-help-0, td.pme-navigation-1, td.pme-cell-1,
td.pme-sortinfo, td.pme-filter { border: #004d9c 1px solid; padding: 3px; }
td.pme-buttons { text-align: left; }
td.pme-message { text-align: center; }
td.pme-stats { text-align: right; }
</style>
END;
if (! $CSSstylesheet) {
$css_directive = '';
}
 
if ($HTMLissues) {
$buffer = <<<END
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>$pageTitle</title>
$css_directive
</head>
<body>
$buffer
</body>
</html>
END;
} else if ($CSSstylesheet) {
$buffer = $css_directive . $buffer;
}
// write the content include file
echo 'Trying to write content file to: <b>'.'./'.$contentFile.'</b><br>'.PHP_EOL;
$filehandle = @fopen('./'.$contentFile, 'w+');
if ($filehandle) {
fwrite($filehandle, $buffer);
flush($filehandle);
fclose($filehandle);
echo 'phpMyEdit content file written successfully<br>';
} else {
echo 'phpMyEdit content file was NOT written due to inssufficient privileges.<br>';
echo 'Please copy and paste content listed below to <i>'.'./'.$contentFile.'</i> file.';
}
echo '<br><hr>';
echo '<pre>';
echo_html($buffer);
echo '</pre><hr>'.PHP_EOL;
}
 
?>
 
</body>
</html>
 
/tags/v1.1-andromede/jrest/util/phpMyEdit.class.php
New file
0,0 → 1,3312
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* phpMyEdit.class.php - main table editor class definition file
* ____________________________________________________________
*
* Copyright (c) 1999-2002 John McCreesh <jpmcc@users.sourceforge.net>
* Copyright (c) 2001-2002 Jim Kraai <jkraai@users.sourceforge.net>
* Versions 5.0 and higher developed by Ondrej Jombik <nepto@php.net>
* Copyright (c) 2002-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/phpMyEdit.class.php,v 1.188 2006-09-08 16:30:31 michal Exp $ */
 
/* This is a generic table editing program. The table and fields to be
edited are defined in the calling program.
 
This program works in three passes.
* Pass 1 (the last part of the program) displays the selected MySQL
table in a scrolling table on the screen. Radio buttons are used to
select a record for editing or deletion. If the user chooses Add,
Change, Copy, View or Delete buttons.
* Pass 2 starts, displaying the selected record. If the user chooses
the Save button from this screen.
* Pass 3 processes the update and the display returns to the
original table view (Pass 1).
*/
 
class phpMyEdit_timer /* {{{ */
{
var $startTime;
var $started;
 
function phpMyEdit_timer($start = true)
{
$this->started = false;
if ($start) {
$this->start();
}
}
 
function start()
{
$startMtime = explode(' ', microtime());
$this->startTime = (double) $startMtime[0] + (double) $startMtime[1];
$this->started = true;
}
 
function end($iterations = 1)
{
// get the time, check whether the timer was started later
$endMtime = explode(' ', microtime());
if ($this->started) {
$endTime = (double)($endMtime[0])+(double)($endMtime[1]);
$dur = $endTime - $this->startTime;
$avg = 1000 * $dur / $iterations;
$avg = round(1000 * $avg) / 1000;
return $avg;
} else {
return 'phpMyEdit_timer ERROR: timer not started';
}
}
} /* }}} */
 
if (! function_exists('array_search')) { /* {{{ */
function array_search($needle, $haystack)
{
foreach ($haystack as $key => $value) {
if ($needle == $value)
return $key;
}
return false;
}
} /* }}} */
 
if (! function_exists('realpath')) { /* {{{ */
function realpath($path)
{
return $path;
}
} /* }}} */
 
class phpMyEdit
{
// Class variables {{{
 
// Database handling
var $hn; // hostname
var $un; // user name
var $pw; // password
var $tb; // table
var $db; // database
var $dbp; // database with point
var $dbh; // database handle
var $close_dbh; // if database handle should be closed
 
// Record manipulation
var $key; // name of field which is the unique key
var $key_num; // number of field which is the unique key
var $key_type; // type of key field (int/real/string/date etc.)
var $key_delim; // character used for key value quoting
var $rec; // number of record selected for editing
var $inc; // number of records to display
var $fm; // first record to display
var $fl; // is the filter row displayed (boolean)
var $fds; // sql field names
var $fdn; // sql field names => $k
var $num_fds; // number of fields
var $options; // options for users: ACDFVPI
var $fdd; // field definitions
var $qfn; // value of all filters used during the last pass
var $sfn; // sort field number (- = descending sort order)
var $cur_tab; // current selected tab
 
// Operation
var $navop; // navigation buttons/operations
var $sw; // filter display/hide/clear button
var $operation; // operation to do: Add, Change, Delete
var $saveadd;
var $moreadd;
var $canceladd;
var $savechange;
var $morechange;
var $cancelchange;
var $savecopy;
var $cancelcopy;
var $savedelete;
var $canceldelete;
var $cancelview;
 
// Additional features
var $labels; // multilingual labels
var $cgi; // CGI variable features array
var $js; // JS configuration array
var $dhtml; // DHTML configuration array
var $url; // URL array
var $message; // informational message to print
var $notify; // change notification e-mail adresses
var $logtable; // name of optional logtable
var $navigation; // navigation style
var $tabs; // TAB names
var $timer = null; // phpMyEdit_timer object
 
// Predefined variables
var $comp_ops = array('<'=>'<','<='=>'<=','='=>'=','>='=>'>=','>'=>'>');
var $sql_aggrs = array(
'sum' => 'Total',
'avg' => 'Average',
'min' => 'Minimum',
'max' => 'Maximum',
'count' => 'Count');
var $page_types = array(
'L' => 'list',
'F' => 'filter',
'A' => 'add',
'V' => 'view',
'C' => 'change',
'P' => 'copy',
'D' => 'delete'
);
var $default_buttons = array(
'L' => array('<<','<','add','view','change','copy','delete','>','>>','goto','goto_combo'),
'F' => array('<<','<','add','view','change','copy','delete','>','>>','goto','goto_combo'),
'A' => array('save','more','cancel'),
'C' => array('save','more','cancel'),
'P' => array('save', 'cancel'),
'D' => array('save','cancel'),
'V' => array('change','cancel')
);
// }}}
 
/*
* column specific functions
*/
 
function col_has_sql($k) { return isset($this->fdd[$k]['sql']); }
function col_has_sqlw($k) { return isset($this->fdd[$k]['sqlw']) && !$this->virtual($k); }
function col_has_values($k) { return isset($this->fdd[$k]['values']) || isset($this->fdd[$k]['values2']); }
function col_has_php($k) { return isset($this->fdd[$k]['php']); }
function col_has_URL($k) { return isset($this->fdd[$k]['URL'])
|| isset($this->fdd[$k]['URLprefix']) || isset($this->fdd[$k]['URLpostfix']); }
function col_has_multiple($k)
{ return $this->col_has_multiple_select($k) || $this->col_has_checkboxes($k); }
function col_has_multiple_select($k)
{ return $this->fdd[$k]['select'] == 'M' && ! $this->fdd[$k]['values']['table']; }
function col_has_checkboxes($k)
{ return $this->fdd[$k]['select'] == 'C' && ! $this->fdd[$k]['values']['table']; }
function col_has_radio_buttons($k)
{ return $this->fdd[$k]['select'] == 'O' && ! $this->fdd[$k]['values']['table']; }
function col_has_datemask($k)
{ return isset($this->fdd[$k]['datemask']) || isset($this->fdd[$k]['strftimemask']); }
 
/*
* functions for indicating whether navigation style is enabled
*/
 
function nav_buttons() { return stristr($this->navigation, 'B'); }
function nav_text_links() { return stristr($this->navigation, 'T'); }
function nav_graphic_links() { return stristr($this->navigation, 'G'); }
function nav_up() { return (stristr($this->navigation, 'U') && !($this->buttons[$this->page_type]['up'] === false)); }
function nav_down() { return (stristr($this->navigation, 'D') && !($this->buttons[$this->page_type]['down'] === false)); }
 
/*
* functions for indicating whether operations are enabled
*/
 
function add_enabled() { return stristr($this->options, 'A'); }
function change_enabled() { return stristr($this->options, 'C'); }
function delete_enabled() { return stristr($this->options, 'D'); }
function filter_enabled() { return stristr($this->options, 'F'); }
function view_enabled() { return stristr($this->options, 'V'); }
function copy_enabled() { return stristr($this->options, 'P') && $this->add_enabled(); }
function tabs_enabled() { return $this->display['tabs'] && count($this->tabs) > 0; }
function hidden($k) { return stristr($this->fdd[$k]['input'],'H'); }
function password($k) { return stristr($this->fdd[$k]['input'],'W'); }
function readonly($k) { return stristr($this->fdd[$k]['input'],'R') || $this->virtual($k); }
function virtual($k) { return stristr($this->fdd[$k]['input'],'V') && $this->col_has_sql($k); }
 
function add_operation() { return $this->operation == $this->labels['Add'] && $this->add_enabled(); }
function change_operation() { return $this->operation == $this->labels['Change'] && $this->change_enabled(); }
function copy_operation() { return $this->operation == $this->labels['Copy'] && $this->copy_enabled(); }
function delete_operation() { return $this->operation == $this->labels['Delete'] && $this->delete_enabled(); }
function view_operation() { return $this->operation == $this->labels['View'] && $this->view_enabled(); }
function filter_operation() { return $this->fl && $this->filter_enabled() && $this->list_operation(); }
function list_operation() { /* covers also filtering page */ return ! $this->change_operation()
&& ! $this->add_operation() && ! $this->copy_operation()
&& ! $this->delete_operation() && ! $this->view_operation(); }
function next_operation() { return ($this->navop == $this->labels['Next']) || ($this->navop == '>'); }
function prev_operation() { return ($this->navop == $this->labels['Prev']) || ($this->navop == '<'); }
function first_operation() { return ($this->navop == $this->labels['First']) || ($this->navop == '<<'); }
function last_operation() { return ($this->navop == $this->labels['Last']) || ($this->navop == '>>'); }
function clear_operation() { return $this->sw == $this->labels['Clear']; }
 
function add_canceled() { return $this->canceladd == $this->labels['Cancel']; }
function view_canceled() { return $this->cancelview == $this->labels['Cancel']; }
function change_canceled() { return $this->cancelchange == $this->labels['Cancel']; }
function copy_canceled() { return $this->cancelcopy == $this->labels['Cancel']; }
function delete_canceled() { return $this->canceldelete == $this->labels['Cancel']; }
 
function is_values2($k, $val = 'X') /* {{{ */
{
return $val === null ||
(isset($this->fdd[$k]['values2']) && !isset($this->fdd[$k]['values']['table']));
} /* }}} */
 
function processed($k) /* {{{ */
{
if ($this->virtual($k)) {
return false;
}
$options = @$this->fdd[$k]['options'];
if (! isset($options)) {
return true;
}
return
($this->saveadd == $this->labels['Save'] && stristr($options, 'A')) ||
($this->moreadd == $this->labels['More'] && stristr($options, 'A')) ||
($this->savechange == $this->labels['Save'] && stristr($options, 'C')) ||
($this->morechange == $this->labels['Apply'] && stristr($options, 'C')) ||
($this->savecopy == $this->labels['Save'] && stristr($options, 'P')) ||
($this->savedelete == $this->labels['Save'] && stristr($options, 'D'));
} /* }}} */
 
function displayed($k) /* {{{ */
{
if (is_numeric($k)) {
$k = $this->fds[$k];
}
$options = @$this->fdd[$k]['options'];
if (! isset($options)) {
return true;
}
return
($this->add_operation() && stristr($options, 'A')) ||
($this->view_operation() && stristr($options, 'V')) ||
($this->change_operation() && stristr($options, 'C')) ||
($this->copy_operation() && stristr($options, 'P')) ||
($this->delete_operation() && stristr($options, 'D')) ||
($this->filter_operation() && stristr($options, 'F')) ||
($this->list_operation() && stristr($options, 'L'));
} /* }}} */
function debug_var($name, $val) /* {{{ */
{
if (is_array($val) || is_object($val)) {
echo "<pre>$name\n";
ob_start();
//print_r($val);
var_dump($val);
$content = ob_get_contents();
ob_end_clean();
echo htmlspecialchars($content);
echo "</pre>\n";
} else {
echo 'debug_var()::<i>',htmlspecialchars($name),'</i>';
echo '::<b>',htmlspecialchars($val),'</b>::',"<br />\n";
}
} /* }}} */
 
function myquery($qry, $line = 0, $debug = 0) /* {{{ */
{
global $debug_query;
if ($debug_query || $debug) {
$line = intval($line);
echo '<h4>MySQL query at line ',$line,'</h4>',htmlspecialchars($qry),'<hr />',"\n";
}
if (isset($this->db)) {
$ret = @mysql_db_query($this->db, $qry, $this->dbh);
} else {
$ret = @mysql_query($qry, $this->dbh);
}
if (! $ret) {
echo '<h4>MySQL error ',mysql_errno($this->dbh),'</h4>';
echo htmlspecialchars(mysql_error($this->dbh)),'<hr />',"\n";
}
return $ret;
} /* }}} */
 
function make_language_labels($language) /* {{{ */
{
// just try the first language and variant
// this isn't content-negotiation rfc compliant
$language = strtoupper($language);
 
// try the full language w/ variant
$file = $this->dir['lang'].'PME.lang.'.$language.'.inc';
 
if (! file_exists($file)) {
// try the language w/o variant
$file = $this->dir['lang'].'PME.lang.'.substr($language,0,2).'.inc';
}
if (! file_exists($file)) {
// default to classical English
$file = $this->dir['lang'].'PME.lang.EN.inc';
}
$ret = @include($file);
if (! is_array($ret)) {
return $ret;
}
$small = array(
'Search' => 'v',
'Hide' => '^',
'Clear' => 'X',
'Query' => htmlspecialchars('>'));
if ((!$this->nav_text_links() && !$this->nav_graphic_links())
|| !isset($ret['Search']) || !isset($ret['Query'])
|| !isset($ret['Hide']) || !isset($ret['Clear'])) {
foreach ($small as $key => $val) {
$ret[$key] = $val;
}
}
return $ret;
} /* }}} */
 
function set_values($field_num, $prepend = null, $append = null, $strict = false) /* {{{ */
{
return (array) $prepend + (array) $this->fdd[$field_num]['values2']
+ (isset($this->fdd[$field_num]['values']['table']) || $strict
? $this->set_values_from_table($field_num, $strict)
: array())
+ (array) $append;
} /* }}} */
 
function set_values_from_table($field_num, $strict = false) /* {{{ */
{
$db = &$this->fdd[$field_num]['values']['db'];
$table = &$this->fdd[$field_num]['values']['table'];
$key = &$this->fdd[$field_num]['values']['column'];
$desc = &$this->fdd[$field_num]['values']['description'];
$dbp = isset($db) ? "$db." : $this->dbp;
$qparts['type'] = 'select';
if ($table) {
$qparts['select'] = 'DISTINCT '.$table.'.'.$key;
if ($desc && is_array($desc) && is_array($desc['columns'])) {
$qparts['select'] .= ',CONCAT('; // )
$num_cols = sizeof($desc['columns']);
if (isset($desc['divs'][-1])) {
$qparts['select'] .= '"'.addslashes($desc['divs'][-1]).'",';
}
foreach ($desc['columns'] as $key => $val) {
if ($val) {
$qparts['select'] .= 'IFNULL('.$val.',"")';
if ($desc['divs'][$key]) {
$qparts['select'] .= ',"'.addslashes($desc['divs'][$key]).'"';
}
$qparts['select'] .= ',';
}
}
$qparts['select']{strlen($qparts['select']) - 1} = ')';
$qparts['select'] .= ' AS PMEalias'.$field_num;
$qparts['orderby'] = 'PMEalias'.$field_num;
} else if ($desc && is_array($desc)) {
// TODO
} else if ($desc) {
$qparts['select'] .= ','.$table.'.'.$desc;
$qparts['orderby'] = $desc;
} else if ($key) {
$qparts['orderby'] = $key;
}
$qparts['from'] = "$dbp$table";
$ar = array(
'table' => $table,
'column' => $column,
'description' => $desc);
$qparts['where'] = $this->substituteVars($this->fdd[$field_num]['values']['filters'], $ar);
if ($this->fdd[$field_num]['values']['orderby']) {
$qparts['orderby'] = $this->substituteVars($this->fdd[$field_num]['values']['orderby'], $ar);
}
} else { /* simple value extraction */
$key = &$this->fds[$field_num];
$this->virtual($field_num) && $key = $this->fqn($field_num);
$qparts['select'] = 'DISTINCT '.$key.' AS PMEkey';
$qparts['orderby'] = 'PMEkey';
$qparts['from'] = $this->dbp.$this->tb;
}
$values = array();
$res = $this->myquery($this->get_SQL_query($qparts), __LINE__);
while ($row = @mysql_fetch_array($res, MYSQL_NUM)) {
$values[$row[0]] = $desc ? $row[1] : $row[0];
}
return $values;
} /* }}} */
 
function fqn($field, $dont_desc = false, $dont_cols = false) /* {{{ */
{
is_numeric($field) || $field = array_search($field, $this->fds);
// if read SQL expression exists use it
if ($this->col_has_sql($field))
return $this->fdd[$field]['sql'];
// on copy/change always use simple key retrieving
if ($this->add_operation()
|| $this->copy_operation()
|| $this->change_operation()) {
$ret = 'PMEtable0.'.$this->fds[$field];
} else {
if ($this->fdd[$this->fds[$field]]['values']['description'] && ! $dont_desc) {
$desc = &$this->fdd[$this->fds[$field]]['values']['description'];
if (is_array($desc) && is_array($desc['columns'])) {
$ret = 'CONCAT('; // )
$num_cols = sizeof($desc['columns']);
if (isset($desc['divs'][-1])) {
$ret .= '"'.addslashes($desc['divs'][-1]).'",';
}
foreach ($desc['columns'] as $key => $val) {
if ($val) {
$ret .= 'PMEjoin'.$field.'.'.$val;
if ($desc['divs'][$key]) {
$ret .= ',"'.addslashes($desc['divs'][$key]).'"';
}
$ret .= ',';
}
}
$ret{strlen($ret) - 1} = ')';
} else if (is_array($desc)) {
// TODO
} else {
$ret = 'PMEjoin'.$field.'.'.$this->fdd[$this->fds[$field]]['values']['description'];
}
// TODO: remove me
} elseif (0 && $this->fdd[$this->fds[$field]]['values']['column'] && ! $dont_cols) {
$ret = 'PMEjoin'.$field.'.'.$this->fdd[$this->fds[$field]]['values']['column'];
} else {
$ret = 'PMEtable0.'.$this->fds[$field];
}
// TODO: not neccessary, remove me!
if (is_array($this->fdd[$this->fds[$field]]['values2'])) {
}
}
return $ret;
} /* }}} */
 
function get_SQL_query($parts) /* {{{ */
{
foreach ($parts as $k => $v) {
$parts[$k] = trim($parts[$k]);
}
switch ($parts['type']) {
case 'select':
$ret = 'SELECT ';
if ($parts['DISTINCT'])
$ret .= 'DISTINCT ';
$ret .= $parts['select'];
$ret .= ' FROM '.$parts['from'];
if ($parts['where'] != '')
$ret .= ' WHERE '.$parts['where'];
if ($parts['groupby'] != '')
$ret .= ' GROUP BY '.$parts['groupby'];
if ($parts['having'] != '')
$ret .= ' HAVING '.$parts['having'];
if ($parts['orderby'] != '')
$ret .= ' ORDER BY '.$parts['orderby'];
if ($parts['limit'] != '')
$ret .= ' LIMIT '.$parts['limit'];
if ($parts['procedure'] != '')
$ret .= ' PROCEDURE '.$parts['procedure'];
break;
case 'update':
$ret = 'UPDATE '.$parts['table'];
$ret .= ' SET '.$parts['fields'];
if ($parts['where'] != '')
$ret .= ' WHERE '.$parts['where'];
break;
case 'insert':
$ret = 'INSERT INTO '.$parts['table'];
$ret .= ' VALUES '.$parts['values'];
break;
case 'delete':
$ret = 'DELETE FROM '.$parts['table'];
if ($parts['where'] != '')
$ret .= ' WHERE '.$parts['where'];
break;
default:
die('unknown query type');
break;
}
return $ret;
} /* }}} */
 
function get_SQL_column_list() /* {{{ */
{
$fields = array();
for ($k = 0; $k < $this->num_fds; $k++) {
if (! $this->displayed[$k] && $k != $this->key_num) {
continue;
}
$fields[] = $this->fqn($k).' AS qf'.$k;
if ($this->col_has_values($k)) {
$fields[] = $this->fqn($k, true, true).' AS qf'.$k.'_idx';
}
if ($this->col_has_datemask($k)) {
$fields[] = 'UNIX_TIMESTAMP('.$this->fqn($k).') AS qf'.$k.'_timestamp';
}
}
return join(',', $fields);
} /* }}} */
 
function get_SQL_join_clause() /* {{{ */
{
$main_table = 'PMEtable0';
$join_clause = $this->tb." AS $main_table";
for ($k = 0, $numfds = sizeof($this->fds); $k < $numfds; $k++) {
$main_column = $this->fds[$k];
if($this->fdd[$main_column]['values']['db']) {
$dbp = $this->fdd[$main_column]['values']['db'].'.';
} else {
$dbp = $this->dbp;
}
$table = @$this->fdd[$main_column]['values']['table'];
$join_column = @$this->fdd[$main_column]['values']['column'];
$join_desc = @$this->fdd[$main_column]['values']['description'];
if ($join_desc != '' && $join_column != '') {
$join_table = 'PMEjoin'.$k;
$ar = array(
'main_table' => $main_table,
'main_column' => $main_column,
'join_table' => $join_table,
'join_column' => $join_column,
'join_description' => $join_desc);
$join_clause .= " LEFT OUTER JOIN $dbp$table AS $join_table ON (";
$join_clause .= isset($this->fdd[$main_column]['values']['join'])
? $this->substituteVars($this->fdd[$main_column]['values']['join'], $ar)
: "$join_table.$join_column = $main_table.$main_column";
if (isset($this->fdd[$main_column]['values']['filters'])) {
$join_clause .= ' AND ';
$join_clause .= $this->substituteVars($this->fdd[$main_column]['values']['filters'], $ar);
}
$join_clause .= ')';
}
}
return $join_clause;
} /* }}} */
 
function get_SQL_where_from_query_opts($qp = null, $text = 0) /* {{{ */
{
if ($qp == null) {
$qp = $this->query_opts;
}
$where = array();
foreach ($qp as $field => $ov) {
if (is_numeric($field)) {
$tmp_where = array();
foreach ($ov as $field2 => $ov2) {
$tmp_where[] = sprintf('%s %s %s', $field2, $ov2['oper'], $ov2['value']);
}
$where[] = '('.join(' OR ', $tmp_where).')';
} else {
if (is_array($ov['value'])) {
$tmp_ov_val = '';
foreach ($ov['value'] as $ov_val) {
strlen($tmp_ov_val) > 0 && $tmp_ov_val .= ' OR ';
$tmp_ov_val .= sprintf('FIND_IN_SET("%s",%s)', $ov_val, $field);
}
$where[] = "($tmp_ov_val)";
} else {
$where[] = sprintf('%s %s %s', $field, $ov['oper'], $ov['value']);
}
}
}
// Add any coder specified filters
if (! $text && $this->filters) {
$where[] = '('.$this->filters.')';
}
if (count($where) > 0) {
if ($text) {
return str_replace('%', '*', join(' AND ',$where));
} else {
return join(' AND ',$where);
}
}
return ''; /* empty string */
} /* }}} */
 
function gather_query_opts() /* {{{ */
{
$this->query_opts = array();
$this->prev_qfn = $this->qfn;
$this->qfn = '';
if ($this->clear_operation()) {
return;
}
// gathers query options into an array, $this->query_opts
$qo = array();
for ($k = 0; $k < $this->num_fds; $k++) {
$l = 'qf'.$k;
$lc = 'qf'.$k.'_comp';
$li = 'qf'.$k.'_id';
$m = $this->get_sys_cgi_var($l);
$mc = $this->get_sys_cgi_var($lc);
$mi = $this->get_sys_cgi_var($li);
if (! isset($m) && ! isset($mi)) {
continue;
}
if (is_array($m) || is_array($mi)) {
if (is_array($mi)) {
$m = $mi;
$l = $li;
}
if (in_array('*', $m)) {
continue;
}
if ($this->col_has_values($k) && $this->col_has_multiple($k)) {
foreach (array_keys($m) as $key) {
$m[$key] = addslashes($m[$key]);
}
$qo[$this->fqn($k)] = array('value' => $m);
} else {
$qf_op = '';
foreach (array_keys($m) as $key) {
if ($qf_op == '') {
$qf_op = 'IN';
$qf_val = '"'.addslashes($m[$key]).'"';
$afilter = ' IN ("'.addslashes($m[$key]).'"'; // )
} else {
$afilter = $afilter.',"'.addslashes($m[$key]).'"';
$qf_val .= ',"'.addslashes($m[$key]).'"';
}
$this->qfn .= '&'.$this->cgi['prefix']['sys'].$l.'['.rawurlencode($key).']='.rawurlencode($m[$key]);
}
$afilter = $afilter.')';
// XXX: $dont_desc and $dont_cols hack
$dont_desc = isset($this->fdd[$k]['values']['description']);
$dont_cols = isset($this->fdd[$k]['values']['column']);
$qo[$this->fqn($k, $dont_desc, $dont_cols)] =
array('oper' => $qf_op, 'value' => "($qf_val)"); // )
}
} else if (isset($mi)) {
if ($mi == '*') {
continue;
}
if ($this->fdd[$k]['select'] != 'M' && $this->fdd[$k]['select'] != 'D' && $mi == '') {
continue;
}
$afilter = addslashes($mi);
$qo[$this->fqn($k, true, true)] = array('oper' => '=', 'value' => "'$afilter'");
$this->qfn .= '&'.$this->cgi['prefix']['sys'].$li.'='.rawurlencode($mi);
} else if (isset($m)) {
if ($m == '*') {
continue;
}
if ($this->fdd[$k]['select'] != 'M' && $this->fdd[$k]['select'] != 'D' && $m == '') {
continue;
}
$afilter = addslashes($m);
if ($this->fdd[$k]['select'] == 'N') {
$mc = in_array($mc, $this->comp_ops) ? $mc : '=';
$qo[$this->fqn($k)] = array('oper' => $mc, 'value' => "'$afilter'");
$this->qfn .= '&'.$this->cgi['prefix']['sys'].$l .'='.rawurlencode($m);
$this->qfn .= '&'.$this->cgi['prefix']['sys'].$lc.'='.rawurlencode($mc);
} else {
$afilter = '%'.str_replace('*', '%', $afilter).'%';
$ids = array();
$ar = array();
$ar[$this->fqn($k)] = array('oper' => 'LIKE', 'value' => "'$afilter'");
if (is_array($this->fdd[$k]['values2'])) {
foreach ($this->fdd[$k]['values2'] as $key => $val) {
if (strlen($m) > 0 && stristr($val, $m)) {
$ids[] = '"'.addslashes($key).'"';
}
}
if (count($ids) > 0) {
$ar[$this->fqn($k, true, true)]
= array('oper' => 'IN', 'value' => '('.join(',', $ids).')');
}
}
$qo[] = $ar;
$this->qfn .= '&'.$this->cgi['prefix']['sys'].$l.'='.rawurlencode($m);
}
}
}
$this->query_opts = $qo;
} /* }}} */
 
/*
* Create JavaScripts
*/
 
function form_begin() /* {{{ */
{
$page_name = htmlspecialchars($this->page_name);
if ($this->add_operation() || $this->change_operation() || $this->copy_operation()
|| $this->view_operation() || $this->delete_operation()) {
$field_to_tab = array();
for ($tab = $k = $this->cur_tab = 0; $k < $this->num_fds; $k++) {
if (isset($this->fdd[$k]['tab'])) {
if ($tab == 0 && $k > 0) {
$this->tabs[0] = 'PMEtab0';
$this->cur_tab = 1;
$tab++;
}
if (is_array($this->fdd[$k]['tab'])) {
$this->tabs[$tab] = @$this->fdd[$k]['tab']['name'];
$this->fdd[$k]['tab']['default'] && $this->cur_tab = $tab;
} else {
$this->tabs[$tab] = @$this->fdd[$k]['tab'];
}
$tab++;
}
$field_to_tab[$k] = max(0, $tab - 1);
}
if (preg_match('/^'.$this->dhtml['prefix'].'tab(\d+)$/', $this->get_sys_cgi_var('cur_tab'), $parts)) {
$this->cur_tab = $parts[1];
}
if ($this->tabs_enabled()) {
// initial TAB styles
echo '<style type="text/css" media="screen">',"\n";
for ($i = 0; $i < count($this->tabs); $i++) {
echo ' #'.$this->dhtml['prefix'].'tab',$i,' { display: ';
echo (($i == $this->cur_tab || $this->tabs[$i] == 'PMEtab0' ) ? 'block' : 'none') ,'; }',"\n";
}
echo '</style>',"\n";
// TAB javascripts
echo '<script type="text/javascript"><!--',"\n\n";
$css_class_name1 = $this->getCSSclass('tab', $position);
$css_class_name2 = $this->getCSSclass('tab-selected', $position);
echo 'var '.$this->js['prefix'].'cur_tab = "'.$this->dhtml['prefix'].'tab',$this->cur_tab,'";
 
function '.$this->js['prefix'].'show_tab(tab_name)
{';
if ($this->nav_up()) {
echo '
document.getElementById('.$this->js['prefix'].'cur_tab+"_up_label").className = "',$css_class_name1,'";
document.getElementById('.$this->js['prefix'].'cur_tab+"_up_link").className = "',$css_class_name1,'";
document.getElementById(tab_name+"_up_label").className = "',$css_class_name2,'";
document.getElementById(tab_name+"_up_link").className = "',$css_class_name2,'";';
}
if ($this->nav_down()) {
echo '
document.getElementById('.$this->js['prefix'].'cur_tab+"_down_label").className = "',$css_class_name1,'";
document.getElementById('.$this->js['prefix'].'cur_tab+"_down_link").className = "',$css_class_name1,'";
document.getElementById(tab_name+"_down_label").className = "',$css_class_name2,'";
document.getElementById(tab_name+"_down_link").className = "',$css_class_name2,'";';
}
echo '
document.getElementById('.$this->js['prefix'].'cur_tab).style.display = "none";
document.getElementById(tab_name).style.display = "block";
'.$this->js['prefix'].'cur_tab = tab_name;
document.'.$this->cgi['prefix']['sys'].'form.'.$this->cgi['prefix']['sys'].'cur_tab.value = tab_name;
}',"\n\n";
echo '// --></script>', "\n";
}
}
 
if ($this->add_operation() || $this->change_operation() || $this->copy_operation()) {
$first_required = true;
for ($k = 0; $k < $this->num_fds; $k++) {
if ($this->displayed[$k] && ! $this->readonly($k) && ! $this->hidden($k)
&& ($this->fdd[$k]['js']['required'] || isset($this->fdd[$k]['js']['regexp']))) {
if ($first_required) {
$first_required = false;
echo '<script type="text/javascript"><!--',"\n";
echo '
function '.$this->js['prefix'].'trim(str)
{
while (str.substring(0, 1) == " "
|| str.substring(0, 1) == "\\n"
|| str.substring(0, 1) == "\\r")
{
str = str.substring(1, str.length);
}
while (str.substring(str.length - 1, str.length) == " "
|| str.substring(str.length - 1, str.length) == "\\n"
|| str.substring(str.length - 1, str.length) == "\\r")
{
str = str.substring(0, str.length - 1);
}
return str;
}
 
function '.$this->js['prefix'].'form_control(theForm)
{',"\n";
}
if ($this->col_has_values($k)) {
$condition = 'theForm.'.$this->cgi['prefix']['data'].$this->fds[$k].'.selectedIndex == -1';
$multiple = $this->col_has_multiple_select($k);
} else {
$condition = '';
$multiple = false;
if ($this->fdd[$k]['js']['required']) {
$condition = $this->js['prefix'].'trim(theForm.'.$this->cgi['prefix']['data'].$this->fds[$k].'.value) == ""';
}
if (isset($this->fdd[$k]['js']['regexp'])) {
$condition .= (strlen($condition) > 0 ? ' || ' : '');
$condition .= sprintf('!(%s.test('.$this->js['prefix'].'trim(theForm.%s.value)))',
$this->fdd[$k]['js']['regexp'], $this->cgi['prefix']['data'].$this->fds[$k]);
}
}
 
/* Multiple selects have their name like ``name[]''.
It is not possible to work with them directly, because
theForm.name[].something will result into JavaScript
syntax error. Following search algorithm is provided
as a workaround for this.
*/
if ($multiple) {
echo '
multiple_select = null;
for (i = 0; i < theForm.length; i++) {
if (theForm.elements[i].name == "',$this->cgi['prefix']['data'].$this->fds[$k],'[]") {
multiple_select = theForm.elements[i];
break;
}
}
if (multiple_select != null && multiple_select.selectedIndex == -1) {';
} else {
echo '
if (',$condition,') {';
}
echo '
alert("';
if (isset($this->fdd[$k]['js']['hint'])) {
echo htmlspecialchars($this->fdd[$k]['js']['hint']);
} else {
echo $this->labels['Please enter'],' ',$this->fdd[$k]['name'],'.';
}
echo '");';
if ($this->tabs_enabled() && $field_to_tab[$k] >= $this->cur_tab) {
echo '
'.$this->js['prefix'].'show_tab("'.$this->dhtml['prefix'].'tab',$field_to_tab[$k],'");';
}
echo '
theForm.',$this->cgi['prefix']['data'].$this->fds[$k],'.focus();
return false;
}',"\n";
}
}
if (! $first_required) {
echo '
return true;
}',"\n\n";
echo '// --></script>', "\n";
}
}
 
if ($this->filter_operation()) {
echo '<script type="text/javascript"><!--',"\n";
echo '
function '.$this->js['prefix'].'filter_handler(theForm, theEvent)
{
var pressed_key = null;
if (theEvent.which) {
pressed_key = theEvent.which;
} else {
pressed_key = theEvent.keyCode;
}
if (pressed_key == 13) { // enter pressed
theForm.submit();
return false;
}
return true;
}',"\n\n";
echo '// --></script>', "\n";
}
 
if ($this->display['form']) {
echo '<form class="',$this->getCSSclass('form'),'" method="post"';
echo ' action="',$page_name,'" name="'.$this->cgi['prefix']['sys'].'form">',"\n";
}
return true;
} /* }}} */
 
function form_end() /* {{{ */
{
if ($this->display['form']) {
echo '</form>',"\n";
}
} /* }}} */
 
function display_tab_labels($position) /* {{{ */
{
if (! is_array($this->tabs)) {
return false;
}
echo '<table summary="labels" class="',$this->getCSSclass('tab', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('tab', $position),'">',"\n";
for ($i = ($this->tabs[0] == 'PMEtab0' ? 1 : 0); $i < count($this->tabs); $i++) {
$css_class_name = $this->getCSSclass($i != $this->cur_tab ? 'tab' : 'tab-selected', $position);
echo '<td class="',$css_class_name,'" id="'.$this->dhtml['prefix'].'tab',$i,'_',$position,'_label">';
echo '<a class="',$css_class_name,'" id="'.$this->dhtml['prefix'].'tab',$i,'_',$position,'_link';
echo '" href="javascript:'.$this->js['prefix'].'show_tab(\''.$this->dhtml['prefix'].'tab',$i,'\')">';
echo $this->tabs[$i],'</a></td>',"\n";
}
echo '<td class="',$this->getCSSclass('tab-end', $position),'">&nbsp;</td>',"\n";
echo '</tr>',"\n";
echo '</table>',"\n";
} /* }}} */
 
/*
* Display functions
*/
 
function display_add_record() /* {{{ */
{
for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) {
if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) {
$tab++;
echo '</table>',"\n";
echo '</div>',"\n";
echo '<div id="'.$this->dhtml['prefix'].'tab',$tab,'">',"\n";
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
}
if (! $this->displayed[$k]) {
continue;
}
if ($this->hidden($k)) {
echo $this->htmlHiddenData($this->fds[$k], $this->fdd[$k]['default']);
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix);
$escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true;
echo '<tr class="',$this->getCSSclass('row', null, true, $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$k]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$selected = @$this->fdd[$k]['default'];
$multiple = $this->col_has_multiple($k);
$readonly = $this->readonly($k);
$strip_tags = true;
//$escape = true;
if ($this->col_has_checkboxes($k) || $this->col_has_radio_buttons($k)) {
echo $this->htmlRadioCheck($this->cgi['prefix']['data'].$this->fds[$k],
$css_class_name, $vals, $selected, $multiple, $readonly,
$strip_tags, $escape);
} else {
echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k],
$css_class_name, $vals, $selected, $multiple, $readonly,
$strip_tags, $escape);
}
} elseif (isset ($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled="disabled"' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>';
if($escape) echo htmlspecialchars($this->fdd[$k]['default']);
else echo $this->fdd[$k]['default'];
echo '</textarea>',"\n";
} elseif ($this->col_has_php($k)) {
echo include($this->fdd[$k]['php']);
} else {
// Simple edit box required
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" ';
echo ($this->password($k) ? 'type="password"' : 'type="text"');
echo ($this->readonly($k) ? ' disabled="disabled"' : '');
echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo $size_ml_props,' value="';
if($escape) echo htmlspecialchars($this->fdd[$k]['default']);
else echo $this->fdd[$k]['default'];
echo '" />';
}
echo '</td>',"\n";
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
}
} /* }}} */
 
function display_copy_change_delete_record() /* {{{ */
{
/*
* For delete or change: SQL SELECT to retrieve the selected record
*/
 
$qparts['type'] = 'select';
$qparts['select'] = $this->get_SQL_column_list();
$qparts['from'] = $this->get_SQL_join_clause();
$qparts['where'] = '('.$this->fqn($this->key).'='
.$this->key_delim.$this->rec.$this->key_delim.')';
 
$res = $this->myquery($this->get_SQL_query($qparts),__LINE__);
if (! ($row = @mysql_fetch_array($res, MYSQL_ASSOC))) {
return false;
}
for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) {
if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) {
$tab++;
echo '</table>',"\n";
echo '</div>',"\n";
echo '<div id="'.$this->dhtml['prefix'].'tab',$tab,'">',"\n";
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
}
if (! $this->displayed[$k]) {
continue;
}
if ($this->copy_operation() || $this->change_operation()) {
if ($this->hidden($k)) {
if ($k != $this->key_num) {
echo $this->htmlHiddenData($this->fds[$k], $row["qf$k"]);
}
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$k]['name'],'</td>',"\n";
/* There are two possibilities of readonly fields handling:
1. Display plain text for readonly timestamps, dates and URLs.
2. Display disabled input field
In all cases particular readonly field will NOT be saved. */
if ($this->readonly($k) && ($this->col_has_datemask($k) || $this->col_has_URL($k))) {
echo $this->display_delete_field($row, $k);
} elseif ($this->password($k)) {
echo $this->display_password_field($row, $k);
} else {
echo $this->display_change_field($row, $k);
}
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
} elseif ($this->delete_operation() || $this->view_operation()) {
$css_postfix = @$this->fdd[$k]['css']['postfix'];
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$k]['name'],'</td>',"\n";
if ($this->password($k)) {
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),'>',$this->labels['hidden'],'</td>',"\n";
} else {
$this->display_delete_field($row, $k);
}
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
}
}
} /* }}} */
 
function display_change_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
$escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true;
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$multiple = $this->col_has_multiple($k);
$readonly = $this->readonly($k);
$strip_tags = true;
//$escape = true;
if ($this->col_has_checkboxes($k) || $this->col_has_radio_buttons($k)) {
echo $this->htmlRadioCheck($this->cgi['prefix']['data'].$this->fds[$k],
$css_class_name, $vals, $row["qf$k"], $multiple, $readonly,
$strip_tags, $escape);
} else {
echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k],
$css_class_name, $vals, $row["qf$k"], $multiple, $readonly,
$strip_tags, $escape);
}
} elseif (isset($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled="disabled"' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>';
if($escape) echo htmlspecialchars($row["qf$k"]);
else echo $row["qf$k"];
echo '</textarea>',"\n";
} elseif ($this->col_has_php($k)) {
echo include($this->fdd[$k]['php']);
} else {
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled="disabled" ' : '');
echo 'name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="';
if($escape) echo htmlspecialchars($row["qf$k"]);
else echo $row["qf$k"];
echo '" />',"\n";
}
echo '</td>',"\n";
} /* }}} */
 
function display_password_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$this->getCSSclass('value', null, true, $css_postfix),'" type="password" ';
echo ($this->readonly($k) ? 'disabled="disabled" ' : '');
echo 'name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="';
echo htmlspecialchars($row["qf$k"]),'" ',$size_ml_props,' />',"\n";
echo '</td>',"\n";
} /* }}} */
 
function display_delete_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('value', null, true, $css_postfix);
echo '<td class="',$css_class_name,'"',$this->getColAttributes($k),">\n";
echo $this->cellDisplay($k, $row, $css_class_name);
echo '</td>',"\n";
} /* }}} */
 
/**
* Returns CSS class name
*/
function getCSSclass($name, $position = null, $divider = null, $postfix = null) /* {{{ */
{
static $div_idx = -1;
$elements = array($this->css['prefix'], $name);
if ($this->page_type && $this->css['page_type']) {
if ($this->page_type != 'L' && $this->page_type != 'F') {
$elements[] = $this->page_types[$this->page_type];
}
}
if ($position && $this->css['position']) {
$elements[] = $position;
}
if ($divider && $this->css['divider']) {
if ($divider === 'next') {
$div_idx++;
if ($this->css['divider'] > 0 && $div_idx >= $this->css['divider']) {
$div_idx = 0;
}
}
$elements[] = $div_idx;
}
if ($postfix) {
$elements[] = $postfix;
}
return join($this->css['separator'], $elements);
} /* }}} */
 
/**
* Returns field cell HTML attributes
*/
function getColAttributes($k) /* {{{ */
{
$colattrs = '';
if (isset($this->fdd[$k]['colattrs'])) {
$colattrs .= ' ';
$colattrs .= trim($this->fdd[$k]['colattrs']);
}
if (isset($this->fdd[$k]['nowrap'])) {
$colattrs .= ' nowrap';
}
return $colattrs;
} /* }}} */
 
/**
* Substitutes variables in string
* (this is very simple but secure eval() replacement)
*/
function substituteVars($str, $subst_ar) /* {{{ */
{
$array = preg_split('/(\\$\w+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$count = count($array);
for ($i = 1; $i < $count; $i += 2) {
$key = substr($array[$i], 1);
if (isset($subst_ar[$key])) {
$array[$i] = $subst_ar[$key];
}
}
return join('', $array);
} /* }}} */
 
/**
* Print URL
*/
function urlDisplay($k, $link_val, $disp_val, $css, $key) /* {{{ */
{
$escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true;
$ret = '';
$name = $this->fds[$k];
$page = $this->page_name;
$url = $this->cgi['prefix']['sys'].'rec'.'='.$key.'&'.$this->cgi['prefix']['sys'].'fm'
.'='.$this->fm.'&'.$this->cgi['prefix']['sys'].'fl'.'='.$this->fl;
$url .= '&'.$this->cgi['prefix']['sys'].'qfn'.'='.rawurlencode($this->qfn).$this->qfn;
$url .= '&'.$this->get_sfn_cgi_vars().$this->cgi['persist'];
$ar = array(
'key' => $key,
'name' => $name,
'link' => $link_val,
'value' => $disp_val,
'css' => $css,
'page' => $page,
'url' => $url
);
$urllink = isset($this->fdd[$k]['URL'])
? $this->substituteVars($this->fdd[$k]['URL'], $ar)
: $link_val;
$urldisp = isset($this->fdd[$k]['URLdisp'])
? $this->substituteVars($this->fdd[$k]['URLdisp'], $ar)
: $disp_val;
$target = isset($this->fdd[$k]['URLtarget'])
? 'target="'.htmlspecialchars($this->fdd[$k]['URLtarget']).'" '
: '';
$prefix_found = false;
$postfix_found = false;
$prefix_ar = @$this->fdd[$k]['URLprefix'];
$postfix_ar = @$this->fdd[$k]['URLpostfix'];
is_array($prefix_ar) || $prefix_ar = array($prefix_ar);
is_array($postfix_ar) || $postfix_ar = array($postfix_ar);
foreach ($prefix_ar as $prefix) {
if (! strncmp($prefix, $urllink, strlen($prefix))) {
$prefix_found = true;
break;
}
}
foreach ($postfix_ar as $postfix) {
if (! strncmp($postfix, $urllink, strlen($postfix))) {
$postfix_found = true;
break;
}
}
$prefix_found || $urllink = array_shift($prefix_ar).$urllink;
$postfix_found || $urllink = $urllink.array_shift($postfix_ar);
if (strlen($urllink) <= 0 || strlen($urldisp) <= 0) {
$ret = '&nbsp;';
} else {
if ($escape) {
$urldisp = htmlspecialchars($urldisp);
}
$urllink = htmlspecialchars($urllink);
$ret = '<a '.$target.'class="'.$css.'" href="'.$urllink.'">'.$urldisp.'</a>';
}
return $ret;
} /* }}} */
 
function cellDisplay($k, $row, $css) /* {{{ */
{
$escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true;
$key_rec = $row['qf'.$this->key_num];
if (@$this->fdd[$k]['datemask']) {
$value = intval($row["qf$k".'_timestamp']);
$value = $value ? @date($this->fdd[$k]['datemask'], $value) : '';
} else if (@$this->fdd[$k]['strftimemask']) {
$value = intval($row["qf$k".'_timestamp']);
$value = $value ? @strftime($this->fdd[$k]['strftimemask'], $value) : '';
} else if ($this->is_values2($k, $row["qf$k"])) {
$value = $row['qf'.$k.'_idx'];
if ($this->fdd[$k]['select'] == 'M') {
$value_ar = explode(',', $value);
$value_ar2 = array();
foreach ($value_ar as $value_key) {
if (isset($this->fdd[$k]['values2'][$value_key])) {
$value_ar2[$value_key] = $this->fdd[$k]['values2'][$value_key];
$escape = false;
}
}
$value = join(', ', $value_ar2);
} else {
if (isset($this->fdd[$k]['values2'][$value])) {
$value = $this->fdd[$k]['values2'][$value];
$escape = false;
}
}
} elseif (isset($this->fdd[$k]['values2'][$row["qf$k"]])) {
$value = $this->fdd[$k]['values2'][$row["qf$k"]];
} else {
$value = $row["qf$k"];
}
$original_value = $value;
if (@$this->fdd[$k]['strip_tags']) {
$value = strip_tags($value);
}
if ($num_ar = @$this->fdd[$k]['number_format']) {
if (! is_array($num_ar)) {
$num_ar = array($num_ar);
}
if (count($num_ar) == 1) {
list($nbDec) = $num_ar;
$value = number_format($value, $nbDec);
} else if (count($num_ar) == 3) {
list($nbDec, $decPoint, $thSep) = $num_ar;
$value = number_format($value, $nbDec, $decPoint, $thSep);
}
}
if (intval($this->fdd[$k]['trimlen']) > 0 && strlen($value) > $this->fdd[$k]['trimlen']) {
$value = ereg_replace("[\r\n\t ]+",' ',$value);
$value = substr($value, 0, $this->fdd[$k]['trimlen'] - 3).'...';
}
if (@$this->fdd[$k]['mask']) {
$value = sprintf($this->fdd[$k]['mask'], $value);
}
if ($this->col_has_php($k)) {
return include($this->fdd[$k]['php']);
}
if ($this->col_has_URL($k)) {
return $this->urlDisplay($k, $original_value, $value, $css, $key_rec);
}
if (strlen($value) <= 0) {
return '&nbsp;';
}
if ($escape) {
$value = htmlspecialchars($value);
}
return nl2br($value);
} /* }}} */
 
/**
* Creates HTML submit input element
*
* @param name element name
* @param label key in the language hash used as label
* @param css_class_name CSS class name
* @param js_validation if add JavaScript validation subroutine to button
* @param disabled if mark the button as disabled
* @param js any extra text in tags
*/
function htmlSubmit($name, $label, $css_class_name, $js_validation = true, $disabled = false, $js = NULL) /* {{{ */
{
// Note that <input disabled> isn't valid HTML, but most browsers support it
if($disabled == -1) return;
$markdisabled = $disabled ? ' disabled="disabled"' : '';
$ret = '<input'.$markdisabled.' type="submit" class="'.$css_class_name
.'" name="'.$this->cgi['prefix']['sys'].ltrim($markdisabled).$name
.'" value="'.(isset($this->labels[$label]) ? $this->labels[$label] : $label);
if ($js_validation) {
$ret .= '" onclick="return '.$this->js['prefix'].'form_control(this.form);';
}
$ret .='"';
if(isset($js)) $ret .= ' '.$js;
$ret .= ' />';
return $ret;
} /* }}} */
 
/**
* Creates HTML hidden input element
*
* @param name element name
* @param value value
*/
 
function htmlHiddenSys($name, $value) /* {{{ */
{
return $this->htmlHidden($this->cgi['prefix']['sys'].$name, $value);
} /* }}} */
 
function htmlHiddenData($name, $value) /* {{{ */
{
return $this->htmlHidden($this->cgi['prefix']['data'].$name, $value);
} /* }}} */
 
function htmlHidden($name, $value) /* {{{ */
{
return '<input type="hidden" name="'.htmlspecialchars($name)
.'" value="'.htmlspecialchars($value).'" />'."\n";
} /* }}} */
 
/**
* Creates HTML select element (tag)
*
* @param name element name
* @param css CSS class name
* @param kv_array key => value array
* @param selected selected key (it can be single string, array of
* keys or multiple values separated by comma)
* @param multiple bool for multiple selection
* @param readonly bool for readonly/disabled selection
* @param strip_tags bool for stripping tags from values
* @param escape bool for HTML escaping values
* @param js string to be in the <select >, ususally onchange='..';
*/
function htmlSelect($name, $css, $kv_array, $selected = null, /* ...) {{{ */
/* booleans: */ $multiple = false, $readonly = false, $strip_tags = false, $escape = true, $js = NULL)
{
$ret = '<select class="'.htmlspecialchars($css).'" name="'.htmlspecialchars($name);
if ($multiple) {
$ret .= '[]" multiple size="'.$this->multiple;
if (! is_array($selected) && $selected !== null) {
$selected = explode(',', $selected);
}
}
$ret .= '"'.($readonly ? ' disabled="disabled"' : '').$js.'>'."\n";
if (! is_array($selected)) {
$selected = $selected === null ? array() : array($selected);
}
$found = false;
foreach ($kv_array as $key => $value) {
$ret .= '<option value="'.htmlspecialchars($key).'"';
if ((! $found || $multiple) && in_array((string) $key, $selected, 1)
|| (count($selected) == 0 && ! $found && ! $multiple)) {
$ret .= ' selected="selected"';
$found = true;
}
$strip_tags && $value = strip_tags($value);
$escape && $value = htmlspecialchars($value);
$ret .= '>'.$value.'</option>'."\n";
}
$ret .= '</select>';
return $ret;
} /* }}} */
 
/**
* Creates HTML checkboxes or radio buttons
*
* @param name element name
* @param css CSS class name
* @param kv_array key => value array
* @param selected selected key (it can be single string, array of
* keys or multiple values separated by comma)
* @param multiple bool for multiple selection (checkboxes)
* @param readonly bool for readonly/disabled selection
* @param strip_tags bool for stripping tags from values
* @param escape bool for HTML escaping values
* @param js string to be in the <select >, ususally onchange='..';
*/
function htmlRadioCheck($name, $css, $kv_array, $selected = null, /* ...) {{{ */
/* booleans: */ $multiple = false, $readonly = false, $strip_tags = false, $escape = true, $js = NULL)
{
$ret = '';
if ($multiple) {
if (! is_array($selected) && $selected !== null) {
$selected = explode(',', $selected);
}
}
if (! is_array($selected)) {
$selected = $selected === null ? array() : array($selected);
}
$found = false;
foreach ($kv_array as $key => $value) {
$ret .= '<input type="'.($multiple ? 'checkbox' : 'radio').'" name="';
$ret .= htmlspecialchars($name).'[]" value="'.htmlspecialchars($key).'"';
if ((! $found || $multiple) && in_array((string) $key, $selected, 1)
|| (count($selected) == 0 && ! $found && ! $multiple)) {
$ret .= ' checked';
$found = true;
}
if ($readonly) {
$ret .= ' disabled="disabled"';
}
$strip_tags && $value = strip_tags($value);
$escape && $value = htmlspecialchars($value);
$ret .= '>'.$value.'<br>'."\n";
}
return $ret;
} /* }}} */
 
/**
* Returns original variables HTML code for use in forms or links.
*
* @param mixed $origvars string or array of original varaibles
* @param string $method type of method ("POST" or "GET")
* @param mixed $default_value default value of variables
* if null, empty values will be skipped
* @return get HTML code of original varaibles
*/
function get_origvars_html($origvars, $method = 'post', $default_value = '') /* {{{ */
{
$ret = '';
$method = strtoupper($method);
if ($method == 'POST') {
if (! is_array($origvars)) {
$new_origvars = array();
foreach (explode('&', $origvars) as $param) {
$parts = explode('=', $param, 2);
if (! isset($parts[1])) {
$parts[1] = $default_value;
}
if (strlen($parts[0]) <= 0) {
continue;
}
$new_origvars[$parts[0]] = $parts[1];
}
$origvars =& $new_origvars;
}
foreach ($origvars as $key => $val) {
if (strlen($val) <= 0 && $default_value === null) {
continue;
}
$key = rawurldecode($key);
$val = rawurldecode($val);
$ret .= $this->htmlHidden($key, $val);
}
} else if (! strncmp('GET', $method, 3)) {
if (! is_array($origvars)) {
$ret .= $origvars;
} else {
foreach ($origvars as $key => $val) {
if (strlen($val) <= 0 && $default_value === null) {
continue;
}
$ret == '' || $ret .= '&amp;';
$ret .= htmlspecialchars(rawurlencode($key));
$ret .= '=';
$ret .= htmlspecialchars(rawurlencode($val));
}
}
if ($method[strlen($method) - 1] == '+') {
$ret = "?$ret";
}
} else {
trigger_error('Unsupported Platon::get_origvars_html() method: '
.$method, E_USER_ERROR);
}
return $ret;
} /* }}} */
 
function get_sfn_cgi_vars($alternative_sfn = null) /* {{{ */
{
if ($alternative_sfn === null) { // FAST! (cached return value)
static $ret = null;
$ret == null && $ret = $this->get_sfn_cgi_vars($this->sfn);
return $ret;
}
$ret = '';
$i = 0;
foreach ($alternative_sfn as $val) {
$ret != '' && $ret .= '&';
$ret .= rawurlencode($this->cgi['prefix']['sys'].'sfn')."[$i]=".rawurlencode($val);
$i++;
}
return $ret;
} /* }}} */
 
function get_default_cgi_prefix($type) /* {{{ */
{
switch ($type) {
case 'operation': return 'PME_op_';
case 'sys': return 'PME_sys_';
case 'data': return 'PME_data_';
}
return '';
} /* }}} */
 
function get_sys_cgi_var($name, $default_value = null) /* {{{ */
{
if (isset($this)) {
return $this->get_cgi_var($this->cgi['prefix']['sys'].$name, $default_value);
}
return phpMyEdit::get_cgi_var(phpMyEdit::get_default_cgi_prefix('sys').$name, $default_value);
} /* }}} */
 
function get_data_cgi_var($name, $default_value = null) /* {{{ */
{
if (isset($this)) {
return $this->get_cgi_var($this->cgi['prefix']['data'].$name, $default_value);
}
return phpMyEdit::get_cgi_var(phpMyEdit::get_default_cgi_prefix('data').$name, $default_value);
} /* }}} */
 
function get_cgi_var($name, $default_value = null) /* {{{ */
{
if (isset($this) && isset($this->cgi['overwrite'][$name])) {
return $this->cgi['overwrite'][$name];
}
 
static $magic_quotes_gpc = null;
if ($magic_quotes_gpc === null) {
$magic_quotes_gpc = get_magic_quotes_gpc();
}
$var = @$_GET[$name];
if (! isset($var)) {
$var = @$_POST[$name];
}
if (isset($var)) {
if ($magic_quotes_gpc) {
if (is_array($var)) {
foreach (array_keys($var) as $key) {
$var[$key] = stripslashes($var[$key]);
}
} else {
$var = stripslashes($var);
}
}
} else {
$var = @$default_value;
}
if (isset($this) && $var === null && isset($this->cgi['append'][$name])) {
return $this->cgi['append'][$name];
}
return $var;
} /* }}} */
 
function get_server_var($name) /* {{{ */
{
if (isset($_SERVER[$name])) {
return $_SERVER[$name];
}
global $HTTP_SERVER_VARS;
if (isset($HTTP_SERVER_VARS[$name])) {
return $HTTP_SERVER_VARS[$name];
}
global $$name;
if (isset($$name)) {
return $$name;
}
return null;
} /* }}} */
 
/*
* Debug functions
*/
 
function print_get_vars ($miss = 'No GET variables found') // debug only /* {{{ */
{
// we parse form GET variables
if (is_array($_GET)) {
echo "<p> Variables per GET ";
foreach ($_GET as $k => $v) {
if (is_array($v)) {
foreach ($v as $akey => $aval) {
// $_GET[$k][$akey] = strip_tags($aval);
// $$k[$akey] = strip_tags($aval);
echo "$k\[$akey\]=$aval ";
}
} else {
// $_GET[$k] = strip_tags($val);
// $$k = strip_tags($val);
echo "$k=$v ";
}
}
echo '</p>';
} else {
echo '<p>';
echo $miss;
echo '</p>';
}
} /* }}} */
 
function print_post_vars($miss = 'No POST variables found') // debug only /* {{{ */
{
global $_POST;
// we parse form POST variables
if (is_array($_POST)) {
echo "<p>Variables per POST ";
foreach ($_POST as $k => $v) {
if (is_array($v)) {
foreach ($v as $akey => $aval) {
// $_POST[$k][$akey] = strip_tags($aval);
// $$k[$akey] = strip_tags($aval);
echo "$k\[$akey\]=$aval ";
}
} else {
// $_POST[$k] = strip_tags($val);
// $$k = strip_tags($val);
echo "$k=$v ";
}
}
echo '</p>';
} else {
echo '<p>';
echo $miss;
echo '</p>';
}
} /* }}} */
 
function print_vars ($miss = 'Current instance variables') // debug only /* {{{ */
{
echo "$miss ";
echo 'page_name=',$this->page_name,' ';
echo 'hn=',$this->hn,' ';
echo 'un=',$this->un,' ';
echo 'pw=',$this->pw,' ';
echo 'db=',$this->db,' ';
echo 'dbp=',$this->dbp,' ';
echo 'dbh=',$this->dbh,' ';
echo 'tb=',$this->tb,' ';
echo 'key=',$this->key,' ';
echo 'key_type=',$this->key_type,' ';
echo 'inc=',$this->inc,' ';
echo 'options=',$this->options,' ';
echo 'fdd=',$this->fdd,' ';
echo 'fl=',$this->fl,' ';
echo 'fm=',$this->fm,' ';
echo 'sfn=',htmlspecialchars($this->get_sfn_cgi_vars()),' ';
echo 'qfn=',$this->qfn,' ';
echo 'sw=',$this->sw,' ';
echo 'rec=',$this->rec,' ';
echo 'navop=',$this->navop,' ';
echo 'saveadd=',$this->saveadd,' ';
echo 'moreadd=',$this->moreadd,' ';
echo 'canceladd=',$this->canceladd,' ';
echo 'savechange=',$this->savechange,' ';
echo 'morechange=',$this->morechange,' ';
echo 'cancelchange=',$this->cancelchange,' ';
echo 'savecopy=',$this->savecopy,' ';
echo 'cancelcopy=',$this->cancelcopy,' ';
echo 'savedelete=',$this->savedelete,' ';
echo 'canceldelete=',$this->canceldelete,' ';
echo 'cancelview=',$this->cancelview,' ';
echo 'operation=',$this->operation,' ';
echo "\n";
} /* }}} */
 
/*
* Display buttons at top and bottom of page
*/
function display_list_table_buttons($position, $listall = false) /* {{{ */
{
if (($but_str = $this->display_buttons($position)) === null)
return;
if($position == 'down') echo '<hr class="'.$this->getCSSclass('hr', 'down').'" />'."\n";
echo '<table summary="navigation" class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo $but_str,'</td>',"\n";
// Message is now written here
if (strlen(@$this->message) > 0) {
echo '<td class="',$this->getCSSclass('message', $position),'">',$this->message,'</td>',"\n";
}
if($this->display['num_pages'] || $this->display['num_records'])
echo '<td class="',$this->getCSSclass('stats', $position),'">',"\n";
if($this->display['num_pages']) {
if ($listall) {
echo $this->labels['Page'],':&nbsp;1&nbsp;',$this->labels['of'],'&nbsp;1';
} else {
$current_page = intval($this->fm / $this->inc) + 1;
$total_pages = max(1, ceil($this->total_recs / abs($this->inc)));
echo $this->labels['Page'],':&nbsp;',$current_page;
echo '&nbsp;',$this->labels['of'],'&nbsp;',$total_pages;
}
}
if($this->display['num_records'])
echo '&nbsp; ',$this->labels['Records'],':&nbsp;',$this->total_recs;
if($this->display['num_pages'] || $this->display['num_records']) echo '</td>';
echo '</tr></table>',"\n";
if($position == 'up') echo '<hr class="'.$this->getCSSclass('hr', 'up').'" />'."\n";
} /* }}} */
 
/*
* Display buttons at top and bottom of page
*/
function display_record_buttons($position) /* {{{ */
{
if (($but_str = $this->display_buttons($position)) === null)
return;
if ($position == 'down') {
if ($this->tabs_enabled()) $this->display_tab_labels('down');
echo '<hr class="',$this->getCSSclass('hr', 'down'),'" />',"\n";
}
echo '<table summary="navigation" class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo $but_str,'</td>',"\n";
// Message is now written here
//echo '</td>',"\n";
if (strlen(@$this->message) > 0) {
echo '<td class="',$this->getCSSclass('message', $position),'">',$this->message,'</td>',"\n";
}
echo '</tr></table>',"\n";
if ($position == 'up') {
if ($this->tabs_enabled()) $this->display_tab_labels('up');
echo '<hr class="',$this->getCSSclass('hr', 'up'),'" />',"\n";
}
} /* }}} */
 
function display_buttons($position) /* {{{ */
{
$nav_fnc = 'nav_'.$position;
if(! $this->$nav_fnc())
return;
$buttons = (is_array($this->buttons[$this->page_type][$position]))
? $this->buttons[$this->page_type][$position]
: $this->default_buttons[$this->page_type];
foreach ($buttons as $name) {
$ret .= $this->display_button($name, $position)."\n";
}
return $ret;
} /* }}} */
 
function display_button($name, $position = 'up') /* {{{ */
{
if (is_array($name)) {
if (isset($name['code'])) return $name['code'];
return $this->htmlSubmit($name['name'], $name['value'], $name['css'], $name['disabled'], $name['js']);
}
$disabled = 1; // show disabled by default
if ($name[0] == '+') { $name = substr($name, 1); $disabled = 0; } // always show disabled as enabled
if ($name[0] == '-') { $name = substr($name, 1); $disabled = -1; } // don't show disabled
if ($name == 'cancel') {
return $this->htmlSubmit('cancel'.$this->page_types[$this->page_type], 'Cancel',
$this->getCSSclass('cancel', $position), false);
}
if (in_array($name, array('add','view','change','copy','delete'))) {
$enabled_fnc = $name.'_enabled';
$enabled = $this->$enabled_fnc();
if ($name != 'add' && ! $this->total_recs && strstr('LF', $this->page_type))
$enabled = false;
return $this->htmlSubmit('operation', ucfirst($name),
$this->getCSSclass($name, $position), false, $enabled ? 0 : $disabled);
}
if ($name == 'savedelete') {
$enabled = $this->delete_enabled();
$js = 'onclick="return confirm(\''.$this->labels['Delete'].' ?\');"';
return $this->htmlSubmit('savedelete', 'Delete',
$this->getCSSclass('save', $position), false, $enabled ? 0 : $disabled, $js);
}
if (in_array($name, array('save','more'))) {
$validation = true; // if js validation
if ($this->page_type == 'D' && $name == 'save' ) { $value = 'Delete'; $validation = false; }
elseif ($this->page_type == 'C' && $name == 'more' ) { $value = 'Apply'; }
else $value = ucfirst($name);
return $this->htmlSubmit($name.$this->page_types[$this->page_type], $value,
$this->getCSSclass($name, $position), $validation);
}
$listall = $this->inc <= 0;
if ($listall) {
$disabledprev = true;
$disablednext = true;
$total_pages = 1;
$current_page = 1;
} else {
$disabledprev = $this->fm <= 0;
$disablednext = $this->fm + $this->inc >= $this->total_recs;
$total_pages = max(1, ceil($this->total_recs / abs($this->inc)));
$current_page = ceil($this->fm / abs($this->inc)); // must + 1
}
$disabledfirst = $disabledprev;
$disabledlast = $disablednext;
// some statistics first
if ($name == 'total_pages') return $total_pages;
if ($name == 'current_page') return ($current_page+1);
if ($name == 'total_recs') return ($this->total_recs);
// now some goto buttons/dropdowns/inputs...
if ($name == 'goto_text') {
$ret = '<input type="text" class="'.$this->getCSSclass('gotopn', $position).'"';
$ret .= ' name="'.$this->cgi['prefix']['sys'].'navpn'.$position.'" value="'.($current_page+1).'"';
$ret .= ' size="'.(strlen($total_pages)+1).'" maxlength="'.(strlen($total_pages)+1).'"';
// TODO some js here.... on enter submit, on click erase ?...
$ret .=' oneypress="return PE_filter_handler(this.form, event);" />';
return $ret;
}
if ($name == 'goto_combo') {
$disabledgoto = !($listall || ($disablednext && $disabledprev)) ? '' : ' disabled';
if ($disablegoto != '' && $disabled < 0) return;
$kv_array = array();
for ($i = 0; $i < $total_pages; $i++) {
$kv_array[$this->inc * $i] = $i + 1;
}
// TODO: add onchange="return this.form.submit();" DONE ???
return $this->htmlSelect($this->cgi['prefix']['sys'].ltrim($disabledgoto).'navfm'.$position,
$this->getCSSclass('goto', $position), $kv_array, (string)$this->fm, false, $disabledgoto,
false, true, 'onchange="return this.form.submit();"');
}
if ($name == 'goto') {
return $this->htmlSubmit('navop', 'Go to', $this->getCSSclass('goto', $position),
false, ($listall || ($disablednext && $disabledprev)) ? $disabled : 0);
}
if (in_array($name, array('first','prev','next','last','<<','<','>','>>'))) {
$disabled_var = 'disabled'.$name;
$name2 = $name;
if (strlen($name) <= 2) {
$nav_values = array('<<' => 'first', '<' => 'prev', '>' => 'next', '>>' => 'last');
$disabled_var = 'disabled'.$nav_values[$name];
$name2 = $nav_values[$name];
}
return $this->htmlSubmit('navop', ucfirst($name),
$this->getCSSclass($name2, $position), false, $$disabled_var ? $disabled : 0);
}
if(isset($this->labels[$name])) return $this->labels[$name];
return $name;
} /* }}} */
 
function number_of_recs() /* {{{ */
{
$count_parts = array(
'type' => 'select',
'select' => 'count(*)',
'from' => $this->get_SQL_join_clause(),
'where' => $this->get_SQL_where_from_query_opts());
$res = $this->myquery($this->get_SQL_query($count_parts), __LINE__);
$row = @mysql_fetch_array($res, MYSQL_NUM);
$this->total_recs = $row[0];
} /* }}} */
 
/*
* Table Page Listing
*/
function list_table() /* {{{ */
{
if ($this->fm == '') {
$this->fm = 0;
}
$this->fm = $this->navfm;
if ($this->prev_operation()) {
$this->fm = $this->fm - $this->inc;
if ($this->fm < 0) {
$this->fm = 0;
}
}
if ($this->first_operation()) {
$this->fm = 0;
} // last operation must be performed below, after retrieving total_recs
if ($this->next_operation()) {
$this->fm += $this->inc;
}
$this->number_of_recs();
if ($this->last_operation() || $this->fm > $this->total_recs) { // if goto_text is badly set
$this->fm = (int)(($this->total_recs - 1)/$this->inc)*$this->inc;
}
// If sort sequence has changed, restart listing
$this->qfn != $this->prev_qfn && $this->fm = 0;
if (0) { // DEBUG
echo 'qfn vs. prev_qfn comparsion ';
echo '[<b>',htmlspecialchars($this->qfn),'</b>]';
echo '[<b>',htmlspecialchars($this->prev_qfn),'</b>]<br />';
echo 'comparsion <u>',($this->qfn == $this->prev_qfn ? 'proved' : 'failed'),'</u>';
echo '<hr />';
}
/*
* If user is allowed to Change/Delete records, we need an extra column
* to allow users to select a record
*/
$select_recs = $this->key != '' &&
($this->change_enabled() || $this->delete_enabled() || $this->view_enabled());
// Are we doing a listall?
$listall = $this->inc <= 0;
/*
* Display the MySQL table in an HTML table
*/
$this->form_begin();
echo $this->get_origvars_html($this->get_sfn_cgi_vars());
echo $this->htmlHiddenSys('fl', $this->fl);
// Display buttons at top and/or bottom of page.
$this->display_list_table_buttons('up', $listall);
if ($this->cgi['persist'] != '') {
echo $this->get_origvars_html($this->cgi['persist']);
}
if (! $this->filter_operation()) {
echo $this->get_origvars_html($this->qfn);
}
echo $this->htmlHiddenSys('qfn', $this->qfn);
echo $this->htmlHiddenSys('fm', $this->fm);
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
echo '<tr class="',$this->getCSSclass('header'),'">',"\n";
/*
* System (navigation, selection) columns counting
*/
$sys_cols = 0;
$sys_cols += intval($this->filter_enabled() || $select_recs);
if ($sys_cols > 0) {
$sys_cols += intval($this->nav_buttons()
&& ($this->nav_text_links() || $this->nav_graphic_links()));
}
/*
* We need an initial column(s) (sys columns)
* if we have filters, Changes or Deletes enabled
*/
if ($sys_cols) {
echo '<th class="',$this->getCSSclass('header'),'" colspan="',$sys_cols,'">';
if ($this->filter_enabled()) {
if ($this->filter_operation()) {
echo $this->htmlSubmit('sw', 'Hide', $this->getCSSclass('hide'), false);
echo $this->htmlSubmit('sw', 'Clear', $this->getCSSclass('clear'), false);
} else {
echo $this->htmlSubmit('sw', 'Search', $this->getCSSclass('search'), false);
}
} else {
echo '&nbsp;';
}
echo '</th>',"\n";
}
for ($k = 0; $k < $this->num_fds; $k++) {
$fd = $this->fds[$k];
if (! $this->displayed[$k]) {
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('header', null, null, $css_postfix);
$fdn = $this->fdd[$fd]['name'];
if (! $this->fdd[$fd]['sort'] || $this->password($fd)) {
echo '<th class="',$css_class_name,'">',$fdn,'</th>',"\n";
} else {
// Clicking on the current sort field reverses the sort order
$new_sfn = $this->sfn;
array_unshift($new_sfn, in_array("$k", $new_sfn, 1) ? "-$k" : $k);
echo '<th class="',$css_class_name,'">';
echo '<a class="',$css_class_name,'" href="';
echo htmlspecialchars($this->page_name.'?'.$this->cgi['prefix']['sys'].'fm'.'=0'
.'&'.$this->cgi['prefix']['sys'].'fl'.'='.$this->fl
.'&'.$this->cgi['prefix']['sys'].'qfn'.'='.rawurlencode($this->qfn).$this->qfn
.'&'.$this->get_sfn_cgi_vars($new_sfn).$this->cgi['persist']);
echo '">',$fdn,'</a></th>',"\n";
}
}
echo '</tr>',"\n";
 
/*
* Prepare the SQL Query from the data definition file
*/
$qparts['type'] = 'select';
$qparts['select'] = $this->get_SQL_column_list();
// Even if the key field isn't displayed, we still need its value
if ($select_recs) {
if (!in_array ($this->key, $this->fds)) {
$qparts['select'] .= ','.$this->fqn($this->key);
}
}
$qparts['from'] = $this->get_SQL_join_clause();
$qparts['where'] = $this->get_SQL_where_from_query_opts();
// build up the ORDER BY clause
if (isset($this->sfn)) {
$sort_fields = array();
$sort_fields_w = array();
foreach ($this->sfn as $field) {
if ($field[0] == '-') {
$field = substr($field, 1);
$desc = true;
} else {
$field = $field;
$desc = false;
}
$sort_field = $this->fqn($field);
$sort_field_w = $this->fdd[$field]['name'];
$this->col_has_sql($field) && $sort_field_w .= ' (sql)';
if ($desc) {
$sort_field .= ' DESC';
$sort_field_w .= ' '.$this->labels['descending'];
} else {
$sort_field_w .= ' '.$this->labels['ascending'];
}
$sort_fields[] = $sort_field;
$sort_fields_w[] = $sort_field_w;
}
if (count($sort_fields) > 0) {
$qparts['orderby'] = join(',', $sort_fields);
}
}
$qparts['limit'] = $listall ? '' : $this->fm.','.$this->inc;
 
/*
* Main list_table() query
*
* Each row of the HTML table is one record from the SQL query. We must
* perform this query before filter printing, because we want to use
* mysql_field_len() function. We will also fetch the first row to get
* the field names.
*/
$query = $this->get_SQL_query($qparts);
$res = $this->myquery($query, __LINE__);
if ($res == false) {
$this->error('invalid SQL query', $query);
return false;
}
$row = @mysql_fetch_array($res, MYSQL_ASSOC);
 
/* FILTER {{{
*
* Draw the filter and fill it with any data typed in last pass and stored
* in the array parameter keyword 'filter'. Prepare the SQL WHERE clause.
*/
if ($this->filter_operation()) {
// Filter row retrieval
$fields = false;
$filter_row = $row;
if (! is_array($filter_row)) {
unset($qparts['where']);
$query = $this->get_SQL_query($qparts);
$res = $this->myquery($query, __LINE__);
if ($res == false) {
$this->error('invalid SQL query', $query);
return false;
}
$filter_row = @mysql_fetch_array($res, MYSQL_ASSOC);
}
/* Variable $fields is used to get index of particular field in
result. That index can be passed in example to mysql_field_len()
function. Use field names as indexes to $fields array. */
if (is_array($filter_row)) {
$fields = array_flip(array_keys($filter_row));
}
if ($fields != false) {
$css_class_name = $this->getCSSclass('filter');
echo '<tr class="',$css_class_name,'">',"\n";
echo '<td class="',$css_class_name,'" colspan="',$sys_cols,'">';
echo $this->htmlSubmit('filter', 'Query', $this->getCSSclass('query'), false);
echo '</td>', "\n";
for ($k = 0; $k < $this->num_fds; $k++) {
if (! $this->displayed[$k]) {
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('filter', null, null, $css_postfix);
$this->field_name = $this->fds[$k];
$fd = $this->field_name;
$this->field = $this->fdd[$fd];
$l = 'qf'.$k;
$lc = 'qf'.$k.'_comp';
$li = 'qf'.$k.'_id';
if ($this->clear_operation()) {
$m = null;
$mc = null;
$mi = null;
} else {
$m = $this->get_sys_cgi_var($l);
$mc = $this->get_sys_cgi_var($lc);
$mi = $this->get_sys_cgi_var($li);
}
echo '<td class="',$css_class_name,'">';
if ($this->password($k)) {
echo '&nbsp;';
} else if ($this->fdd[$fd]['select'] == 'D' || $this->fdd[$fd]['select'] == 'M') {
// Multiple fields processing
// Default size is 2 and array required for values.
$from_table = ! $this->col_has_values($k) || isset($this->fdd[$k]['values']['table']);
$vals = $this->set_values($k, array('*' => '*'), null, $from_table);
$selected = $mi;
$multiple = $this->col_has_multiple_select($k);
$multiple |= $this->fdd[$fd]['select'] == 'M';
$readonly = false;
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($this->cgi['prefix']['sys'].$l.'_id', $css_class_name,
$vals, $selected, $multiple, $readonly, $strip_tags, $escape);
} elseif ($this->fdd[$fd]['select'] == 'N' || $this->fdd[$fd]['select'] == 'T') {
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$maxlen > 0 || $maxlen = intval(@mysql_field_len($res, $fields["qf$k"]));
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size']
: ($maxlen < 30 ? min($maxlen, 8) : 12);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
if ($this->fdd[$fd]['select'] == 'N') {
$mc = in_array($mc, $this->comp_ops) ? $mc : '=';
echo $this->htmlSelect($this->cgi['prefix']['sys'].$l.'_comp',
$css_class_name, $this->comp_ops, $mc);
}
echo '<input class="',$css_class_name,'" value="',htmlspecialchars(@$m);
echo '" type="text" name="'.$this->cgi['prefix']['sys'].'qf'.$k.'"',$size_ml_props;
echo ' onkeypress="return '.$this->js['prefix'].'filter_handler(this.form, event);" />';
} else {
echo '&nbsp;';
}
echo '</td>',"\n";
}
echo '</tr>',"\n";
}
} // }}}
/*
* Display sorting sequence
*/
if ($qparts['orderby'] && $this->display['sort']) {
$css_class_name = $this->getCSSclass('sortinfo');
echo '<tr class="',$css_class_name,'">',"\n";
echo '<td class="',$css_class_name,'" colspan="',$sys_cols,'">';
echo '<a class="',$css_class_name,'" href="';
echo htmlspecialchars($this->page_name
.'?'.$this->cgi['prefix']['sys'].'fl'.'='.$this->fl
.'&'.$this->cgi['prefix']['sys'].'fm'.'='.$this->fm
.'&'.$this->cgi['prefix']['sys'].'qfn'.'='.rawurlencode($this->qfn)
.$this->qfn.$this->cgi['persist']);
echo '">',$this->labels['Clear'],'</a></td>',"\n";
echo '<td class="',$css_class_name,'" colspan="',$this->num_fields_displayed,'">';
echo $this->labels['Sorted By'],': ',join(', ', $sort_fields_w),'</td></tr>',"\n";
}
 
/*
* Display the current query
*/
$text_query = $this->get_SQL_where_from_query_opts(null, true);
if ($text_query != '' && $this->display['query']) {
$css_class_name = $this->getCSSclass('queryinfo');
echo '<tr class="',$css_class_name,'">',"\n";
echo '<td class="',$css_class_name,'" colspan="',$sys_cols,'">';
echo '<a class="',$css_class_name,'" href="';
echo htmlspecialchars($this->get_server_var('PHP_SELF')
.'?'.$this->cgi['prefix']['sys'].'fl'.'='.$this->fl
.'&'.$this->cgi['prefix']['sys'].'fm'.'='.$this->fm
.'&'.$this->cgi['prefix']['sys'].'qfn'.'='.rawurlencode($this->qfn)
.'&'.$this->get_sfn_cgi_vars().$this->cgi['persist']);
echo '">',$this->labels['Clear'],'</a></td>',"\n";
echo '<td class="',$css_class_name,'" colspan="',$this->num_fields_displayed,'">';
echo $this->labels['Current Query'],': ',htmlspecialchars($text_query),'</td></tr>',"\n";
}
 
if ($this->nav_text_links() || $this->nav_graphic_links()) {
$qstrparts = array();
strlen($this->fl) > 0 && $qstrparts[] = $this->cgi['prefix']['sys'].'fl'.'='.$this->fl;
strlen($this->fm) > 0 && $qstrparts[] = $this->cgi['prefix']['sys'].'fm'.'='.$this->fm;
count($this->sfn) > 0 && $qstrparts[] = $this->get_sfn_cgi_vars();
strlen($this->cgi['persist']) > 0 && $qstrparts[] = $this->cgi['persist'];
$qpview = $qstrparts;
$qpcopy = $qstrparts;
$qpchange = $qstrparts;
$qpdelete = $qstrparts;
$qp_prefix = $this->cgi['prefix']['sys'].'operation'.'='.$this->cgi['prefix']['operation'];
$qpview[] = $qp_prefix.'View';
$qpcopy[] = $qp_prefix.'Copy';
$qpchange[] = $qp_prefix.'Change';
$qpdelete[] = $qp_prefix.'Delete';
$qpviewStr = htmlspecialchars($this->page_name.'?'.join('&',$qpview).$this->qfn);
$qpcopyStr = htmlspecialchars($this->page_name.'?'.join('&',$qpcopy).$this->qfn);
$qpchangeStr = htmlspecialchars($this->page_name.'?'.join('&',$qpchange).$this->qfn);
$qpdeleteStr = htmlspecialchars($this->page_name.'?'.join('&',$qpdelete).$this->qfn);
}
 
$fetched = true;
$first = true;
$rowCount = 0;
while ((!$fetched && ($row = @mysql_fetch_array($res, MYSQL_ASSOC)) != false)
|| ($fetched && $row != false)) {
$fetched = false;
echo '<tr class="',$this->getCSSclass('row', null, 'next'),'">',"\n";
if ($sys_cols) { /* {{{ */
$key_rec = $row['qf'.$this->key_num];
$queryAppend = htmlspecialchars('&'.$this->cgi['prefix']['sys'].'rec'.'='.$key_rec);
$viewQuery = $qpviewStr . $queryAppend;
$copyQuery = $qpcopyStr . $queryAppend;
$changeQuery = $qpchangeStr . $queryAppend;
$deleteQuery = $qpdeleteStr . $queryAppend;
$viewTitle = htmlspecialchars($this->labels['View']);
$changeTitle = htmlspecialchars($this->labels['Change']);
$copyTitle = htmlspecialchars($this->labels['Copy']);
$deleteTitle = htmlspecialchars($this->labels['Delete']);
$css_class_name = $this->getCSSclass('navigation', null, true);
if ($select_recs) {
if (! $this->nav_buttons() || $sys_cols > 1) {
echo '<td class="',$css_class_name,'">';
}
if ($this->nav_graphic_links()) {
$printed_out = false;
if ($this->view_enabled()) {
$printed_out = true;
echo '<a class="',$css_class_name,'" href="',$viewQuery,'"><img class="';
echo $css_class_name,'" src="',$this->url['images'];
echo 'pme-view.png" height="15" width="16" border="0" ';
echo 'alt="',$viewTitle,'" title="',$viewTitle,'" /></a>';
}
if ($this->change_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a class="',$css_class_name,'" href="',$changeQuery,'"><img class="';
echo $css_class_name,'" src="',$this->url['images'];
echo 'pme-change.png" height="15" width="16" border="0" ';
echo 'alt="',$changeTitle,'" title="',$changeTitle,'" /></a>';
}
if ($this->copy_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a class="',$css_class_name,'" href="',$copyQuery,'"><img class="';
echo $css_class_name,'" src="',$this->url['images'];
echo 'pme-copy.png" height="15" width="16" border="0" ';
echo 'alt="',$copyTitle,'" title="',$copyTitle,'" /></a>';
}
if ($this->delete_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a class="',$css_class_name,'" href="',$deleteQuery,'"><img class="';
echo $css_class_name,'" src="',$this->url['images'];
echo 'pme-delete.png" height="15" width="16" border="0" ';
echo 'alt="',$deleteTitle,'" title="',$deleteTitle,'" /></a>';
}
}
if ($this->nav_text_links()) {
if ($this->nav_graphic_links()) {
echo '<br class="',$css_class_name,'">';
}
$printed_out = false;
if ($this->view_enabled()) {
$printed_out = true;
echo '<a href="',$viewQuery,'" title="',$viewTitle,'" class="',$css_class_name,'">V</a>';
}
if ($this->change_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a href="',$changeQuery,'" title="',$changeTitle,'" class="',$css_class_name,'">C</a>';
}
if ($this->copy_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a href="',$copyQuery,'" title="',$copyTitle,'" class="',$css_class_name,'">P</a>';
}
if ($this->delete_enabled()) {
$printed_out && print('&nbsp;');
$printed_out = true;
echo '<a href="',$deleteQuery,'" title="',$deleteTitle,'" class="',$css_class_name,'">D</a>';
}
}
if (! $this->nav_buttons() || $sys_cols > 1) {
echo '</td>',"\n";
}
if ($this->nav_buttons()) {
echo '<td class="',$css_class_name,'"><input class="',$css_class_name;
echo '" type="radio" name="'.$this->cgi['prefix']['sys'].'rec';
echo '" value="',htmlspecialchars($key_rec),'"';
if (($this->rec == '' && $first) || ($this->rec == $key_rec)) {
echo ' checked';
$first = false;
}
echo ' /></td>',"\n";
}
} elseif ($this->filter_enabled()) {
echo '<td class="',$css_class_name,'" colspan=',$sys_cols,'>&nbsp;</td>',"\n";
}
} /* }}} */
for ($k = 0; $k < $this->num_fds; $k++) { /* {{{ */
$fd = $this->fds[$k];
if (! $this->displayed[$k]) {
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('cell', null, true, $css_postfix);
if ($this->password($k)) {
echo '<td class="',$css_class_name,'">',$this->labels['hidden'],'</td>',"\n";
continue;
}
echo '<td class="',$css_class_name,'"',$this->getColAttributes($fd),'>';
echo $this->cellDisplay($k, $row, $css_class_name);
echo '</td>',"\n";
} /* }}} */
echo '</tr>',"\n";
}
 
/*
* Display and accumulate column aggregation info, do totalling query
* XXX this feature does not work yet!!!
*/
// aggregates listing (if any)
if ($$var_to_total) {
// do the aggregate query if necessary
//if ($vars_to_total) {
$qp = array();
$qp['type'] = 'select';
$qp['select'] = $aggr_from_clause;
$qp['from'] = $this->get_SQL_join_clause();
$qp['where'] = $this->get_SQL_where_from_query_opts();
$tot_query = $this->get_SQL_query($qp);
$totals_result = $this->myquery($tot_query,__LINE__);
$tot_row = @mysql_fetch_array($totals_result, MYSQL_ASSOC);
//}
$qp_aggr = $qp;
echo "\n",'<tr class="TODO-class">',"\n",'<td class="TODO-class">&nbsp;</td>',"\n";
/*
echo '<td>';
echo printarray($qp_aggr);
echo printarray($vars_to_total);
echo '</td>';
echo '<td colspan="'.($this->num_fds-1).'">'.$var_to_total.' '.$$var_to_total.'</td>';
*/
// display the results
for ($k=0;$k<$this->num_fds;$k++) {
$fd = $this->fds[$k];
if (stristr($this->fdd[$fd]['options'],'L') or !isset($this->fdd[$fd]['options'])) {
echo '<td>';
$aggr_var = 'qf'.$k.'_aggr';
$$aggr_var = $this->get_sys_cgi_var($aggr_var);
if ($$aggr_var) {
echo $this->sql_aggrs[$$aggr_var],': ',$tot_row[$aggr_var];
} else {
echo '&nbsp;';
}
echo '</td>',"\n";
}
}
echo '</tr>',"\n";
}
echo '</table>',"\n"; // end of table rows listing
$this->display_list_table_buttons('down', $listall);
$this->form_end();
} /* }}} */
 
function display_record() /* {{{ */
{
// PRE Triggers
$ret = true;
if ($this->change_operation()) {
$ret &= $this->exec_triggers_simple('update', 'pre');
// if PRE update fails, then back to view operation
if (! $ret) {
$this->operation = $this->labels['View'];
$ret = true;
}
}
if ($this->add_operation() || $this->copy_operation()) {
$ret &= $this->exec_triggers_simple('insert', 'pre');
}
if ($this->view_operation()) {
$ret &= $this->exec_triggers_simple('select', 'pre');
}
if ($this->delete_operation()) {
$ret &= $this->exec_triggers_simple('delete', 'pre');
}
// if PRE insert/view/delete fail, then back to the list
if ($ret == false) {
$this->operation = '';
$this->list_table();
return;
}
$this->form_begin();
if ($this->cgi['persist'] != '') {
echo $this->get_origvars_html($this->cgi['persist']);
}
echo $this->get_origvars_html($this->get_sfn_cgi_vars());
echo $this->get_origvars_html($this->qfn);
echo $this->htmlHiddenSys('cur_tab', $this->dhtml['prefix'].'tab'.$this->cur_tab);
echo $this->htmlHiddenSys('qfn', $this->qfn);
echo $this->htmlHiddenSys('rec', $this->copy_operation() ? '' : $this->rec);
echo $this->htmlHiddenSys('fm', $this->fm);
echo $this->htmlHiddenSys('fl', $this->fl);
$this->display_record_buttons('up');
if ($this->tabs_enabled()) {
echo '<div id="'.$this->dhtml['prefix'].'tab0">',"\n";
}
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
if ($this->add_operation()) {
$this->display_add_record();
} else {
$this->display_copy_change_delete_record();
}
echo '</table>',"\n";
if ($this->tabs_enabled()) {
echo '</div>',"\n";
}
$this->display_record_buttons('down');
 
$this->form_end();
} /* }}} */
 
/*
* Action functions
*/
 
function do_add_record() /* {{{ */
{
// Preparing query
$query = '';
$key_col_val = '';
$newvals = array();
for ($k = 0; $k < $this->num_fds; $k++) {
if ($this->processed($k)) {
$fd = $this->fds[$k];
if ($this->readonly($k)) {
$fn = (string) @$this->fdd[$k]['default'];
} else {
$fn = $this->get_data_cgi_var($fd);
}
if ($fd == $this->key) {
$key_col_val = $fn;
}
$newvals[$fd] = is_array($fn) ? join(',',$fn) : $fn;
}
}
// Creating array of changed keys ($changed)
$changed = array_keys($newvals);
// Before trigger, newvals can be efectively changed
if ($this->exec_triggers('insert', 'before', $oldvals, $changed, $newvals) == false) {
return false;
}
// Real query (no additional query in this method)
foreach ($newvals as $fd => $val) {
if ($fd == '') continue;
if ($this->col_has_sqlw($this->fdn[$fd])) {
$val_as = addslashes($val);
$val_qas = '"'.addslashes($val).'"';
$value = $this->substituteVars(
$this->fdd[$this->fdn[$fd]]['sqlw'], array(
'val_qas' => $val_qas,
'val_as' => $val_as,
'val' => $val
));
} else {
$value = "'".addslashes($val)."'";
}
if ($query == '') {
$query = 'INSERT INTO `'.$this->tb.'` (`'.$fd.'`'; // )
$query2 = ') VALUES ('.$value.'';
} else {
$query .= ', `'.$fd.'`';
$query2 .= ', '.$value.'';
}
}
$query .= $query2.')';
$res = $this->myquery($query, __LINE__);
$this->message = @mysql_affected_rows($this->dbh).' '.$this->labels['record added'];
if (! $res) {
return false;
}
$this->rec = mysql_insert_id($this->dbh);
// Notify list
if (@$this->notify['insert'] || @$this->notify['all']) {
$this->email_notify(false, $newvals);
}
// Note change in log table
if ($this->logtable) {
$query = sprintf('INSERT INTO %s'
.' (updated, user, host, operation, tab, rowkey, col, oldval, newval)'
.' VALUES (NOW(), "%s", "%s", "insert", "%s", "%s", "", "", "%s")',
$this->logtable, addslashes($this->get_server_var('REMOTE_USER')),
addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb),
addslashes($key_col_val), addslashes(serialize($newvals)));
$this->myquery($query, __LINE__);
}
// After trigger
if ($this->exec_triggers('insert', 'after', $oldvals, $changed, $newvals) == false) {
return false;
}
return true;
} /* }}} */
 
function do_change_record() /* {{{ */
{
// Preparing queries
$query_real = '';
$query_oldrec = '';
$newvals = array();
$oldvals = array();
$changed = array();
// Prepare query to retrieve oldvals
for ($k = 0; $k < $this->num_fds; $k++) {
if ($this->processed($k) && !$this->readonly($k)) {
$fd = $this->fds[$k];
$fn = $this->get_data_cgi_var($fd);
$newvals[$this->fds[$k]] = is_array($fn) ? join(',',$fn) : $fn;
if ($query_oldrec == '') {
$query_oldrec = 'SELECT '.$fd;
} else {
$query_oldrec .= ','.$fd;
}
}
}
$where_part = " WHERE (".$this->key.'='.$this->key_delim.$this->rec.$this->key_delim.')';
$query_newrec = $query_oldrec.' FROM ' . $this->tb;
$query_oldrec .= ' FROM ' . $this->tb . $where_part;
// Additional query (must go before real query)
$res = $this->myquery($query_oldrec, __LINE__);
$oldvals = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_free_result($res);
// Creating array of changed keys ($changed)
foreach ($newvals as $fd => $value) {
if ($value != $oldvals[$fd])
$changed[] = $fd;
}
// Before trigger
if ($this->exec_triggers('update', 'before', $oldvals, $changed, $newvals) == false) {
return false;
}
// Build the real query respecting changes to the newvals array
foreach ($newvals as $fd => $val) {
if ($fd == '') continue;
if ($this->col_has_sqlw($this->fdn[$fd])) {
$val_as = addslashes($val);
$val_qas = '"'.addslashes($val).'"';
$value = $this->substituteVars(
$this->fdd[$this->fdn[$fd]]['sqlw'], array(
'val_qas' => $val_qas,
'val_as' => $val_as,
'val' => $val
));
} else {
$value = "'".addslashes($val)."'";
}
if ($query_real == '') {
$query_real = 'UPDATE '.$this->tb.' SET '.$fd.'='.$value;
} else {
$query_real .= ','.$fd.'='.$value;
}
}
$query_real .= $where_part;
// Real query
$res = $this->myquery($query_real, __LINE__);
$this->message = @mysql_affected_rows($this->dbh).' '.$this->labels['record changed'];
if (! $res) {
return false;
}
// Another additional query (must go after real query)
if (in_array($this->key, $changed)) {
$this->rec = $newvals[$this->key]; // key has changed
}
$query_newrec .= ' WHERE ('.$this->key.'='.$this->key_delim.$this->rec.$this->key_delim.')';
$res = $this->myquery($query_newrec, __LINE__);
$newvals = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_free_result($res);
// Creating array of changed keys ($changed)
$changed = array();
foreach ($newvals as $fd => $value) {
if ($value != $oldvals[$fd])
$changed[] = $fd;
}
// Notify list
if (@$this->notify['update'] || @$this->notify['all']) {
if (count($changed) > 0) {
$this->email_notify($oldvals, $newvals);
}
}
// Note change in log table
if ($this->logtable) {
foreach ($changed as $key) {
$qry = sprintf('INSERT INTO %s'
.' (updated, user, host, operation, tab, rowkey, col, oldval, newval)'
.' VALUES (NOW(), "%s", "%s", "update", "%s", "%s", "%s", "%s", "%s")',
$this->logtable, addslashes($this->get_server_var('REMOTE_USER')),
addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb),
addslashes($this->rec), addslashes($key),
addslashes($oldvals[$key]), addslashes($newvals[$key]));
$this->myquery($qry, __LINE__);
}
}
// After trigger
if ($this->exec_triggers('update', 'after', $oldvals, $changed, $newvals) == false) {
return false;
}
return true;
} /* }}} */
 
function do_delete_record() /* {{{ */
{
// Additional query
$query = 'SELECT * FROM '.$this->tb.' WHERE ('.$this->key.' = '
.$this->key_delim.$this->rec.$this->key_delim.')'; // )
$res = $this->myquery($query, __LINE__);
$oldvals = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_free_result($res);
// Creating array of changed keys ($changed)
$changed = array_keys($oldvals);
$newvals = array();
// Before trigger
if ($this->exec_triggers('delete', 'before', $oldvals, $changed, $newvals) == false) {
return false;
}
// Real query
$query = 'DELETE FROM '.$this->tb.' WHERE ('.$this->key.' = '
.$this->key_delim.$this->rec.$this->key_delim.')'; // )
$res = $this->myquery($query, __LINE__);
$this->message = @mysql_affected_rows($this->dbh).' '.$this->labels['record deleted'];
if (! $res) {
return false;
}
// Notify list
if (@$this->notify['delete'] || @$this->notify['all']) {
$this->email_notify($oldvals, false);
}
// Note change in log table
if ($this->logtable) {
$query = sprintf('INSERT INTO %s'
.' (updated, user, host, operation, tab, rowkey, col, oldval, newval)'
.' VALUES (NOW(), "%s", "%s", "delete", "%s", "%s", "%s", "%s", "")',
$this->logtable, addslashes($this->get_server_var('REMOTE_USER')),
addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb),
addslashes($this->rec), addslashes($key), addslashes(serialize($oldvals)));
$this->myquery($query, __LINE__);
}
// After trigger
if ($this->exec_triggers('delete', 'after', $oldvals, $changed, $newvals) == false) {
return false;
}
return true;
} /* }}} */
 
function email_notify($old_vals, $new_vals) /* {{{ */
{
if (! function_exists('mail')) {
return false;
}
if ($old_vals != false && $new_vals != false) {
$action = 'update';
$subject = 'Record updated in';
$body = 'An item with '.$this->fdd[$this->key]['name'].' = '
.$this->key_delim.$this->rec.$this->key_delim .' was updated in';
$vals = $new_vals;
} elseif ($new_vals != false) {
$action = 'insert';
$subject = 'Record added to';
$body = 'A new item was added into';
$vals = $new_vals;
} elseif ($old_vals != false) {
$action = 'delete';
$subject = 'Record deleted from';
$body = 'An item was deleted from';
$vals = $old_vals;
} else {
return false;
}
$addr = $this->get_server_var('REMOTE_ADDR');
$user = $this->get_server_var('REMOTE_USER');
$body = 'This notification e-mail was automatically generated by phpMyEdit.'."\n\n".$body;
$body .= ' table '.$this->tb.' in MySQL database '.$this->db.' on '.$this->page_name;
$body .= ' by '.($user == '' ? 'unknown user' : "user $user").' from '.$addr;
$body .= ' at '.date('d/M/Y H:i').' with the following fields:'."\n\n";
$i = 1;
foreach ($vals as $k => $text) {
$name = isset($this->fdd[$k]['name~'])
? $this->fdd[$k]['name~'] : $this->fdd[$k]['name'];
if ($action == 'update') {
if ($old_vals[$k] == $new_vals[$k]) {
continue;
}
$body .= sprintf("[%02s] %s (%s)\n WAS: %s\n IS: %s\n",
$i, $name, $k, $old_vals[$k], $new_vals[$k]);
} else {
$body .= sprintf('[%02s] %s (%s): %s'."\n", $i, $name, $k, $text);
}
$i++;
}
$body .= "\n--\r\n"; // \r is needed for signature separating
$body .= "phpMyEdit\ninstant MySQL table editor and code generator\n";
$body .= "http://platon.sk/projects/phpMyEdit/\n\n";
$subject = @$this->notify['prefix'].$subject.' '.$this->dbp.$this->tb;
$subject = trim($subject); // just for sure
$wrap_w = intval(@$this->notify['wrap']);
$wrap_w > 0 || $wrap_w = 72;
$from = (string) @$this->notify['from'];
$from != '' || $from = 'webmaster@'.strtolower($this->get_server_var('SERVER_NAME'));
$headers = 'From: '.$from."\n".'X-Mailer: PHP/'.phpversion().' (phpMyEdit)';
$body = wordwrap($body, $wrap_w, "\n", 1);
$emails = (array) $this->notify[$action] + (array) $this->notify['all'];
foreach ($emails as $email) {
if (! empty($email)) {
mail(trim($email), $subject, $body, $headers);
}
}
return true;
} /* }}} */
 
/*
* Apply triggers function
* Run a (set of) trigger(s). $trigger can be an Array or a filename
* Break and return false as soon as a trigger return false
* we need a reference on $newvals to be able to change value before insert/update
*/
function exec_triggers($op, $step, $oldvals, &$changed, &$newvals) /* {{{ */
{
if (! isset($this->triggers[$op][$step])) {
return true;
}
$ret = true;
$trig = $this->triggers[$op][$step];
if (is_array($trig)) {
ksort($trig);
for ($t = reset($trig); $t !== false && $ret != false; $t = next($trig)) {
$ret = include($t);
}
} else {
$ret = include($trig);
}
return $ret;
} /* }}} */
 
function exec_triggers_simple($op, $step) /* {{{ */
{
$oldvals = $newvals = $changed = array();
return $this->exec_triggers($op, $step, $oldvals, $changed, $newvals);
} /* }}} */
/*
* Recreate functions
*/
function recreate_fdd($default_page_type = 'L') /* {{{ */
{
// TODO: one level deeper browsing
$this->page_type = $default_page_type;
$this->filter_operation() && $this->page_type = 'F';
$this->view_operation() && $this->page_type = 'V';
if ($this->add_operation()
|| $this->saveadd == $this->labels['Save']
|| $this->moreadd == $this->labels['More']) {
$this->page_type = 'A';
}
if ($this->change_operation()
|| $this->savechange == $this->labels['Save']
|| $this->morechange == $this->labels['Apply']) {
$this->page_type = 'C';
}
if ($this->copy_operation() || $this->savecopy == $this->labels['Save']) {
$this->page_type = 'P';
}
if ($this->delete_operation() || $this->savedelete == $this->labels['Delete']) {
$this->page_type = 'D';
}
// Restore backups (if exists)
foreach (array_keys($this->fdd) as $column) {
foreach (array_keys($this->fdd[$column]) as $col_option) {
if ($col_option[strlen($col_option) - 1] != '~')
continue;
 
$this->fdd[$column][substr($col_option, 0, strlen($col_option) - 1)]
= $this->fdd[$column][$col_option];
unset($this->fdd[$column][$col_option]);
}
}
foreach (array_keys($this->fdd) as $column) {
foreach (array_keys($this->fdd[$column]) as $col_option) {
if (! strchr($col_option, '|')) {
continue;
}
$col_ar = explode('|', $col_option, 2);
if (! stristr($col_ar[1], $this->page_type)) {
continue;
}
// Make field backups
$this->fdd[$column][$col_ar[0] .'~'] = $this->fdd[$column][$col_ar[0]];
$this->fdd[$column][$col_option.'~'] = $this->fdd[$column][$col_option];
// Set particular field
$this->fdd[$column][$col_ar[0]] = $this->fdd[$column][$col_option];
unset($this->fdd[$column][$col_option]);
}
}
} /* }}} */
 
function recreate_displayed() /* {{{ */
{
$field_num = 0;
$num_fields_displayed = 0;
$this->fds = array();
$this->fdn = array();
$this->displayed = array();
$this->guidance = false;
foreach (array_keys($this->fdd) as $key) {
if (preg_match('/^\d+$/', $key)) { // skipping numeric keys
continue;
}
$this->fds[$field_num] = $key;
$this->fdn[$key] = $field_num;
/* We must use here displayed() function, because displayed[] array
is not created yet. We will simultaneously create that array as well. */
if ($this->displayed[$field_num] = $this->displayed($field_num)) {
$num_fields_displayed++;
}
if (is_array(@$this->fdd[$key]['values']) && ! isset($this->fdd[$key]['values']['table'])) {
foreach ($this->fdd[$key]['values'] as $val) {
$this->fdd[$key]['values2'][$val] = $val;
}
unset($this->fdd[$key]['values']);
}
isset($this->fdd[$key]['help']) && $this->guidance = true;
$this->fdd[$field_num] = $this->fdd[$key];
$field_num++;
}
$this->num_fds = $field_num;
$this->num_fields_displayed = $num_fields_displayed;
$this->key_num = array_search($this->key, $this->fds);
/* Adds first displayed column into sorting fields by replacing last
array entry. Also remove duplicite values and change column names to
their particular field numbers.
 
Note that entries like [0]=>'9' [1]=>'-9' are correct and they will
have desirable sorting behaviour. So there is no need to remove them.
*/
$this->sfn = array_unique($this->sfn);
$check_ar = array();
foreach ($this->sfn as $key => $val) {
if (preg_match('/^[-]?\d+$/', $val)) { // skipping numeric keys
$val = abs($val);
if (in_array($val, $check_ar) || $this->password($val)) {
unset($this->sfn[$key]);
} else {
$check_ar[] = $val;
}
continue;
}
if ($val[0] == '-') {
$val = substr($val, 1);
$minus = '-';
} else {
$minus = '';
}
if (($val = array_search($val, $this->fds)) === false || $this->password($val)) {
unset($this->sfn[$key]);
} else {
$val = intval($val);
if (in_array($val, $check_ar)) {
unset($this->sfn[$key]);
} else {
$this->sfn[$key] = $minus.$val;
$check_ar[] = $val;
}
}
}
$this->sfn = array_unique($this->sfn);
return true;
} /* }}} */
 
function backward_compatibility() /* {{{ */
{
foreach (array_keys($this->fdd) as $column) {
// move ['required'] to ['js']['required']
if (! isset($this->fdd[$column]['js']['required']) && isset($this->fdd[$column]['required'])) {
$this->fdd[$column]['js']['required'] = $this->fdd[$column]['required'];
}
// move 'HWR' flags from ['options'] into ['input']
if (isset($this->fdd[$column]['options'])) {
stristr($this->fdd[$column]['options'], 'H') && $this->fdd[$column]['input'] .= 'H';
stristr($this->fdd[$column]['options'], 'W') && $this->fdd[$column]['input'] .= 'W';
stristr($this->fdd[$column]['options'], 'R') && $this->fdd[$column]['input'] .= 'R';
}
}
} /* }}} */
 
/*
* Error handling function
*/
function error($message, $additional_info = '') /* {{{ */
{
echo '<h1>phpMyEdit error: ',htmlspecialchars($message),'</h1>',"\n";
if ($additional_info != '') {
echo '<hr />',htmlspecialchars($additional_info);
}
return false;
} /* }}} */
 
/*
* Database connection function
*/
function connect() /* {{{ */
{
if (isset($this->dbh)) {
return true;
}
if (!isset($this->db)) {
$this->error('no database defined');
return false;
}
if (!isset ($this->tb)) {
$this->error('no table defined');
return false;
}
$this->dbh = @ini_get('allow_persistent')
? @mysql_pconnect($this->hn, $this->un, $this->pw)
: @mysql_connect($this->hn, $this->un, $this->pw);
if (!$this->dbh) {
$this->error('could not connect to MySQL');
return false;
}
return true;
} /* }}} */
 
/*
* Database disconnection function
*/
function disconnect() /* {{{ */
{
if ($this->close_dbh) {
@mysql_close($this->dbh);
$this->dbh = null;
}
} /* }}} */
 
/*
* The workhorse
*/
function execute() /* {{{ */
{
// DEBUG - uncomment to enable
/*
//phpinfo();
$this->print_get_vars();
$this->print_post_vars();
$this->print_vars();
echo "<pre>query opts:\n";
echo print_r($this->query_opts);
echo "</pre>\n";
echo "<pre>get vars:\n";
echo print_r($this->get_opts);
echo "</pre>\n";
*/
 
// Let's do explicit quoting - it's safer
set_magic_quotes_runtime(0);
// Checking if language file inclusion was successful
if (! is_array($this->labels)) {
$this->error('could not locate language files', 'searched path: '.$this->dir['lang']);
return false;
}
// Database connection
if ($this->connect() == false) {
return false;
}
 
/*
* ======================================================================
* Pass 3: process any updates generated if the user has selected
* a save or cancel button during Pass 2
* ======================================================================
*/
// Cancel button - Cancel Triggers
if ($this->add_canceled() || $this->copy_canceled()) {
$this->exec_triggers_simple('insert', 'cancel');
}
if ($this->view_canceled()) {
$this->exec_triggers_simple('select', 'cancel');
}
if ($this->change_canceled()) {
$this->exec_triggers_simple('update', 'cancel');
}
if ($this->delete_canceled()) {
$this->exec_triggers_simple('delete', 'cancel');
}
// Save/More Button - database operations
if ($this->saveadd == $this->labels['Save'] || $this->savecopy == $this->labels['Save']) {
$this->add_enabled() && $this->do_add_record();
unset($this->saveadd);
unset($this->savecopy);
$this->recreate_fdd();
}
elseif ($this->moreadd == $this->labels['More']) {
$this->add_enabled() && $this->do_add_record();
$this->operation = $this->labels['Add']; // to force add operation
$this->recreate_fdd();
$this->recreate_displayed();
$this->backward_compatibility();
}
elseif ($this->savechange == $this->labels['Save']) {
$this->change_enabled() && $this->do_change_record();
unset($this->savechange);
$this->recreate_fdd();
}
elseif ($this->morechange == $this->labels['Apply']) {
$this->change_enabled() && $this->do_change_record();
$this->operation = $this->labels['Change']; // to force change operation
$this->recreate_fdd();
$this->recreate_displayed();
$this->backward_compatibility();
}
elseif ($this->savedelete == $this->labels['Delete']) {
$this->delete_enabled() && $this->do_delete_record();
unset($this->savedelete);
$this->recreate_fdd();
}
 
/*
* ======================================================================
* Pass 2: display an input/edit/confirmation screen if the user has
* selected an editing button on Pass 1 through this page
* ======================================================================
*/
if ($this->add_operation()
|| $this->change_operation() || $this->delete_operation()
|| $this->view_operation() || $this->copy_operation()) {
$this->display_record();
}
 
/*
* ======================================================================
* Pass 1 and Pass 3: display the MySQL table in a scrolling window on
* the screen (skip this step in 'Add More' mode)
* ======================================================================
*/
else {
$this->list_table();
}
 
$this->disconnect();
if ($this->display['time'] && $this->timer != null) {
echo $this->timer->end(),' miliseconds';
}
} /* }}} */
 
/*
* Class constructor
*/
function phpMyEdit($opts) /* {{{ */
{
// Set desirable error reporting level
$error_reporting = error_reporting(E_ALL & ~E_NOTICE);
// Database handle variables
if (isset($opts['dbh'])) {
$this->close_dbh = false;
$this->dbh = $opts['dbh'];
$this->dbp = '';
} else {
$this->close_dbh = true;
$this->dbh = null;
$this->dbp = $opts['db'].'.';
$this->hn = $opts['hn'];
$this->un = $opts['un'];
$this->pw = $opts['pw'];
$this->db = $opts['db'];
}
$this->tb = $opts['tb'];
// Other variables
$this->key = $opts['key'];
$this->key_type = $opts['key_type'];
$this->inc = $opts['inc'];
$this->options = $opts['options'];
$this->fdd = $opts['fdd'];
$this->multiple = intval($opts['multiple']);
$this->multiple <= 0 && $this->multiple = 2;
$this->filters = @$opts['filters'];
$this->triggers = @$opts['triggers'];
$this->notify = @$opts['notify'];
$this->logtable = @$opts['logtable'];
$this->page_name = @$opts['page_name'];
if (! isset($this->page_name)) {
$this->page_name = basename($this->get_server_var('PHP_SELF'));
isset($this->page_name) || $this->page_name = $this->tb;
}
$this->display['query'] = @$opts['display']['query'];
$this->display['sort'] = @$opts['display']['sort'];
$this->display['time'] = @$opts['display']['time'];
if ($this->display['time']) {
$this->timer = new phpMyEdit_timer();
}
$this->display['tabs'] = isset($opts['display']['tabs'])
? $opts['display']['tabs'] : true;
$this->display['form'] = isset($opts['display']['form'])
? $opts['display']['form'] : true;
$this->display['num_records'] = isset($opts['display']['num_records'])
? $opts['display']['num_records'] : true;
$this->display['num_pages'] = isset($opts['display']['num_pages'])
? $opts['display']['num_pages'] : true;
// Creating directory variables
$this->dir['root'] = dirname(realpath(__FILE__))
. (strlen(dirname(realpath(__FILE__))) > 0 ? '/' : '');
$this->dir['lang'] = $this->dir['root'].'lang/';
// Creating URL variables
$this->url['images'] = 'images/';
isset($opts['url']['images']) && $this->url['images'] = $opts['url']['images'];
// CSS classes policy
$this->css = @$opts['css'];
!isset($this->css['separator']) && $this->css['separator'] = '-';
!isset($this->css['prefix']) && $this->css['prefix'] = 'pme';
!isset($this->css['page_type']) && $this->css['page_type'] = false;
!isset($this->css['position']) && $this->css['position'] = false;
!isset($this->css['divider']) && $this->css['divider'] = 2;
$this->css['divider'] = intval(@$this->css['divider']);
// JS overall configuration
$this->js = @$opts['js'];
!isset($this->js['prefix']) && $this->js['prefix'] = 'PME_js_';
// DHTML overall configuration
$this->dhtml = @$opts['dhtml'];
!isset($this->dhtml['prefix']) && $this->dhtml['prefix'] = 'PME_dhtml_';
// Navigation
$this->navigation = @$opts['navigation'];
if (! $this->nav_buttons() && ! $this->nav_text_links() && ! $this->nav_graphic_links()) {
$this->navigation .= 'B'; // buttons are default
}
if (! $this->nav_up() && ! $this->nav_down()) {
$this->navigation .= 'D'; // down position is default
}
$this->buttons = $opts['buttons'];
// Language labels (must go after navigation)
$this->labels = $this->make_language_labels(isset($opts['language'])
? $opts['language'] : $this->get_server_var('HTTP_ACCEPT_LANGUAGE'));
// CGI variables
$this->cgi = @$opts['cgi'];
$this->cgi['persist'] = '';
if (@is_array($opts['cgi']['persist'])) {
foreach ($opts['cgi']['persist'] as $key => $val) {
if (is_array($val)) {
foreach($val as $key2 => $val2) {
$this->cgi['persist'] .= '&'.rawurlencode($key)
.'['.rawurlencode($key2).']='.rawurlencode($val2);
}
} else {
$this->cgi['persist'] .= '&'.rawurlencode($key).'='.rawurlencode($val);
}
}
}
foreach (array('operation', 'sys', 'data') as $type) {
if (! isset($this->cgi['prefix'][$type])) {
$this->cgi['prefix'][$type] = $this->get_default_cgi_prefix($type);
}
}
// Sorting variables
$this->sfn = $this->get_sys_cgi_var('sfn');
isset($this->sfn) || $this->sfn = array();
is_array($this->sfn) || $this->sfn = array($this->sfn);
isset($opts['sort_field']) || $opts['sort_field'] = array();
is_array($opts['sort_field']) || $opts['sort_field'] = array($opts['sort_field']);
$this->sfn = array_merge($this->sfn, $opts['sort_field']);
// Form variables all around
$this->fl = intval($this->get_sys_cgi_var('fl'));
$this->fm = intval($this->get_sys_cgi_var('fm'));
// $old_page = ceil($this->fm / abs($this->inc)) + 1;
$this->qfn = $this->get_sys_cgi_var('qfn');
$this->sw = $this->get_sys_cgi_var('sw');
$this->rec = $this->get_sys_cgi_var('rec', '');
$this->navop = $this->get_sys_cgi_var('navop');
$navfmup = $this->get_sys_cgi_var('navfmup');
$navfmdown = $this->get_sys_cgi_var('navfmdown');
$navpnup = $this->get_sys_cgi_var('navpnup');
$navpndown = $this->get_sys_cgi_var('navpndown');
if($navfmdown!=NULL && $navfmdown != $this->fm) $this->navfm = $navfmdown;
elseif($navfmup!=NULL && $navfmup != $this->fm) $this->navfm = $navfmup;
elseif($navpndown!=NULL && ($navpndown-1)*$this->inc != $this->fm) $this->navfm = ($navpndown-1)*$this->inc;
elseif($navpnup!=NULL && ($navpnup-1)*$this->inc != $this->fm) $this->navfm = ($navpnup-1)*$this->inc;
else $this->navfm = $this->fm;
$this->operation = $this->get_sys_cgi_var('operation');
$oper_prefix_len = strlen($this->cgi['prefix']['operation']);
if (! strncmp($this->cgi['prefix']['operation'], $this->operation, $oper_prefix_len)) {
$this->operation = $this->labels[substr($this->operation, $oper_prefix_len)];
}
$this->saveadd = $this->get_sys_cgi_var('saveadd');
$this->moreadd = $this->get_sys_cgi_var('moreadd');
$this->canceladd = $this->get_sys_cgi_var('canceladd');
$this->savechange = $this->get_sys_cgi_var('savechange');
$this->morechange = $this->get_sys_cgi_var('morechange');
$this->cancelchange = $this->get_sys_cgi_var('cancelchange');
$this->savecopy = $this->get_sys_cgi_var('savecopy');
$this->cancelcopy = $this->get_sys_cgi_var('cancelcopy');
$this->savedelete = $this->get_sys_cgi_var('savedelete');
$this->canceldelete = $this->get_sys_cgi_var('canceldelete');
$this->cancelview = $this->get_sys_cgi_var('cancelview');
// Filter setting
if (isset($this->sw)) {
$this->sw == $this->labels['Search'] && $this->fl = 1;
$this->sw == $this->labels['Hide'] && $this->fl = 0;
//$this->sw == $this->labels['Clear'] && $this->fl = 0;
}
// TAB names
$this->tabs = array();
// Setting key_delim according to key_type
if ($this->key_type == 'real') {
/* If 'real' key_type does not work,
try change MySQL datatype from float to double */
$this->rec = doubleval($this->rec);
$this->key_delim = '';
} elseif ($this->key_type == 'int') {
$this->rec = intval($this->rec);
$this->key_delim = '';
} else {
$this->key_delim = '"';
// $this->rec remains unmodified
}
// Specific $fdd modifications depending on performed action
$this->recreate_fdd();
// Extract SQL Field Names and number of fields
$this->recreate_displayed();
// Issue backward compatibility
$this->backward_compatibility();
// Gathering query options
$this->gather_query_opts();
// Call to action
!isset($opts['execute']) && $opts['execute'] = 1;
$opts['execute'] && $this->execute();
// Restore original error reporting level
error_reporting($error_reporting);
} /* }}} */
 
}
 
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
 
?>
/tags/v1.1-andromede/jrest/util/extensions/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,40,51
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-messages.class.php
New file
0,0 → 1,329
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-messages.class.php - phpMyEdit messages extension
* ____________________________________________________________
*
* Developed by Ondrej Jombik <nepto@platon.sk>
* Copyright (c) 2002-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/extensions/phpMyEdit-messages.class.php,v 1.15 2006-06-17 11:14:54 nepto Exp $ */
 
/* This extension is part of phpMyEzin: Content Management System project,
where it handles discussion messages for particular articles. It depends on
some phpMyEzin characteristics, thus extension should not and cannot be used
outside this project. However there are planned some improvements for future
to make this extension handle any kind of tree-structured data. */
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_messages extends phpMyEdit
{
function phpMyEdit_messages($opts) /* {{{ */
{
$execute = 1;
isset($opts['execute']) && $execute = $opts['execute'];
$opts['execute'] = 0;
parent::phpMyEdit($opts);
$this->tb2 = $opts['tb2'];
$this->format_date = $opts['format_date'];
/* Preserved article ID in CGI environment. */
/* TODO: change to $this->article_id or something like this */
global $ezin_admin_article;
$ezin_admin_article = $this->get_data_cgi_var('article_id');
 
$execute && $this->execute();
} /* }}} */
 
function list_table() /* {{{ */
{
$ezin_admin_article_change_up = $this->get_sys_cgi_var('ezin_admin_article_change_up');
$ezin_admin_article_change_down = $this->get_sys_cgi_var('ezin_admin_article_change_down');
if (isset($ezin_admin_article_change_up)) {
$ezin_admin_article = $this->get_sys_cgi_var('ezin_admin_article_up');
} elseif (isset($ezin_admin_article_change_down)) {
$ezin_admin_article = $this->get_sys_cgi_var('ezin_admin_article_down');
}
!isset($ezin_admin_article) && $ezin_admin_article = $this->get_data_cgi_var('article_id');
$ezin_admin_article = intval($ezin_admin_article);
$query = sprintf('SELECT article_id, count(id) AS messages FROM %s'
.' GROUP BY article_id HAVING article_id = %d',
$this->tb, intval($ezin_admin_article));
if (($result = $this->myquery($query)) == false) {
return false;
}
$row = @mysql_fetch_array($result, MYSQL_ASSOC);
//$ezin_admin_article = intval($row['article_id']);
$ezin_admin_msgcount = intval($row['messages']);
@mysql_free_result($result);
 
echo '<form class="',$this->getCSSclass('form');
echo '" action="',$page_name,'" method="POST">',"\n";
 
if ($this->nav_up() || $ezin_admin_article <= 0) {
$this->message_nav_buttons($ezin_admin_article, $ezin_admin_msgcount, 'up');
echo '<hr class="',$this->getCSSclass('hr', 'up'),'">',"\n";
}
 
if ($ezin_admin_article > 0) {
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
echo '<tr class="',$this->getCSSclass('header'),'">',"\n";
foreach (array('ID', 'Subject', ' ', 'Author', 'Date & Time', 'IP addresses') as $str) {
echo '<th class="',$this->getCSSclass('header'),'">';
echo Platon::htmlspecialchars2($str),'</th>',"\n";
}
echo '</tr>',"\n";
echo '<tr class="',$this->getCSSclass('header'),'">',"\n";
echo '<th class="',$this->getCSSclass('header'),'" colspan="6">';
echo 'Valid messages</td></tr>',"\n";
$message_ids = $this->message_process($ezin_admin_article, 0, 0);
$count_message_ids = count($message_ids);
if ($count_message_ids == 0) {
echo '<tr class="',$this->getCSSclass('row', null, 'next'),'">',"\n";
echo '<td class="',$this->getCSSclass('cell', null, true),'" colspan="6">',"\n";
echo '<i>There are no valid messages for this article.</i>';
echo '</td></tr>',"\n";
}
$query = sprintf('SELECT id, parent, article_id, author,'
.' email, homepage, subject, datetime, ip'
.' FROM %s WHERE article_id = %d ORDER BY datetime ASC',
$this->tb, intval($ezin_admin_article));
if (($result = $this->myquery($query)) == false) {
return false;
}
$all_ids = array();
$parents = array();
for ($i = 0; ($row = @mysql_fetch_array($result, MYSQL_ASSOC)); $i++) {
$all_ids[] = $row['id'];
$parents[$row['id']] = $row['parent'];
}
@mysql_free_result($result);
$all_ids = array_diff($all_ids, $message_ids);
echo '<tr class="',$this->getCSSclass('header'),'">',"\n";
echo '<th class="',$this->getCSSclass('header'),'" colspan="6">';
echo 'Invalid messages</td></tr>',"\n";
if (count($all_ids) > 0) {
/* To force buttons */
$count_message_ids = -1;
while (count($all_ids) > 0) {
//echo "<p>all_ids: "; var_dump($all_ids);echo '<br>';
$sub_ids = $this->message_process($ezin_admin_article,
$parents[array_shift($all_ids)], 0, true);
$all_ids = array_diff($all_ids, $sub_ids);
}
} else {
echo '<tr class="',$this->getCSSclass('row', null, 'next'),'">',"\n";
echo '<td class="',$this->getCSSclass('cell', null, true),'" colspan="6">',"\n";
echo '<i>There are no invalid messages for this article.</i>';
echo '</td></tr>',"\n";
}
echo '</table>';
}
if ($this->nav_down() && $ezin_admin_article > 0) {
echo '<hr class="',$this->getCSSclass('hr', 'down'),'">',"\n";
$this->message_nav_buttons($ezin_admin_article, $ezin_admin_msgcount, 'down');
}
echo $this->htmlHiddenData('article_id', $ezin_admin_article);
echo '</form>',"\n";
} /* }}} */
 
function message_process($article_id, $id, $level = 0, $parent = true) /* {{{ */
{
$id = intval($id);
$level = intval($level);
$query = sprintf('SELECT id, parent, article_id, author,'
.' email, homepage, subject, datetime, ip'
.' FROM %s WHERE %s = %d AND article_id = %d'
.' ORDER BY datetime ASC', $this->tb,
$parent == true ? 'parent' : 'id', intval($id), intval($article_id));
if (($result = $this->myquery($query)) == false) {
return false;
}
 
$ar = array();
$ar_out = array();
for ($i = 0; ($row = @mysql_fetch_array($result, MYSQL_ASSOC)); $i++) {
$ar[$i] = $row;
$ar_out[] = $row['id'];
}
$checked = ! $level && $parent ? ' checked' : '';
for ($i = 0; $i < count($ar); $i++) {
echo '<tr class="',$this->getCSSclass('row', null, 'next'),'">',"\n";
$css_class_name = $this->getCSSclass('cell', null, true);
$css_class_name2 = $this->getCSSclass('navigation', null, true);
echo '<td class="',$css_class_name,'">',$ar[$i]['id'],'</td>',"\n";
echo '<td class="',$css_class_name,'">';
for ($j = 0; $j < $level; $j++) {
echo '&nbsp;&nbsp;&nbsp;';
}
echo htmlspecialchars($ar[$i]['subject']);
echo '</td>',"\n";
echo '<td class="',$css_class_name2,'">';
echo '<input',$checked,' class="',$css_class_name2,'"';
echo ' type="radio" ','name="',$this->cgi['prefix']['sys'],'rec"';
echo ' value="',$ar[$i]['id'],'" class="link"></td>',"\n";
echo '<td class="',$css_class_name,'">',htmlspecialchars($ar[$i]['author']), '</td>';
echo '<td class="',$css_class_name,'">',htmlspecialchars($ar[$i]['datetime']),'</td>';
// TODO: do resolving
echo '<td class="',$css_class_name,'"><small>';
// this shoud be global IP-adress-deliminator
$output = false;
$ar_ip = preg_split('|([ ]*[ \\/,;]+[ ]*)|', $ar[$i]['ip'], -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($ar_ip as $ip) {
if (strlen($output) > 0) {
$output = true;
}
$ip = htmlspecialchars($ip);
if (preg_match('/^(\d{1,3}\.){3}\d{1,3}$/', $ip)) {
echo '<a class="',$css_class_name,'" target="_blank" href="http://',$ip,'">';
echo '<small>',$ip,'</small></a>';
} else {
echo $ip;
}
}
if (! $output) {
echo '&nbsp;';
}
echo '</small></td>',"\n";
echo '</tr>',"\n";
if ($parent) {
$ar_out = array_merge($ar_out, $this->message_process(
$article_id, $ar[$i]['id'], $level + 1));
}
strlen($checked) && $checked = '';
}
return $ar_out;
} /* }}} */
 
function message_nav_buttons($article_id, $messages_count, $position) /* {{{ */
{
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
$this->print_article_select($article_id, 0, $position);
echo '</td>',"\n";
echo '<td class="',$this->getCSSclass('buttons2', $position),'">',"\n";
if ($article_id > 0) {
if ($this->add_enabled()) {
echo $this->htmlSubmit('operation', 'Add', $this->getCSSclass('add', $position), false, false);
}
if ($this->view_enabled()) {
echo '&nbsp;';
echo $this->htmlSubmit('operation', 'View', $this->getCSSclass('view', $position),
false, $messages_count <= 0);
}
if ($this->change_enabled()) {
echo '&nbsp;';
echo $this->htmlSubmit('operation', 'Change', $this->getCSSclass('change', $position),
false, $messages_count <= 0);
}
if ($this->delete_enabled()) {
echo '&nbsp;';
echo $this->htmlSubmit('operation', 'Delete', $this->getCSSclass('delete', $position),
false, $messages_count <= 0);
}
}
echo '</td></tr></table>',"\n";
} /* }}} */
 
function display_record_buttons() /* {{{ */
{
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
$this->print_article_select($article_id, 1, $position);
echo '</td>',"\n";
if (strlen(@$this->message) > 0) {
echo '<td class="',$this->getCSSclass('message', $position),'">',$this->message,'</td>',"\n";
}
echo '<td class="',$this->getCSSclass('buttons2', $position),'">',"\n";
if ($this->change_operation()) {
echo $this->htmlSubmit('savechange', 'Save', $this->getCSSclass('save', $position), true), '&nbsp;';
echo $this->htmlSubmit('morechange', 'Apply', $this->getCSSclass('more', $position), true), '&nbsp;';
echo $this->htmlSubmit('cancelchange', 'Cancel', $this->getCSSclass('cancel', $position), false);
} elseif ($this->add_operation()) {
echo $this->htmlSubmit('saveadd', 'Save', $this->getCSSclass('save', $position), true), '&nbsp;';
echo $this->htmlSubmit('moreadd', 'More', $this->getCSSclass('more', $position), true), '&nbsp;';
echo $this->htmlSubmit('canceladd', 'Cancel', $this->getCSSclass('cancel', $position), false);
} elseif ($this->delete_operation()) {
echo $this->htmlSubmit('savedelete', 'Delete', $this->getCSSclass('save', $position), false), '&nbsp;';
echo $this->htmlSubmit('canceldelete', 'Cancel', $this->getCSSclass('cancel', $position), false);
} elseif ($this->view_operation()) {
if ($this->change_enabled()) {
echo $this->htmlSubmit('operation', 'Change', $this->getCSSclass('save', $position), false), '&nbsp;';
}
echo $this->htmlSubmit('cancelview', 'Cancel', $this->getCSSclass('cancel', $position), false);
}
// Message is now written here
echo '</td>',"\n";
echo '</tr></table>',"\n";
} /* }}} */
 
function print_article_select($selected_id, $disabled, $position) /* {{{ */
{
if ($selected_id <= 0) {
$rec = intval($this->get_sys_cgi_var('rec'));
if ($rec > 0) {
$query = sprintf('SELECT article_id FROM %s WHERE id = %d',
$this->tb, $rec);
$result = $this->myquery($query);
if ($result != false) {
$row = @mysql_fetch_array($result, MYSQL_NUM);
$selected_id = $row[0];
}
@mysql_free_result($result);
}
}
static $articles = null;
if ($articles == null) {
$articles = array();
$query = 'SELECT id, title, atitle, UNIX_TIMESTAMP(datetime) AS date'
.' FROM '.$this->tb2
.' ORDER BY date DESC';
if (($result = $this->myquery($query)) == false) {
return false;
}
for ($k = 0; ($row = @mysql_fetch_array($result, MYSQL_ASSOC)); $k++) {
$articles[] = $row;
}
@mysql_free_result($result);
}
echo '<select',($disabled ? ' disabled' : ''),' name="';
echo $this->cgi['prefix']['sys'].'ezin_admin_article_',$position,'" size="1">',"\n";
echo '<option value="0">-- Choose article --</option>',"\n";
foreach ($articles as $row) {
$row['title'] = empty($row['title']) ? $row['atitle'] : $row['title'];
$row['title'] = Platon::pretty_substr(strip_tags($row['title']), 40);
echo '<option'.($selected_id == $row['id'] ? ' selected' : '');
echo ' value="',$row['id'],'">',$row['title'];
if ($row['date'] > 0) {
printf(' [%d] (%s)', $row['id'], date($this->format_date, $row['date']));
}
echo '</option>',"\n";
}
echo '</select>',"\n";
if (! $disabled) {
echo $this->htmlSubmit('ezin_admin_article_change_'.$position, ' &gt; ', $this->get_sys_cgi_var('change', $position)), '&nbsp;', "\n";
}
return true;
} /* }}} */
 
}
 
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
 
?>
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-report.class.php
New file
0,0 → 1,319
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-report.class.php - phpMyEdit report extension
* ____________________________________________________________
*
* Developed by Ondrej Jombik <nepto@platon.sk>
* Copyright (c) 2002-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/extensions/phpMyEdit-report.class.php,v 1.12 2006-01-22 21:44:23 nepto Exp $ */
 
/* Extension TODO:
 
- allow user to enable/disable particular field in reporting (maybe 'X' flag
for indicating that field is forbidden is good idea)
- support for ['help'] in select fields screen
- make extension's option for selecting "Select fields" link or button
*/
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_report extends phpMyEdit
{
 
function phpMyEdit_report($opts) /* {{{ */
{
$opts['options'] = 'L';
$execute = 1;
isset($opts['execute']) && $execute = $opts['execute'];
$opts['execute'] = 0;
parent::phpMyEdit($opts);
$execute && $this->execute();
} /* }}} */
 
function make_language_labels($language) /* {{{ */
{
$ret = parent::make_language_labels($language);
strlen($ret['Make report']) <= 0 && $ret['Make report'] = 'Make report';
strlen($ret['Select fields']) <= 0 && $ret['Select fields'] = 'Select fields';
strlen($ret['Records per screen']) <= 0 && $ret['Records per screen'] = 'Records per screen';
return $ret;
} /* }}} */
 
function get_cgi_cookie_var($name, $default_value = null) /* {{{ */
{
$ret = $this->get_cgi_var($name, null);
if ($ret === null) {
global $HTTP_COOKIE_VARS;
$ret = @$HTTP_COOKIE_VARS[$name.'_'.$this->tb.'_cookie'];
if (! isset($ret)) {
$ret = $default_value;
}
}
return $ret;
} /* }}} */
 
function display_list_table_buttons($total_recs, $position) /* {{{ */
{ /* This is mostly copy/paste from core class. */
$listall = $this->inc <= 0; // Are we doing a listall?
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo '<input class="',$this->getCSSclass('fields-select', $position);
echo '" type="submit" name="fields_select" value="',$this->labels['Select fields'],'">&nbsp;';
// Note that <input disabled isn't valid HTML, but most browsers support it
$disabled = ($this->fm > 0 && ! $listall) ? '' : ' disabled';
echo '<input',$disabled,' class="',$this->getCSSclass('prev', $position);
echo '" type="submit" name="',ltrim($disabled),'prev" value="',$this->labels['Prev'],'">&nbsp;';
$disabled = ($this->fm + $this->inc < $total_recs && ! $listall) ? '' : ' disabled';
echo '<input',$disabled,' class="',$this->getCSSclass('next', $position);
echo '" type="submit" name="',ltrim($disabled),'next" value="',$this->labels['Next'],'">';
// Message is now written here
echo '</td>',"\n";
if (strlen(@$this->message) > 0) {
echo '<td class="',$this->getCSSclass('message', $position),'">',$this->message,'</td>',"\n";
}
// Display page and records statistics
echo '<td class="',$this->getCSSclass('stats', $position),'">',"\n";
if ($listall) {
echo $this->labels['Page'],':&nbsp;1&nbsp;',$this->labels['of'],'&nbsp;1';
} else {
echo $this->labels['Page'],':&nbsp;',($this->fm / $this->inc) + 1;
echo '&nbsp;',$this->labels['of'],'&nbsp;',max(1, ceil($total_recs / abs($this->inc)));
}
echo '&nbsp; ',$this->labels['Records'],':&nbsp;',$total_recs;
echo '</td></tr></table>',"\n";
} /* }}} */
 
function display_report_selection_buttons($position) /* {{{ */
{
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo '<input class="',$this->getCSSclass('make-report', $position);
echo '" type="submit" name="prepare_filter" value="',$this->labels['Make report'],'">',"\n";
echo '</td></tr></table>',"\n";
} /* }}} */
 
function get_select_fields_link() /* {{{ */
{
$link = '<a href="'.htmlspecialchars($this->page_name).'?fields_select=1';
for ($i = 0; $i < count($table_cols); $i++) {
$varname = 'qf'.$i;
$value = $this->get_cgi_cookie_var($varname);
if (! empty($value)) {
$link .= htmlspecialchars(
'&'.rawurlencode($varname).
'='.rawurlencode($value));
}
}
$link .= htmlspecialchars($this->cgi['persist']);
$link .= '">'.$this->labels['Select fields'].'</a>';
return $link;
} /* }}} */
 
function execute() /* {{{ */
{
global $HTTP_GET_VARS;
global $HTTP_POST_VARS;
 
/*
* Extracting field names
*/
 
$table_cols = array();
$all_table_cols = array();
 
if ($this->connect() == false) {
return false;
}
$query_parts = array(
'type' => 'select',
'select' => '*',
'from' => $this->tb,
'limit' => '1');
$result = $this->myquery($this->get_SQL_query($query_parts), __LINE__);
$all_table_cols = array_keys(@mysql_fetch_array($result, MYSQL_ASSOC));
if (count($all_table_cols) <= 0) {
$this->error('database fetch error');
return false;
}
foreach (array_keys($this->fdd) as $field_name) {
if (preg_match('/^\d*$/', $field_name))
continue;
if (($idx = array_search($field_name, $all_table_cols)) !== false)
$table_cols[$field_name] = mysql_field_len($result, $idx);
}
@mysql_free_result($result);
unset($all_table_cols);
 
/*
* Preparing variables
*/
 
$fields_select = $this->get_cgi_var('fields_select');
$filter = $this->get_cgi_var('filter');
$prepare_filter = $this->get_cgi_var('prepare_filter');
$this->inc = intval($this->get_cgi_cookie_var('inc'));
$force_select = true;
$none_displayed = true;
$expire_time = time() + (3600 * 24 * 30 * 12 * 5); // five years
$headers_sent = @headers_sent();
 
foreach (array_merge(array('@inc'), array_keys($table_cols)) as $col) {
$varname = ($col[0] == '@' ? substr($col, 1) : 'have_'.$col);
if (isset($HTTP_POST_VARS[$varname]) || isset($HTTP_GET_VARS[$varname])) {
$value = $HTTP_POST_VARS[$varname];
if (isset($HTTP_GET_VARS[$varname])) {
$value = $HTTP_GET_VARS[$varname];
}
if ($varname != 'inc' && ! empty($value)) {
$force_select = false;
}
$headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', $value, $expire_time);
$this->cgi['persist'] .= '&'.urlencode($varname);
$this->cgi['persist'] .= '='.urlencode($value);
} else {
$headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', '', time() - 10000);
}
}
 
$i = -1;
foreach (array_keys($this->fdd) as $key) {
$i++;
if (preg_match('/^\d*$/', $key))
continue;
$varname = 'have_'.$key;
$value = @$this->get_cgi_cookie_var($varname, '');
$options = @$value ? 'LV' : '';
$this->fdd[$i]['options'] = $options;
$this->fdd[$key]['options'] = $options;
$this->displayed[$i] = @$value ? true : false;
$value && $none_displayed = false;
}
 
/*
* Redirecting when neccessary
* (hackity hack with unregistering/unchecking fields)
*/
 
if ($prepare_filter && ! $headers_sent) {
$this->execute_redirect();
exit;
}
 
/*
* Check if field selection report screen has to be displayed
*/
 
if (isset($fields_select) || $force_select || $none_displayed) {
$this->execute_report_screen($table_cols);
return true;
}
 
if (0) {
$this->message .= $this->get_select_fields_link();
}
 
// parent class call
return parent::execute();
} /* }}} */
 
function execute_redirect() /* {{{ */
{
global $HTTP_SERVER_VARS;
global $HTTP_GET_VARS;
global $HTTP_POST_VARS;
$redirect_url = 'http://'.$HTTP_SERVER_VARS['HTTP_HOST'].$HTTP_SERVER_VARS['SCRIPT_NAME'];
$delim = '?';
foreach ($HTTP_POST_VARS + $HTTP_GET_VARS as $cgi_var_name => $cgi_var_value) {
$cgi_var_name == 'prepare_filter' && $cgi_var_name = 'filter';
$redirect_url .= $delim;
$redirect_url .= rawurlencode($cgi_var_name).'='.rawurlencode($cgi_var_value);
$delim == '?' && $delim = '&';
}
$redirect_url .= $this->cgi['persist'];
header('Location: '.$redirect_url);
exit;
} /* }}} */
 
function execute_report_screen($table_cols) /* {{{ */
{
echo '<form class="',$this->getCSSclass('form'),'" action="';
echo htmlspecialchars($this->page_name),'" method="POST">',"\n";
if ($this->nav_up()) {
$this->display_report_selection_buttons('up');
echo '<hr class="',$this->getCSSclass('hr', 'up'),'">',"\n";
}
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
 
$i = 0;
foreach ($table_cols as $key => $val) {
$css_postfix = @$this->fdd[$key]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
$varname = 'have_'.$key;
$value = $this->get_cgi_cookie_var($varname);
$checked = @$value ? ' checked' : '';
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$i]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('check', null, true, $css_postfix),'">';
echo '<input class="',$css_class_name,'" type="checkbox" name="';
echo htmlspecialchars($varname),'"',$checked,'>';
echo '</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($key),">\n";
$varname = 'qf'.$i;
$value = $this->get_cgi_cookie_var($varname);
if ($this->fdd[$key]['select'] == 'D' || $this->fdd[$key]['select'] == 'M') {
$from_table = ! $this->col_has_values($key) || isset($this->fdd[$key]['values']['table']);
$selected = $value;
$value = $this->set_values($key, array('*' => '*'), null, $from_table);
$multiple = $this->col_has_multiple_select($key);
$multiple |= $this->fdd[$key]['select'] == 'M';
$readonly = false;
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($varname.'_id', $css_class_name, $value, $selected,
$multiple, $readonly, $strip_tags, $escape);
} else {
echo '<input class="',$css_class_name,'" type=text name="';
echo htmlspecialchars($varname),'" value="',htmlspecialchars($value),'" size="';
echo min(40, $val),'" maxlength="',min(40, max(10, $val)),'">';
}
echo '</td>',"\n",'</tr>',"\n";
$i++;
}
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'" colspan="2">';
echo $this->labels['Records per screen'],'</td>';
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'">';
echo '<input class="',$css_class_name,'" type="text" name="inc" value="',$this->inc.'">';
echo '</td></tr>',"\n";
echo '</table>',"\n";
if ($this->nav_down()) {
echo '<hr class="',$this->getCSSclass('hr', 'down'),'">',"\n";
$this->display_report_selection_buttons('down');
}
echo '</form>';
} /* }}} */
 
}
 
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
 
?>
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-htmlarea.class.php
New file
0,0 → 1,209
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-htmlarea.class.php - phpMyEdit htmlArea extension
* ____________________________________________________________
*
* Contribution of Ezudin Kurtowich <ekurtovic@ieee.org>, Sarajevo
* Copyright (c) 2003-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/extensions/phpMyEdit-htmlarea.class.php,v 1.10 2006-01-22 21:44:18 nepto Exp $ */
 
/*
OVERVIEW
--------
 
NOTE...This extension will not work with the CVS version of PME. It has
been replaced by the mce_cal extension.
htmlArea is a free WYSIWYG textarea replacement from
http://www.interactivetools.com/ website.
 
REQUIREMENTS
------------
The extension requires a properly installed htmlArea script
as described on the http://www.interactivetools.com/ site.
 
USAGE
-----
 
This extension enables WYSIWYG editing of a textarea field.
In order to use it, you should:
1. Load htmlArea script in the <head>...</head> section of your
phpMyEdit calling program as described in the htmlarea manual.
NOTE: To avoid an unwanted side effect in css style produced
by phpMyEditSetup.php, delete 'table-width:100%' property.
 
2. Call to phpMyEdit-htmlarea.class.php instead
of phpMyEdit.class.php.
 
Example:
 
require_once 'extensions/phpMyEdit-htmlarea.class.php';
new phpMyEdit_htmlarea($opts);
 
3. Add 'html'=>true parameter to the textarea field definition
in your phpMyEdit calling program.
 
Example:
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'textarea' => array(
'html' => true,
'rows' => 11,
'cols' => 81)
);
 
SEARCH KEYWORD
--------------
 
Search for "htmlArea" string in this source code,
to find all extension related modifications.
*/
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_htmlarea extends phpMyEdit
{
 
/*
* Display functions overriding
*/
 
function display_add_record() /* {{{ */
{
for ($k = 0; $k < $this->num_fds; $k++) {
if ($this->hidden($k)) {
echo $this->htmlHidden($this->fds[$k], $row["qf$k"]);
continue;
}
if (! $this->displayed[$k]) {
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix);
echo '<tr class="',$this->getCSSclass('row', null, true, $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">',$this->fdd[$k]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'">'."\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$selected = @$this->fdd[$k]['default'];
$multiple = $this->fdd[$k]['select'] == 'M' && ! $this->fdd[$k]['values']['table'];
$readonly = $this->readonly($k);
echo $this->htmlSelect($this->fds[$k], $css_class_name, $vals, $selected, $multiple,$readonly);
} elseif (isset ($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="'.$this->fds[$k].'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>',htmlspecialchars($this->fdd[$k]['default']),'</textarea>',"\n";
 
// EK htmlArea code modification is here
if (isset($this->fdd[$k]['textarea']['html'])) {
echo '<script type="text/javascript" language="javascript1.2"><!--',"\n";
echo 'editor_generate("',$this->fds[$k],'");',"\n";
echo '// --></script>';
}
} else {
// Simple edit box required
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
//$maxlen > 0 || $maxlen = 300;
$size = min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled ' : ''),' name="',$this->fds[$k],'"';
echo $size_ml_props,' value="';
echo htmlspecialchars($this->fdd[$k]['default']),'">';
}
echo '</td>',"\n";
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
}
} /* }}} */
 
function display_change_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'">',"\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$multiple = $this->fdd[$k]['select'] == 'M' && ! $this->fdd[$k]['values']['table'];
$readonly = $this->readonly($k);
echo $this->htmlSelect($this->fds[$k], $css_class_name, $vals, $row["qf$k"], $multiple, $readonly);
} elseif (isset($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="'.$this->fds[$k].'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>',htmlspecialchars($row["qf$k"]),'</textarea>',"\n";
 
// EK htmlArea code modification is here
if (isset($this->fdd[$k]['textarea']['html'])) {
echo '<script type="text/javascript" language="javascript1.2"><!--',"\n";
echo 'editor_generate("',$this->fds[$k],'");',"\n";
echo '// --></script>';
}
} else {
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
//$maxlen > 0 || $maxlen = 300;
$size = min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled ' : ''),'name="',$this->fds[$k],'" value="';
echo htmlspecialchars($row["qf$k"]),'" ',$size_ml_props,'>',"\n";
}
echo '</td>',"\n";
} /* }}} */
 
}
 
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
 
?>
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-slide.class.php
New file
0,0 → 1,144
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-slide.class.php - slide show extension for phpMyEdit
* ____________________________________________________________
*
* Developed by Ondrej Jombik <nepto@platon.sk>
* Copyright (c) 2002-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/extensions/phpMyEdit-slide.class.php,v 1.10 2006-01-22 21:44:24 nepto Exp $ */
 
/*
* Coding elapsed time: from 8:30 to 10:30 at 30th October 2002
* with heavy patching phpMyEdit core class.
*
* Music used: E-Type (Campione, This is the Way and others)
*/
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_slide extends phpMyEdit
{
// Extension options array
var $ext;
 
function phpMyEdit_slide($opts) /* {{{ */
{
$execute = 1;
isset($opts['execute']) && $execute = $opts['execute'];
$opts['execute'] = 0;
parent::phpMyEdit($opts);
 
$this->ext = $opts['ext'];
 
$execute && $this->execute($opts);
} /* }}} */
 
function display_record_buttons() /* {{{ */
{
// TODO: classify this table and cells
echo '<table border=0 cellpadding=0 cellspacing=0 width="100%" style="border:0;padding:0;">';
echo '<tr><td align=left style="text-align:left;border:0;padding:0;" nowrap>' . "\n";
if ($this->change_operation()) {
echo '<input type="submit" name="savechange" value="'.$this->labels['Save'].'" />'."\n";
echo '<input type="submit" name="morechange" value="'.$this->labels['Apply'].'" />'."\n";
echo '<input type="button" name="cancel" value="'.$this->labels['Cancel'].'" onClick="form.submit();" />'."\n";
echo '<input type="hidden" name="rec_change" value="1">';
} elseif ($this->view_operation()) {
if ($this->change_enabled()) {
echo '<input type="submit" name="operation" value="'.$this->labels['Change'].'" />'."\n";
}
echo '<input type="submit" name="cancel" value="'.$this->labels['Cancel'].'" />'."\n";
}
 
if (! $this->ext['prev_disable']) {
$disabled = $this->ext['prev'] ? '' : ' disabled';
echo '<input'.$disabled.' type="submit" name="'.ltrim($disabled).'prev" value="'
.$this->labels['Prev'].'">&nbsp;';
echo '<input type="hidden" name="rec_prev" value="'.$this->ext['prev'].'">';
}
if (! $this->ext['next_disable']) {
$disabled = $this->ext['next'] ? '' : ' disabled';
echo '<input'.$disabled.' type="submit" name="'.ltrim($disabled).'next" value="'
.$this->labels['Next'].'">';
echo '<input type="hidden" name="rec_next" value="'.$this->ext['next'].'">';
}
echo '</td></tr></table>'."\n";
} /* }}} */
 
function execute($opts) /* {{{ */
{
if ($this->get_cgi_var('rec_change')
&& ($this->next_operation() || $this->prev_operation())) {
$this->operation = $this->labels['Change'];
}
if (! $this->change_operation()) {
$this->operation = $this->labels['View'];
}
if ($this->prev_operation()) {
! $this->ext['prev_disabled'] && $this->rec = $this->get_cgi_var('rec_prev');
$this->prev = '';
}
if ($this->next_operation()) {
! $this->ext['next_disabled'] && $this->rec = $this->get_cgi_var('rec_next');
$this->next = '';
}
if (! $this->rec) {
$this->rec = $this->ext['rec'];
}
 
if (! $this->rec
|| (! $this->ext['prev_disable'] && ! $this->ext['prev'])
|| (! $this->ext['next_disable'] && ! $this->ext['next'])) {
if ($this->connect() == false) {
return false;
}
$query_parts = array(
'type' => 'select',
// XXX FIXME - simplify query
'select' => 'PMEtable0.'.$this->key,
'from' => $this->get_SQL_join_clause(),
'where' => $this->get_SQL_where_from_query_opts());
// TODO: order by clausule according to default sort order options
$res = $this->myquery($this->get_SQL_query($query_parts), __LINE__);
$ids = array();
while (($row = @mysql_fetch_array($res, MYSQL_NUM)) !== false) {
$ids[] = $row[0];
}
@mysql_free_result($res);
if ($this->rec) {
$idx = array_search($this->rec, $ids);
$idx === false && $idx = 0;
} else {
$idx = 0;
}
 
$this->rec = $ids[$idx];
! $this->ext['prev'] && $this->ext['prev'] = $ids[$idx - 1];
! $this->ext['next'] && $this->ext['next'] = $ids[$idx + 1];
}
$this->recreate_fdd();
$this->recreate_displayed();
parent::execute();
} /* }}} */
 
}
 
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
 
?>
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-mce-cal.class.php
New file
0,0 → 1,509
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-mce-cal.class.php - phpMyEdit html area & calendar popup extension
* ____________________________________________________________
*
* Contribution of Adam Hammond <php@pixolet.co.uk>, London, UK
* Contribution of Ezudin Kurtowich <ekurtovic@ieee.org>, Sarajevo
* Copyright (c) 2003-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* Updated 28th Jul 2005
*
* Updated to use TinyMCE instead of HTMLArea
* Updated to handle multiple tabs and to use PME prefixes.
* Updated to include sub-form patch
*
*
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
 
/* $Platon: phpMyEdit/extensions/phpMyEdit-mce-cal.class.php,v 1.6 2006-09-16 18:43:47 nepto Exp $ */
/*
OVERVIEW
--------
 
mce_cal extends the standard phpMyEdit class to allow
a calendar popup helper to be put on any text field and for any textarea
field to turned into an HTML editor.
This extension uses the free jsCalendar from http://dynarch.com/mishoo
and the TinyMCE code from http://tinymce.moxiecode.com/
REQUIREMENTS
------------
 
The requirement is a properly installed jsCalendar and TinyMCE script.
All browsers supported by these scripts are supported by this
extension. Note that version 1.44 or later for TinyMCE is required.
USAGE
-----
 
For both features:
1. Call to phpMyEdit-mce-cal.class.php instead
of phpMyEdit.class.php.
 
Example:
 
require_once 'extensions/phpMyEdit-mce-cal.class.php';
new phpMyEdit_mce_cal($opts);
 
 
 
HTML TextArea
 
This enables WYSIWYG editing of a textarea field.
In order to use it, you should:
 
1. Load TinyMCE script in the <head>...</head> section of your
phpMyEdit calling program as described in the htmlarea manual.
 
<!-- tinyMCE -->
<script language="javascript" type="text/javascript" src="js/<path to TinyMCE>"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
mode : "specific_textareas",
auto_reset_designmode : true
});
</script>
<!-- /tinyMCE -->
 
where 'js/<path to TinyMCE>' is the path to the javascript code
 
NOTES:
A. The PME implementation uses the "specific_textareas" mode - this
must always be set
 
B. Due to a bug in Mozilla, if any of the textareas being used as HTML
editors are in tabs and are initially hidden, the width and height
need to be specified in the tinyMCE initialization and
'auto_reset_designmode' must be set to 'true':
tinyMCE.init({
mode : "specific_textareas",
auto_reset_designmode : true,
width: "800",
height: "200"
});
 
2. Add 'html'=>true parameter to the textarea field definition
in your phpMyEdit calling program.
 
Example:
 
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'textarea' => array(
'html' => true,
'rows' => 11,
'cols' => 81)
);
 
3. It is also possible to have multiple text area formats on the same
form. This is done by specifying a text tag for the textarea:
 
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'textarea' => array(
'html' => 'format1',
'rows' => 11,
'cols' => 81)
);
 
You then need to initialize TinyMCE in the header to recognize all of
the tags used in the textareas.
EXAMPLE
In the following, two formats of tinyMCE editor are defined.
 
This example is the default, and will be used for any fields where
'html' is set to true.
 
tinyMCE.init({
mode : "specific_textareas",
auto_reset_designmode : true
});
 
This second example has an extra parameter, 'textarea_trigger', which is
set to the text tag given to the textarea in PME with 'mce_' prepended
to it.
 
tinyMCE.init({
mode : "specific_textareas",
auto_reset_designmode : true,
textarea_trigger : "mce_format1",
theme : "advanced",
width: "800",
height: "200",
plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print",
theme_advanced_buttons1_add_before : "save,separator",
theme_advanced_buttons1_add : "fontselect,fontsizeselect",
theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
theme_advanced_buttons2_add_before: "cut,copy,paste,separator,search,replace,separator",
theme_advanced_buttons3_add_before : "tablecontrols,separator",
theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_path_location : "bottom",
content_css : "example_full.css",
plugin_insertdate_dateFormat : "%Y-%m-%d",
plugin_insertdate_timeFormat : "%H:%M:%S",
extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]"
});
So:
'html' => 'format1' maps to textarea_trigger : "mce_format1"
'html' => 'foo' maps to textarea_trigger : "mce_foo"
'html' => 'bar' maps to textarea_trigger : "mce_bar"
 
You can initialize TinyMCE as many times as you need to give you as many
editor formats as you need.
 
CALENDAR
 
This extension enables the display of a popup calendar selection
against selected fields.
In order to use it, you should:
 
1. Load the jsCalendar scripts in the <head>...</head> section of
your phpMyEdit calling program, substituting the correct paths:
 
<script type="text/javascript" src="js/jscalendar/calendar.js"></script>
<script type="text/javascript" src="js/jscalendar/lang/calendar-en.js"></script>
<script type="text/javascript" src="js/jscalendar/calendar-setup.js"></script>
 
2. Choose your preferred jsCalendar CSS file (see jsCalendar
documentation) and add the following in the <head>...</head>
section of your phpMyEdit calling program, substituting the
correct path:
<link rel="stylesheet" type="text/css" media="screen"
href="js/jscalendar/calendar-system.css">
 
3. Add 'calendar' parameter to the field definitions where you
want a calendar popup in your phpMyEdit calling program.
 
Example:
 
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'calendar' => true
);
 
This is will display a button next to the field which pops up
a calendar when clicked. If that field has a 'strftimemask'
parameter set, it will use this for the date format.
For more advanced usage, you can set the 'calendar' parameter
to an array of valid jsCalendar Calendar.setup options
(see jSCalendar document for details). Note that not all
of these options make sense to use in phpMyEdit, and some
of them will actively break the function.
Example:
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'calendar' => array(
'ifFormat' => '%Y/%m/%d', // defaults to the ['strftimemask']
'firstDay' => 1, // 0 = Sunday, 1 = Monday
'singleClick' => true, // single or double click to close
'weekNumbers' => true, // Show week numbers
'showsTime' => false, // Show time as well as date
'timeFormat' => '24', // 12 or 24 hour clock
'button' => true, // Display button (rather then clickable area)
'label' => '...', // button label (used by phpMyEdit)
'date' => '2003-12-19 10:00' // Initial date/time for popup
// (see notes below)
)
);
 
NOTES
-----
 
1. The popup will normally set the initial value to the current
field value or to current date/time. 'date' option will always
override this, even if there is a current date/time value
in the field. If you want a default value only if the field
is currently empty, use the phpMyEdit 'default' option.
 
2. Only the options listed above may be set by the user, any other
options will be ignored.
3. The 'label' option can contain HTML markup which will be displayed as
the button/clickable area to pull up the calendar
 
SEARCH KEYWORD
--------------
 
Search for "htmlcal" string in this source code,
to find all extension related modifications.
*/
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_mce_cal extends phpMyEdit
{
/* calendar mod start */
 
var $calendars; // Array for collecting list of fields with calendar popups
/* Array of valid options for passing to Calendar.setup */
var $valid_opts = array(
'button','ifFormat','singleClick','firstDay',
'weekNumbers','showsTime','timeFormat','date'
);
 
/**
* Checks to see if the calendar parameter is set on the field
*
* @param k current field name
* @param curval current value of field (set to null for default)
*
* If the calendar parameter is set on the field, this function displays
* the button. It then pushes the Calendar.setup parameters into an array,
* including the user specified ones in the calling program is they exist.
* This array is then added to the $calendars array indexed by the field
* name. This allows for multiple fields with calendar popups.
*/
function calPopup_helper($k, $curval) /* {{{ */
{
if (@$this->fdd[$k]['calendar']) {
$cal_ar['ifFormat'] = '%Y-%m-%d %H:%M';
$cal_ar['showsTime'] = true;
$cal_ar['singleClick'] = false;
if (isset($curval)) {
if (substr($curval, 0, 4) != '0000')
$cal_ar['date'] = $curval;
}
if (isset($this->fdd[$k]['strftimemask'])) {
$cal_ar['ifFormat'] = $this->fdd[$k]['strftimemask'];
}
if (is_array($this->fdd[$k]['calendar'])) {
foreach($this->fdd[$k]['calendar'] as $ck => $cv) {
$cal_ar[$ck] = $cv;
}
}
$cal_ar['button'] = $this->dhtml['prefix'].'calbutton_'.$this->fds[$k];
$this->calendars[$this->fds[$k]] = $cal_ar;
 
$label = @$this->fdd[$k]['calendar']['label'];
strlen($label) || $label = '...';
 
$do_button = true;
if (isset($this->fdd[$k]['calendar']['button'])) {
$do_button = $this->fdd[$k]['calendar']['button'];
};
 
if ($do_button) {
echo '<button id="',$cal_ar['button'],'">',$label,'</button>';
} else {
echo '<span style="cursor: pointer" id="',$cal_ar['button'],'">',$label,'</span>';
}
}
} /* }}} */
 
/* calendar mod end */
 
function display_add_record() /* {{{ */
{
for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) {
if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) {
$tab++;
echo '</table>',"\n";
echo '</div>',"\n";
echo '<div id="'.$this->dhtml['prefix'].'tab',$tab,'">',"\n";
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
}
if (! $this->displayed[$k]) {
continue;
}
if ($this->hidden($k)) {
echo $this->htmlHiddenData($this->fds[$k], $this->fdd[$k]['default']);
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix);
echo '<tr class="',$this->getCSSclass('row', null, true, $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$k]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$selected = @$this->fdd[$k]['default'];
$multiple = $this->col_has_multiple_select($k);
$readonly = $this->readonly($k);
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], $css_class_name,
$vals, $selected, $multiple, $readonly, $strip_tags, $escape);
} elseif (isset ($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
};
// mce mod start
if (isset($this->fdd[$k]['textarea']['html'])) {
$mce_tag = 'editable';
if (is_string($this->fdd[$k]['textarea']['html'])) {
$mce_tag = $this->fdd[$k]['textarea']['html'];
};
echo ' mce_'.$mce_tag.'=true ';
};
// mce mod end
echo '>',htmlspecialchars($this->fdd[$k]['default']),'</textarea>',"\n";
} else {
// Simple edit box required
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" ';
echo ($this->password($k) ? 'type="password"' : 'type="text"');
echo ($this->readonly($k) ? ' disabled' : '');
/* calendar mod start */
echo ' id="',$this->dhtml['prefix'].'fld_'.$this->fds[$k],'"';
/* calendar mod end */
echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo $size_ml_props,' value="';
echo htmlspecialchars($this->fdd[$k]['default']),'">';
/* calendar mod start */
/* Call htmlcal helper function */
$this->calPopup_helper($k, null);
/* calendar mod end */
}
echo '</td>',"\n";
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
}
} /* }}} */
 
function display_change_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$multiple = $this->col_has_multiple_select($k);
$readonly = $this->readonly($k);
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], $css_class_name,
$vals, $row["qf$k"], $multiple, $readonly, $strip_tags, $escape);
} elseif (isset($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->cgi['prefix']['data'].$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
};
// mce mod start
if (isset($this->fdd[$k]['textarea']['html'])) {
$mce_tag = 'editable';
if (is_string($this->fdd[$k]['textarea']['html'])) {
$mce_tag = $this->fdd[$k]['textarea']['html'];
};
echo ' mce_'.$mce_tag.'=true ';
};
// mce mod end
echo '>',htmlspecialchars($row["qf$k"]),'</textarea>',"\n";
} else {
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled ' : '');
/* calendar mod start */
echo ' id="',$this->dhtml['prefix'].'fld_'.$this->fds[$k],'"';
/* calendar mod end */
echo 'name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="';
echo htmlspecialchars($row["qf$k"]),'" ',$size_ml_props,'>',"\n";
/* calendar mod start */
/* Call calPopup helper function */
$this->calPopup_helper($k, htmlspecialchars($row["qf$k"]));
/* calendar mod end */
}
echo '</td>',"\n";
} /* }}} */
 
function form_end() /* {{{ */
{
if ($this->display['form']) {
echo '</form>',"\n";
 
/* calendar mod start */
 
/* Add script calls to the end of the form for all fields
with calendar popups. */
if (isset($this->calendars)) {
echo '<script type="text/javascript"><!--',"\n";
foreach($this->calendars as $ck => $cv) {
echo 'Calendar.setup({',"\n";
foreach ($cv as $ck1 => $cv1) {
if (in_array($ck1, $this->valid_opts)) {
echo "\t",str_pad($ck1, 15),' : "',$cv1,'",',"\n";
}
}
echo "\t",str_pad('inputField', 15),' : "',$this->dhtml['prefix'].'fld_'.$ck,'"',"\n";
echo '});',"\n";
};
echo '// -->',"\n";
echo '</script>',"\n";
};
/* calendar mod end */
};
} /* }}} */
 
}
 
?>
/tags/v1.1-andromede/jrest/util/extensions/phpMyEdit-calpopup.class.php
New file
0,0 → 1,357
<?php
 
/*
* phpMyEdit - instant MySQL table editor and code generator
*
* extensions/phpMyEdit-calpopup.class.php - phpMyEdit calendar popup extension
* ____________________________________________________________
*
* Contribution of Adam Hammond <php@pixolet.co.uk>, London, UK
* Copyright (c) 2003-2006 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpMyEdit/
*/
/* $Platon: phpMyEdit/extensions/phpMyEdit-calpopup.class.php,v 1.9 2006-01-22 21:44:17 nepto Exp $ */
 
/*
OVERVIEW
--------
 
NOTE...This extension will not work with the CVS version of PME
 
calPopup extends the standard phpMyEdit class to allow
a calendar popup helper to be put on any text field.
This extension uses the free jsCalendar code from
http://dynarch.com/mishoo/calendar.epl website.
REQUIREMENTS
------------
 
The requirement is a properly installed jsCalendar script.
All browsers supported by jsCalendar are supported by this
extension.
 
USAGE
-----
 
This extension enables the display of a popup calendar selection
against selected fields.
In order to use it, you should:
 
1. Load the jsCalendar scripts in the <head>...</head> section of
your phpMyEdit calling program, substituting the correct paths:
 
<script type="text/javascript" src="js/calendar.js"></script>
<script type="text/javascript" src="js/lang/calendar-en.js"></script>
<script type="text/javascript" src="js/calendar-setup.js"></script>
 
2. Choose your preferred jsCalendar CSS file (see jsCalendar
documentation) and add the following in the <head>...</head>
section of your phpMyEdit calling program, substituting the
correct path:
<link rel="stylesheet" type="text/css" media="screen"
href="css/calendar-system.css">
 
NOTE: To avoid an unwanted side effect in the CSS style
produced by phpMyEditSetup.php, add a 'width:auto' property
into the '.calendar table' entry in your selected jsCalendar
style sheet.
 
3. Call to phpMyEdit-calPopup.class.php instead
of phpMyEdit.class.php.
 
Example:
 
require_once 'extensions/phpMyEdit-calpopup.class.php';
new phpMyEdit_calpopup($opts);
 
4. Add 'calendar' parameter to the field definitions where you
want a calendar popup in your phpMyEdit calling program.
 
Example:
 
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'calendar' => true
);
 
This is will display a button next to the field which pops up
a calendar when clicked. If that field has a 'strftimemask'
parameter set, it will use this for the date format.
For more advanced usage, you can set the 'calendar' parameter
to an array of valid jsCalendar Calendar.setup options
(see jSCalendar document for details). Note that not all
of these options make sense to use in phpMyEdit, and some
of them will actively break the function.
Example:
$opts['fdd']['col_name'] = array(
'name' => 'Column',
'select' => 'T',
'options' => 'ACPVD',
'required' => true,
'calendar' => array(
'ifFormat' => '%Y/%m/%d', // defaults to the ['strftimemask']
'firstDay' => 1, // 0 = Sunday, 1 = Monday
'singleClick' => true, // single or double click to close
'weekNumbers' => true, // Show week numbers
'showsTime' => false, // Show time as well as date
'timeFormat' => '24', // 12 or 24 hour clock
'label' => '...', // button label (used by phpMyEdit)
'date' => '2003-12-19 10:00' // Initial date/time for popup
// (see notes below)
)
);
 
NOTES
-----
 
1. The popup will normally set the initial value to the current
field value or to current date/time. 'date' option will always
override this, even if there is a current date/time value
in the field. If you want a default value only if the field
is currently empty, use the phpMyEdit 'default' option.
 
2. Only the options listed above may be set by the user, any other
options will be ignored.
 
SEARCH KEYWORD
--------------
 
Search for "CalPopup" string in this source code,
to find all extension related modifications.
*/
 
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
 
class phpMyEdit_calpopup extends phpMyEdit
{
/* CalPopup mod start */
 
/* Array for collecting list of fields with calendar popups */
var $calendars;
 
/* Array of valid options for passing to Calendar.setup */
var $valid_opts = array(
'button','ifFormat','singleClick','firstDay',
'weekNumbers','showsTime','timeFormat','date'
);
 
/**
* Checks to see if the calendar parameter is set on the field
*
* @param k current field name
* @param curval current value of field (set to null for default)
*
* If the calendar parameter is set on the field, this function displays
* the button. It then pushes the Calendar.setup parameters into an array,
* including the user specified ones in the calling program is they exist.
* This array is then added to the $calendars array indexed by the field
* name. This allows for multiple fields with calendar popups.
*/
function CalPopup_helper($k, $curval) /* {{{ */
{
if (@$this->fdd[$k]['calendar']) {
$cal_ar['ifFormat'] = '%Y-%m-%d %H:%M';
$cal_ar['showsTime'] = true;
$cal_ar['singleClick'] = false;
if (isset($curval)) {
if (substr($curval, 0, 4) != '0000')
$cal_ar['date'] = $curval;
}
if (isset($this->fdd[$k]['strftimemask'])) {
$cal_ar['ifFormat'] = $this->fdd[$k]['strftimemask'];
}
if (is_array($this->fdd[$k]['calendar'])) {
foreach($this->fdd[$k]['calendar'] as $ck => $cv) {
$cal_ar[$ck] = $cv;
}
}
$cal_ar['button'] = 'pme_calpopup_button_'.$this->fds[$k];
$this->calendars[$this->fds[$k]] = $cal_ar;
$label = @$this->fdd[$k]['calendar']['label'];
strlen($label) || $label = '...';
echo '<button id="',$cal_ar['button'],'">',$label,'</button>';
}
} /* }}} */
 
/* CalPopup mod end */
 
function display_add_record() /* {{{ */
{
for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) {
if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) {
$tab++;
echo '</table>',"\n";
echo '</div>',"\n";
echo '<div id="phpMyEdit_tab',$tab,'">',"\n";
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
}
if (! $this->displayed[$k]) {
continue;
}
if ($this->hidden($k)) {
echo $this->htmlHidden($this->fds[$k], $row["qf$k"]);
continue;
}
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix);
echo '<tr class="',$this->getCSSclass('row', null, true, $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">',$this->fdd[$k]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$selected = @$this->fdd[$k]['default'];
$multiple = $this->col_has_multiple_select($k);
$readonly = $this->readonly($k);
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($this->fds[$k], $css_class_name, $vals, $selected,
$multiple, $readonly, $strip_tags, $escape);
} elseif (isset ($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>',htmlspecialchars($this->fdd[$k]['default']),'</textarea>',"\n";
} else {
// Simple edit box required
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
 
/* CalPopup mod start */
if (@$this->fdd[$k]['calendar']) {
$size_ml_props .= ' id="pme_calpopup_input_'.$this->fds[$k].'"';
}
/* CalPopup mod end */
 
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled ' : ''),' name="',$this->fds[$k],'"';
echo $size_ml_props,' value="';
echo htmlspecialchars($this->fdd[$k]['default']),'">';
 
/* CalPopup mod start */
/* Call CalPopup helper function */
$this->CalPopup_helper($k, null);
/* CalPopup mod end */
}
echo '</td>',"\n";
if ($this->guidance) {
$css_class_name = $this->getCSSclass('help', null, true, $css_postfix);
$cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : '&nbsp;';
echo '<td class="',$css_class_name,'">',$cell_value,'</td>',"\n";
}
echo '</tr>',"\n";
}
} /* }}} */
 
function display_change_field($row, $k) /* {{{ */
{
$css_postfix = @$this->fdd[$k]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($k),">\n";
if ($this->col_has_values($k)) {
$vals = $this->set_values($k);
$multiple = $this->col_has_multiple_select($k);
$readonly = $this->readonly($k);
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($this->fds[$k], $css_class_name, $vals, $row["qf$k"],
$multiple, $readonly, $strip_tags, $escape);
} elseif (isset($this->fdd[$k]['textarea'])) {
echo '<textarea class="',$css_class_name,'" name="',$this->fds[$k],'"';
echo ($this->readonly($k) ? ' disabled' : '');
if (intval($this->fdd[$k]['textarea']['rows']) > 0) {
echo ' rows="',$this->fdd[$k]['textarea']['rows'],'"';
}
if (intval($this->fdd[$k]['textarea']['cols']) > 0) {
echo ' cols="',$this->fdd[$k]['textarea']['cols'],'"';
}
if (isset($this->fdd[$k]['textarea']['wrap'])) {
echo ' wrap="',$this->fdd[$k]['textarea']['wrap'],'"';
} else {
echo ' wrap="virtual"';
}
echo '>',htmlspecialchars($row["qf$k"]),'</textarea>',"\n";
} else {
$size_ml_props = '';
$maxlen = intval($this->fdd[$k]['maxlen']);
$size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60);
$size && $size_ml_props .= ' size="'.$size.'"';
$maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"';
 
/* CalPopup mod start */
if (@$this->fdd[$k]['calendar']) {
$size_ml_props .= ' id="pme_calpopup_input_'.$this->fds[$k].'"';
}
/* CalPopup mod end */
 
echo '<input class="',$css_class_name,'" type="text" ';
echo ($this->readonly($k) ? 'disabled ' : ''),'name="',$this->fds[$k],'" value="';
echo htmlspecialchars($row["qf$k"]),'" ',$size_ml_props,'>',"\n";
 
/* CalPopup mod start */
/* Call CalPopup helper function */
$this->CalPopup_helper($k, htmlspecialchars($row["qf$k"]));
/* CalPopup mod end */
}
echo '</td>',"\n";
} /* }}} */
 
function form_end() /* {{{ */
{
if ($this->display['form']) {
echo '</form>',"\n";
/* CalPopup mod start */
/* Add script calls to the end of the form for all fields
with calendar popups. */
if (isset($this->calendars)) {
echo '<script type="text/javascript"><!--',"\n";
foreach($this->calendars as $ck => $cv) {
echo 'Calendar.setup({',"\n";
foreach ($cv as $ck1 => $cv1) {
if (in_array($ck1, $this->valid_opts)) {
echo "\t",str_pad($ck1, 15),' : "',$cv1,'",',"\n";
}
}
echo "\t",str_pad('inputField', 15),' : "pme_calpopup_input_',$ck,'"',"\n";
echo '});',"\n";
};
echo '// --></script>',"\n";
};
 
/* CalPopup mod end */
};
} /* }}} */
}
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.RU.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: russian
* encoding: windows-1251
* date: 2002-11-23
* author: Lev Zabudkin <zabudkin@mail.ru>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.RU.inc,v 1.11 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Äîáàâèòü',
'Copy' =>'Êîïèðîâàòü',
'Change' =>'Èçìåíèòü',
'Delete' =>'Óäàëèòü',
'View' =>'Ïðîñìîòð',
'Prev' =>'<<',
'Next' =>'>>',
'First' =>'I<',
'Last' =>'>I',
'Go to' =>'Ïåðåéòè',
'Page' =>'Ñòð.',
'Records' =>'Çàïèñåé',
'Save' =>'Ñîõðàíèòü',
'More' =>'Áîëüøå',
'Apply' =>'Ïðèìåíèòü',
'Cancel' =>'Îòìåíà',
'Search' =>'Ïîèñê',
'Hide' =>'Ñêðûòü',
'Clear' =>'Î÷èñòèòü',
'Query' =>'Çàïðîñ',
'Current Query' =>'Òåêóùèé çàïðîñ',
'Sorted By' =>'Îòñîðòèðîâàíî ïî',
'ascending' =>'- âîçðàñòàíèþ',
'descending' =>'- óáûâàíèþ',
'hidden' =>'ñêðûòî',
'of' =>'èç',
'record added' =>'çàïèñü äîáàâëåíà',
'record changed'=>'çàïèñü îáíîâëåíà',
'record deleted'=>'çàïèñü óäàëåíà',
'Please enter' =>'Ïîæàëóéñòà ââåäèòå',
'months' => Array(
'01'=>'ßíâàðü',
'02'=>'Ôåâðàëü',
'03'=>'Ìàðò',
'04'=>'Àïðåëü',
'05'=>'Ìàé',
'06'=>'Èþíü',
'07'=>'Èþëü',
'08'=>'Àâãóñò',
'09'=>'Ñåíòÿáðü',
'10'=>'Îêòÿáðü',
'11'=>'Íîÿáðü',
'12'=>'Äåêàáðü'),
// phpMyEdit-report
'Make report' => 'Ñîçäàòü îò÷åò',
'Select fields' => 'Âûáðàòü ïîëÿ',
'Records per screen' => 'Çàïèñåé íà ýêðàíå',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.EN-US.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: english (United States)
* encoding: iso-8859-1
* date: 2002-02, 2003-05-01
* author: Jim Kraai <jkraai@users.sourceforge.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.EN-US.inc,v 1.10 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Add',
'Copy' =>'Copy',
'Change' =>'Change',
'Delete' =>'Delete',
'View' =>'View',
'Prev' =>'Prev',
'Next' =>'Next',
'First' =>'First',
'Last' =>'Last',
'Go to' =>'Go to',
'Page' =>'Page',
'Records' =>'Records',
'Save' =>'Save',
'More' =>'More',
'Apply' =>'Apply',
'Cancel' =>'Cancel',
'Search' =>'Search',
'Hide' =>'Hide',
'Clear' =>'Clear',
'Query' =>'Query',
'Current Query' =>'Current Query',
'Sorted By' =>'Sorted By',
'ascending' =>'ascending',
'descending' =>'descending',
'hidden' =>'hidden',
'of' =>'of',
'record added' =>'record added',
'record changed' =>'record changed',
'record deleted' =>'record deleted',
'Please enter' =>'Please enter',
'months' => Array(
'01'=>'January',
'02'=>'February',
'03'=>'March',
'04'=>'April',
'05'=>'May',
'06'=>'June',
'07'=>'July',
'08'=>'August',
'09'=>'September',
'10'=>'October',
'11'=>'November',
'12'=>'December'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.DE.inc
New file
0,0 → 1,67
<?php
 
/*
* phpMyEdit language file
*
* language: german (standard)
* encoding: iso-8859-1
* date: 2002-07
* authors:
* Christof Brandstetter <fellz@users.sourceforge.net>
* Gerd Xhonneux, http://xsite.xhonneux.com
* info: http://makeashorterlink.com/?O116223C2
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.DE.inc,v 1.14 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Hinzufügen',
'Copy' =>'Kopieren',
'Change' =>'Ändern',
'Delete' =>'Löschen',
'View' =>'Anzeigen',
'Prev' =>'Zurück',
'Next' =>'Weiter',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'Seite',
'Records' =>'Datensätze',
'Save' =>'Speichern',
'More' =>'Speichern, weiteren Datensatz hinzufügen',
'Apply' =>'Anwenden',
'Cancel' =>'Abbrechen',
'Search' =>'Suche',
'Hide' =>'Verstecken',
'Clear' =>'Löschen',
'Query' =>'Abfrage',
'Current Query' =>'Aktuelle Abfrage',
'Sorted By' =>'Sortiert nach',
'ascending' =>'aufsteigend',
'descending' =>'absteigend',
'hidden' =>'versteckt',
'of' =>'von',
'record added' =>'Datensatz hinzugefügt',
'record changed'=>'Datensatz geändert',
'record deleted'=>'Datensatz gelöscht',
'Please enter' =>'Bitte füllen sie dieses Feld aus:',
'months' => Array(
'01'=>'Januar',
'02'=>'Februar',
'03'=>'März',
'04'=>'April',
'05'=>'Mai',
'06'=>'Juni',
'07'=>'Juli',
'08'=>'August',
'09'=>'September',
'10'=>'Oktober',
'11'=>'November',
'12'=>'Dezember'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ZH-SG.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: chinese (Singapore)
* encoding: utf-8
* date: 2003-07-03
* author: Juraj Benadik <gastan at gastan.sk>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ZH-SG.inc,v 1.4 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'添加',
'Copy' =>'复制',
'Change' =>'更改',
'Delete' =>'删除',
'View' =>'查看',
'Prev' =>'上页',
'Next' =>'下页',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'页',
'Records' =>'记录',
'Save' =>'保存',
'More' =>'更多',
'Apply' =>'应用',
'Cancel' =>'取消',
'Search' =>'搜寻',
'Hide' =>'隐藏',
'Clear' =>'清除',
'Query' =>'查询',
'Current Query' =>'当前 查询',
'Sorted By' =>'排序方式',
'ascending' =>'上升',
'descending' =>'递减',
'hidden' =>'隐藏的',
'of' =>'总',
'record added' =>'记录添加',
'record changed' =>'记录更改',
'record deleted' =>'记录删除',
'Please enter' =>'请进入',
'months' => Array(
'01'=>'一月',
'02'=>'二月',
'03'=>'三月',
'04'=>'四月',
'05'=>'五月',
'06'=>'六月',
'07'=>'七月',
'08'=>'八月',
'09'=>'九月',
'10'=>'十月',
'11'=>'十一月',
'12'=>'十二月'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ES-MX.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: spanish (mexican)
* encoding: iso-8859-1
* date: 2003-04-30
* author: unknown
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ES-MX.inc,v 1.3 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Agregar',
'Copy' =>'Copiar',
'Change' =>'Cambiar',
'Delete' =>'Suprimir',
'View' =>'Ver',
'Prev' =>'Anterior',
'Next' =>'Siguiente',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'Página',
'Records' =>'Registros',
'Save' =>'Guardar',
'More' =>'Más',
'Apply' =>'Aplicar',
'Cancel' =>'Cancelar',
'Search' =>'Buscar',
'Hide' =>'Ocultar',
'Clear' =>'Limpiar',
'Query' =>'Consulta SQL',
'Current Query' =>'Consulta actual',
'Sorted By' =>'Ordenado por',
'ascending' =>'ascendente',
'descending' =>'descendente',
'hidden' =>'oculto',
'of' =>'de',
'record added' =>'registro agregado',
'record changed'=>'registro cambiado',
'record deleted'=>'registro borrado',
'Please enter' =>'Por favor introduzca ',
'months' => Array(
'01'=>'Enero',
'02'=>'Febrero',
'03'=>'Marzoa',
'04'=>'Abril',
'05'=>'Mayo',
'06'=>'Junio',
'07'=>'Julio',
'08'=>'Agosto',
'09'=>'Septiembre',
'10'=>'Octubre',
'11'=>'Noviembre',
'12'=>'Diciembre'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.DK.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: danish
* encoding: iso-8859-1
* date: 2003-03-19
* author: Henrik Nielsen <kontakt@innovapage.dk>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.DK.inc,v 1.5 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Tilføj',
'Copy' =>'Kopier',
'Change' =>'Ret',
'Delete' =>'Slet',
'View' =>'Se',
'Prev' =>'Tilbage',
'Next' =>'Næste',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'Side',
'Records' =>'Rækker',
'Save' =>'Gem',
'More' =>'Mere',
'Apply' =>'Tilføj',
'Cancel' =>'Fortryd',
'Search' =>'Søg',
'Hide' =>'Skjul',
'Clear' =>'Tøm',
'Query' =>'Søg',
'Current Query' =>'Current Query', // untranslated
'Sorted By' =>'Sorted By', // untranslated
'ascending' =>'ascending', // untranslated
'descending' =>'descending', // untranslated
'hidden' =>'hidden', // untranslated
'of' =>'af',
'record added' =>'række tilføjet',
'record changed' =>'række ændret',
'record deleted' =>'række slettet',
'Please enter' =>'Indtast venligst',
'months' => Array(
'01'=>'Januar',
'02'=>'Februar',
'03'=>'Marts',
'04'=>'April',
'05'=>'Maj',
'06'=>'Juni',
'07'=>'Juli',
'08'=>'August',
'09'=>'September',
'10'=>'Oktober',
'11'=>'November',
'12'=>'December'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.EL.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: greek
* encoding: iso-8859-7
* date: 2005-08-03
* author: Alexandros Vellis <avel@users.sourceforge.net>
*/
 
/* $Id$ */
 
return Array(
'Add' =>'Ðñüóèåóç',
'Copy' =>'ÁíôéãñáöÞ',
'Change' =>'ÁëëáãÞ',
'Delete' =>'ÄéáãñáöÞ',
'View' =>'ÅìöÜíéóç',
'Prev' =>'Ðñïçãïýìåíï',
'Next' =>'Åðüìåíï',
'First' =>'Ðñþôï',
'Last' =>'Ôåëåõôáßï',
'Go to' =>'ÐÞãáéíå óå',
'Page' =>'Óåëßäá',
'Records' =>'ÅããñáöÝò',
'Save' =>'ÁðïèÞêåõóç',
'More' =>'Ðåñéóóüôåñá',
'Apply' =>'ÕðïâïëÞ',
'Cancel' =>'Áêýñùóç',
'Search' =>'ÁíáæÞôçóç',
'Hide' =>'Êñýøå',
'Clear' =>'ÊáèÜñéóå',
'Query' =>'Åðåñþôçìá',
'Current Query' =>'ÔñÝ÷ïí Åðåñþôçìá',
'Sorted By' =>'Ôáîéíüìçóç Ìå',
'ascending' =>'áýîïõóá',
'descending' =>'öèßíïõóá',
'hidden' =>'êñõììÝíï',
'of' =>'áðü',
'record added' =>'ç åããñáöÞ ðñïóôÝèçêå',
'record changed' =>'ç åããñáöÞ Üëëáîå',
'record deleted' =>'ç åããñáöÞ äéáãñÜöçêå',
'Please enter' =>'Ðáñáêáëþ åéóÜãåôå',
'months' => Array(
'01'=>'ÉáíïõÜñéïò',
'02'=>'ÖåâñïõÜñéïò',
'03'=>'ÌÜñôéïò',
'04'=>'Áðñßëéïò',
'05'=>'ÌÜéïò',
'06'=>'Éïýíéïò',
'07'=>'Éïýëéïò',
'08'=>'Áýãïõóôïò',
'09'=>'ÓåðôÝìâñéïò',
'10'=>'Ïêôþâñéïò',
'11'=>'ÍïÝìâñéïò',
'12'=>'ÄåêÝìâñéïò'),
// phpMyEdit-report
'Make report' => 'Äçìéïõñãßá áíáöïñÜò',
'Select fields' => 'ÅðéëïãÞ ðåäßùí',
'Records per screen' => 'ÅããñáöÝò áíÜ ïèüíç',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.EN.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: english
* encoding: iso-8859-1
* date: 2000, 2001, 2003-05-01
* author: John McCreesh <jpmcc@users.sourceforge.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.EN.inc,v 1.11 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Add',
'Copy' =>'Copy',
'Change' =>'Change',
'Delete' =>'Delete',
'View' =>'View',
'Prev' =>'Prev',
'Next' =>'Next',
'First' =>'First',
'Last' =>'Last',
'Go to' =>'Go to',
'Page' =>'Page',
'Records' =>'Records',
'Save' =>'Save',
'More' =>'More',
'Apply' =>'Apply',
'Cancel' =>'Cancel',
'Search' =>'Search',
'Hide' =>'Hide',
'Clear' =>'Clear',
'Query' =>'Query',
'Current Query' =>'Current Query',
'Sorted By' =>'Sorted By',
'ascending' =>'ascending',
'descending' =>'descending',
'hidden' =>'hidden',
'of' =>'of',
'record added' =>'record added',
'record changed' =>'record changed',
'record deleted' =>'record deleted',
'Please enter' =>'Please enter',
'months' => Array(
'01'=>'January',
'02'=>'February',
'03'=>'March',
'04'=>'April',
'05'=>'May',
'06'=>'June',
'07'=>'July',
'08'=>'August',
'09'=>'September',
'10'=>'October',
'11'=>'November',
'12'=>'December'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.SE.inc
New file
0,0 → 1,73
<?php
 
/*
* phpMyEdit language file
*
* language: swedish
* encoding: iso-8859-1
* date: 2004-01-21, 2004-02-07
* authors:
* Björn Hammarbäck <bjorn@hammarback.se>
* Stefan Lindmark <stefan@lindmark.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.SE.inc,v 1.4 2004-12-27 20:14:29 nepto Exp $ */
 
/*
* å = &aring;
* ä = &auml;
* ö = &ouml;
* Ä = &Auml;
*/
 
return Array(
'Add' =>'Lägg till',
'Copy' =>'Kopiera',
'Change' =>'Ändra',
'Delete' =>'Ta bort',
'View' =>'Visa detaljer',
'Prev' =>'Föregående',
'Next' =>'Nästa',
'First' =>'Första',
'Last' =>'Sista',
'Go to' =>'Gå till sida',
'Page' =>'Sida',
'Records' =>'Poster',
'Save' =>'Spara',
'More' =>'Mer',
'Apply' =>'Verkställ',
'Cancel' =>'Avbryt',
'Search' =>'Sök',
'Hide' =>'Dölj',
'Clear' =>'Rensa',
'Query' =>'Sök',
'Current Query' =>'Nuvarande fråga',
'Sorted By' =>'Sorterad efter',
'ascending' =>'stigande',
'descending' =>'fallande',
'hidden' =>'gömd',
'of' =>'av',
'record added' =>'post adderad',
'record changed' =>'post ändrad',
'record deleted' =>'post borttagen',
'Please enter' =>'Fyll i fältet',
'months' => Array(
'01'=>'Januari',
'02'=>'Februari',
'03'=>'Mars',
'04'=>'April',
'05'=>'Maj',
'06'=>'Juni',
'07'=>'Juli',
'08'=>'Augusti',
'09'=>'September',
'10'=>'Oktober',
'11'=>'November',
'12'=>'December'),
// phpMyEdit-report
'Make report' => 'Skapa rapport',
'Select fields' => 'Välj fält',
'Records per screen' => 'Poster per skärm',
);
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ES-AR.inc
New file
0,0 → 1,59
<?php
 
/*
* phpMyEdit language file
*
* language: spanish (argentinian)
* encoding: iso-8859-1
* date: 2003-02-28, 2004-02-15
* author: Mariano Vassallo <mvassallo@ciudad.com.ar>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ES-AR.inc,v 1.5 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Agregar',
'Copy' =>'Copiar',
'Change' =>'Cambiar',
'Delete' =>'Suprimir',
'View' =>'Visualización',
'Prev' =>'Anterior',
'Next' =>'Siguiente',
'First' =>'Primero',
'Last' =>'Ultimo',
'Go to' =>'Ir a',
'Page' =>'Paginación',
'Records' =>'Registros',
'Save' =>'Grabar',
'More' =>'Más',
'Apply' =>'Aplicar',
'Cancel' =>'Cancelar',
'Search' =>'Buscar',
'Hide' =>'Ocultar',
'Clear' =>'Limpiar',
'Query' =>'Consulta',
'of' =>'/', // intentionaly untranslated. Alternatve: "de"
'record added' =>'registro añadido',
'record changed'=>'registro cambiado',
'record deleted'=>'registro borrado',
'Please enter' =>'Por favor introduzca ',
'months' => Array(
'01'=>'Enero',
'02'=>'Febrero',
'03'=>'Marzo',
'04'=>'Abril',
'05'=>'Mayo',
'06'=>'Junio',
'07'=>'Julio',
'08'=>'Agosto',
'09'=>'Septiembre',
'10'=>'Octubre',
'11'=>'Noviembre',
'12'=>'Diciembre'),
// phpMyEdit-report
'Make report' => 'Hacer reporte',
'Select fields' => 'Seleccionar campos',
'Records per screen' => 'Registros por pantalla',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ES.inc
New file
0,0 → 1,66
<?php
 
/*
* phpMyEdit language file
*
* language: spanish
* encoding: iso-8859-1
* date: 2003-02, 2003-04-22, 2004-04-04
* authors:
* Jorge Nadal <jornamon@ya.com>
* Eduardo Diaz <ediaz@pk25.com>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ES.inc,v 1.6 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Agregar',
'Copy' =>'Copiar',
'Change' =>'Cambiar',
'Delete' =>'Suprimir',
'View' =>'Visualizar',
'Prev' =>'Anterior',
'Next' =>'Siguiente',
'First' =>'Primero',
'Last' =>'Último',
'Go to' =>'Ir a',
'Page' =>'Página',
'Records' =>'Registros',
'Save' =>'Grabar',
'More' =>'Más',
'Apply' =>'Aplicar',
'Cancel' =>'Cancelar',
'Search' =>'Buscar',
'Hide' =>'Ocultar',
'Clear' =>'Limpiar',
'Query' =>'Consultar',
'Current Query' =>'Consulta actual',
'Sorted By' =>'Ordenado por',
'ascending' =>'ascendente',
'descending' =>'descendente',
'hidden' =>'oculto',
'of' =>'de',
'record added' =>'Registro añadido',
'record changed'=>'Registro cambiado',
'record deleted'=>'Registro borrado',
'Please enter' =>'Por favor introduzca ',
'months' => Array(
'01'=>'Enero',
'02'=>'Febrero',
'03'=>'Marzo',
'04'=>'Abril',
'05'=>'Mayo',
'06'=>'Junio',
'07'=>'Julio',
'08'=>'Agosto',
'09'=>'Septiembre',
'10'=>'Octubre',
'11'=>'Noviembre',
'12'=>'Diciembre'),
// phpMyEdit-report
'Make report' => 'Realizar Informe',
'Select fields' => 'Seleccionar campos',
'Records per screen' => 'Registros por pantalla',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.FR.inc
New file
0,0 → 1,67
<?php
 
/*
* phpMyEdit language file
*
* language: french (standard)
* encoding: iso-8859-1
* date: 2002-02, 2002-11-07, 2002-12-29
* authors:
* Dario <dartar@users.sourceforge.net>
* Kaid <kaid@fr.st>
* hbernard <hbernard@gynov.org>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.FR.inc,v 1.15 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Ajouter',
'Copy' =>'Copier',
'Change' =>'Modifier',
'Delete' =>'Supprimer',
'View' =>'Afficher',
'Prev' =>'Précédent',
'Next' =>'Suivant',
'First' =>'Début',
'Last' =>'Fin',
'Go to' =>'Aller à ',
'Page' =>'Page',
'Records' =>'Enregistrements',
'Save' =>'Enregistrer',
'More' =>'Enregistrer et continuer',
'Apply' =>'Appliquer',
'Cancel' =>'Annuler',
'Search' =>'Rechercher',
'Hide' =>'Cacher',
'Clear' =>'Vider',
'Query' =>'Requête',
'Current Query' =>'Requête courante',
'Sorted By' =>'Tri',
'ascending' =>'croissant',
'descending' =>'décroissant',
'hidden' =>'caché',
'of' =>'/', // untranslated
'record added' =>'Enregistrement ajouté',
'record changed'=>'Enregistrement modifié',
'record deleted'=>'Enregistrement supprimé',
'Please enter' =>'Entrez s\'il vous plaît',
'months' => Array(
'01'=>'Janvier',
'02'=>'Février',
'03'=>'Mars',
'04'=>'Avril',
'05'=>'Mai',
'06'=>'Juin',
'07'=>'Juillet',
'08'=>'Août',
'09'=>'Septembre',
'10'=>'Octobre',
'11'=>'Novembre',
'12'=>'Décembre'),
// phpMyEdit-report
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ET.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: estonian
* encoding: any latin
* date: 2005-09-13
* author: Alexia Death <alexiadeath@hotmail.com>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ET.inc,v 1.1 2005-09-14 13:40:19 nepto Exp $ */
 
return Array(
'Add' =>'Lisa',
'Copy' =>'Kopeeri',
'Change' =>'Muuda',
'Delete' =>'Kustuta',
'View' =>'Vaata',
'Prev' =>'Eelmine',
'Next' =>htmlentities('Järgmine'),
'First' =>'Esimene',
'Last' =>'Viimane',
'Go to' =>'Positsioon',
'Page' =>'Leht',
'Records' =>'Kirjed',
'Save' =>'Salvesta',
'More' =>htmlentities('Järgneb...'),
'Apply' =>'Rakenda muutused',
'Cancel' =>htmlentities('Tühista'),
'Search' =>'Otsi',
'Hide' =>'Peida',
'Clear' =>htmlentities('Tühjenda väljad'),
'Query' =>htmlentities('Päring'),
'Current Query' =>htmlentities('Hetke päring'),
'Sorted By' =>htmlentities('Sorteermisjärjekord'),
'ascending' =>'kahanevalt',
'descending' =>'kasvavalt',
'hidden' =>'peidetud',
'of' =>'/',
'record added' =>'kirje lisatud',
'record changed' =>'kirje muudetud',
'record deleted' =>'kirje kustutatud',
'Please enter' =>'Palun sisesta',
'months' => Array(
'01'=>'Jaanuar',
'02'=>'Veebruar',
'03'=>htmlentities('Märts'),
'04'=>'Aprill',
'05'=>'Mai',
'06'=>'Juuni',
'07'=>'Juuli',
'08'=>'August',
'09'=>'September',
'10'=>'Oktoober',
'11'=>'November',
'12'=>'Detsember'),
// phpMyEdit-report
'Make report' => 'Koosta raport',
'Select fields' => htmlentities('Vali väljad'),
'Records per screen' => 'Kirjeid lehe kohta',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.EU.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: basque
* encoding: iso-8859-1
* date: 2004-05-11
* author: Ibon Igartua <ibon@zuhar.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.EU.inc,v 1.1 2004-05-17 10:53:06 nepto Exp $ */
 
return Array(
'Add' =>'Gehitu',
'Copy' =>'Kopiatu',
'Change' =>'Aldatu',
'Delete' =>'Ezabatu',
'View' =>'Ikusi',
'Prev' =>'Aurrekoa',
'Next' =>'Hurrengoa',
'First' =>'Lehena',
'Last' =>'Azkena',
'Go to' =>'Joan',
'Page' =>'Orrialdea',
'Records' =>'Erregistroak',
'Save' =>'Gorde',
'More' =>'Gehiago',
'Apply' =>'Aplikatu',
'Cancel' =>'Utzi',
'Search' =>'Bilatu',
'Hide' =>'Ezkutatu',
'Clear' =>'Garbitu',
'Query' =>'Kontsulta',
'Current Query' =>'Uneko Kontsulta',
'Sorted By' =>'Orden Irizpidea',
'ascending' =>'gorantz',
'descending' =>'beherantz',
'hidden' =>'ezkutukoa',
'of' =>'-',
'record added' =>'erregistroa gehituta',
'record changed'=>'erregistroa aldatuta',
'record deleted'=>'erregistroa ezabatuta',
'Please enter' =>'Mesedez, sartu ezazu ',
'months' => Array(
'01'=>'urtarrila',
'02'=>'otsaila',
'03'=>'martxoa',
'04'=>'apirila',
'05'=>'maiatza',
'06'=>'ekaina',
'07'=>'uztaila',
'08'=>'abuztua',
'09'=>'iraila',
'10'=>'urria',
'11'=>'azaroa',
'12'=>'abendua'),
// phpMyEdit-report
'Make report' => 'Txostena sortu',
'Select fields' => 'Eremuak aukertau',
'Records per screen' => 'Erregistroak orrialdeko',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.NL.inc
New file
0,0 → 1,68
<?php
 
/*
* phpMyEdit language file
*
* language: dutch (standard)
* encoding: iso-8859-1
* date: 2002-09-21, 2002-12-17, 2006-01-05
* authors:
* Paul Barends <pbarends@xs4all.nl>
* Erwin Janszen <Erwin.Janszen@mail.ing.nl>
* URL:
* http://platon.sk/projects/bug_view_advanced_page.php?f_bug_id=197
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.NL.inc,v 1.16 2006-01-05 04:45:22 nepto Exp $ */
 
return Array(
'Add' =>'Toevoegen',
'Copy' =>'Kopiëren',
'Change' =>'Bewerken',
'Delete' =>'Wissen',
'View' =>'Details',
'Prev' =>'Vorige',
'Next' =>'Volgende',
'First' =>'Eerste',
'Last' =>'Laatste',
'Go to' =>'Ga naar',
'Page' =>'Pagina',
'Records' =>'Rijen',
'Save' =>'Bewaren',
'More' =>'Meer',
'Apply' =>'Toepassen',
'Cancel' =>'Annuleren',
'Search' =>'Zoeken',
'Hide' =>'Verbergen',
'Clear' =>'Schonen', // 'Leeg maken',
'Query' =>'Selecteer', // 'Selectie maken',
'Current Query' =>'Huidige selectie',
'Sorted By' =>'Gesorteerd op',
'ascending' =>'oplopend',
'descending' =>'aflopend',
'hidden' =>'verborgen',
'of' =>'van',
'record added' =>'rij toegevoegd',
'record changed' =>'rij aangepast',
'record deleted' =>'rij gewist',
'Please enter' =>'Voer a.u.b. in:',
'months' => Array(
'01'=>'januari',
'02'=>'februari',
'03'=>'maart',
'04'=>'april',
'05'=>'mei',
'06'=>'juni',
'07'=>'juli',
'08'=>'augustus',
'09'=>'september',
'10'=>'october',
'11'=>'november',
'12'=>'december'),
// phpMyEdit-report
'Make report' => 'Maak rapport',
'Select fields' => 'Selecteer velden',
'Records per screen' => 'Rij per scherm',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,42,14
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/util/lang/PME.lang.PL.inc
New file
0,0 → 1,60
<?php
 
/*
* phpMyEdit language file
*
* language: polish
* encoding: iso-8859-2
* date: 2002-10-01, 2003-06-30
* author: Piotr Walesiuk <p.walesiuk@bos.com.pl>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.PL.inc,v 1.9 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Dodaj',
'Copy' =>'Kopiuj',
'Change' =>'Zmieñ',
'Delete' =>'Usuñ',
'View' =>'Poka¿',
'Prev' =>'Wstecz',
'Next' =>'Dalej',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'Strona',
'Records' =>'Rekordy',
'Save' =>'Zapisz',
'More' =>'Wiêcej',
'Apply' =>'Zastosuj',
'Cancel' =>'Anuluj',
'Search' =>'Szukaj',
'Hide' =>'Ukryj',
'Clear' =>'Wyczy¶æ',
'Query' =>'Zapytanie',
'Current Query' =>'Aktualne zapytanie',
'Sorted By' =>'Posortowane wed³ug',
'ascending' =>'rosn±co',
'descending' =>'malej±co',
'hidden' =>'ukryte',
'of' =>'z',
'record added' =>'rekord dodany',
'record changed'=>'rekord zmieniony',
'record deleted'=>'rekord usuniêty',
'Please enter' =>'Proszê wprowadziæ',
'months' => Array(
'01'=>'Styczeñ',
'02'=>'Luty',
'03'=>'Marzec',
'04'=>'Kwiecieñ',
'05'=>'Maj',
'06'=>'Czerwiec',
'07'=>'Lipiec',
'08'=>'Sierpieñ',
'09'=>'Wrzesieñ',
'10'=>'Pa¼dziernik',
'11'=>'Listopad',
'12'=>'Grudzieñ')
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.CZ.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: czech
* encoding: iso-8859-2
* date: 2005-04-26
* author: Jan Cinert <ion_lord@seznam.cz>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.CZ.inc,v 1.1 2005-04-26 13:15:38 nepto Exp $ */
 
return Array(
'Add' =>'Pøidat',
'Copy' =>'Kopírovat',
'Change' =>'Zmìnit',
'Delete' =>'Smazat',
'View' =>'Zobrazit',
'Prev' =>'Pøedcházející',
'Next' =>'Následující',
'First' =>'První',
'Last' =>'Poslední',
'Go to' =>'Otevøít',
'Page' =>'Stránka',
'Records' =>'Záznamù',
'Save' =>'Ulo¾it',
'More' =>'Více',
'Apply' =>'Pou¾ít',
'Cancel' =>'Zru¹it',
'Search' =>'Hledat',
'Hide' =>'Skrýt',
'Clear' =>'Smazat',
'Query' =>'Dotaz',
'Current Query' =>'Stávající dotaz',
'Sorted By' =>'Uspoøádané podle',
'ascending' =>'vzestupnì',
'descending' =>'sestupnì',
'hidden' =>'skrytý',
'of' =>'z',
'record added' =>'pøidaný záznam',
'record changed'=>'zmìnìný záznam',
'record deleted'=>'smazaný záznam',
'Please enter' =>'Zadejte prosím',
'months' => Array(
'01'=>'Leden',
'02'=>'Únor',
'03'=>'Bøezen',
'04'=>'Duben',
'05'=>'Kvìten',
'06'=>'Èerve',
'07'=>'Èervenec',
'08'=>'Srpen',
'09'=>'Záøí',
'10'=>'Øíjen',
'11'=>'Listopad',
'12'=>'Prosinec'),
// phpMyEdit-report
'Make report' => 'Vytvoøit zprávu',
'Select fields' => 'Vybrat pole',
'Records per screen' => 'Poèet záznamù na stránce',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.IT.inc
New file
0,0 → 1,66
<?php
 
/*
* phpMyEdit language file
*
* language: italian (standard)
* encoding: iso-8859-1
* date: 2002-02, 2002-11-07, 2003-04-13, 2004-03-31
* authors:
* Dario <dartar@users.sourceforge.net>
* Keatch <raffaele.spangaro@eurika.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.IT.inc,v 1.15 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Aggiungi',
'Copy' =>'Copia',
'Change' =>'Modifica',
'Delete' =>'Cancella',
'View' =>'Visualizza',
'Prev' =>'Precedente',
'Next' =>'Seguente',
'First' =>'Prima',
'Last' =>'Ultima',
'Go to' =>'Vai a',
'Page' =>'Pagina',
'Records' =>'Voci',
'Save' =>'Salva',
'More' =>'Salva & Continua',
'Apply' =>'Applica',
'Cancel' =>'Annulla',
'Search' =>'Cerca',
'Hide' =>'Nascondi',
'Clear' =>'Svuota',
'Query' =>'Chiedi',
'Current Query' =>'Richiesta Corrente',
'Sorted By' =>'Ordinato per',
'ascending' =>'crescente',
'descending' =>'decrescente',
'hidden' =>'nascosto',
'of' =>'/',
'record added' =>'voce aggiunta',
'record changed'=>'voce modificata',
'record deleted'=>'voce eliminata',
'Please enter' =>'Si prega di riempire il campo: ',
'months' => Array(
'01'=>'Gennaio',
'02'=>'Febbraio',
'03'=>'Marzo',
'04'=>'Aprile',
'05'=>'Maggio',
'06'=>'Giugno',
'07'=>'Luglio',
'08'=>'Agosto',
'09'=>'Settembre',
'10'=>'Ottobre',
'11'=>'Novembre',
'12'=>'Dicembre'),
// phpMyEdit-report
'Make report' => 'Genera report',
'Select fields' => 'Seleziona campi',
'Records per screen' => 'Record per schermata',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.SK.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: slovak
* encoding: iso-8859-2
* date: 2002-02-02, 2003-05-01
* author: Ondrej Jombik <nepto@php.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.SK.inc,v 1.12 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Prida»',
'Copy' =>'Kopírova»',
'Change' =>'Zmeni»',
'Delete' =>'Zmaza»',
'View' =>'Pozrie»',
'Prev' =>'Predchádzajúci',
'Next' =>'Ïal¹í',
'First' =>'Prvý',
'Last' =>'Posledný',
'Go to' =>'Choï na',
'Page' =>'Stránka',
'Records' =>'Záznamov',
'Save' =>'Ulo¾i»',
'More' =>'Viac',
'Apply' =>'Pou¾i»',
'Cancel' =>'Storno',
'Search' =>'Hµada»',
'Hide' =>'Skry»',
'Clear' =>'Zru¹i»',
'Query' =>'Vyhµada»',
'Current Query' =>'Aktuálny dotaz',
'Sorted By' =>'Usporiadané podµa',
'ascending' =>'vzostupne',
'descending' =>'zostupne',
'hidden' =>'skryté',
'of' =>'z',
'record added' =>'záznam pridaný',
'record changed'=>'záznam zmenený',
'record deleted'=>'záznam zmazaný',
'Please enter' =>'Prosím zadajte',
'months' => Array(
'01'=>'Január',
'02'=>'Február',
'03'=>'Marec',
'04'=>'Apríl',
'05'=>'Máj',
'06'=>'Jún',
'07'=>'Júl',
'08'=>'August',
'09'=>'September',
'10'=>'Október',
'11'=>'November',
'12'=>'December'),
// phpMyEdit-report
'Make report' => 'Vytvori» report',
'Select fields' => 'Vybra» ståpce',
'Records per screen' => 'Poèet záznamov na stránke',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.RO.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: romanian
* encoding: iso-8859-1
* date: 2004-12-23
* author: Sebastian Proksch <sproksch@yahoo.com>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.RO.inc,v 1.2 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Adauga',
'Copy' =>'Copiaza',
'Change' =>'Modifica',
'Delete' =>'Sterge',
'View' =>'Vizualizeaza',
'Prev' =>'Precedentul',
'Next' =>'Urmatorul',
'First' =>'First', // untranslated
'Last' =>'Last', // untranslated
'Go to' =>'Go to', // untranslated
'Page' =>'Pagina',
'Records' =>'Inregistrari',
'Save' =>'Salveaza',
'More' =>'Mai mult',
'Apply' =>'Aplica',
'Cancel' =>'Anuleaza',
'Search' =>'Cauta',
'Hide' =>'Ascunde',
'Clear' =>'Anuleaza tot',
'Query' =>'Interogare',
'Current Query' =>'Interogarea curenta',
'Sorted By' =>'Sortat dupa',
'ascending' =>'crescator',
'descending' =>'descrescator',
'hidden' =>'ascuns',
'of' =>'din',
'record added' =>'inregistrare adaugata',
'record changed'=>'inregistrare modificata',
'record deleted'=>'inregistrare stearsa',
'Please enter' =>'Introduceti va rog',
'months' => Array(
'01'=>'Ianuarie',
'02'=>'Februarie',
'03'=>'Martie',
'04'=>'Aprilie',
'05'=>'Mai',
'06'=>'Iunie',
'07'=>'Iulie',
'08'=>'August',
'09'=>'Septembrie',
'10'=>'Octombrie',
'11'=>'Noiembrie',
'12'=>'Decembrie'),
// phpMyEdit-report // untranslated
'Make report' => 'Make report',
'Select fields' => 'Select fields',
'Records per screen' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.ZH.inc
New file
0,0 → 1,66
<?php
 
/*
* phpMyEdit language file
*
* language: chinese (traditional)
* encoding: big5
* date: 2003-06-26, 2004-10-17
* authors:
* Pao-Hsi Huang <doggy@miniasp.com>
* Manix Sio <manixsio@gmail.com>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.ZH.inc,v 1.5 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'·s¼W',
'Copy' =>'½Æ»s',
'Change' =>'Åܧó',
'Delete' =>'§R°£',
'View' =>'À˵ø',
'Prev' =>'¤W¤@­¶',
'Next' =>'¤U¤@­¶',
'First' =>'²Ä¤@­¶',
'Last' =>'³Ì¥½¤@­¶',
'Go to' =>'«e©¹',
'Page' =>'­¶¼Æ',
'Records' =>'¸ê®Æµ§¼Æ',
'Save' =>'Àx¦s',
'More' =>'Àx¦s«áÄ~Äò·s¼W',
'Apply' =>'®M¥Î',
'Cancel' =>'¨ú®ø',
'Search' =>'·j´M',
'Hide' =>'ÁôÂÃ',
'Clear' =>'²M°£',
'Query' =>'¬d¸ß',
'Current Query' =>'¥Ø«e¬d¸ß±ø¥ó',
'Sorted By' =>'±Æ§Ç¨Ì¾Ú',
'ascending' =>'¤É¾­±Æ§Ç',
'descending' =>'­°¾­±Æ§Ç',
'hidden' =>'ÁôÂÃ',
'of' =>'Á`¦@­¶¼Æ',
'record added' =>'µ§¸ê®Æ³Q·s¼W',
'record changed' =>'µ§¸ê®Æ³Q§ó·s',
'record deleted' =>'µ§¸ê®Æ³Q§R°£',
'Please enter' =>'½Ð¿é¤J',
'months' => Array(
'01'=>'¤@¤ë',
'02'=>'¤G¤ë',
'03'=>'¤T¤ë',
'04'=>'¥|¤ë',
'05'=>'¤­¤ë',
'06'=>'¤»¤ë',
'07'=>'¤C¤ë',
'08'=>'¤K¤ë',
'09'=>'¤E¤ë',
'10'=>'¤Q¤ë',
'11'=>'¤Q¤@¤ë',
'12'=>'¤Q¤G¤ë'),
// phpMyEdit-report
'Make report' => '²£¥Í³øªí',
'Select fields' => '¿ï¨úÄæ¦ì',
'Records per screen' => '¨C­¶µ§¼Æ',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.CA.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: català
* encoding: iso-8859-1
* date: 2006-04-06
* author: Josep Maria Faura <j.m.faura@telefonica.net>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.CA.inc,v 1.2 2006-04-11 10:30:46 nepto Exp $ */
 
return Array(
'Add' =>'Afegir',
'Copy' =>'Copiar',
'Change' =>'Modificar',
'Delete' =>'Suprimir',
'View' =>'Visualitzar',
'Prev' =>'Anterior',
'Next' =>'Següent',
'First' =>'Primer',
'Last' =>'Últim',
'Go to' =>'Ves a',
'Page' =>'Pàgina',
'Records' =>'Registres',
'Save' =>'Salvar',
'More' =>'Més',
'Apply' =>'Aplicar',
'Cancel' =>'Cancel·lar',
'Search' =>'Cercar',
'Hide' =>'Amagar',
'Clear' =>'Netejar',
'Query' =>'Consultar',
'Current Query' =>'Consulta actual',
'Sorted By' =>'Ordenat per',
'ascending' =>'ascendent',
'descending' =>'descendent',
'hidden' =>'amagat',
'of' =>'de',
'record added' =>'Registre afegit',
'record changed'=>'Registre modificat',
'record deleted'=>'Registre esborrat',
'Please enter' =>'Sisplau introdueixi ',
'months' => Array(
'01'=>'Gener',
'02'=>'Febrer',
'03'=>'Març',
'04'=>'Abril',
'05'=>'Maig',
'06'=>'Juny',
'07'=>'Juliol',
'08'=>'Agost',
'09'=>'Septembre',
'10'=>'Octubre',
'11'=>'Novembre',
'12'=>'Desembre'),
// phpMyEdit-report
'Make report' => 'Construir informe',
'Select fields' => 'Seleccionar camps',
'Records per screen' => 'Registres per pantalla',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.PT.inc
New file
0,0 → 1,67
<?php
 
/*
* phpMyEdit language file
*
* language: portuguese (standard)
* encoding: iso-8859-1
* date: 2002-02
* author: unknown
*
* last_edit: 2006-05-23 by Sérgio Sanches <ssanches@dcc.online.pt>
* last_edit_purpose: full translation and correction
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.PT.inc,v 1.6 2006-05-29 08:18:04 nepto Exp $ */
 
return Array(
'Add' =>'Adicionar',
'Copy' =>'Copiar',
'Change' =>'Mudar',
'Delete' =>'Apagar',
'View' =>'Ver',
'Prev' =>'Anterior',
'Next' =>'Seguinte',
'First' =>'Primeiro',
'Last' =>'Último',
'Go to' =>'Ir para',
'Page' =>'Página',
'Records' =>'Registos',
'Save' =>'Guardar',
'More' =>'Mais',
'Apply' =>'Aplicar',
'Cancel' =>'Cancelar',
'Search' =>'Procurar',
'Hide' =>'Esconder',
'Clear' =>'Limpar',
'Query' =>'Pesquisa',
'Current Query' =>'Pesquisa Actual',
'Sorted By' =>'Ordenado Por',
'ascending' =>'ascendente',
'descending' =>'descendente',
'hidden' =>'escondido',
'of' =>'de',
'record added' =>'registo adicionado',
'record changed' =>'registo alterado',
'record deleted' =>'registo apagado',
'Please enter' =>'Por favor introduza ',
'months' => Array(
'01'=>'Janeiro',
'02'=>'Fevereiro',
'03'=>'Março',
'04'=>'Abril',
'05'=>'Maio',
'06'=>'Junho',
'07'=>'Julho',
'08'=>'Agosto',
'09'=>'Setembro',
'10'=>'Outubro',
'11'=>'Novembro',
'12'=>'Dezembro'),
// phpMyEdit-report
'Make report' => 'Criar relatório',
'Select fields' => 'Escolher campos',
'Records per screen' => 'Registos por ecran',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.PT-BR.inc
New file
0,0 → 1,64
<?php
 
/*
* phpMyEdit language file
*
* language: portuguese (brazilian)
* encoding: iso-8859-1
* date: 2002-12-23, 2003-01-14, 2003-05-17, 2004-01-21
* author: Roberto Cohen <roberto.cohen@fireman.com.br>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.PT-BR.inc,v 1.8 2004-12-27 20:14:29 nepto Exp $ */
 
return Array(
'Add' =>'Adiciona',
'Copy' =>'Copia',
'Change' =>'Edita',
'Delete' =>'Remove',
'View' =>'Visualiza',
'Prev' =>'Anterior',
'Next' =>'Próximo',
'First' =>'Primeiro',
'Last' =>'Último',
'Go to' =>'Vai para',
'Page' =>'Página',
'Records' =>'Registros',
'Save' =>'Salva',
'More' =>'Mais',
'Apply' =>'Aplica',
'Cancel' =>'Cancela',
'Search' =>'Pesquisa',
'Hide' =>'Esconde',
'Clear' =>'Limpa',
'Query' =>'Resultado',
'Current Query' =>'Resultado atual',
'Sorted By' =>'Ordernado por',
'ascending' =>'crescente',
'descending' =>'descendente',
'hidden' =>'escondido',
'of' =>'de',
'record added' =>'registro adicionado',
'record changed'=>'registro editado',
'record deleted'=>'registro removido',
'Please enter' =>'Por favor, entre',
'months' => Array(
'01'=>'Janeiro',
'02'=>'Fevereiro',
'03'=>'Março',
'04'=>'Abril',
'05'=>'Maio',
'06'=>'Junho',
'07'=>'Julho',
'08'=>'Agosto',
'09'=>'Setembro',
'10'=>'Outubro',
'11'=>'Novembro',
'12'=>'Dezembro'),
// phpMyEdit-report
'Gerar relatório' => 'Make report',
'Selecionar campos' => 'Select fields',
'Registros por tela' => 'Records per screen',
);
 
?>
/tags/v1.1-andromede/jrest/util/lang/PME.lang.TR.inc
New file
0,0 → 1,66
<?php
 
/*
* phpMyEdit language file
*
* language: turkish
* encoding: iso-8859-9
* date: 2003-10-24, 2005-11-13
* authors:
* Nuri Akman <nuri.akman@hazine.gov.tr>
* Kadan Kongar <kagan.kongar@tsrsb.org.tr>
*/
 
/* $Platon: phpMyEdit/lang/PME.lang.TR.inc,v 1.4 2005-11-14 03:15:04 nepto Exp $ */
 
return Array(
'Add' =>'Ekle',
'Copy' =>'Kopyala',
'Change' =>'Deðiþtir',
'Delete' =>'Sil',
'View' =>'Bak',
'Prev' =>'Önceki',
'Next' =>'Sonraki',
'First' =>'Ýlk',
'Last' =>'Son',
'Go to' =>'Git',
'Page' =>'Sayfa',
'Records' =>'Kayýt',
'Save' =>'Kaydet',
'More' =>'Devamý',
'Apply' =>'Uygula',
'Cancel' =>'Ýptal',
'Search' =>'Ara',
'Hide' =>'Gizle',
'Clear' =>'Temizle',
'Query' =>'Sorgu',
'Current Query' =>'Aktif Sorgu',
'Sorted By' =>'Sýralama',
'ascending' =>'artan',
'descending' =>'azalan',
'hidden' =>'gizli',
'of' =>' / ',
'record added' =>'kayýt eklendi',
'record changed' =>'kayýt deðiþtirildi',
'record deleted' =>'kayýt silindi',
'Please enter' =>'Lütfen giriniz :',
'months' => Array(
'01'=>'Ocak',
'02'=>'Þubat',
'03'=>'Mart',
'04'=>'Nisan',
'05'=>'Mayýs',
'06'=>'Haziran',
'07'=>'Temmuz',
'08'=>'Auðustos',
'09'=>'Eylül',
'10'=>'Ekim',
'11'=>'Kasým',
'12'=>'Aralýk'),
// phpMyEdit-report
'Make report' => 'Rapor hazýrla',
'Select fields' => 'Alanlarý seçiniz',
'Records per screen' => 'Sayfa baþýna kayýt',
);
 
?>
/tags/v1.1-andromede/jrest/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,42,20
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/services/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,5,25,17,11,22
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/services/UtilisateurExiste.php
New file
0,0 → 1,27
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class UtilisateurExiste extends JRestService {
 
public function getElement($uid){
 
$mail_utilisateur = $uid[0];
$id_annuaire = Config::get('annuaire_defaut');
 
$controleur = new AnnuaireControleur();
$existe = $controleur->UtilisateurExiste($id_annuaire,$mail_utilisateur, true);
 
$this->envoyer($existe);
}
}
?>
/tags/v1.1-andromede/jrest/services/ExecuteurLien.php
New file
0,0 → 1,49
<?php
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
Class ExecuteurLien extends JRestService {
 
public function getElement($uid){
 
if(isset($uid[0])) {
$lien_code = $uid[0];
$lien = base64_decode(str_replace('_','/',$lien_code));
} else {
return;
}
 
if(!isset($uid[1])) {
$retour_ajax = true;
} else {
$adresse_retour = base64_decode(str_replace('_','/',$uid[1]));
}
echo $lien;
exit;
 
$requete = file_get_contents($lien);
 
if($retour_ajax) {
if($requete) {
$resultat = 'ok';
} else {
$resultat = false;
}
$this->envoyer($resultat);
} else {
header('Location: http://'.$adresse_retour);
exit;
}
}
}
?>
/tags/v1.1-andromede/jrest/services/InformationsUtilisateur.php
New file
0,0 → 1,27
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class InformationsUtilisateur extends JRestService {
 
public function getElement($uid){
 
$mail_utilisateur = $uid[0];
$id_annuaire = Config::get('annuaire_defaut');
 
$controleur = new AnnuaireControleur();
$valeurs = $controleur->obtenirInfosUtilisateurOpenId($id_annuaire,$mail_utilisateur, true);
 
$this->envoyer($valeurs);
}
}
?>
/tags/v1.1-andromede/jrest/services/EnvoiMessage.php
New file
0,0 → 1,44
<?php
 
Class EnvoiMessage extends JRestService {
 
public function getElement($uid){
$identificateur = new IdentificationControleur();
$login = $identificateur->obtenirLoginUtilisateurParCookie();
$identification = $login;
if(!$identification || trim($identification) == '') {
print "false";
return;
}
$id_annuaire = Config::get('annuaire_defaut');
$contenu_message = $_GET['contenu_message'];
$sujet_message = $_GET['sujet_message'];
$destinataire = $_GET['destinataire'];
$messagerie = new MessageControleur();
// on remplace les identifiants par leurs destinataires
$destinataire_mail = $messagerie->obtenirMailParTableauId($id_annuaire, array($destinataire));
if(empty($destinataire_mail)) {
print "false";
return;
}
$destinataire_mail = $destinataire_mail[0];
$retour = $messagerie->envoyerMail($identification, $destinataire_mail, $sujet_message, $contenu_message);
 
if($retour) {
print "OK";
} else {
print "false";
}
}
}
 
?>
/tags/v1.1-andromede/jrest/services/GestionLettreActu.php
New file
0,0 → 1,38
<?php
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
Class GestionLettreActu extends JRestService {
 
public function getElement($uid){
 
// TODO : rajouter controle d'accès !
 
$id_utilisateur = $uid[0];
$mail_utilisateur = $uid[1];
 
if(isset($uid[2])) {
$id_annuaire = $uid[2];
} else {
$id_annuaire = Config::get('annuaire_defaut');
}
 
$controleur = new LettreControleur();
$est_abonne = $controleur->estAbonneLettreActualite($id_annuaire,$id_utilisateur);
 
$changement = $controleur->abonnerDesabonnerLettreActualite($id_annuaire, $id_utilisateur, !$est_abonne);
 
echo 'OK';
 
}
}
?>
/tags/v1.1-andromede/jrest/services/StatistiquesAnnuaire.php
New file
0,0 → 1,30
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class StatistiquesAnnuaire extends JRestService {
 
public function getElement($uid){
 
if(!isset($uid[0])) {
$id_annuaire = $uid[0];
} else {
$id_annuaire = Config::get('annuaire_defaut');
}
 
$controleur = new StatistiquesControleur();
$valeurs = $controleur->obtenirGraphiques($id_annuaire);
 
$this->envoyer($valeurs);
}
}
?>
/tags/v1.1-andromede/jrest/services/InscritsRss.php
New file
0,0 → 1,74
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class InscritsRss extends JRestService {
 
public function getElement($uid){
 
$mail_utilisateur = $uid[0];
$admin = (isset($uid[1])) ? $uid[1] : false;
$id_annuaire = Config::get('annuaire_defaut');
if($admin) {
$this->authentifier();
}
 
$controleur = new RSSControleur();
$inscrits = $controleur->obtenirDerniersInscritsRSS($id_annuaire, $admin);
 
$this->envoyer($inscrits, 'text/xml',Config::get('sortie_encodage'), false);
}
public function authentifier() {
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset=UTF-8');
echo 'Accès interdit';
exit;
} else {
if($this->verifierAcces($_SERVER['PHP_AUTH_USER'])) {
return ;
}
else
{
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset=UTF-8');
echo 'Accès interdit';
exit ;
}
}
}
 
public function verifierAcces($id) {
$query="SELECT ".$this->config['database_ident']['ann_id']." as name FROM ".$this->config['database_ident']['database'].'.'.$this->config['database_ident']['annuaire']." WHERE ".$this->config['database_ident']['ann_id']." =".$this->bdd->quote($id)
." AND ".$this->config['database_ident']['ann_pwd']." = ".$this->config['database_ident']['pass_crypt_funct']."(".$this->bdd->quote($_SERVER['PHP_AUTH_PW']).")" ;
 
$res = $this->bdd->query($query);
if($res == "") {
return false ;
}
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
return true ;
 
}
}
?>
/tags/v1.1-andromede/jrest/services/Gestion.php
New file
0,0 → 1,54
<?php
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
Class Gestion extends JRestService {
 
public function getElement($uid){
 
$id_utilisateur = $uid[0];
$mail_utilisateur = $uid[1];
 
if(isset($uid[2])) {
$id_annuaire = $uid[2];
} else {
$id_annuaire = Config::get('annuaire_defaut');
}
 
$controleur = new LettreControleur();
$est_abonne = $controleur->estAbonneLettreActualite($id_annuaire,$id_utilisateur);
 
$resume['titre'] = 'Lettre d\'actualit&eacute;';
 
if($est_abonne == '1') {
$message = 'Vous &ecirc;tes abonn&eacute; &agrave; la lettre d\'actualit&eacute;';
$intitule_lien = 'Se desinscrire';
} else {
$message = 'Vous n\'&ecirc;tes pas abonn&eacute; &agrave; la lettre d\'actualit&eacute;';
$intitule_lien = 'S\'inscrire';
}
$base_url_application = $controleur->getUrlBaseComplete();
$cible_lien_desinscrire = $base_url_application.'/jrest/GestionLettreActu/'.$id_utilisateur.DS.$mail_utilisateur.DS.$id_annuaire;
$cible_lien = $base_url_application.'/jrest/GestionLettreActu/'.$id_utilisateur.DS.$mail_utilisateur.DS.$id_annuaire;
$resume_item = array('element' => $message, 'intitule_lien' => $intitule_lien, 'lien_desinscrire' => $cible_lien_desinscrire, 'lien' => $cible_lien);
$resume['elements'][] = $resume_item;
 
$this->envoyer($resume);
}
 
public function updateElement($uid, $pairs) {
 
}
}
?>
/tags/v1.1-andromede/jrest/services/JRestService.php
New file
0,0 → 1,238
<?php
/**
* Classe mère abstraite contenant les méthodes génériques des services.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
abstract class JRestService {
 
public $config;
protected $bdd;
protected $log = array();
protected $messages = array();
protected $debug = array();
protected $distinct = false;
protected $orderby = null;
protected $formatRetour = 'objet';
protected $start = 0;
protected $limit = 150;
 
public function __construct($config, $demarrer_session = true) {
// Tableau contenant la config de Jrest
$this->config = $config;
 
// Connection à la base de données
$this->bdd = $this->connecterPDO($this->config, 'appli');
 
// Nettoyage du $_GET (sécurité)
if (isset($_GET)) {
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
foreach ($get_params as $get) {
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
if (isset($_GET[$get]) && $_GET[$get] != '') {
$this->$get = $_GET[$get];
} else {
$_GET[$get] = null;
}
}
}
}
 
/**
* Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
*/
public function getRessource() {
$this->getElement(array());
}
 
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
// Traitements des messages d'erreurs et données
if (count($this->messages) != 0) {
header('HTTP/1.1 500 Internal Server Error');
$mime = 'text/html';
$encodage = 'utf-8';
$json = true;
$sortie = $this->messages;
} else {
$sortie = $donnees;
if (is_null($donnees)) {
$sortie = 'OK';
}
}
 
// Gestion de l'envoie du déboguage
$this->envoyerDebogage();
 
// Encodage au format et JSON et envoie sur la sortie standard
$contenu = $json ? json_encode($sortie) : $sortie;
$this->envoyerContenu($encodage, $mime, $contenu);
}
 
protected function envoyerDebogage() {
if (!is_array($this->debug)) {
$this->debug[] = $this->debug;
}
if (count($this->debug) != 0) {
foreach ($this->debug as $cle => $val) {
if (is_array($val)) {
$this->debug[$cle] = print_r($val, true);
}
}
header('X-DebugJrest-Data:'.json_encode($this->debug));
}
}
 
protected function envoyerContenu($encodage, $mime, $contenu) {
header("Content-Type: $mime; charset=$encodage");
print $contenu;
}
 
private function connecterPDO($config, $base = 'database') {
$cfg = $config[$base];
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
try {
$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
}
// Passe en UTF-8 la connexion à la BDD
$PDO->exec("SET NAMES 'utf8'");
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $PDO;
}
 
protected function getTxt($id) {
$sortie = '';
switch ($id) {
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
default : $sortie = $id;
}
return $sortie;
}
 
protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
$sortie = array();
foreach ($params_attendu as $num => $nom) {
if (isset($params[$num]) && $params[$num] != '*') {
if ($pourBDD) {
$params[$num] = $this->bdd->quote($params[$num]);
}
$sortie[$nom] = $params[$num];
}
}
return $sortie;
}
 
protected function traiterParametresPost($params) {
$sortie = array();
foreach ($params as $cle => $valeur) {
$sortie[$cle] = $this->bdd->quote($valeur);
}
return $sortie;
}
 
protected function getIdentification(&$params) {
// Initialisation des variables
$utilisateur = array(0, session_id());
 
// L'id utilisateur est soit passé par le POST soit dans l'url
if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
$utilisateur[0] = $params['cmhl_ce_modifier_par'];
unset($params['cmhl_ce_modifier_par']);
} else if (is_string($params)) {
$utilisateur[0] = $params;
}
 
return $utilisateur;
}
 
protected function etreAutorise($id_utilisateur) {
$autorisation = false;
if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {
$this->messages[] = 'Accès interdit.';
} else if ($_SESSION['coel_utilisateur'] == '') {
$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
} else {
$autorisation = true;
}
return $autorisation;
}
 
private function gererIdentificationPermanente() {
// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
if ($this->getUtilisateur() == ''
&& isset($_COOKIE['coel_login'])
&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
}
}
 
protected function getUtilisateur() {
return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
}
 
/**
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
*
* @param String $fichier le chemin du fichier du squelette
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette.
*
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
*/
public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
$sortie = false;
if (file_exists($fichier)) {
// Extraction des variables du tableau de données
extract($donnees);
// Démarage de la bufferisation de sortie
ob_start();
// Si les tags courts sont activés
if ((bool) @ini_get('short_open_tag') === true) {
// Simple inclusion du squelette
include $fichier;
} else {
// Sinon, remplacement des tags courts par la syntaxe classique avec echo
$html_et_code_php = self::traiterTagsCourts($fichier);
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
$html_et_code_php = '?>'.$html_et_code_php;
// Interprétation du html et du php dans le buffer
echo eval($html_et_code_php);
}
// Récupèration du contenu du buffer
$sortie = ob_get_contents();
// Suppression du buffer
@ob_end_clean();
} else {
$msg = "Le fichier du squelette '$fichier' n'existe pas.";
trigger_error($msg, E_USER_WARNING);
}
// Retourne le contenu
return $sortie;
}
 
/**
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
*
* @param String $chemin_squelette le chemin du fichier du squelette
*
* @return string le contenu du fichier du squelette php avec les tags courts remplacés.
*/
private static function traiterTagsCourts($chemin_squelette) {
$contenu = file_get_contents($chemin_squelette);
// Remplacement de tags courts par un tag long avec echo
$contenu = str_replace('<?=', '<?php echo ', $contenu);
// Ajout systématique d'un point virgule avant la fermeture php
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
return $contenu;
}
}
?>
/tags/v1.1-andromede/jrest/services/TestLoginMdp.php
New file
0,0 → 1,36
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class TestLoginMdp extends JRestService {
 
public function getElement($uid){
 
if(!isset($uid[0]) || $uid[0] == '' || !isset($uid[1]) || $uid[1] == '') {
$this->envoyer(false);
return;
}
 
$mail_utilisateur = $uid[0];
$pass = $uid[1];
 
// TODO vérifier que le mot de passe est crypté !
 
$id_annuaire = Config::get('annuaire_defaut');
 
$controleur = new AnnuaireControleur();
$id_match_pass = $controleur->comparerIdentifiantMotDePasse($id_annuaire,$mail_utilisateur, $pass, true, true);
 
$this->envoyer($id_match_pass);
}
}
?>
/tags/v1.1-andromede/jrest/lib/Log.php
New file
0,0 → 1,195
<?php
//declare(encoding='UTF-8');
/**
* Classe permettant de logger des messages dans les fichier situés dans le dossier de log
*
* PHP Version 5
*
* @category PHP
* @package Framework
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/framework/
*/
 
class Log {
 
/**
* Tableau associatif stockant les descripteurs de fichiers
*/
private static $fichiersLog = array();
 
/**
* Chemin de base du dossier log de l'application
*/
private static $cheminLogs = '';
 
/**
* Booleen indiquant si l'on peut correctement écrire dans les fichiers de logs
*/
private static $droitLogger = true;
 
/**
* Zone horaire (pour éviter des avertissements dans les dates)
*/
private static $timeZone = '';
 
/**
* Taille maximum d'un fichier de log avant que celui ne soit archivé (en octets)
*/
private static $tailleMax = 10000;
 
/**
* séparateur de chemin
*/
private static $sd = DIRECTORY_SEPARATOR;
 
/**
* Extension des fichiers de log
*/
private static $ext = '.log';
 
/**
* La classe registre se contient elle-même, (pour le pattern singleton)
*/
private static $log;
 
/**
* Constructeur par défaut, privé, car on accède à la classe par le getInstance
*/
private function __construct() {
 
self::$sd = $sd;
// gestion de la timezone pour éviter des erreurs
if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get")) {
date_default_timezone_set(self::$timeZone);
}
 
if(!is_dir(self::$cheminLogs) || !is_writable(self::$cheminLogs)) {
self::desactiverEcriture();
}
}
 
public static function setCheminLog($nouveauCheminLogs) {
self::$cheminLogs = $nouveauCheminLogs;
}
 
public static function getCheminLog() {
return self::$cheminLogs;
}
 
public static function setTimeZone($NouvelleTimeZone) {
self::$timeZone = $NouvelleTimeZone;
}
 
public static function setTailleMax($nouvelleTailleMax) {
self::$tailleMax = $nouvelleTailleMax;
}
 
/**
* Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être
* utilisée pour récupérer l'objet Registre
* @return Log le gestionnaire de log en cours
*/
public static function getInstance() {
if (self::$log instanceof Log) {
return self::$log;
}
self::$log = new Log();
return self::$log;
}
 
/**
* Ajoute une entrée au log spécifié par le paramètre $nomFichier
* @param string $nomFichier le nom du fichier dans lequel écrire
*/
public static function ajouterEntree($nomFichier,$entree,$mode='a+') {
if(self::$droitLogger) {
$date = "\n"."\n".date('d m Y H:i')."\n" ;
 
// si le fichier est déjà dans le tableau et qu'on peut y écrire
if(self::verifierOuvrirFichier($nomFichier,$mode)) {
// on y écrit le message de log
fwrite(self::$fichiersLog[$nomFichier],$date.$entree);
// on vérifie si le fichier ne dépasse pas la taille maximale
self::verifierTailleFichierOuArchiver($nomFichier);
} else {
// sinon on interdit l'écriture
self::desactiverEcriture($nomFichier);
}
}
}
 
/**
* Vide un fichier log indiqué
* @param string $nomFichier le nom du fichier à vider
*/
public static function viderLog($nomFichier) {
ajouterEntree($nomFichier,'','w');
}
 
/**
* Vérifie la présence d'un fichier dans le tableau, ses droits d'écriture,
* l'ouvre si nécessaire
* @param string $nomFichier le nom du fichier dont on doit vérifier la présence
* @return boolean true si le fichier est ouvert ou maintenant accessible, false sinon
*/
public static function verifierOuvrirFichier($nomFichier,$mode) {
// le fichier est il déjà ouvert ?
if(in_array($nomFichier,self::$fichiersLog)) {
// si oui peut on y écrire ?
if(is_writable(self::$cheminLogs.$nomFichier.self::$ext)) {
// si oui on renvoie le descripteur
return true;
}
return false;
} else {
// sinon on l'ouvre
$fp = @fopen(self::$cheminLogs.$nomFichier.self::$ext,$mode);
// si l'ouverture a réussi et si le fichier a les droits d'écriture
if($fp && is_writable(self::$cheminLogs.$nomFichier.self::$ext)) {
// si oui on renvoie le descripteur qu'on ajoute au tableau
self::$fichiersLog[$nomFichier] = $fp;
return true;
}
return false;
}
}
 
/**
* Vérifie la taille d'un fichier donné et si celle ci est trop importante
* archive le fichier de log
* @param string $nomFichier nom du fichier à vérifier
*/
private static function verifierTailleFichierOuArchiver($nomFichier) {
if(filesize(self::$cheminLogs.$nomFichier.self::$ext) > self::$tailleMax) {
rename(self::$cheminLogs.$nomFichier.self::$ext,self::$cheminLogs.$nomFichier.date('d_m_Y_H:i').self::$ext);
self::ajouterEntree($nomFichier,'');
}
}
 
/**
* Désactive l'écriture du log et envoie un message au gestionnaire d'erreurs
* @param string $nomFichier le nom du fichier qui a causé l'erreur
*/
private static function desactiverEcriture($nomFichier = '') {
self::$droitLogger = false;
if($nomFichier != '') {
$fichierDossier = 'fichier '.$nomFichier ;
} else {
$fichierDossier = 'dossier des logs';
}
}
 
/**
* destructeur de classe, ferme les descripteurs ouverts
*/
public function __destruct() {
foreach(self::$fichiersLog as $nomFichier => $fp) {
fclose($fp);
}
}
}
?>
/tags/v1.1-andromede/jrest/lib/zip.php
New file
0,0 → 1,190
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
*
* @version $Id: zip.lib.php 10240 2007-04-01 11:02:46Z cybot_tm $
*/
 
/**
* Zip file creation class.
* Makes zip files.
*
* Based on :
*
* http://www.zend.com/codex.php?id=535&single=1
* By Eric Mueller <eric@themepark.com>
*
* http://www.zend.com/codex.php?id=470&single=1
* by Denis125 <webmaster@atlant.ru>
*
* a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
* date and time of the compressed file
*
* Official ZIP file format: http://www.pkware.com/appnote.txt
*
* @access public
*/
class zipfile
{
/**
* Array to store compressed data
*
* @var array $datasec
*/
var $datasec = array();
 
/**
* Central directory
*
* @var array $ctrl_dir
*/
var $ctrl_dir = array();
 
/**
* End of central directory record
*
* @var string $eof_ctrl_dir
*/
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
 
/**
* Last offset position
*
* @var integer $old_offset
*/
var $old_offset = 0;
 
 
/**
* Converts an Unix timestamp to a four byte DOS date and time format (date
* in high two bytes, time in low two bytes allowing magnitude comparison).
*
* @param integer the current Unix timestamp
*
* @return integer the current date in a four byte DOS format
*
* @access private
*/
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
 
if ($timearray['year'] < 1980) {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
} // end if
 
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
} // end of the 'unix2DosTime()' method
 
 
/**
* Adds "file" to archive
*
* @param string file contents
* @param string name of the file in the archive (may contains the path)
* @param integer the current timestamp
*
* @access public
*/
function addFile($data, $name, $time = 0)
{
$name = str_replace('\\', '/', $name);
 
$dtime = dechex($this->unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');
 
$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date
 
// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;
 
// "file data" segment
$fr .= $zdata;
 
// "data descriptor" segment (optional but necessary if archive is not
// served as file)
// nijel(2004-10-19): this seems not to be needed at all and causes
// problems in some cases (bug #1037737)
//$fr .= pack('V', $crc); // crc32
//$fr .= pack('V', $c_len); // compressed filesize
//$fr .= pack('V', $unc_len); // uncompressed filesize
 
// add this entry to array
$this -> datasec[] = $fr;
 
// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name)); // length of filename
$cdrec .= pack('v', 0); // extra field length
$cdrec .= pack('v', 0); // file comment length
$cdrec .= pack('v', 0); // disk number start
$cdrec .= pack('v', 0); // internal file attributes
$cdrec .= pack('V', 32); // external file attributes - 'archive' bit set
 
$cdrec .= pack('V', $this -> old_offset); // relative offset of local header
$this -> old_offset += strlen($fr);
 
$cdrec .= $name;
 
// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method
 
 
/**
* Dumps out file
*
* @return string the zipped file
*
* @access public
*/
function file()
{
$data = implode('', $this -> datasec);
$ctrldir = implode('', $this -> ctrl_dir);
 
return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
} // end of the 'file()' method
 
} // end of the 'zipfile' class
?>
/tags/v1.1-andromede/jrest/lib/DB.php
New file
0,0 → 1,1114
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Stig Bakken <ssb@php.net> |
// | Tomas V.V.Cox <cox@idecnet.com> |
// | Maintainer: Daniel Convissor <danielc@php.net> |
// +----------------------------------------------------------------------+
//
// $Id$
//
// Database independent query interface.
 
 
require_once 'PEAR.php';
 
// {{{ constants
// {{{ error codes
 
/*
* The method mapErrorCode in each DB_dbtype implementation maps
* native error codes to one of these.
*
* If you add an error code here, make sure you also add a textual
* version of it in DB::errorMessage().
*/
define('DB_OK', 1);
define('DB_ERROR', -1);
define('DB_ERROR_SYNTAX', -2);
define('DB_ERROR_CONSTRAINT', -3);
define('DB_ERROR_NOT_FOUND', -4);
define('DB_ERROR_ALREADY_EXISTS', -5);
define('DB_ERROR_UNSUPPORTED', -6);
define('DB_ERROR_MISMATCH', -7);
define('DB_ERROR_INVALID', -8);
define('DB_ERROR_NOT_CAPABLE', -9);
define('DB_ERROR_TRUNCATED', -10);
define('DB_ERROR_INVALID_NUMBER', -11);
define('DB_ERROR_INVALID_DATE', -12);
define('DB_ERROR_DIVZERO', -13);
define('DB_ERROR_NODBSELECTED', -14);
define('DB_ERROR_CANNOT_CREATE', -15);
define('DB_ERROR_CANNOT_DELETE', -16);
define('DB_ERROR_CANNOT_DROP', -17);
define('DB_ERROR_NOSUCHTABLE', -18);
define('DB_ERROR_NOSUCHFIELD', -19);
define('DB_ERROR_NEED_MORE_DATA', -20);
define('DB_ERROR_NOT_LOCKED', -21);
define('DB_ERROR_VALUE_COUNT_ON_ROW', -22);
define('DB_ERROR_INVALID_DSN', -23);
define('DB_ERROR_CONNECT_FAILED', -24);
define('DB_ERROR_EXTENSION_NOT_FOUND',-25);
define('DB_ERROR_ACCESS_VIOLATION', -26);
define('DB_ERROR_NOSUCHDB', -27);
define('DB_ERROR_CONSTRAINT_NOT_NULL',-29);
 
 
// }}}
// {{{ prepared statement-related
 
 
/*
* These constants are used when storing information about prepared
* statements (using the "prepare" method in DB_dbtype).
*
* The prepare/execute model in DB is mostly borrowed from the ODBC
* extension, in a query the "?" character means a scalar parameter.
* There are two extensions though, a "&" character means an opaque
* parameter. An opaque parameter is simply a file name, the real
* data are in that file (useful for putting uploaded files into your
* database and such). The "!" char means a parameter that must be
* left as it is.
* They modify the quote behavoir:
* DB_PARAM_SCALAR (?) => 'original string quoted'
* DB_PARAM_OPAQUE (&) => 'string from file quoted'
* DB_PARAM_MISC (!) => original string
*/
define('DB_PARAM_SCALAR', 1);
define('DB_PARAM_OPAQUE', 2);
define('DB_PARAM_MISC', 3);
 
 
// }}}
// {{{ binary data-related
 
 
/*
* These constants define different ways of returning binary data
* from queries. Again, this model has been borrowed from the ODBC
* extension.
*
* DB_BINMODE_PASSTHRU sends the data directly through to the browser
* when data is fetched from the database.
* DB_BINMODE_RETURN lets you return data as usual.
* DB_BINMODE_CONVERT returns data as well, only it is converted to
* hex format, for example the string "123" would become "313233".
*/
define('DB_BINMODE_PASSTHRU', 1);
define('DB_BINMODE_RETURN', 2);
define('DB_BINMODE_CONVERT', 3);
 
 
// }}}
// {{{ fetch modes
 
 
/**
* This is a special constant that tells DB the user hasn't specified
* any particular get mode, so the default should be used.
*/
define('DB_FETCHMODE_DEFAULT', 0);
 
/**
* Column data indexed by numbers, ordered from 0 and up
*/
define('DB_FETCHMODE_ORDERED', 1);
 
/**
* Column data indexed by column names
*/
define('DB_FETCHMODE_ASSOC', 2);
 
/**
* Column data as object properties
*/
define('DB_FETCHMODE_OBJECT', 3);
 
/**
* For multi-dimensional results: normally the first level of arrays
* is the row number, and the second level indexed by column number or name.
* DB_FETCHMODE_FLIPPED switches this order, so the first level of arrays
* is the column name, and the second level the row number.
*/
define('DB_FETCHMODE_FLIPPED', 4);
 
/* for compatibility */
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED);
 
 
// }}}
// {{{ tableInfo() && autoPrepare()-related
 
 
/**
* these are constants for the tableInfo-function
* they are bitwised or'ed. so if there are more constants to be defined
* in the future, adjust DB_TABLEINFO_FULL accordingly
*/
define('DB_TABLEINFO_ORDER', 1);
define('DB_TABLEINFO_ORDERTABLE', 2);
define('DB_TABLEINFO_FULL', 3);
 
/*
* Used by autoPrepare()
*/
define('DB_AUTOQUERY_INSERT', 1);
define('DB_AUTOQUERY_UPDATE', 2);
 
 
// }}}
// {{{ portability modes
 
 
/**
* Portability: turn off all portability features.
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_NONE', 0);
 
/**
* Portability: convert names of tables and fields to lower case
* when using the get*(), fetch*() and tableInfo() methods.
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_LOWERCASE', 1);
 
/**
* Portability: right trim the data output by get*() and fetch*().
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_RTRIM', 2);
 
/**
* Portability: force reporting the number of rows deleted.
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_DELETE_COUNT', 4);
 
/**
* Portability: enable hack that makes numRows() work in Oracle.
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_NUMROWS', 8);
 
/**
* Portability: makes certain error messages in certain drivers compatible
* with those from other DBMS's.
*
* + mysql, mysqli: change unique/primary key constraints
* DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT
*
* + odbc(access): MS's ODBC driver reports 'no such field' as code
* 07001, which means 'too few parameters.' When this option is on
* that code gets mapped to DB_ERROR_NOSUCHFIELD.
*
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_ERRORS', 16);
 
/**
* Portability: convert null values to empty strings in data output by
* get*() and fetch*().
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_NULL_TO_EMPTY', 32);
 
/**
* Portability: turn on all portability features.
* @see DB_common::setOption()
*/
define('DB_PORTABILITY_ALL', 63);
 
// }}}
 
 
// }}}
// {{{ class DB
 
/**
* The main "DB" class is simply a container class with some static
* methods for creating DB objects as well as some utility functions
* common to all parts of DB.
*
* The object model of DB is as follows (indentation means inheritance):
*
* DB The main DB class. This is simply a utility class
* with some "static" methods for creating DB objects as
* well as common utility functions for other DB classes.
*
* DB_common The base for each DB implementation. Provides default
* | implementations (in OO lingo virtual methods) for
* | the actual DB implementations as well as a bunch of
* | query utility functions.
* |
* +-DB_mysql The DB implementation for MySQL. Inherits DB_common.
* When calling DB::factory or DB::connect for MySQL
* connections, the object returned is an instance of this
* class.
*
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V.Cox <cox@idecnet.com>
* @since PHP 4.0
* @version $Id$
* @category Database
*/
class DB
{
// {{{ &factory()
 
/**
* Create a new DB object for the specified database type.
*
* Allows creation of a DB_<driver> object from which the object's
* methods can be utilized without actually connecting to a database.
*
* @param string $type database type, for example "mysql"
* @param array $options associative array of option names and values
*
* @return object a new DB object. On error, an error object.
*
* @see DB_common::setOption()
* @access public
*/
function &factory($type, $options = false)
{
if (!is_array($options)) {
$options = array('persistent' => $options);
}
 
if (isset($options['debug']) && $options['debug'] >= 2) {
// expose php errors with sufficient debug level
include_once "DB/{$type}.php";
} else {
@include_once "DB/{$type}.php";
}
 
$classname = "DB_${type}";
 
if (!class_exists($classname)) {
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
"Unable to include the DB/{$type}.php file",
'DB_Error', true);
return $tmp;
}
 
@$obj =& new $classname;
 
foreach ($options as $option => $value) {
$test = $obj->setOption($option, $value);
if (DB::isError($test)) {
return $test;
}
}
 
return $obj;
}
 
// }}}
// {{{ &connect()
 
/**
* Create a new DB object and connect to the specified database.
*
* Example 1.
* <code> <?php
* require_once 'DB.php';
*
* $dsn = 'mysql://user:password@host/database'
* $options = array(
* 'debug' => 2,
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $dbh =& DB::connect($dsn, $options);
* if (DB::isError($dbh)) {
* die($dbh->getMessage());
* }
* ?></code>
*
* @param mixed $dsn string "data source name" or an array in the
* format returned by DB::parseDSN()
*
* @param array $options an associative array of option names and
* their values
*
* @return object a newly created DB connection object, or a DB
* error object on error
*
* @see DB::parseDSN(), DB_common::setOption(), DB::isError()
* @access public
*/
function &connect($dsn, $options = array())
{
$dsninfo = DB::parseDSN($dsn);
$type = $dsninfo['phptype'];
 
if (!is_array($options)) {
/*
* For backwards compatibility. $options used to be boolean,
* indicating whether the connection should be persistent.
*/
$options = array('persistent' => $options);
}
 
if (isset($options['debug']) && $options['debug'] >= 2) {
// expose php errors with sufficient debug level
include_once "DB/${type}.php";
} else {
@include_once "DB/${type}.php";
}
 
$classname = "DB_${type}";
if (!class_exists($classname)) {
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
"Unable to include the DB/{$type}.php file for `$dsn'",
'DB_Error', true);
return $tmp;
}
 
@$obj =& new $classname;
 
foreach ($options as $option => $value) {
$test = $obj->setOption($option, $value);
if (DB::isError($test)) {
return $test;
}
}
 
$err = $obj->connect($dsninfo, $obj->getOption('persistent'));
if (DB::isError($err)) {
$err->addUserInfo($dsn);
return $err;
}
 
return $obj;
}
 
// }}}
// {{{ apiVersion()
 
/**
* Return the DB API version
*
* @return int the DB API version number
*
* @access public
*/
function apiVersion()
{
return 2;
}
 
// }}}
// {{{ isError()
 
/**
* Tell whether a result code from a DB method is an error
*
* @param int $value result code
*
* @return bool whether $value is an error
*
* @access public
*/
function isError($value)
{
return is_a($value, 'DB_Error');
}
 
// }}}
// {{{ isConnection()
 
/**
* Tell whether a value is a DB connection
*
* @param mixed $value value to test
*
* @return bool whether $value is a DB connection
*
* @access public
*/
function isConnection($value)
{
return (is_object($value) &&
is_subclass_of($value, 'db_common') &&
method_exists($value, 'simpleQuery'));
}
 
// }}}
// {{{ isManip()
 
/**
* Tell whether a query is a data manipulation query (insert,
* update or delete) or a data definition query (create, drop,
* alter, grant, revoke).
*
* @access public
*
* @param string $query the query
*
* @return boolean whether $query is a data manipulation query
*/
function isManip($query)
{
$manips = 'INSERT|UPDATE|DELETE|LOAD DATA|'.'REPLACE|CREATE|DROP|'.
'ALTER|GRANT|REVOKE|'.'LOCK|UNLOCK';
if (preg_match('/^\s*"?('.$manips.')\s+/i', $query)) {
return true;
}
return false;
}
 
// }}}
// {{{ errorMessage()
 
/**
* Return a textual error message for a DB error code
*
* @param integer $value error code
*
* @return string error message, or false if the error code was
* not recognized
*/
function errorMessage($value)
{
static $errorMessages;
if (!isset($errorMessages)) {
$errorMessages = array(
DB_ERROR => 'unknown error',
DB_ERROR_ALREADY_EXISTS => 'already exists',
DB_ERROR_CANNOT_CREATE => 'can not create',
DB_ERROR_CANNOT_DELETE => 'can not delete',
DB_ERROR_CANNOT_DROP => 'can not drop',
DB_ERROR_CONSTRAINT => 'constraint violation',
DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',
DB_ERROR_DIVZERO => 'division by zero',
DB_ERROR_INVALID => 'invalid',
DB_ERROR_INVALID_DATE => 'invalid date or time',
DB_ERROR_INVALID_NUMBER => 'invalid number',
DB_ERROR_MISMATCH => 'mismatch',
DB_ERROR_NODBSELECTED => 'no database selected',
DB_ERROR_NOSUCHFIELD => 'no such field',
DB_ERROR_NOSUCHTABLE => 'no such table',
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
DB_ERROR_NOT_FOUND => 'not found',
DB_ERROR_NOT_LOCKED => 'not locked',
DB_ERROR_SYNTAX => 'syntax error',
DB_ERROR_UNSUPPORTED => 'not supported',
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
DB_ERROR_INVALID_DSN => 'invalid DSN',
DB_ERROR_CONNECT_FAILED => 'connect failed',
DB_OK => 'no error',
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
DB_ERROR_NOSUCHDB => 'no such database',
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions',
DB_ERROR_TRUNCATED => 'truncated'
);
}
 
if (DB::isError($value)) {
$value = $value->getCode();
}
 
return isset($errorMessages[$value]) ? $errorMessages[$value] : $errorMessages[DB_ERROR];
}
 
// }}}
// {{{ parseDSN()
 
/**
* Parse a data source name.
*
* Additional keys can be added by appending a URI query string to the
* end of the DSN.
*
* The format of the supplied DSN is in its fullest form:
* <code>
* phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true
* </code>
*
* Most variations are allowed:
* <code>
* phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644
* phptype://username:password@hostspec/database_name
* phptype://username:password@hostspec
* phptype://username@hostspec
* phptype://hostspec/database
* phptype://hostspec
* phptype(dbsyntax)
* phptype
* </code>
*
* @param string $dsn Data Source Name to be parsed
*
* @return array an associative array with the following keys:
* + phptype: Database backend used in PHP (mysql, odbc etc.)
* + dbsyntax: Database used with regards to SQL syntax etc.
* + protocol: Communication protocol to use (tcp, unix etc.)
* + hostspec: Host specification (hostname[:port])
* + database: Database to use on the DBMS server
* + username: User name for login
* + password: Password for login
*
* @author Tomas V.V.Cox <cox@idecnet.com>
*/
function parseDSN($dsn)
{
$parsed = array(
'phptype' => false,
'dbsyntax' => false,
'username' => false,
'password' => false,
'protocol' => false,
'hostspec' => false,
'port' => false,
'socket' => false,
'database' => false,
);
 
if (is_array($dsn)) {
$dsn = array_merge($parsed, $dsn);
if (!$dsn['dbsyntax']) {
$dsn['dbsyntax'] = $dsn['phptype'];
}
return $dsn;
}
 
// Find phptype and dbsyntax
if (($pos = strpos($dsn, '://')) !== false) {
$str = substr($dsn, 0, $pos);
$dsn = substr($dsn, $pos + 3);
} else {
$str = $dsn;
$dsn = null;
}
 
// Get phptype and dbsyntax
// $str => phptype(dbsyntax)
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
$parsed['phptype'] = $arr[1];
$parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
} else {
$parsed['phptype'] = $str;
$parsed['dbsyntax'] = $str;
}
 
if (!count($dsn)) {
return $parsed;
}
 
// Get (if found): username and password
// $dsn => username:password@protocol+hostspec/database
if (($at = strrpos($dsn,'@')) !== false) {
$str = substr($dsn, 0, $at);
$dsn = substr($dsn, $at + 1);
if (($pos = strpos($str, ':')) !== false) {
$parsed['username'] = rawurldecode(substr($str, 0, $pos));
$parsed['password'] = rawurldecode(substr($str, $pos + 1));
} else {
$parsed['username'] = rawurldecode($str);
}
}
 
// Find protocol and hostspec
 
// $dsn => proto(proto_opts)/database
if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
$proto = $match[1];
$proto_opts = $match[2] ? $match[2] : false;
$dsn = $match[3];
 
// $dsn => protocol+hostspec/database (old format)
} else {
if (strpos($dsn, '+') !== false) {
list($proto, $dsn) = explode('+', $dsn, 2);
}
if (strpos($dsn, '/') !== false) {
list($proto_opts, $dsn) = explode('/', $dsn, 2);
} else {
$proto_opts = $dsn;
$dsn = null;
}
}
 
// process the different protocol options
$parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
$proto_opts = rawurldecode($proto_opts);
if ($parsed['protocol'] == 'tcp') {
if (strpos($proto_opts, ':') !== false) {
list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts);
} else {
$parsed['hostspec'] = $proto_opts;
}
} elseif ($parsed['protocol'] == 'unix') {
$parsed['socket'] = $proto_opts;
}
 
// Get dabase if any
// $dsn => database
if ($dsn) {
// /database
if (($pos = strpos($dsn, '?')) === false) {
$parsed['database'] = $dsn;
// /database?param1=value1&param2=value2
} else {
$parsed['database'] = substr($dsn, 0, $pos);
$dsn = substr($dsn, $pos + 1);
if (strpos($dsn, '&') !== false) {
$opts = explode('&', $dsn);
} else { // database?param1=value1
$opts = array($dsn);
}
foreach ($opts as $opt) {
list($key, $value) = explode('=', $opt);
if (!isset($parsed[$key])) {
// don't allow params overwrite
$parsed[$key] = rawurldecode($value);
}
}
}
}
 
return $parsed;
}
 
// }}}
// {{{ assertExtension()
 
/**
* Load a PHP database extension if it is not loaded already.
*
* @access public
*
* @param string $name the base name of the extension (without the .so or
* .dll suffix)
*
* @return boolean true if the extension was already or successfully
* loaded, false if it could not be loaded
*/
function assertExtension($name)
{
if (!extension_loaded($name)) {
$dlext = OS_WINDOWS ? '.dll' : '.so';
$dlprefix = OS_WINDOWS ? 'php_' : '';
@dl($dlprefix . $name . $dlext);
return extension_loaded($name);
}
return true;
}
// }}}
}
 
// }}}
// {{{ class DB_Error
 
/**
* DB_Error implements a class for reporting portable database error
* messages.
*
* @package DB
* @author Stig Bakken <ssb@php.net>
*/
class DB_Error extends PEAR_Error
{
// {{{ constructor
 
/**
* DB_Error constructor.
*
* @param mixed $code DB error code, or string with error message.
* @param integer $mode what "error mode" to operate in
* @param integer $level what error level to use for $mode & PEAR_ERROR_TRIGGER
* @param mixed $debuginfo additional debug info, such as the last query
*
* @access public
*
* @see PEAR_Error
*/
function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN,
$level = E_USER_NOTICE, $debuginfo = null)
{
if (is_int($code)) {
$this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, $mode, $level, $debuginfo);
} else {
$this->PEAR_Error("DB Error: $code", DB_ERROR, $mode, $level, $debuginfo);
}
}
// }}}
}
 
// }}}
// {{{ class DB_result
 
/**
* This class implements a wrapper for a DB result set.
* A new instance of this class will be returned by the DB implementation
* after processing a query that returns data.
*
* @package DB
* @author Stig Bakken <ssb@php.net>
*/
class DB_result
{
// {{{ properties
 
var $dbh;
var $result;
var $row_counter = null;
 
/**
* for limit queries, the row to start fetching
* @var integer
*/
var $limit_from = null;
 
/**
* for limit queries, the number of rows to fetch
* @var integer
*/
var $limit_count = null;
 
// }}}
// {{{ constructor
 
/**
* DB_result constructor.
* @param resource &$dbh DB object reference
* @param resource $result result resource id
* @param array $options assoc array with optional result options
*/
function DB_result(&$dbh, $result, $options = array())
{
$this->dbh = &$dbh;
$this->result = $result;
foreach ($options as $key => $value) {
$this->setOption($key, $value);
}
$this->limit_type = $dbh->features['limit'];
$this->autofree = $dbh->options['autofree'];
$this->fetchmode = $dbh->fetchmode;
$this->fetchmode_object_class = $dbh->fetchmode_object_class;
}
 
function setOption($key, $value = null)
{
switch ($key) {
case 'limit_from':
$this->limit_from = $value; break;
case 'limit_count':
$this->limit_count = $value; break;
}
}
 
// }}}
// {{{ fetchRow()
 
/**
* Fetch a row of data and return it by reference into an array.
*
* The type of array returned can be controlled either by setting this
* method's <var>$fetchmode</var> parameter or by changing the default
* fetch mode setFetchMode() before calling this method.
*
* There are two options for standardizing the information returned
* from databases, ensuring their values are consistent when changing
* DBMS's. These portability options can be turned on when creating a
* new DB object or by using setOption().
*
* + <samp>DB_PORTABILITY_LOWERCASE</samp>
* convert names of fields to lower case
*
* + <samp>DB_PORTABILITY_RTRIM</samp>
* right trim the data
*
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch
*
* @return array a row of data, null on no more rows or PEAR_Error
* object on error
*
* @see DB_common::setOption(), DB_common::setFetchMode()
* @access public
*/
function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum=null)
{
if ($fetchmode === DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
if ($fetchmode === DB_FETCHMODE_OBJECT) {
$fetchmode = DB_FETCHMODE_ASSOC;
$object_class = $this->fetchmode_object_class;
}
if ($this->limit_from !== null) {
if ($this->row_counter === null) {
$this->row_counter = $this->limit_from;
// Skip rows
if ($this->limit_type == false) {
$i = 0;
while ($i++ < $this->limit_from) {
$this->dbh->fetchInto($this->result, $arr, $fetchmode);
}
}
}
if ($this->row_counter >= (
$this->limit_from + $this->limit_count))
{
if ($this->autofree) {
$this->free();
}
$tmp = null;
return $tmp;
}
if ($this->limit_type == 'emulate') {
$rownum = $this->row_counter;
}
$this->row_counter++;
}
$res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum);
if ($res === DB_OK) {
if (isset($object_class)) {
// default mode specified in DB_common::fetchmode_object_class property
if ($object_class == 'stdClass') {
$arr = (object) $arr;
} else {
$arr = &new $object_class($arr);
}
}
return $arr;
}
if ($res == null && $this->autofree) {
$this->free();
}
return $res;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Fetch a row of data into an array which is passed by reference.
*
* The type of array returned can be controlled either by setting this
* method's <var>$fetchmode</var> parameter or by changing the default
* fetch mode setFetchMode() before calling this method.
*
* There are two options for standardizing the information returned
* from databases, ensuring their values are consistent when changing
* DBMS's. These portability options can be turned on when creating a
* new DB object or by using setOption().
*
* + <samp>DB_PORTABILITY_LOWERCASE</samp>
* convert names of fields to lower case
*
* + <samp>DB_PORTABILITY_RTRIM</samp>
* right trim the data
*
* @param array &$arr (reference) array where data from the row
* should be placed
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch
*
* @return mixed DB_OK on success, null on no more rows or
* a DB_Error object on error
*
* @see DB_common::setOption(), DB_common::setFetchMode()
* @access public
*/
function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum=null)
{
if ($fetchmode === DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
if ($fetchmode === DB_FETCHMODE_OBJECT) {
$fetchmode = DB_FETCHMODE_ASSOC;
$object_class = $this->fetchmode_object_class;
}
if ($this->limit_from !== null) {
if ($this->row_counter === null) {
$this->row_counter = $this->limit_from;
// Skip rows
if ($this->limit_type == false) {
$i = 0;
while ($i++ < $this->limit_from) {
$this->dbh->fetchInto($this->result, $arr, $fetchmode);
}
}
}
if ($this->row_counter >= (
$this->limit_from + $this->limit_count))
{
if ($this->autofree) {
$this->free();
}
return null;
}
if ($this->limit_type == 'emulate') {
$rownum = $this->row_counter;
}
 
$this->row_counter++;
}
$res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum);
if ($res === DB_OK) {
if (isset($object_class)) {
// default mode specified in DB_common::fetchmode_object_class property
if ($object_class == 'stdClass') {
$arr = (object) $arr;
} else {
$arr = new $object_class($arr);
}
}
return DB_OK;
}
if ($res == null && $this->autofree) {
$this->free();
}
return $res;
}
 
// }}}
// {{{ numCols()
 
/**
* Get the the number of columns in a result set.
*
* @return int the number of columns, or a DB error
*
* @access public
*/
function numCols()
{
return $this->dbh->numCols($this->result);
}
 
// }}}
// {{{ numRows()
 
/**
* Get the number of rows in a result set.
*
* @return int the number of rows, or a DB error
*
* @access public
*/
function numRows()
{
return $this->dbh->numRows($this->result);
}
 
// }}}
// {{{ nextResult()
 
/**
* Get the next result if a batch of queries was executed.
*
* @return bool true if a new result is available or false if not.
*
* @access public
*/
function nextResult()
{
return $this->dbh->nextResult($this->result);
}
 
// }}}
// {{{ free()
 
/**
* Frees the resources allocated for this result set.
* @return int error code
*
* @access public
*/
function free()
{
$err = $this->dbh->freeResult($this->result);
if (DB::isError($err)) {
return $err;
}
$this->result = false;
return true;
}
 
// }}}
// {{{ tableInfo()
 
/**
* @deprecated
* @internal
* @see DB_common::tableInfo()
*/
function tableInfo($mode = null)
{
if (is_string($mode)) {
return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA);
}
return $this->dbh->tableInfo($this, $mode);
}
 
// }}}
// {{{ getRowCounter()
 
/**
* returns the actual row number
* @return integer
*/
function getRowCounter()
{
return $this->row_counter;
}
// }}}
}
 
// }}}
// {{{ class DB_row
 
/**
* Pear DB Row Object
* @see DB_common::setFetchMode()
*/
class DB_row
{
// {{{ constructor
 
/**
* constructor
*
* @param resource row data as array
*/
function DB_row(&$arr)
{
foreach ($arr as $key => $value) {
$this->$key = &$arr[$key];
}
}
 
// }}}
}
 
// }}}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/tags/v1.1-andromede/jrest/lib/PEAR.php
New file
0,0 → 1,971
<?php
//
// +----------------------------------------------------------------------+
// | PEAR, the PHP Extension and Application Repository |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available through the world-wide-web at the following url: |
// | http://www.php.net/license/3_0.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Sterling Hughes <sterling@php.net> |
// | Stig Bakken <ssb@php.net> |
// | Tomas V.V.Cox <cox@idecnet.com> |
// +----------------------------------------------------------------------+
//
// $Id$
//
 
define('PEAR_ERROR_RETURN', 1);
define('PEAR_ERROR_PRINT', 2);
define('PEAR_ERROR_TRIGGER', 4);
define('PEAR_ERROR_DIE', 8);
define('PEAR_ERROR_CALLBACK', 16);
define('PEAR_ERROR_EXCEPTION', 32);
define('PEAR_ZE2', (function_exists('version_compare') &&
version_compare(zend_version(), "2-dev", "ge")));
 
if (substr(PHP_OS, 0, 3) == 'WIN') {
define('OS_WINDOWS', true);
define('OS_UNIX', false);
define('PEAR_OS', 'Windows');
} else {
define('OS_WINDOWS', false);
define('OS_UNIX', true);
define('PEAR_OS', 'Unix'); // blatant assumption
}
 
// instant backwards compatibility
if (!defined('PATH_SEPARATOR')) {
if (OS_WINDOWS) {
define('PATH_SEPARATOR', ';');
} else {
define('PATH_SEPARATOR', ':');
}
}
 
$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
$GLOBALS['_PEAR_destructor_object_list'] = array();
$GLOBALS['_PEAR_shutdown_funcs'] = array();
$GLOBALS['_PEAR_error_handler_stack'] = array();
 
ini_set('track_errors', true);
 
/**
* Base class for other PEAR classes. Provides rudimentary
* emulation of destructors.
*
* If you want a destructor in your class, inherit PEAR and make a
* destructor method called _yourclassname (same name as the
* constructor, but with a "_" prefix). Also, in your constructor you
* have to call the PEAR constructor: $this->PEAR();.
* The destructor method will be called without parameters. Note that
* at in some SAPI implementations (such as Apache), any output during
* the request shutdown (in which destructors are called) seems to be
* discarded. If you need to get any debug information from your
* destructor, use error_log(), syslog() or something similar.
*
* IMPORTANT! To use the emulated destructors you need to create the
* objects by reference: $obj =& new PEAR_child;
*
* @since PHP 4.0.2
* @author Stig Bakken <ssb@php.net>
* @see http://pear.php.net/manual/
*/
class PEAR
{
// {{{ properties
 
/**
* Whether to enable internal debug messages.
*
* @var bool
* @access private
*/
var $_debug = false;
 
/**
* Default error mode for this object.
*
* @var int
* @access private
*/
var $_default_error_mode = null;
 
/**
* Default error options used for this object when error mode
* is PEAR_ERROR_TRIGGER.
*
* @var int
* @access private
*/
var $_default_error_options = null;
 
/**
* Default error handler (callback) for this object, if error mode is
* PEAR_ERROR_CALLBACK.
*
* @var string
* @access private
*/
var $_default_error_handler = '';
 
/**
* Which class to use for error objects.
*
* @var string
* @access private
*/
var $_error_class = 'PEAR_Error';
 
/**
* An array of expected errors.
*
* @var array
* @access private
*/
var $_expected_errors = array();
 
// }}}
 
// {{{ constructor
 
/**
* Constructor. Registers this object in
* $_PEAR_destructor_object_list for destructor emulation if a
* destructor object exists.
*
* @param string $error_class (optional) which class to use for
* error objects, defaults to PEAR_Error.
* @access public
* @return void
*/
function PEAR($error_class = null)
{
$classname = get_class($this);
if ($this->_debug) {
print "PEAR constructor called, class=$classname\n";
}
if ($error_class !== null) {
$this->_error_class = $error_class;
}
while ($classname) {
$destructor = "_$classname";
if (method_exists($this, $destructor)) {
global $_PEAR_destructor_object_list;
$_PEAR_destructor_object_list[] = &$this;
break;
} else {
$classname = get_parent_class($classname);
}
}
}
 
// }}}
// {{{ destructor
 
/**
* Destructor (the emulated type of...). Does nothing right now,
* but is included for forward compatibility, so subclass
* destructors should always call it.
*
* See the note in the class desciption about output from
* destructors.
*
* @access public
* @return void
*/
function _PEAR() {
if ($this->_debug) {
printf("PEAR destructor called, class=%s\n", get_class($this));
}
}
 
// }}}
// {{{ getStaticProperty()
 
/**
* If you have a class that's mostly/entirely static, and you need static
* properties, you can use this method to simulate them. Eg. in your method(s)
* do this: $myVar = &PEAR::getStaticProperty('myVar');
* You MUST use a reference, or they will not persist!
*
* @access public
* @param string $class The calling classname, to prevent clashes
* @param string $var The variable to retrieve.
* @return mixed A reference to the variable. If not set it will be
* auto initialised to NULL.
*/
function &getStaticProperty($class, $var)
{
static $properties;
return $properties[$class][$var];
}
 
// }}}
// {{{ registerShutdownFunc()
 
/**
* Use this function to register a shutdown method for static
* classes.
*
* @access public
* @param mixed $func The function name (or array of class/method) to call
* @param mixed $args The arguments to pass to the function
* @return void
*/
function registerShutdownFunc($func, $args = array())
{
$GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
}
 
// }}}
// {{{ isError()
 
/**
* Tell whether a value is a PEAR error.
*
* @param mixed $data the value to test
* @param int $code if $data is an error object, return true
* only if $code is a string and
* $obj->getMessage() == $code or
* $code is an integer and $obj->getCode() == $code
* @access public
* @return bool true if parameter is an error
*/
 
function isError($data, $code = null)
{
if (is_a($data, 'PEAR_Error')) {
if (is_null($code)) {
return true;
} elseif (is_string($code)) {
return $data->getMessage() == $code;
} else {
return $data->getCode() == $code;
}
}
return false;
}
 
// }}}
// {{{ setErrorHandling()
 
/**
* Sets how errors generated by this object should be handled.
* Can be invoked both in objects and statically. If called
* statically, setErrorHandling sets the default behaviour for all
* PEAR objects. If called in an object, setErrorHandling sets
* the default behaviour for that object.
*
* @param int $mode
* One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
* PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
*
* @param mixed $options
* When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
* of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
*
* When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
* to be the callback function or method. A callback
* function is a string with the name of the function, a
* callback method is an array of two elements: the element
* at index 0 is the object, and the element at index 1 is
* the name of the method to call in the object.
*
* When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
* a printf format string used when printing the error
* message.
*
* @access public
* @return void
* @see PEAR_ERROR_RETURN
* @see PEAR_ERROR_PRINT
* @see PEAR_ERROR_TRIGGER
* @see PEAR_ERROR_DIE
* @see PEAR_ERROR_CALLBACK
* @see PEAR_ERROR_EXCEPTION
*
* @since PHP 4.0.5
*/
 
function setErrorHandling($mode = null, $options = null)
{
if (isset($this) && is_a($this, 'PEAR')) {
$setmode = &$this->_default_error_mode;
$setoptions = &$this->_default_error_options;
} else {
$setmode = &$GLOBALS['_PEAR_default_error_mode'];
$setoptions = &$GLOBALS['_PEAR_default_error_options'];
}
 
switch ($mode) {
case PEAR_ERROR_RETURN:
case PEAR_ERROR_PRINT:
case PEAR_ERROR_TRIGGER:
case PEAR_ERROR_DIE:
case PEAR_ERROR_EXCEPTION:
case null:
$setmode = $mode;
$setoptions = $options;
break;
 
case PEAR_ERROR_CALLBACK:
$setmode = $mode;
// class/object method callback
if (is_callable($options)) {
$setoptions = $options;
} else {
trigger_error("invalid error callback", E_USER_WARNING);
}
break;
 
default:
trigger_error("invalid error mode", E_USER_WARNING);
break;
}
}
 
// }}}
// {{{ expectError()
 
/**
* This method is used to tell which errors you expect to get.
* Expected errors are always returned with error mode
* PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
* and this method pushes a new element onto it. The list of
* expected errors are in effect until they are popped off the
* stack with the popExpect() method.
*
* Note that this method can not be called statically
*
* @param mixed $code a single error code or an array of error codes to expect
*
* @return int the new depth of the "expected errors" stack
* @access public
*/
function expectError($code = '*')
{
if (is_array($code)) {
array_push($this->_expected_errors, $code);
} else {
array_push($this->_expected_errors, array($code));
}
return sizeof($this->_expected_errors);
}
 
// }}}
// {{{ popExpect()
 
/**
* This method pops one element off the expected error codes
* stack.
*
* @return array the list of error codes that were popped
*/
function popExpect()
{
return array_pop($this->_expected_errors);
}
 
// }}}
// {{{ _checkDelExpect()
 
/**
* This method checks unsets an error code if available
*
* @param mixed error code
* @return bool true if the error code was unset, false otherwise
* @access private
* @since PHP 4.3.0
*/
function _checkDelExpect($error_code)
{
$deleted = false;
 
foreach ($this->_expected_errors AS $key => $error_array) {
if (in_array($error_code, $error_array)) {
unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
$deleted = true;
}
 
// clean up empty arrays
if (0 == count($this->_expected_errors[$key])) {
unset($this->_expected_errors[$key]);
}
}
return $deleted;
}
 
// }}}
// {{{ delExpect()
 
/**
* This method deletes all occurences of the specified element from
* the expected error codes stack.
*
* @param mixed $error_code error code that should be deleted
* @return mixed list of error codes that were deleted or error
* @access public
* @since PHP 4.3.0
*/
function delExpect($error_code)
{
$deleted = false;
 
if ((is_array($error_code) && (0 != count($error_code)))) {
// $error_code is a non-empty array here;
// we walk through it trying to unset all
// values
foreach($error_code as $key => $error) {
if ($this->_checkDelExpect($error)) {
$deleted = true;
} else {
$deleted = false;
}
}
return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
} elseif (!empty($error_code)) {
// $error_code comes alone, trying to unset it
if ($this->_checkDelExpect($error_code)) {
return true;
} else {
return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
}
} else {
// $error_code is empty
return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
}
}
 
// }}}
// {{{ raiseError()
 
/**
* This method is a wrapper that returns an instance of the
* configured error class with this object's default error
* handling applied. If the $mode and $options parameters are not
* specified, the object's defaults are used.
*
* @param mixed $message a text error message or a PEAR error object
*
* @param int $code a numeric error code (it is up to your class
* to define these if you want to use codes)
*
* @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
* PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
*
* @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
* specifies the PHP-internal error level (one of
* E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
* If $mode is PEAR_ERROR_CALLBACK, this
* parameter specifies the callback function or
* method. In other error modes this parameter
* is ignored.
*
* @param string $userinfo If you need to pass along for example debug
* information, this parameter is meant for that.
*
* @param string $error_class The returned error object will be
* instantiated from this class, if specified.
*
* @param bool $skipmsg If true, raiseError will only pass error codes,
* the error message parameter will be dropped.
*
* @access public
* @return object a PEAR error object
* @see PEAR::setErrorHandling
* @since PHP 4.0.5
*/
function raiseError($message = null,
$code = null,
$mode = null,
$options = null,
$userinfo = null,
$error_class = null,
$skipmsg = false)
{
// The error is yet a PEAR error object
if (is_object($message)) {
$code = $message->getCode();
$userinfo = $message->getUserInfo();
$error_class = $message->getType();
$message->error_message_prefix = '';
$message = $message->getMessage();
}
 
if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) {
if ($exp[0] == "*" ||
(is_int(reset($exp)) && in_array($code, $exp)) ||
(is_string(reset($exp)) && in_array($message, $exp))) {
$mode = PEAR_ERROR_RETURN;
}
}
// No mode given, try global ones
if ($mode === null) {
// Class error handler
if (isset($this) && isset($this->_default_error_mode)) {
$mode = $this->_default_error_mode;
$options = $this->_default_error_options;
// Global error handler
} elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
$mode = $GLOBALS['_PEAR_default_error_mode'];
$options = $GLOBALS['_PEAR_default_error_options'];
}
}
 
if ($error_class !== null) {
$ec = $error_class;
} elseif (isset($this) && isset($this->_error_class)) {
$ec = $this->_error_class;
} else {
$ec = 'PEAR_Error';
}
if ($skipmsg) {
return new $ec($code, $mode, $options, $userinfo);
} else {
return new $ec($message, $code, $mode, $options, $userinfo);
}
}
 
// }}}
// {{{ throwError()
 
/**
* Simpler form of raiseError with fewer options. In most cases
* message, code and userinfo are enough.
*
* @param string $message
*
*/
function throwError($message = null,
$code = null,
$userinfo = null)
{
if (isset($this) && is_subclass_of($this, 'PEAR_Error')) {
return $this->raiseError($message, $code, null, null, $userinfo);
} else {
return PEAR::raiseError($message, $code, null, null, $userinfo);
}
}
 
// }}}
// {{{ pushErrorHandling()
 
/**
* Push a new error handler on top of the error handler options stack. With this
* you can easily override the actual error handler for some code and restore
* it later with popErrorHandling.
*
* @param mixed $mode (same as setErrorHandling)
* @param mixed $options (same as setErrorHandling)
*
* @return bool Always true
*
* @see PEAR::setErrorHandling
*/
function pushErrorHandling($mode, $options = null)
{
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
if (isset($this) && is_a($this, 'PEAR')) {
$def_mode = &$this->_default_error_mode;
$def_options = &$this->_default_error_options;
} else {
$def_mode = &$GLOBALS['_PEAR_default_error_mode'];
$def_options = &$GLOBALS['_PEAR_default_error_options'];
}
$stack[] = array($def_mode, $def_options);
 
if (isset($this) && is_a($this, 'PEAR')) {
$this->setErrorHandling($mode, $options);
} else {
PEAR::setErrorHandling($mode, $options);
}
$stack[] = array($mode, $options);
return true;
}
 
// }}}
// {{{ popErrorHandling()
 
/**
* Pop the last error handler used
*
* @return bool Always true
*
* @see PEAR::pushErrorHandling
*/
function popErrorHandling()
{
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
array_pop($stack);
list($mode, $options) = $stack[sizeof($stack) - 1];
array_pop($stack);
if (isset($this) && is_a($this, 'PEAR')) {
$this->setErrorHandling($mode, $options);
} else {
PEAR::setErrorHandling($mode, $options);
}
return true;
}
 
// }}}
// {{{ loadExtension()
 
/**
* OS independant PHP extension load. Remember to take care
* on the correct extension name for case sensitive OSes.
*
* @param string $ext The extension name
* @return bool Success or not on the dl() call
*/
function loadExtension($ext)
{
if (!extension_loaded($ext)) {
// if either returns true dl() will produce a FATAL error, stop that
if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {
return false;
}
if (OS_WINDOWS) {
$suffix = '.dll';
} elseif (PHP_OS == 'HP-UX') {
$suffix = '.sl';
} elseif (PHP_OS == 'AIX') {
$suffix = '.a';
} elseif (PHP_OS == 'OSX') {
$suffix = '.bundle';
} else {
$suffix = '.so';
}
return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
}
return true;
}
 
// }}}
}
 
// {{{ _PEAR_call_destructors()
 
function _PEAR_call_destructors()
{
global $_PEAR_destructor_object_list;
if (is_array($_PEAR_destructor_object_list) &&
sizeof($_PEAR_destructor_object_list))
{
reset($_PEAR_destructor_object_list);
while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
$classname = get_class($objref);
while ($classname) {
$destructor = "_$classname";
if (method_exists($objref, $destructor)) {
$objref->$destructor();
break;
} else {
$classname = get_parent_class($classname);
}
}
}
// Empty the object list to ensure that destructors are
// not called more than once.
$_PEAR_destructor_object_list = array();
}
 
// Now call the shutdown functions
if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {
foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
call_user_func_array($value[0], $value[1]);
}
}
}
 
// }}}
 
class PEAR_Error
{
// {{{ properties
 
var $error_message_prefix = '';
var $mode = PEAR_ERROR_RETURN;
var $level = E_USER_NOTICE;
var $code = -1;
var $message = '';
var $userinfo = '';
var $backtrace = null;
 
// }}}
// {{{ constructor
 
/**
* PEAR_Error constructor
*
* @param string $message message
*
* @param int $code (optional) error code
*
* @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
* PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
* PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
*
* @param mixed $options (optional) error level, _OR_ in the case of
* PEAR_ERROR_CALLBACK, the callback function or object/method
* tuple.
*
* @param string $userinfo (optional) additional user/debug info
*
* @access public
*
*/
function PEAR_Error($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null)
{
if ($mode === null) {
$mode = PEAR_ERROR_RETURN;
}
$this->message = $message;
$this->code = $code;
$this->mode = $mode;
$this->userinfo = $userinfo;
if (function_exists("debug_backtrace")) {
$this->backtrace = debug_backtrace();
}
if ($mode & PEAR_ERROR_CALLBACK) {
$this->level = E_USER_NOTICE;
$this->callback = $options;
} else {
if ($options === null) {
$options = E_USER_NOTICE;
}
$this->level = $options;
$this->callback = null;
}
if ($this->mode & PEAR_ERROR_PRINT) {
if (is_null($options) || is_int($options)) {
$format = "%s";
} else {
$format = $options;
}
printf($format, $this->getMessage());
}
if ($this->mode & PEAR_ERROR_TRIGGER) {
trigger_error($this->getMessage(), $this->level);
}
if ($this->mode & PEAR_ERROR_DIE) {
$msg = $this->getMessage();
if (is_null($options) || is_int($options)) {
$format = "%s";
if (substr($msg, -1) != "\n") {
$msg .= "\n";
}
} else {
$format = $options;
}
die(sprintf($format, $msg));
}
if ($this->mode & PEAR_ERROR_CALLBACK) {
if (is_callable($this->callback)) {
call_user_func($this->callback, $this);
}
}
if (PEAR_ZE2 && $this->mode & PEAR_ERROR_EXCEPTION) {
eval('throw $this;');
}
}
 
// }}}
// {{{ getMode()
 
/**
* Get the error mode from an error object.
*
* @return int error mode
* @access public
*/
function getMode() {
return $this->mode;
}
 
// }}}
// {{{ getCallback()
 
/**
* Get the callback function/method from an error object.
*
* @return mixed callback function or object/method array
* @access public
*/
function getCallback() {
return $this->callback;
}
 
// }}}
// {{{ getMessage()
 
 
/**
* Get the error message from an error object.
*
* @return string full error message
* @access public
*/
function getMessage()
{
return ($this->error_message_prefix . $this->message);
}
 
 
// }}}
// {{{ getCode()
 
/**
* Get error code from an error object
*
* @return int error code
* @access public
*/
function getCode()
{
return $this->code;
}
 
// }}}
// {{{ getType()
 
/**
* Get the name of this error/exception.
*
* @return string error/exception name (type)
* @access public
*/
function getType()
{
return get_class($this);
}
 
// }}}
// {{{ getUserInfo()
 
/**
* Get additional user-supplied information.
*
* @return string user-supplied information
* @access public
*/
function getUserInfo()
{
return $this->userinfo;
}
 
// }}}
// {{{ getDebugInfo()
 
/**
* Get additional debug information supplied by the application.
*
* @return string debug information
* @access public
*/
function getDebugInfo()
{
return $this->getUserInfo();
}
 
// }}}
// {{{ getBacktrace()
 
/**
* Get the call backtrace from where the error was generated.
* Supported with PHP 4.3.0 or newer.
*
* @param int $frame (optional) what frame to fetch
* @return array Backtrace, or NULL if not available.
* @access public
*/
function getBacktrace($frame = null)
{
if ($frame === null) {
return $this->backtrace;
}
return $this->backtrace[$frame];
}
 
// }}}
// {{{ addUserInfo()
 
function addUserInfo($info)
{
if (empty($this->userinfo)) {
$this->userinfo = $info;
} else {
$this->userinfo .= " ** $info";
}
}
 
// }}}
// {{{ toString()
 
/**
* Make a string representation of this object.
*
* @return string a string with an object summary
* @access public
*/
function toString() {
$modes = array();
$levels = array(E_USER_NOTICE => 'notice',
E_USER_WARNING => 'warning',
E_USER_ERROR => 'error');
if ($this->mode & PEAR_ERROR_CALLBACK) {
if (is_array($this->callback)) {
$callback = get_class($this->callback[0]) . '::' .
$this->callback[1];
} else {
$callback = $this->callback;
}
return sprintf('[%s: message="%s" code=%d mode=callback '.
'callback=%s prefix="%s" info="%s"]',
get_class($this), $this->message, $this->code,
$callback, $this->error_message_prefix,
$this->userinfo);
}
if ($this->mode & PEAR_ERROR_PRINT) {
$modes[] = 'print';
}
if ($this->mode & PEAR_ERROR_TRIGGER) {
$modes[] = 'trigger';
}
if ($this->mode & PEAR_ERROR_DIE) {
$modes[] = 'die';
}
if ($this->mode & PEAR_ERROR_RETURN) {
$modes[] = 'return';
}
return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
'prefix="%s" info="%s"]',
get_class($this), $this->message, $this->code,
implode("|", $modes), $levels[$this->level],
$this->error_message_prefix,
$this->userinfo);
}
 
// }}}
}
 
register_shutdown_function("_PEAR_call_destructors");
 
/*
* Local Variables:
* mode: php
* tab-width: 4
* c-basic-offset: 4
* End:
*/
?>
/tags/v1.1-andromede/jrest/lib/DBAccessor.php
New file
0,0 → 1,34
<?php
require_once 'JrestService.php';
 
class DBAccessor extends JrestService {
public function connectDB($config, $base = 'database') {
require_once 'DB.php';
$dsn = $config[$base];
 
$DB =& DB::connect($dsn);
if (DB::isError($DB)) {
die($DB->getMessage());
}
$DB->query("SET NAMES 'utf8'");
return $DB;
}
public function connecterPDO($config, $base = 'database') {
$cfg = $config[$base];
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
try {
$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
}
// Passe en UTF-8 la connexion à la BDD
$PDO->exec("SET NAMES 'utf8'");
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $PDO;
}
}
?>
/tags/v1.1-andromede/jrest/lib/JrestService.php
New file
0,0 → 1,72
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version $$id$$
* @link /doc/jrest/
*/
 
class JrestService {
 
protected $config;
protected $script_time;
protected $max_exec_time;
 
public function JrestService($config) {
$this->config = config;
$this->script_time = microtime(true);
$this->max_exec_time = ini_get('max_execution_time');
}
 
public function isAdmin($id) {
$admins = $this->config['jrest_admin']['admin'];
$admin_tab = split(',',$admins);
 
if (in_array($id,$admin_tab)) {
return true;
} else {
return false;
}
}
 
public function controleUtilisateur($id) {
if ($_SESSION['user']['name'] == '') {
//cas de la session temporaire, on ne fait rien de particulier
} else {
if (!$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) {
// cas d'usurpation d'identité
print 'Accès interdit';
exit();
}
}
}
 
public function logger($index,$chaine) {
if(!class_exists('Log')) {
include_once('Log.php');
Log::getInstance();
}
 
Log::setCheminLog($this->config['log']['cheminlog']);
Log::setTimeZone($this->config['log']['timezone']);
Log::setTailleMax($this->config['log']['taillemax']);
 
Log::ajouterEntree($index,$chaine);
}
 
public function verifierOuRelancerExecution() {
 
if((microtime(true) - $this->script_time) > ($this->max_exec_time - 5)*100) {
set_time_limit(2);
$this->logger('JRestService','Durée du script augmentée :'.microtime(true).' - '.$this->script_time.'.) > ('.$this->max_exec_time.' - 5)*1000000');
return true;
}
return false;
}
}
?>
/tags/v1.1-andromede/jrest/lib/HTTP/Download.php
New file
0,0 → 1,1034
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* HTTP::Download
*
* PHP versions 4 and 5
*
* @category HTTP
* @package HTTP_Download
* @author Michael Wallner <mike@php.net>
* @copyright 2003-2005 Michael Wallner
* @license BSD, revised
* @version CVS: $Id$
* @link http://pear.php.net/package/HTTP_Download
*/
 
// {{{ includes
/**
* Requires PEAR
*/
require_once 'PEAR.php';
 
/**
* Requires HTTP_Header
*/
require_once 'HTTP/Header.php';
// }}}
 
// {{{ constants
/**#@+ Use with HTTP_Download::setContentDisposition() **/
/**
* Send data as attachment
*/
define('HTTP_DOWNLOAD_ATTACHMENT', 'attachment');
/**
* Send data inline
*/
define('HTTP_DOWNLOAD_INLINE', 'inline');
/**#@-**/
 
/**#@+ Use with HTTP_Download::sendArchive() **/
/**
* Send as uncompressed tar archive
*/
define('HTTP_DOWNLOAD_TAR', 'TAR');
/**
* Send as gzipped tar archive
*/
define('HTTP_DOWNLOAD_TGZ', 'TGZ');
/**
* Send as bzip2 compressed tar archive
*/
define('HTTP_DOWNLOAD_BZ2', 'BZ2');
/**
* Send as zip archive
*/
define('HTTP_DOWNLOAD_ZIP', 'ZIP');
/**#@-**/
 
/**#@+
* Error constants
*/
define('HTTP_DOWNLOAD_E_HEADERS_SENT', -1);
define('HTTP_DOWNLOAD_E_NO_EXT_ZLIB', -2);
define('HTTP_DOWNLOAD_E_NO_EXT_MMAGIC', -3);
define('HTTP_DOWNLOAD_E_INVALID_FILE', -4);
define('HTTP_DOWNLOAD_E_INVALID_PARAM', -5);
define('HTTP_DOWNLOAD_E_INVALID_RESOURCE', -6);
define('HTTP_DOWNLOAD_E_INVALID_REQUEST', -7);
define('HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE', -8);
define('HTTP_DOWNLOAD_E_INVALID_ARCHIVE_TYPE', -9);
/**#@-**/
// }}}
 
/**
* Send HTTP Downloads/Responses.
*
* With this package you can handle (hidden) downloads.
* It supports partial downloads, resuming and sending
* raw data ie. from database BLOBs.
*
* <i>ATTENTION:</i>
* You shouldn't use this package together with ob_gzhandler or
* zlib.output_compression enabled in your php.ini, especially
* if you want to send already gzipped data!
*
* @access public
* @version $Revision$
*/
class HTTP_Download
{
// {{{ protected member variables
/**
* Path to file for download
*
* @see HTTP_Download::setFile()
* @access protected
* @var string
*/
var $file = '';
/**
* Data for download
*
* @see HTTP_Download::setData()
* @access protected
* @var string
*/
var $data = null;
/**
* Resource handle for download
*
* @see HTTP_Download::setResource()
* @access protected
* @var int
*/
var $handle = null;
/**
* Whether to gzip the download
*
* @access protected
* @var bool
*/
var $gzip = false;
/**
* Whether to allow caching of the download on the clients side
*
* @access protected
* @var bool
*/
var $cache = true;
/**
* Size of download
*
* @access protected
* @var int
*/
var $size = 0;
/**
* Last modified
*
* @access protected
* @var int
*/
var $lastModified = 0;
/**
* HTTP headers
*
* @access protected
* @var array
*/
var $headers = array(
'Content-Type' => 'application/x-octetstream',
'Pragma' => 'cache',
'Cache-Control' => 'public, must-revalidate, max-age=0',
'Accept-Ranges' => 'bytes',
'X-Sent-By' => 'PEAR::HTTP::Download'
);
/**
* HTTP_Header
*
* @access protected
* @var object
*/
var $HTTP = null;
/**
* ETag
*
* @access protected
* @var string
*/
var $etag = '';
/**
* Buffer Size
*
* @access protected
* @var int
*/
var $bufferSize = 2097152;
/**
* Throttle Delay
*
* @access protected
* @var float
*/
var $throttleDelay = 0;
/**
* Sent Bytes
*
* @access public
* @var int
*/
var $sentBytes = 0;
// }}}
// {{{ constructor
/**
* Constructor
*
* Set supplied parameters.
*
* @access public
* @param array $params associative array of parameters
*
* <b>one of:</b>
* o 'file' => path to file for download
* o 'data' => raw data for download
* o 'resource' => resource handle for download
* <br/>
* <b>and any of:</b>
* o 'cache' => whether to allow cs caching
* o 'gzip' => whether to gzip the download
* o 'lastmodified' => unix timestamp
* o 'contenttype' => content type of download
* o 'contentdisposition' => content disposition
* o 'buffersize' => amount of bytes to buffer
* o 'throttledelay' => amount of secs to sleep
* o 'cachecontrol' => cache privacy and validity
*
* <br />
* 'Content-Disposition' is not HTTP compliant, but most browsers
* follow this header, so it was borrowed from MIME standard.
*
* It looks like this: <br />
* "Content-Disposition: attachment; filename=example.tgz".
*
* @see HTTP_Download::setContentDisposition()
*/
function HTTP_Download($params = array())
{
$this->HTTP = &new HTTP_Header;
$this->setParams($params);
}
// }}}
// {{{ public methods
/**
* Set parameters
*
* Set supplied parameters through its accessor methods.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param array $params associative array of parameters
*
* @see HTTP_Download::HTTP_Download()
*/
function setParams($params)
{
foreach((array) $params as $param => $value){
$method = 'set'. $param;
if (!method_exists($this, $method)) {
return PEAR::raiseError(
"Method '$method' doesn't exist.",
HTTP_DOWNLOAD_E_INVALID_PARAM
);
}
$e = call_user_func_array(array(&$this, $method), (array) $value);
if (PEAR::isError($e)) {
return $e;
}
}
return true;
}
/**
* Set path to file for download
*
* The Last-Modified header will be set to files filemtime(), actually.
* Returns PEAR_Error (HTTP_DOWNLOAD_E_INVALID_FILE) if file doesn't exist.
* Sends HTTP 404 status if $send_404 is set to true.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param string $file path to file for download
* @param bool $send_404 whether to send HTTP/404 if
* the file wasn't found
*/
function setFile($file, $send_404 = true)
{
$file = realpath($file);
if (!is_file($file)) {
if ($send_404) {
$this->HTTP->sendStatusCode(404);
}
return PEAR::raiseError(
"File '$file' not found.",
HTTP_DOWNLOAD_E_INVALID_FILE
);
}
$this->setLastModified(filemtime($file));
$this->file = $file;
$this->size = filesize($file);
return true;
}
/**
* Set data for download
*
* Set $data to null if you want to unset this.
*
* @access public
* @return void
* @param $data raw data to send
*/
function setData($data = null)
{
$this->data = $data;
$this->size = strlen($data);
}
/**
* Set resource for download
*
* The resource handle supplied will be closed after sending the download.
* Returns a PEAR_Error (HTTP_DOWNLOAD_E_INVALID_RESOURCE) if $handle
* is no valid resource. Set $handle to null if you want to unset this.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param int $handle resource handle
*/
function setResource($handle = null)
{
if (!isset($handle)) {
$this->handle = null;
$this->size = 0;
return true;
}
if (is_resource($handle)) {
$this->handle = $handle;
$filestats = fstat($handle);
$this->size = $filestats['size'];
return true;
}
 
return PEAR::raiseError(
"Handle '$handle' is no valid resource.",
HTTP_DOWNLOAD_E_INVALID_RESOURCE
);
}
/**
* Whether to gzip the download
*
* Returns a PEAR_Error (HTTP_DOWNLOAD_E_NO_EXT_ZLIB)
* if ext/zlib is not available/loadable.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param bool $gzip whether to gzip the download
*/
function setGzip($gzip = false)
{
if ($gzip && !PEAR::loadExtension('zlib')){
return PEAR::raiseError(
'GZIP compression (ext/zlib) not available.',
HTTP_DOWNLOAD_E_NO_EXT_ZLIB
);
}
$this->gzip = (bool) $gzip;
return true;
}
 
/**
* Whether to allow caching
*
* If set to true (default) we'll send some headers that are commonly
* used for caching purposes like ETag, Cache-Control and Last-Modified.
*
* If caching is disabled, we'll send the download no matter if it
* would actually be cached at the client side.
*
* @access public
* @return void
* @param bool $cache whether to allow caching
*/
function setCache($cache = true)
{
$this->cache = (bool) $cache;
}
/**
* Whether to allow proxies to cache
*
* If set to 'private' proxies shouldn't cache the response.
* This setting defaults to 'public' and affects only cached responses.
*
* @access public
* @return bool
* @param string $cache private or public
* @param int $maxage maximum age of the client cache entry
*/
function setCacheControl($cache = 'public', $maxage = 0)
{
switch ($cache = strToLower($cache))
{
case 'private':
case 'public':
$this->headers['Cache-Control'] =
$cache .', must-revalidate, max-age='. abs($maxage);
return true;
break;
}
return false;
}
/**
* Set ETag
*
* Sets a user-defined ETag for cache-validation. The ETag is usually
* generated by HTTP_Download through its payload information.
*
* @access public
* @return void
* @param string $etag Entity tag used for strong cache validation.
*/
function setETag($etag = null)
{
$this->etag = (string) $etag;
}
/**
* Set Size of Buffer
*
* The amount of bytes specified as buffer size is the maximum amount
* of data read at once from resources or files. The default size is 2M
* (2097152 bytes). Be aware that if you enable gzip compression and
* you set a very low buffer size that the actual file size may grow
* due to added gzip headers for each sent chunk of the specified size.
*
* Returns PEAR_Error (HTTP_DOWNLOAD_E_INVALID_PARAM) if $size is not
* greater than 0 bytes.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param int $bytes Amount of bytes to use as buffer.
*/
function setBufferSize($bytes = 2097152)
{
if (0 >= $bytes) {
return PEAR::raiseError(
'Buffer size must be greater than 0 bytes ('. $bytes .' given)',
HTTP_DOWNLOAD_E_INVALID_PARAM);
}
$this->bufferSize = abs($bytes);
return true;
}
/**
* Set Throttle Delay
*
* Set the amount of seconds to sleep after each chunck that has been
* sent. One can implement some sort of throttle through adjusting the
* buffer size and the throttle delay. With the following settings
* HTTP_Download will sleep a second after each 25 K of data sent.
*
* <code>
* Array(
* 'throttledelay' => 1,
* 'buffersize' => 1024 * 25,
* )
* </code>
*
* Just be aware that if gzipp'ing is enabled, decreasing the chunk size
* too much leads to proportionally increased network traffic due to added
* gzip header and bottom bytes around each chunk.
*
* @access public
* @return void
* @param float $seconds Amount of seconds to sleep after each
* chunk that has been sent.
*/
function setThrottleDelay($seconds = 0)
{
$this->throttleDelay = abs($seconds) * 1000;
}
/**
* Set "Last-Modified"
*
* This is usually determined by filemtime() in HTTP_Download::setFile()
* If you set raw data for download with HTTP_Download::setData() and you
* want do send an appropiate "Last-Modified" header, you should call this
* method.
*
* @access public
* @return void
* @param int unix timestamp
*/
function setLastModified($last_modified)
{
$this->lastModified = $this->headers['Last-Modified'] = (int) $last_modified;
}
/**
* Set Content-Disposition header
*
* @see HTTP_Download::HTTP_Download
*
* @access public
* @return void
* @param string $disposition whether to send the download
* inline or as attachment
* @param string $file_name the filename to display in
* the browser's download window
*
* <b>Example:</b>
* <code>
* $HTTP_Download->setContentDisposition(
* HTTP_DOWNLOAD_ATTACHMENT,
* 'download.tgz'
* );
* </code>
*/
function setContentDisposition( $disposition = HTTP_DOWNLOAD_ATTACHMENT,
$file_name = null)
{
$cd = $disposition;
if (isset($file_name)) {
$cd .= '; filename="' . $file_name . '"';
} elseif ($this->file) {
$cd .= '; filename="' . basename($this->file) . '"';
}
$this->headers['Content-Disposition'] = $cd;
}
/**
* Set content type of the download
*
* Default content type of the download will be 'application/x-octetstream'.
* Returns PEAR_Error (HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE) if
* $content_type doesn't seem to be valid.
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param string $content_type content type of file for download
*/
function setContentType($content_type = 'application/x-octetstream')
{
if (!preg_match('/^[a-z]+\w*\/[a-z]+[\w.;= -]*$/', $content_type)) {
return PEAR::raiseError(
"Invalid content type '$content_type' supplied.",
HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE
);
}
$this->headers['Content-Type'] = $content_type;
return true;
}
/**
* Guess content type of file
*
* First we try to use PEAR::MIME_Type, if installed, to detect the content
* type, else we check if ext/mime_magic is loaded and properly configured.
*
* Returns PEAR_Error if:
* o if PEAR::MIME_Type failed to detect a proper content type
* (HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE)
* o ext/magic.mime is not installed, or not properly configured
* (HTTP_DOWNLOAD_E_NO_EXT_MMAGIC)
* o mime_content_type() couldn't guess content type or returned
* a content type considered to be bogus by setContentType()
* (HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE)
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
*/
function guessContentType()
{
if (class_exists('MIME_Type') || @include_once 'MIME/Type.php') {
if (PEAR::isError($mime_type = MIME_Type::autoDetect($this->file))) {
return PEAR::raiseError($mime_type->getMessage(),
HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE);
}
return $this->setContentType($mime_type);
}
if (!function_exists('mime_content_type')) {
return PEAR::raiseError(
'This feature requires ext/mime_magic!',
HTTP_DOWNLOAD_E_NO_EXT_MMAGIC
);
}
if (!is_file(ini_get('mime_magic.magicfile'))) {
return PEAR::raiseError(
'ext/mime_magic is loaded but not properly configured!',
HTTP_DOWNLOAD_E_NO_EXT_MMAGIC
);
}
if (!$content_type = @mime_content_type($this->file)) {
return PEAR::raiseError(
'Couldn\'t guess content type with mime_content_type().',
HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE
);
}
return $this->setContentType($content_type);
}
 
/**
* Send
*
* Returns PEAR_Error if:
* o HTTP headers were already sent (HTTP_DOWNLOAD_E_HEADERS_SENT)
* o HTTP Range was invalid (HTTP_DOWNLOAD_E_INVALID_REQUEST)
*
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param bool $autoSetContentDisposition Whether to set the
* Content-Disposition header if it isn't already.
*/
function send($autoSetContentDisposition = true)
{
if (headers_sent()) {
return PEAR::raiseError(
'Headers already sent.',
HTTP_DOWNLOAD_E_HEADERS_SENT
);
}
if (!ini_get('safe_mode')) {
@set_time_limit(0);
}
if ($autoSetContentDisposition &&
!isset($this->headers['Content-Disposition'])) {
$this->setContentDisposition();
}
if ($this->cache) {
$this->headers['ETag'] = $this->generateETag();
if ($this->isCached()) {
$this->HTTP->sendStatusCode(304);
$this->sendHeaders();
return true;
}
} else {
unset($this->headers['Last-Modified']);
}
if (ob_get_level()) {
while (@ob_end_clean());
}
if ($this->gzip) {
@ob_start('ob_gzhandler');
} else {
ob_start();
}
$this->sentBytes = 0;
if ($this->isRangeRequest()) {
$this->HTTP->sendStatusCode(206);
$chunks = $this->getChunks();
} else {
$this->HTTP->sendStatusCode(200);
$chunks = array(array(0, $this->size));
if (!$this->gzip && count(ob_list_handlers()) < 2) {
$this->headers['Content-Length'] = $this->size;
}
}
 
if (PEAR::isError($e = $this->sendChunks($chunks))) {
ob_end_clean();
$this->HTTP->sendStatusCode(416);
return $e;
}
ob_end_flush();
flush();
return true;
}
 
/**
* Static send
*
* @see HTTP_Download::HTTP_Download()
* @see HTTP_Download::send()
*
* @static
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param array $params associative array of parameters
* @param bool $guess whether HTTP_Download::guessContentType()
* should be called
*/
function staticSend($params, $guess = false)
{
$d = &new HTTP_Download();
$e = $d->setParams($params);
if (PEAR::isError($e)) {
return $e;
}
if ($guess) {
$e = $d->guessContentType();
if (PEAR::isError($e)) {
return $e;
}
}
return $d->send();
}
/**
* Send a bunch of files or directories as an archive
*
* Example:
* <code>
* require_once 'HTTP/Download.php';
* HTTP_Download::sendArchive(
* 'myArchive.tgz',
* '/var/ftp/pub/mike',
* HTTP_DOWNLOAD_TGZ,
* '',
* '/var/ftp/pub'
* );
* </code>
*
* @see Archive_Tar::createModify()
* @deprecated use HTTP_Download_Archive::send()
* @static
* @access public
* @return mixed Returns true on success or PEAR_Error on failure.
* @param string $name name the sent archive should have
* @param mixed $files files/directories
* @param string $type archive type
* @param string $add_path path that should be prepended to the files
* @param string $strip_path path that should be stripped from the files
*/
function sendArchive( $name,
$files,
$type = HTTP_DOWNLOAD_TGZ,
$add_path = '',
$strip_path = '')
{
require_once 'HTTP/Download/Archive.php';
return HTTP_Download_Archive::send($name, $files, $type,
$add_path, $strip_path);
}
// }}}
// {{{ protected methods
/**
* Generate ETag
*
* @access protected
* @return string
*/
function generateETag()
{
if (!$this->etag) {
if ($this->data) {
$md5 = md5($this->data);
} else {
$fst = is_resource($this->handle) ?
fstat($this->handle) : stat($this->file);
$md5 = md5($fst['mtime'] .'='. $fst['ino'] .'='. $fst['size']);
}
$this->etag = '"' . $md5 . '-' . crc32($md5) . '"';
}
return $this->etag;
}
/**
* Send multiple chunks
*
* @access protected
* @return mixed Returns true on success or PEAR_Error on failure.
* @param array $chunks
*/
function sendChunks($chunks)
{
if (count($chunks) == 1) {
return $this->sendChunk(current($chunks));
}
 
$bound = uniqid('HTTP_DOWNLOAD-', true);
$cType = $this->headers['Content-Type'];
$this->headers['Content-Type'] =
'multipart/byteranges; boundary=' . $bound;
$this->sendHeaders();
foreach ($chunks as $chunk){
if (PEAR::isError($e = $this->sendChunk($chunk, $cType, $bound))) {
return $e;
}
}
#echo "\r\n--$bound--\r\n";
return true;
}
/**
* Send chunk of data
*
* @access protected
* @return mixed Returns true on success or PEAR_Error on failure.
* @param array $chunk start and end offset of the chunk to send
* @param string $cType actual content type
* @param string $bound boundary for multipart/byteranges
*/
function sendChunk($chunk, $cType = null, $bound = null)
{
list($offset, $lastbyte) = $chunk;
$length = ($lastbyte - $offset) + 1;
if ($length < 1) {
return PEAR::raiseError(
"Error processing range request: $offset-$lastbyte/$length",
HTTP_DOWNLOAD_E_INVALID_REQUEST
);
}
$range = $offset . '-' . $lastbyte . '/' . $this->size;
if (isset($cType, $bound)) {
echo "\r\n--$bound\r\n",
"Content-Type: $cType\r\n",
"Content-Range: bytes $range\r\n\r\n";
} else {
if ($this->isRangeRequest()) {
$this->headers['Content-Length'] = $length;
$this->headers['Content-Range'] = 'bytes '. $range;
}
$this->sendHeaders();
}
 
if ($this->data) {
while (($length -= $this->bufferSize) > 0) {
$this->flush(substr($this->data, $offset, $this->bufferSize));
$this->throttleDelay and $this->sleep();
$offset += $this->bufferSize;
}
if ($length) {
$this->flush(substr($this->data, $offset, $this->bufferSize + $length));
}
} else {
if (!is_resource($this->handle)) {
$this->handle = fopen($this->file, 'rb');
}
fseek($this->handle, $offset);
while (($length -= $this->bufferSize) > 0) {
$this->flush(fread($this->handle, $this->bufferSize));
$this->throttleDelay and $this->sleep();
}
if ($length) {
$this->flush(fread($this->handle, $this->bufferSize + $length));
}
}
return true;
}
/**
* Get chunks to send
*
* @access protected
* @return array
*/
function getChunks()
{
$parts = array();
foreach (explode(',', $this->getRanges()) as $chunk){
list($o, $e) = explode('-', $chunk);
if ($e >= $this->size || (empty($e) && $e !== 0 && $e !== '0')) {
$e = $this->size - 1;
}
if (empty($o) && $o !== 0 && $o !== '0') {
$o = $this->size - $e;
$e = $this->size - 1;
}
$parts[] = array($o, $e);
}
return $parts;
}
/**
* Check if range is requested
*
* @access protected
* @return bool
*/
function isRangeRequest()
{
if (!isset($_SERVER['HTTP_RANGE'])) {
return false;
}
return $this->isValidRange();
}
/**
* Get range request
*
* @access protected
* @return array
*/
function getRanges()
{
return preg_match('/^bytes=((\d*-\d*,? ?)+)$/',
@$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array();
}
/**
* Check if entity is cached
*
* @access protected
* @return bool
*/
function isCached()
{
return (
(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
$this->lastModified == strtotime(current($a = explode(
';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])))) ||
(isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
$this->compareAsterisk('HTTP_IF_NONE_MATCH', $this->etag))
);
}
/**
* Check if entity hasn't changed
*
* @access protected
* @return bool
*/
function isValidRange()
{
if (isset($_SERVER['HTTP_IF_MATCH']) &&
!$this->compareAsterisk('HTTP_IF_MATCH', $this->etag)) {
return false;
}
if (isset($_SERVER['HTTP_IF_RANGE']) &&
$_SERVER['HTTP_IF_RANGE'] !== $this->etag &&
strtotime($_SERVER['HTTP_IF_RANGE']) !== $this->lastModified) {
return false;
}
if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE'])) {
$lm = current($a = explode(';', $_SERVER['HTTP_IF_UNMODIFIED_SINCE']));
if (strtotime($lm) !== $this->lastModified) {
return false;
}
}
if (isset($_SERVER['HTTP_UNLESS_MODIFIED_SINCE'])) {
$lm = current($a = explode(';', $_SERVER['HTTP_UNLESS_MODIFIED_SINCE']));
if (strtotime($lm) !== $this->lastModified) {
return false;
}
}
return true;
}
/**
* Compare against an asterisk or check for equality
*
* @access protected
* @return bool
* @param string key for the $_SERVER array
* @param string string to compare
*/
function compareAsterisk($svar, $compare)
{
foreach (array_map('trim', explode(',', $_SERVER[$svar])) as $request) {
if ($request === '*' || $request === $compare) {
return true;
}
}
return false;
}
/**
* Send HTTP headers
*
* @access protected
* @return void
*/
function sendHeaders()
{
foreach ($this->headers as $header => $value) {
$this->HTTP->setHeader($header, $value);
}
$this->HTTP->sendHeaders();
/* NSAPI won't output anything if we did this */
if (strncasecmp(PHP_SAPI, 'nsapi', 5)) {
ob_flush();
flush();
}
}
/**
* Flush
*
* @access protected
* @return void
* @param string $data
*/
function flush($data = '')
{
if ($dlen = strlen($data)) {
$this->sentBytes += $dlen;
echo $data;
}
ob_flush();
flush();
}
/**
* Sleep
*
* @access protected
* @return void
*/
function sleep()
{
if (OS_WINDOWS) {
com_message_pump($this->throttleDelay);
} else {
usleep($this->throttleDelay * 1000);
}
}
// }}}
}
?>
/tags/v1.1-andromede/jrest/lib/HTTP/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,42,37
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/lib/JSON.php
New file
0,0 → 1,806
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* Converts to and from JSON format.
*
* JSON (JavaScript Object Notation) is a lightweight data-interchange
* format. It is easy for humans to read and write. It is easy for machines
* to parse and generate. It is based on a subset of the JavaScript
* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
* This feature can also be found in Python. JSON is a text format that is
* completely language independent but uses conventions that are familiar
* to programmers of the C-family of languages, including C, C++, C#, Java,
* JavaScript, Perl, TCL, and many others. These properties make JSON an
* ideal data-interchange language.
*
* This package provides a simple encoder and decoder for JSON notation. It
* is intended for use with client-side Javascript applications that make
* use of HTTPRequest to perform server communication functions - data can
* be encoded into JSON notation for use in a client-side javascript, or
* decoded from incoming Javascript requests. JSON format is native to
* Javascript, and can be directly eval()'ed with no further parsing
* overhead
*
* All strings should be in ASCII or UTF-8 format!
*
* LICENSE: Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met: Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following
* disclaimer. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* @category
* @package Services_JSON
* @author Michal Migurski <mike-json@teczno.com>
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
* @copyright 2005 Michal Migurski
* @version CVS: $Id$
* @license http://www.opensource.org/licenses/bsd-license.php
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
*/
 
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_SLICE', 1);
 
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_STR', 2);
 
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_ARR', 3);
 
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_OBJ', 4);
 
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_CMT', 5);
 
/**
* Behavior switch for Services_JSON::decode()
*/
define('SERVICES_JSON_LOOSE_TYPE', 16);
 
/**
* Behavior switch for Services_JSON::decode()
*/
define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
 
/**
* Converts to and from JSON format.
*
* Brief example of use:
*
* <code>
* // create a new instance of Services_JSON
* $json = new Services_JSON();
*
* // convert a complexe value to JSON notation, and send it to the browser
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
* $output = $json->encode($value);
*
* print($output);
* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
*
* // accept incoming POST data, assumed to be in JSON notation
* $input = file_get_contents('php://input', 1000000);
* $value = $json->decode($input);
* </code>
*/
class Services_JSON
{
/**
* constructs a new JSON instance
*
* @param int $use object behavior flags; combine with boolean-OR
*
* possible values:
* - SERVICES_JSON_LOOSE_TYPE: loose typing.
* "{...}" syntax creates associative arrays
* instead of objects in decode().
* - SERVICES_JSON_SUPPRESS_ERRORS: error suppression.
* Values which can't be encoded (e.g. resources)
* appear as NULL instead of throwing errors.
* By default, a deeply-nested resource will
* bubble up with an error, so all return values
* from encode() should be checked with isError()
*/
function Services_JSON($use = 0)
{
$this->use = $use;
}
 
/**
* convert a string from one UTF-16 char to one UTF-8 char
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
* @param string $utf16 UTF-16 character
* @return string UTF-8 character
* @access private
*/
function utf162utf8($utf16)
{
// oh please oh please oh please oh please oh please
if(function_exists('mb_convert_encoding')) {
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
}
 
$bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
 
switch(true) {
case ((0x7F & $bytes) == $bytes):
// this case should never be reached, because we are in ASCII range
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0x7F & $bytes);
 
case (0x07FF & $bytes) == $bytes:
// return a 2-byte UTF-8 character
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0xC0 | (($bytes >> 6) & 0x1F))
. chr(0x80 | ($bytes & 0x3F));
 
case (0xFFFF & $bytes) == $bytes:
// return a 3-byte UTF-8 character
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0xE0 | (($bytes >> 12) & 0x0F))
. chr(0x80 | (($bytes >> 6) & 0x3F))
. chr(0x80 | ($bytes & 0x3F));
}
 
// ignoring UTF-32 for now, sorry
return '';
}
 
/**
* convert a string from one UTF-8 char to one UTF-16 char
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
* @param string $utf8 UTF-8 character
* @return string UTF-16 character
* @access private
*/
function utf82utf16($utf8)
{
// oh please oh please oh please oh please oh please
if(function_exists('mb_convert_encoding')) {
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
}
 
switch(strlen($utf8)) {
case 1:
// this case should never be reached, because we are in ASCII range
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return $utf8;
 
case 2:
// return a UTF-16 character from a 2-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0x07 & (ord($utf8{0}) >> 2))
. chr((0xC0 & (ord($utf8{0}) << 6))
| (0x3F & ord($utf8{1})));
 
case 3:
// return a UTF-16 character from a 3-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr((0xF0 & (ord($utf8{0}) << 4))
| (0x0F & (ord($utf8{1}) >> 2)))
. chr((0xC0 & (ord($utf8{1}) << 6))
| (0x7F & ord($utf8{2})));
}
 
// ignoring UTF-32 for now, sorry
return '';
}
 
/**
* encodes an arbitrary variable into JSON format
*
* @param mixed $var any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
* if var is a strng, note that encode() always expects it
* to be in ASCII or UTF-8 format!
*
* @return mixed JSON string representation of input var or an error if a problem occurs
* @access public
*/
function encode($var)
{
switch (gettype($var)) {
case 'boolean':
return $var ? 'true' : 'false';
 
case 'NULL':
return 'null';
 
case 'integer':
return (int) $var;
 
case 'double':
case 'float':
return (float) $var;
 
case 'string':
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
$ascii = '';
$strlen_var = strlen($var);
 
/*
* Iterate over every character in the string,
* escaping with a slash or encoding to UTF-8 where necessary
*/
for ($c = 0; $c < $strlen_var; ++$c) {
 
$ord_var_c = ord($var{$c});
 
switch (true) {
case $ord_var_c == 0x08:
$ascii .= '\b';
break;
case $ord_var_c == 0x09:
$ascii .= '\t';
break;
case $ord_var_c == 0x0A:
$ascii .= '\n';
break;
case $ord_var_c == 0x0C:
$ascii .= '\f';
break;
case $ord_var_c == 0x0D:
$ascii .= '\r';
break;
 
case $ord_var_c == 0x22:
case $ord_var_c == 0x2F:
case $ord_var_c == 0x5C:
// double quote, slash, slosh
$ascii .= '\\'.$var{$c};
break;
 
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c};
break;
 
case (($ord_var_c & 0xE0) == 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
 
case (($ord_var_c & 0xF0) == 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
 
case (($ord_var_c & 0xF8) == 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
 
case (($ord_var_c & 0xFC) == 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}));
$c += 4;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
 
case (($ord_var_c & 0xFE) == 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}),
ord($var{$c + 5}));
$c += 5;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
}
}
 
return '"'.$ascii.'"';
 
case 'array':
/*
* As per JSON spec if any array key is not an integer
* we must treat the the whole array as an object. We
* also try to catch a sparsely populated associative
* array with numeric keys here because some JS engines
* will create an array with empty indexes up to
* max_index which can cause memory issues and because
* the keys, which may be relevant, will be remapped
* otherwise.
*
* As per the ECMA and JSON specification an object may
* have any string as a property. Unfortunately due to
* a hole in the ECMA specification if the key is a
* ECMA reserved word or starts with a digit the
* parameter is only accessible using ECMAScript's
* bracket notation.
*/
 
// treat as a JSON object
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
$properties = array_map(array($this, 'name_value'),
array_keys($var),
array_values($var));
 
foreach($properties as $property) {
if(Services_JSON::isError($property)) {
return $property;
}
}
 
return '{' . join(',', $properties) . '}';
}
 
// treat it like a regular array
$elements = array_map(array($this, 'encode'), $var);
 
foreach($elements as $element) {
if(Services_JSON::isError($element)) {
return $element;
}
}
 
return '[' . join(',', $elements) . ']';
 
case 'object':
$vars = get_object_vars($var);
 
$properties = array_map(array($this, 'name_value'),
array_keys($vars),
array_values($vars));
 
foreach($properties as $property) {
if(Services_JSON::isError($property)) {
return $property;
}
}
 
return '{' . join(',', $properties) . '}';
 
default:
return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
? 'null'
: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
}
}
 
/**
* array-walking function for use in generating JSON-formatted name-value pairs
*
* @param string $name name of key to use
* @param mixed $value reference to an array element to be encoded
*
* @return string JSON-formatted name-value pair, like '"name":value'
* @access private
*/
function name_value($name, $value)
{
$encoded_value = $this->encode($value);
 
if(Services_JSON::isError($encoded_value)) {
return $encoded_value;
}
 
return $this->encode(strval($name)) . ':' . $encoded_value;
}
 
/**
* reduce a string by removing leading and trailing comments and whitespace
*
* @param $str string string value to strip of comments and whitespace
*
* @return string string value stripped of comments and whitespace
* @access private
*/
function reduce_string($str)
{
$str = preg_replace(array(
 
// eliminate single line comments in '// ...' form
'#^\s*//(.+)$#m',
 
// eliminate multi-line comments in '/* ... */' form, at start of string
'#^\s*/\*(.+)\*/#Us',
 
// eliminate multi-line comments in '/* ... */' form, at end of string
'#/\*(.+)\*/\s*$#Us'
 
), '', $str);
 
// eliminate extraneous space
return trim($str);
}
 
/**
* decodes a JSON string into appropriate variable
*
* @param string $str JSON-formatted string
*
* @return mixed number, boolean, string, array, or object
* corresponding to given JSON input string.
* See argument 1 to Services_JSON() above for object-output behavior.
* Note that decode() always returns strings
* in ASCII or UTF-8 format!
* @access public
*/
function decode($str)
{
$str = $this->reduce_string($str);
 
switch (strtolower($str)) {
case 'true':
return true;
 
case 'false':
return false;
 
case 'null':
return null;
 
default:
$m = array();
 
if (is_numeric($str)) {
// Lookie-loo, it's a number
 
// This would work on its own, but I'm trying to be
// good about returning integers where appropriate:
// return (float)$str;
 
// Return float or int, as appropriate
return ((float)$str == (integer)$str)
? (integer)$str
: (float)$str;
 
} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
// STRINGS RETURNED IN UTF-8 FORMAT
$delim = substr($str, 0, 1);
$chrs = substr($str, 1, -1);
$utf8 = '';
$strlen_chrs = strlen($chrs);
 
for ($c = 0; $c < $strlen_chrs; ++$c) {
 
$substr_chrs_c_2 = substr($chrs, $c, 2);
$ord_chrs_c = ord($chrs{$c});
 
switch (true) {
case $substr_chrs_c_2 == '\b':
$utf8 .= chr(0x08);
++$c;
break;
case $substr_chrs_c_2 == '\t':
$utf8 .= chr(0x09);
++$c;
break;
case $substr_chrs_c_2 == '\n':
$utf8 .= chr(0x0A);
++$c;
break;
case $substr_chrs_c_2 == '\f':
$utf8 .= chr(0x0C);
++$c;
break;
case $substr_chrs_c_2 == '\r':
$utf8 .= chr(0x0D);
++$c;
break;
 
case $substr_chrs_c_2 == '\\"':
case $substr_chrs_c_2 == '\\\'':
case $substr_chrs_c_2 == '\\\\':
case $substr_chrs_c_2 == '\\/':
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
($delim == "'" && $substr_chrs_c_2 != '\\"')) {
$utf8 .= $chrs{++$c};
}
break;
 
case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
// single, escaped unicode character
$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
. chr(hexdec(substr($chrs, ($c + 4), 2)));
$utf8 .= $this->utf162utf8($utf16);
$c += 5;
break;
 
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
$utf8 .= $chrs{$c};
break;
 
case ($ord_chrs_c & 0xE0) == 0xC0:
// characters U-00000080 - U-000007FF, mask 110XXXXX
//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 2);
++$c;
break;
 
case ($ord_chrs_c & 0xF0) == 0xE0:
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 3);
$c += 2;
break;
 
case ($ord_chrs_c & 0xF8) == 0xF0:
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 4);
$c += 3;
break;
 
case ($ord_chrs_c & 0xFC) == 0xF8:
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 5);
$c += 4;
break;
 
case ($ord_chrs_c & 0xFE) == 0xFC:
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 6);
$c += 5;
break;
 
}
 
}
 
return $utf8;
 
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
// array, or object notation
 
if ($str{0} == '[') {
$stk = array(SERVICES_JSON_IN_ARR);
$arr = array();
} else {
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$stk = array(SERVICES_JSON_IN_OBJ);
$obj = array();
} else {
$stk = array(SERVICES_JSON_IN_OBJ);
$obj = new stdClass();
}
}
 
array_push($stk, array('what' => SERVICES_JSON_SLICE,
'where' => 0,
'delim' => false));
 
$chrs = substr($str, 1, -1);
$chrs = $this->reduce_string($chrs);
 
if ($chrs == '') {
if (reset($stk) == SERVICES_JSON_IN_ARR) {
return $arr;
 
} else {
return $obj;
 
}
}
 
//print("\nparsing {$chrs}\n");
 
$strlen_chrs = strlen($chrs);
 
for ($c = 0; $c <= $strlen_chrs; ++$c) {
 
$top = end($stk);
$substr_chrs_c_2 = substr($chrs, $c, 2);
 
if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
// found a comma that is not inside a string, array, etc.,
// OR we've reached the end of the character list
$slice = substr($chrs, $top['where'], ($c - $top['where']));
array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
 
if (reset($stk) == SERVICES_JSON_IN_ARR) {
// we are in an array, so just push an element onto the stack
array_push($arr, $this->decode($slice));
 
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
// we are in an object, so figure
// out the property name and set an
// element in an associative array,
// for now
$parts = array();
if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
// "name":value pair
$key = $this->decode($parts[1]);
$val = $this->decode($parts[2]);
 
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$obj[$key] = $val;
} else {
$obj->$key = $val;
}
} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
// name:value pair, where name is unquoted
$key = $parts[1];
$val = $this->decode($parts[2]);
 
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$obj[$key] = $val;
} else {
$obj->$key = $val;
}
}
 
}
 
} elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
// found a quote, and we are not inside a string
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
//print("Found start of string at {$c}\n");
 
} elseif (($chrs{$c} == $top['delim']) &&
($top['what'] == SERVICES_JSON_IN_STR) &&
((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
// found a quote, we're in a string, and it's not escaped
// we know that it's not escaped becase there is _not_ an
// odd number of backslashes at the end of the string so far
array_pop($stk);
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
 
} elseif (($chrs{$c} == '[') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-bracket, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
//print("Found start of array at {$c}\n");
 
} elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
// found a right-bracket, and we're in an array
array_pop($stk);
//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
 
} elseif (($chrs{$c} == '{') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-brace, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
//print("Found start of object at {$c}\n");
 
} elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
// found a right-brace, and we're in an object
array_pop($stk);
//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
 
} elseif (($substr_chrs_c_2 == '/*') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a comment start, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
$c++;
//print("Found start of comment at {$c}\n");
 
} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
// found a comment end, and we're in one now
array_pop($stk);
$c++;
 
for ($i = $top['where']; $i <= $c; ++$i)
$chrs = substr_replace($chrs, ' ', $i, 1);
 
//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
 
}
 
}
 
if (reset($stk) == SERVICES_JSON_IN_ARR) {
return $arr;
 
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
return $obj;
 
}
 
}
}
}
 
/**
* @todo Ultimately, this should just call PEAR::isError()
*/
function isError($data, $code = null)
{
if (class_exists('pear')) {
return PEAR::isError($data, $code);
} elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
is_subclass_of($data, 'services_json_error'))) {
return true;
}
 
return false;
}
}
 
if (class_exists('PEAR_Error')) {
 
class Services_JSON_Error extends PEAR_Error
{
function Services_JSON_Error($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null)
{
parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
}
}
 
} else {
 
/**
* @todo Ultimately, this class shall be descended from PEAR_Error
*/
class Services_JSON_Error
{
function Services_JSON_Error($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null)
{
 
}
}
 
}
?>
/tags/v1.1-andromede/jrest/lib/PDF.php
New file
0,0 → 1,3001
<?php
/**
* File_PDF::
*
* The File_PDF:: class provides a PHP-only implementation of a PDF library.
* No external libs or PHP extensions are required.
*
* Based on the FPDF class by Olivier Plathey (http://www.fpdf.org).
*
* Copyright 2001-2003 Olivier Plathey <olivier@fpdf.org>
* Copyright 2003-2007 The Horde Project (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
*
* $Horde: framework/File_PDF/PDF.php,v 1.48 2007/01/05 13:12:21 jan Exp $
*
* @author Olivier Plathey <olivier@fpdf.org>
* @author Marko Djukic <marko@oblo.com>
* @author Jan Schneider <jan@horde.org>
* @package File_PDF
* @category Fileformats
*/
class File_PDF {
 
/**
* Current page number.
*
* @var integer
*/
var $_page = 0;
 
/**
* Current object number.
*
* @var integer
*/
var $_n = 2;
 
/**
* Array of object offsets.
*
* @var array
*/
var $_offsets = array();
 
/**
* Buffer holding in-memory PDF.
*
* @var string
*/
var $_buffer = '';
 
/**
* Array containing the pages.
*
* @var array
*/
var $_pages = array();
 
/**
* Current document state.
* 0 - initial state
* 1 - document opened
* 2 - page opened
* 3 - document closed
*
* @var integer
*/
var $_state = 0;
 
/**
* Flag indicating if PDF file is to be compressed or not.
*
* @var boolean
*/
var $_compress;
 
/**
* The default page orientation.
*
* @var string
*/
var $_default_orientation;
 
/**
* The current page orientation.
*
* @var string
*/
var $_current_orientation;
 
/**
* Array indicating orientation changes.
*
* @var array
*/
var $_orientation_changes = array();
 
/**
* Current width of page format in points.
*
* @var float
*/
var $fwPt;
 
/**
* Current height of page format in points.
*
* @var float
*/
var $fhPt;
 
/**
* Current width of page format in user units.
*
* @var float
*/
var $fw;
 
/**
* Current height of page format in user units.
*
* @var float
*/
var $fh;
 
/**
* Current width of page in points.
*
* @var float
*/
var $wPt;
 
/**
* Current height of page in points.
*
* @var float
*/
var $hPt;
 
/**
* Current width of page in user units
*
* @var float
*/
var $w;
 
/**
* Current height of page in user units
*
* @var float
*/
var $h;
 
/**
* Scale factor (number of points in user units).
*
* @var float
*/
var $_scale;
 
/**
* Left page margin size.
*
* @var float
*/
var $_left_margin;
 
/**
* Top page margin size.
*
* @var float
*/
var $_top_margin;
 
/**
* Right page margin size.
*
* @var float
*/
var $_right_margin;
 
/**
* Break page margin size, the bottom margin which triggers a page break.
*
* @var float
*/
var $_break_margin;
 
/**
* Cell margin size.
*
* @var float
*/
var $_cell_margin;
 
/**
* The current horizontal position for cell positioning.
* Value is set in user units and is calculated from the top left corner
* as origin.
*
* @var float
*/
var $x;
 
/**
* The current vertical position for cell positioning.
* Value is set in user units and is calculated from the top left corner
* as origin.
*
* @var float
*/
var $y;
 
/**
* The height of the last cell printed.
*
* @var float
*/
var $_last_height;
 
/**
* Line width in user units.
*
* @var float
*/
var $_line_width;
 
/**
* An array of standard font names.
*
* @var array
*/
var $_core_fonts = array('courier' => 'Courier',
'courierB' => 'Courier-Bold',
'courierI' => 'Courier-Oblique',
'courierBI' => 'Courier-BoldOblique',
'helvetica' => 'Helvetica',
'helveticaB' => 'Helvetica-Bold',
'helveticaI' => 'Helvetica-Oblique',
'helveticaBI' => 'Helvetica-BoldOblique',
'times' => 'Times-Roman',
'timesB' => 'Times-Bold',
'timesI' => 'Times-Italic',
'timesBI' => 'Times-BoldItalic',
'symbol' => 'Symbol',
'zapfdingbats' => 'ZapfDingbats');
 
/**
* An array of used fonts.
*
* @var array
*/
var $_fonts = array();
 
/**
* An array of font files.
*
* @var array
*/
var $_font_files = array();
 
/**
* An array of encoding differences.
*
* @var array
*/
var $_diffs = array();
 
/**
* An array of used images.
*
* @var array
*/
var $_images = array();
 
/**
* An array of links in pages.
*
* @var array
*/
var $_page_links;
 
/**
* An array of internal links.
*
* @var array
*/
var $_links = array();
 
/**
* Current font family.
*
* @var string
*/
var $_font_family = '';
 
/**
* Current font style.
*
* @var string
*/
var $_font_style = '';
 
/**
* Underlining flag.
*
* @var boolean
*/
var $_underline = false;
 
/**
* An array containing current font info.
*
* @var array
*/
var $_current_font;
 
/**
* Current font size in points.
*
* @var float
*/
var $_font_size_pt = 12;
 
/**
* Current font size in user units.
*
* @var float
*/
var $_font_size;
 
/**
* Commands for filling color.
*
* @var string
*/
var $_fill_color = '0 g';
 
/**
* Commands for text color.
*
* @var string
*/
var $_text_color = '0 g';
 
/**
* Whether text color is different from fill color.
*
* @var boolean
*/
var $_color_flag = false;
 
/**
* Commands for drawing color.
*
* @var string
*/
var $_draw_color = '0 G';
 
/**
* Word spacing.
*
* @var integer
*/
var $_word_spacing = 0;
 
/**
* Automatic page breaking.
*
* @var boolean
*/
var $_auto_page_break;
 
/**
* Threshold used to trigger page breaks.
*
* @var float
*/
var $_page_break_trigger;
 
/**
* Flag set when processing footer.
*
* @var boolean
*/
var $_in_footer = false;
 
/**
* Zoom display mode.
*
* @var string
*/
var $_zoom_mode;
 
/**
* Layout display mode.
*
* @var string
*/
var $_layout_mode;
 
/**
* An array containing the document info, consisting of:
* - title
* - subject
* - author
* - keywords
* - creator
*
* @var array
*/
var $_info = array();
 
/**
* Alias for total number of pages.
*
* @var string
*/
var $_alias_nb_pages = '{nb}';
 
/**
* Attempts to return a conrete PDF instance. It allows to set up the page
* format, the orientation and the units of measurement used in all the
* methods (except for the font sizes).
*
* Example:<pre>
* $pdf = &File_PDF::factory(array('orientation' => 'P',
* 'unit' => 'mm',
* 'format' => 'A4'));</pre>
*
* @param array $params A hash with parameters for the created PDF object.
* Possible parameters are:
* orientation - Default page orientation. Possible
* values are (case insensitive):
* <pre>
* - P or Portrait (default)
* - L or Landscape
* </pre>
* unit - User measure units. Possible values values
* are:
* <pre>
* - pt: point
* - mm: millimeter (default)
* - cm: centimeter
* - in: inch
* </pre>
* A point equals 1/72 of inch, that is to say about
* 0.35 mm (an inch being 2.54 cm). This is a very
* common unit in typography; font sizes are
* expressed in that unit.
* format - The format used for pages. It can be
* either one of the following values (case
* insensitive):
* <pre>
* - A3
* - A4 (default)
* - A5
* - Letter
* - Legal
* </pre>
* or a custom format in the form of a two-element
* array containing the width and the height
* (expressed in the unit given by the unit
* parameter).
* @param string $class The concrete class name to return an instance of.
* Defaults to File_PDF.
*/
function &factory($params = array(), $class = 'File_PDF')
{
/* Check for PHP locale-related bug. */
if (1.1 == 1) {
$error = File_PDF::raiseError('Do not alter the locale before including the class file.');
return $error;
}
 
/* Default parameters. */
$defaults = array('orientation' => 'P', 'unit' => 'mm', 'format' => 'A4');
 
/* Backward compatibility with old method signature. */
/* Should be removed a few versions later. */
if (!is_array($params)) {
$class = 'File_PDF';
$params = $defaults;
$names = array_keys($defaults);
for ($i = 0; $i < func_num_args(); $i++) {
$params[$names[$i]] = func_get_arg($i);
}
} else {
$params = array_merge($defaults, $params);
}
 
/* Create the PDF object. */
$pdf = &new $class();
 
/* Scale factor. */
if ($params['unit'] == 'pt') {
$pdf->_scale = 1;
} elseif ($params['unit'] == 'mm') {
$pdf->_scale = 72 / 25.4;
} elseif ($params['unit'] == 'cm') {
$pdf->_scale = 72 / 2.54;
} elseif ($params['unit'] == 'in') {
$pdf->_scale = 72;
} else {
$error = File_PDF::raiseError(sprintf('Incorrect units: %s', $params['unit']));
return $error;
}
/* Page format. */
if (is_string($params['format'])) {
$params['format'] = strtolower($params['format']);
if ($params['format'] == 'a3') {
$params['format'] = array(841.89, 1190.55);
} elseif ($params['format'] == 'a4') {
$params['format'] = array(595.28, 841.89);
} elseif ($params['format'] == 'a5') {
$params['format'] = array(420.94, 595.28);
} elseif ($params['format'] == 'letter') {
$params['format'] = array(612, 792);
} elseif ($params['format'] == 'legal') {
$params['format'] = array(612, 1008);
} else {
$error = File_PDF::raiseError(sprintf('Unknown page format: %s', $params['format']));
return $error;
}
$pdf->fwPt = $params['format'][0];
$pdf->fhPt = $params['format'][1];
} else {
$pdf->fwPt = $params['format'][0] * $pdf->_scale;
$pdf->fhPt = $params['format'][1] * $pdf->_scale;
}
$pdf->fw = $pdf->fwPt / $pdf->_scale;
$pdf->fh = $pdf->fhPt / $pdf->_scale;
 
/* Page orientation. */
$params['orientation'] = strtolower($params['orientation']);
if ($params['orientation'] == 'p' || $params['orientation'] == 'portrait') {
$pdf->_default_orientation = 'P';
$pdf->wPt = $pdf->fwPt;
$pdf->hPt = $pdf->fhPt;
} elseif ($params['orientation'] == 'l' || $params['orientation'] == 'landscape') {
$pdf->_default_orientation = 'L';
$pdf->wPt = $pdf->fhPt;
$pdf->hPt = $pdf->fwPt;
} else {
$error = File_PDF::raiseError(sprintf('Incorrect orientation: %s', $params['orientation']));
return $error;
}
$pdf->_current_orientation = $pdf->_default_orientation;
$pdf->w = $pdf->wPt / $pdf->_scale;
$pdf->h = $pdf->hPt / $pdf->_scale;
 
/* Page margins (1 cm) */
$margin = 28.35 / $pdf->_scale;
$pdf->setMargins($margin, $margin);
 
/* Interior cell margin (1 mm) */
$pdf->_cell_margin = $margin / 10;
 
/* Line width (0.2 mm) */
$pdf->_line_width = .567 / $pdf->_scale;
 
/* Automatic page break */
$pdf->setAutoPageBreak(true, 2 * $margin);
 
/* Full width display mode */
$pdf->setDisplayMode('fullwidth');
 
/* Compression */
$pdf->setCompression(true);
 
return $pdf;
}
 
/**
* Returns a PEAR_Error object. Wraps around PEAR::raiseError() to
* avoid having to include PEAR.php unless an error occurs.
*
* @param mixed $error The error message.
*
* @return object PEAR_Error
*/
function raiseError($error)
{
require_once 'PEAR.php';
return PEAR::raiseError($error);
}
 
/**
* Defines the left, top and right margins. By default, they equal 1 cm.
* Call this method to change them.
*
* @param float $left Left margin.
* @param float $top Top margin.
* @param float $right Right margin. If not specified default to the value
* of the left one.
*
* @see File_PDF::setAutoPageBreak
* @see File_PDF::setLeftMargin
* @see File_PDF::setRightMargin
* @see File_PDF::setTopMargin
*/
function setMargins($left, $top, $right = null)
{
/* Set left and top margins. */
$this->_left_margin = $left;
$this->_top_margin = $top;
/* If no right margin set default to same as left. */
$this->_right_margin = (is_null($right) ? $left : $right);
}
 
/**
* Defines the left margin. The method can be called before creating the
* first page.
* If the current abscissa gets out of page, it is brought back to the
* margin.
*
* @param float $margin The margin.
*
* @see File_PDF::setAutoPageBreak
* @see File_PDF::setMargins
* @see File_PDF::setRightMargin
* @see File_PDF::setTopMargin
*/
function setLeftMargin($margin)
{
$this->_left_margin = $margin;
/* If there is a current page and the current X position is less than
* margin set the X position to the margin value. */
if ($this->_page > 0 && $this->x < $margin) {
$this->x = $margin;
}
}
 
/**
* Defines the top margin. The method can be called before creating the
* first page.
*
* @param float $margin The margin.
*/
function setTopMargin($margin)
{
$this->_top_margin = $margin;
}
 
/**
* Defines the right margin. The method can be called before creating the
* first page.
*
* @param float $margin The margin.
*/
function setRightMargin($margin)
{
$this->_right_margin = $margin;
}
 
/**
* Returns the actual page width.
*
* @since File_PDF 0.2.0
* @since Horde 3.2
*
* @return float The page width.
*/
function getPageWidth()
{
return ($this->w - $this->_right_margin - $this->_left_margin);
}
 
/**
* Returns the actual page height.
*
* @since File_PDF 0.2.0
* @since Horde 3.2
*
* @return float The page height.
*/
function getPageHeight()
{
return ($this->h - $this->_top_margin - $this->_break_margin);
}
 
/**
* Enables or disables the automatic page breaking mode. When enabling,
* the second parameter is the distance from the bottom of the page that
* defines the triggering limit. By default, the mode is on and the margin
* is 2 cm.
*
* @param boolean auto Boolean indicating if mode should be on or off.
* @param float $margin Distance from the bottom of the page.
*/
function setAutoPageBreak($auto, $margin = 0)
{
$this->_auto_page_break = $auto;
$this->_break_margin = $margin;
$this->_page_break_trigger = $this->h - $margin;
}
 
/**
* Defines the way the document is to be displayed by the viewer. The zoom
* level can be set: pages can be displayed entirely on screen, occupy the
* full width of the window, use real size, be scaled by a specific
* zooming factor or use viewer default (configured in the Preferences
* menu of Acrobat). The page layout can be specified too: single at once,
* continuous display, two columns or viewer default.
* By default, documents use the full width mode with continuous display.
*
* @param mixed $zoom The zoom to use. It can be one of the
* following string values:
* - fullpage: entire page on screen
* - fullwidth: maximum width of window
* - real: uses real size (100% zoom)
* - default: uses viewer default mode
* or a number indicating the zooming factor.
* @param string layout The page layout. Possible values are:
* - single: one page at once
* - continuous: pages in continuously
* - two: two pages on two columns
* - default: uses viewer default mode
* Default value is continuous.
*/
function setDisplayMode($zoom, $layout = 'continuous')
{
$zoom = strtolower($zoom);
if ($zoom == 'fullpage' || $zoom == 'fullwidth' || $zoom == 'real'
|| $zoom == 'default' || !is_string($zoom)) {
$this->_zoom_mode = $zoom;
} elseif ($zoom == 'zoom') {
$this->_zoom_mode = $layout;
} else {
return $this->raiseError(sprintf('Incorrect zoom display mode: %s', $zoom));
}
 
$layout = strtolower($layout);
if ($layout == 'single' || $layout == 'continuous' || $layout == 'two'
|| $layout == 'default') {
$this->_layout_mode = $layout;
} elseif ($zoom != 'zoom') {
return $this->raiseError(sprintf('Incorrect layout display mode: %s', $layout));
}
}
 
/**
* Activates or deactivates page compression. When activated, the internal
* representation of each page is compressed, which leads to a compression
* ratio of about 2 for the resulting document.
* Compression is on by default.
* Note: the Zlib extension is required for this feature. If not present,
* compression will be turned off.
*
* @param boolean $compress Boolean indicating if compression must be
* enabled or not.
*/
function setCompression($compress)
{
/* If no gzcompress function is available then default to false. */
$this->_compress = (function_exists('gzcompress') ? $compress : false);
}
 
/**
* Set the info to a document. Possible info settings are:
* - title
* - subject
* - author
* - keywords
* - creator
*
* @param mixed $info If passed as an array then the complete hash
* containing the info to be inserted into the
* document. Otherwise the name of setting to be set.
* @param string $value The value of the setting.
*/
function setInfo($info, $value = '')
{
if (is_array($info)) {
$this->_info = $info;
} else {
$this->_info[$info] = $value;
}
}
 
/**
* Defines an alias for the total number of pages. It will be substituted
* as the document is closed.
*
* Example:
* class My_File_PDF extends File_PDF {
* function footer()
* {
* // Go to 1.5 cm from bottom
* $this->setY(-15);
* // Select Arial italic 8
* $this->setFont('Arial', 'I', 8);
* // Print current and total page numbers
* $this->cell(0, 10, 'Page ' . $this->getPageNo() . '/{nb}', 0,
* 0, 'C');
* }
* }
* $pdf = &My_File_PDF::factory();
* $pdf->aliasNbPages();
*
* @param string $alias The alias. Default value: {nb}.
*
* @see File_PDF::getPageNo
* @see File_PDF::footer
*/
function aliasNbPages($alias = '{nb}')
{
$this->_alias_nb_pages = $alias;
}
 
/**
* This method begins the generation of the PDF document; it must be
* called before any output commands. No page is created by this method,
* therefore it is necessary to call File_PDF::addPage.
*
* @see File_PDF::addPage
* @see File_PDF::close
*/
function open()
{
$this->_beginDoc();
}
 
/**
* Terminates the PDF document. It is not necessary to call this method
* explicitly because File_PDF::output does it automatically.
* If the document contains no page, File_PDF::addPage is called to prevent
* from getting an invalid document.
*
* @see File_PDF::open
* @see File_PDF::output
*/
function close()
{
/* Terminate document */
if ($this->_page == 0) {
$this->addPage();
}
/* Page footer */
$this->_in_footer = true;
$this->footer();
$this->_in_footer = false;
/* Close page */
$this->_endPage();
/* Close document */
$this->_endDoc();
}
 
/**
* Adds a new page to the document. If a page is already present, the
* File_PDF::footer method is called first to output the footer. Then the
* page is added, the current position set to the top-left corner according
* to the left and top margins, and File_PDF::header is called to display
* the header.
* The font which was set before calling is automatically restored. There
* is no need to call File_PDF::setFont again if you want to continue with
* the same font. The same is true for colors and line width.
* The origin of the coordinate system is at the top-left corner and
* increasing ordinates go downwards.
*
* @param string $orientation Page orientation. Possible values
* are (case insensitive):
* - P or Portrait
* - L or Landscape
* The default value is the one passed to the
* constructor.
*
* @see File_PDF::PDF
* @see File_PDF::header
* @see File_PDF::footer
* @see File_PDF::setMargins
*/
function addPage($orientation = '')
{
/* For good measure make sure this is called. */
$this->_beginDoc();
 
/* Save style settings so that they are not overridden by footer(). */
$lw = $this->_line_width;
$dc = $this->_draw_color;
$fc = $this->_fill_color;
$tc = $this->_text_color;
$cf = $this->_color_flag;
if ($this->_page > 0) {
/* Page footer. */
$this->_in_footer = true;
$this->footer();
$this->_in_footer = false;
/* Close page. */
$this->_endPage();
}
/* Start new page. */
$this->_beginPage($orientation);
/* Set line cap style to square. */
$this->_out('2 J');
/* Set line width. */
$this->_line_width = $lw;
$this->_out(sprintf('%.2f w', $lw * $this->_scale));
/* Set font for the beginning of the page. */
$font_family = null;
if ($this->_font_family) {
$font_family = $this->_font_family;
$font_style = $this->_font_style . ($this->_underline ? 'U' : '');
$font_size = $this->_font_size_pt;
$this->setFont($font_family, $font_style, $font_size);
}
/* Set colors. */
$this->_fill_color = $fc;
/* Check if fill color has been set before this page. */
if ($this->_fill_color != '0 g') {
$this->_out($this->_fill_color);
}
$this->_draw_color = $dc;
/* Check if draw color has been set before this page. */
if ($this->_draw_color != '0 G') {
$this->_out($this->_draw_color);
}
$this->_text_color = $tc;
$this->_color_flag = $cf;
/* Page header. */
$this->header();
/* Restore line width. */
if ($this->_line_width != $lw) {
$this->_line_width = $lw;
$this->_out(sprintf('%.2f w', $lw * $this->_scale));
}
/* Make sure the font is set for this page as it was before the
* header. */
if ($font_family) {
$this->setFont($font_family, $font_style, $font_size, true);
}
/* Restore colors. */
if ($this->_draw_color != $dc) {
$this->_draw_color = $dc;
$this->_out($dc);
}
if ($this->_fill_color != $fc) {
$this->_fill_color = $fc;
$this->_out($fc);
}
$this->_text_color = $tc;
$this->_color_flag = $cf;
}
 
/**
* This method is used to render the page header. It is automatically
* called by File_PDF::addPage and should not be called directly by the
* application. The implementation in File_PDF:: is empty, so you have to
* subclass it and override the method if you want a specific processing.
*
* Example:
*
* class My_File_PDF extends File_PDF {
* function header()
* {
* // Select Arial bold 15
* $this->setFont('Arial', 'B', 15);
* // Move to the right
* $this->cell(80);
* // Framed title
* $this->cell(30, 10, 'Title', 1, 0, 'C');
* // Line break
* $this->newLine(20);
* }
* }
*
* @see File_PDF::footer
*/
function header()
{
/* To be implemented in your own inherited class. */
}
 
/**
* This method is used to render the page footer. It is automatically
* called by File_PDF::addPage and File_PDF::close and should not be called
* directly by the application. The implementation in File_PDF:: is empty,
* so you have to subclass it and override the method if you want a specific
* processing.
*
* Example:
*
* class My_File_PDF extends File_PDF {
* function footer()
* {
* // Go to 1.5 cm from bottom
* $this->setY(-15);
* // Select Arial italic 8
* $this->setFont('Arial', 'I', 8);
* // Print centered page number
* $this->cell(0, 10, 'Page ' . $this->getPageNo(), 0, 0, 'C');
* }
* }
*
* @see File_PDF::header
*/
function footer()
{
/* To be implemented in your own inherited class. */
}
 
/**
* Returns the current page number.
*
* @return integer
*
* @see File_PDF::aliasNbPages
*/
function getPageNo()
{
return $this->_page;
}
 
/**
* Sets the fill color.
*
* Depending on the colorspace called, the number of color component
* parameters required can be either 1, 3 or 4. The method can be called
* before the first page is created and the color is retained from page to
* page.
*
* @param string $cs Indicates the colorspace which can be either 'rgb',
* 'cmyk' or 'gray'. Defaults to 'rgb'.
* @param float $c1 First color component, floating point value between 0
* and 1. Required for gray, rgb and cmyk.
* @param float $c2 Second color component, floating point value between
* 0 and 1. Required for rgb and cmyk.
* @param float $c3 Third color component, floating point value between
* 0 and 1. Required for rgb and cmyk.
* @param float $c4 Fourth color component, floating point value between
* 0 and 1. Required for cmyk.
*
* @see File_PDF::setTextColor
* @see File_PDF::setDrawColor
* @see File_PDF::rect
* @see File_PDF::cell
* @see File_PDF::multiCell
*/
function setFillColor($cs = 'rgb', $c1, $c2 = 0, $c3 = 0, $c4 = 0)
{
$cs = strtolower($cs);
if ($cs == 'rgb') {
$this->_fill_color = sprintf('%.3f %.3f %.3f rg', $c1, $c2, $c3);
} elseif ($cs == 'cmyk') {
$this->_fill_color = sprintf('%.3f %.3f %.3f %.3f k', $c1, $c2, $c3, $c4);
} else {
$this->_fill_color = sprintf('%.3f g', $c1);
}
if ($this->_page > 0) {
$this->_out($this->_fill_color);
}
$this->_color_flag = $this->_fill_color != $this->_text_color;
}
 
/**
* Sets the text color.
*
* Depending on the colorspace called, the number of color component
* parameters required can be either 1, 3 or 4. The method can be called
* before the first page is created and the color is retained from page to
* page.
*
* @param string $cs Indicates the colorspace which can be either 'rgb',
* 'cmyk' or 'gray'. Defaults to 'rgb'.
* @param float $c1 First color component, floating point value between 0
* and 1. Required for gray, rgb and cmyk.
* @param float $c2 Second color component, floating point value between
* 0 and 1. Required for rgb and cmyk.
* @param float $c3 Third color component, floating point value between
* 0 and 1. Required for rgb and cmyk.
* @param float $c4 Fourth color component, floating point value between
* 0 and 1. Required for cmyk.
*
* @since File_PDF 0.2.0
* @since Horde 3.2
* @see File_PDF::setFillColor
* @see File_PDF::setDrawColor
* @see File_PDF::rect
* @see File_PDF::cell
* @see File_PDF::multiCell
*/
function setTextColor($cs = 'rgb', $c1, $c2 = 0, $c3 = 0, $c4 = 0)
{
$cs = strtolower($cs);
if ($cs == 'rgb') {
$this->_text_color = sprintf('%.3f %.3f %.3f rg', $c1, $c2, $c3);
} elseif ($cs == 'cmyk') {
$this->_text_color = sprintf('%.3f %.3f %.3f %.3f k', $c1, $c2, $c3, $c4);
} else {
$this->_text_color = sprintf('%.3f g', $c1);
}
if ($this->_page > 0) {
$this->_out($this->_text_color);
}
$this->_color_flag = $this->_fill_color != $this->_text_color;
}
 
/**
* Sets the draw color, used when drawing lines. Depending on the
* colorspace called, the number of color component parameters required
* can be either 1, 3 or 4. The method can be called before the first page
* is created and the color is retained from page to page.
*
* @param string $cs Indicates the colorspace which can be either 'rgb',
* 'cmyk' or 'gray'. Defaults to 'rgb'.
* @param float $c1 First color component, floating point value between 0
* and 1. Required for gray, rgb and cmyk.
* @param float $c2 Second color component, floating point value between
* 0 and 1. Required for rgb and cmyk.
* @param float $c3 Third color component, floating point value between 0
* and 1. Required for rgb and cmyk.
* @param float $c4 Fourth color component, floating point value between
* 0 and 1. Required for cmyk.
*
* @see File_PDF::setFillColor
* @see File_PDF::line
* @see File_PDF::rect
* @see File_PDF::cell
* @see File_PDF::multiCell
*/
function setDrawColor($cs = 'rgb', $c1, $c2 = 0, $c3 = 0, $c4 = 0)
{
$cs = strtolower($cs);
if ($cs == 'rgb') {
$this->_draw_color = sprintf('%.3f %.3f %.3f RG', $c1, $c2, $c3);
} elseif ($cs == 'cmyk') {
$this->_draw_color = sprintf('%.3f %.3f %.3f %.3f K', $c1, $c2, $c3, $c4);
} else {
$this->_draw_color = sprintf('%.3f G', $c1);
}
if ($this->_page > 0) {
$this->_out($this->_draw_color);
}
}
 
/**
* Returns the length of a text string. A font must be selected.
*
* @param string $text The text whose length is to be computed.
* @param boolean $pt Boolean to indicate if the width should be returned
* in points or user units. Default is 'false'.
*
* @return float
*/
function getStringWidth($text, $pt = false)
{
$text = (string)$text;
$width = 0;
$length = strlen($text);
for ($i = 0; $i < $length; $i++) {
$width += $this->_current_font['cw'][$text{$i}];
}
 
/* Adjust for word spacing. */
$width += $this->_word_spacing * substr_count($text, ' ') * $this->_current_font['cw'][' '];
 
if ($pt) {
return $width * $this->_font_size_pt / 1000;
} else {
return $width * $this->_font_size / 1000;
}
}
 
/**
* Defines the line width. By default, the value equals 0.2 mm. The method
* can be called before the first page is created and the value is
* retained from page to page.
*
* @param float $width The width.
*
* @see File_PDF::line
* @see File_PDF::rect
* @see File_PDF::cell
* @see File_PDF::multiCell
*/
function setLineWidth($width)
{
$this->_line_width = $width;
if ($this->_page > 0) {
$this->_out(sprintf('%.2f w', $width * $this->_scale));
}
}
 
/**
* Draws a line between two points.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param float $x1 Abscissa of first point.
* @param float $y1 Ordinate of first point.
* @param float $x2 Abscissa of second point.
* @param float $y2 Ordinate of second point.
*
* @see File_PDF::setLineWidth
* @see File_PDF::setDrawColor.
*/
function line($x1, $y1, $x2, $y2)
{
if ($x1 < 0) {
$x1 += $this->w;
}
if ($y1 < 0) {
$y1 += $this->h;
}
if ($x2 < 0) {
$x2 += $this->w;
}
if ($y2 < 0) {
$y2 += $this->h;
}
 
$this->_out(sprintf('%.2f %.2f m %.2f %.2f l S', $x1 * $this->_scale, ($this->h - $y1) * $this->_scale, $x2 * $this->_scale, ($this->h - $y2) * $this->_scale));
}
 
/**
* Outputs a rectangle. It can be drawn (border only), filled (with no
* border) or both.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param float $x Abscissa of upper-left corner.
* @param float $y Ordinate of upper-left corner.
* @param float $width Width.
* @param float $height Height.
* @param float $style Style of rendering. Possible values are:
* - D or empty string: draw (default)
* - F: fill
* - DF or FD: draw and fill
*
* @see File_PDF::setLineWidth
* @see File_PDF::setDrawColor
* @see File_PDF::setFillColor
*/
function rect($x, $y, $width, $height, $style = '')
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
$style = strtoupper($style);
if ($style == 'F') {
$op = 'f';
} elseif ($style == 'FD' || $style == 'DF') {
$op = 'B';
} else {
$op = 'S';
}
 
$x = $this->_toPt($x);
$y = $this->_toPt($y);
$width = $this->_toPt($width);
$height = $this->_toPt($height);
 
$this->_out(sprintf('%.2f %.2f %.2f %.2f re %s', $x, $this->hPt - $y, $width, -$height, $op));
}
 
/**
* Outputs a circle. It can be drawn (border only), filled (with no
* border) or both.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param float $x Abscissa of the center of the circle.
* @param float $y Ordinate of the center of the circle.
* @param float $r Circle radius.
* @param string $style Style of rendering. Possible values are:
* - D or empty string: draw (default)
* - F: fill
* - DF or FD: draw and fill
*/
function circle($x, $y, $r, $style = '')
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
$style = strtolower($style);
if ($style == 'f') {
$op = 'f'; // Style is fill only.
} elseif ($style == 'fd' || $style == 'df') {
$op = 'B'; // Style is fill and stroke.
} else {
$op = 'S'; // Style is stroke only.
}
 
$x = $this->_toPt($x);
$y = $this->_toPt($y);
$r = $this->_toPt($r);
 
/* Invert the y scale. */
$y = $this->hPt - $y;
/* Length of the Bezier control. */
$b = $r * 0.552;
 
/* Move from the given origin and set the current point
* to the start of the first Bezier curve. */
$c = sprintf('%.2f %.2f m', $x - $r, $y);
$x = $x - $r;
/* First circle quarter. */
$c .= sprintf(' %.2f %.2f %.2f %.2f %.2f %.2f c',
$x, $y + $b, // First control point.
$x + $r - $b, $y + $r, // Second control point.
$x + $r, $y + $r); // Final point.
/* Set x/y to the final point. */
$x = $x + $r;
$y = $y + $r;
/* Second circle quarter. */
$c .= sprintf(' %.2f %.2f %.2f %.2f %.2f %.2f c',
$x + $b, $y,
$x + $r, $y - $r + $b,
$x + $r, $y - $r);
/* Set x/y to the final point. */
$x = $x + $r;
$y = $y - $r;
/* Third circle quarter. */
$c .= sprintf(' %.2f %.2f %.2f %.2f %.2f %.2f c',
$x, $y - $b,
$x - $r + $b, $y - $r,
$x - $r, $y - $r);
/* Set x/y to the final point. */
$x = $x - $r;
$y = $y - $r;
/* Fourth circle quarter. */
$c .= sprintf(' %.2f %.2f %.2f %.2f %.2f %.2f c %s',
$x - $b, $y,
$x - $r, $y + $r - $b,
$x - $r, $y + $r,
$op);
/* Output the whole string. */
$this->_out($c);
}
 
/**
* Imports a TrueType or Type1 font and makes it available. It is
* necessary to generate a font definition file first with the
* makefont.php utility.
* The location of the definition file (and the font file itself when
* embedding) must be found at the full path name included.
*
* Example:
* $pdf->addFont('Comic', 'I');
* is equivalent to:
* $pdf->addFont('Comic', 'I', 'comici.php');
*
* @param string $family Font family. The name can be chosen arbitrarily.
* If it is a standard family name, it will
* override the corresponding font.
* @param string $style Font style. Possible values are (case
* insensitive):
* - empty string: regular (default)
* - B: bold
* - I: italic
* - BI or IB: bold italic
* @param string $file The font definition file. By default, the name is
* built from the family and style, in lower case
* with no space.
*
* @see File_PDF::setFont
*/
function addFont($family, $style = '', $file = '')
{
$family = strtolower($family);
if ($family == 'arial') {
$family = 'helvetica';
}
 
$style = strtoupper($style);
if ($style == 'IB') {
$style = 'BI';
}
if (isset($this->_fonts[$family . $style])) {
return $this->raiseError(sprintf('Font already added: %s %s', $family, $style));
}
if ($file == '') {
$file = str_replace(' ', '', $family) . strtolower($style) . '.php';
}
include($file);
if (!isset($name)) {
return $this->raiseError('Could not include font definition file.');
}
$i = count($this->_fonts) + 1;
$this->_fonts[$family . $style] = array('i' => $i, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'enc' => $enc, 'file' => $file);
if ($diff) {
/* Search existing encodings. */
$d = 0;
$nb = count($this->_diffs);
for ($i = 1; $i <= $nb; $i++) {
if ($this->_diffs[$i] == $diff) {
$d = $i;
break;
}
}
if ($d == 0) {
$d = $nb + 1;
$this->_diffs[$d] = $diff;
}
$this->_fonts[$family.$style]['diff'] = $d;
}
if ($file) {
if ($type == 'TrueType') {
$this->_font_files[$file] = array('length1' => $originalsize);
} else {
$this->_font_files[$file] = array('length1' => $size1, 'length2' => $size2);
}
}
}
 
/**
* Sets the font used to print character strings. It is mandatory to call
* this method at least once before printing text or the resulting
* document would not be valid. The font can be either a standard one or a
* font added via the File_PDF::addFont method. Standard fonts use Windows
* encoding cp1252 (Western Europe).
* The method can be called before the first page is created and the font
* is retained from page to page.
* If you just wish to change the current font size, it is simpler to call
* File_PDF::setFontSize.
*
* @param string $family Family font. It can be either a name defined by
* File_PDF::addFont or one of the standard families
* (case insensitive):
* - Courier (fixed-width)
* - Helvetica or Arial (sans serif)
* - Times (serif)
* - Symbol (symbolic)
* - ZapfDingbats (symbolic)
* It is also possible to pass an empty string. In
* that case, the current family is retained.
* @param string $style Font style. Possible values are (case
* insensitive):
* - empty string: regular
* - B: bold
* - I: italic
* - U: underline
* or any combination. The default value is regular.
* Bold and italic styles do not apply to Symbol and
* ZapfDingbats.
* @param integer $size Font size in points. The default value is the
* current size. If no size has been specified since
* the beginning of the document, the value taken
* is 12.
* @param boolean $force Force the setting of the font. Each new page will
* require a new call to File_PDF::setFont and
* settings this to true will make sure that the
* checks for same font calls will be skipped.
*
* @see File_PDF::addFont
* @see File_PDF::setFontSize
* @see File_PDF::cell
* @see File_PDF::multiCell
* @see File_PDF::Write
*/
function setFont($family, $style = '', $size = null, $force = false)
{
$family = strtolower($family);
if ($family == 'arial') {
/* Use helvetica instead of arial. */
$family = 'helvetica';
} elseif ($family == 'symbol' || $family == 'zapfdingbats') {
/* These two fonts do not have styles available. */
$style = '';
}
 
$style = strtoupper($style);
 
/* Underline is handled separately, if specified in the style var
* remove it from the style and set the underline flag. */
if (strpos($style, 'U') !== false) {
$this->_underline = true;
$style = str_replace('U', '', $style);
} else {
$this->_underline = false;
}
 
if ($style == 'IB') {
$style = 'BI';
}
 
/* If no size specified, use current size. */
if (is_null($size)) {
$size = $this->_font_size_pt;
}
 
/* If font requested is already the current font and no force setting
* of the font is requested (eg. when adding a new page) don't bother
* with the rest of the function and simply return. */
if ($this->_font_family == $family && $this->_font_style == $style &&
$this->_font_size_pt == $size && !$force) {
return;
}
 
/* Set the font key. */
$fontkey = $family . $style;
 
/* Test if already cached. */
if (!isset($this->_fonts[$fontkey])) {
/* Get the character width definition file. */
$font_widths = &File_PDF::_getFontFile($fontkey);
if (is_a($font_widths, 'PEAR_Error')) {
return $font_widths;
}
 
$i = count($this->_fonts) + 1;
$this->_fonts[$fontkey] = array(
'i' => $i,
'type' => 'core',
'name' => $this->_core_fonts[$fontkey],
'up' => -100,
'ut' => 50,
'cw' => $font_widths[$fontkey]);
}
 
/* Store font information as current font. */
$this->_font_family = $family;
$this->_font_style = $style;
$this->_font_size_pt = $size;
$this->_font_size = $size / $this->_scale;
$this->_current_font = &$this->_fonts[$fontkey];
 
/* Output font information if at least one page has been defined. */
if ($this->_page > 0) {
$this->_out(sprintf('BT /F%d %.2f Tf ET', $this->_current_font['i'], $this->_font_size_pt));
}
}
 
/**
* Defines the size of the current font.
*
* @param float $size The size (in points).
*
* @see File_PDF::setFont
*/
function setFontSize($size)
{
/* If the font size is already the current font size, just return. */
if ($this->_font_size_pt == $size) {
return;
}
/* Set the current font size, both in points and scaled to user
* units. */
$this->_font_size_pt = $size;
$this->_font_size = $size / $this->_scale;
 
/* Output font information if at least one page has been defined. */
if ($this->_page > 0) {
$this->_out(sprintf('BT /F%d %.2f Tf ET', $this->_current_font['i'], $this->_font_size_pt));
}
}
 
/**
* Defines the style of the current font.
*
* @param string $style The font style.
*
* @see File_PDF::setFont
* @since File_PDF 0.2.0
* @since Horde 3.2
*/
function setFontStyle($style)
{
$this->setFont($this->_font_family, $style);
}
 
/**
* Creates a new internal link and returns its identifier. An internal
* link is a clickable area which directs to another place within the
* document.
* The identifier can then be passed to File_PDF::cell, File_PDF::write,
* File_PDF::image or File_PDF::link. The destination is defined with
* File_PDF::setLink.
*
* @see File_PDF::cell
* @see File_PDF::Write
* @see File_PDF::image
* @see File_PDF::Link
* @see File_PDF::SetLink
*/
function addLink()
{
$n = count($this->_links) + 1;
$this->_links[$n] = array(0, 0);
return $n;
}
 
/**
* Defines the page and position a link points to.
*
* @param integer $link The link identifier returned by File_PDF::addLink.
* @param float $y Ordinate of target position; -1 indicates the
* current position. The default value is 0 (top of
* page).
* @param integer $page Number of target page; -1 indicates the current
* page. This is the default value.
*
* @see File_PDF::addLink
*/
function setLink($link, $y = 0, $page = -1)
{
if ($y == -1) {
$y = $this->y;
}
if ($page == -1) {
$page = $this->_page;
}
$this->_links[$link] = array($page, $y);
}
 
/**
* Puts a link on a rectangular area of the page. Text or image links are
* generally put via File_PDF::cell, File_PDF::Write or File_PDF::image,
* but this method can be useful for instance to define a clickable area
* inside an image.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param float $x Abscissa of the upper-left corner of the rectangle.
* @param float $y Ordinate of the upper-left corner of the rectangle.
* @param float $width Width of the rectangle.
* @param float $height Height of the rectangle.
* @param mixed $link URL or identifier returned by File_PDF::addLink.
*
* @see File_PDF::addLink
* @see File_PDF::cell
* @see File_PDF::Write
* @see File_PDF::image
*/
function link($x, $y, $width, $height, $link)
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
/* Set up the coordinates with correct scaling in pt. */
$x = $this->_toPt($x);
$y = $this->hPt - $this->_toPt($y);
$width = $this->_toPt($width);
$height = $this->_toPt($height);
 
/* Save link to page links array. */
$this->_link($x, $y, $width, $height, $link);
}
 
/**
* Prints a character string. The origin is on the left of the first
* character, on the baseline. This method allows to place a string
* precisely on the page, but it is usually easier to use File_PDF::cell,
* File_PDF::multiCell or File_PDF::Write which are the standard methods to
* print text.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param float $x Abscissa of the origin.
* @param float $y Ordinate of the origin.
* @param string $text String to print.
*
* @see File_PDF::setFont
* @see File_PDF::cell
* @see File_PDF::multiCell
* @see File_PDF::Write
*/
function text($x, $y, $text)
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
/* Scale coordinates into points and set correct Y position. */
$x = $this->_toPt($x);
$y = $this->hPt - $this->_toPt($y);
 
/* Escape any potentially harmful characters. */
$text = $this->_escape($text);
 
$out = sprintf('BT %.2f %.2f Td (%s) Tj ET', $x, $y, $text);
if ($this->_underline && $text != '') {
$out .= ' ' . $this->_doUnderline($x, $y, $text);
}
if ($this->_color_flag) {
$out = sprintf('q %s %s Q', $this->_text_color, $out);
}
$this->_out($out);
}
 
/**
* Whenever a page break condition is met, the method is called, and the
* break is issued or not depending on the returned value. The default
* implementation returns a value according to the mode selected by
* File_PDF:setAutoPageBreak.
* This method is called automatically and should not be called directly
* by the application.
*
* @return boolean
*
* @see File_PDF::setAutoPageBreak.
*/
function acceptPageBreak()
{
return $this->_auto_page_break;
}
 
/**
* Prints a cell (rectangular area) with optional borders, background
* color and character string. The upper-left corner of the cell
* corresponds to the current position. The text can be aligned or
* centered. After the call, the current position moves to the right or to
* the next line. It is possible to put a link on the text.
* If automatic page breaking is enabled and the cell goes beyond the
* limit, a page break is done before outputting.
*
* @param float $width Cell width. If 0, the cell extends up to the right
* margin.
* @param float $height Cell height. Default value: 0.
* @param string $text String to print. Default value: empty.
* @param mixed $border Indicates if borders must be drawn around the
* cell. The value can be either a number:
* - 0: no border (default)
* - 1: frame
* or a string containing some or all of the
* following characters (in any order):
* - L: left
* - T: top
* - R: right
* - B: bottom
* @param integer $ln Indicates where the current position should go
* after the call. Possible values are:
* - 0: to the right (default)
* - 1: to the beginning of the next line
* - 2: below
* Putting 1 is equivalent to putting 0 and calling
* File_PDF::newLine just after.
* @param string $align Allows to center or align the text. Possible
* values are:
* - L or empty string: left (default)
* - C: center
* - R: right
* @param integer $fill Indicates if the cell fill type. Possible values
* are:
* - 0: transparent (default)
* - 1: painted
* @param string $link URL or identifier returned by
* File_PDF:addLink.
*
* @see File_PDF::setFont
* @see File_PDF::setDrawColor
* @see File_PDF::setFillColor
* @see File_PDF::setLineWidth
* @see File_PDF::addLink
* @see File_PDF::newLine
* @see File_PDF::multiCell
* @see File_PDF::Write
* @see File_PDF::setAutoPageBreak
*/
function cell($width, $height = 0, $text = '', $border = 0, $ln = 0,
$align = '', $fill = 0, $link = '')
{
$k = $this->_scale;
if ($this->y + $height > $this->_page_break_trigger &&
!$this->_in_footer && $this->AcceptPageBreak()) {
$x = $this->x;
$ws = $this->_word_spacing;
if ($ws > 0) {
$this->_word_spacing = 0;
$this->_out('0 Tw');
}
$this->addPage($this->_current_orientation);
$this->x = $x;
if ($ws > 0) {
$this->_word_spacing = $ws;
$this->_out(sprintf('%.3f Tw', $ws * $k));
}
}
if ($width == 0) {
$width = $this->w - $this->_right_margin - $this->x;
}
$s = '';
if ($fill == 1 || $border == 1) {
if ($fill == 1) {
$op = ($border == 1) ? 'B' : 'f';
} else {
$op = 'S';
}
$s = sprintf('%.2f %.2f %.2f %.2f re %s ', $this->x * $k, ($this->h - $this->y) * $k, $width * $k, -$height * $k, $op);
}
if (is_string($border)) {
if (strpos($border, 'L') !== false) {
$s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $this->x * $k, ($this->h - $this->y) * $k, $this->x * $k, ($this->h - ($this->y + $height)) * $k);
}
if (strpos($border, 'T') !== false) {
$s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $this->x * $k, ($this->h - $this->y) * $k, ($this->x + $width) * $k, ($this->h - $this->y) * $k);
}
if (strpos($border, 'R') !== false) {
$s .= sprintf('%.2f %.2f m %.2f %.2f l S ', ($this->x + $width) * $k, ($this->h - $this->y) * $k, ($this->x + $width) * $k, ($this->h - ($this->y + $height)) * $k);
}
if (strpos($border, 'B') !== false) {
$s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $this->x * $k, ($this->h - ($this->y + $height)) * $k, ($this->x + $width) * $k, ($this->h - ($this->y + $height)) * $k);
}
}
if ($text != '') {
if ($align == 'R') {
$dx = $width - $this->_cell_margin - $this->getStringWidth($text);
} elseif ($align == 'C') {
$dx = ($width - $this->getStringWidth($text)) / 2;
} else {
$dx = $this->_cell_margin;
}
if ($this->_color_flag) {
$s .= 'q ' . $this->_text_color . ' ';
}
$text = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $text)));
$test2 = ((.5 * $height) + (.3 * $this->_font_size));
$test1 = $this->fhPt - (($this->y + $test2) * $k);
$s .= sprintf('BT %.2f %.2f Td (%s) Tj ET', ($this->x + $dx) * $k, ($this->h - ($this->y + .5 * $height + .3 * $this->_font_size)) * $k, $text);
if ($this->_underline) {
$s .= ' ' . $this->_doUnderline($this->x + $dx, $this->y + .5 * $height + .3 * $this->_font_size, $text);
}
if ($this->_color_flag) {
$s .= ' Q';
}
if ($link) {
$this->link($this->x + $dx, $this->y + .5 * $height-.5 * $this->_font_size, $this->getStringWidth($text), $this->_font_size, $link);
}
}
if ($s) {
$this->_out($s);
}
$this->_last_height = $height;
if ($ln > 0) {
/* Go to next line. */
$this->y += $height;
if ($ln == 1) {
$this->x = $this->_left_margin;
}
} else {
$this->x += $width;
}
}
 
/**
* This method allows printing text with line breaks. They can be
* automatic (as soon as the text reaches the right border of the cell) or
* explicit (via the \n character). As many cells as necessary are output,
* one below the other.
* Text can be aligned, centered or justified. The cell block can be
* framed and the background painted.
*
* @param float $width Width of cells. If 0, they extend up to the right
* margin of the page.
* @param float $height Height of cells.
* @param string $text String to print.
* @param mixed $border Indicates if borders must be drawn around the cell
* block. The value can be either a number:
* - 0: no border (default)
* - 1: frame
* or a string containing some or all of the
* following characters (in any order):
* - L: left
* - T: top
* - R: right
* - B: bottom
* @param string $align Sets the text alignment. Possible values are:
* - L: left alignment
* - C: center
* - R: right alignment
* - J: justification (default value)
* @param integer $fill Indicates if the cell background must:
* - 0: transparent (default)
* - 1: painted
*
* @see File_PDF::setFont
* @see File_PDF::setDrawColor
* @see File_PDF::setFillColor
* @see File_PDF::setLineWidth
* @see File_PDF::cell
* @see File_PDF::write
* @see File_PDF::setAutoPageBreak
*/
function multiCell($width, $height, $text, $border = 0, $align = 'J',
$fill = 0)
{
$cw = &$this->_current_font['cw'];
if ($width == 0) {
$width = $this->w - $this->_right_margin - $this->x;
}
$wmax = ($width-2 * $this->_cell_margin) * 1000 / $this->_font_size;
$s = str_replace("\r", '', $text);
$nb = strlen($s);
if ($nb > 0 && $s[$nb-1] == "\n") {
$nb--;
}
$b = 0;
if ($border) {
if ($border == 1) {
$border = 'LTRB';
$b = 'LRT';
$b2 = 'LR';
} else {
$b2 = '';
if (strpos($border, 'L') !== false) {
$b2 .= 'L';
}
if (strpos($border, 'R') !== false) {
$b2 .= 'R';
}
$b = (strpos($border, 'T') !== false) ? $b2 . 'T' : $b2;
}
}
$sep = -1;
$i = 0;
$j = 0;
$l = 0;
$ns = 0;
$nl = 1;
while ($i < $nb) {
/* Get next character. */
$c = $s[$i];
if ($c == "\n") {
/* Explicit line break. */
if ($this->_word_spacing > 0) {
$this->_word_spacing = 0;
$this->_out('0 Tw');
}
$this->cell($width, $height, substr($s, $j, $i-$j), $b, 2, $align, $fill);
$i++;
$sep = -1;
$j = $i;
$l = 0;
$ns = 0;
$nl++;
if ($border && $nl == 2) {
$b = $b2;
}
continue;
}
if ($c == ' ') {
$sep = $i;
$ls = $l;
$ns++;
}
$l += $cw[$c];
if ($l > $wmax) {
/* Automatic line break. */
if ($sep == -1) {
if ($i == $j) {
$i++;
}
if ($this->_word_spacing > 0) {
$this->_word_spacing = 0;
$this->_out('0 Tw');
}
$this->cell($width, $height, substr($s, $j, $i - $j), $b, 2, $align, $fill);
} else {
if ($align == 'J') {
$this->_word_spacing = ($ns>1) ? ($wmax - $ls)/1000 * $this->_font_size / ($ns - 1) : 0;
$this->_out(sprintf('%.3f Tw', $this->_word_spacing * $this->_scale));
}
$this->cell($width, $height, substr($s, $j, $sep - $j), $b, 2, $align, $fill);
$i = $sep + 1;
}
$sep = -1;
$j = $i;
$l = 0;
$ns = 0;
$nl++;
if ($border && $nl == 2) {
$b = $b2;
}
} else {
$i++;
}
}
/* Last chunk. */
if ($this->_word_spacing > 0) {
$this->_word_spacing = 0;
$this->_out('0 Tw');
}
if ($border && strpos($border, 'B') !== false) {
$b .= 'B';
}
$this->cell($width, $height, substr($s, $j, $i), $b, 2, $align, $fill);
$this->x = $this->_left_margin;
}
 
/**
* This method prints text from the current position. When the right
* margin is reached (or the \n character is met) a line break occurs and
* text continues from the left margin. Upon method exit, the current
* position is left just at the end of the text.
* It is possible to put a link on the text.
*
* Example:
* //Begin with regular font
* $pdf->setFont('Arial','',14);
* $pdf->write(5,'Visit ');
* //Then put a blue underlined link
* $pdf->setTextColor(0,0,255);
* $pdf->setFont('','U');
* $pdf->write(5,'www.fpdf.org','http://www.fpdf.org');
*
* @param float $height Line height.
* @param string $text String to print.
* @param mixed $link URL or identifier returned by AddLink().
*
* @see File_PDF::setFont
* @see File_PDF::addLink
* @see File_PDF::multiCell
* @see File_PDF::setAutoPageBreak
*/
function write($height, $text, $link = '')
{
$cw = &$this->_current_font['cw'];
$width = $this->w - $this->_right_margin - $this->x;
$wmax = ($width - 2 * $this->_cell_margin) * 1000 / $this->_font_size;
$s = str_replace("\r", '', $text);
$nb = strlen($s);
$sep = -1;
$i = 0;
$j = 0;
$l = 0;
$nl = 1;
while ($i < $nb) {
/* Get next character. */
$c = $s{$i};
if ($c == "\n") {
/* Explicit line break. */
$this->cell($width, $height, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
$i++;
$sep = -1;
$j = $i;
$l = 0;
if ($nl == 1) {
$this->x = $this->_left_margin;
$width = $this->w - $this->_right_margin - $this->x;
$wmax = ($width - 2 * $this->_cell_margin) * 1000 / $this->_font_size;
}
$nl++;
continue;
}
if ($c == ' ') {
$sep = $i;
$ls = $l;
}
$l += (isset($cw[$c]) ? $cw[$c] : 0);
if ($l > $wmax) {
/* Automatic line break. */
if ($sep == -1) {
if ($this->x > $this->_left_margin) {
/* Move to next line. */
$this->x = $this->_left_margin;
$this->y += $height;
$width = $this->w - $this->_right_margin - $this->x;
$wmax = ($width - 2 * $this->_cell_margin) * 1000 / $this->_font_size;
$i++;
$nl++;
continue;
}
if ($i == $j) {
$i++;
}
$this->cell($width, $height, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
} else {
$this->cell($width, $height, substr($s, $j, $sep - $j), 0, 2, '', 0, $link);
$i = $sep + 1;
}
$sep = -1;
$j = $i;
$l = 0;
if ($nl == 1) {
$this->x = $this->_left_margin;
$width = $this->w - $this->_right_margin - $this->x;
$wmax = ($width - 2 * $this->_cell_margin) * 1000 / $this->_font_size;
}
$nl++;
} else {
$i++;
}
}
/* Last chunk. */
if ($i != $j) {
$this->cell($l / 1000 * $this->_font_size, $height, substr($s, $j, $i), 0, 0, '', 0, $link);
}
}
 
/**
* Writes text at an angle.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* @param integer $x X coordinate.
* @param integer $y Y coordinate.
* @param string $text Text to write.
* @param float $text_angle Angle to rotate (Eg. 90 = bottom to top).
* @param float $font_angle Rotate characters as well as text.
*
* @see File_PDF::setFont
*/
function writeRotated($x, $y, $text, $text_angle, $font_angle = 0)
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
/* Escape text. */
$text = $this->_escape($text);
 
$font_angle += 90 + $text_angle;
$text_angle *= M_PI / 180;
$font_angle *= M_PI / 180;
 
$text_dx = cos($text_angle);
$text_dy = sin($text_angle);
$font_dx = cos($font_angle);
$font_dy = sin($font_angle);
 
$s= sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET',
$text_dx, $text_dy, $font_dx, $font_dy,
$x * $this->_scale, ($this->h-$y) * $this->_scale, $text);
 
if ($this->_draw_color) {
$s = 'q ' . $this->_draw_color . ' ' . $s . ' Q';
}
$this->_out($s);
}
 
/**
* Prints an image in the page. The upper-left corner and at least one of
* the dimensions must be specified; the height or the width can be
* calculated automatically in order to keep the image proportions.
* Supported formats are JPEG and PNG.
*
* All coordinates can be negative to provide values from the right or
* bottom edge of the page (since File_PDF 0.2.0, Horde 3.2).
*
* For JPEG, all flavors are allowed:
* - gray scales
* - true colors (24 bits)
* - CMYK (32 bits)
*
* For PNG, are allowed:
* - gray scales on at most 8 bits (256 levels)
* - indexed colors
* - true colors (24 bits)
* but are not supported:
* - Interlacing
* - Alpha channel
*
* If a transparent color is defined, it will be taken into account (but
* will be only interpreted by Acrobat 4 and above).
* The format can be specified explicitly or inferred from the file
* extension.
* It is possible to put a link on the image.
*
* Remark: if an image is used several times, only one copy will be
* embedded in the file.
*
* @param string $file Name of the file containing the image.
* @param float $x Abscissa of the upper-left corner.
* @param float $y Ordinate of the upper-left corner.
* @param float $width Width of the image in the page. If equal to zero,
* it is automatically calculated to keep the
* original proportions.
* @param float $height Height of the image in the page. If not specified
* or equal to zero, it is automatically calculated
* to keep the original proportions.
* @param string $type Image format. Possible values are (case
* insensitive) : JPG, JPEG, PNG. If not specified,
* the type is inferred from the file extension.
* @param mixed $link URL or identifier returned by File_PDF::addLink.
*
* @see File_PDF::addLink
*/
function image($file, $x, $y, $width = 0, $height = 0, $type = '',
$link = '')
{
if ($x < 0) {
$x += $this->w;
}
if ($y < 0) {
$y += $this->h;
}
 
if (!isset($this->_images[$file])) {
/* First use of image, get some file info. */
if ($type == '') {
$pos = strrpos($file, '.');
if ($pos === false) {
return $this->raiseError(sprintf('Image file has no extension and no type was specified: %s', $file));
}
$type = substr($file, $pos + 1);
}
$type = strtolower($type);
$mqr = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
if ($type == 'jpg' || $type == 'jpeg') {
$info = $this->_parseJPG($file);
} elseif ($type == 'png') {
$info = $this->_parsePNG($file);
} else {
return $this->raiseError(sprintf('Unsupported image file type: %s', $type));
}
if (is_a($info, 'PEAR_Error')) {
return $info;
}
set_magic_quotes_runtime($mqr);
$info['i'] = count($this->_images) + 1;
$this->_images[$file] = $info;
} else {
$info = $this->_images[$file];
}
 
/* Make sure all vars are converted to pt scale. */
$x = $this->_toPt($x);
$y = $this->_toPt($y);
$width = $this->_toPt($width);
$height = $this->_toPt($height);
 
/* If not specified do automatic width and height calculations. */
if (empty($width) && empty($height)) {
$width = $info['w'];
$height = $info['h'];
} elseif (empty($width)) {
$width = $height * $info['w'] / $info['h'];
} elseif (empty($height)) {
$height = $width * $info['h'] / $info['w'];
}
 
$this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q', $width, $height, $x, $this->hPt - ($y + $height), $info['i']));
 
/* Set any link if requested. */
if ($link) {
$this->_link($x, $y, $width, $height, $link);
}
}
 
/**
* Performs a line break. The current abscissa goes back to the left
* margin and the ordinate increases by the amount passed in parameter.
*
* @param float $height The height of the break. By default, the value
* equals the height of the last printed cell.
*
* @see File_PDF::cell
*/
function newLine($height = '')
{
$this->x = $this->_left_margin;
if (is_string($height)) {
$this->y += $this->_last_height;
} else {
$this->y += $height;
}
}
 
/**
* Returns the abscissa of the current position in user units.
*
* @return float
*
* @see File_PDF::setX
* @see File_PDF::getY
* @see File_PDF::setY
*/
function getX()
{
return $this->x;
}
 
/**
* Defines the abscissa of the current position. If the passed value is
* negative, it is relative to the right of the page.
*
* @param float $x The value of the abscissa.
*
* @see File_PDF::getX
* @see File_PDF::getY
* @see File_PDF::setY
* @see File_PDF::setXY
*/
function setX($x)
{
if ($x >= 0) {
/* Absolute value. */
$this->x = $x;
} else {
/* Negative, so relative to right edge of the page. */
$this->x = $this->w + $x;
}
}
 
/**
* Returns the ordinate of the current position in user units.
*
* @return float
*
* @see File_PDF::setY
* @see File_PDF::getX
* @see File_PDF::setX
*/
function getY()
{
return $this->y;
}
 
/**
* Defines the ordinate of the current position. If the passed value is
* negative, it is relative to the bottom of the page.
*
* @param float $y The value of the ordinate.
*
* @see File_PDF::getX
* @see File_PDF::getY
* @see File_PDF::setY
* @see File_PDF::setXY
*/
function setY($y)
{
if ($y >= 0) {
/* Absolute value. */
$this->y = $y;
} else {
/* Negative, so relative to bottom edge of the page. */
$this->y = $this->h + $y;
}
}
 
/**
* Defines the abscissa and ordinate of the current position. If the
* passed values are negative, they are relative respectively to the right
* and bottom of the page.
*
* @param float $x The value of the abscissa.
* @param float $y The value of the ordinate.
*
* @see File_PDF::setX
* @see File_PDF::setY
*/
function setXY($x, $y)
{
$this->setY($y);
$this->setX($x);
}
 
/**
* Returns the raw PDF file.
*
* @see File_PDF::output
*/
function getOutput()
{
/* Check whether file has been closed. */
if ($this->_state < 3) {
$this->close();
}
 
return $this->_buffer;
}
 
/**
* Function to output the buffered data to the browser.
*
* @param string $filename The filename for the output file.
* @param boolean $inline True if inline, false if attachment.
*/
function output($filename = 'unknown.pdf', $inline = false)
{
/* Check whether file has been closed. */
if ($this->_state < 3) {
$this->close();
}
 
/* Check if headers have been sent. */
if (headers_sent()) {
return $this->raiseError('Unable to send PDF file, some data has already been output to browser.');
}
 
/* If HTTP_Download is not available return a PEAR_Error. */
if (!include_once 'HTTP/Download.php') {
return $this->raiseError('Missing PEAR package HTTP_Download.');
}
 
/* Params for the output. */
$disposition = !$inline ? HTTP_DOWNLOAD_ATTACHMENT : HTTP_DOWNLOAD_INLINE;
$params = array('data' => $this->_buffer,
'contenttype' => 'application/pdf',
'contentdisposition' => array($disposition, $filename));
/* Output the file. */
return HTTP_Download::staticSend($params);
}
 
/**
* Function to save the PDF file somewhere local to the server.
*
* @param string $filename The filename for the output file.
*/
function save($filename = 'unknown.pdf')
{
/* Check whether file has been closed. */
if ($this->_state < 3) {
$this->close();
}
 
$f = fopen($filename, 'wb');
if (!$f) {
return $this->raiseError(sprintf('Unable to save PDF file: %s', $filename));
}
fwrite($f, $this->_buffer, strlen($this->_buffer));
fclose($f);
}
 
function _toPt($val)
{
return $val * $this->_scale;
}
 
function &_getFontFile($fontkey, $path = '')
{
static $font_widths;
 
if (!isset($font_widths[$fontkey])) {
if (!empty($path)) {
$file = $path . strtolower($fontkey) . '.php';
} else {
$file = 'File/PDF/fonts/' . strtolower($fontkey) . '.php';
}
include $file;
if (!isset($font_widths[$fontkey])) {
return $this->raiseError(sprintf('Could not include font metric file: %s', $file));
}
}
 
return $font_widths;
}
 
function _link($x, $y, $width, $height, $link)
{
/* Save link to page links array. */
$this->_page_links[$this->_page][] = array($x, $y, $width, $height, $link);
}
 
function _beginDoc()
{
/* Start document, but only if not yet started. */
if ($this->_state < 1) {
$this->_state = 1;
$this->_out('%PDF-1.3');
}
}
 
function _putPages()
{
$nb = $this->_page;
if (!empty($this->_alias_nb_pages)) {
/* Replace number of pages. */
for ($n = 1; $n <= $nb; $n++) {
$this->_pages[$n] = str_replace($this->_alias_nb_pages, $nb, $this->_pages[$n]);
}
}
if ($this->_default_orientation == 'P') {
$wPt = $this->fwPt;
$hPt = $this->fhPt;
} else {
$wPt = $this->fhPt;
$hPt = $this->fwPt;
}
$filter = ($this->_compress) ? '/Filter /FlateDecode ' : '';
for ($n = 1; $n <= $nb; $n++) {
/* Page */
$this->_newobj();
$this->_out('<</Type /Page');
$this->_out('/Parent 1 0 R');
if (isset($this->_orientation_changes[$n])) {
$this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]', $hPt, $wPt));
}
$this->_out('/Resources 2 0 R');
if (isset($this->_page_links[$n])) {
/* Links */
$annots = '/Annots [';
foreach ($this->_page_links[$n] as $pl) {
$rect = sprintf('%.2f %.2f %.2f %.2f', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]);
$annots .= '<</Type /Annot /Subtype /Link /Rect [' . $rect . '] /Border [0 0 0] ';
if (is_string($pl[4])) {
$annots .= '/A <</S /URI /URI ' . $this->_textString($pl[4]) . '>>>>';
} else {
$l = $this->_links[$pl[4]];
$height = isset($this->_orientation_changes[$l[0]]) ? $wPt : $hPt;
$annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>', 1 + 2 * $l[0], $height - $l[1] * $this->_scale);
}
}
$this->_out($annots.']');
}
$this->_out('/Contents ' . ($this->_n + 1) . ' 0 R>>');
$this->_out('endobj');
/* Page content */
$p = ($this->_compress) ? gzcompress($this->_pages[$n]) : $this->_pages[$n];
$this->_newobj();
$this->_out('<<' . $filter . '/Length ' . strlen($p) . '>>');
$this->_putStream($p);
$this->_out('endobj');
}
/* Pages root */
$this->_offsets[1] = strlen($this->_buffer);
$this->_out('1 0 obj');
$this->_out('<</Type /Pages');
$kids = '/Kids [';
for ($i = 0; $i < $nb; $i++) {
$kids .= (3 + 2 * $i) . ' 0 R ';
}
$this->_out($kids . ']');
$this->_out('/Count ' . $nb);
$this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]', $wPt, $hPt));
$this->_out('>>');
$this->_out('endobj');
}
 
function _putFonts()
{
$nf = $this->_n;
foreach ($this->_diffs as $diff) {
/* Encodings */
$this->_newobj();
$this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [' . $diff . ']>>');
$this->_out('endobj');
}
$mqr = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
foreach ($this->_font_files as $file => $info) {
/* Font file embedding. */
$this->_newobj();
$this->_font_files[$file]['n'] = $this->_n;
$size = filesize($file);
if (!$size) {
return $this->raiseError('Font file not found.');
}
$this->_out('<</Length ' . $size);
if (substr($file, -2) == '.z') {
$this->_out('/Filter /FlateDecode');
}
$this->_out('/Length1 ' . $info['length1']);
if (isset($info['length2'])) {
$this->_out('/Length2 ' . $info['length2'] . ' /Length3 0');
}
$this->_out('>>');
$f = fopen($file, 'rb');
$this->_putStream(fread($f, $size));
fclose($f);
$this->_out('endobj');
}
set_magic_quotes_runtime($mqr);
foreach ($this->_fonts as $k => $font) {
/* Font objects */
$this->_newobj();
$this->_fonts[$k]['n'] = $this->_n;
$name = $font['name'];
$this->_out('<</Type /Font');
$this->_out('/BaseFont /' . $name);
if ($font['type'] == 'core') {
/* Standard font. */
$this->_out('/Subtype /Type1');
if ($name != 'Symbol' && $name != 'ZapfDingbats') {
$this->_out('/Encoding /WinAnsiEncoding');
}
} else {
/* Additional font. */
$this->_out('/Subtype /' . $font['type']);
$this->_out('/FirstChar 32');
$this->_out('/LastChar 255');
$this->_out('/Widths ' . ($this->_n + 1) . ' 0 R');
$this->_out('/FontDescriptor ' . ($this->_n + 2) . ' 0 R');
if ($font['enc']) {
if (isset($font['diff'])) {
$this->_out('/Encoding ' . ($nf + $font['diff']).' 0 R');
} else {
$this->_out('/Encoding /WinAnsiEncoding');
}
}
}
$this->_out('>>');
$this->_out('endobj');
if ($font['type'] != 'core') {
/* Widths. */
$this->_newobj();
$cw = &$font['cw'];
$s = '[';
for ($i = 32; $i <= 255; $i++) {
$s .= $cw[chr($i)] . ' ';
}
$this->_out($s . ']');
$this->_out('endobj');
/* Descriptor. */
$this->_newobj();
$s = '<</Type /FontDescriptor /FontName /' . $name;
foreach ($font['desc'] as $k => $v) {
$s .= ' /' . $k . ' ' . $v;
}
$file = $font['file'];
if ($file) {
$s .= ' /FontFile' . ($font['type'] == 'Type1' ? '' : '2') . ' ' . $this->_font_files[$file]['n'] . ' 0 R';
}
$this->_out($s . '>>');
$this->_out('endobj');
}
}
}
 
function _putImages()
{
$filter = ($this->_compress) ? '/Filter /FlateDecode ' : '';
foreach ($this->_images as $file => $info) {
$this->_newobj();
$this->_images[$file]['n'] = $this->_n;
$this->_out('<</Type /XObject');
$this->_out('/Subtype /Image');
$this->_out('/Width ' . $info['w']);
$this->_out('/Height ' . $info['h']);
if ($info['cs'] == 'Indexed') {
$this->_out('/ColorSpace [/Indexed /DeviceRGB ' . (strlen($info['pal'])/3 - 1) . ' ' . ($this->_n + 1).' 0 R]');
} else {
$this->_out('/ColorSpace /' . $info['cs']);
if ($info['cs'] == 'DeviceCMYK') {
$this->_out('/Decode [1 0 1 0 1 0 1 0]');
}
}
$this->_out('/BitsPerComponent ' . $info['bpc']);
$this->_out('/Filter /' . $info['f']);
if (isset($info['parms'])) {
$this->_out($info['parms']);
}
if (isset($info['trns']) && is_array($info['trns'])) {
$trns = '';
$i_max = count($info['trns']);
for ($i = 0; $i < $i_max; $i++) {
$trns .= $info['trns'][$i] . ' ' . $info['trns'][$i].' ';
}
$this->_out('/Mask [' . $trns . ']');
}
$this->_out('/Length ' . strlen($info['data']) . '>>');
$this->_putStream($info['data']);
$this->_out('endobj');
 
/* Palette. */
if ($info['cs'] == 'Indexed') {
$this->_newobj();
$pal = ($this->_compress) ? gzcompress($info['pal']) : $info['pal'];
$this->_out('<<' . $filter . '/Length ' . strlen($pal) . '>>');
$this->_putStream($pal);
$this->_out('endobj');
}
}
}
 
function _putResources()
{
$this->_putFonts();
$this->_putImages();
/* Resource dictionary */
$this->_offsets[2] = strlen($this->_buffer);
$this->_out('2 0 obj');
$this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
$this->_out('/Font <<');
foreach ($this->_fonts as $font) {
$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
}
$this->_out('>>');
if (count($this->_images)) {
$this->_out('/XObject <<');
foreach ($this->_images as $image) {
$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
}
$this->_out('>>');
}
$this->_out('>>');
$this->_out('endobj');
}
 
function _putInfo()
{
$this->_out('/Producer ' . $this->_textString('Horde PDF'));
if (!empty($this->_info['title'])) {
$this->_out('/Title ' . $this->_textString($this->_info['title']));
}
if (!empty($this->_info['subject'])) {
$this->_out('/Subject ' . $this->_textString($this->_info['subject']));
}
if (!empty($this->_info['author'])) {
$this->_out('/Author ' . $this->_textString($this->_info['author']));
}
if (!empty($this->keywords)) {
$this->_out('/Keywords ' . $this->_textString($this->keywords));
}
if (!empty($this->creator)) {
$this->_out('/Creator ' . $this->_textString($this->creator));
}
$this->_out('/CreationDate ' . $this->_textString('D:' . date('YmdHis')));
}
 
function _putCatalog()
{
$this->_out('/Type /Catalog');
$this->_out('/Pages 1 0 R');
if ($this->_zoom_mode == 'fullpage') {
$this->_out('/OpenAction [3 0 R /Fit]');
} elseif ($this->_zoom_mode == 'fullwidth') {
$this->_out('/OpenAction [3 0 R /FitH null]');
} elseif ($this->_zoom_mode == 'real') {
$this->_out('/OpenAction [3 0 R /XYZ null null 1]');
} elseif (!is_string($this->_zoom_mode)) {
$this->_out('/OpenAction [3 0 R /XYZ null null ' . ($this->_zoom_mode / 100).']');
}
if ($this->_layout_mode == 'single') {
$this->_out('/PageLayout /SinglePage');
} elseif ($this->_layout_mode == 'continuous') {
$this->_out('/PageLayout /OneColumn');
} elseif ($this->_layout_mode == 'two') {
$this->_out('/PageLayout /TwoColumnLeft');
}
}
 
function _putTrailer()
{
$this->_out('/Size ' . ($this->_n + 1));
$this->_out('/Root ' . $this->_n . ' 0 R');
$this->_out('/Info ' . ($this->_n - 1) . ' 0 R');
}
 
function _endDoc()
{
$this->_putPages();
$this->_putResources();
/* Info */
$this->_newobj();
$this->_out('<<');
$this->_putInfo();
$this->_out('>>');
$this->_out('endobj');
/* Catalog */
$this->_newobj();
$this->_out('<<');
$this->_putCatalog();
$this->_out('>>');
$this->_out('endobj');
/* Cross-ref */
$o = strlen($this->_buffer);
$this->_out('xref');
$this->_out('0 ' . ($this->_n + 1));
$this->_out('0000000000 65535 f ');
for ($i = 1; $i <= $this->_n; $i++) {
$this->_out(sprintf('%010d 00000 n ', $this->_offsets[$i]));
}
/* Trailer */
$this->_out('trailer');
$this->_out('<<');
$this->_putTrailer();
$this->_out('>>');
$this->_out('startxref');
$this->_out($o);
$this->_out('%%EOF');
$this->_state = 3;
}
 
function _beginPage($orientation)
{
$this->_page++;
$this->_pages[$this->_page] = '';
$this->_state = 2;
$this->x = $this->_left_margin;
$this->y = $this->_top_margin;
$this->_last_height = 0;
/* Page orientation */
if (!$orientation) {
$orientation = $this->_default_orientation;
} else {
$orientation = strtoupper($orientation[0]);
if ($orientation != $this->_default_orientation) {
$this->_orientation_changes[$this->_page] = true;
}
}
if ($orientation != $this->_current_orientation) {
/* Change orientation */
if ($orientation == 'P') {
$this->wPt = $this->fwPt;
$this->hPt = $this->fhPt;
$this->w = $this->fw;
$this->h = $this->fh;
} else {
$this->wPt = $this->fhPt;
$this->hPt = $this->fwPt;
$this->w = $this->fh;
$this->h = $this->fw;
}
$this->_page_break_trigger = $this->h - $this->_break_margin;
$this->_current_orientation = $orientation;
}
}
 
function _endPage()
{
/* End of page contents */
$this->_state = 1;
}
 
function _newobj()
{
/* Begin a new object */
$this->_n++;
$this->_offsets[$this->_n] = strlen($this->_buffer);
$this->_out($this->_n . ' 0 obj');
}
 
function _doUnderline($x, $y, $text)
{
/* Set the rectangle width according to text width. */
$width = $this->getStringWidth($text, true);
 
/* Set rectangle position and height, using underline position and
* thickness settings scaled by the font size. */
$y = $y + ($this->_current_font['up'] * $this->_font_size_pt / 1000);
$height = -$this->_current_font['ut'] * $this->_font_size_pt / 1000;
 
return sprintf('%.2f %.2f %.2f %.2f re f', $x, $y, $width, $height);
}
 
function _parseJPG($file)
{
/* Extract info from a JPEG file. */
$img = @getimagesize($file);
if (!$img) {
return $this->raiseError(sprintf('Missing or incorrect image file: %s', $file));
}
if ($img[2] != 2) {
return $this->raiseError(sprintf('Not a JPEG file: %s', $file));
}
if (!isset($img['channels']) || $img['channels'] == 3) {
$colspace = 'DeviceRGB';
} elseif ($img['channels'] == 4) {
$colspace = 'DeviceCMYK';
} else {
$colspace = 'DeviceGray';
}
$bpc = isset($img['bits']) ? $img['bits'] : 8;
 
/* Read whole file. */
$f = fopen($file, 'rb');
$data = fread($f, filesize($file));
fclose($f);
 
return array('w' => $img[0], 'h' => $img[1], 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data);
}
 
function _parsePNG($file)
{
/* Extract info from a PNG file. */
$f = fopen($file, 'rb');
if (!$f) {
return $this->raiseError(sprintf('Unable to open image file: %s', $file));
}
 
/* Check signature. */
if (fread($f, 8) != chr(137) . 'PNG' . chr(13) . chr(10) . chr(26) . chr(10)) {
return $this->raiseError(sprintf('Not a PNG file: %s', $file));
}
 
/* Read header chunk. */
fread($f, 4);
if (fread($f, 4) != 'IHDR') {
return $this->raiseError(sprintf('Incorrect PNG file: %s', $file));
}
$width = $this->_freadInt($f);
$height = $this->_freadInt($f);
$bpc = ord(fread($f, 1));
if ($bpc > 8) {
return $this->raiseError(sprintf('16-bit depth not supported: %s', $file));
}
$ct = ord(fread($f, 1));
if ($ct == 0) {
$colspace = 'DeviceGray';
} elseif ($ct == 2) {
$colspace = 'DeviceRGB';
} elseif ($ct == 3) {
$colspace = 'Indexed';
} else {
return $this->raiseError(sprintf('Alpha channel not supported: %s', $file));
}
if (ord(fread($f, 1)) != 0) {
return $this->raiseError(sprintf('Unknown compression method: %s', $file));
}
if (ord(fread($f, 1)) != 0) {
return $this->raiseError(sprintf('Unknown filter method: %s', $file));
}
if (ord(fread($f, 1)) != 0) {
return $this->raiseError(sprintf('Interlacing not supported: %s', $file));
}
fread($f, 4);
$parms = '/DecodeParms <</Predictor 15 /Colors ' . ($ct == 2 ? 3 : 1).' /BitsPerComponent ' . $bpc . ' /Columns ' . $width.'>>';
/* Scan chunks looking for palette, transparency and image data. */
$pal = '';
$trns = '';
$data = '';
do {
$n = $this->_freadInt($f);
$type = fread($f, 4);
if ($type == 'PLTE') {
/* Read palette */
$pal = fread($f, $n);
fread($f, 4);
} elseif ($type == 'tRNS') {
/* Read transparency info */
$t = fread($f, $n);
if ($ct == 0) {
$trns = array(ord(substr($t, 1, 1)));
} elseif ($ct == 2) {
$trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1)));
} else {
$pos = strpos($t, chr(0));
if (is_int($pos)) {
$trns = array($pos);
}
}
fread($f, 4);
} elseif ($type == 'IDAT') {
/* Read image data block */
$data .= fread($f, $n);
fread($f, 4);
} elseif ($type == 'IEND') {
break;
} else {
fread($f, $n + 4);
}
} while ($n);
 
if ($colspace == 'Indexed' && empty($pal)) {
return $this->raiseError(sprintf('Missing palette in: %s', $file));
}
fclose($f);
 
return array('w' => $width, 'h' => $height, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data);
}
 
function _freadInt($f)
{
/* Read a 4-byte integer from file. */
$i = ord(fread($f, 1)) << 24;
$i += ord(fread($f, 1)) << 16;
$i += ord(fread($f, 1)) << 8;
$i += ord(fread($f, 1));
return $i;
}
 
function _textString($s)
{
/* Format a text string */
return '(' . $this->_escape($s) . ')';
}
 
function _escape($s)
{
/* Add \ before \, ( and ) */
return str_replace(array(')','(','\\'),
array('\\)','\\(','\\\\'),
$s);
}
 
function _putStream($s)
{
$this->_out('stream');
$this->_out($s);
$this->_out('endstream');
}
 
function _out($s)
{
/* Add a line to the document. */
if ($this->_state == 2) {
$this->_pages[$this->_page] .= $s . "\n";
} else {
$this->_buffer .= $s . "\n";
}
}
 
}
/tags/v1.1-andromede/jrest/lib/SpreadsheetProductor.php
New file
0,0 → 1,15
<?php
 
 
Class SpreadsheetProductor {
function initSpreadsheet() {
require_once("Spreadsheet/Excel/Writer.php");
}
}
 
 
?>
/tags/v1.1-andromede/jrest/lib/PDFProductor.php
New file
0,0 → 1,14
<?php
 
 
Class PDFProductor {
function initPDF() {
require_once("PDF.php");
}
}
 
 
?>
/tags/v1.1-andromede/jrest/lib/.directory
New file
0,0 → 1,2
[Dolphin]
Timestamp=2010,6,10,16,46,25
/tags/v1.1-andromede/jrest/lib/WdHTMLParser.php
New file
0,0 → 1,144
<?php
/**
*
* @author Olivier Laviale
* @see http://www.weirdog.com/blog/php/un-parser-html-des-plus-leger.html
*
*/
class WdHTMLParser {
private $encoding;
private $matches;
private $escaped;
private $opened = array();
public $malformed;
 
public function parse($html, $namespace=NULL, $encoding='utf-8') {
$this->malformed = false;
$this->encoding = $encoding;
// we take care of escaping comments and processing options. they will not be parsed
// and will end as text nodes
$html = $this->escapeSpecials($html);
// in order to create a tree, we first need to split the HTML using the markups,
// creating a nice flat array of texts and opening and closing markups.
//
// the array can be read as follows :
//
// i+0 => some text
// i+1 => '/' for closing markups, nothing otherwise
// i+2 => the markup it self, without the '<' '>'
//
// note that i+2 might end with a '/' indicating an auto-closing markup
$this->matches = preg_split('#<(/?)' . $namespace . '([^>]*)>#', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
// the flat representation is now ready, we can create our tree
$tree = $this->buildTree();
 
// if comments or processing options where escaped, we can
// safely unescape them now
if ($this->escaped) {
$tree = $this->unescapeSpecials($tree);
}
return $tree;
}
private function escapeSpecials($html) {
// here we escape comments
$html = preg_replace_callback('#<\!--.+-->#sU', array($this, 'escapeSpecials_callback'), $html);
 
// and processing options
$html = preg_replace_callback('#<\?.+\?>#sU', array($this, 'escapeSpecials_callback'), $html);
return $html;
}
private function escapeSpecials_callback($m) {
$this->escaped = true;
$text = $m[0];
$text = str_replace(array('<', '>'), array("\x01", "\x02"), $text);
return $text;
}
 
private function unescapeSpecials($tree) {
return is_array($tree) ? array_map(array($this, 'unescapeSpecials'), $tree) : str_replace(array("\x01", "\x02"), array('<', '>'), $tree);
}
 
private function buildTree() {
$nodes = array();
$i = 0;
$text = NULL;
while (($value = array_shift($this->matches)) !== NULL) {
switch ($i++ % 3) {
case 0:
// if the trimed value is not empty we preserve the value,
// otherwise we discard it.
if (trim($value)){
$nodes[] = $value;
}
break;
case 1:
$closing = ($value == '/');
break;
case 2:
if (substr($value, -1, 1) == '/') {
// auto closing
$nodes[] = $this->parseMarkup(substr($value, 0, -1));
} else if ($closing) {
// closing markup
$open = array_pop($this->opened);
if ($value != $open) {
$this->error($value, $open);
}
 
return $nodes;
} else {
// this is an open markup with possible children
$node = $this->parseMarkup($value);
// push the markup name into the opened markups
$this->opened[] = $node['name'];
// create the node and parse its children
$node['children'] = $this->buildTree($this->matches);
$nodes[] = $node;
}
break;
}
}
return $nodes;
}
public function parseMarkup($markup) {
// get markup's name
preg_match('#^[^\s]+#', $markup, $matches);
$name = $matches[0];
 
// get markup's arguments
preg_match_all('#\s+([^=]+)\s*=\s*"([^"]+)"#', $markup, $matches, PREG_SET_ORDER);
// transform the matches into a nice key/value array
$args = array();
foreach ($matches as $m) {
// we unescape the html entities of the argument's value
$args[$m[1]] = html_entity_decode($m[2], ENT_QUOTES, $this->encoding);
}
 
return array('name' => $name, 'args' => $args);
}
public function error($markup, $expected) {
$this->malformed = true;
printf('unexpected closing markup "%s", should be "%s"', $markup, $expected);
}
}
 
?>
/tags/v1.1-andromede/jrest/lib/Writer.php
New file
0,0 → 1,104
<?php
/*
* Module written/ported by Xavier Noguer <xnoguer@rezebra.com>
*
* PERL Spreadsheet::WriteExcel module.
*
* The author of the Spreadsheet::WriteExcel module is John McNamara
* <jmcnamara@cpan.org>
*
* I _DO_ maintain this code, and John McNamara has nothing to do with the
* porting of this code to PHP. Any questions directly related to this
* class library should be directed to me.
*
* License Information:
*
* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets
* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
require_once 'PEAR.php';
require_once 'Spreadsheet/Excel/Writer/Workbook.php';
 
/**
* Class for writing Excel Spreadsheets. This class should change COMPLETELY.
*
* @author Xavier Noguer <xnoguer@rezebra.com>
* @category FileFormats
* @package Spreadsheet_Excel_Writer
*/
 
class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook
{
/**
* The constructor. It just creates a Workbook
*
* @param string $filename The optional filename for the Workbook.
* @return Spreadsheet_Excel_Writer_Workbook The Workbook created
*/
function Spreadsheet_Excel_Writer($filename = '')
{
$this->_filename = $filename;
$this->Spreadsheet_Excel_Writer_Workbook($filename);
}
 
/**
* Send HTTP headers for the Excel file.
*
* @param string $filename The filename to use for HTTP headers
* @access public
*/
function send($filename)
{
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: public");
}
 
/**
* Utility function for writing formulas
* Converts a cell's coordinates to the A1 format.
*
* @access public
* @static
* @param integer $row Row for the cell to convert (0-indexed).
* @param integer $col Column for the cell to convert (0-indexed).
* @return string The cell identifier in A1 format
*/
function rowcolToCell($row, $col)
{
if ($col > 255) { //maximum column value exceeded
return new PEAR_Error("Maximum column value exceeded: $col");
}
 
$int = (int)($col / 26);
$frac = $col % 26;
$chr1 = '';
 
if ($int > 0) {
$chr1 = chr(ord('A') + $int - 1);
}
 
$chr2 = chr(ord('A') + $frac);
$row++;
 
return $chr1 . $chr2 . $row;
}
}
?>
/tags/v1.1-andromede/jrest/lib/DB/common.php
New file
0,0 → 1,2040
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Stig Bakken <ssb@php.net> |
// | Tomas V.V.Cox <cox@idecnet.com> |
// | Maintainer: Daniel Convissor <danielc@php.net> |
// +----------------------------------------------------------------------+
//
// $Id$
 
require_once 'PEAR.php';
 
/**
* DB_common is a base class for DB implementations, and must be
* inherited by all such
*
* @package DB
* @version $Id$
* @category Database
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V.Cox <cox@idecnet.com>
*/
class DB_common extends PEAR
{
// {{{ properties
 
/**
* assoc of capabilities for this DB implementation
* $features['limit'] => 'emulate' => emulate with fetch row by number
* 'alter' => alter the query
* false => skip rows
* @var array
*/
var $features = array();
 
/**
* assoc mapping native error codes to DB ones
* @var array
*/
var $errorcode_map = array();
 
/**
* DB type (mysql, oci8, odbc etc.)
* @var string
*/
var $phptype;
 
/**
* @var string
*/
var $prepare_tokens;
 
/**
* @var string
*/
var $prepare_types;
 
/**
* @var string
*/
var $prepared_queries;
 
/**
* @var integer
*/
var $prepare_maxstmt = 0;
 
/**
* @var string
*/
var $last_query = '';
 
/**
* @var integer
*/
var $fetchmode = DB_FETCHMODE_ORDERED;
 
/**
* @var string
*/
var $fetchmode_object_class = 'stdClass';
 
/**
* Run-time configuration options.
*
* The 'optimize' option has been deprecated. Use the 'portability'
* option instead.
*
* @see DB_common::setOption()
* @var array
*/
var $options = array(
'persistent' => false,
'ssl' => false,
'debug' => 0,
'seqname_format' => '%s_seq',
'autofree' => false,
'portability' => DB_PORTABILITY_NONE,
'optimize' => 'performance', // Deprecated. Use 'portability'.
);
 
/**
* DB handle
* @var resource
*/
var $dbh;
 
// }}}
// {{{ toString()
 
/**
* String conversation
*
* @return string
* @access private
*/
function toString()
{
$info = strtolower(get_class($this));
$info .= ': (phptype=' . $this->phptype .
', dbsyntax=' . $this->dbsyntax .
')';
 
if ($this->connection) {
$info .= ' [connected]';
}
 
return $info;
}
 
// }}}
// {{{ constructor
 
/**
* Constructor
*/
function DB_common()
{
$this->PEAR('DB_Error');
}
 
// }}}
// {{{ quoteString()
 
/**
* DEPRECATED: Quotes a string so it can be safely used within string
* delimiters in a query
*
* @return string quoted string
*
* @see DB_common::quoteSmart(), DB_common::escapeSimple()
* @deprecated Deprecated in release 1.2 or lower
* @internal
*/
function quoteString($string)
{
$string = $this->quote($string);
if ($string{0} == "'") {
return substr($string, 1, -1);
}
return $string;
}
 
// }}}
// {{{ quote()
 
/**
* DEPRECATED: Quotes a string so it can be safely used in a query
*
* @param string $string the input string to quote
*
* @return string The NULL string or the string quotes
* in magic_quote_sybase style
*
* @see DB_common::quoteSmart(), DB_common::escapeSimple()
* @deprecated Deprecated in release 1.6.0
* @internal
*/
function quote($string = null)
{
return ($string === null) ? 'NULL' : "'".str_replace("'", "''", $string)."'";
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quote a string so it can be safely used as a table or column name
*
* Delimiting style depends on which database driver is being used.
*
* NOTE: just because you CAN use delimited identifiers doesn't mean
* you SHOULD use them. In general, they end up causing way more
* problems than they solve.
*
* Portability is broken by using the following characters inside
* delimited identifiers:
* + backtick (<kbd>`</kbd>) -- due to MySQL
* + double quote (<kbd>"</kbd>) -- due to Oracle
* + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
*
* Delimited identifiers are known to generally work correctly under
* the following drivers:
* + mssql
* + mysql
* + mysqli
* + oci8
* + odbc(access)
* + odbc(db2)
* + pgsql
* + sqlite
* + sybase
*
* InterBase doesn't seem to be able to use delimited identifiers
* via PHP 4. They work fine under PHP 5.
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @since 1.6.0
* @access public
*/
function quoteIdentifier($str)
{
return '"' . str_replace('"', '""', $str) . '"';
}
 
// }}}
// {{{ quoteSmart()
 
/**
* Format input so it can be safely used in a query
*
* The output depends on the PHP data type of input and the database
* type being used.
*
* @param mixed $in data to be quoted
*
* @return mixed the format of the results depends on the input's
* PHP type:
*
* <ul>
* <li>
* <kbd>input</kbd> -> <samp>returns</samp>
* </li>
* <li>
* <kbd>null</kbd> -> the string <samp>NULL</samp>
* </li>
* <li>
* <kbd>integer</kbd> or <kbd>double</kbd> -> the unquoted number
* </li>
* <li>
* &type.bool; -> output depends on the driver in use
* Most drivers return integers: <samp>1</samp> if
* <kbd>true</kbd> or <samp>0</samp> if
* <kbd>false</kbd>.
* Some return strings: <samp>TRUE</samp> if
* <kbd>true</kbd> or <samp>FALSE</samp> if
* <kbd>false</kbd>.
* Finally one returns strings: <samp>T</samp> if
* <kbd>true</kbd> or <samp>F</samp> if
* <kbd>false</kbd>. Here is a list of each DBMS,
* the values returned and the suggested column type:
* <ul>
* <li>
* <kbd>dbase</kbd> -> <samp>T/F</samp>
* (<kbd>Logical</kbd>)
* </li>
* <li>
* <kbd>fbase</kbd> -> <samp>TRUE/FALSE</samp>
* (<kbd>BOOLEAN</kbd>)
* </li>
* <li>
* <kbd>ibase</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>ifx</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>msql</kbd> -> <samp>1/0</samp>
* (<kbd>INTEGER</kbd>)
* </li>
* <li>
* <kbd>mssql</kbd> -> <samp>1/0</samp>
* (<kbd>BIT</kbd>)
* </li>
* <li>
* <kbd>mysql</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* <li>
* <kbd>mysqli</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* <li>
* <kbd>oci8</kbd> -> <samp>1/0</samp>
* (<kbd>NUMBER(1)</kbd>)
* </li>
* <li>
* <kbd>odbc</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>pgsql</kbd> -> <samp>TRUE/FALSE</samp>
* (<kbd>BOOLEAN</kbd>)
* </li>
* <li>
* <kbd>sqlite</kbd> -> <samp>1/0</samp>
* (<kbd>INTEGER</kbd>)
* </li>
* <li>
* <kbd>sybase</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* </ul>
* [1] Accommodate the lowest common denominator because not all
* versions of have <kbd>BOOLEAN</kbd>.
* </li>
* <li>
* other (including strings and numeric strings) ->
* the data with single quotes escaped by preceeding
* single quotes, backslashes are escaped by preceeding
* backslashes, then the whole string is encapsulated
* between single quotes
* </li>
* </ul>
*
* @since 1.6.0
* @see DB_common::escapeSimple()
* @access public
*/
function quoteSmart($in)
{
if (is_int($in) || is_double($in)) {
return $in;
} elseif (is_bool($in)) {
return $in ? 1 : 0;
} elseif (is_null($in)) {
return 'NULL';
} else {
return "'" . $this->escapeSimple($in) . "'";
}
}
 
// }}}
// {{{ escapeSimple()
 
/**
* Escape a string according to the current DBMS's standards
*
* In SQLite, this makes things safe for inserts/updates, but may
* cause problems when performing text comparisons against columns
* containing binary data. See the
* {@link http://php.net/sqlite_escape_string PHP manual} for more info.
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @since 1.6.0
* @see DB_common::quoteSmart()
* @access public
*/
function escapeSimple($str) {
return str_replace("'", "''", $str);
}
 
// }}}
// {{{ provides()
 
/**
* Tell whether a DB implementation or its backend extension
* supports a given feature
*
* @param array $feature name of the feature (see the DB class doc)
* @return bool whether this DB implementation supports $feature
* @access public
*/
function provides($feature)
{
return $this->features[$feature];
}
 
// }}}
// {{{ errorCode()
 
/**
* Map native error codes to DB's portable ones
*
* Requires that the DB implementation's constructor fills
* in the <var>$errorcode_map</var> property.
*
* @param mixed $nativecode the native error code, as returned by the
* backend database extension (string or integer)
*
* @return int a portable DB error code, or DB_ERROR if this DB
* implementation has no mapping for the given error code.
*
* @access public
*/
function errorCode($nativecode)
{
if (isset($this->errorcode_map[$nativecode])) {
return $this->errorcode_map[$nativecode];
}
// Fall back to DB_ERROR if there was no mapping.
return DB_ERROR;
}
 
// }}}
// {{{ errorMessage()
 
/**
* Map a DB error code to a textual message. This is actually
* just a wrapper for DB::errorMessage()
*
* @param integer $dbcode the DB error code
*
* @return string the corresponding error message, of false
* if the error code was unknown
*
* @access public
*/
function errorMessage($dbcode)
{
return DB::errorMessage($this->errorcode_map[$dbcode]);
}
 
// }}}
// {{{ raiseError()
 
/**
* Communicate an error and invoke error callbacks, etc
*
* Basically a wrapper for PEAR::raiseError without the message string.
*
* @param mixed integer error code, or a PEAR error object (all
* other parameters are ignored if this parameter is
* an object
*
* @param int error mode, see PEAR_Error docs
*
* @param mixed If error mode is PEAR_ERROR_TRIGGER, this is the
* error level (E_USER_NOTICE etc). If error mode is
* PEAR_ERROR_CALLBACK, this is the callback function,
* either as a function name, or as an array of an
* object and method name. For other error modes this
* parameter is ignored.
*
* @param string Extra debug information. Defaults to the last
* query and native error code.
*
* @param mixed Native error code, integer or string depending the
* backend.
*
* @return object a PEAR error object
*
* @access public
* @see PEAR_Error
*/
function &raiseError($code = DB_ERROR, $mode = null, $options = null,
$userinfo = null, $nativecode = null)
{
// The error is yet a DB error object
if (is_object($code)) {
// because we the static PEAR::raiseError, our global
// handler should be used if it is set
if ($mode === null && !empty($this->_default_error_mode)) {
$mode = $this->_default_error_mode;
$options = $this->_default_error_options;
}
$tmp = PEAR::raiseError($code, null, $mode, $options, null, null, true);
return $tmp;
}
 
if ($userinfo === null) {
$userinfo = $this->last_query;
}
 
if ($nativecode) {
$userinfo .= ' [nativecode=' . trim($nativecode) . ']';
}
 
$tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo,
'DB_Error', true);
return $tmp;
}
 
// }}}
// {{{ setFetchMode()
 
/**
* Sets which fetch mode should be used by default on queries
* on this connection
*
* @param integer $fetchmode DB_FETCHMODE_ORDERED or
* DB_FETCHMODE_ASSOC, possibly bit-wise OR'ed with
* DB_FETCHMODE_FLIPPED.
*
* @param string $object_class The class of the object
* to be returned by the fetch methods when
* the DB_FETCHMODE_OBJECT mode is selected.
* If no class is specified by default a cast
* to object from the assoc array row will be done.
* There is also the posibility to use and extend the
* 'DB_row' class.
*
* @see DB_FETCHMODE_ORDERED
* @see DB_FETCHMODE_ASSOC
* @see DB_FETCHMODE_FLIPPED
* @see DB_FETCHMODE_OBJECT
* @see DB_row::DB_row()
* @access public
*/
function setFetchMode($fetchmode, $object_class = 'stdClass')
{
switch ($fetchmode) {
case DB_FETCHMODE_OBJECT:
$this->fetchmode_object_class = $object_class;
case DB_FETCHMODE_ORDERED:
case DB_FETCHMODE_ASSOC:
$this->fetchmode = $fetchmode;
break;
default:
return $this->raiseError('invalid fetchmode mode');
}
}
 
// }}}
// {{{ setOption()
 
/**
* Set run-time configuration options for PEAR DB
*
* Options, their data types, default values and description:
* <ul>
* <li>
* <var>autofree</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />should results be freed automatically when there are no
* more rows?
* </li><li>
* <var>debug</var> <kbd>integer</kbd> = <samp>0</samp>
* <br />debug level
* </li><li>
* <var>persistent</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />should the connection be persistent?
* </li><li>
* <var>portability</var> <kbd>integer</kbd> = <samp>DB_PORTABILITY_NONE</samp>
* <br />portability mode constant (see below)
* </li><li>
* <var>seqname_format</var> <kbd>string</kbd> = <samp>%s_seq</samp>
* <br />the sprintf() format string used on sequence names. This
* format is applied to sequence names passed to
* createSequence(), nextID() and dropSequence().
* </li><li>
* <var>ssl</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />use ssl to connect?
* </li>
* </ul>
*
* -----------------------------------------
*
* PORTABILITY MODES
*
* These modes are bitwised, so they can be combined using <kbd>|</kbd>
* and removed using <kbd>^</kbd>. See the examples section below on how
* to do this.
*
* <samp>DB_PORTABILITY_NONE</samp>
* turn off all portability features
*
* This mode gets automatically turned on if the deprecated
* <var>optimize</var> option gets set to <samp>performance</samp>.
*
*
* <samp>DB_PORTABILITY_LOWERCASE</samp>
* convert names of tables and fields to lower case when using
* <kbd>get*()</kbd>, <kbd>fetch*()</kbd> and <kbd>tableInfo()</kbd>
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + oci8
*
*
* <samp>DB_PORTABILITY_RTRIM</samp>
* right trim the data output by <kbd>get*()</kbd> <kbd>fetch*()</kbd>
*
*
* <samp>DB_PORTABILITY_DELETE_COUNT</samp>
* force reporting the number of rows deleted
*
* Some DBMS's don't count the number of rows deleted when performing
* simple <kbd>DELETE FROM tablename</kbd> queries. This portability
* mode tricks such DBMS's into telling the count by adding
* <samp>WHERE 1=1</samp> to the end of <kbd>DELETE</kbd> queries.
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + fbsql
* + mysql
* + mysqli
* + sqlite
*
*
* <samp>DB_PORTABILITY_NUMROWS</samp>
* enable hack that makes <kbd>numRows()</kbd> work in Oracle
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + oci8
*
*
* <samp>DB_PORTABILITY_ERRORS</samp>
* makes certain error messages in certain drivers compatible
* with those from other DBMS's
*
* + mysql, mysqli: change unique/primary key constraints
* DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT
*
* + odbc(access): MS's ODBC driver reports 'no such field' as code
* 07001, which means 'too few parameters.' When this option is on
* that code gets mapped to DB_ERROR_NOSUCHFIELD.
* DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD
*
*
* <samp>DB_PORTABILITY_NULL_TO_EMPTY</samp>
* convert null values to empty strings in data output by get*() and
* fetch*(). Needed because Oracle considers empty strings to be null,
* while most other DBMS's know the difference between empty and null.
*
*
* <samp>DB_PORTABILITY_ALL</samp>
* turn on all portability features
*
* -----------------------------------------
*
* Example 1. Simple setOption() example
* <code> <?php
* $dbh->setOption('autofree', true);
* ?></code>
*
* Example 2. Portability for lowercasing and trimming
* <code> <?php
* $dbh->setOption('portability',
* DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM);
* ?></code>
*
* Example 3. All portability options except trimming
* <code> <?php
* $dbh->setOption('portability',
* DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM);
* ?></code>
*
* @param string $option option name
* @param mixed $value value for the option
*
* @return int DB_OK on success. DB_Error object on failure.
*
* @see DB_common::$options
*/
function setOption($option, $value)
{
if (isset($this->options[$option])) {
$this->options[$option] = $value;
 
/*
* Backwards compatibility check for the deprecated 'optimize'
* option. Done here in case settings change after connecting.
*/
if ($option == 'optimize') {
if ($value == 'portability') {
switch ($this->phptype) {
case 'oci8':
$this->options['portability'] =
DB_PORTABILITY_LOWERCASE |
DB_PORTABILITY_NUMROWS;
break;
case 'fbsql':
case 'mysql':
case 'mysqli':
case 'sqlite':
$this->options['portability'] =
DB_PORTABILITY_DELETE_COUNT;
break;
}
} else {
$this->options['portability'] = DB_PORTABILITY_NONE;
}
}
 
return DB_OK;
}
return $this->raiseError("unknown option $option");
}
 
// }}}
// {{{ getOption()
 
/**
* Returns the value of an option
*
* @param string $option option name
*
* @return mixed the option value
*/
function getOption($option)
{
if (isset($this->options[$option])) {
return $this->options[$option];
}
return $this->raiseError("unknown option $option");
}
 
// }}}
// {{{ prepare()
 
/**
* Prepares a query for multiple execution with execute()
*
* Creates a query that can be run multiple times. Each time it is run,
* the placeholders, if any, will be replaced by the contents of
* execute()'s $data argument.
*
* Three types of placeholders can be used:
* + <kbd>?</kbd> scalar value (i.e. strings, integers). The system
* will automatically quote and escape the data.
* + <kbd>!</kbd> value is inserted 'as is'
* + <kbd>&</kbd> requires a file name. The file's contents get
* inserted into the query (i.e. saving binary
* data in a db)
*
* Example 1.
* <code> <?php
* $sth = $dbh->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)');
* $data = array(
* "John's text",
* "'it''s good'",
* 'filename.txt'
* );
* $res = $dbh->execute($sth, $data);
* ?></code>
*
* Use backslashes to escape placeholder characters if you don't want
* them to be interpreted as placeholders:
* <pre>
* "UPDATE foo SET col=? WHERE col='over \& under'"
* </pre>
*
* With some database backends, this is emulated.
*
* {@internal ibase and oci8 have their own prepare() methods.}}
*
* @param string $query query to be prepared
*
* @return mixed DB statement resource on success. DB_Error on failure.
*
* @see DB_common::execute()
* @access public
*/
function prepare($query)
{
$tokens = preg_split('/((?<!\\\)[&?!])/', $query, -1,
PREG_SPLIT_DELIM_CAPTURE);
$token = 0;
$types = array();
$newtokens = array();
 
foreach ($tokens as $val) {
switch ($val) {
case '?':
$types[$token++] = DB_PARAM_SCALAR;
break;
case '&':
$types[$token++] = DB_PARAM_OPAQUE;
break;
case '!':
$types[$token++] = DB_PARAM_MISC;
break;
default:
$newtokens[] = preg_replace('/\\\([&?!])/', "\\1", $val);
}
}
 
$this->prepare_tokens[] = &$newtokens;
end($this->prepare_tokens);
 
$k = key($this->prepare_tokens);
$this->prepare_types[$k] = $types;
$this->prepared_queries[$k] = implode(' ', $newtokens);
 
return $k;
}
 
// }}}
// {{{ autoPrepare()
 
/**
* Automaticaly generate an insert or update query and pass it to prepare()
*
* @param string $table name of the table
* @param array $table_fields ordered array containing the fields names
* @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE)
* @param string $where in case of update queries, this string will be put after the sql WHERE statement
* @return resource handle for the query
* @see DB_common::prepare(), DB_common::buildManipSQL()
* @access public
*/
function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, $where = false)
{
$query = $this->buildManipSQL($table, $table_fields, $mode, $where);
return $this->prepare($query);
}
 
// }}}
// {{{ autoExecute()
 
/**
* Automaticaly generate an insert or update query and call prepare()
* and execute() with it
*
* @param string $table name of the table
* @param array $fields_values assoc ($key=>$value) where $key is a field name and $value its value
* @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE)
* @param string $where in case of update queries, this string will be put after the sql WHERE statement
* @return mixed a new DB_Result or a DB_Error when fail
* @see DB_common::autoPrepare(), DB_common::buildManipSQL()
* @access public
*/
function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, $where = false)
{
$sth = $this->autoPrepare($table, array_keys($fields_values), $mode, $where);
$ret =& $this->execute($sth, array_values($fields_values));
$this->freePrepared($sth);
return $ret;
 
}
 
// }}}
// {{{ buildManipSQL()
 
/**
* Make automaticaly an sql query for prepare()
*
* Example : buildManipSQL('table_sql', array('field1', 'field2', 'field3'), DB_AUTOQUERY_INSERT)
* will return the string : INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?)
* NB : - This belongs more to a SQL Builder class, but this is a simple facility
* - Be carefull ! If you don't give a $where param with an UPDATE query, all
* the records of the table will be updated !
*
* @param string $table name of the table
* @param array $table_fields ordered array containing the fields names
* @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE)
* @param string $where in case of update queries, this string will be put after the sql WHERE statement
* @return string sql query for prepare()
* @access public
*/
function buildManipSQL($table, $table_fields, $mode, $where = false)
{
if (count($table_fields) == 0) {
$this->raiseError(DB_ERROR_NEED_MORE_DATA);
}
$first = true;
switch ($mode) {
case DB_AUTOQUERY_INSERT:
$values = '';
$names = '';
foreach ($table_fields as $value) {
if ($first) {
$first = false;
} else {
$names .= ',';
$values .= ',';
}
$names .= $value;
$values .= '?';
}
return "INSERT INTO $table ($names) VALUES ($values)";
case DB_AUTOQUERY_UPDATE:
$set = '';
foreach ($table_fields as $value) {
if ($first) {
$first = false;
} else {
$set .= ',';
}
$set .= "$value = ?";
}
$sql = "UPDATE $table SET $set";
if ($where) {
$sql .= " WHERE $where";
}
return $sql;
default:
$this->raiseError(DB_ERROR_SYNTAX);
}
}
 
// }}}
// {{{ execute()
 
/**
* Executes a DB statement prepared with prepare()
*
* Example 1.
* <code> <?php
* $sth = $dbh->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)');
* $data = array(
* "John's text",
* "'it''s good'",
* 'filename.txt'
* );
* $res =& $dbh->execute($sth, $data);
* ?></code>
*
* @param resource $stmt a DB statement resource returned from prepare()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return object a new DB_Result or a DB_Error when fail
*
* {@internal ibase and oci8 have their own execute() methods.}}
*
* @see DB_common::prepare()
* @access public
*/
function &execute($stmt, $data = array())
{
$realquery = $this->executeEmulateQuery($stmt, $data);
if (DB::isError($realquery)) {
return $realquery;
}
$result = $this->simpleQuery($realquery);
 
if (DB::isError($result) || $result === DB_OK) {
return $result;
} else {
$tmp =& new DB_result($this, $result);
return $tmp;
}
}
 
// }}}
// {{{ executeEmulateQuery()
 
/**
* Emulates the execute statement, when not supported
*
* @param resource $stmt a DB statement resource returned from execute()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a string containing the real query run when emulating
* prepare/execute. A DB error code is returned on failure.
*
* @see DB_common::execute()
* @access private
*/
function executeEmulateQuery($stmt, $data = array())
{
if (!is_array($data)) {
$data = array($data);
}
 
if (count($this->prepare_types[$stmt]) != count($data)) {
$this->last_query = $this->prepared_queries[$stmt];
return $this->raiseError(DB_ERROR_MISMATCH);
}
 
$realquery = $this->prepare_tokens[$stmt][0];
 
$i = 0;
foreach ($data as $value) {
if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) {
$realquery .= $this->quoteSmart($value);
} elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) {
$fp = @fopen($value, 'rb');
if (!$fp) {
return $this->raiseError(DB_ERROR_ACCESS_VIOLATION);
}
$realquery .= $this->quoteSmart(fread($fp, filesize($value)));
fclose($fp);
} else {
$realquery .= $value;
}
 
$realquery .= $this->prepare_tokens[$stmt][++$i];
}
 
return $realquery;
}
 
// }}}
// {{{ executeMultiple()
 
/**
* This function does several execute() calls on the same
* statement handle
*
* $data must be an array indexed numerically
* from 0, one execute call is done for every "row" in the array.
*
* If an error occurs during execute(), executeMultiple() does not
* execute the unfinished rows, but rather returns that error.
*
* @param resource $stmt query handle from prepare()
* @param array $data numeric array containing the
* data to insert into the query
*
* @return mixed DB_OK or DB_Error
*
* @see DB_common::prepare(), DB_common::execute()
* @access public
*/
function executeMultiple($stmt, $data)
{
foreach ($data as $value) {
$res =& $this->execute($stmt, $value);
if (DB::isError($res)) {
return $res;
}
}
return DB_OK;
}
 
// }}}
// {{{ freePrepared()
 
/**
* Free the resource used in a prepared query
*
* @param $stmt The resurce returned by the prepare() function
* @see DB_common::prepare()
*/
function freePrepared($stmt)
{
// Free the internal prepared vars
if (isset($this->prepare_tokens[$stmt])) {
unset($this->prepare_tokens[$stmt]);
unset($this->prepare_types[$stmt]);
unset($this->prepared_queries[$stmt]);
return true;
}
return false;
}
 
// }}}
// {{{ modifyQuery()
 
/**
* This method is used by backends to alter queries for various
* reasons
*
* It is defined here to assure that all implementations
* have this method defined.
*
* @param string $query query to modify
*
* @return the new (modified) query
*
* @access private
*/
function modifyQuery($query) {
return $query;
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* This method is used by backends to alter limited queries
*
* @param string $query query to modify
* @param integer $from the row to start to fetching
* @param integer $count the numbers of rows to fetch
*
* @return the new (modified) query
*
* @access private
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
return $query;
}
 
// }}}
// {{{ query()
 
/**
* Send a query to the database and return any results with a
* DB_result object
*
* The query string can be either a normal statement to be sent directly
* to the server OR if <var>$params</var> are passed the query can have
* placeholders and it will be passed through prepare() and execute().
*
* @param string $query the SQL query or the statement to prepare
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a DB_result object or DB_OK on success, a DB
* error on failure
*
* @see DB_result, DB_common::prepare(), DB_common::execute()
* @access public
*/
function &query($query, $params = array())
{
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$ret =& $this->execute($sth, $params);
$this->freePrepared($sth);
return $ret;
} else {
$result = $this->simpleQuery($query);
if (DB::isError($result) || $result === DB_OK) {
return $result;
} else {
$tmp =& new DB_result($this, $result);
return $tmp;
}
}
}
 
// }}}
// {{{ limitQuery()
 
/**
* Generates a limited query
*
* @param string $query query
* @param integer $from the row to start to fetching
* @param integer $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a DB_Result object, DB_OK or a DB_Error
*
* @access public
*/
function &limitQuery($query, $from, $count, $params = array())
{
$query = $this->modifyLimitQuery($query, $from, $count, $params);
if (DB::isError($query)){
return $query;
}
$result =& $this->query($query, $params);
if (is_a($result, 'DB_result')) {
$result->setOption('limit_from', $from);
$result->setOption('limit_count', $count);
}
return $result;
}
 
// }}}
// {{{ getOne()
 
/**
* Fetch the first column of the first row of data returned from
* a query
*
* Takes care of doing the query and freeing the results when finished.
*
* @param string $query the SQL query
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed the returned value of the query. DB_Error on failure.
*
* @access public
*/
function &getOne($query, $params = array())
{
settype($params, 'array');
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$res =& $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res =& $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$err = $res->fetchInto($row, DB_FETCHMODE_ORDERED);
$res->free();
 
if ($err !== DB_OK) {
return $err;
}
 
return $row[0];
}
 
// }}}
// {{{ getRow()
 
/**
* Fetch the first row of data returned from a query
*
* Takes care of doing the query and freeing the results when finished.
*
* @param string $query the SQL query
* @param array $params array to be used in execution of the statement.
* Quantity of array elements must match quantity
* of placeholders in query. This function does
* NOT support scalars.
* @param int $fetchmode the fetch mode to use
*
* @return array the first row of results as an array indexed from
* 0, or a DB error code.
*
* @access public
*/
function &getRow($query,
$params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT)
{
// compat check, the params and fetchmode parameters used to
// have the opposite order
if (!is_array($params)) {
if (is_array($fetchmode)) {
if ($params === null) {
$tmp = DB_FETCHMODE_DEFAULT;
} else {
$tmp = $params;
}
$params = $fetchmode;
$fetchmode = $tmp;
} elseif ($params !== null) {
$fetchmode = $params;
$params = array();
}
}
 
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$res =& $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res =& $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$err = $res->fetchInto($row, $fetchmode);
 
$res->free();
 
if ($err !== DB_OK) {
return $err;
}
 
return $row;
}
 
// }}}
// {{{ getCol()
 
/**
* Fetch a single column from a result set and return it as an
* indexed array
*
* @param string $query the SQL query
* @param mixed $col which column to return (integer [column number,
* starting at 0] or string [column name])
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return array an indexed array with the data from the first
* row at index 0, or a DB error code
*
* @see DB_common::query()
* @access public
*/
function &getCol($query, $col = 0, $params = array())
{
settype($params, 'array');
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res =& $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res =& $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC;
 
if (!is_array($row = $res->fetchRow($fetchmode))) {
$ret = array();
} else {
if (!array_key_exists($col, $row)) {
$ret =& $this->raiseError(DB_ERROR_NOSUCHFIELD);
} else {
$ret = array($row[$col]);
while (is_array($row = $res->fetchRow($fetchmode))) {
$ret[] = $row[$col];
}
}
}
 
$res->free();
 
if (DB::isError($row)) {
$ret = $row;
}
 
return $ret;
}
 
// }}}
// {{{ getAssoc()
 
/**
* Fetch the entire result set of a query and return it as an
* associative array using the first column as the key
*
* If the result set contains more than two columns, the value
* will be an array of the values from column 2-n. If the result
* set contains only two columns, the returned value will be a
* scalar with the value of the second column (unless forced to an
* array with the $force_array parameter). A DB error code is
* returned on errors. If the result set contains fewer than two
* columns, a DB_ERROR_TRUNCATED error is returned.
*
* For example, if the table "mytable" contains:
*
* <pre>
* ID TEXT DATE
* --------------------------------
* 1 'one' 944679408
* 2 'two' 944679408
* 3 'three' 944679408
* </pre>
*
* Then the call getAssoc('SELECT id,text FROM mytable') returns:
* <pre>
* array(
* '1' => 'one',
* '2' => 'two',
* '3' => 'three',
* )
* </pre>
*
* ...while the call getAssoc('SELECT id,text,date FROM mytable') returns:
* <pre>
* array(
* '1' => array('one', '944679408'),
* '2' => array('two', '944679408'),
* '3' => array('three', '944679408')
* )
* </pre>
*
* If the more than one row occurs with the same value in the
* first column, the last row overwrites all previous ones by
* default. Use the $group parameter if you don't want to
* overwrite like this. Example:
*
* <pre>
* getAssoc('SELECT category,id,name FROM mytable', false, null,
* DB_FETCHMODE_ASSOC, true) returns:
*
* array(
* '1' => array(array('id' => '4', 'name' => 'number four'),
* array('id' => '6', 'name' => 'number six')
* ),
* '9' => array(array('id' => '4', 'name' => 'number four'),
* array('id' => '6', 'name' => 'number six')
* )
* )
* </pre>
*
* Keep in mind that database functions in PHP usually return string
* values for results regardless of the database's internal type.
*
* @param string $query the SQL query
* @param boolean $force_array used only when the query returns
* exactly two columns. If true, the values
* of the returned array will be one-element
* arrays instead of scalars.
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
* @param int $fetchmode the fetch mode to use
* @param boolean $group if true, the values of the returned array
* is wrapped in another array. If the same
* key value (in the first column) repeats
* itself, the values will be appended to
* this array instead of overwriting the
* existing values.
*
* @return array associative array with results from the query.
* DB Error on failure.
*
* @access public
*/
function &getAssoc($query, $force_array = false, $params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT, $group = false)
{
settype($params, 'array');
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res =& $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res =& $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
if ($fetchmode == DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
$cols = $res->numCols();
 
if ($cols < 2) {
$tmp =& $this->raiseError(DB_ERROR_TRUNCATED);
return $tmp;
}
 
$results = array();
 
if ($cols > 2 || $force_array) {
// return array values
// XXX this part can be optimized
if ($fetchmode == DB_FETCHMODE_ASSOC) {
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) {
reset($row);
$key = current($row);
unset($row[key($row)]);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
} elseif ($fetchmode == DB_FETCHMODE_OBJECT) {
while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) {
$arr = get_object_vars($row);
$key = current($arr);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
} else {
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) {
// we shift away the first element to get
// indices running from 0 again
$key = array_shift($row);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
}
if (DB::isError($row)) {
$results = $row;
}
} else {
// return scalar values
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) {
if ($group) {
$results[$row[0]][] = $row[1];
} else {
$results[$row[0]] = $row[1];
}
}
if (DB::isError($row)) {
$results = $row;
}
}
 
$res->free();
 
return $results;
}
 
// }}}
// {{{ getAll()
 
/**
* Fetch all the rows returned from a query
*
* @param string $query the SQL query
* @param array $params array to be used in execution of the statement.
* Quantity of array elements must match quantity
* of placeholders in query. This function does
* NOT support scalars.
* @param int $fetchmode the fetch mode to use
*
* @return array an nested array. DB error on failure.
*
* @access public
*/
function &getAll($query,
$params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT)
{
// compat check, the params and fetchmode parameters used to
// have the opposite order
if (!is_array($params)) {
if (is_array($fetchmode)) {
if ($params === null) {
$tmp = DB_FETCHMODE_DEFAULT;
} else {
$tmp = $params;
}
$params = $fetchmode;
$fetchmode = $tmp;
} elseif ($params !== null) {
$fetchmode = $params;
$params = array();
}
}
 
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res =& $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res =& $this->query($query);
}
 
if (DB::isError($res) || $res === DB_OK) {
return $res;
}
 
$results = array();
while (DB_OK === $res->fetchInto($row, $fetchmode)) {
if ($fetchmode & DB_FETCHMODE_FLIPPED) {
foreach ($row as $key => $val) {
$results[$key][] = $val;
}
} else {
$results[] = $row;
}
}
 
$res->free();
 
if (DB::isError($row)) {
$tmp =& $this->raiseError($row);
return $tmp;
}
return $results;
}
 
// }}}
// {{{ autoCommit()
 
/**
* enable automatic Commit
*
* @param boolean $onoff
* @return mixed DB_Error
*
* @access public
*/
function autoCommit($onoff=false)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ commit()
 
/**
* starts a Commit
*
* @return mixed DB_Error
*
* @access public
*/
function commit()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ rollback()
 
/**
* starts a rollback
*
* @return mixed DB_Error
*
* @access public
*/
function rollback()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ numRows()
 
/**
* Returns the number of rows in a result object
*
* @param object DB_Result the result object to check
*
* @return mixed DB_Error or the number of rows
*
* @access public
*/
function numRows($result)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ affectedRows()
 
/**
* Returns the affected rows of a query
*
* @return mixed DB_Error or number of rows
*
* @access public
*/
function affectedRows()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ errorNative()
 
/**
* Returns an errormessage, provides by the database
*
* @return mixed DB_Error or message
*
* @access public
*/
function errorNative()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ getSequenceName()
 
/**
* Generate the name used inside the database for a sequence
*
* The createSequence() docblock contains notes about storing sequence
* names.
*
* @param string $sqn the sequence's public name
*
* @return string the sequence's name in the backend
*
* @see DB_common::createSequence(), DB_common::dropSequence(),
* DB_common::nextID(), DB_common::setOption()
* @access private
*/
function getSequenceName($sqn)
{
return sprintf($this->getOption('seqname_format'),
preg_replace('/[^a-z0-9_.]/i', '_', $sqn));
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence. DB_Error if problem.
*
* @see DB_common::createSequence(), DB_common::dropSequence(),
* DB_common::getSequenceName()
* @access public
*/
function nextId($seq_name, $ondemand = true)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* The name of a given sequence is determined by passing the string
* provided in the <var>$seq_name</var> argument through PHP's sprintf()
* function using the value from the <var>seqname_format</var> option as
* the sprintf()'s format argument.
*
* <var>seqname_format</var> is set via setOption().
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object is returned if
* problems arise.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_common::nextID()
* @access public
*/
function createSequence($seq_name)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. DB_Error if problems.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_common::nextID()
* @access public
*/
function dropSequence($seq_name)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* The format of the resulting array depends on which <var>$mode</var>
* you select. The sample output below is based on this query:
* <pre>
* SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
* FROM tblFoo
* JOIN tblBar ON tblFoo.fldId = tblBar.fldId
* </pre>
*
* <ul>
* <li>
*
* <kbd>null</kbd> (default)
* <pre>
* [0] => Array (
* [table] => tblFoo
* [name] => fldId
* [type] => int
* [len] => 11
* [flags] => primary_key not_null
* )
* [1] => Array (
* [table] => tblFoo
* [name] => fldPhone
* [type] => string
* [len] => 20
* [flags] =>
* )
* [2] => Array (
* [table] => tblBar
* [name] => fldId
* [type] => int
* [len] => 11
* [flags] => primary_key not_null
* )
* </pre>
*
* </li><li>
*
* <kbd>DB_TABLEINFO_ORDER</kbd>
*
* <p>In addition to the information found in the default output,
* a notation of the number of columns is provided by the
* <samp>num_fields</samp> element while the <samp>order</samp>
* element provides an array with the column names as the keys and
* their location index number (corresponding to the keys in the
* the default output) as the values.</p>
*
* <p>If a result set has identical field names, the last one is
* used.</p>
*
* <pre>
* [num_fields] => 3
* [order] => Array (
* [fldId] => 2
* [fldTrans] => 1
* )
* </pre>
*
* </li><li>
*
* <kbd>DB_TABLEINFO_ORDERTABLE</kbd>
*
* <p>Similar to <kbd>DB_TABLEINFO_ORDER</kbd> but adds more
* dimensions to the array in which the table names are keys and
* the field names are sub-keys. This is helpful for queries that
* join tables which have identical field names.</p>
*
* <pre>
* [num_fields] => 3
* [ordertable] => Array (
* [tblFoo] => Array (
* [fldId] => 0
* [fldPhone] => 1
* )
* [tblBar] => Array (
* [fldId] => 2
* )
* )
* </pre>
*
* </li>
* </ul>
*
* The <samp>flags</samp> element contains a space separated list
* of extra information about the field. This data is inconsistent
* between DBMS's due to the way each DBMS works.
* + <samp>primary_key</samp>
* + <samp>unique_key</samp>
* + <samp>multiple_key</samp>
* + <samp>not_null</samp>
*
* Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp>
* elements if <var>$result</var> is a table name. The following DBMS's
* provide full information from queries:
* + fbsql
* + mysql
*
* If the 'portability' option has <samp>DB_PORTABILITY_LOWERCASE</samp>
* turned on, the names of tables and fields will be lowercased.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode either unused or one of the tableInfo modes:
* <kbd>DB_TABLEINFO_ORDERTABLE</kbd>,
* <kbd>DB_TABLEINFO_ORDER</kbd> or
* <kbd>DB_TABLEINFO_FULL</kbd> (which does both).
* These are bitwise, so the first two can be
* combined using <kbd>|</kbd>.
* @return array an associative array with the information requested.
* If something goes wrong an error object is returned.
*
* @see DB_common::setOption()
* @access public
*/
function tableInfo($result, $mode = null)
{
/*
* If the DB_<driver> class has a tableInfo() method, that one
* overrides this one. But, if the driver doesn't have one,
* this method runs and tells users about that fact.
*/
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ getTables()
 
/**
* @deprecated Deprecated in release 1.2 or lower
*/
function getTables()
{
return $this->getListOf('tables');
}
 
// }}}
// {{{ getListOf()
 
/**
* list internal DB info
* valid values for $type are db dependent,
* often: databases, users, view, functions
*
* @param string $type type of requested info
*
* @return mixed DB_Error or the requested data
*
* @access public
*/
function getListOf($type)
{
$sql = $this->getSpecialQuery($type);
if ($sql === null) { // No support
return $this->raiseError(DB_ERROR_UNSUPPORTED);
} elseif (is_int($sql) || DB::isError($sql)) { // Previous error
return $this->raiseError($sql);
} elseif (is_array($sql)) { // Already the result
return $sql;
}
return $this->getCol($sql); // Launch this query
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Returns the query needed to get some backend info
*
* @param string $type What kind of info you want to retrieve
*
* @return string The SQL query string
*
* @access public
*/
function getSpecialQuery($type)
{
return $this->raiseError(DB_ERROR_UNSUPPORTED);
}
 
// }}}
// {{{ _rtrimArrayValues()
 
/**
* Right trim all strings in an array
*
* @param array $array the array to be trimmed (passed by reference)
* @return void
* @access private
*/
function _rtrimArrayValues(&$array)
{
foreach ($array as $key => $value) {
if (is_string($value)) {
$array[$key] = rtrim($value);
}
}
}
 
// }}}
// {{{ _convertNullArrayValuesToEmpty()
 
/**
* Convert all null values in an array to empty strings
*
* @param array $array the array to be de-nullified (passed by reference)
* @return void
* @access private
*/
function _convertNullArrayValuesToEmpty(&$array)
{
foreach ($array as $key => $value) {
if (is_null($value)) {
$array[$key] = '';
}
}
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/tags/v1.1-andromede/jrest/lib/DB/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,6,10,16,42,30
 
[Settings]
ShowDotFiles=true
/tags/v1.1-andromede/jrest/lib/DB/mysql.php
New file
0,0 → 1,916
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Stig Bakken <ssb@php.net> |
// | Maintainer: Daniel Convissor <danielc@php.net> |
// +----------------------------------------------------------------------+
//
// $Id$
 
 
// XXX legend:
//
// XXX ERRORMSG: The error message from the mysql function should
// be registered here.
//
// TODO/wishlist:
// longReadlen
// binmode
 
 
require_once 'DB/common.php';
 
/**
* Database independent query interface definition for PHP's MySQL
* extension.
*
* This is for MySQL versions 4.0 and below.
*
* @package DB
* @version $Id$
* @category Database
* @author Stig Bakken <ssb@php.net>
*/
class DB_mysql extends DB_common
{
// {{{ properties
 
var $connection;
var $phptype, $dbsyntax;
var $prepare_tokens = array();
var $prepare_types = array();
var $num_rows = array();
var $transaction_opcount = 0;
var $autocommit = true;
var $fetchmode = DB_FETCHMODE_ORDERED; /* Default fetch mode */
var $_db = false;
 
// }}}
// {{{ constructor
 
/**
* DB_mysql constructor.
*
* @access public
*/
function DB_mysql()
{
$this->DB_common();
$this->phptype = 'mysql';
$this->dbsyntax = 'mysql';
$this->features = array(
'prepare' => false,
'pconnect' => true,
'transactions' => true,
'limit' => 'alter'
);
$this->errorcode_map = array(
1004 => DB_ERROR_CANNOT_CREATE,
1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => DB_ERROR_ALREADY_EXISTS,
1008 => DB_ERROR_CANNOT_DROP,
1022 => DB_ERROR_ALREADY_EXISTS,
1046 => DB_ERROR_NODBSELECTED,
1048 => DB_ERROR_CONSTRAINT,
1050 => DB_ERROR_ALREADY_EXISTS,
1051 => DB_ERROR_NOSUCHTABLE,
1054 => DB_ERROR_NOSUCHFIELD,
1062 => DB_ERROR_ALREADY_EXISTS,
1064 => DB_ERROR_SYNTAX,
1100 => DB_ERROR_NOT_LOCKED,
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
1146 => DB_ERROR_NOSUCHTABLE,
1216 => DB_ERROR_CONSTRAINT,
1217 => DB_ERROR_CONSTRAINT,
);
}
 
// }}}
// {{{ connect()
 
/**
* Connect to a database and log in as the specified user.
*
* @param $dsn the data source name (see DB::parseDSN for syntax)
* @param $persistent (optional) whether the connection should
* be persistent
* @access public
* @return int DB_OK on success, a DB error on failure
*/
function connect($dsninfo, $persistent = false)
{
if (!DB::assertExtension('mysql')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
$this->dsn = $dsninfo;
if ($dsninfo['protocol'] && $dsninfo['protocol'] == 'unix') {
$dbhost = ':' . $dsninfo['socket'];
} else {
$dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
if ($dsninfo['port']) {
$dbhost .= ':' . $dsninfo['port'];
}
}
 
$connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
 
if ($dbhost && $dsninfo['username'] && isset($dsninfo['password'])) {
$conn = @$connect_function($dbhost, $dsninfo['username'],
$dsninfo['password']);
} elseif ($dbhost && $dsninfo['username']) {
$conn = @$connect_function($dbhost, $dsninfo['username']);
} elseif ($dbhost) {
$conn = @$connect_function($dbhost);
} else {
$conn = false;
}
if (!$conn) {
if (($err = @mysql_error()) != '') {
return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null,
null, $err);
} elseif (empty($php_errormsg)) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null,
null, $php_errormsg);
}
}
 
if ($dsninfo['database']) {
if (!@mysql_select_db($dsninfo['database'], $conn)) {
switch(mysql_errno($conn)) {
case 1049:
return $this->raiseError(DB_ERROR_NOSUCHDB, null, null,
null, @mysql_error($conn));
case 1044:
return $this->raiseError(DB_ERROR_ACCESS_VIOLATION, null, null,
null, @mysql_error($conn));
default:
return $this->raiseError(DB_ERROR, null, null,
null, @mysql_error($conn));
}
}
// fix to allow calls to different databases in the same script
$this->_db = $dsninfo['database'];
}
 
$this->connection = $conn;
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Log out and disconnect from the database.
*
* @access public
*
* @return bool true on success, false if not connected.
*/
function disconnect()
{
$ret = @mysql_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Send a query to MySQL and return the results as a MySQL resource
* identifier.
*
* @param the SQL query
*
* @access public
*
* @return mixed returns a valid MySQL result for successful SELECT
* queries, DB_OK for other successful queries. A DB error is
* returned on failure.
*/
function simpleQuery($query)
{
$ismanip = DB::isManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @mysql_query('SET AUTOCOMMIT=0', $this->connection);
$result = @mysql_query('BEGIN', $this->connection);
if (!$result) {
return $this->mysqlRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @mysql_query($query, $this->connection);
if (!$result) {
return $this->mysqlRaiseError();
}
if (is_resource($result)) {
$numrows = $this->numrows($result);
if (is_object($numrows)) {
return $numrows;
}
$this->num_rows[(int)$result] = $numrows;
return $result;
}
return DB_OK;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal mysql result pointer to the next available result
*
* This method has not been implemented yet.
*
* @param a valid sql result resource
*
* @access public
*
* @return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Fetch a row and insert the data into an existing array.
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* @param resource $result query result identifier
* @param array $arr (reference) array where data from the row
* should be placed
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch
*
* @return mixed DB_OK on success, null when end of result set is
* reached or on failure
*
* @see DB_result::fetchInto()
* @access private
*/
function fetchInto($result, &$arr, $fetchmode, $rownum=null)
{
if ($rownum !== null) {
if (!@mysql_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @mysql_fetch_array($result, MYSQL_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @mysql_fetch_row($result);
}
if (!$arr) {
// See: http://bugs.php.net/bug.php?id=22328
// for why we can't check errors on fetching
return null;
/*
$errno = @mysql_errno($this->connection);
if (!$errno) {
return null;
}
return $this->mysqlRaiseError($errno);
*/
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
/*
* Even though this DBMS already trims output, we do this because
* a field might have intentional whitespace at the end that
* gets removed by DB_PORTABILITY_RTRIM under another driver.
*/
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Free the internal resources associated with $result.
*
* @param $result MySQL result identifier
*
* @access public
*
* @return bool true on success, false if $result is invalid
*/
function freeResult($result)
{
unset($this->num_rows[(int)$result]);
return @mysql_free_result($result);
}
 
// }}}
// {{{ numCols()
 
/**
* Get the number of columns in a result set.
*
* @param $result MySQL result identifier
*
* @access public
*
* @return int the number of columns per row in $result
*/
function numCols($result)
{
$cols = @mysql_num_fields($result);
 
if (!$cols) {
return $this->mysqlRaiseError();
}
 
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Get the number of rows in a result set.
*
* @param $result MySQL result identifier
*
* @access public
*
* @return int the number of rows in $result
*/
function numRows($result)
{
$rows = @mysql_num_rows($result);
if ($rows === null) {
return $this->mysqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enable/disable automatic commits
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commit the current transaction.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysql_query('COMMIT', $this->connection);
$result = @mysql_query('SET AUTOCOMMIT=1', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Roll back (undo) the current transaction.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysql_query('ROLLBACK', $this->connection);
$result = @mysql_query('SET AUTOCOMMIT=1', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Gets the number of rows affected by the data manipulation
* query. For other queries, this function returns 0.
*
* @return number of rows affected by the last query
*/
function affectedRows()
{
if (DB::isManip($this->last_query)) {
return @mysql_affected_rows($this->connection);
} else {
return 0;
}
}
 
// }}}
// {{{ errorNative()
 
/**
* Get the native error code of the last error (if any) that
* occured on the current connection.
*
* @access public
*
* @return int native MySQL error code
*/
function errorNative()
{
return @mysql_errno($this->connection);
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence. DB_Error if problem.
*
* @internal
* @see DB_common::nextID()
* @access public
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
do {
$repeat = 0;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("UPDATE ${seqname} ".
'SET id=LAST_INSERT_ID(id+1)');
$this->popErrorHandling();
if ($result === DB_OK) {
/** COMMON CASE **/
$id = @mysql_insert_id($this->connection);
if ($id != 0) {
return $id;
}
/** EMPTY SEQ TABLE **/
// Sequence table must be empty for some reason, so fill it and return 1
// Obtain a user-level lock
$result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");
if (DB::isError($result)) {
return $this->raiseError($result);
}
if ($result == 0) {
// Failed to get the lock, bail with a DB_ERROR_NOT_LOCKED error
return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED);
}
 
// add the default value
$result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)");
if (DB::isError($result)) {
return $this->raiseError($result);
}
 
// Release the lock
$result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')");
if (DB::isError($result)) {
return $this->raiseError($result);
}
// We know what the result will be, so no need to try again
return 1;
 
/** ONDEMAND TABLE CREATION **/
} elseif ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE)
{
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
} else {
$repeat = 1;
}
 
/** BACKWARDS COMPAT **/
} elseif (DB::isError($result) &&
$result->getCode() == DB_ERROR_ALREADY_EXISTS)
{
// see _BCsequence() comment
$result = $this->_BCsequence($seqname);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$repeat = 1;
}
} while ($repeat);
 
return $this->raiseError($result);
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object is returned if
* problems arise.
*
* @internal
* @see DB_common::createSequence()
* @access public
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$res = $this->query("CREATE TABLE ${seqname} ".
'(id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'.
' PRIMARY KEY(id))');
if (DB::isError($res)) {
return $res;
}
// insert yields value 1, nextId call will generate ID 2
$res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)");
if (DB::isError($res)) {
return $res;
}
// so reset to zero
return $this->query("UPDATE ${seqname} SET id = 0;");
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. DB_Error if problems.
*
* @internal
* @see DB_common::dropSequence()
* @access public
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ _BCsequence()
 
/**
* Backwards compatibility with old sequence emulation implementation
* (clean up the dupes)
*
* @param string $seqname The sequence name to clean up
* @return mixed DB_Error or true
*/
function _BCsequence($seqname)
{
// Obtain a user-level lock... this will release any previous
// application locks, but unlike LOCK TABLES, it does not abort
// the current transaction and is much less frequently used.
$result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");
if (DB::isError($result)) {
return $result;
}
if ($result == 0) {
// Failed to get the lock, can't do the conversion, bail
// with a DB_ERROR_NOT_LOCKED error
return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED);
}
 
$highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}");
if (DB::isError($highest_id)) {
return $highest_id;
}
// This should kill all rows except the highest
// We should probably do something if $highest_id isn't
// numeric, but I'm at a loss as how to handle that...
$result = $this->query("DELETE FROM ${seqname} WHERE id <> $highest_id");
if (DB::isError($result)) {
return $result;
}
 
// If another thread has been waiting for this lock,
// it will go thru the above procedure, but will have no
// real effect
$result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')");
if (DB::isError($result)) {
return $result;
}
return true;
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quote a string so it can be safely used as a table or column name
*
* Quoting style depends on which database driver is being used.
*
* MySQL can't handle the backtick character (<kbd>`</kbd>) in
* table or column names.
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @since 1.6.0
* @access public
* @internal
*/
function quoteIdentifier($str)
{
return '`' . $str . '`';
}
 
// }}}
// {{{ quote()
 
/**
* @deprecated Deprecated in release 1.6.0
* @internal
*/
function quote($str) {
return $this->quoteSmart($str);
}
 
// }}}
// {{{ escapeSimple()
 
/**
* Escape a string according to the current DBMS's standards
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @internal
*/
function escapeSimple($str) {
if (function_exists('mysql_real_escape_string')) {
return @mysql_real_escape_string($str, $this->connection);
} else {
return @mysql_escape_string($str);
}
}
 
// }}}
// {{{ modifyQuery()
 
function modifyQuery($query)
{
if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) {
// "DELETE FROM table" gives 0 affected rows in MySQL.
// This little hack lets you know how many rows were deleted.
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
$query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
'DELETE FROM \1 WHERE 1=1', $query);
}
}
return $query;
}
 
// }}}
// {{{ modifyLimitQuery()
 
function modifyLimitQuery($query, $from, $count, $params = array())
{
if (DB::isManip($query)) {
return $query . " LIMIT $count";
} else {
return $query . " LIMIT $from, $count";
}
}
 
// }}}
// {{{ mysqlRaiseError()
 
/**
* Gather information about an error, then use that info to create a
* DB error object and finally return that object.
*
* @param integer $errno PEAR error number (usually a DB constant) if
* manually raising an error
* @return object DB error object
* @see DB_common::errorCode()
* @see DB_common::raiseError()
*/
function mysqlRaiseError($errno = null)
{
if ($errno === null) {
if ($this->options['portability'] & DB_PORTABILITY_ERRORS) {
$this->errorcode_map[1022] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL;
$this->errorcode_map[1062] = DB_ERROR_CONSTRAINT;
} else {
// Doing this in case mode changes during runtime.
$this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS;
}
$errno = $this->errorCode(mysql_errno($this->connection));
}
return $this->raiseError($errno, null, null, null,
@mysql_errno($this->connection) . ' ** ' .
@mysql_error($this->connection));
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table
* @param int $mode a valid tableInfo mode
* @return array an associative array with the information requested
* or an error object if something is wrong
* @access public
* @internal
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null) {
if (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} elseif (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @mysql_list_fields($this->dsn['database'],
$result, $this->connection);
$got_string = true;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @mysql_num_fields($id);
 
// made this IF due to performance (one if is faster than $count if's)
if (!$mode) {
for ($i=0; $i<$count; $i++) {
$res[$i]['table'] = $case_func(@mysql_field_table($id, $i));
$res[$i]['name'] = $case_func(@mysql_field_name($id, $i));
$res[$i]['type'] = @mysql_field_type($id, $i);
$res[$i]['len'] = @mysql_field_len($id, $i);
$res[$i]['flags'] = @mysql_field_flags($id, $i);
}
} else { // full
$res['num_fields']= $count;
 
for ($i=0; $i<$count; $i++) {
$res[$i]['table'] = $case_func(@mysql_field_table($id, $i));
$res[$i]['name'] = $case_func(@mysql_field_name($id, $i));
$res[$i]['type'] = @mysql_field_type($id, $i);
$res[$i]['len'] = @mysql_field_len($id, $i);
$res[$i]['flags'] = @mysql_field_flags($id, $i);
 
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@mysql_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Returns the query needed to get some backend info
* @param string $type What kind of info you want to retrieve
* @return string The SQL query string
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SHOW TABLES';
case 'views':
return DB_ERROR_NOT_CAPABLE;
case 'users':
$sql = 'select distinct User from user';
if ($this->dsn['database'] != 'mysql') {
$dsn = $this->dsn;
$dsn['database'] = 'mysql';
if (DB::isError($db = DB::connect($dsn))) {
return $db;
}
$sql = $db->getCol($sql);
$db->disconnect();
// XXX Fixme the mysql driver should take care of this
if (!@mysql_select_db($this->dsn['database'], $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
return $sql;
case 'databases':
return 'SHOW DATABASES';
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/tags/v1.1-andromede/annuaire.php
New file
0,0 → 1,399
<?php
// declare(encoding='UTF-8');
/**
*
* PHP version 5
*
* @category PHP
* @package Framework
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @copyright Tela-Botanica 2009
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id$$
* @link /doc/framework/
*/
 
include_once('initialisation.php');
 
// on récupère les variables d'identification
$identification = Config::get('identification');
$annuaire_controleur = new AnnuaireControleur();
if($identification) {
$id = $annuaire_controleur->obtenirIdParMail('1', $identification);
} else {
$id = false;
}
 
Registre::getInstance()->set('est_admin',false);
Registre::getInstance()->set('identification_id',$id);
Registre::getInstance()->set('identification_mail',$identification);
 
// identification
// TODO : faire mieux (un wrapper pour gérer différents types d'objets)
if(isset($_GET['id_utilisateur'])) {
$GLOBALS['id_utilisateur'] = $_GET['id_utilisateur'];
} else if (isset($_POST['id_utilisateur'])) {
$GLOBALS['id_utilisateur'] = $_POST['id_utilisateur'];
} else {
$GLOBALS['id_utilisateur'] = $id;
}
 
 
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
 
// TODO : rendre cette partie modulable.
if(isset($_GET['id_annuaire'])) {
$id_annuaire = $_GET['id_annuaire'];
} else {
$_GET['id_annuaire'] = Config::get('annuaire_defaut');
}
$methode = '';
 
if (isset($_GET['m'])) {
$methode = $_GET['m'];
//unset($_GET['m']);
} else {
if (isset($_POST['m'])) {
$methode = $_POST['m'];
//unset($_POST['m']);
} else {
// Gestion des paramêtres définis dans Papyrus
if (isset($GLOBALS['_GEN_commun']['info_application']->m)) {
if($methode != 'annuaire_afficher_formulaire_oubli_mdp' && $methode != 'annuaire_oubli_mdp') {
$methode = $GLOBALS['_GEN_commun']['info_application']->m;
}
}
 
// Gestion des paramêtres définis dans Papyrus
if (isset($GLOBALS['_GEN_commun']['info_application']->id_annuaire)) {
$_GET['id_annuaire'] = $GLOBALS['_GEN_commun']['info_application']->id_annuaire;
}
}
}
 
$identification = Config::get('identification');
 
if(!$identification) {
 
switch ($methode) {
case 'annuaire_formulaire_inscription':
$controleur = new AnnuaireControleur();
$id = $_GET['id_annuaire'];
$retour = $controleur->afficherFormulaireInscription($id);
break;
 
case 'annuaire_ajout_inscription':
$valeurs = $_POST;
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterInscriptionTemporaire($valeurs);
break;
 
case 'annuaire_inscription_confirmation':
$identifiant = $_GET['id'];
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterNouvelleInscription($identifiant);
break;
case 'annuaire_afficher_formulaire_oubli_mdp':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireOubliMotDePasse($identifiant_annuaire);
break;
 
case 'annuaire_oubli_mdp':
$identifiant_annuaire = $_GET['id_annuaire'];
$mail = $_POST['mail'];
$controleur = new AnnuaireControleur();
$retour = $controleur->reinitialiserMotDePasse($identifiant_annuaire, $mail);
break;
case 'annuaire_afficher_carte':
$identifiant_annuaire = $_GET['id_annuaire'];
$continent = null;
$pays = null;
$departement = null;
if(isset($_GET['continent'])) {
$continent = $_GET['continent'];
}
if(isset($_GET['pays'])) {
$pays = $_GET['pays'];
}
if(isset($_GET['departement'])) {
$departement = $_GET['departement'];
}
$controleur = new CartoControleur();
$retour = $controleur->cartographier($identifiant_annuaire, $continent, $pays, $departement);
break;
 
default :
$id = $_GET['id_annuaire'];
$controleur = new IdentificationControleur();
$retour = $controleur->afficherFormulaireIdentification($id);
break;
}
 
if (Config::get('sortie_encodage') != Config::get('appli_encodage')) {
$retour = mb_convert_encoding($retour, Config::get('sortie_encodage'),Config::get('appli_encodage'));
}
 
return $retour;
}
 
 
switch ($methode) {
 
case 'annuaire_inscrits':
$controleur = new AnnuaireControleur();
$id = $_GET['id_annuaire'];
 
if(isset($_GET['taille_page'])) {
$taille_page = $_GET['taille_page'];
} else {
$taille_page = 50;
}
 
if(isset($_GET['numero_page'])) {
$numero_page = $_GET['numero_page'];
} else {
$numero_page = 1;
}
$retour = $controleur->afficherFormulaireRecherche($id);
$retour .= $controleur->chargerAnnuaireListeInscrits($id, $numero_page, $taille_page);
break;
case 'annuaire_afficher_page':
$id_annuaire = $_GET['id_annuaire'];
$page = $_GET['page'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherPage($id_annuaire, $GLOBALS['id_utilisateur'], $page);
break;
 
case 'annuaire_fiche_utilisateur_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFicheUtilisateur($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
 
case 'annuaire_fiche_resume_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFicheResumeUtilisateur($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
 
case 'annuaire_fiche_gestion_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->gererInscriptionExterne($identifiant_annuaire,Registre::getInstance()->get('identification_id'));
break;
 
 
case 'annuaire_formulaire_modification_inscription':
$controleur = new AnnuaireControleur();
$id_annuaire = $_GET['id_annuaire'];
$retour = $controleur->afficherFormulaireModificationInscription($id_annuaire, Registre::getInstance()->get('identification_id'));
break;
 
case 'annuaire_modification_inscription':
$controleur = new AnnuaireControleur();
$valeurs = $_POST;
$retour = $controleur->modifierInscription($_POST);
 
break;
 
case 'annuaire_afficher_formulaire_ajout_image':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireUploadImage($identifiant_annuaire,Registre::getInstance()->get('identification_id'), $_GET);
break;
 
case 'annuaire_ajouter_image':
$identifiant_annuaire = $_GET['id_annuaire'];
$GLOBALS['id_utilisateur'] = $_GET['id_utilisateur'];
$infos_images = $_FILES;
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterImageUtilisateur($identifiant_annuaire,Registre::getInstance()->get('identification_id'),$infos_images);
break;
 
 
case 'annuaire_suppression_inscription':
$identifiant_annuaire = $_GET['id_annuaire'];
$id_utilisateur = $_GET['id_utilisateur'];
$controleur = new AnnuaireControleur();
$retour = $controleur->supprimerInscription($identifiant_annuaire,Registre::getInstance()->get('identification_id'));
break;
 
case 'annuaire_formulaire_suppression_inscription':
$identifiant_annuaire = $_GET['id_annuaire'];
$id_utilisateur = $_GET['id_utilisateur'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireSuppressionInscription($identifiant_annuaire,Registre::getInstance()->get('identification_id'));
break;
 
case 'annuaire_afficher_formulaire_recherche':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireRecherche($identifiant_annuaire);
break;
 
case 'annuaire_recherche_inscrit':
$identifiant_annuaire = $_GET['id_annuaire'];
unset($_GET['id_annuaire']);
 
if(isset($_GET['inclusive'])) {
$exclusive = false;
unset($_GET['inclusive']);
} else {
$exclusive = true;
}
 
$criteres = $_GET;
 
$controleur = new AnnuaireControleur();
$retour = $controleur->rechercherInscrit($identifiant_annuaire,$criteres, $exclusive);
break;
 
case 'annuaire_afficher_carte':
$identifiant_annuaire = $_GET['id_annuaire'];
 
$continent = null;
$pays = null;
$departement = null;
 
if(isset($_GET['continent'])) {
$continent = $_GET['continent'];
}
 
if(isset($_GET['pays'])) {
$pays = $_GET['pays'];
}
 
if(isset($_GET['departement'])) {
$departement = $_GET['departement'];
}
 
$controleur = new CartoControleur();
$retour = $controleur->cartographier($identifiant_annuaire, $continent, $pays, $departement);
break;
case 'annuaire_inscrits_carto':
$identifiant_annuaire = $_GET['id_annuaire'];
$criteres = $_GET;
$controleur = new AnnuaireControleur();
$retour = $controleur->rechercherInscritParlocalisation($identifiant_annuaire,$criteres);
break;
 
case 'annuaire_envoyer_message':
 
$id_annuaire = $_GET['id_annuaire'];
$contenu_message = $_GET['contenu_message'];
$sujet_message = $_GET['sujet_message'];
$destinataires = array_keys($_GET['destinataires']);
 
$controleur = new MessageControleur();
$retour = $controleur->envoyerMailDirectOuModere($id_annuaire ,Config::get('identification'), $destinataires, $sujet_message, $contenu_message);
break;
// Fonctions de modération des messages
case 'message_moderation_confirmation':
if(isset($_GET['id'])) {
$id_message = $_GET['id'];
}
$controleur = new MessageControleur();
$retour = $controleur->envoyerMailModere($id_message);
break;
 
case 'message_moderation_suppression':
if(isset($_GET['id'])) {
$id_message = $_GET['id'];
}
$controleur = new MessageControleur();
$retour = $controleur->supprimerMailModere($id_message);
break;
 
case 'inscription_lettre_actualite':
$controleur = new AnnuaireControleur();
$id_annuaire = $_GET['id_annuaire'];
$retour = $controleur->inscriptionLettreActualite($id_annuaire, $GLOBALS['id_utilisateur']);
 
if(isset($_GET['retour'])) {
$retour = $controleur->gererInscriptionExterne($identifiant_annuaire,$GLOBALS['id_utilisateur']);
}
break;
 
case 'desinscription_lettre_actualite':
$controleur = new AnnuaireControleur();
$id_annuaire = $_GET['id_annuaire'];
$retour = $controleur->desinscriptionLettreActualite($id_annuaire, $GLOBALS['id_utilisateur']);
 
if(isset($_GET['retour'])) {
$retour = $controleur->gererInscriptionExterne($identifiant_annuaire,$GLOBALS['id_utilisateur']);
}
break;
 
default:
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFicheUtilisateur(Config::get('annuaire_defaut'),$GLOBALS['id_utilisateur']);
break;
}
 
if (Config::get('sortie_encodage') != Config::get('appli_encodage')) {
$retour = mb_convert_encoding($retour, Config::get('sortie_encodage'),Config::get('appli_encodage'));
}
 
return $retour;
}
 
function afficherContenuTete() {
 
// c'est très moche, il ne faudrait pas faire comme ceci
if(function_exists('GEN_stockerStyleExterne')) {
GEN_stockerStyleExterne('annuaire_papyrus',Config::get('base_url_styles').'squelettes/css/annuaire_complexe.css');
GEN_stockerStyleExterne('annuaire_papyrus_simple',Config::get('base_url_styles').'squelettes/css/annuaire.css');
}
return "";
}
 
function afficherContenuPied() {
return '';
}
 
function afficherContenuNavigation() {
return '';
}
 
function afficherContenuMenu() {
 
// TODO : rendre cette partie modulable.
if(isset($_GET['id_annuaire'])) {
$id_annuaire = $_GET['id_annuaire'];
} else {
$id_annuaire = Config::get('annuaire_defaut');
}
 
$identification = Config::get('identification');
 
if($identification) {
$controleur = new NavigationControleur();
$menu = $controleur->afficherContenuMenu($id_annuaire,false);
} else {
$menu = '';
}
return '';
 
return $menu;
}
 
?>
/tags/v1.1-andromede/modeles/AnnuaireModele.php
New file
0,0 → 1,1162
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des listes
* d'ontologies
*
* PHP Version 5
*
* @package Framework
* @category Class
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id: ListeAdmin.php 128 2009-09-02 12:20:55Z aurelien $$
* @link /doc/framework/
*
*/
class AnnuaireModele extends Modele {
 
private $config = array();
 
/**
* Charge la liste complète des annuaires gérés par l'application
* @return array un tableau contenant des informations sur les annuaires gérés par l'application
*/
public function chargerListeAnnuaire() {
$requete = 'SELECT * '.
'FROM annu_annuaire '.
'ORDER BY aa_id_annuaire';
$resultat = $this->requeteTous($requete);
$annuaires = array();
foreach ($resultat as $ligne) {
$annuaires[] = $ligne;
}
return $annuaires;
}
public function migrer() {
$requete = 'SELECT * FROM tela_prod.annuaire_tela';
$resultat = $this->requeteTous($requete);
foreach ($resultat as $ligne) {
$annuaires[] = $ligne['U_ID'];
}
return $annuaires;
}
 
/**
* Charge la liste complète des champs d'un annuaire
* @param int $identifiant l'identifiant de l'annuaire demandé
* @param boolean $charger_liste_champs indique si l'on doit ou non charger la liste des noms des champs
* @return array un tableau contenant des objets d'informations sur les annuaires
*/
public function chargerAnnuaire($identifiant, $charger_liste_champs = true) {
 
$requete = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$identifiant.' ';
$resultat = $this->requeteTous($requete);
$annuaire = array();
foreach ($resultat as $ligne) {
$annuaire['informations'] = $ligne;
}
 
if($charger_liste_champs) {
$requete = 'DESCRIBE '.$annuaire['informations']['aa_bdd'].'.'.$annuaire['informations']['aa_table'];
$resultat = $this->requeteTous($requete);
foreach ($resultat as $colonne) {
$annuaire['colonnes'][] = $colonne;
}
}
 
return $annuaire;
}
 
/**
* Charge les champs de mappage d'un annuaire, c'est à dire les champs de metadonnées qui correspondent à un champ
* déjà présent dans la table mappée
* @param int $id_annuaire l'identifiant de l'annuaire
* @return array un tableau contenant les noms de champs mappés et les ids des champs métadonnées correspondants
*/
public function obtenirChampsMappageAnnuaire($id_annuaire) {
 
$tableau_mappage = array();
 
$requete_champs_mappage = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire).' '.
"AND at_action IN ('champ_id', 'champ_mail', 'champ_nom', 'champ_prenom', 'champ_pass', 'champ_lettre','champ_pays', 'champ_code_postal', 'champ_ville', 'champ_adresse', 'champ_adresse_comp', 'champ_date_inscription')";
 
$resultat_champs_mappage = $this->requeteTous($requete_champs_mappage);
 
$tableau_mappage = array();
 
if(!$resultat_champs_mappage) {
trigger_error('impossible de récupérer les champs de mappage de l\'annuaire '.$id_annuaire);
}
 
foreach ($resultat_champs_mappage as $champ) {
$tableau_mappage[0][$champ['at_action']] = $champ['at_ressource'];
$tableau_mappage[1][$champ['at_action']] = $champ['at_valeur'];
}
 
// TODO faire une interface de gestion des champs de mappage
 
return $tableau_mappage ;
}
 
/**
* Charge les champs obligatoire d'un annuaire, c'est à dire les champs qui doivent être présents et remplis dans le
* formulaire
* @param int $id_annuaire l'identifiant de l'annuaire
* @return un tableau contenant les ids des champs obligatoire
*/
public function obtenirChampsObligatoires($id_annuaire) {
 
$tableau_mappage = array();
 
$requete_champs_obligatoire = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire).' '.
"AND at_action = 'champ_obligatoire'";
 
$resultat_champs_obligatoire = $this->requeteTous($requete_champs_obligatoire);
 
$tableau_mappage = array();
 
if(!$resultat_champs_obligatoire) {
return $tableau_mappage;
}
 
foreach ($resultat_champs_obligatoire as $champ) {
// le tableau des champs obligatoires se présente sous la forme nom_champ_metadonnee => nom_champ_annuaire
$tableau_obligatoire[$champ['at_valeur']] = $champ['at_ressource'];
}
 
// TODO faire une interface de gestion des champs obligatoires
return $tableau_obligatoire ;
}
 
/**
* Charge les champs de cartographie d'un annuaire, c'est à dire les champs utilisées pour générer la carte des inscrits
* @param int $id_annuaire l'identifiant de l'annuaire
* @return array un tableau contenant les identifiants ou les noms des champs cartographiques
*/
public function obtenirChampsCartographie($id_annuaire) {
 
// TODO rendre les noms de champs plus générique
$requete_champs_carto = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire).' '.
"AND at_action IN ('champ_pays', 'champ_code_postal')";
 
$resultat_champs_carto = $this->requeteTous($requete_champs_carto);
 
$tableau_carto = array();
 
if(!$resultat_champs_carto) {
trigger_error('impossible de récupérer les champs cartographiques de l\'annuaire '.$id_annuaire);
}
 
foreach ($resultat_champs_carto as $champ) {
// le tableau des champs carto se présente sous la forme type de champ => [0] nom_champ_annuaire [1] nomù champ metadonnées
$tableau_carto[$champ['at_action']][0] = $champ['at_ressource'];
$tableau_carto[$champ['at_action']][1] = $champ['at_valeur'];
}
 
// TODO faire une interface de gestion des champs de mappage
return $tableau_carto ;
}
 
/**
* Renvoie l'identifiant du champ associé à l'image de profil (Avatar) dans un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @return string l'identifiant du champ avatar dans l'annuaire donné ou false s'il n'en existe pas
*/
public function obtenirChampAvatar($id_annuaire) {
 
$requete_champs_avatar = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire).' '.
"AND at_action = 'champ_avatar'";
 
$resultat_champs_avatar = $this->requeteUn($requete_champs_avatar);
 
$champ_avatar = false;
 
if(!$resultat_champs_avatar) {
trigger_error('impossible de récupérer le champ avatar de l\'annuaire '.$id_annuaire);
}
 
$champ_avatar = $resultat_champs_avatar['at_valeur'];
 
// TODO faire une interface de gestion des champs de mappage
return $champ_avatar ;
}
 
/** Renvoie l'identifiant du champ associé à l'image de profil (Avatar) dans un annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @return string l'identifiant du champ date inscription dans l'annuaire donné ou false s'il n'en existe pas
*/
public function obtenirChampDateEtValidite($id_annuaire) {
 
$requete_champs_date_validite = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire).' '.
"AND at_action IN ('champ_date_inscription', 'champ_date_desinscription', 'champ_validite_inscription')";
 
$resultat_champs_date_validite = $this->requeteTous($requete_champs_date_validite);
 
$champs_date_validite = array();
foreach ($resultat_champs_date_validite as $champ) {
$resultat_champs_date_validite[$champ['at_action']] = $champ['at_ressource'];
}
 
// TODO faire une interface de gestion des champs de mappage
return $resultat_champs_date_validite ;
}
 
/**
* Charge tous les champs de description de l'annuaire
* @param int $id_annuaire l'identifiant de l'annuaire
* @return array un tableau contenant les noms de champs mappés et les ids des champs métadonnées correspondants
*/
public function obtenirChampsDescriptionAnnuaire($id_annuaire) {
 
$tableau_mappage = array();
 
$requete_champs_mappage = 'SELECT * FROM annu_triples WHERE at_ce_annuaire = '.$this->proteger($id_annuaire);
 
$resultat_champs_mappage = $this->requeteTous($requete_champs_mappage);
 
$tableau_mappage = array();
 
if(!$resultat_champs_mappage) {
trigger_error('impossible de récupérer les champs décrivant l\'annuaire '.$id_annuaire);
}
 
foreach ($resultat_champs_mappage as $champ) {
$tableau_mappage[0][$champ['at_action']] = $champ['at_ressource'];
$tableau_mappage[1][$champ['at_action']] = $champ['at_valeur'];
}
 
// TODO faire une interface de gestion des champs de mappage
 
return $tableau_mappage ;
}
 
/** Charge le nombre d'inscrits d'une table annuaire mappée en les groupant par départements
* @param int $identifiant l'identifiant de l'annuaire mappé
* @return array un tableau indexé par les numéros de departement contenant le nombre d'inscrits à chacun
*
*/
public function chargerNombreAnnuaireListeInscritsParDepartement($identifiant) {
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$identifiant.' ';
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer les informations de la table '.$identifiant);
}
 
$tableau_mappage = $this->obtenirChampsMappageAnnuaire($identifiant);
$champ_code_postal = $tableau_mappage[0]['champ_code_postal'];
$champ_pays = $tableau_mappage[0]['champ_pays'];
 
$requete_nombre_inscrits = 'SELECT IF ( SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 2 ) >= 96, '.
' SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 3 ), '.
' SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 2 ) ) AS id, '.
' COUNT(*) AS nbre '.
'FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].' '.
'WHERE '.$champ_pays.' = "FR" '.
'GROUP BY IF ( SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 2 ) >= 96, '.
' SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 3 ), '.
' SUBSTRING( '.$champ_code_postal.' FROM 1 FOR 2 ) ) '.
'ORDER BY id ASC ';
 
// Récupération des résultats
try {
$donnees = $this->requeteTous($requete_nombre_inscrits);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
foreach ($donnees as $donnee) {
$resultat_nombre_inscrits[$donnee['id']] = $donnee['nbre'];
}
}
} catch (Exception $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer le nombre d\'inscrits de la table '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table']);
}
 
return $resultat_nombre_inscrits;
}
 
/** Charge le nombre d'inscrits d'une table annuaire mappée en les groupant par pays
* @param int $identifiant l'identifiant de l'annuaire mappé
* @param array $id_recherchees un tableau contenant les codes de pays à rechercher
* @return array un tableau indexé par les numéros de departement contenant le nombre d'inscrits à chacun
*
*/
public function chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $ids_recherchees) {
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer les informations de la table '.$id_annuaire);
}
 
$tableau_mappage = $this->obtenirChampsCartographie($id_annuaire);
$champ_pays = $tableau_mappage['champ_pays'][0];
 
$ids_recherchees = array_map('strtoupper', $ids_recherchees);
 
$resultat_nombre_inscrits = array();
 
$requete_nombre_inscrits = 'SELECT '.$champ_pays.', COUNT(*) AS nbre '.
'FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].' '.
' WHERE '.$champ_pays.' IN '.
'('.implode(',',$ids_recherchees).') '.
'GROUP BY '.$champ_pays.' '.
'ORDER BY '.$champ_pays.' ASC ';
 
// Récupération des résultats
try {
$donnees = $this->requeteTous($requete_nombre_inscrits);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
foreach ($donnees as $donnee) {
$resultat_nombre_inscrits[$donnee[$champ_pays]] = $donnee['nbre'];
}
}
} catch (Exception $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer le nombre d\'inscrits de la table '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table']);
}
 
return $resultat_nombre_inscrits;
}
/**
* Recherche selon une valeur d'un champ qui peut être une valeur approximative (avec des %) dans un champ d'annuaire donné
* @param int $id_annuaire l'identifiant de l'annuaire
* @param string $champ_critere le champ qui servira de filtre
* @param string $valeur la valeur à rechercher
* @param boolean $modele indique si l'on veut recherche la valeur exacte ou non
* @return array un tableau contenant la liste des inscrits dans l'annuaire donné, correspondants à ce critère
*/
public function rechercherInscritDansAnnuaireMappeParTableauChamps($id_annuaire, $criteres, $modele = false, $numero_page = 1, $taille_page = 50) {
 
$sep = '';
 
if($modele) {
$sep = '%';
}
foreach($criteres as $champ => $valeur) {
$criteres[$champ] = $valeur.$sep;
}
 
return $this->rechercherInscritDansAnnuaireMappe($id_annuaire, $criteres, array(), true, $numero_page, $taille_page);
}
 
/**
* Charge les inscrits d'une table annuaire mappée, en ne conservant que les champs de mappage indiqués
* @param int $identifiant l'identifiant de l'annuaire mappé
* @param Array $champs_mappage les champs de mappage à retenir
* @param int $numero_page le numéro de la page demandée
* @param int $taille_page la taille de la page demandée
*
*/
public function chargerAnnuaireListeInscrits($id_annuaire, $numero_page = 1, $taille_page = 50) {
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
$requete_nb_inscrits = 'SELECT COUNT( * ) as nb '.' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'];
 
$resultat_nb_inscrits = $this->requeteUn($requete_nb_inscrits);
 
$nb_inscrits = 0;
if($resultat_nb_inscrits) {
$nb_inscrits = $resultat_nb_inscrits['nb'];
}
 
$requete_recherche_inscrits = 'SELECT '.$champs_mappage[0]['champ_id'].' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'];
$requete_recherche_inscrits .= ' LIMIT '.(($numero_page-1)*$taille_page).','.($taille_page);
 
$resultat_recherche_inscrits = $this->requeteTous($requete_recherche_inscrits);
 
if(!$resultat_recherche_inscrits) {
$resultat_recherche_inscrits = array();
}
 
return array('total' => $nb_inscrits, 'resultat' => $resultat_recherche_inscrits) ;
}
 
/**
* Ajoute les valeurs données dans l'annuaire indiqué
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on va travailler
* @param Array $valeurs_mappees un tableau de valeurs à ajouter
* @param string $nom_champs les noms des champs dans lesquels on va ajouter les données
* @return int l'identifiant du nouvel enregistrement
*/
public function ajouterInscriptionDansAnnuaireMappe($id_annuaire, $valeurs_mappees, $nom_champs) {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat = $this->requeteUn($requete_infos_annuaire);
$annuaire = array();
 
//en cas d'erreur on renvoie false
//TODO: lever une exception
if(!$resultat) {
return false;
}
 
$annuaire = $resultat;
 
$champs_date = $this->obtenirChampDateEtValidite($id_annuaire);
 
// si l'on fonctionne sur un modele de type champ inscription valide = 1
// puis valide = 0 lors de la desinscrption sans suppression
// on l'indique
if(isset($champs_date['champ_validite_inscription'])) {
$valeurs_mappees[$champs_date['champ_validite_inscription']] = '1';
}
 
$valeurs_prot = array_map(array($this,'proteger'),$valeurs_mappees);
 
// si on a défini un champ date d'inscription, on l'ajoute à la liste des champs insérer
// avec la valeur NOW
if(isset($champs_date['champ_date_inscription'])) {
$valeurs_mappees[$champs_date['champ_date_inscription']] = 'NOW()';
$valeurs_prot[$champs_date['champ_date_inscription']] = 'NOW()';
}
 
$valeurs = implode(',',$valeurs_prot);
$champs = implode(',',array_keys($valeurs_mappees));
 
$requete_insertion_annuaire = 'INSERT INTO '.$annuaire['aa_bdd'].'.'.$annuaire['aa_table'].' '.
'('.$champs.') '.
'VALUES ('.$valeurs.')';
 
$id_nouvel_enregistrement = false;
 
//Debug::printr($requete_insertion_annuaire);
 
//en cas d'erreur on renvoie false
//TODO: lever une exception
if(!$this->requete($requete_insertion_annuaire)) {
return $id_nouvel_enregistrement;
}
 
// le mail est censé être unique donc on l'utilise pour faire une selection pour retrouver l'enregistrement
// (Les requetes du style SELECT MAX(id)... ne garantissent pas qu'on récupère le bon id
// si une autre insertion a eu lieu entre temps)
// TODO utiliser du PDO pur et utiliser les fonctions last_insert_id générique
$requete_nouvel_id = 'SELECT '.$nom_champs['champ_id'].' '.
'FROM '.$annuaire['aa_bdd'].'.'.$annuaire['aa_table'].' '.
'WHERE '.
$nom_champs['champ_mail'].' = '.$this->proteger($valeurs_mappees[$nom_champs['champ_mail']]);
 
$resultat_nouvel_id = $this->requeteUn($requete_nouvel_id);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_nouvel_id) {
return $id_nouvel_enregistrement;
}
 
$id_nouvel_enregistrement = $resultat_nouvel_id[$nom_champs['champ_id']];
 
return $id_nouvel_enregistrement;
}
 
/**
* Modifie les valeurs données dans l'annuaire indiqué
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on va travailler
* @param int $id_annuaire l'identifiant de l'utilisateur à qui à modifier
* @param Array $valeurs_mappees un tableau de valeurs à modifier
* @param string $nom_champs les noms des champs dans lesquels on va modifier les données
* @return boolean true ou false suivant le succès de l'operation
*/
public function modifierInscriptionDansAnnuaireMappe($id_annuaire, $id_utilisateur, $valeurs_mappees, $champs_mappage) {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat = $this->requeteUn($requete_infos_annuaire);
$annuaire = array();
 
unset($valeurs_mappees[$champs_mappage['champ_id']]);
 
//en cas d'erreur on renvoie false
//TODO: lever une exception
if(!$resultat) {
return false;
}
 
$annuaire = $resultat;
 
$requete_modification_annuaire = 'UPDATE '.$annuaire['aa_bdd'].'.'.$annuaire['aa_table'].' '.
'SET ';
foreach($valeurs_mappees as $cle => $valeur) {
$requete_modification_annuaire .= $cle.' = '.$this->proteger($valeur).', ';
}
 
$requete_modification_annuaire = rtrim($requete_modification_annuaire,', ').' ' ;
 
$requete_modification_annuaire .= 'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur ;
 
//en cas d'erreur on renvoie false
//TODO: lever une exception
if(!$this->requete($requete_modification_annuaire)) {
return false;
} else {
return true;
}
 
}
 
public function obtenirValeurChampAnnuaireMappe($id_annuaire, $id_utilisateur, $champ) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
$id_utilisateur = $this->proteger($id_utilisateur);
 
$requete_selection_valeur = 'SELECT '.$champs_mappage[$champ].' as '.$champ.' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur;
 
$resultat_selection_valeur = $this->requeteUn($requete_selection_valeur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_valeur) {
return false;
} else {
return $resultat_selection_valeur[$champ];
}
}
 
public function modifierValeurChampAnnuaireMappe($id_annuaire, $id_utilisateur, $champ, $valeur) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
$id_utilisateur = $this->proteger($id_utilisateur);
$valeur = $this->proteger($valeur);
 
$requete_modification_valeur = 'UPDATE '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'SET '.$champ.' = '.$valeur.' '.
'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur;
 
 
$resultat_modification_valeur = $this->requeteUn($requete_modification_valeur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
return $resultat_modification_valeur;
}
 
/**
* Renvoie le mail associé à l'identifiant d'un utilisateur dans un annuaire donné
* @param int $id_annuair l'identifiant de l'annuaire
* @param int $id_utilisateur l'identifiant de l'utilisateur
* @return string le mail associé à cet identifiant ou false si l'utilisateur n'existe pas
*/
public function obtenirMailParId($id_annuaire, $id_utilisateur) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
$id_utilisateur = $this->proteger($id_utilisateur);
 
$requete_selection_utilisateur = 'SELECT '.$champs_mappage['champ_mail'].' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur;
 
 
 
//echo $requete_selection_utilisateur;
$resultat_selection_utilisateur = $this->requeteUn($requete_selection_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateur) {
return false;
} else {
return $resultat_selection_utilisateur[$champs_mappage['champ_mail']];
}
 
}
 
/**
* Renvoie les mail associés des identifiants d'utilisateur dans un annuaire donné
* @param int $id_annuair l'identifiant de l'annuaire
* @param array $ids_utilisateurs les identifiants des l'utilisateur
* @return array un tableau contenant les mails associés à ces identifiant ou false si les utilisateurs n'existent pas
*/
public function obtenirMailParTableauId($id_annuaire, $tableau_ids_utilisateurs) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
 
$tableau_ids_utilisateurs_p = array_map(array($this, 'proteger'), $tableau_ids_utilisateurs);
$str_ids_utilisateurs = implode(',',$tableau_ids_utilisateurs_p);
 
$requete_selection_utilisateurs = 'SELECT '.$champs_mappage['champ_mail'].' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_id'].' IN ('.$str_ids_utilisateurs.')';
 
$resultat_selection_utilisateurs = $this->requeteTous($requete_selection_utilisateurs);
 
$resultat_utilisateurs = array();
 
foreach($resultat_selection_utilisateurs as $utilisateur) {
$resultat_utilisateurs[] = $utilisateur[$champs_mappage['champ_mail']];
}
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateurs) {
return false;
} else {
return $resultat_utilisateurs;
}
 
}
 
/**
* Renvoie l'id associé au mail d'un utilisateur dans un annuaire donné
* @param int $id_annuair l'identifiant de l'annuaire
* @param int $mail_utilisateur le mail de l'utilisateur
* @return string l'id associé à ce mail ou false si l'utilisateur n'existe pas
*/
public function obtenirIdParMail($id_annuaire, $mail_utilisateur) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
 
$requete_selection_utilisateur = 'SELECT '.$champs_mappage['champ_id'].' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_mail'].' = '.$this->proteger($mail_utilisateur);
 
 
//echo $requete_selection_utilisateur;
$resultat_selection_utilisateur = $this->requeteUn($requete_selection_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateur) {
return false;
} else {
return $resultat_selection_utilisateur[$champs_mappage['champ_id']];
}
 
}
 
// TODO: commenter
public function comparerIdentifiantMotDePasse($id_annuaire, $id_utilisateur, $mot_de_passe) {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
// on ne garde que les champs de mappage correspondant au champ de l'annuaire principal
$champs_mappage = $champs_mappage[0];
 
$mot_de_passe = $this->proteger($mot_de_passe);
$id_utilisateur = $this->proteger($id_utilisateur);
 
$requete_selection_utilisateur = 'SELECT COUNT(*) as match_login_mdp '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur.' '.
'AND '.$champs_mappage['champ_pass'].' = '.$mot_de_passe;
 
$resultat_selection_utilisateur = $this->requeteUn($requete_selection_utilisateur);
 
// en cas d'erreur ou bien si le login ne matche pas le mot de passe
// on renvoie false
if(!$resultat_selection_utilisateur || $resultat_selection_utilisateur['match_login_mdp'] <= 0) {
return false;
} else {
return true;
}
}
 
/**
* Récupère les champs demandé dans l'annuaire indiqué
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on va travailler
* @param int $id_utilisateur l'identifiant de l'utilisateur dont on veut les informations
* @param Array $champs_mappage les noms des champs que l'on veut récupérer
* @return Array les informations demandées
*/
public function obtenirValeursUtilisateur($id_annuaire, $id_utilisateur, $champs_mappage) {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champs_mappage_str = implode(',',$champs_mappage);
$id_utilisateur = $this->proteger($id_utilisateur);
 
$requete_selection_utilisateur = 'SELECT '.$champs_mappage_str.' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage['champ_id'].' = '.$id_utilisateur;
 
$resultat_selection_utilisateur = $this->requeteUn($requete_selection_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateur) {
return false;
} else {
return $resultat_selection_utilisateur;
}
}
 
/**
* Récupère les valeurs utilisateur dans l'annuaire indiqué en les ordonnant par le champ demandé
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on va travailler
* @param Array $champs_mappage les noms des champs que l'on veut récupérer
* @param string order_by le champ par lequel on ordonne les résultats
* @param limit la limite au nombre de résultats
* @return Array les informations demandées
*/
public function obtenirTableauValeursUtilisateurs($id_annuaire, $champs_mappage, $order_by = 'champ_id', $dir= 'DESC', $limit = '20') {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champ_order_by = $champs_mappage[$order_by];
 
$champs_mappage_str = implode(',',$champs_mappage);
$id_utilisateur = $this->proteger($id_utilisateur);
 
$requete_selection_utilisateur = 'SELECT '.$champs_mappage_str.' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'ORDER BY '.$champ_order_by.' '.$dir.' LIMIT '.$limit;
 
$resultat_selection_utilisateur = $this->requeteTous($requete_selection_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateur) {
return false;
} else {
return $resultat_selection_utilisateur;
}
}
/**
* Récupère les valeurs utilisateur dans l'annuaire indiqué en les ordonnant par le champ demandé
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on va travailler
* @param Array $champs_mappage les noms des champs que l'on veut récupérer
* @param string order_by le champ par lequel on ordonne les résultats
* @param limit la limite au nombre de résultats
* @return Array les informations demandées
*/
public function obtenirTableauIdsUtilisateurs($id_annuaire, $champs_mappage, $order_by = 'champ_id', $dir= 'DESC', $limit = '20') {
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
$champ_order_by = $champs_mappage[$order_by];
 
$requete_selection_utilisateur = 'SELECT '.$champs_mappage['champ_id'].' '.
'FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'ORDER BY '.$champ_order_by.' '.$dir.' LIMIT '.$limit;
$resultat_selection_utilisateur = $this->requeteTous($requete_selection_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_selection_utilisateur) {
return false;
} else {
return $resultat_selection_utilisateur;
}
}
 
/**
* Supprime une inscription dans une table annuaire
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on supprime les données
* @param int $id_utilisateur l'identifiant de l'utilisateur à supprimer
* @return boolean true si la suppression a réussi, false sinon
*/
public function supprimerInscriptionDansAnnuaireMappe($id_annuaire, $id_utilisateur) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$requete_infos_annuaire = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_infos_annuaire = $this->requeteUn($requete_infos_annuaire);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if(!$resultat_infos_annuaire) {
return false;
}
 
//$supprimer_donnes = false;
$valeurs_mappees = array();
 
$champs_date = $this->obtenirChampDateEtValidite($id_annuaire);
 
// si on a défini un champ de validite d'inscription, on ne supprime pas l'enregistrement
// mais on remplace cette valeur par 0
/*if(isset($champs_date['champ_validite_inscription'])) {
$valeurs_mappees[$champs_date['champ_validite_inscription']] = '1';
$supprimer_donnees = true;
}
 
// si on a défini un champ date de desinscription, on met à jour avec la valeur NOW
// avec la valeur NOW
if(isset($champs_date['champ_date_desinscription'])) {
$valeurs_mappees[$champs_date['champ_date_desinscription']] = 'NOW()';
}*/
 
//if($supprimer_donnees) {
$requete_suppression_utilisateur = 'DELETE FROM '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'WHERE '.$champs_mappage[0]['champ_id'].' = '.$this->proteger($id_utilisateur);
 
/*} else {
 
$champs_valeurs = '';
foreach($valeurs_mappees as $cle => $valeur) {
$champs_valeurs .= $cle.' = '.$valeur.', ';
}
 
$requete_suppression_utilisateur = 'UPDATE '.$resultat_infos_annuaire['aa_bdd'].'.'.$resultat_infos_annuaire['aa_table'].' '.
'SET '.$champs_valeurs.' '.
'WHERE '.$champs_mappage[0]['champ_id'].' = '.$this->proteger($id_utilisateur);
}*/
 
$resultat_suppression_utilisateur = $this->requeteUn($requete_suppression_utilisateur);
 
// en cas d'erreur on renvoie false
// TODO: lever une exception
if($this->utilisateurExisteParId($id_annuaire, $id_utilisateur, $champs_mappage)) {
return false;
}
 
return true;
}
 
/**
* Renvoie vrai si un utilisateur existe suivant un id donné
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on supprime les données
* @param int $id_utilisateur l'identifiant de l'utilisateur à supprimer
* @return boolean true si l'utilisateur existe, false sinon
*/
public function utilisateurExisteParId($id_annuaire, $id_utilisateur) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer les informations de la table '.$id_annuaire);
}
 
$requete_nombre_inscrits = 'SELECT COUNT(*) AS est_inscrit'.
' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].
' WHERE '.$champs_mappage[0]['champ_id'].' = '.$this->proteger($id_utilisateur);
 
$resultat_nombre_inscrits = $this->requeteUn($requete_nombre_inscrits);
 
if(!$resultat_nombre_inscrits) {
trigger_error('impossible de vérifier l\'existence de cet utilisateur ');
}
 
return ($resultat_nombre_inscrits['est_inscrit'] > 0) ;
 
}
 
/** Renvoie vrai si un utilisateur existe suivant un mail donné
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel recherche
* @param int $id_utilisateur le mail de l'utilisateur à chercher
* @return boolean true si l'utilisateur existe, false sinon
*/
public function utilisateurExisteParMail($id_annuaire, $mail) {
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
 
if(!$resultat_informations_annuaire) {
trigger_error('impossible de récupérer les informations de la table '.$id_annuaire);
}
 
$requete_nombre_inscrits = 'SELECT COUNT(*) AS est_inscrit '.
' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].
' WHERE '.$champs_mappage[0]['champ_mail'].' = '.$this->proteger($mail);
 
$resultat_nombre_inscrits = $this->requeteUn($requete_nombre_inscrits);
 
if(!$resultat_nombre_inscrits) {
trigger_error('impossible de vérifier l\'existence de cet utilisateur ');
}
 
return ($resultat_nombre_inscrits['est_inscrit'] > 0) ;
 
}
 
/**
* @param int $id_annuaire identifiant de l'annuaire dans lequel on recherche
* @param array $valeurs un tableau de valeurs à rechercher
* @param array $id_a_inclure un tableau d'identifiants à inclure (pour chainer des recherches)
* @param boolean $exclusive indique si l'on recherche effectue une recherche exclusive ou inclusive (AND, ou OR)
*/
public function rechercherInscritDansAnnuaireMappe($id_annuaire, $valeurs, $id_a_inclure = array(), $exclusive = true, $numero_page = 1, $taille_page = 50, $ordre = 'champ_nom') {
// Si la fonction est appelée et que tous les critères sont vides
if(count($valeurs) == 0 && count($id_a_inclure) == 0) {
// on sort directement
return array();
}
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
 
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$requete_recherche_inscrits = 'SELECT '.$champs_mappage[0]['champ_id'].
' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].
' WHERE ';
 
$requete_conditions_inscrits = '';
 
if($exclusive) {
$separateur = ' AND ';
} else {
$separateur = ' OR ';
}
 
// on inclut les identifiants déjà trouvé par les critères de métadonnées
if(is_array($id_a_inclure) && count($id_a_inclure) != 0) {
 
$id_inclus = implode(',',$id_a_inclure);
 
$requete_conditions_inscrits .= $champs_mappage[0]['champ_id'].' IN '.
'('.$id_inclus.')'.$separateur ;
}
 
// si le champ contient un % alors on ne cherche pas une valeur exacte : on utilise LIKE
foreach($valeurs as $champ => $valeur) {
if(trim($valeur) != '') {
if($champ == $champs_mappage[0]['champ_nom'] || $champ == $champs_mappage[0]['champ_code_postal']) {
if(strpos($valeur,"%") == false) {
$valeur .= '%';
}
}
if(strpos($valeur,"%") != false) {
$operateur = ' LIKE ';
} else {
$operateur = ' = ';
}
$requete_conditions_inscrits .= $champ.$operateur.$this->proteger($valeur).$separateur;
}
}
 
$requete_conditions_inscrits = rtrim($requete_conditions_inscrits, $separateur);
 
$requete_recherche_inscrits .= $requete_conditions_inscrits;
$requete_nb_inscrits = 'SELECT COUNT( * ) as nb '.' FROM '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'];
 
if(trim($requete_conditions_inscrits) != '') {
$requete_nb_inscrits .= ' WHERE '.$requete_conditions_inscrits;
}
 
$resultat_nb_inscrits = $this->requeteUn($requete_nb_inscrits);
 
$nb_inscrits = 0;
if($resultat_nb_inscrits) {
$nb_inscrits = $resultat_nb_inscrits['nb'];
}
 
$requete_recherche_inscrits .= ' ORDER BY '.$champs_mappage[0]['champ_nom'];
$requete_recherche_inscrits .= ' LIMIT '.(($numero_page-1)*$taille_page).','.($taille_page);
 
$resultat_recherche_inscrits = $this->requeteTous($requete_recherche_inscrits);
 
if(!$resultat_recherche_inscrits) {
$resultat_recherche_inscrits = array();
}
 
return array('total' => $nb_inscrits, 'resultat' => $resultat_recherche_inscrits) ;
}
 
/**
* Reinitialise un mot de passe associé à un mail donné et en renvoie un nouveau,
* généré aléatoirement
* @param int $id_annuaire l'identifiant de l'annuaire
* @param string $mail le mail dont on doit réinitialiser le mot de passe
* @return string le nouveau mot de passe ou false si l'utilisateur n'existe pas
*/
public function reinitialiserMotDePasse($id_annuaire, $mail, $pass) {
 
$nouveau_mdp = $pass;
 
$requete_informations_annuaire = 'SELECT aa_bdd, aa_table '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$id_annuaire.' ';
$resultat_informations_annuaire = $this->requeteUn($requete_informations_annuaire);
 
$champs_mappage = $this->obtenirChampsMappageAnnuaire($id_annuaire);
 
$requete_modification_mdp = 'UPDATE '.$resultat_informations_annuaire['aa_bdd'].'.'.$resultat_informations_annuaire['aa_table'].
' SET '.$champs_mappage[0]['champ_pass'].' = '.$this->proteger($nouveau_mdp).
' WHERE '.$champs_mappage[0]['champ_mail'].' = '.$this->proteger($mail);
 
$resultat_modification_mdp = $this->requete($requete_modification_mdp);
 
if($resultat_modification_mdp) {
return $nouveau_mdp;
}
 
return false;
}
 
}
?>
/tags/v1.1-andromede/modeles/ImageModele.php
New file
0,0 → 1,250
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
Class ImageModele extends Modele {
 
private $extensions = '';
 
public function verifierFormat($nom_fichier) {
 
$extensions = Config::get('extensions_acceptees');
$extensions = explode('|', $extensions);
$extension_fichier = strrchr($nom_fichier, '.');
 
return in_array($extension_fichier, $extensions);
}
 
// traite l'upload d'une fichier et le deplace en le renommant selon un identifiant donne
public function stockerFichier($id_annuaire, $id_utilisateur, $fichier)
{
$droits = 0777;
umask(0);
 
$chemin_sur_serveur = Config::get('base_chemin_images') ;
 
if(!file_exists($chemin_sur_serveur.$id_annuaire.'/')) {
if(mkdir($chemin_sur_serveur.'/'.$id_annuaire, $droits, true)) {
//chmod($chemin_sur_serveur.'/'.$id_annuaire,$droits);
}
else
{
trigger_error('ERROR : probleme durant l\'écriture du dossier des images pour l\'annuaire '.$id_annuaire.' \n'.$chemin_sur_serveur) ;
return false;
}
}
 
$chemin_sur_serveur = $chemin_sur_serveur.$id_annuaire;
 
$taille_max = Config::get('taille_max_images');
 
$id = sprintf('%09s', $id_utilisateur) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S',$droits);
}
else
{
trigger_error('ERROR : probleme durant l\'écriture du dossier s \n') ;
return false;
}
}
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M',$droits);
}
else
{
trigger_error('ERROR : probleme durant l\'écriture du dossier m \n') ;
return false;
}
}
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L',$droits);
}
else
{
trigger_error('ERROR : probleme durant l\'écriture du dossier l \n') ;
return false;
}
}
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
 
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id.".jpg" ;
 
if(move_uploaded_file($fichier['tmp_name'],$chemin_fichier))
{
// on redimensionne
list($width, $height) = getimagesize($chemin_fichier);
 
$small_height = 100;
if($height > $small_height) {
$small_height = 100;
$ratio = $height/$small_height;
$small_width = $width/$ratio;
} else {
$small_height = $height;
$small_width = $width;
}
 
$medium_height = 300;
if($height > $medium_height) {
$ratio = $height/$medium_height;
$medium_width = $width/$ratio;
} else {
$medium_height = $height;
$medium_width = $width;
}
 
// on reechantillonne
$image_p = imagecreatetruecolor($small_width, $small_height);
$image_m = imagecreatetruecolor($medium_width, $medium_height);
$image_l = imagecreatetruecolor($width, $height);
 
$image = imagecreatefromjpeg($chemin_fichier);
 
$ratio_compression = 100 ;
 
if(filesize($chemin_fichier) >= $taille_max) {
$ratio_compression = 85 ;
}
 
if($image == null)
{
trigger_error('Probleme durant la création des images resamplées \n') ;
return false ;
}
 
// et on copie les nouvelles images (pour la galerie et la liste)
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $small_width, $small_height, $width, $height);
imagecopyresampled($image_m, $image, 0, 0, 0, 0, $medium_width, $medium_height, $width, $height);
imagecopyresampled($image_l, $image, 0, 0, 0, 0, $width, $height, $width, $height);
 
imagejpeg($image_p, $chemin_sur_serveur_final.'/S/'.$id.'_S.jpg', 85);
chmod($chemin_sur_serveur_final.'/S/'.$id.'_S.jpg',$droits);
 
imagejpeg($image_m,$chemin_sur_serveur_final.'/M/'.$id.'_M.jpg', 85);
chmod($chemin_sur_serveur_final.'/M/'.$id.'_M.jpg',$droits);
 
imagejpeg($image_l,$chemin_sur_serveur_final.'/L/'.$id.'_L.jpg', $ratio_compression);
chmod($chemin_sur_serveur_final.'/L/'.$id.'_L.jpg',$droits);
 
unlink($chemin_fichier) ;
chmod($chemin_sur_serveur, $droits);
 
return $id_utilisateur;
}
else
{
trigger_error('Probleme durant le déplacement du fichier temporaire \n') ;
return false ;
}
}
 
public static function obtenirEmplacementFichierParId($id_utilisateur, $id_annuaire, $taille = 'M') {
 
$id = sprintf('%09s', $id_utilisateur) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$base_url = Config::get('base_url_images').$id_annuaire;
 
if($taille == 'A') {
$url = array('S' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg',
'M' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg',
'L' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg');
} else {
$url = $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$taille.'/'.$id.'_'.$taille.'.jpg';
}
 
return $url;
}
public static function obtenirUrlFichierParId($id_utilisateur, $id_annuaire, $taille = 'M') {
$id = sprintf('%09s', $id_utilisateur) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$base_url = 'http://'.$_SERVER['SERVER_NAME'].Config::get('base_url_images').$id_annuaire;
 
if($taille == 'A') {
$url = array('S' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg',
'M' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg',
'L' => $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg');
} else {
$url = $base_url.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$taille.'/'.$id.'_'.$taille.'.jpg';
}
 
return $url;
}
 
public function supprimerFichier($id)
{
$chemin_sur_serveur = Config::get('base_chemin_images') ;
 
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$fichier_s = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg' ;
$fichier_m = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M/'.$id.'_M.jpg' ;
$fichier_l = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L/'.$id.'_L.jpg' ;
 
if(file_exists($fichier_s))
{
unlink($fichier_s) ;
} // Si le fichier existe
 
if(file_exists($fichier_m))
{
unlink($fichier_m) ;
} // Si le fichier existe
 
if(file_exists($fichier_l))
{
unlink($fichier_l) ;
} // Si le fichier existe
 
}
}
?>
/tags/v1.1-andromede/modeles/MappageModele.php
New file
0,0 → 1,32
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des listes
* d'ontologies
*
* PHP Version 5
*
* @package Framework
* @category Class
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id: ListeAdmin.php 128 2009-09-02 12:20:55Z aurelien $$
* @link /doc/framework/
*
*/
class MappageModele extends Modele {
 
private $config = array();
 
public function ajouterNouveauMappage($id_annuaire, $nom_champ, $role, $id_metadonnee) {
$requete_insertion = 'INSERT INTO annu_triples (at_ce_annuaire, at_ressource, at_action, at_valeur) '.
'VALUES ('.$this->proteger($id_annuaire).', '.$this->proteger($nom_champ).', '.$this->proteger($role).', '.$this->proteger($id_metadonnee).')';
return $this->requete($requete_insertion);
}
 
}
?>
/tags/v1.1-andromede/modeles/GestionAnnuaireModele.php
New file
0,0 → 1,167
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des listes
* d'ontologies
*
* PHP Version 5
*
* @package Framework
* @category Class
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id: ListeAdmin.php 128 2009-09-02 12:20:55Z aurelien $$
* @link /doc/framework/
*
*/
class GestionAnnuaireModele extends Modele {
public function verifierPresenceTable($bdd, $nom_table) {
if(!$bdd || !$nom_table) {
return false;
}
$requete_presence_table = 'SELECT * FROM information_schema.tables
WHERE TABLE_SCHEMA = '.$this->proteger($bdd).' AND TABLE_NAME = '.$this->proteger($nom_table);
$presence_table = $this->requeteUn($requete_presence_table);
return $presence_table;
}
public function verifierPresenceChamps($bdd, $nom_table, $champs_a_verifier) {
$tableau_champs_table = $this->obtenirListeNomsChampsAnnuaireParBddNomTable($bdd, $nom_table);
 
foreach($champs_a_verifier as $champ) {
if(!in_array($champ, $tableau_champs_table)) {
return false;
}
}
return $resultat;
}
public function obtenirListeNomsChampsAnnuaireParBddNomTable($bdd, $nom_table) {
if(!$bdd || !$nom_table) {
return false;
}
 
$requete = 'DESCRIBE '.$bdd.'.'.$nom_table;
$resultat = $this->requeteTous($requete);
if(!$resultat) {
return false;
}
$tableau_champs_table = array();;
foreach($resultat as $champ_table) {
$tableau_champs_table[] = $champ_table['Field'];
}
return $tableau_champs_table;
}
public function obtenirListeNomsChampsAnnuaireParIdAnnuaire($id_annuaire) {
$requete_selection_bdd_table = 'SELECT aa_bdd, aa_table FROM annu_annuaire '.
' WHERE aa_id_annuaire = '.$this->proteger($id_annuaire);
$resultat_selection_bdd_table = $this->requeteUn($requete_selection_bdd_table);
if(!$resultat_selection_bdd_table) {
return array();
}
return $this->obtenirListeNomsChampsAnnuaireParBddNomTable($resultat_selection_bdd_table['aa_bdd'], $resultat_selection_bdd_table['aa_table']);
}
public function ajouterAnnuaire($informations) {
if(!$informations) {
return false;
}
$valeurs_prot = array_map(array($this,'proteger'),$informations);
$valeurs = implode(',',$valeurs_prot);
$champs = implode(',',array_keys($informations));
 
$requete_insertion_annuaire = 'INSERT INTO annu_annuaire '.
'('.$champs.') '.
'VALUES ('.$valeurs.')';
$resultat_insertion_annuaire = $this->requete($requete_insertion_annuaire);
$id_annuaire = false;
if($resultat_insertion_annuaire) {
$requete_selection_annuaire = 'SELECT aa_id_annuaire FROM annu_annuaire '.
' WHERE aa_code = '.$this->proteger($informations['aa_code']);
$resultat_selection_annuaire = $this->requeteUn($requete_selection_annuaire);
if($resultat_selection_annuaire) {
$id_annuaire = $resultat_selection_annuaire['aa_id_annuaire'];
}
}
return $id_annuaire;
}
public function creerTableAnnuaire($informations_table, $informations_champs) {
$nom_bdd = $informations_table['aa_bdd'];
$nom_table = $informations_table['aa_table'];
$champ_id = $informations_champs['aa_champ_id'];
$champ_nom = $informations_champs['aa_champ_nom'];
$champ_mail = $informations_champs['aa_champ_mail'];
$champ_mot_de_passe = $informations_champs['aa_champ_pass'];
$requete_creation_table = 'CREATE TABLE '.$nom_bdd.'.'.$nom_table.' '.
'('.$champ_id.' INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'.
$champ_nom.' VARCHAR(255) NOT NULL, '.
$champ_mail.' VARCHAR(255) NOT NULL, '.
$champ_mot_de_passe.' VARCHAR(255) NOT NULL)';
return $this->requete($requete_creation_table);
}
/**
* Charge la liste complète des champs d'un annuaire
* @param int $identifiant l'identifiant de l'annuaire demandé
* @param boolean $charger_liste_champs indique si l'on doit ou non charger la liste des noms des champs
* @return array un tableau contenant des objets d'informations sur les annuaires
*/
public function chargerAnnuaire($identifiant, $charger_liste_champs = true) {
 
$requete = 'SELECT * '.
'FROM annu_annuaire '.
'WHERE aa_id_annuaire = '.$identifiant.' ';
$resultat = $this->requeteTous($requete);
$annuaire = array();
foreach ($resultat as $ligne) {
$annuaire['informations'] = $ligne;
}
 
if($charger_liste_champs) {
$requete = 'DESCRIBE '.$annuaire['informations']['aa_bdd'].'.'.$annuaire['informations']['aa_table'];
$resultat = $this->requeteTous($requete);
foreach ($resultat as $colonne) {
$annuaire['colonnes'][] = $colonne;
}
}
 
return $annuaire;
}
}
/tags/v1.1-andromede/modeles/MetadonneeModele.php
New file
0,0 → 1,569
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des listes
* d'ontologies
*
* PHP Version 5
*
* @package Framework
* @category Class
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id: ListeAdmin.php 128 2009-09-02 12:20:55Z aurelien $$
* @link /doc/framework/
*
*/
class MetadonneeModele extends Modele {
 
private $config = array();
// TODO: externaliser l'identifiant de la liste des types depuis le fichier de config
private $id_liste_liste = 0;
private $id_liste_type = 1002;
private $id_liste_champs = 30768;
 
/**
* Charge la liste complète des champs de métadonnées associées à un annuaire en particulier
* return array un tableau contenant des objets d'informations sur les listes
* @return array un tableau d'objets contenant la liste des listes
*/
public function chargerListeMetadonneeAnnuaire($id_annuaire) {
 
$requete = 'SELECT * '.
'FROM annu_meta_colonne '.
'WHERE amc_ce_annuaire = '.$id_annuaire ;
 
$resultat = $this->requeteTous($requete);
$annuaire = array();
foreach ($resultat as $ligne) {
// On remplace l'identifiant du type d'affichage par son nom
$type_affichage = $this->renvoyerCorrespondanceNomId($ligne['amc_ce_type_affichage'], $this->id_liste_champs);
$ligne['amc_ce_nom_type_affichage'] = $type_affichage['amo_nom'];
$ligne['amc_ce_template_affichage'] = $type_affichage['amo_abreviation'];
$annuaire[$ligne['amc_id_champ']] = $ligne;
}
 
return $annuaire;
}
 
/**
* Charge les elements d'une liste d'ontologie donnée
* @param int $id_liste l'identifiant de la liste dont on veut les élements
* @param Array un tableau contenant les élements de la liste
*/
public function chargerInfosListe($id_liste) {
$requete = 'SELECT amo_nom, amo_id_ontologie '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$id_liste.' '.
'ORDER BY amo_nom';
 
$resultat = $this->requeteTous($requete);
$liste_types = array();
foreach ($resultat as $ligne) {
$liste_types[] = $ligne;
}
 
return $liste_types;
}
 
/**
* Charge la liste complète des types de champ
* return array un tableau contenant des objets d'informations sur les types de champ
* @return array un tableau d'objets contenant la liste des types de champs
*/
public function chargerListeDesTypesDeChamps() {
return $this->chargerInfosListe($this->id_liste_champs);
}
 
/**
* Charge la liste complète des types SQL
* return array un tableau contenant des objets d'informations sur les types SQL
* @return array un tableau d'objets contenant la liste types de métadonnées
*/
public function chargerListeDesTypesSQL() {
return $this->chargerInfosListe($this->id_liste_type);
}
 
/**
* Charge la liste complète des listes de métadonnées que l'on peut associer à un annuaire
* return array un tableau contenant des objets d'informations sur les types de métadonnées
* @return array un tableau d'objets contenant la liste types de métadonnées
*/
public function chargerListeDesListes() {
return $this->chargerInfosListe($this->id_liste_liste);
}
 
/**
* Charge les informations d'une metadonnee
* @param int l'identifiant de cette metadonnee
* @return Array un tableau contenant les informations sur cette metadonnee
*/
public function chargerInformationsMetaDonnee($id) {
$requete = 'SELECT * '.
'FROM annu_meta_colonne '.
'WHERE amc_id_champ = '.$id;
 
return $this->requeteUn($requete);
}
 
/**
* Ajoute une nouvelle méta colonne à un annuaire donné
* @param Array $valeurs les valeurs à ajouter dans la base
* @return boolean true si la requete a réussi, false sinon
*/
public function ajouterNouvelleMetadonnee($valeurs) {
 
$ontologie_liee = $this->proteger($valeurs['amc_ce_ontologie']);
$annuaire_lie = $this->proteger($valeurs['amc_ce_annuaire']);
$type_sql = $this->renvoyerTypeSQLPourChamp($valeurs['amc_ce_type_affichage']);
$longueur = $this->renvoyerLongueurPourChamp($valeurs['amc_ce_type_affichage']);
$nom = $this->proteger($valeurs['amc_nom']);
$abreviation = $this->proteger($valeurs['amc_abreviation']);
$description = $this->proteger($valeurs['amc_description']);
$type_affichage = $this->proteger($valeurs['amc_ce_type_affichage']);
 
$requete = 'INSERT INTO annu_meta_colonne '.
'(amc_ce_ontologie, amc_ce_annuaire, amc_ce_type, amc_longueur, amc_nom, amc_abreviation, amc_description, amc_ce_type_affichage) '.
'VALUES ('.$ontologie_liee.', '.
$annuaire_lie.', '.
$type_sql.', '.
$longueur.', '.
$nom.','.
$abreviation.','.
$description.', '.
$type_affichage.')';
 
return $this->requete($requete);
}
 
/**
* Modifie une meta colonne liée à un annuaire, grâce aux valeurs passées en paramètre
* @param Array $valeurs les valeurs à modifier
* @return boolean true si la requete a réussi, false sinon
*/
public function modifierMetadonnee($valeurs) {
 
$ontologie_liee = $this->proteger($valeurs['amc_ce_ontologie']);
$type_sql = $this->renvoyerTypeSQLPourChamp($valeurs['amc_ce_type_affichage']);
$longueur = $this->renvoyerLongueurPourChamp($valeurs['amc_ce_type_affichage']);
$nom = $this->proteger($valeurs['amc_nom']);
$abreviation = $this->proteger($valeurs['amc_abreviation']);
$description = $this->proteger($valeurs['amc_description']);
$type_affichage = $this->proteger($valeurs['amc_ce_type_affichage']);
 
$requete = 'UPDATE annu_meta_colonne '.
'SET '.
'amc_ce_ontologie = '.$ontologie_liee.', '.
'amc_ce_type_affichage = '.$type_sql.', '.
'amc_longueur = '.$longueur.', '.
'amc_nom = '.$nom.', '.
'amc_abreviation = '.$abreviation.', '.
'amc_description = '.$description.', '.
'amc_ce_type_affichage = '.$type_affichage.' '.
'WHERE amc_id_champ = '.$valeurs['amc_id_champ'];
 
return $this->requete($requete);
}
 
/**
* Supprime une metadonnée
* @param int $id_metadonnee l'identifiant de l'enregistrement à supprimer
*/
public function supprimerMetadonneeParId($id_metadonnee) {
$requete_suppression_metadonnee = 'DELETE FROM annu_meta_colonne '.
'WHERE amc_id_champ = '.$id_metadonnee;
 
return $this->requete($requete_suppression_metadonnee);
}
 
/**
* Renvoie l'identifiant du type sql associé à un identifiant de type de champ
* exemple champ texte => VARCHAR, champ texte long => TEXT
* @param int $id_type_champ l'identifiant du type de champ
* @return int l'identifiant du type sql correspondant
*/
private function renvoyerTypeSQLPourChamp($id_type_champ) {
// TODO: faire une vraie fonction
return 1002 ;
}
 
/**
* Renvoie la longueur associée à un identifiant de type de champ
* exemple champ texte => 50, champ texte long => 1000
* @param int $id_type_champ l'identifiant du type de champ
* @return int la longueur du champ correspondante
* @return int la longueur associée au champ
*/
private function renvoyerLongueurPourChamp($id_type_champ) {
// TODO: faire une vraie fonction
return 255 ;
}
 
/**
* Renvoie le nom d'une valeur de liste d'ontologie grâce à son identifiant
* @param int $id_ontologie l'identifiant de la valeur dont on veut le nom
* @param int $id_parent l'identifiant de la liste parente
* @return string le nom du champ, ou false sinon
*/
private function renvoyerCorrespondanceNomId($id_ontologie,$id_parent) {
$requete = 'SELECT amo_nom, amo_abreviation '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$this->proteger($id_parent).' '.
'AND amo_id_ontologie = '.$this->proteger($id_ontologie);
 
return $this->requeteUn($requete);
}
 
/**
* Renvoie le nom d'une valeur de liste d'ontologie grâce à son identifiant
* @param int $id_ontologie l'identifiant de la valeur dont on veut l'abreviation
* @return string l'abreviation, ou false sinon
*/
public function renvoyerCorrespondanceAbreviationId($id_ontologie) {
$requete = 'SELECT amo_abreviation '.
'FROM annu_meta_ontologie '.
'WHERE amo_id_ontologie = '.$this->proteger($id_ontologie);
 
$resultat = $this->requeteUn($requete);
 
if($resultat) {
return $resultat['amo_abreviation'];
} else {
return false;
}
}
public function renvoyerCorrespondanceIdParAbreviation($abreviation, $id_parent) {
$requete = 'SELECT amo_id_ontologie '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$this->proteger($id_parent).' '.
'AND amo_abreviation = '.$this->proteger($abreviation);
$resultat = $this->requeteUn($requete);
 
if($resultat) {
return $resultat['amo_id_ontologie'];
} else {
return false;
}
}
 
 
/**
* Renvoie le nom du template associé à un champ grâce à son identifiant
* @param int $id_ontologie l'identifiant du champ dont on veut le template
* @return string le nom du template (qui est l'abreviation du champ), ou false sinon
*/
public function renvoyerTypeAffichageParId($id_champ) {
 
$requete = 'SELECT amo_abreviation '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$this->id_liste_champs.' '.
'AND amo_id_ontologie = '.$id_champ;
 
$resultat = $this->requeteUn($requete);
 
return $resultat['amo_abreviation'];
}
 
/**
* Renvoie le nom du template associé à un champ grâce à son identifiant
* @param int $id_ontologie l'identifiant du champ dont on veut le template
* @return string le nom du template (qui est l'abreviation du champ), ou false sinon
*/
public function renvoyerTypeAffichagePourColonne($id_colonne) {
 
$requete = 'SELECT amo_abreviation '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$this->id_liste_champs.' '.
'AND amo_id_ontologie =
(SELECT amc_ce_type_affichage '.
'FROM annu_meta_colonne '.
'WHERE amc_id_champ = '.$id_colonne.')';
 
$resultat = $this->requeteUn($requete);
 
if($resultat) {
return $resultat['amo_abreviation'];
} else {
return false;
}
}
 
/**
* Renvoie vrai si un utilisateur possède une valeur de metadonnées pour une colonne donnée
*/
public function valeurExiste($id_champ, $id_enregistrement_lie) {
 
$requete_existence_valeur = 'SELECT COUNT(*) as valeur_existe '.
'FROM annu_meta_valeurs '.
'WHERE amv_ce_colonne = '.$id_champ.' '.
'AND amv_cle_ligne ='.$id_enregistrement_lie;
 
$resultat = $this->requeteUn($requete_existence_valeur);
 
return ($resultat['valeur_existe'] >= 1) ;
}
public function renvoyerIdChampMetadonneeParAbreviation($id_annuaire, $abreviation) {
$requete_id = 'SELECT amc_id_champ '.
'FROM annu_meta_colonne '.
'WHERE amc_abreviation = '.$this->proteger($abreviation).' '.
'AND amc_ce_annuaire ='.$id_annuaire;
 
$resultat = $this->requeteUn($requete_id);
 
return ($resultat['amc_id_champ']) ;
}
 
/**
* Ajoute une nouvelle valeur à un champ de metadonnées pour une ligne dans un annuaire donné
* @param int $id_champ l'identifiant du champ auquel on ajoute cette valeur
* @param int $id_enregistrement_lie l'identifiant de l'enregistrement lié dans l'annuairé mappé
* @param mixed $valeur la valeur à associer au champ (peut-être une valeur brute ou bien un identifiant de liste d'ontologie)
* @return true ou false suivant le succès de la requête
*/
public function ajouterNouvelleValeurMetadonnee($id_champ, $id_enregistrement_lie, $valeur) {
 
$valeur = $this->proteger($valeur);
 
$requete = 'INSERT INTO annu_meta_valeurs '.
'(amv_ce_colonne, amv_cle_ligne, amv_valeur) '.
'VALUES ('.$id_champ.','.$id_enregistrement_lie.','.$valeur.')';
 
return $this->requete($requete);
}
 
/**
* Modifie une valeur d'un champ de metadonnées pour une ligne dans un annuaire donné
* @param int $id_champ l'identifiant du champ dont on modifie la valeur
* @param mixed $valeur la nouvelle valeur à associer au champ (peut-être une valeur brute ou bien un identifiant de liste d'ontologie)
* @return boolean true ou false suivant le succès de la requête
*/
public function modifierValeurMetadonnee($id_champ, $id_enregistrement_lie, $valeur) {
 
$requete = 'UPDATE annu_meta_valeurs '.
'SET amv_valeur = '.$this->proteger($valeur).' '.
'WHERE amv_cle_ligne = '.$id_enregistrement_lie.' '.
'AND amv_ce_colonne = '.$id_champ;
 
return $this->requete($requete);
}
 
/**
* Supprime une valeur de metadonnée par son identifiant
* @param int $id_valeur_metadonnee l'identifiant de valeur à supprimer
* @return true ou false suivant le succès de la requete
*/
public function supprimerValeurMetadonnee($id_valeur_metadonnee) {
 
$requete = 'DELETE FROM annu_meta_valeurs '.
'WHERE amv_id_valeur = '.$id_valeur_metadonnee;
 
return $this->requete($requete);
}
 
/**
* Supprime les valeurs de metadonnées associés à un identifiant de ligne d'annuaire
* @param int $id_enregistrement_lie l'identifiant de la ligne à laquelle sont associées les valeurs à supprimer
*/
public function supprimerValeursMetadonneesParIdEnregistrementLie($id_enregistrement_lie) {
 
$requete = 'DELETE FROM annu_meta_valeurs '.
'WHERE amv_cle_ligne = '.$id_enregistrement_lie;
 
return $this->requete($requete);
}
 
/** Supprime les valeurs de metadonnées associés à un identifiant de colonne
* @param int $id_colonne_liee l'identifiant de la colonne à laquelle sont associées les valeurs à supprimer
*/
public function supprimerValeursMetadonneesParIdColonneLiee($id_colonne_liee) {
$requete = 'DELETE FROM annu_meta_valeurs '.
'WHERE amv_ce_colonne = '.$id_colonne_liee;
 
return $this->requete($requete);
}
 
/**
* Charge les valeurs de metadonnées pour un identifiant de ligne donné
* @param int $id_annuaire l'identifiant de l'annuaire sur lequel on travaille
* @param int $id_utilisateur l'identifiant de la ligne dans l'annuaire pour laquelle on veut récupérer les valeur de metadonnées
*/
public function chargerListeValeursMetadonneesUtilisateur($id_annuaire, $id_enregistrement_lie) {
 
// première requete pour obtenir les valeurs des champs de metadonnées liées à la ligne
$requete_valeurs_metadonnees = 'SELECT amv_ce_colonne, amv_valeur, amc_ce_ontologie, amc_abreviation, amc_ce_type_affichage FROM annu_meta_valeurs '.
'LEFT JOIN annu_meta_colonne '.
'ON annu_meta_colonne.amc_id_champ = annu_meta_valeurs.amv_ce_colonne '.
'WHERE amv_cle_ligne = '.$id_enregistrement_lie.' ';
 
$resultat_valeurs_metadonnees = $this->requeteTous($requete_valeurs_metadonnees);
 
if(!$resultat_valeurs_metadonnees) {
 
$liste_metadonnee = array();
 
} else {
foreach ($resultat_valeurs_metadonnees as $ligne) {
 
// pour toutes les valeurs qui sont des élements d'une liste d'ontologie
if($ligne['amc_ce_ontologie'] != 0) {
 
// Si c'est un champ qui contient de multiples valeurs, alors il contient potientiellement le séparateur de métadonnées
if(strpos($ligne['amv_valeur'],Config::get('separateur_metadonnee'))) {
 
$id_valeurs_metadonnees = explode(Config::get('separateur_metadonnee'), $ligne['amv_valeur']);
$ligne['amv_valeur'] = $id_valeurs_metadonnees;
 
foreach ($id_valeurs_metadonnees as $id_valeur) {
$resultat_nom_valeur = $this->renvoyerCorrespondanceNomId($id_valeur,$ligne['amc_ce_ontologie']);
$ligne['amo_nom'][] = $resultat_nom_valeur['amo_nom'];
}
} else {
$resultat_nom_valeur = $this->renvoyerCorrespondanceNomId($ligne['amv_valeur'],$ligne['amc_ce_ontologie']);
$ligne['amo_nom'] = $resultat_nom_valeur['amo_nom'];
}
 
$nom_valeur = $resultat_nom_valeur['amo_nom'];
} else {
$ligne['amv_valeur'] = stripslashes($ligne['amv_valeur']);
}
 
$ligne['amc_ce_type_affichage'] = $this->renvoyerTypeAffichageParId($ligne['amc_ce_type_affichage']);
$liste_metadonnee[$ligne['amc_abreviation']] = $ligne;
}
}
 
$colonnes_totales = $this->chargerListeMetadonneeAnnuaire($id_annuaire);
 
foreach ($colonnes_totales as $colonne) {
if(!isset($liste_metadonnee[$colonne['amc_abreviation']])) {
 
if($colonne['amc_ce_ontologie'] != 0) {
$valeur = array();
} else {
$valeur = '';
}
 
$liste_metadonnee[$colonne['amc_abreviation']] = array('amv_ce_colonne' => $colonne['amc_id_champ'],
'amv_valeur' => $valeur,
'amo_nom' => '',
'amc_ce_ontologie' => $colonne['amc_ce_ontologie'],
'amc_abreviation' => $colonne['amc_abreviation'],
'amc_ce_type_affichage' => $this->renvoyerTypeAffichageParId($colonne['amc_ce_type_affichage']));
}
}
 
return $liste_metadonnee;
 
}
 
/**
* Recherche les enregistrements correspondants au criètres donnés et renvoie une liste d'identifiants, correspondants
* @param int $id_annuaire l'identifiant de l'annuaire dans lequel on recherche
* @valeurs array un talbeau de valeurs à rechercher
* $exclusive boolean indique si la recherche doit se faire avec un ET ou bien un OU sur les critèrex
*/
public function rechercherDansValeurMetadonnees($id_annuaire, $valeurs, $exclusive = true) {
 
// Définition du séparateur de requête suivant la paramètre
if($exclusive) {
$separateur = ' AND ';
} else {
$separateur = ' OR ';
}
 
$chaine_recherche = '';
 
foreach($valeurs as $nom_champ => $valeur) {
 
if(is_array($valeur)) {
foreach($valeur as $cle => $valeur_multi_meta) {
$chaine_recherche .= '(amv_ce_colonne = '.$this->proteger($nom_champ).' AND amv_valeur LIKE '.$this->proteger('%'.$cle.'%').')'.$separateur;
}
} else {
if(trim($valeur) != '') {
$chaine_recherche .= '(amv_ce_colonne = '.$this->proteger($nom_champ).' AND amv_valeur = '.$this->proteger($valeur).')'.$separateur;
}
}
}
 
if(trim($chaine_recherche) == '') {
return array();
}
 
$chaine_recherche = rtrim($chaine_recherche,$separateur);
 
$requete_recherche = 'SELECT DISTINCT amv_cle_ligne '.
'FROM annu_meta_valeurs '.
'WHERE '.$chaine_recherche ;
 
$resultat_recherche = $this->requeteTous($requete_recherche);
 
if($resultat_recherche) {
 
$tableau_id = array();
foreach($resultat_recherche as $resultat) {
$tableau_id[] = $resultat['amv_cle_ligne'];
}
return $tableau_id;
 
} else {
return array();
}
}
 
/**
* Renvoie les valeur d'une méta colonne pour un identifiant d'enregistrement lié et de meta colonne donnés
* @param int $id_champ l'identifiant de champ
* @param int $id_utilisateur l'identifiant de ligne à laquelle est associée la metadonnée
* @return array un tableau d'informations contenant les données
*/
public function obtenirValeurMetadonnee($id_champ, $id_enregistrement_lie) {
 
$requete_valeur_metadonnee = 'SELECT * FROM annu_meta_valeurs'.
' WHERE amv_ce_colonne = '.$this->proteger($id_champ).
' AND amv_cle_ligne = '.$this->proteger($id_enregistrement_lie);
 
$resultat_valeur_metadonnee = $this->requeteTous($requete_valeur_metadonnee);
 
if($resultat_valeur_metadonnee) {
return $resultat_valeur_metadonnee;
} else {
 
return false;
}
 
}
 
/** Suivant un identifiant de champ, renvoie un tableau contenant le nombre d'enregistrement pour chaque valeur
* @param int $id_champ l'identifiant de champ
* @return array un tableau d'informations contenant les données
*/
public function obtenirNombreValeurMetadonnee($id_champ) {
 
$requete_valeurs_liste = 'SELECT amo_nom, amo_abreviation FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$this->proteger($id_champ);
 
$requete_valeur_metadonnee = 'SELECT COUNT(*) as nb, amv_valeur FROM annu_meta_valeurs'.
' WHERE amv_ce_colonne = '.$id_champ.' '.
' GROUP BY amv_valeur '.
' ORDER BY nb DESC';
 
$resultat_valeur_metadonnee = $this->requeteTous($requete_valeur_metadonnee);
 
if($resultat_valeur_metadonnee) {
return $resultat_valeur_metadonnee;
} else {
 
return false;
}
 
}
}
?>
/tags/v1.1-andromede/modeles/OntologieModele.php
New file
0,0 → 1,133
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des listes
* d'ontologies
*
* PHP Version 5
*
* @package Framework
* @category Class
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id: ListeAdmin.php 128 2009-09-02 12:20:55Z aurelien $$
* @link /doc/framework/
*
*/
class OntologieModele extends Modele {
 
private $config = array();
 
/**
* Charge la liste complète des listes
* return array un tableau contenant des objets d'informations sur les listes
* @return array un tableau d'objets contenant la liste des listes
*/
public function chargerListeListes() {
return $this->chargerListeOntologie(0);
}
 
 
/**
* Charge une liste d'ontologie par son identifiant donné en paramètres
* @param int l'identifiant de la liste dont on veut charger les élements
* @return array un tableau contenant les éléments de la liste
*/
public function chargerListeOntologie($identifiant) {
$requete = 'SELECT * '.
'FROM annu_meta_ontologie '.
'WHERE amo_ce_parent = '.$identifiant.' '.
'ORDER BY amo_id_ontologie';
$resultat = $this->requeteTous($requete);
$listes = array();
foreach ($resultat as $ligne) {
$listes[] = $ligne;
}
return $listes;
}
 
/**
* Charge les informations concernant une liste d'ontologie
* @param int l'identifiant de la liste dont on veut les informations
* @return array un tableau contenant les infos sur la liste
*/
public function chargerInformationsOntologie($identifiant) {
$requete = 'SELECT * '.
'FROM annu_meta_ontologie '.
'WHERE amo_id_ontologie = '.$identifiant;
$resultat = $this->requeteTous($requete);
$ontologie = array();
 
if(!$resultat) {
} else {
foreach ($resultat as $ligne) {
$ontologie = $ligne;
}
}
return $ontologie;
}
 
/**
* Ajoute une nouvelle liste d'ontologie
* @param array un tableau de valeurs
* @return boolean true ou false selon le succès de la requete
*/
public function ajouterNouvelleListeOntologie($valeurs) {
 
$parent = $this->proteger($valeurs['amo_ce_parent']);
$nom = $this->proteger($valeurs['amo_nom']);
$abreviation = $this->proteger($valeurs['amo_abreviation']);
$description = $this->proteger($valeurs['amo_description']);
 
$requete = 'INSERT INTO annu_meta_ontologie '.
'(amo_ce_parent, amo_nom, amo_abreviation, amo_description) '.
'VALUES ('.$parent.', '.$nom.','.$abreviation.','.$description.')';
 
return $this->requete($requete);
}
 
/**
* Modifie une liste d'ontologie
* @param array un tableau de valeurs
* @return boolean true ou false selon le succès de la requete
*/
public function modifierListeOntologie($valeurs) {
 
$id = $this->proteger($valeurs['amo_id_ontologie']);
$nom = $this->proteger($valeurs['amo_nom']);
$abreviation = $this->proteger($valeurs['amo_abreviation']);
$description = $this->proteger($valeurs['amo_description']);
 
$requete = 'UPDATE annu_meta_ontologie '.
'SET '.
'amo_nom='.$nom.', '.
'amo_abreviation='.$abreviation.', '.
'amo_description='.$description.' '.
'WHERE amo_id_ontologie ='.$id;
 
return $this->requete($requete);
}
 
/**
* Supprime une liste d'ontologie et toutes ses valeurs filles
* @param array un identifiant de liste
* @return boolean true ou false selon le succès de la requete
*/
public function supprimerListeOntologie($id) {
 
$id = $this->proteger($id);
 
$requete_suppression_liste = 'DELETE FROM annu_meta_ontologie '.
'WHERE amo_id_ontologie ='.$id;
 
$requete_suppression_fils = 'DELETE FROM annu_meta_ontologie '.
'WHERE amo_ce_parent ='.$id;
 
return ($this->requete($requete_suppression_liste) && $this->requete($requete_suppression_fils));
 
}
 
}
?>
/tags/v1.1-andromede/modeles/StatistiqueModele.php
New file
0,0 → 1,24
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
class StatistiqueModele extends Modele {
 
public function obtenirInscriptionsParDate($id_annuaire, $annee) {
 
$requete_annee_inscrit = 'SELECT COUNT(*) FROM annuaire_tela '.
' WHERE id_annuaire '.$this->proteger($id_annuaire);
 
}
 
}
?>
/tags/v1.1-andromede/modeles/DonneeTemporaireModele.php
New file
0,0 → 1,108
<?php
/**
* PHP Version 5
*
* @category PHP
* @package annuaire
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/annuaire/
*/
 
 
// TODO : utiliser cette classe pour l'inscription temporaire
Class DonneeTemporaireModele extends Modele {
 
private $config = array();
public function stockerDonneeTemporaire($donnee, $id_aleatoire = false) {
$this->maintenanceDonneesTemporaires();
 
// on protège et on sérialise les données
$identifiant = $this->calculerIdentifiant($id_aleatoire);
$donnees = $this->encoderDonneeTemporaire($donnee);
 
$requete_insertion = 'INSERT INTO annu_donnees_temp '.
'VALUES '.
'('.$this->proteger($identifiant).','.$this->proteger($donnees).', NOW())';
 
$this->requete($requete_insertion);
 
return $identifiant;
 
}
 
public function chargerDonneeTemporaire($code_donnee) {
$this->maintenanceDonneesTemporaires();
 
$requete_chargement_donnee = 'SELECT * FROM annu_donnees_temp '.
' WHERE adt_id = '.$this->proteger($code_donnee);
 
$donnees_temp = $this->requeteUn($requete_chargement_donnee);
 
if($donnees_temp) {
return $this->decoderDonneeTemporaire($donnees_temp);
} else {
return false;
}
}
 
public function supprimerDonneeTemporaire($code_donnee) {
 
$requete_suppression_donnee = 'DELETE FROM annu_donnees_temp '.
' WHERE adt_id = '.$this->proteger($code_donnee);
 
$resultat_suppression = $this->requeteUn($requete_suppression_donnee);
 
if($resultat_suppression) {
return true;
} else {
return false;
}
}
 
private function decoderDonneeTemporaire($donnee_encodee) {
 
return unserialize(base64_decode($donnee_encodee['adt_donnees']));
}
 
private function encoderDonneeTemporaire($donnee) {
 
return base64_encode(serialize($donnee));
}
 
private function calculerIdentifiant($aleatoire = false) {
 
if(!$aleatoire) {
// Le code de confirmation est constitué des 8 premiers caractères de l'identifiant de session
// lors du stockage des données d'inscription, afin d'éviter d'accumuler les demandes
// d'inscription pour une même session
$code_confirmation = substr(session_id(), 0, 8) ;
} else {
$code_confirmation = md5(rand(0,100));
}
 
return $code_confirmation;
}
private function maintenanceDonneesTemporaires() {
$requete_suppression_vieilles_donnees = 'DELETE FROM annu_donnees_temp';
' WHERE adt_date < (DATE_SUB(now(), INTERVAL 14 DAY))';
$resultat_suppression_vieilles_donnees = $this->requeteUn($requete_suppression_vieilles_donnees);
if($resultat_suppression_vieilles_donnees) {
return true;
} else {
return false;
}
}
 
}
 
?>
/tags/v1.1-andromede/configurations/config.ini
New file
0,0 → 1,147
; Info sur l'application
info.nom = Annuaire
info.abr = AA
;Encodage de l'application
appli_encodage = "UTF-8"
;Encodage de la connexion à la base de données
bdd_encodage = "utf8"
;Encodage des squelettes
sortie_encodage = "UTF-8"
; abstraction de la base de données.
bdd_abstraction = pdo
; Protocole de la base de données.
bdd_protocole = mysql
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
base_url_application = ""
; Mettre à true si l'application nécessite de s'identifier.
identification = "aurelien@tela-botanica.org"
; Nom de la base de données principale.
bdd_nom = "annuaire"
 
; nom de la session
session_nom = "annuaire"
 
; debogage
fw_debogage = true
fw_log_debogage = false
 
; Adresse mail indiquée comme expéditeur des mails envoyés par l'appli
adresse_mail_annuaire = "annuaire@tela-botanica.org"
 
; Séparateur des champs de métadonnées à multi valeurs
separateur_metadonnee = ";;"
 
; Fonction d'encryptage des mot de passe
pass_crypt_fonct = "md5"
 
; separateur de dossier
ds = DIRECTORY_SEPARATOR
 
; Dossiers contenant les templates pour la gestion des annuaires
dossier_squelettes_gestion_annuaires = "gestion_annuaires{ref:ds}"
; Dossiers contenant les éléments divers
dossier_squelettes_elements = "elements{ref:ds}";
; Dossiers contenant les squelettes pour les types de champs
dossier_squelettes_champs = "champs{ref:ds}";
; Dossiers contenant les squelettes pour la gestion des annuaires
dossier_squelettes_annuaires = "annuaires{ref:ds}"
; Dossiers contenant les squelettes pour la gestion des formaulaires
dossier_squelettes_formulaires = "formulaires{ref:ds}"
; Dossiers contenant les squelettes pour la gestion des fiches
dossier_squelettes_fiches = "fiches{ref:ds}"
; Dossiers contenant les templates pour les mails
dossier_squelettes_mails = "mails{ref:ds}"
; Dossiers contenant les templates pour la gestion des metadonnées
dossier_squelettes_metadonnees = "metadonnees{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_ontologies = "ontologies{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_rss = "rss{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_navigation = "navigation{ref:ds}"
 
; +---------------- Styles -------------------------------------------------+
base_url_styles = "/annuaire/"
 
; +---------------- Valeurs par défaut -------------------------------------------------+
annuaire_defaut = "1"
 
; +---------------- Images -------------------------------------------------+
;dossier contenant les photos de profils
base_chemin_images = "/home/aurelien/web/Documents/annuaire/images/"
base_url_images = "/Documents/annuaire/images/"
 
;taille maximum des images en octet
taille_max_images = "10000000"
 
; extensions acceptées, séparés par des |, exemple, ".png|.gif|.jpeg"
extensions_acceptees = ".jpg|.jpeg|.JPG|.JPEG"
 
; +---------------- Lettre d'actualité -------------------------------------------------+
 
;adresse de base des web services vpopmails
adresse_service_lettre = "http://vpopmail.tela-botanica.org/"
 
;service d'inscription
service_inscription_lettre = "ajout_abonne.php"
 
;service de desinscription
service_desinscription_lettre = "suppression_abonne.php"
 
;domaine de la lettre d'actualité
domaine_lettre = "tela-botanica.org"
 
;nom de la lettre d'actualité
nom_lettre = "testdavid"
; adresse d'inscription à la lettre d'actualité
adresse_inscription_lettre = "actu-subscribe@tela-botanica.org"
; addresse de désinscription à la lettre d'actu
adresse_desinscription_lettre = "actu-unsubscribe@tela-botanica.org"
 
 
; +-------------------------------- Formats -----------------------------------------------------+
: Format d'affichage des dates
date_format_simple = "d/m/Y"
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique au module Carte
; Active (=true) ou désactive (=false) le mode de débogage de la cartographie
carte_mode_debug = false
; Nom du fichier sans l'extension de la carte de base de fond à utiliser
carte_base_nom_france = "france"
carte_base_nom_pays = "pays"
carte_base_nom_continents = "continents"
; Chemin vers le dossier des fonds de cartes relatif à l'application
carte_fonds_chemin = "composants{ref:ds}cartographie{ref:ds}squelettes{ref:ds}"
; Chemin vers le dossier où seront stockée les cartes créées
carte_stockage_chemin = "/home/aurelien/web/annuaire/cartes/"
; Url du dossier où seront stockée les cartes créées avec %s pour indiquer le fichier
carte_stockage_url = "http://162.38.234.9/annuaire/cartes/%s"
; Constante stockant la couleur la plus foncé utilisée pour les cartes "proportionnelles".0,127,0
carte_couleur_foncee = "140,168,68"
; Constante stockant la couleur la plus claire utilisée pour les cartes "proportionnelles".210,230,210
carte_couleur_claire = "243,247,224"
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique au module carte
; Chemin vers le dossier où seront stockée les cartes créées
stats_stockage_chemin = "/home/aurelien/web/annuaire/cartes/"
stats_stockage_url = "http://162.38.234.9/annuaire/cartes/%s"
 
; +------------------------------------------------------------------------------------------------------+
Spécifique au module mail
; indique si la modération s'applique aux mails avec de nombreux destinataires
moderer_mail = true
; définit la notion de nombreux
seuil_moderation_messages = 0
; moderateur des messages, s'il y en a plusieurs, les séparer par des virgules
mail_moderateur = "aurelien@tela-botanica.org"
 
; +-----------------------------------------------------------------------------------------------------+
Applications externes
; url des application qui possèdent une fonction d'inscription
url_services_applications_inscription = "http://162.38.234.9/projet_bp/jrest/##http://162.38.234.9/spip/spip/jrest/"
url_services_applications_resume = "http://162.38.234.9/projet_bp/jrest/##http://162.38.234.9/bazar_bp/jrest/##http://162.38.234.9/spip/spip/jrest/##http://162.38.234.9/jrest/"
; url des application qui possèdent une fonction de gestion de l'appli
url_services_applications_gestion = "http://162.38.234.9/annuaire/jrest/##http://162.38.234.9/projet_bp/jrest/";
/tags/v1.1-andromede/configurations/config_papyrus.ini
New file
0,0 → 1,35
; abstraction de la base de données.
bdd_abstraction = pdo
; Protocole de la base de données.
bdd_protocole = mysql
 
 
;Encodage de l'application
appli_encodage = "UTF-8"
;Encodage de la base de données
bdd_encodage = "utf8"
;encodage des squelettes
sortie_encodage = "ISO-8859-15"
 
 
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
base_url_application = ""
 
; Mettre à true si l'application nécessite de s'identifier, peut être remplie par une variable php
identification = "php:$GLOBALS['_GEN_commun']['pear_auth']->getUserName()"
 
; objet contenant l'identification de papyrus
objet_identification = "php:$GLOBALS['_GEN_commun']['pear_auth']"
 
; nom de la session d'identification
nom_session = "pap-utilisateur_papyrus_-memo"
 
; durée de l'identification
duree_session_identification = PAP_AUTH_SESSION_DUREE;
 
; fonction de cryptage du mot de passe dans le cookie
fonction_cryptage_mdp_cookie = "md5";
 
; debogage
fw_debogage = true
fw_log_debogage = true
/tags/v1.1-andromede/configurations/config.defaut.ini
New file
0,0 → 1,150
; fichier de configuration par défaut, à compléter config.ini
 
; Info sur l'application
info.nom = Annuaire
info.abr = AA
;Encodage de l'application
appli_encodage = "UTF-8"
;Encodage de la connexion à la base de données
bdd_encodage = "utf8"
;Encodage des squelettes
sortie_encodage = "UTF-8"
; abstraction de la base de données.
bdd_abstraction = pdo
; Protocole de la base de données.
bdd_protocole = mysql
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
base_url_application = ""
; Mettre à true si l'application nécessite de s'identifier.
identification = true
; Nom de la base de données principale.
bdd_nom = "annuaire"
 
; nom de la session d'identification
nom_session = "pap-utilisateur_papyrus_-memo"
 
; debogage
fw_debogage = true
fw_log_debogage = false
 
; Adresse mail indiquée comme expéditeur des mails envoyés par l'appli
adresse_mail_annuaire = "annuaire@tela-botanica.org"
 
; Séparateur des champs de métadonnées à multi valeurs
separateur_metadonnee = ";;"
 
; Fonction d'encryptage des mot de passe
pass_crypt_fonct = "md5"
 
; separateur de dossier
ds = DIRECTORY_SEPARATOR
 
; Dossiers contenant les templates pour la gestion des annuaires
dossier_squelettes_gestion_annuaires = "gestion_annuaires{ref:ds}"
; Dossiers contenant les éléments divers
dossier_squelettes_elements = "elements{ref:ds}";
; Dossiers contenant les squelettes pour les types de champs
dossier_squelettes_champs = "champs{ref:ds}";
; Dossiers contenant les squelettes pour la gestion des annuaires
dossier_squelettes_annuaires = "annuaires{ref:ds}"
; Dossiers contenant les squelettes pour la gestion des formaulaires
dossier_squelettes_formulaires = "formulaires{ref:ds}"
; Dossiers contenant les squelettes pour la gestion des fiches
dossier_squelettes_fiches = "fiches{ref:ds}"
; Dossiers contenant les templates pour les mails
dossier_squelettes_mails = "mails{ref:ds}"
; Dossiers contenant les templates pour la gestion des metadonnées
dossier_squelettes_metadonnees = "metadonnees{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_ontologies = "ontologies{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_rss = "rss{ref:ds}"
; Dossiers contenant les templates pour la gestion des ontologies
dossier_squelettes_navigation = "navigation{ref:ds}"
; Dossiers contenant les templates pour la gestion des pages
dossier_squelettes_pages = "pages{ref:ds}"
 
; +---------------- Styles -------------------------------------------------+
url_base_style = "/annuaire/"
 
; +---------------- Valeurs par défaut -------------------------------------------------+
annuaire_defaut = "1"
 
; +---------------- Images -------------------------------------------------+
;dossier contenant les photos de profils
base_chemin_images = ""
base_url_images = ""
 
;taille maximum des images en octet
taille_max_images = "10000000000"
 
; extensions acceptées, séparés par des |, exemple, ".png|.gif|.jpeg"
extensions_acceptees = ".jpg|.jpeg"
 
; +---------------- Lettre d'actualité -------------------------------------------------+
 
;adresse de base des web services vpopmails
adresse_service_lettre = "http://vpopmail.tela-botanica.org/"
 
;service d'inscription
service_inscription_lettre = "ajout_abonne.php"
 
;service de desinscription
service_desinscription_lettre = "suppression_abonne.php"
 
;domaine de la lettre d'actualité
domaine_lettre = "tela-botanica.org"
 
;nom de la lettre d'actualité
nom_lettre = ""
; adresse d'inscription à la lettre d'actualité
adresse_inscription_lettre = ""
; addresse de désinscription à la lettre d'actu
adresse_desinscription_lettre = ""
 
; +-------------------------------- Formats -----------------------------------------------------+
: Format d'affichage des dates
date_format_simple = "d/m/Y"
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique au module Carte
; Active (=true) ou désactive (=false) le mode de débogage de la cartographie
carte_mode_debug = false
; Nom du fichier sans l'extension de la carte de base de fond à utiliser
carte_base_nom_france = "france"
carte_base_nom_pays = "pays"
carte_base_nom_continents = "continents"
; Chemin vers le dossier des fonds de cartes relatif à l'application
carte_fonds_chemin = "composants{ref:ds}cartographie{ref:ds}squelettes{ref:ds}"
; Chemin vers le dossier où seront stockée les cartes créées
carte_stockage_chemin = ""
; Url du dossier où seront stockée les cartes créées avec %s pour indiquer le fichier
carte_stockage_url = ""
; Constante stockant la couleur la plus foncé utilisée pour les cartes "proportionnelles".0,127,0
carte_couleur_foncee = "140,168,68"
; Constante stockant la couleur la plus claire utilisée pour les cartes "proportionnelles".210,230,210
carte_couleur_claire = "243,247,224"
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique au module carte
; Chemin vers le dossier où seront stockée les cartes créées
stats_stockage_chemin = ""
stats_stockage_url = ""
 
; +------------------------------------------------------------------------------------------------------+
Spécifique au module mail
; indique si la modération s'applique aux mails avec de nombreux destinataires
moderer_mail = true
; définit la notion de nombreux
seuil_moderation_messages = 0
; moderateur des messages, s'il y en a plusieurs, les séparer par des virgules
mail_moderateur = ""
 
; +-----------------------------------------------------------------------------------------------------+
Applications externes
; url des application qui possèdent une fonction d'inscription
url_services_applications_inscription = ""
url_services_applications_resume = ""
; url des application qui possèdent une fonction de gestion de l'appli
url_services_applications_gestion = "";
/tags/v1.1-andromede/index.php
New file
0,0 → 1,66
<?php
/** Inclusion du fichier principal de l'application (annuaire)*/
require_once 'annuaire_admin.php';
$contenu_navigation = afficherContenuNavigation();
$contenu_tete = afficherContenuTete();
$contenu_corps = afficherContenuCorps();
$titre = "Application de gestion des annuaires";
$contenu_pied = afficherContenuPied();
$contenu_menu = afficherContenuMenu();
$erreurs = GestionnaireException::getExceptions();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head xml:lang="fr" lang="fr">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-style-type" content="text/css" />
<meta http-equiv="Content-script-type" content="text/javascript" />
<meta http-equiv="Content-language" content="fr" />
 
<title><?php echo $titre; ?></title>
 
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="author" content="Tela Botanica" />
 
<link href="squelettes/css/annuaire.css" media="screen" type="text/css" rel="stylesheet">
 
<link rel="shortcut icon" type="image/x-icon" href="http://www.tela-botanica.org/favicon.ico" />
<link rel="icon" type="image/png" href="http://www.tela-botanica.org/sites/commun/generique/images/favicones/tela_botanica.png" />
<link href="http://162.38.234.9/annuaire/squelettes/css/annuaire_complexe.css" title="" media="screen" type="text/css" rel="stylesheet" />
</head>
<body xml:lang="fr" lang="fr">
<div id="reducteur">
<div id="logo_tela">
<a href="/" title="Retour à l'accueil du site">
<img src="http://www.tela-botanica.org/sites/reseau/generique/images/graphisme/logo_jaune.gif" alt="le logo de Tela Botanica"/>
</a>
</div>
 
<div id="droite">
<div id="onglets">
<?php echo $contenu_menu; ?>
</div>
<div id="contenu">
<div id="entete">
<?php echo $contenu_tete; ?>
</div>
<div id="texte">
<?php echo $contenu_corps; ?>
</div>
<div id="pied_texte">
<?php
echo $contenu_pied;
?>
</div>
</div>
</div>
<div>
<?php echo $erreurs; ?>
</div>
<div id="pied">
 
</div>
</div>
</body>
</html>
/tags/v1.1-andromede/squelettes/champs/date.tpl.html
New file
0,0 → 1,5
<label style="display:inline;"> <?= $amc_nom ?> (jj/mm/aaaa) : </label>
<input type="text" class="date_annuaire" name="date_<?=$amc_id_champ?>" id="date_<?=$amc_id_champ?>" value="<?php if(isset($valeur_defaut['amv_valeur'])) { echo $valeur_defaut['amv_valeur']; } ?>"/>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/textarea.tpl.html
New file
0,0 → 1,7
<label class="annuaire" for="textarea_<?=$amc_id_champ?>" style="display:inline;"> <?= $amc_nom ?> : </label><br />
<textarea class="annuaire" name="textarea_<?=$amc_id_champ?>" id="textarea_<?=$amc_id_champ?>" ><?php if(isset($valeur_defaut['amv_valeur'])) { echo $valeur_defaut['amv_valeur']; } ?></textarea>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
 
 
/tags/v1.1-andromede/squelettes/champs/radio.tpl.html
New file
0,0 → 1,11
<label style="display:inline;"> <?= $amc_nom ?> : </label>
<?php foreach($liste_valeurs as $valeur) : ?>
<span style="margin-right:20px">
<input style="margin-right:2px" type="radio" name="radio_<?=$amc_id_champ ?>" id="radio_<?=$valeur['amo_id_ontologie'] ?>" <?php if (isset($valeur_defaut['amv_valeur']) && $valeur_defaut['amv_valeur'] == $valeur['amo_id_ontologie']) { echo "checked=checked"; } ?> value="<?=$valeur['amo_id_ontologie'] ?>" />
<?= $valeur['amo_nom'] ?>
</span>
<?php endforeach; ?>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
 
/tags/v1.1-andromede/squelettes/champs/lettre.tpl.html
New file
0,0 → 1,6
<label class="label_checkbox"> <?= $amc_nom ?> : </label>
<input class="checkbox_alignee" type="checkbox" <?php if (isset($valeur_defaut['amv_valeur']) && $valeur_defaut['amv_valeur'] == 1) { echo "checked=checked"; } ?> name="lettre_<?=$amc_id_champ ?>" id="lettre_<?=$amc_id_champ ?>" />
<input type="hidden" name="lettre_hidden_<?=$amc_id_champ ?>" id="lettre_hidden_<?=$amc_id_champ ?>" value="lettre_hidden_<?=$amc_id_champ ?>" />
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/select.tpl.html
New file
0,0 → 1,9
<label style="display:inline;"> <?= $amc_nom ?> : </label>
<select name="select_<?=$amc_id_champ?>" id="select_<?=$amc_id_champ ?>">
<?php foreach($liste_valeurs as $valeur) : ?>
<option name="option_<?=$valeur['amo_id_ontologie']?>" id="option_<?=$valeur['amo_id_ontologie']?>" value="<?=$valeur['amo_id_ontologie'] ?>" <?php if (isset($valeur_defaut['amv_valeur']) && $valeur['amo_id_ontologie'] == $valeur_defaut['amv_valeur']) { echo 'selected="selected"'; } ?>" > <?=$valeur['amo_nom']?> </option>
<?php endforeach; ?>
</select>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/image.tpl.html
New file
0,0 → 1,26
<h3> Pour compléter votre profil, vous pouvez ajouter une image qui sera affiché dans votre fiche utilisateur </h3>
 
<div id="formulaire_avatar">
<p>
<?php if(isset($formats)) { ?> Les extensions de fichiers prises en charge sont les suivantes : <?=$formats ?><br /> <?php } ?>
<?php if(isset($taille_max_formatee)) { ?> Taille maximum : <?=$taille_max_formatee ?><?php } ?>
</p>
 
<form action="<?php $url_upload_image = clone($base_url);
$url_upload_image->setVariableRequete('m','annuaire_ajouter_image');
$url_upload_image->setVariableRequete('id_annuaire',$aa_id_annuaire);
if(isset($id_utilisateur)) {
$url_upload_image->setVariableRequete('id_utilisateur',$id_utilisateur);
}
 
echo $url_upload_image;
?>" method="post" enctype="multipart/form-data">
<label style="display:inline;"> <?= $amc_nom ?> : </label>
<input name="image_<?=$amc_id_champ?>" id="image_<?=$amc_id_champ?>" type="file" size="50" maxlength="<?php if(isset($taille_max)) { echo $taille_max; } else { echo '10000000'; } ?>" accept="image/*" />
<input type="submit" value="OK" />
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
</form>
</div>
/tags/v1.1-andromede/squelettes/champs/mail.tpl.html
New file
0,0 → 1,4
<label style="display:inline;"> <?= $amc_nom ?> : </label><input type="text" name="mail_<?=$amc_id_champ?>" id="mail_<?=$amc_id_champ?>" value="<?php if(isset($valeur_defaut['amv_valeur'])) { echo $valeur_defaut['amv_valeur']; } ?>"/>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/password.tpl.html
New file
0,0 → 1,5
<label style="display:inline;"> <?= $amc_nom ?> : </label><input type="password" name="password_<?=$amc_id_champ?>" id="password_<?=$amc_id_champ?>" value=""/>
<label style="display:inline;"> Confirmez le mot de passe : </label><input type="password" name="password_conf_<?=$amc_id_champ?>" id="password_conf_<?=$amc_id_champ?>" value=""/>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/text.tpl.html
New file
0,0 → 1,4
<label style="display:inline;"> <?= $amc_nom ?> : </label><input type="text" name="text_<?=$amc_id_champ?>" id="text_<?=$amc_id_champ?>" value="<?php if(isset($valeur_defaut['amv_valeur'])) { echo stripslashes($valeur_defaut['amv_valeur']); } ?>"/>
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/champs/checkbox.tpl.html
New file
0,0 → 1,17
<label style="display:inline;"> <?= $amc_nom ?> : </label>
<?php if (isset($liste_valeurs)) { ?>
<?php foreach($liste_valeurs as $valeur) : ?>
<span class="checkbox_alignee" >
<input class="groupe_checkbox" type="checkbox" name="checkbox_<?=$amc_id_champ.'['.$valeur['amo_id_ontologie'].']' ?>" id="checkbox_<?=$amc_id_champ.'['.$valeur['amo_id_ontologie'].']' ?>" <?php if ((isset($valeur_defaut['amv_valeur']) && ((is_array($valeur_defaut['amv_valeur'])
&& in_array($valeur['amo_id_ontologie'],$valeur_defaut['amv_valeur'])) || ($valeur['amo_id_ontologie'] == $valeur_defaut['amv_valeur'])))) { echo 'checked="checked"'; } ?> />
<label class="label_groupe_checkbox" name="checkbox_<?=$amc_id_champ ?>"
for="checkbox_<?=$valeur['amo_id_ontologie'] ?>"><?=$valeur['amo_nom'] ?></label>
</span>
<?php endforeach; ?>
<?php } else { ?>
</label> <input class="label_checkbox" type="checkbox" <?php if (isset($valeur_defaut) && $valeur_defaut['amv_valeur'] == '1') { echo "checked=checked"; } ?> name="checkbox_<?=$amc_id_champ ?>" id="checkbox_<?=$amc_id_champ ?>" />
<?php } ?>
<input type="hidden" name="checkbox_hidden_<?=$amc_id_champ ?>" id="checkbox_hidden_<?=$amc_id_champ ?>" value="checkbox_hidden_<?=$amc_id_champ ?>" />
<?php if(isset($erreurs[$amc_id_champ])) { ?>
<div style="color:#FF0000"> <?= $erreurs[$amc_id_champ] ?> </div>
<?php } ?>
/tags/v1.1-andromede/squelettes/elements/erreurs.tpl.html
New file
0,0 → 1,11
<?php if (isset($erreurs['titre'])): ?>
<h3 class="symbole_obligatoire"> <?=$erreurs['titre'];?> </h3>
<?php endif; ?>
 
<?php foreach($erreurs as $erreur) : ?>
<?php if (is_array($erreur)): ?>
<?php foreach($erreur as $erreur_detail) : ?>
<div class="erreur"><?=$erreur_detail;?></div>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
/tags/v1.1-andromede/squelettes/elements/pagination.tpl.html
New file
0,0 → 1,21
<?php if($page_precedente) { ?>
<a class="premiere_page" href="<?= $url_page_precedente ?>" title="Page précédente"> Page précédente </a>
<?php } ?>
 
<?php if($page_suivante) { ?>
<a class="derniere_page" href="<?= $url_page_suivante ?>" title="Page suivante"> Page suivante </a>
<?php } ?>
 
<div id="pages">
<?php foreach($url_pages as $num_page => $url) : ?>
<?php if($num_page == $numero_page) { ?>
<span id="page_courante">
<?php } else { ?>
<span>
<?php } ?>
<a class="premiere_page" href="<?= $url ?>" title="Page numéro <?=$num_page ?>"> <?=$num_page ?> </a>
</span>
<?php endforeach; ?>
</div>
 
<hr style="clear:both;visibility:hidden;" />
/tags/v1.1-andromede/squelettes/elements/blocage.tpl.html
New file
0,0 → 1,26
<?php
if(isset($champs['statut_utilisateur']['amv_valeur']) && $champs['statut_utilisateur']['amv_valeur'] == 1) {
$label = 'Débloquer';
$action = '0';
$titre = 'Cet utilisateur est bloqué';
$classe = 'conteneur_bloque';
} else {
$label = 'Bloquer';
$action = '1';
$titre = 'Bloquer cet utilisateur';
$classe = 'conteneur_non_bloque';
}
?>
 
<div id="conteneur_formulaire_blocage" class="conteneur_blocage <?= $classe ?>">
 
<h3> <?= $titre ?> </h3>
<form method="post" id="blocage" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_bloquer_debloquer_utilisateur');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
$url_form->setVariableRequete('action',$action);
echo $url_form; ?>" >
<input id="bouton_blocage" type="submit" name="bouton_blocage" value="<?=$label?>" />
</form>
</div>
/tags/v1.1-andromede/squelettes/gestion_annuaires/liste_annu.tpl.html
New file
0,0 → 1,44
<h2>Liste des annuaires</h2>
 
<p> <a href="<?php $url_ajout_metadonnee = clone($base_url);
$url_ajout_metadonnee->setVariableRequete('m','annuaire_formulaire_ajout');
echo $url_ajout_metadonnee; ?>"> Ajout d'un nouvel annuaire </a>
 
<?php if(!empty($annuaires)) { ?>
<table class="liste">
<tr>
<th></th>
<th></th>
<th>Nom</th>
<th>Description</th>
<th>Code</th>
</tr>
<?php foreach ($annuaires as $element) : ?>
<tr>
<td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_inscrits');
$url_detail->setVariableRequete('id_annuaire',$element['aa_id_annuaire']);
echo $url_detail; ?>" title="Voir les inscrits">
<img class="icone_moyenne" src="<?=$base_url_styles ?>squelettes/images/voir_inscrits.png"/> <br />
Voir les inscrits </a></td>
<td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire');
$url_detail->setVariableRequete('id_annuaire',$element['aa_id_annuaire']);
echo $url_detail; ?>" title="Afficher le détail de l'annuaire">
<img class="icone_moyenne" src="<?=$base_url_styles ?>squelettes/images/voir_champs.png"/> <br />
Voir les champs </a></td>
<td><?=$element['aa_nom'] ?></td>
<td><?=$element['aa_description'] ?></td>
<td><?=$element['aa_code'] ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php } else { ?>
 
<p> Aucun annuaire créé </p>
 
<?php } ?>
 
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/gestion_annuaires/annuaire.tpl.html
New file
0,0 → 1,123
<p><a href="<?php $url_retour = clone($base_url);
$url_retour->setVariableRequete('m','liste_annu');
echo $url_retour; ?>"> Retour à la liste des annuaires </a>
</p>
 
<h2>Détail de l'annuaire <?=$annuaire['informations']['aa_nom'] ?></h2>
<p><?=$annuaire['informations']['aa_description'] ?></p>
 
<h3> Informations </h3>
<table class="liste">
<tr>
<th>Identifiant d'annuaire</th>
<th>Nom</th>
<th>Description</th>
<th>Code</th>
</tr>
<tr>
<td><?=$annuaire['informations']['aa_id_annuaire'] ?></td>
<td><?=$annuaire['informations']['aa_nom'] ?></td>
<td><?=$annuaire['informations']['aa_description'] ?></td>
<td><?=$annuaire['informations']['aa_code'] ?></td>
</tr>
</table>
 
<hr />
 
<h3> Colonnes </h3>
<table class="liste">
<tr>
<th>Nom du champ</th>
<th>Type</th>
<th>Null</th>
<th>Clé</th>
<th>Défaut</th>
<th>Extra</th>
</tr>
<?php foreach ($annuaire['colonnes'] as $colonne) : ?>
<tr>
<td><?=$colonne['Field'] ?></td>
<td><?=$colonne['Type'] ?></td>
<td><?=$colonne['Null'] ?></td>
<td><?=$colonne['Key'] ?></td>
<td><?=$colonne['Default'] ?></td>
<td><?=$colonne['Extra'] ?></td>
</tr>
<?php endforeach; ?>
</table>
 
<hr />
 
<h3> Metadonnées </h3>
 
<p> <a href="<?php $url_ajout_metadonnee = clone($base_url);
$url_ajout_metadonnee->setVariableRequete('m','metadonnee_formulaire_ajout');
$url_ajout_metadonnee->setVariableRequete('amc_ce_annuaire',$annuaire['informations']['aa_id_annuaire']);
echo $url_ajout_metadonnee; ?>"> Ajout d'un nouveau champ </a>
</p>
 
<table class="liste">
<tr>
<th>Nom du champ</th>
<th>Type</th>
<th>Abreviation</th>
<th>Description</th>
<th>Longueur</th>
<th></th>
<th></th>
</tr>
<?php foreach ($metadonnees as $metacolonne) : ?>
<tr>
<td><?=$metacolonne['amc_nom'] ?></td>
<td><?=$metacolonne['amc_ce_nom_type_affichage'] ?></td>
<td><?=$metacolonne['amc_abreviation'] ?></td>
<td><?=$metacolonne['amc_description'] ?></td>
<td><?=$metacolonne['amc_longueur'] ?></td>
<td><a href="<?php $url_modif_metadonnee = clone($base_url);
$url_modif_metadonnee->setVariableRequete('m','metadonnee_formulaire_modification');
$url_modif_metadonnee->setVariableRequete('amc_id_champ',$metacolonne['amc_id_champ']);
echo $url_modif_metadonnee; ?>"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/modification.png"/> </a>
</td>
<td><a href="<?php $url_supp_metadonnee = clone($base_url);
$url_supp_metadonnee->setVariableRequete('m','metadonnee_suppression');
$url_supp_metadonnee->setVariableRequete('amc_id_champ',$metacolonne['amc_id_champ']);
$url_supp_metadonnee->setVariableRequete('amc_ce_annuaire',$annuaire['informations']['aa_id_annuaire']);
echo $url_supp_metadonnee; ?>"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/suppression.png"/> </a></td>
</tr>
<?php endforeach; ?>
</table>
 
<h3> Mappages de champs </h3>
 
<p> <a href="<?php $url_ajout_mappage = clone($base_url);
$url_ajout_mappage->setVariableRequete('m','mappage_formulaire_ajout');
$url_ajout_mappage->setVariableRequete('id_annuaire',$annuaire['informations']['aa_id_annuaire']);
echo $url_ajout_mappage; ?>"> Ajout d'un nouveau mappage de champ </a>
</p>
 
<table class="liste">
<tr>
<th>Nom du champ dans l'annuaire</th>
<th>Type</th>
<th>Nom du champ de métadonnées associé</th>
<th></th>
<th></th>
</tr>
<?php foreach ($champs_mappage[0] as $role => $champ_mappage) : ?>
<tr>
<td><?=$champ_mappage ?></td>
<td><?=$role ?></td>
<td><?php if(isset($champs_mappage[1][$role])) echo $metadonnees[$champs_mappage[1][$role]]['amc_nom']; ?></td>
<td><a href=""> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/modification.png"/> </a>
</td>
<td><a href=""> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/suppression.png"/> </a></td>
</tr>
<?php endforeach; ?>
</table>
 
 
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/gestion_annuaires/annuaire_ajout.tpl.html
New file
0,0 → 1,92
<h2>Ajout d'un nouvel annuaire</h2>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_ajout');
echo $url_form; ?>">
<label for="amo_nom">Nom de l'annuaire</label>
<input type="text" name="aa_nom" id="aa_nom" value="<?=$valeur['aa_nom'] ?>" />
<?php if(isset($erreurs_champs['aa_nom'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_nom'] ?>
</div>
<?php } ?>
<br />
<label for="amc_ce_type_affichage">Description</label>
<textarea class="champ_nom" name="aa_description" id="aa_description"><?=$valeur['aa_description'] ?> </textarea>
<?php if(isset($erreurs_champs['aa_description'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_description'] ?>
</div>
<?php } ?>
<br />
<label for="aa_bdd">Base de données (doit avoir été créee) </label>
<input type="text" name="aa_bdd" id="aa_bdd" value="<?=$valeur['aa_bdd'] ?>" />
<?php if(isset($erreurs_champs['aa_bdd'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_bdd'] ?>
</div>
<?php } ?>
<br />
<label for="aa_table">Nom de la table (si la table n'existe pas elle sera crée) </label>
<input type="text" name="aa_table" id="aa_table" value="<?=$valeur['aa_table'] ?>" />
<?php if(isset($erreurs_champs['aa_table'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_table'] ?>
</div>
<?php } ?>
<br />
<label for="aa_code">Code (utilisé pour préfixer les squelettes spécifiques à cet annuaire)</label>
<input type="text" name="aa_code" id="aa_code" value="<?=$valeur['aa_code'] ?>" />
<?php if(isset($erreurs_champs[aa_nom])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs[aa_nom] ?>
</div>
<?php } ?>
<br />
<label for="aa_champ_id">Nom du champ identifiant (doit être un auto increment)</label>
<input type="text" name="aa_champ_id" id="aa_champ_id" value="<?=$valeur['aa_champ_id'] ?>" />
<?php if(isset($erreurs_champs['aa_champ_id'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_champ_id'] ?>
</div>
<?php } ?>
<br />
<label for="aa_champ_nom">Nom du champ nom (doit être présent dans la table si elle existe déjà)</label>
<input type="text" name="aa_champ_nom" id="aa_champ_nom" value="<?=$valeur['aa_champ_nom'] ?>" />
<?php if(isset($erreurs_champs['aa_champ_nom'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_champ_nom'] ?>
</div>
<?php } ?>
<br />
<label for="aa_champ_mail">Nom du champ mail (doit être présent dans la table si elle existe déjà)</label>
<input type="text" name="aa_champ_mail" id="aa_champ_mail" value="<?=$valeur['aa_champ_mail'] ?>" />
<?php if(isset($erreurs_champs['aa_champ_mail'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_champ_mail'] ?>
</div>
<?php } ?>
<br />
<label for="aa_champ_pass">Nom du champ mot de passe (doit être présent dans la table si elle existe déjà)</label>
<input type="text" name="aa_champ_pass" id="aa_champ_pass" value="<?=$valeur['aa_champ_pass'] ?>" />
<?php if(isset($erreurs_champs['aa_champ_pass'])) { ?>
<div style="color:#FF0000">
<?=$erreurs_champs['aa_champ_pass'] ?>
</div>
<?php } ?>
<br />
<input type="submit" value="OK" /> <a href="<?=$base_url ?>"> Annuler </a>
</form>
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
/tags/v1.1-andromede/squelettes/cartes/france.tpl.html
New file
0,0 → 1,14
<!-- ANNUAIRE - DEBUT CARTE -->
<div id="annuaire_carto">
<h1>Carte des inscrits</h1>
<p>La couleur est proportionnelle au nombre d'inscrits. Vous pouvez cliquer sur la carte pour afficher les
inscrits du département.</p>
<?=$map;?>
<h2>Avertissement et déni de responsabilité :</h2>
<p style="width:800px;">La représentation et l'utilisation des frontières, des noms géographiques et autres données employés sur les cartes
et utilisés dans les listes, les tableaux, les documents et les bases de données de ce site ne sont pas garanties sans
erreurs, de même qu'elles n'engagent pas la responsabilité de l'association ni n'impliquent de reconnaissance officielle
de sa part.</p>
</div>
<!-- ANNUAIRE - FIN CARTE -->
 
/tags/v1.1-andromede/squelettes/cartes/continents.tpl.html
New file
0,0 → 1,13
<!-- ANNUAIRE - DEBUT CARTE -->
<div id="annuaire_carto">
<h1>Carte des inscrits</h1>
<p>La couleur est proportionnelle au nombre d'inscrits. Vous pouvez cliquer sur la carte pour afficher le détail d'un continent.</p>
<?=$map;?>
<h2>Avertissement et déni de responsabilité :</h2>
<p style="width:800px;">La représentation et l'utilisation des frontières, des noms géographiques et autres données employées sur les cartes
et utilisées dans les listes, les tableaux, les documents et les bases de données de ce site ne sont pas garanties sans
erreurs, de même qu'elles n'engagent pas la responsabilité de l'association ni n'impliquent de reconnaissance officielle
de sa part.</p>
</div>
<!-- ANNUAIRE - FIN CARTE -->
 
/tags/v1.1-andromede/squelettes/cartes/pays.tpl.html
New file
0,0 → 1,13
<!-- ANNUAIRE - DEBUT CARTE -->
<div id="annuaire_carto">
<h1>Carte des inscrits</h1>
<p>La couleur est proportionnelle au nombre d'inscrits. Vous pouvez cliquer sur la carte pour afficher le détail d'un pays.</p>
<?=$map;?>
<h2>Avertissement et déni de responsabilité :</h2>
<p style="width:800px;">La représentation et l'utilisation des frontières, des noms géographiques et autres données employées sur les cartes
et utilisées dans les listes, les tableaux, les documents et les bases de données de ce site ne sont pas garanties sans
erreurs, de même qu'elles n'engagent pas la responsabilité de l'association ni n'impliquent de reconnaissance officielle
de sa part.</p>
</div>
<!-- ANNUAIRE - FIN CARTE -->
 
/tags/v1.1-andromede/squelettes/ontologies/liste_des_listes.tpl.html
New file
0,0 → 1,43
<h2><?=$titre ?></h2>
 
<p> <a href="<?php $url_ajout = clone($base_url);
$url_ajout->setVariableRequete('m','liste_ontologie_formulaire_ajout');
$url_ajout->setVariableRequete('amo_ce_parent','0');
echo $url_ajout ?>">
Ajout d'une nouvelle liste
</a>
</p>
 
<table class="liste">
<tr>
<th></th>
<th>Identifiant </th>
<th>Nom</th>
<th>Abreviation</th>
<th>Description</th>
<th> </th>
<th> </th>
</tr>
<?php foreach ($ontologie as $element) : ?>
<tr><td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie');
$url_detail->setVariableRequete('id_liste',$element['amo_id_ontologie']);
echo $url_detail; ?>" title="Afficher le détail de la liste"> <img class="icone_moyenne_moins" src="<?=$base_url_styles ?>squelettes/images/voir_details_liste.png"/> </a></td>
<td><?=$element['amo_id_ontologie'] ?>
<td><?=$element['amo_nom'] ?></td>
<td><?=$element['amo_abreviation'] ?></td>
<td><?=$element['amo_description'] ?></td>
<td> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie_formulaire_modification');
$url_detail->setVariableRequete('amo_id_ontologie',$element['amo_id_ontologie']);
echo $url_detail; ?>" title="Modifier cette liste"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/modification.png"/> </a> </td>
<td> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie_suppression');
$url_detail->setVariableRequete('amo_id_ontologie',$element['amo_id_ontologie']);
echo $url_detail; ?>" title="Supprimer cette liste"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/suppression.png"/> </a> </td>
</tr>
<?php endforeach; ?>
</table>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/ontologies/liste_ontologie.tpl.html
New file
0,0 → 1,40
<h2><?=$informations['amo_nom'] ?> </h2>
<p><?php if($informations['amo_description'] != 'NULL') echo $informations['amo_description'] ; ?></p>
 
<p> <a href="<?php $url_ajout = clone($base_url);
$url_ajout->setVariableRequete('m','liste_ontologie_formulaire_ajout');
$url_ajout->setVariableRequete('amo_ce_parent', $informations['amo_id_ontologie']);
echo $url_ajout ?>">
Ajouter un nouvel élement
</a>
</p>
 
<table class="liste">
<tr>
<th>Identifiant</th>
<th>Nom</th>
<th>Abreviation</th>
<th>Description</th>
<th> </th>
<th> </th>
</tr>
<?php foreach ($ontologie as $element) : ?>
<tr>
<td><?=$element['amo_id_ontologie'] ?></td>
<td><?=$element['amo_nom'] ?></td>
<td><?=$element['amo_abreviation'] ?></td>
<td><?=$element['amo_description'] ?></td>
<td> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie_formulaire_modification');
$url_detail->setVariableRequete('amo_id_ontologie',$element['amo_id_ontologie']);
echo $url_detail; ?>" title="Modifier cet élément"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/modification.png"/> </a> </td>
<td> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie_suppression');
$url_detail->setVariableRequete('amo_id_ontologie',$element['amo_id_ontologie']);
echo $url_detail; ?>" title="Supprimer cet élément"> <img class="icone" src="<?=$base_url_styles ?>squelettes/images/suppression.png"/> </a> </td>
</tr>
<?php endforeach; ?>
</table>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/ontologies/liste_ontologie_ajout.tpl.html
New file
0,0 → 1,35
<div class="formulaire_annuaire_admin">
<h2>Ajout
 
<?php if($amo_ce_parent == 0) { ?>
d'une nouvelle liste d'ontologie</h2>
<?php } else { ?>
d'un nouvel élement</h2>
<?php } ?>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','liste_ontologie_ajout');
echo $url_form; ?>">
<label for="amo_nom">Nom <?php if($amo_ce_parent == 0) { ?>
de la liste </label>
<?php } else { ?>
de l'élement</label>
<?php } ?>
<textarea class="champ_nom" name="amo_nom" id="amo_nom"><?= $amo_nom ?></textarea>
<br />
<label for="amo_abreviation">Abr&eacute;viation</label>
<input type="text" name="amo_abreviation" id="amo_abreviation" value="<?=$amo_abreviation ?>" />
<br />
<label for="amo_description">Description</label>
<textarea name="amo_description" id="amo_description" ><?=$amo_description ?></textarea>
<br />
<input type="hidden" name="amo_ce_parent" value="<?=$amo_ce_parent ?>"/>
<input type="submit" value="OK"> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie');
$url_detail->setVariableRequete('id_liste','0');
echo $url_detail; ?>"> Annuler </a>
</form>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
</div>
/tags/v1.1-andromede/squelettes/ontologies/liste_ontologie_modification.tpl.html
New file
0,0 → 1,27
<div class="formulaire_annuaire_admin">
<h2>Modification d'une liste d'ontologies</h2>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','liste_ontologie_modification');
$url_form->setVariableRequete('id_ontologie','liste_ontologie_modification');
echo $url_form; ?>">
<label for="amo_nom">Nom de la liste</label>
<textarea class="champ_nom" name="amo_nom" id="amo_nom" value="<?= $valeurs['amo_nom'] ?>"><?= $valeurs['amo_nom'] ?></textarea>
<br />
<label for="amo_abreviation">Abr&eacute;viation</label>
<input type="text" name="amo_abreviation" id="amo_abreviation" value="<?= $valeurs['amo_abreviation'] ?>"/>
<br />
<label for="amo_description">Description</label>
<textarea name="amo_description" id="amo_description"><?=$valeurs['amo_description'] ?></textarea>
<br />
<input type="hidden" name="amo_id_ontologie" id="amo_id_ontologie" value="<?= $valeurs['amo_id_ontologie'] ?>"/>
<input type="hidden" name="amo_ce_parent" id="amo_ce_parent" value="<?= $valeurs['amo_ce_parent'] ?>"/>
<input type="submit" value="OK"> <a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','liste_ontologie');
$url_detail->setVariableRequete('id_liste',$valeurs['amo_ce_parent']);
echo $url_detail; ?>"> Annuler </a>
</form>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
</div>
/tags/v1.1-andromede/squelettes/annuaires/annuaire_inscrits.tpl.html
New file
0,0 → 1,28
<h2>Inscrits à l'annuaire <?=$annuaire['informations']['aa_nom'] ?></h2>
<p><?=$annuaire['informations']['aa_description'] ?></p>
 
 
<h3> Inscrits </h3>
 
<?php if(isset($pagination)) { echo $pagination; } ?>
<table class="liste">
<tr>
<th></th>
<?php foreach ($annuaire['colonnes'] as $colonne) : ?>
<th><?=$colonne ?></th>
<?php endforeach; ?>
</tr>
<?php foreach ($annuaire['inscrits'] as $inscrit) : ?>
<tr>
<td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$annuaire['informations']['aa_id_annuaire']);
$url_detail->setVariableRequete('id_utilisateur',$inscrit[$annuaire['colonnes']['champ_id']]);
echo $url_detail; ?>" title="Voir la fiche"> <img class="icone_moyenne" src="<?=$base_url_styles ?>squelettes/images/voir_fiche.png"/> </a></td>
<?php foreach ($inscrit as $valeur) : ?>
<td><?=$valeur ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</table>
/tags/v1.1-andromede/squelettes/annuaires/annuaire_tela_inscrits_resultat_recherche.tpl.html
New file
0,0 → 1,58
<script src="<?= $base_url_styles ?>squelettes/scripts/jquery.js" type="text/javascript"></script>
<script src="<?= $base_url_styles ?>squelettes/scripts/cocher.js" type="text/javascript"></script>
<h2>Résultat de la recherche</h2>
 
<?php if(!empty($resultats_recherche)) { ?>
<div id="resultat_recherche">
<?php if(count($nb_resultats) >= 1) { ?>
<h3>Il y a <?= $nb_resultats ?> inscrit<?php if($nb_resultats > 1) echo 's' ?> correspondant à votre recherche : </h3>
<?php if(isset($pagination)) { echo $pagination; } ?>
 
<form id="envoi_message" name="envoi_message" method="get" action="<? $url_message = clone($base_url); $url_message->setVariableRequete('m','annuaire_envoyer_message'); echo $url_message; ?>">
<table class="liste">
<tr><th></th><th></th><th>Nom</th><th>Prenom</th><th>Pays</th><th>Ville</th><th>Code Postal</th><th>Date d'inscription</th>
<?php foreach ($resultats_recherche as $id => $resultat) : ?>
<tr>
<td><input type="checkbox" name="destinataires[<?= $id ?>]" id="destinataires[<?= $id ?>]" />
<td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id);
echo $url_detail; ?>" title="Voir la fiche">
<?php if (isset($resultat['image']) && isset($resultat['image']['amv_valeur']) && trim($resultat['image']['amv_valeur']) != '') { ?>
<img class="avatar_petit" src="<?= ImageModele::obtenirEmplacementFichierParId($resultat['image']['amv_valeur'],'1','S') ?>" title="Cliquez pour accéder au profil" alt="avatar" /> </div></a>
<? } else { ?>
<img class="icone_moyenne" src="<?=$base_url_styles ?>squelettes/images/voir_fiche.png" title="Cliquez pour accéder au profil" alt="avatar standard" /> </a>
<? } ?>
</td>
<td class="texte_gauche"><b><?=$resultat['nom']['amv_valeur'] ?></b></td>
<td class="texte_gauche"><b><?=$resultat['prenom']['amv_valeur'] ?></b></td>
<td><?=$resultat['pays']['amv_valeur_affichage'] ?></td>
<td> <?=$resultat['ville']['amv_valeur'] ?></td>
<td><?=$resultat['code_postal']['amv_valeur'] ?></td>
<td><?=$resultat['date_inscription']['amv_valeur_affichage'] ?></td>
</tr>
<?php endforeach; ?>
</table>
<span id="conteneur_lien_cocher"></span>
<?php } else { ?>
<div> <h3> Aucun inscrit ne correspond aux critères de la recherche </h3></div>
<?php } ?>
<div id="formulaire_message" name="formulaire_message">
<h3> Envoyer un message </h3>
<label for="sujet_message"> Sujet : </label><br /> <input type=text id="sujet_message" name="sujet_message" /> <br />
<label for="contenu_message"> Contenu : </label><br /><textarea id="contenu_message" name="contenu_message" /></textarea>
<input type="hidden" value="annuaire_envoyer_message" id="m" name="m" /><br />
<input type="hidden" value="<?= $id_annuaire ?>" id="id_annuaire" name="id_annuaire" /><br />
<input type="submit" id="bouton_envoi_message" name="bouton_envoi_message" value="Envoyer">
</div>
</form>
</div>
<?php } else { ?>
<h3> Aucun inscrit ne correpond aux critères </h3>
<?php } ?>
/tags/v1.1-andromede/squelettes/annuaires/annuaire_inscription_reussie.tpl.html
New file
0,0 → 1,2
<p> Votre inscription a bien été prise en compte, un email de confirmation vient de vous être envoyé à l'adresse que vous avez indiquée.
Cliquez sur le lien qu'il contient pour confirmer votre inscription </p>
/tags/v1.1-andromede/squelettes/annuaires/annuaire_tela_inscrits_desinscription_confirmation.tpl.html
New file
0,0 → 1,7
<div class="information">
<h3> Vous êtes maintenant désinscrit du réseau </h3>
<p> Votre désinscription a bien été prise en compte <br />
A bientôt sur Tela Botanica !<br />
</p>
</div>
/tags/v1.1-andromede/squelettes/annuaires/resultat_recherche.tpl.html
New file
0,0 → 1,21
<h2>Résultat de la recherche</h2>
 
<?php if(count($nb_resultats) >= 1) { ?>
<h3>Il y a <?= $nb_resultats ?> inscrit<?php if($nb_resultats > 1) echo 's' ?> correspondant<?php if($nb_resultats > 1) echo 's' ?> aux critères : </h3>
<?php if(isset($pagination)) { echo $pagination; } ?>
<table class="liste">
<?php foreach ($resultats_recherche as $id => $resultat) : ?>
<tr>
<td><a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id);
echo $url_detail; ?>" title="Voir la fiche"> <img class="icone_moyenne" src="<?=$base_url_styles ?>squelettes/images/voir_fiche.png"/> </a>
</td>
<td> <?=$resultat[$mappage_nom_champs['champ_nom']]['amv_valeur'] ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php } else { ?>
<div> <h3> Aucun inscrit ne correspond aux critères de la recherche </h3></div>
<?php } ?>
/tags/v1.1-andromede/squelettes/annuaires/message_envoi_confirmation.tpl.html
New file
0,0 → 1,24
<?php if($moderation) { ?>
 
<div id="message_info attention">
<h3> Votre message est en attente de modération </h3>
<p> la messagerie ci-dessous est destinée à vous permettre d'échanger des messages entre inscrits au site de Tela Botanica, <br />
Afin de respecter la tranquillité de chacun, un message adressé à plus d'un certain nombre de destinataires est soumis
à l'approbation du modérateur. <br /><br />
Ne vous faites pas de souci ! Si votre message n'est ni une publicité ou un spam, soyez assuré qu'il sera accepté dans les plus brefs délais ! <br />
</p>
</div>
<?php } else { ?>
 
<div id="message_info">
<h3> Message envoyé ! </h3>
 
<p> Votre message a été envoyé avec succés <br />
Nous nous sommes permis d'y ajouter la mention
"Envoyé à travers le réseau Tela Botanica",<br />
afin que les destinataires soient assurés qu'il ne s'agit pas d'un courrier indésirable ! <br /><br />
Merci d'avoir communiqué à travers le reseau Tela Botanica !
</p>
</div>
 
<?php } ?>
/tags/v1.1-andromede/squelettes/annuaires/message_moderation_confirmation.tpl.html
New file
0,0 → 1,43
<?php if(isset($envoi_reussi)) { ?>
 
<div id="message_info">
<h3> Message envoyé avec succés ! </h3>
<p> Le message a été envoyé avec succés aux membres du réseau selectionnés <br />
accompagné de la mention "Envoyé à travers le réseau Tela Botanica",<br />
afin que les destinataires soient assurés qu'il ne s'agit pas d'un courrier indésirable !
</p>
</div>
 
<?php } elseif(isset($message_supprime)) { ?>
 
<div id="message_info">
<h3> Le message n'a été supprimé ! </h3>
<p> Le message a bien été supprimé ! <br />
Son expéditeur ne sera pas informé de cette suppression<br />
</p>
</div>
 
<?php } elseif(isset($envoi_echoue)) { ?>
 
<div id="message_info">
<h3> Le message n'a pas été envoyé ! </h3>
<p> Le message n'a pas pu étre envoyé ! <br />
Ce peut étre à cause d'un probléme du serveur mail ou bien un bug de l'application<br />
Veuillez contacter votre administrateur serveur ou la personne en charge de maintenir l'annuaire !
</p>
</div>
 
<?php } elseif(isset($message_inexistant)) { ?>
 
<div id="message_info">
<h3> Message inexistant ! </h3>
<p> Aucun message ne correspond à ce code de confirmation ! <br />
Rien n'a donc été envoyé !
</p>
</div>
 
<?php } ?>
/tags/v1.1-andromede/squelettes/annuaires/annuaire_tela_inscrits_inscription_confirmation.tpl.html
New file
0,0 → 1,55
<h3> Bienvenue sur Tela Botanica ! <h3>
 
<p> Votre inscription a été enregistrée avec succès </p>
 
<a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_detail; ?>" alt="Compléter votre profil" > <img src="<?=$base_url_styles ?>squelettes/images/completer_profil.png"/> </a>
 
<div id="choix_utilisateur">
 
<p>
Et maintenant ?
Profitez de toutes les opportunités que vous offrent le réseau TB pour échanger avec les telabotanistes et coopérer à des projets botaniques.
</p>
<ul id="liste_orientation">
<li><div><h3>1. Des actualités collaboratives </h3><br />
<span>Partagez votre point de vue, parlez-nous d'un ouvrage, diffusez des offres d'emplois...</span>
<ul>
<li> <a href="http://www.tela-botanica.org/actu/ecrire/articles_edit.php3?new=oui">Proposer un article </a></li>
<li> <a href="http://www.tela-botanica.org/page:ajouter_modifier_evenement">Annoncer un événement </a></li>
</ul>
</div>
</li>
<li><div><h3>2. Des espaces d'échange </h3><br />
<span>Créez, personnalisez votre page perso, communiquez avec les membres grâce à l'annuaire du réseau !</span>
<ul>
<li><a href="http://www.tela-botanica.org/page:inscription"> Enrichir son profil </a></li>
<li><a href="http://www.tela-botanica.org/page:membres_du_reseau_annuaire"> Rechercher des telabotanistes </a></li>
<li><a href="http://www.tela-botanica.org/page:liste_projets"> Discuter sur les forums </a></li>
</ul>
</div>
</li>
<li><div><h3> 3. Des projets collectifs </h3><br />
<span> Échangez sur la botanique avec les membres, construisez ensemble des projets et participez à la diffusion de la botanique.</span>
<ul>
<li><a href="http://www.tela-botanica.org/page:liste_projets"> Participer aux projets </a></li>
<li><a href="http://www.tela-botanica.org/page:syntheses_des_forums"> Consulter les synthèses des forums </a></li>
</div>
</li>
<li><div><h3> 4. Des outils de gestion de données (CEL) </h3><br />
<span> Créez et gérez en ligne vos observations de terrain, vos photos, et partagez-les avec les membres</span>
<ul>
<li><a href="http://www.tela-botanica.org/appli:cel"> Gérer mes relevés de terrain </a></li>
<li><a href="http://www.tela-botanica.org/appli:cel"> Stocker et organiser mes photos </a></li>
<li><a href="http://www.tela-botanica.org/actu/article3655.html"> Compléter e-flore dans vos données </a></li>
</ul>
</div>
</li>
</ul>
</div>
/tags/v1.1-andromede/squelettes/annuaires/information_simple.tpl.html
New file
0,0 → 1,4
<div class="information">
<h3> <?=$titre ?> </h3>
<p> <?=$message ?> </p>
</div>
/tags/v1.1-andromede/squelettes/scripts/jquery.js
New file
0,0 → 1,154
/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Sat Feb 13 22:33:48 2010 -0500
*/
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
/tags/v1.1-andromede/squelettes/scripts/inscription.js
New file
0,0 → 1,7
$("#lettre_14").ready(function() {
$("#lettre_14").attr('checked', true);
});
$("#option_2654").ready(function() {
$("#option_2654").attr('selected', 'selected');
});
/tags/v1.1-andromede/squelettes/scripts/cocher.js
New file
0,0 → 1,25
function cocherDecocher(cocher) {
$("#resultat_recherche :checkbox").attr('checked', cocher);
return false;
}
 
function creerLiensCocherTout() {
strLien = '<a id="cocher_tout" href=#> Tout cocher </a> / <a id="decocher_tout" href=#> Tout d&eacute;cocher </a>';
if($('#conteneur_lien_cocher') != null) {
$('#conteneur_lien_cocher').html(strLien);
$('#cocher_tout').bind('click',function() {
cocherDecocher(true);
return false;
});
$('#decocher_tout').bind('click',function() {
cocherDecocher(false);
return false;
});
}
}
 
$('#conteneur_lien_cocher').ready(creerLiensCocherTout);
/tags/v1.1-andromede/squelettes/scripts/jquery-ui.js
New file
0,0 → 1,143
/*!
* jQuery UI 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI
*/
(function(c){c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.2",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==
"hidden")return false;b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,
NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect",
"none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",
1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?
!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&&!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery);
;/*!
* jQuery UI Widget 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Widget
*/
(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype=
b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g=
b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();
this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f,
h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=
b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
;/*!
* jQuery UI Mouse 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Mouse
*
* Depends:
* jquery.ui.widget.js
*/
(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
;/*
* jQuery UI Position 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Position
*/
(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h=
0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+=
g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k,
elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"?
-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position=
"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery);
;/*
* jQuery UI Datepicker 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Datepicker
*
* Depends:
* jquery.ui.core.js
*/
(function(d){function J(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a,
b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.2"}});var y=(new Date).getTime();d.extend(J.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=
f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==
Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);
d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},
_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=
d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;
for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&
this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&
!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();
return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||
a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,
a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));
var c=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||
a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);
d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&
d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,
h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");
this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");
this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");
a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),
k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];
a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():
"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&
!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;
b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){a=this._getInst(d(a)[0]);
a.input&&a._selectingMonthYear&&!d.browser.msie&&a.input.focus();a._selectingMonthYear=!a._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,
"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||
this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;
for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+
s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,G){p=o(p)?G:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length)==p[w]){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;
case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,
k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?
c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)=="'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;
case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false,
e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),
e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},
_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1],
10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;
a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||
a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?
new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));
n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,
g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&
a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),G=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var K=this._getDefaultDate(a),H="",C=0;C<i[0];C++){for(var L=
"",D=0;D<i[1];D++){var M=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?
f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var N=0;N<A;N++){x+="<tr>";var O=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,I=B&&!G||!F[0]||j&&q<j||o&&q>o;O+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==M.getTime()&&g==a.selectedMonth&&
a._keyEvent||K.getTime()==q.getTime()&&K.getTime()==M.getTime()?" "+this._dayOverClass:"")+(I?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(I?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":I?'<span class="ui-state-default">'+q.getDate()+
"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=O+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");L+=x}H+=L}H+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
"");a._keyEvent=false;return H},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+
a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,
i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e=
a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new J;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.2";window["DP_jQuery_"+y]=d})(jQuery);
;
/tags/v1.1-andromede/squelettes/scripts/date.js
New file
0,0 → 1,3
$(document).ready(function() {
$("#datepicker").datepicker();
});
/tags/v1.1-andromede/squelettes/scripts/desinscription.js
New file
0,0 → 1,26
function modifierFormulaireSuppression() {
 
$('#suppression').bind('submit',function() {
// Si l'utilisateur confirme
mail = $('#mail_suppression').attr('value');
if(mail != null && mail != undefined) {
message = 'Etes vous sur de vouloir supprimer votre inscription avec le compte '+mail+' ?'
} else {
message = 'Etes vous sur de vouloir supprimer votre inscription ?';
}
if(window.confirm(message)) {
// On récupère l'attribut action du formulaire
url_action = $('#suppression').attr("action");
// et on le change pour sauter la page du formulaire de suppression
url_action = url_action.replace('annuaire_formulaire_suppression_inscription', 'annuaire_suppression_inscription');
$('#suppression').attr("action", url_action);
} else {
return false;
}
});
}
 
$('#suppression').ready(modifierFormulaireSuppression);
/tags/v1.1-andromede/squelettes/formulaires/inscription.tpl.html
New file
0,0 → 1,23
<h2> Inscription </h2>
<div id="contenu">
<form method="post" id="inscription" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_ajout_inscription');
echo $url_form;
?>">
<div><?=$champs[$mappage_nom_champs['champ_nom']] ?></div><br />
 
<div><?=$champs[$mappage_nom_champs['champ_mail']] ?></div><br />
<div><?=$champs[$mappage_nom_champs['champ_pass']] ?></div><br />
 
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>">
 
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="submit" value="Valider" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_structures_recherche.tpl.html
New file
0,0 → 1,28
<h2> Recherche d'une structure </h2>
 
<p> <h3> Rechercher une structure appartenant au reseau </h3>
</p>
<div id="contenu">
<form method="get" id="recherche" action="<?=$base_url?>">
<div><?=$champs['nom'] ?></div><br />
<div><?=$champs['type'] ?></div><br />
<div><?=$champs['pays'] ?></div><br />
<div><?=$champs['code_postal'] ?></div><br />
<div><?=$champs['mail'] ?></div><br />
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<div><label style="display:inline;margin-right:20px" for="exclusive"> Rechercher au moins un des termes </label><span><input type="checkbox" id="inclusive" name="inclusive" /></span></div><br />
<input type="hidden" id="m" name="m" value="annuaire_recherche_inscrit" />
<input type="hidden" id="id_annuaire" name="id_annuaire" value="<?=$aa_id_annuaire ?>" />
<input type="submit" value="Rechercher" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/modification.tpl.html
New file
0,0 → 1,45
<h2> Modification de votre inscription </h2>
<div id="contenu">
<form method="post" id="inscription_modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_modification_inscription');
echo $url_form;
?>">
 
<div><?=$champs[$mappage_nom_champs['champ_nom']] ?></div><br />
<div><?=$champs[$mappage_nom_champs['champ_mail']] ?></div><br />
<div><?=$champs[$mappage_nom_champs['champ_pass']] ?></div><br />
<?php if(isset($champs[$mappage_nom_champs['champ_prenom']])) { ?>
<div><?=$champs[$mappage_nom_champs['champ_prenom']] ?></div><br />
<?php } ?>
<?php if(isset($champs[$mappage_nom_champs['champ_pays']])) { ?>
<div><?=$champs[$mappage_nom_champs['champ_pays']] ?></div><br />
<?php } ?>
<?php if(isset($champs[$mappage_nom_champs['champ_ville']])) { ?>
<div><?=$champs[$mappage_nom_champs['champ_ville']] ?></div><br />
<?php } ?>
<?php if(isset($champs[$mappage_nom_champs['champ_code_postal']])) { ?>
<div><?=$champs[$mappage_nom_champs['champ_code_postal']] ?></div><br />
<?php } ?>
 
<input type="hidden" name="id_utilisateur" id="id_utilisateur" value="<?=$id_utilisateur ?>" />
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>" />
 
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="submit" value="Valider" />
<a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$aa_id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_detail; ?>" /> Annuler </a>
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_inscrits_inscription.tpl.html
New file
0,0 → 1,38
<script src="<?= $base_url_styles ?>squelettes/scripts/jquery.js" type="text/javascript"></script>
<script src="<?= $base_url_styles ?>squelettes/scripts/inscription.js" type="text/javascript"></script>
 
<h2> Inscription </h2>
 
<p> <h3> Devenez Tela botaniste <br />
Rejoignez le réseau de la botanique francophone</h3>
</p>
<div id="form_inscription">
<form method="post" id="inscription" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_ajout_inscription');
echo $url_form;
?>">
<div><?=$champs['nom'] ?></div><br />
<div><?=$champs['prenom'] ?></div><br />
<div><?=$champs['mail'] ?></div><br />
<div><?=$champs['pass'] ?></div><br />
<div><?=$champs['pays'] ?></div><br />
<div><?=$champs['ville'] ?></div><br />
<div><?=$champs['code_postal'] ?></div><br />
<div><?=$champs['experience_bota'] ?></div><br />
<div><?=$champs['lettre_actu'] ?></div><br />
<div><label> J'ai pris connaissance des </label> <?=$champs['conditions_utilisation'] ?></div> <br />
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>">
<input type="submit" value="Valider" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/recherche.tpl.html
New file
0,0 → 1,22
<h2> Recherche d'un utilisateur </h2>
 
<div id="contenu">
<form method="get" id="recherche" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('id_annuaire',$aa_id_annuaire);
$url_form->setVariableRequete('m','annuaire_recherche_inscrit');
echo $url_form;
?>">
<div><?=$champs[$mappage_nom_champs['champ_nom']] ?></div><br />
 
<div><?=$champs[$mappage_nom_champs['champ_prenom']] ?></div><br />
 
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="hidden" id="m" name="m" value="annuaire_recherche_inscrit" />
<input type="hidden" id="id_annuaire" name="id_annuaire" value="<?=$aa_id_annuaire ?>" />
<input type="submit" value="Rechercher" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/identification.tpl.html
New file
0,0 → 1,14
<p class="zone_alert">
Bonjour, l'accès à ces informations nécessite d'être inscrit au site</p>
<form id="form_connexion" style="clear: both;" class="form_identification" action="" method="post">
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel :</label>
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" /><br />
<input type="checkbox" value="o" tabindex="3" name="persistant" id="persistant" />
<label for="persistant" id="label_memoriser"> Mémoriser mon compte </label>
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_inscrits_modification.tpl.html
New file
0,0 → 1,89
<h2> Modification de votre inscription </h2>
<div id="form_modification_inscription">
<form method="post" id="inscription_modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_modification_inscription');
echo $url_form;
?>">
<h3> Mes coordonnées </h3>
<div><?=$champs['pseudo'] ?></div>
<div><?=$champs['utilise_pseudo'] ?></div><br />
<div><?=$champs['date_naissance'] ?></div><br />
<div><?=$champs['nom'] ?></div><br />
<div><?=$champs['prenom'] ?></div><br />
<div><?=$champs['mail'] ?></div><br />
<div><?=$champs['pass'] ?></div><br />
<div><?=$champs['pays'] ?></div><br />
<div><?=$champs['adresse'] ?></div>
<div><?=$champs['adresse_comp'] ?></div><br />
<div><?=$champs['ville'] ?></div><br />
<div><?=$champs['code_postal'] ?></div><br />
<div><?=$champs['profil_prive'] ?></div><br />
<h3> Mon parcours botanique </h3>
<div><?=$champs['presentation'] ?></div><br />
<div><?=$champs['experience_bota'] ?></div><br />
<div><?=$champs['rapport_activite_pro_bota'] ?></div><br />
<div><?=$champs['membre_asso_bota'] ?></div><br />
<!-- <div ><?=$champs['flores_utilisees'] ?></div><br /> -->
<!--<div><?=$champs['specialite_bota_groupes'] ?></div><br />
<div><?=$champs['specialite_bota_approche'] ?></div><br /> -->
<div><?=$champs['specialite_bota_geo'] ?></div><br />
<h3> Mon parcours de telabotaniste </h3>
<div><?=$champs['comment_connu_tela'] ?></div><br />
<div><?=$champs['etre_tela_botaniste'] ?></div><br />
<div><?=$champs['etre_plante_sauvage'] ?></div><br />
<h3> Environnement botanique </h3>
 
<div><?=$champs['mon_blog'] ?></div><br />
<div><?=$champs['sites_preferes'] ?></div><br />
<h3> Appartenance à un organisme </h3>
 
<div><?=$champs['organisme'] ?></div><br />
<div><?=$champs['fonction'] ?></div><br />
<div><?=$champs['lettre_actu'] ?></div><br />
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>">
<input type="hidden" name="id_utilisateur" id="id_utilisateur" value="<?=$id_utilisateur ?>">
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="submit" value="Valider" />
<a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$aa_id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_detail; ?>" /> Annuler </a>
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/oubli_mdp.tpl.html
New file
0,0 → 1,22
<h2> Oubli de mot de passe </h2>
 
<p>
Si vous avez perdu votre mot de passe <br />
Indiquez dans le champs ci-dessous l'adresse email que vous avez utilisé pour vous inscrire au site. <br />
Un nouveau mot de passe vous sera envoyé.
 
<div id="contenu">
<form method="post" id="oubli_mdp" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('id_annuaire',$aa_id_annuaire);
$url_form->setVariableRequete('m','annuaire_oubli_mdp');
echo $url_form;
?>">
<input type="text" id="mail" name="mail" />
<input type="submit" value="Envoyer le mot de passe par mail" />
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_structures_inscription.tpl.html
New file
0,0 → 1,47
<h2> Inscription d'une structure </h2>
 
<div id="choix_participation">
 
<a class="lien_en_ligne" href="<?=$base_url?>"> <img src="<?=$base_url_styles ?>squelettes/images/inscription.png"/> </a>
<a class="lien_en_ligne" href=""><img src="<?=$base_url_styles ?>squelettes/images/participer.png"/> </a>
<a class="lien_en_ligne" href=""><img src="<?=$base_url_styles ?>squelettes/images/soutenir.png"/> </a>
 
</div>
 
<p> <h3> Rejoignez le réseau de la botanique francophone</h3>
</p>
<div id="contenu">
<form method="post" id="inscription" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_ajout_inscription');
echo $url_form;
?>">
<div><?=$champs['nom'] ?></div><br />
 
<div><?=$champs['mail'] ?></div><br />
<div><?=$champs['type'] ?></div><br />
<div><?=$champs['description'] ?></div><br />
 
<div><?=$champs['pass'] ?></div><br />
 
<div><?=$champs['pays'] ?></div><br />
 
<div><?=$champs['code_postal'] ?></div><br />
 
<div><?=$champs['adresse'] ?></div><br />
 
<div><?=$champs['lettre_actu'] ?></div><br />
 
<div><?=$champs['conditions_utilisation'] ?></div><br />
 
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>">
 
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="submit" value="Valider" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/suppression_inscription.tpl.html
New file
0,0 → 1,16
<div class="attention"> <h3> Vous êtes sur le point de supprimer votre inscription </h3>
 
<p> En cliquant sur supprimer, vous effacerez toutes les données associées à votre compte</p>
<form method="post" id="suppression" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_suppression_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form; ?>" >
<input id="bouton_suppression" type="submit" name="bouton_suppression" value="Supprimer" /><a href="<?php $url_annuler = clone($base_url);
$url_annuler->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_annuler->setVariableRequete('id_annuaire',$id_annuaire);
$url_annuler->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_annuler; ?>" > Annuler </a>
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_inscrits_recherche.tpl.html
New file
0,0 → 1,37
<h2> Recherche d'un utilisateur </h2>
 
<p> <h3> Rechercher un membre du reseau </h3>
</p>
<div id="form_recherche">
<form method="get" id="recherche" action="<?=$base_url?>">
<div><?=$champs['pseudo'] ?></div><br />
<div><?=$champs['nom'] ?></div><br />
<div><?=$champs['prenom'] ?></div><br />
<?php if($est_admin) { ?>
<div><?=$champs['mail'] ?></div><br />
<?php } ?>
<div><?=$champs['specialite_bota_groupes'] ?></div><br />
<div><?=$champs['specialite_bota_approche'] ?></div><br />
<div><?=$champs['code_postal'] ?></div><br />
<div><?=$champs['experience_bota'] ?></div><br />
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<div><label style="display:inline;margin-right:20px" for="exclusive"> Rechercher au moins un des termes </label><span><input type="checkbox" id="inclusive" name="inclusive" /></span></div><br />
<input type="hidden" id="m" name="m" value="annuaire_recherche_inscrit" />
<input type="hidden" id="id_annuaire" name="id_annuaire" value="<?=$aa_id_annuaire ?>" />
<input type="submit" value="Rechercher" />
</form>
</div>
/tags/v1.1-andromede/squelettes/formulaires/annuaire_tela_structures_modification.tpl.html
New file
0,0 → 1,40
<h2> Modification de votre inscription </h2>
<div id="contenu">
<form method="post" id="inscription_modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_modification_inscription');
echo $url_form;
?>">
<div><?=$champs['nom'] ?></div><br />
 
<div><?=$champs['mail'] ?></div><br />
<div><?=$champs['type'] ?></div><br />
<div><?=$champs['description'] ?></div><br />
 
<div><?=$champs['pass'] ?></div><br />
 
<div><?=$champs['pays'] ?></div><br />
 
<div><?=$champs['code_postal'] ?></div><br />
 
<div><?=$champs['adresse'] ?></div><br />
 
<div><?=$champs['lettre_actu'] ?></div><br />
<input type="hidden" name="aa_id_annuaire" id="aa_id_annuaire" value="<?=$aa_id_annuaire ?>">
<input type="hidden" name="id_utilisateur" id="id_utilisateur" value="<?=$id_utilisateur ?>">
<?php if(isset($erreurs)) { ?>
<?php foreach($erreurs as $erreur) : ?>
<div style="color:#FF0000"> <?=$erreur ?> </div>
<?php endforeach; ?>
<?php } ?>
<input type="submit" value="Valider" />
<a href="<?php $url_detail = clone($base_url);
$url_detail->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_detail->setVariableRequete('id_annuaire',$aa_id_annuaire);
$url_detail->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_detail; ?>" /> Annuler </a>
</form>
</div>
/tags/v1.1-andromede/squelettes/css/annuaire_complexe.css
New file
0,0 → 1,408
img.icone {
 
height:16px;
width:16px;
margin: 5px;
border: none;
}
 
img.icone_moyenne_moins {
 
height:20px;
width: 20px;
margin: 5px;
border: none;
}
 
img.icone_moyenne {
 
height:24px;
width: 24px;
margin: 5px;
border: none;
}
 
img.icone_grande {
 
height:50px;
width:50px;
margin: 5px;
border: none;
}
 
td, th {
padding: 2px;
text-align: center;
}
 
.liste td.texte_gauche {
text-align: left;
padding-left: 5px;
}
 
.gestion td {
padding-top : 5px;
padding-bottom : 5px;
padding-right : 15px;
}
 
label {
float: none !important;
}
 
a > .icone {
 
text-align:center;
}
 
.texte_centre {
text-align: center;
}
.texte_centre > img {
display:table-cell;
}
 
.premiere_page {
float:left;
margin:5px
}
 
.derniere_page {
float:right;
margin:5px;
}
 
#pages {
margin-left: auto;
margin-right: auto;
width: 80%;
text-align: center;
}
 
#page_courante a {
color: #FFD700;
}
 
.centre {
margin-top:10%;
margin-left:20%;
min-height:500px;
}
 
.gauche {
float:left;
margin-right: 20px;
}
 
.droite {
float:right;
clear:right;
}
 
img {
border: none;
}
 
#avatar {
margin-left: 10px;
}
 
.avatar_petit {
max-height: 70px;
max-width: 70px;
}
 
#inscription > div {
margin-top: 5px;
margin-bottom: 5px;
}
 
#fiche_utilisateur, {
background-color:#FAFAFA;
border:1px solid #F2F2F2;
margin:10px;
padding-bottom: 10px;
}
 
#profil {
border:1px solid #F2F2F2;
margin:10px;
padding-bottom: 10px;
-moz-border-radius: 2em;
}
 
.element_profil {
font-size:1.1em;
padding-top: 2px;
padding-left: 25px;
padding-bottom: 8px;
color:#000000;
}
 
.valeur_profil {
font-weight:bold;
}
 
#profil, .resume_conteneur {
border:5px solid #F2F2F2;
margin:10px;
padding-bottom: 10px;
}
 
.info_resume {
margin-left:20px;
}
 
form#recherche {
padding: 10px 0 10px 10px;
}
 
#envoi_message {
background-color: #FFFFFF;
}
 
form#suppression, form#modification, form#blocage {
display: inline;
border: none;
background-color: inherit
}
 
form.form_bouton {
background-color: none !important;
border: none !important;
}
 
.conteneur_blocage {
padding: 0px 10px 10px 10px;
width: 250px;
margin: 10px
}
 
.conteneur_bloque {
border:1px solid #FF6347;
background-color: #FCCCCF;
}
 
.conteneur_non_bloque {
border:1px solid #A6C39E;
background-color: #D6FCCD;
}
 
ul#liste_orientation > li {
margin: 20px
}
 
.lien_en_ligne {
margin-right: 10px
}
 
#resume {
min-height: 1600px;
}
 
.resume_conteneur {
display: block;
width: 45%;
margin-left: 10px;
padding: 10px;
-moz-border-radius: 2em;
clear : left;
}
 
.resume {
width:100%;
}
 
.gestion_conteneur {
width: 80%;
margin-left: 10px;
padding: 0px;
}
 
.info_application {
font-weight: bold;
margin-left: 20px;
}
 
#annuaire_carto, #cartographie {
padding-left:20px;
}
 
form#envoi_message, form#envoi_message > table {
background-color:#FFFFFF;
border: none;
margin: 2px;
}
 
textarea#contenu_message {
width: 90%;
}
 
#formulaire_message {
background-color:#FAFAEA;
border:1px solid #F2F2F2;
padding: 0px 10px 10px 10px;
width: 90%;
}
 
#carte_id {
border:5px solid #F2F2F2;
margin:10px;
padding-bottom: 30px;
width: 350px;
height: 90px;
-moz-border-radius: 2em;
}
 
#carte_infos span {
padding-top: 2px;
}
 
#carte_id #avatar {
padding-top: 7px;
}
 
.checkbox_alignee {
display: inline-block;
margin: 1px;
margin-right:20px;
}
 
label.label_groupe_checkbox {
font-weight: normal !important;
display:inline !important;
}
 
.label_checkbox {
margin-right:2px;
display:inline !important;
}
 
.groupe_checkbox {
margin-right:2px;
}
 
textarea.annuaire {
width: 400px !important;
height: 200px !important;
}
 
input.date_annuaire {
width: 80px;
}
 
.information {
margin: 10px;
}
 
.champ_nom {
height: 50px !important;
}
 
#form_connexion #label_memoriser {
display: inline;
}
 
#fiche_privee {
background-color:#EBCC77;
border:1px solid #E4B842;
max-width:800px;
}
 
#texte_profil_prive {
 
vertical-align:top;
width:100%;
text-align:center;
}
 
#fiche_privee img {
margin-top: -6px;
}
 
#inscription label {
font-weight: bold;
display: inline;
}
 
.liste_horizontale {
clear: both;
}
 
.liste_horizontale li {
float:left;
margin-right: 20px !important;
margin-left:2px !important;
float:left; /*pour IE*/
}
 
.liste_horizontale {
padding:0;
margin:0;
list-style-type:none;
}
 
.liste_horizontale li a {
display:block;
float:left;
width:200px;
background-color:#EBCC77;
background-image : none;
color:black;
text-decoration:none;
text-align:center;
font-weight: bold;
padding:5px;
margin-left: 10px;
margin-top: 10px;
border:2px solid;
/*pour avoir un effet "outset" avec IE :*/
border-color:#996F18;
-moz-border-radius: 0.9em;
}
 
.liste_horizontale li a:hover {
background-color:#D3D3D3;
border-color:#696969 #DCDCDC #DCDCDC #696969;
}
#page_en_cours a {
background-color:#996F18;
border-color:#EBCC77;
}
.liste_horizontale li.lien_participer a {
background-color:#CFDB86 !important;
border-color:#03642C !important;
}
 
.liste_horizontale li.lien_participer a:hover {
border-color:#696969 #FFFFFF #DCDCDC #696969 !important;
}
 
.lien_participer#page_en_cours a {
background-color:#639F13 !important;
border-color:#CFDB86 !important;
}
 
 
.separation {
visibility:hidden;
clear:both;
margin-bottom: 4px;
margin-top: 4px;
}
 
 
 
 
.formulaire_annuaire_admin textarea {
width: 400px !important;
height: 200px !important;
}
 
.formulaire_annuaire_admin input {
padding-left: 5px;
}
/tags/v1.1-andromede/squelettes/css/annuaire.css
New file
0,0 → 1,66
#zone_contenu_corps {
padding: 10px;
}
 
/*--------------------------------------------------------------------------------------------------------------*/
/* Tableau du chronométrage du programme */
 
#pied_texte #chrono {
text-align: center;
margin:0 auto;}
#chrono table {
display:block;
border:3px solid #6495ed;
border-collapse:collapse;}
#chrono thead, tfoot {
background-color:#D0E3FA;
border:1px solid #6495ed;}
#chrono tbody {
background-color:#FFFFFF;
border:1px solid #6495ed;}
#chrono th {
font-family:monospace;
border:1px dotted #6495ed;
padding:5px;
background-color:#EFF6FF;
width:25%;}
#chrono td {
font-family:sans-serif;
font-size:80%;
border:1px solid #6495ed;
padding:5px;
text-align:center;}
#chrono caption {
font-family:sans-serif;
text-align: center;
width:90%;
margin:auto;}
.debogage{
color:black;
border:3px solid #6495ed;}
.debogage_fichier, .debogage_ligne{
font-size:10px;
color:#A9A9A9;}
/*----------------------------------------------------------------------------------------------------------*/
/* Style de l'application */
.liste td {
text-align:center;
}
 
.liste td, .liste th {
border:1px solid black;
}
 
th {
height: 40px;
}
 
.liste th, .liste th a {
color:black;
margin:0 5px;
}
 
.liste th {
text-align:center;
}
/tags/v1.1-andromede/squelettes/index_annuaire.tpl.html
New file
0,0 → 1,22
<h2> Menu principal </h2>
 
<div id="conteneur_choix" class="centre">
<div class="gauche">
<a class="texte_centre" href="<?php $url_annuaires = clone($base_url);
$url_annuaires->setVariableRequete('m','liste_annu');
echo $url_annuaires;?>" title="Accéder à l'interface de gestion des annuaires">
<img src="<?=$base_url_styles ?>/squelettes/images/logo_annuaire.png"/>
<h1>Gérer les annuaires</h1>
</a>
</div>
 
<div class="gauche">
<a class="texte_centre" href="<?php $url_ontologies = clone($base_url);
$url_ontologies->setVariableRequete('m','liste_listes');
echo $url_ontologies;?>" title="Accéder à l'interface de gestion des ontologie">
<img src="<?=$base_url_styles ?>squelettes/images/logo_ontologie.png"/>
<h1> Gérer les listes d'ontologies </h1>
</a><br />
</div>
</div>
/tags/v1.1-andromede/squelettes/navigation/bandeau.tpl.html
New file
0,0 → 1,36
<ul class="liste_horizontale">
<li <?php if($page == 'fiche') {echo 'id="page_en_cours"'; } ?> >
<a href="<?php $url_profil = clone($base_url);
$url_profil->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_profil->setVariableRequete('id_annuaire',$id_annuaire);
$url_profil->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_profil; ?>"> Profil </a>
</li>
<li <?php if($page == 'resume') {echo 'id="page_en_cours"'; } ?> >
<a href="<?php $url_resume = clone($base_url);
$url_resume->setVariableRequete('m','annuaire_fiche_resume_consultation');
$url_resume->setVariableRequete('id_annuaire',$id_annuaire);
$url_resume->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_resume; ?>"> Mes contributions au réseau </a>
</li>
<?php if($identification_id === $id_utilisateur || $est_admin) { ?>
<li <?php if($page == 'gestion') {echo 'id="page_en_cours"'; } ?> >
<a href="<?php $url_gestion = clone($base_url);
$url_gestion->setVariableRequete('m','annuaire_fiche_gestion_consultation');
$url_gestion->setVariableRequete('id_annuaire',$id_annuaire);
$url_gestion->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_gestion; ?>"> Mes inscriptions </a>
</li>
<?php } ?>
<li class="lien_participer" <?php if($page == 'participer') {echo 'id="page_en_cours"'; } ?> >
<a href="<?php $url_resume = clone($base_url);
$url_resume->setVariableRequete('m','annuaire_afficher_page');
$url_resume->setVariableRequete('page','participer');
$url_resume->setVariableRequete('id_annuaire',$id_annuaire);
$url_resume->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_resume; ?>"> Participer </a>
</li>
</ul>
 
<hr class="separation" />
/tags/v1.1-andromede/squelettes/navigation/menu.tpl.html
New file
0,0 → 1,32
<ul>
<li>
<a href="<?php $url_profil = clone($base_url);
$url_profil->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_profil->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_profil; ?>"> Mon profil </a>
</li>
<li>
<a href="<?php $url_resume = clone($base_url);
$url_resume->setVariableRequete('m','annuaire_fiche_resume_consultation');
$url_resume->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_resume; ?>"> Ma page perso </a>
</li>
<li>
<a href="<?php $url_gestion = clone($base_url);
$url_gestion->setVariableRequete('m','annuaire_fiche_gestion_consultation');
$url_gestion->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_gestion; ?>"> Mes inscriptions </a>
</li>
<li>
<a href="<?php $url_carto = clone($base_url);
$url_carto->setVariableRequete('m','annuaire_afficher_carte');
$url_carto->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_carto; ?>"> Voir la carte des inscrits </a>
</li>
<li>
<a href="<?php $url_recherche = clone($base_url);
$url_recherche->setVariableRequete('m','annuaire_afficher_formulaire_recherche');
$url_recherche->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_recherche; ?>"> Rechercher des membres du reseau </a>
</li>
</ul>
/tags/v1.1-andromede/squelettes/navigation/menu_admin.tpl.html
New file
0,0 → 1,10
<ul>
<li><a href="<?php $url_annuaires = clone($base_url);
$url_annuaires->setVariableRequete('m','liste_listes');
echo $url_annuaires; ?> ">G&eacute;rer les listes d'ontologies </a>
</li>
<li><a href="<?php $url_annuaires = clone($base_url);
$url_annuaires->setVariableRequete('m','liste_annu');
echo $url_annuaires; ?>">G&eacute;rer les annuaires </a>
</li>
</ul>
/tags/v1.1-andromede/squelettes/pages/participer.tpl.html
New file
0,0 → 1,46
<div id="navigation_annuaire"> <?=$navigation ?> </div>
 
<div id="choix_utilisateur">
 
<h3>
Profitez de toutes les opportunités que vous offre le réseau TB pour échanger avec les telabotanistes et coopérer à des projets botaniques.
</h3>
<ul id="liste_orientation">
<li><div><h3>1. Des actualités collaboratives </h3>
<span>Partagez votre point de vue, parlez-nous d'un ouvrage, diffusez des offres d'emplois...</span>
<ul>
<li> <a href="http://www.tela-botanica.org/actu/ecrire/articles_edit.php3?new=oui">Proposer un article </a></li>
<li> <a href="http://www.tela-botanica.org/page:ajouter_modifier_evenement">Annoncer un évènement </a></li>
</ul>
</div>
</li>
<li><div><h3>2. Des espaces d'échange </h3>
<span>Créez, personnalisez votre page perso, communiquez avec les membres grâce à l'annuaire du réseau !</span>
<ul>
<li><a href="http://www.tela-botanica.org/page:inscription"> Enrichir son profil </a></li>
<li><a href="http://www.tela-botanica.org/page:membres_du_reseau_annuaire"> Rechercher des telabotanistes </a></li>
<li><a href="http://www.tela-botanica.org/page:liste_projets"> Discuter sur les forums </a></li>
</ul>
</div>
</li>
<li><div><h3> 3. Des projets collectifs </h3>
<span> Échangez sur la botanique avec les membres, construisez ensemble des projets et participez à la diffusion de la botanique.</span>
<ul>
<li><a href="http://www.tela-botanica.org/page:liste_projets"> Participer aux projets </a></li>
<li><a href="http://www.tela-botanica.org/page:syntheses_des_forums"> Consulter les synthèses des forums </a></li>
</div>
</li>
<li><div><h3> 4. Des outils de gestion de données (CEL) </h3>
<span> Créez et gérez en ligne vos observations de terrain, vos photos, et partagez-les avec les membres</span>
<ul>
<li><a href="http://www.tela-botanica.org/appli:cel"> Gérer mes relevés de terrain </a></li>
<li><a href="http://www.tela-botanica.org/appli:cel"> Stocker et organiser mes photos </a></li>
<li><a href="http://www.tela-botanica.org/actu/article3655.html"> Compléter e-flore dans vos données </a></li>
</ul>
</div>
</li>
</ul>
</div>
/tags/v1.1-andromede/squelettes/fiches/annuaire_tela_structures_fiche.tpl.html
New file
0,0 → 1,60
<script src="<?= $base_url ?>/annuaire/squelettes/scripts/jquery.js" type="text/javascript"></script>
<script src="<?= $base_url ?>/annuaire/squelettes/scripts/desinscription.js" type="text/javascript"></script>
 
<div id="fiche_utilisateur">
<h2> Fiche de la structure <?= $champs['champ_nom']['amv_valeur_affichage'] ?></h2><br />
 
<?php if (isset($champs['image']) && isset($champs['image']['amv_valeur_affichage'])) { ?>
<div id="avatar" class="gauche">
<a href="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form;?>" >
<img src="<?= $champs['image']['amv_valeur_affichage'] ?>" title="avatar" /> </div> <br />
</a>
<?php } else { ?>
<div id="avatar" class="gauche">
<a href="<?php $url_image = clone($base_url);
$url_image->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_image->setVariableRequete('id_annuaire',$id_annuaire);
$url_image->setVariableRequete('id_utilisateur',$champs['champ_id']['amv_valeur_affichage']);
echo $url_image;?>" >
<img src="<?= $base_url ?>/annuaire/squelettes/images/avatar_defaut.gif" title="pas encore d'avatar ? cliquez pour ajouter le votre !" />
</a>
</div> <br />
<?php } ?>
<div><h3><?=$champs['nom']['amv_valeur_affichage'] ?></h3></div>
<div><h3><?=$champs['mail']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Type de structure : <?=$champs['type']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Description : <?=$champs['description']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Pays : <?=$champs['pays']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Code postal : <?=$champs['champ_code_postal']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Adresse : <?=$champs['adresse']['amv_valeur_affichage'] ?></h3></div>
<div><h3>Inscrit à la lettre d'actualité : <?=$champs['champ_lettre']['amv_valeur_affichage'] ?></h3></div>
 
<form method="post" id="modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_modification_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form;?>" >
<input id="bouton_modification" type="submit" name="bouton_modification" value="Modifier" />
</form>
 
<form method="post" id="suppression" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_suppression_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form; ?>" >
<input id="bouton_suppression" type="submit" name="bouton_suppression" value="Supprimer" />
</form>
 
</div>
/tags/v1.1-andromede/squelettes/fiches/annuaire_tela_inscrits_gestion_inscription.tpl.html
New file
0,0 → 1,68
<script src="<?= $base_url_styles ?>squelettes/scripts/jquery.js" type="text/javascript"></script>
<script src="<?= $base_url_styles ?>squelettes/scripts/desinscription.js" type="text/javascript"></script>
 
<div id="navigation_annuaire"> <?=$navigation ?> </div>
 
<div id="resume">
<?= $carte_id ?>
<hr style="clear:both;visibility:hidden" />
<div class="resume">
<h2> Mon inscription au reseau </h2>
<table class="resume_conteneur">
<tbody >
<tr class="gestion">
<td><b><a href="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_fiche_utilisateur_consultation');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form; ?>" > Vous êtes inscrit au réseau Tela Botanica </a></b>
</td>
<td>
<form method="post" id="suppression" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_suppression_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form; ?>" >
<input type="hidden" name="mail_suppression" id="mail_suppression" value="<?= $champs['mail']['amv_valeur'] ?>"
<input id="bouton_suppression" type="submit" name="bouton_suppression" value="Se desinscrire" />
</form>
</td>
</tr>
</tbody>
</table>
</div>
 
<?php foreach($resumes as $resume) : ?>
<div class="resume">
<h2> <?= $resume['titre'] ?></h2>
<table class="resume_conteneur">
<tbody >
<?php if(!empty($resume['elements'])) { ?>
<?php foreach($resume['elements'] as $element) : ?>
<tr class="gestion">
<td><b><a href="<?= $element['lien']?>" > <?=$element['element'] ?> </a></b></td>
<?php if(isset($element['lien_desinscrire'])) { ?>
<td>
<form class="form_bouton" action="<?= $base_url_application.'/jrest/ExecuteurLien'.'/'.str_replace('/', '_', base64_encode($element['lien_desinscrire'])).'/'.str_replace('/', '_', base64_encode($url_cette_page)) ?>">
<input type="submit" value="<?= $element['intitule_lien'] ?>" />
</form>
</td>
<? } ?>
</tr>
<?php endforeach ?>
<?php } else { ?>
<tr class="gestion"><td> <?= $resume['message'] ?> </td> </tr>
<?php } ?>
</tbody>
</table>
<?php if(isset($resume['info'])) { ?>
<span class="info_application"><?= $resume['info'] ?></span>
<? } ?>
</div>
<?php endforeach ?>
</div>
/tags/v1.1-andromede/squelettes/fiches/fiche.tpl.html
New file
0,0 → 1,40
<div id="fiche_utilisateur">
<h2> Fiche de l'utilisateur <?= $champs[$mappage_nom_champs['champ_nom']]['amv_valeur_affichage'] ?> <?php if(isset($mappage_nom_champs['champ_prenom']) && isset($champs[$mappage_nom_champs['champ_prenom']])) { ?><?=$champs[$mappage_nom_champs['champ_prenom']]['amv_valeur_affichage'] ?><?php } ?>
</h2>
 
<div class="element_profil">Nom : <?=$champs[$mappage_nom_champs['champ_nom']]['amv_valeur_affichage'] ?></div>
<?php if(isset($mappage_nom_champs['champ_prenom']) && isset($champs[$mappage_nom_champs['champ_prenom']])) { ?>
<div class="element_profil">Prenom : <?=$champs[$mappage_nom_champs['champ_prenom']]['amv_valeur_affichage'] ?></div>
<?php } ?>
<?php if(isset($mappage_nom_champs['champ_pays']) && isset($champs[$mappage_nom_champs['champ_pays']])) { ?>
<div class="element_profil">Pays : <?=$champs[$mappage_nom_champs['champ_pays']]['amv_valeur_affichage'] ?></div>
<?php } ?>
<?php if(isset($mappage_nom_champs['champ_ville']) && isset($champs[$mappage_nom_champs['champ_ville']])) { ?>
<div class="element_profil">Ville : <?=$champs[$mappage_nom_champs['champ_ville']]['amv_valeur_affichage'] ?></div>
<?php } ?>
<?php if(isset($mappage_nom_champs['champ_prenom']) && isset($champs[$mappage_nom_champs['champ_code_postal']])) { ?>
<div class="element_profil">Code Postal : <?=$champs[$mappage_nom_champs['champ_code_postal']]['amv_valeur_affichage'] ?></div>
<?php } ?>
 
<?php if($identification_id == $id_utilisateur || $est_admin) { ?>
<form method="post" id="modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_modification_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form;?>" >
<input id="bouton_modification" type="submit" name="bouton_modification" value="Modifier" />
</form>
 
<form method="post" id="suppression" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_suppression_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form; ?>" >
<input id="bouton_suppression" type="submit" name="bouton_suppression" value="Supprimer" />
</form>
<? } ?>
</div>
/tags/v1.1-andromede/squelettes/fiches/annuaire_tela_inscrits_carte_id.tpl.html
New file
0,0 → 1,31
<div id="carte_id">
<span id="avatar" class="gauche">
<?php if (isset($champs['image']) && isset($champs['image']['amv_valeur_affichage'])) { ?>
<a href="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
$url_form->setVariableRequete('id_champ_image',$champs['image']['amv_ce_colonne']);
echo $url_form;?>" >
<img src="<?= $champs['image']['amv_valeur_affichage'] ?>" title="avatar" />
</a>
<?php } else { ?>
<a href="<?php $url_image = clone($base_url);
$url_image->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_image->setVariableRequete('id_annuaire',$id_annuaire);
$url_image->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_image;?>" >
<img src="<?= $base_url_styles ?>squelettes/images/avatar_defaut.gif" title="pas encore d'avatar ? cliquez pour ajouter le votre !" />
</a>
<?php } ?>
</span>
<span id="carte_infos"><span><b><?=$champs['nom']['amv_valeur_affichage']?> <?=$champs['prenom']['amv_valeur_affichage']?></b></span>
<br /><br /><span><?= $champs['experience_bota']['amv_valeur_affichage'] ?></span>
<br /><span><?= $champs['ville']['amv_valeur_affichage'] ?> (<?= $champs['pays']['amv_valeur_affichage'] ?>) </span>
<br /><span> Inscrit depuis le <?= $champs['date_inscription']['amv_valeur_affichage'] ?></span>
<?php if($identification_id === $id_utilisateur || $est_admin) { ?>
<br /><br /><span><a id="lien_modification" href="<?= $url_modification_profil ?>" > Modifier / Enrichir mon profil </a></span>
<?php } ?>
</span>
</div>
/tags/v1.1-andromede/squelettes/fiches/annuaire_tela_inscrits_fiche.tpl.html
New file
0,0 → 1,127
<script src="<?= $base_url_styles ?>squelettes/scripts/jquery.js" type="text/javascript"></script>
<script src="<?= $base_url_styles ?>squelettes/scripts/desinscription.js" type="text/javascript"></script>
 
<div id="navigation_annuaire"> <?=$navigation ?> </div>
 
<div id="fiche_utilisateur">
<h2> Fiche de l'utilisateur <?= $champs['nom']['amv_valeur_affichage'] ?> <?=$champs['prenom']['amv_valeur_affichage'] ?></h2><br />
<?php if (isset($champs['image']) && isset($champs['image']['amv_valeur_affichage'])) { ?>
<div id="avatar" class="gauche">
<?php if($identification_id === $id_utilisateur || $est_admin) { ?>
<a href="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form;?>" >
<img src="<?= $champs['image']['amv_valeur_affichage'].'?reload='.time() ?>" title="Cliquez pour modifier votre image de profil" alt="image de profil personnalisée" /> </div> <br />
</a>
<? } else { ?>
<img src="<?= $champs['image']['amv_valeur_affichage'] ?>" title="Image de profil" alt="image de profil personnalisée" /> </div> <br />
<? } ?>
<?php } else { ?>
<div id="avatar" class="gauche">
<?php if($identification_id === $id_utilisateur || $est_admin) { ?>
<a href="<?php $url_image = clone($base_url);
$url_image->setVariableRequete('m','annuaire_afficher_formulaire_ajout_image');
$url_image->setVariableRequete('id_annuaire',$id_annuaire);
$url_image->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_image;?>" >
<img src="<?= $base_url_styles ?>squelettes/images/avatar_defaut.gif" title="pas encore d'image de profil ? cliquez pour ajouter la votre !" alt="lien vers le formulaire d'upload d'image de profil" />
</a>
<? } else { ?>
<img src="<?= $base_url_styles ?>squelettes/images/avatar_defaut.gif" title="" alt="image de profil standard" />
<? } ?>
</div> <br />
<?php } ?>
 
<h3> Mes coordonnées </h3>
<div class="element_profil">Date de naissance : <span class="valeur_profil"><?=$champs['date_naissance']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Pseudo : <span class="valeur_profil"><?=$champs['pseudo']['amv_valeur_affichage'] ?></span> </div>
<?php if($identification_id === $id_utilisateur || $est_admin) { ?>
<div class="element_profil">Adresse : <span class="valeur_profil"><?=$champs['adresse']['amv_valeur_affichage'].' '.$champs['adresse_comp']['amv_valeur_affichage'] ?></span></div>
<?php } ?>
<div class="element_profil">Pays : <span class="valeur_profil"><?=$champs['pays']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Ville : <span class="valeur_profil"><?=$champs['ville']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Code Postal : <span class="valeur_profil"><?=$champs['code_postal']['amv_valeur_affichage'] ?></span> </div>
 
<?php $profil_prive = (isset($champs['profil_prive']) && ($champs['profil_prive']['amv_valeur'] == 1)); ?>
 
<?php if (!$profil_prive || ($identification_id === $id_utilisateur || $est_admin)) { ?>
<h3> Mon parcours botanique </h3>
<div class="element_profil">Présentation : <span class="valeur_profil"><?=$champs['presentation']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Expérience botanique : <span class="valeur_profil"><?=$champs['experience_bota']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Mon activité professionnelle : <span class="valeur_profil"><?=$champs['rapport_activite_pro_bota']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Membre d'une association botanique ou en lien avec la botanique : <span class="valeur_profil"><?=$champs['membre_asso_bota']['amv_valeur_affichage'] ?></span> </div>
<!--<div class="element_profil">Quelles flores utilisez vous ? Votre flore de prédilection : <?=$champs['flores_utilisees']['amv_valeur_affichage'] ?></div> -->
<!-- <div class="element_profil">Spécialités (par groupe de plante) : <span class="valeur_profil"><?=$champs['specialite_bota_groupes']['amv_valeur_affichage'] ?></span> </div>
 
<div class="element_profil">Spécialités (par approche scientifique et outils) : <span class="valeur_profil"><?=$champs['specialite_bota_approche']['amv_valeur_affichage'] ?></span> </div>
-->
<div class="element_profil"> Spécialités (zones géographiques) : <span class="valeur_profil"><?=$champs['specialite_bota_geo']['amv_valeur_affichage'] ?></span> </div>
<h3> Mon parcours de telabotaniste </h3>
<div class="element_profil">Comment avez vous connu Tela Botanica ? : <span class="valeur_profil"><?=$champs['comment_connu_tela']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Pour moi, être tela botaniste, c'est avant tout : <span class="valeur_profil"><?=$champs['etre_tela_botaniste']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Si j'étais une plante sauvage, je serais... : <span class="valeur_profil"><?=$champs['etre_plante_sauvage']['amv_valeur_affichage'] ?></span> </div>
<h3> Environnement botanique </h3>
<div class="element_profil">Mon site web / blog : <span class="valeur_profil"><?=$champs['mon_blog']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Mes sites web / blogs préférés : <span class="valeur_profil"><?=$champs['sites_preferes']['amv_valeur_affichage'] ?></span> </div>
<h3> Appartenance à un organisme </h3>
<div class="element_profil">Structure : <span class="valeur_profil"><?=$champs['organisme']['amv_valeur_affichage'] ?></span> </div>
<div class="element_profil">Fonction : <span class="valeur_profil"><?=$champs['fonction']['amv_valeur_affichage'] ?></span> </div>
<?php if($identification_id == $id_utilisateur || $est_admin) { ?>
<form method="post" id="modification" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','annuaire_formulaire_modification_inscription');
$url_form->setVariableRequete('id_annuaire',$id_annuaire);
$url_form->setVariableRequete('id_utilisateur',$id_utilisateur);
echo $url_form;?>" >
<input id="bouton_modification" type="submit" name="bouton_modification" value="Modifier" />
</form>
<? } ?>
<?php echo (isset($formulaire_blocage)) ? $formulaire_blocage : '' ?>
<?php if($identification_id != $id_utilisateur) { ?>
<form id="envoi_message" name="envoi_message" method="get" action="<? $url_message = clone($base_url); $url_message->setVariableRequete('m','annuaire_envoyer_message'); echo $url_message; ?>">
<div id="formulaire_message" name="formulaire_message">
<h3> Envoyer un message </h3>
<label for="sujet_message"> Sujet : </label><br /> <input type=text id="sujet_message" name="sujet_message" /> <br />
<label for="contenu_message"> Contenu : </label><br /><textarea id="contenu_message" name="contenu_message" /></textarea>
<input type="hidden" value="annuaire_envoyer_message" id="m" name="m" /><br />
<input type="hidden" value="<?= $id_annuaire ?>" id="id_annuaire" name="id_annuaire" /><br />
<input type="hidden" name="destinataires[<?=$id_utilisateur?>]" id="destinataires[$id_utilisateur]?>]" /><br />
<input type="submit" id="bouton_envoi_message" name="bouton_envoi_message" value="Envoyer">
</div>
</form>
<? } ?>
<?php } else { ?>
<div id="fiche_privee">
<div id="texte_profil_prive">
<p><img class="icone_moyenne gauche" src="<?= $base_url_styles ?>/squelettes/images/cadenas.png" /><span><?= $champs['nom']['amv_valeur_affichage'] ?> <?=$champs['prenom']['amv_valeur_affichage'] ?> ne souhaite montrer qu'une partie des informations de son profil aux membres du reseau </span></p>
</div>
</div>
<?php } ?>
</div>
/tags/v1.1-andromede/squelettes/fiches/annuaire_tela_inscrits_resume.tpl.html
New file
0,0 → 1,23
<div id="navigation_annuaire"> <?=$navigation ?> </div>
 
<div id="resume">
<?= $carte_id ?>
<hr class="separation" />
<?php $i = 0; ?>
<?php foreach($resumes as $resume) : ?>
<div class="resume_conteneur <?= ($i % 2 != 0) ? 'gauche' : 'droite' ?>">
<h2> <?= $resume['titre'] ?></h2>
<?=$resume['message']?>
<?php foreach($resume['elements'] as $element) : ?>
<div class="resume">
<?php if(isset($element['image'])) { ?>
<?=$element['image']?>
<? } ?>
<h3><a href="<?= $element['lien']?>" > <?=$element['element'] ?> </a></h3>
</div>
<?php endforeach ?>
</div>
<?php $i++ ?>
<?php endforeach ?>
</div>
/tags/v1.1-andromede/squelettes/metadonnees/metadonnee_ajout.tpl.html
New file
0,0 → 1,39
<h2>Ajout d'un nouveau champ à l'annuaire</h2>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','metadonnee_ajout');
echo $url_form; ?>">
<label for="amo_nom">Nom du champ</label>
<textarea class="champ_nom" name="amc_nom" id="amc_nom"> <?=$valeur['amc_nom'] ?> </textarea>
<br />
<label for="amc_ce_type_affichage">Type du champ</label>
<select id="amc_ce_type_affichage" name="amc_ce_type_affichage">
<option value="0"> Aucun </option>
<?php foreach($types as $type) : ?>
<option value="<?=$type['amo_id_ontologie']?>"> <?=$type['amo_nom'] ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="amc_ce_ontologie">Fait partie de la liste</label>
<select id="amc_ce_ontologie" name="amc_ce_ontologie">
<option value="0"> Aucune </option>
<?php foreach($listes as $liste) : ?>
<option value="<?=$liste['amo_id_ontologie']?>"> <?=$liste['amo_nom'] ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="amo_abreviation">Abréviation</label>
<input type="text" name="amc_abreviation" id="amc_abreviation" value="<?=$valeur['amc_abreviation'] ?>" />
<br />
<label for="amo_description">Description</label>
<textarea name="amc_description" id="amc_description"><?=$valeur['amc_description'] ?></textarea>
<br />
<input type="hidden" name="amc_ce_annuaire" value="<?=$valeur['amc_ce_annuaire'] ?>"/>
<input type="submit" value="OK" /> <a href="<?php $url_retour = clone($base_url);
$url_retour->setVariableRequete('m','annuaire');
$url_retour->setVariableRequete('id_annuaire',$valeur['amc_ce_annuaire']);
echo $url_retour; ?>"> Annuler </a>
</form>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/metadonnees/metadonnee_modification.tpl.html
New file
0,0 → 1,37
<h2>Modification d'un champ</h2>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','metadonnee_modification');
echo $url_form; ?>">
<label for="amo_nom">Nom du champ</label>
<textarea class="champ_nom" name="amc_nom" id="amc_nom"><?=$valeur['amc_nom'] ?></textarea>
<br />
<label for="amc_ce_type_affichage">Type du champ</label>
<select id="amc_ce_type_affichage" name="amc_ce_type_affichage">
<option value="0"> Aucun </option>
<?php foreach($types as $type) : ?>
<option value="<?=$type['amo_id_ontologie']?>" <?php if($valeur['amc_ce_type_affichage'] == $type['amo_id_ontologie']) echo 'selected = "selected"' ?>> <?=$type['amo_nom'] ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="amc_ce_ontologie">Fait partie de la liste</label>
<select id="amc_ce_ontologie" name="amc_ce_ontologie">
<option value="0" <?php if($valeur['amc_ce_ontologie'] == 0) echo 'selected = "selected"' ?>> Aucune </option>
<?php foreach($listes as $liste) : ?>
<option value="<?=$liste['amo_id_ontologie']?>" <?php if($valeur['amc_ce_ontologie'] == $liste['amo_id_ontologie']) echo 'selected = "selected"' ?>> <?=$liste['amo_nom'] ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="amo_abreviation">Abréviation</label>
<input type="text" name="amc_abreviation" id="amc_abreviation" value="<?=$valeur['amc_abreviation'] ?>" />
<br />
<label for="amo_description">Description</label>
<textarea type="text" name="amc_description" id="amc_description"><?=$valeur['amc_description'] ?></textarea>
<br />
<input type="hidden" name="amc_ce_annuaire" value="<?=$valeur['amc_ce_annuaire'] ?>"/>
<input type="hidden" name="amc_id_champ" value="<?=$valeur['amc_id_champ'] ?>"/>
<input type="submit" value="OK"> <a href="<?=$base_url ?>"> Annuler </a>
</form>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
/tags/v1.1-andromede/squelettes/metadonnees/mappage_ajout.tpl.html
New file
0,0 → 1,46
<h2>Ajout d'un nouveau champ de mappage à l'annuaire</h2>
 
<?php if(!empty($champs_mappage_role)) { ?>
<form method="post" action="<?php $url_form = clone($base_url);
$url_form->setVariableRequete('m','mappage_ajout');
echo $url_form; ?>">
<label for="amo_nom">Nom du champ dans l'annuaire mappé</label>
<select id="at_ressource" name="at_ressource">
<?php foreach($champs_annuaire as $nom_champ) : ?>
<option value="<?=$nom_champ?>"><?=$nom_champ ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="at_action">Role du champ</label>
<select id="at_action" name="at_action">
<?php foreach($champs_mappage as $role => $champ_mappage) : ?>
<option value="<?=$role?>"> <?=$champ_mappage ?> </option>
<?php endforeach; ?>
</select>
<br />
<label for="at_valeur">Champ de métadonnées à associer</label>
<select id="at_valeur" name="at_valeur">
<?php foreach($champs_metadonnees as $metadonnee) : ?>
<option value="<?=$metadonnee['amc_id_champ']?>"> <?=$metadonnee['amc_nom'] ?> </option>
<?php endforeach; ?>
</select>
<br />
<br />
<input type="hidden" name="id_annuaire" id="id_annuaire" value="<?=$id_annuaire ?>"/>
<input type="submit" value="OK" /> <a href="<?php $url_retour = clone($base_url);
$url_retour->setVariableRequete('m','annuaire');
$url_retour->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_retour; ?>"> Revenir au détail de l'annuaire </a>
</form>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'];?> </span>
<?php endif; ?>
<?php } else { ?>
<p classe="attention"> Le maximum de rôles a déjà été affecté aux champs </p>
<a href="<?php $url_retour = clone($base_url);
$url_retour->setVariableRequete('m','annuaire');
$url_retour->setVariableRequete('id_annuaire',$id_annuaire);
echo $url_retour; ?>"> Revenir au détail de l'annuaire </a>
<?php } ?>
/tags/v1.1-andromede/squelettes/images/voir_details_liste.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/voir_details_liste.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/completer_profil.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/completer_profil.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/modification.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/modification.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/afficher.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/afficher.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/avatar_defaut.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/tags/v1.1-andromede/squelettes/images/avatar_defaut.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/soutenir.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/soutenir.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/suppression.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/suppression.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/voir_champs.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/voir_champs.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/voir_fiche.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/voir_fiche.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/voir_inscrits.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/voir_inscrits.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/cadenas.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/cadenas.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/logo_ontologie.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/logo_ontologie.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/inscription.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/inscription.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/logo_annuaire.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/logo_annuaire.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/images/participer.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/tags/v1.1-andromede/squelettes/images/participer.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/tags/v1.1-andromede/squelettes/mails/mail_oubli_mdp.tpl.html
New file
0,0 → 1,12
<p> Bonjour. <br />
Ce mail vous a été envoyé suite à une demande de réinitialisation de mot de passe.<br />
 
Votre nouveau mot de passe est <?=$nouveau_mdp ?><br />
Vous pouvez accéder à votre compte sur cette page :
<a href="<?=$lien_profil ?>" title="lien vers votre profil utilisateur" > <?= $lien_profil ?> </a><br />
 
Cordialement,
 
L'équipe de Tela Botanica
</p>
/tags/v1.1-andromede/squelettes/mails/mail_messagerie.tpl.html
New file
0,0 → 1,5
<pre> <?= $contenu_message ?></pre>
 
<p> Ce message vous est envoyé par le réseau Tela Botanica, auquel vous êtes inscrit. <br />
D'autres inscrits au réseau peuvent avoir reçu ce message. <br />
Ne répondez que si vous êtes concerné, ou si vous avez des informations utiles à transmettre au demandeur. </p>
/tags/v1.1-andromede/squelettes/mails/mail_moderation_message.tpl.html
New file
0,0 → 1,28
Bonjour. Un message est en attente de modération.<br />
 
<p>
Pour accepter son envoi, cliquez sur ce lien <a href="<?=$lien_accepter_mail ?>"> Accepter l'envoi : <?=$lien_accepter_mail ?> </a> <br />
Pour refuser son envoi, cliquez sur ce lien <a href="<?=$lien_refuser_mail ?>"> Refuser l'envoi : <?=$lien_refuser_mail ?> </a> <br />
 
Cordialement,
 
L'application annuaire
</p>
 
Sujet du message :
<pre>
<?=$sujet_message?>
</pre><br />
 
Contenu du message :
<pre>
<?=$contenu_message ?>
</pre><br />
 
Destinataires :
<pre>
<?=$destinataires_message ?>
</pre><br />
 
 
/tags/v1.1-andromede/squelettes/mails/mail_confirmation_inscription.tpl.html
New file
0,0 → 1,8
<p> Bonjour <?= $nom ?> <?=$prenom ?>. Votre inscription au site Tela Botanica a bien été prise en compte.<br />
Pour confirmer votre inscription, cliquez sur ce lien <a href="<?=$lien_confirmation_inscription ?>"> <?=$lien_confirmation_inscription ?> </a> <br />
 
Cordialement,
 
L'équipe de Tela Botanica
</p>
/tags/v1.1-andromede/squelettes/rss/derniers_inscrits.tpl.html
New file
0,0 → 1,26
<?php echo '<?xml version="1.0" encoding="'.Config::get('sortie_encodage').'"?>' ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
 
<channel>
<title>Derniers inscrits à l'annuaire</title>
<link> www.tela-botanica.org</link>
<description>Flux des derniers inscrits à Tela Botanica</description>
<language>fr</language>';
<?php foreach ($derniers_inscrits as $inscrit) : ?>
<item>
<title> <?=$inscrit['nom']['amv_valeur'].' '.$inscrit['prenom']['amv_valeur'] ?></title>
<link></link>
<description>
<![CDATA[
<?php if(isset($inscrit['image']['amv_valeur']) && trim($inscrit['image']['amv_valeur']) != '') { ?>
<img class="avatar_petit" src="<?= ImageModele::obtenirUrlFichierParId($inscrit['image']['amv_valeur'],'1','S') ?>" title="Cliquez pour accéder au profil" alt="avatar" /> </div></a>
<?php } ?>
<?php echo $inscrit['ville']['amv_valeur'].' ('.$inscrit['code_postal']['amv_valeur'].')'; ?>
]]>
</description>
<dc:format>text/html</dc:format>
</item>';
<?php endforeach; ?>
</channel>
</rss>
/tags/v1.1-andromede/squelettes/rss/derniers_inscrits_admin.tpl.html
New file
0,0 → 1,37
<?php echo '<?xml version="1.0" encoding="'.Config::get('sortie_encodage').'"?>' ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
 
<channel>
<title>Derniers inscrits à l'annuaire</title>
<link> www.tela-botanica.org</link>
<description>Flux des derniers inscrits à Tela Botanica</description>
<language>fr</language>';
<?php foreach ($derniers_inscrits as $inscrit) : ?>
<item>
<title> <?=$inscrit['nom']['amv_valeur'].' '.$inscrit['prenom']['amv_valeur'] ?></title>
<link></link>
<description>
<![CDATA[
<?php if(isset($inscrit['image']['amv_valeur']) && trim($inscrit['image']['amv_valeur']) != '') { ?>
<img class="avatar_petit" src="<?= ImageModele::obtenirUrlFichierParId($inscrit['image']['amv_valeur'],'1','S') ?>" title="Cliquez pour acc�der au profil" alt="avatar" /> </div></a>
<?php } ?>
<?php echo $inscrit['ville']['amv_valeur'].' ('.$inscrit['code_postal']['amv_valeur_affichage'].')'.'<br />';
echo 'Adresse mail : '.$inscrit['mail']['amv_valeur_affichage'].'<br />' ;
echo 'Pays : '.$inscrit['pays']['amv_valeur_affichage'].'<br />' ;
echo 'Adresse : '.$inscrit['adresse']['amv_valeur_affichage'].'<br />' ;
echo 'Adresse (suite) : '.$inscrit['adresse_comp']['amv_valeur_affichage'].'<br />';
echo 'Site web personnel : '.$inscrit['mon_blog']['amv_valeur_affichage'].'<br />';
echo 'Organisme : '.$inscrit['organisme']['amv_valeur_affichage'].'<br />';
echo 'Fonction : '.$inscrit['fonction']['amv_valeur_affichage'].'<br />';
echo 'Vous êtes botaniste : '.$inscrit['experience_bota']['amv_valeur_affichage'].'<br />';
echo 'Votre activité professionnelle (ou celle que vous aviez) : '.$inscrit['rapport_activite_pro_bota']['amv_valeur_affichage'].'<br />' ;
echo 'Vous êtes membre d\'une association botanique, naturaliste, ou autre... : '.$inscrit['membre_asso_bota']['amv_valeur_affichage'].'<br />';
?>
]]>
</description>
<dc:format>text/html</dc:format>
</item>';
<?php endforeach; ?>
</channel>
</rss>
/tags/v1.1-andromede/annuaire_admin.php
New file
0,0 → 1,444
<?php
// declare(encoding='UTF-8');
/**
*
* PHP version 5
*
* @category PHP
* @package Framework
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @copyright Tela-Botanica 2009
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $$Id$$
* @link /doc/framework/
*/
 
include_once('initialisation.php');
 
$identification = Config::get('identification');
//$annuaire_controleur = new AnnuaireControleur();
 
//$annuaire_controleur->chargerModele('AnnuaireModele');
//$id = $annuaire_controleur->AnnuaireModele->obtenirIdParMail('1',$identification);
 
//ajout des variables d'identification
Registre::getInstance()->set('est_admin',true);
//Registre::getInstance()->set('identification_id',$id);
//Registre::getInstance()->set('identification_mail',$identification);
 
// identification
// TODO : faire mieux (un wrapper pour gérer différents types d'objets)
// identification
// TODO : faire mieux (un wrapper pour gérer différents types d'objets)
if(isset($_GET['id_utilisateur'])) {
$GLOBALS['id_utilisateur'] = $_GET['id_utilisateur'];
} else if (isset($_POST['id_utilisateur'])) {
$GLOBALS['id_utilisateur'] = $_POST['id_utilisateur'];
} else {
$GLOBALS['id_utilisateur'] = $id;
}
 
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
 
$methode = '';
if (isset($_GET['m'])) {
$methode = $_GET['m'];
//unset($_GET['m']);
} else {
if (isset($_POST['m'])) {
$methode = $_POST['m'];
//unset($_POST['m']);
} else {
// Gestion des paramêtres définis dans Papyrus
/*if (isset($GLOBALS['_GEN_commun']['info_application']->m)) {
$methode = $GLOBALS['_GEN_commun']['info_application']->m;
}
 
// Gestion des paramêtres définis dans Papyrus
if (isset($GLOBALS['_GEN_commun']['info_application']->id_annuaire)) {
$_GET['id_annuaire'] = $GLOBALS['_GEN_commun']['info_application']->id_annuaire;
}*/
}
}
 
$identification = Config::get('identification');
 
if(!$identification) {
$controleur = new IdentificationControleur();
return $controleur->afficherFormulaireIdentification();
}
 
switch ($methode) {
 
// Fonctions de liste d'ontologie
case 'liste_listes':
$controleur = new OntologieControleur();
$retour = $controleur->chargerListeListe();
break;
 
case 'liste_ontologie':
$controleur = new OntologieControleur();
$id = $_GET['id_liste'];
$retour = $controleur->chargerListeOntologie($id);
break;
 
case 'liste_ontologie_formulaire_ajout':
$valeurs = $_GET;
$controleur = new OntologieControleur();
$retour = $controleur->afficherFormulaireAjoutListeOntologie($valeurs);
break;
 
case 'liste_ontologie_formulaire_modification':
$id_ontologie = $_GET['amo_id_ontologie'];
$controleur = new OntologieControleur();
$retour = $controleur->afficherFormulaireModificationListeOntologie($id_ontologie);
break;
 
case 'liste_ontologie_ajout':
$controleur = new OntologieControleur();
$retour = $controleur->ajouterNouvelleListeOntologie($_POST);
break;
 
case 'liste_ontologie_modification':
$controleur = new OntologieControleur();
$retour = $controleur->modifierListeOntologie($_POST);
break;
 
case 'liste_ontologie_suppression':
$controleur = new OntologieControleur();
$id_a_supprimer = $_GET['amo_id_ontologie'];
$retour = $controleur->supprimerListeOntologie($id_a_supprimer);
break;
 
// Fonction de gestion des métadonnées des annuaire
case 'metadonnee_formulaire_ajout':
$controleur = new MetadonneeControleur();
$valeurs = $_GET;
$retour = $controleur->afficherFormulaireAjoutMetadonnee($valeurs);
break;
 
case 'metadonnee_formulaire_modification':
$controleur = new MetadonneeControleur();
$valeurs = $_GET;
$retour = $controleur->afficherFormulaireModificationMetadonnee($valeurs);
break;
 
case 'metadonnee_ajout':
$controleur = new MetadonneeControleur();
$valeurs = $_POST;
$retour = $controleur->ajouterNouvelleMetadonnee($valeurs);
break;
 
case 'metadonnee_modification':
$controleur = new MetadonneeControleur();
$valeurs = $_POST;
$retour = $controleur->modifierMetadonnee($valeurs);
break;
 
case 'metadonnee_suppression':
$controleur = new MetadonneeControleur();
$id_a_supprimer = $_GET['amc_id_champ'];
$id_annuaire = $_GET['amc_ce_annuaire'];
$retour = $controleur->supprimerMetadonnee($id_annuaire, $id_a_supprimer);
break;
 
// Fonctions de gestion des annuaires
case 'liste_annu':
$controleur = new AnnuaireControleur();
$retour = $controleur->chargerListeAnnuaire();
break;
 
case 'annuaire':
$controleur = new AnnuaireControleur();
$id = $_GET['id_annuaire'];
$retour = $controleur->chargerAnnuaire($id);
break;
case 'annuaire_formulaire_ajout':
$controleur = new GestionAnnuaireControleur();
$valeurs = $_POST;
$retour = $controleur->afficherFormulaireAjoutAnnuaire($valeurs);
break;
case 'annuaire_ajout':
$controleur = new GestionAnnuaireControleur();
$valeurs = $_POST;
$retour = $controleur->ajouterAnnuaire($valeurs);
break;
case 'mappage_formulaire_ajout':
$controleur = new MappageControleur();
$id_annuaire = $_GET['id_annuaire'];
$retour = $controleur->afficherFormulaireAjoutMappage($id_annuaire);
break;
case 'mappage_ajout':
$controleur = new MappageControleur();
$valeurs = $_POST;
$retour = $controleur->ajouterNouveauMappage($valeurs);
break;
// visualisation et recherche des inscrits
case 'annuaire_inscrits':
$controleur = new AnnuaireControleur();
$id = $_GET['id_annuaire'];
 
if(isset($_GET['taille_page'])) {
$taille_page = $_GET['taille_page'];
} else {
$taille_page = 50;
}
 
if(isset($_GET['numero_page'])) {
$numero_page = $_GET['numero_page'];
} else {
$numero_page = 1;
}
$retour = $controleur->afficherFormulaireRecherche($id);
$retour .= $controleur->chargerAnnuaireListeInscrits($id, $numero_page, $taille_page);
break;
case 'annuaire_afficher_page':
$id_annuaire = $_GET['id_annuaire'];
$page = $_GET['page'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherPage($id_annuaire, $GLOBALS['id_utilisateur'], $page);
break;
 
case 'annuaire_formulaire_inscription':
$controleur = new AnnuaireControleur();
$id = $_GET['id_annuaire'];
$retour = $controleur->afficherFormulaireInscription($id);
break;
 
case 'annuaire_ajout_inscription':
$valeurs = $_POST;
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterInscriptionTemporaire($valeurs);
break;
 
case 'annuaire_inscription_confirmation':
$identifiant = $_GET['id'];
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterNouvelleInscription($identifiant);
break;
 
case 'annuaire_fiche_utilisateur_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFicheUtilisateur($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
 
case 'annuaire_fiche_resume_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFicheResumeUtilisateur($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
case 'annuaire_fiche_gestion_consultation':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->gererInscriptionExterne($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
 
 
case 'annuaire_formulaire_modification_inscription':
$controleur = new AnnuaireControleur();
$id_annuaire = $_GET['id_annuaire'];
$retour = $controleur->afficherFormulaireModificationInscription($id_annuaire, $GLOBALS['id_utilisateur']);
 
break;
 
case 'annuaire_modification_inscription':
$controleur = new AnnuaireControleur();
$valeurs = $_POST;
$retour = $controleur->modifierInscription($_POST);
 
break;
 
case 'annuaire_afficher_formulaire_ajout_image':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireUploadImage($identifiant_annuaire,$GLOBALS['id_utilisateur']);
break;
 
case 'annuaire_ajouter_image':
$identifiant_annuaire = $_GET['id_annuaire'];
$GLOBALS['id_utilisateur'] = $_GET['id_utilisateur'];
$infos_images = $_FILES;
$controleur = new AnnuaireControleur();
$retour = $controleur->ajouterImageUtilisateur($identifiant_annuaire,$GLOBALS['id_utilisateur'],$infos_images);
break;
 
case 'annuaire_suppression_inscription':
$identifiant_annuaire = $_GET['id_annuaire'];
$id_utilisateur = $_GET['id_utilisateur'];
$controleur = new AnnuaireControleur();
$retour = $controleur->supprimerInscription($identifiant_annuaire,$id_utilisateur);
break;
 
case 'annuaire_formulaire_suppression_inscription':
$identifiant_annuaire = $_GET['id_annuaire'];
$id_utilisateur = $_GET['id_utilisateur'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireSuppressionInscription($identifiant_annuaire,$id_utilisateur);
break;
 
case 'annuaire_afficher_formulaire_oubli_mdp':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireOubliMotDePasse($identifiant_annuaire);
break;
 
case 'annuaire_oubli_mdp':
$identifiant_annuaire = $_GET['id_annuaire'];
$mail = $_POST['mail'];
$controleur = new AnnuaireControleur();
$retour = $controleur->reinitialiserMotDePasse($identifiant_annuaire, $mail);
break;
 
// Fonctions de recherche d'inscrits
case 'annuaire_afficher_formulaire_recherche':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$retour = $controleur->afficherFormulaireRecherche($identifiant_annuaire);
break;
 
case 'annuaire_recherche_inscrit':
$identifiant_annuaire = $_GET['id_annuaire'];
unset($_GET['id_annuaire']);
 
if(isset($_GET['inclusive'])) {
$exclusive = false;
unset($_GET['inclusive']);
} else {
$exclusive = true;
}
$controleur = new AnnuaireControleur();
$criteres = $_GET;
$retour = $controleur->rechercherInscrit($identifiant_annuaire,$criteres, $exclusive);
break;
 
 
// Fonctions cartographiques
case 'annuaire_inscrits_carto':
$identifiant_annuaire = $_GET['id_annuaire'];
$controleur = new AnnuaireControleur();
$criteres = $_GET;
$retour = $controleur->rechercherInscritParlocalisation($identifiant_annuaire,$criteres);
break;
 
case 'annuaire_afficher_carte':
$identifiant_annuaire = $_GET['id_annuaire'];
 
$continent = null;
$pays = null;
$departement = null;
$controleur = new CartoControleur();
 
if(isset($_GET['continent'])) {
$continent = $_GET['continent'];
}
 
if(isset($_GET['pays'])) {
$pays = $_GET['pays'];
}
 
if(isset($_GET['departement'])) {
$departement = $_GET['departement'];
}
 
$retour = $controleur->cartographier($identifiant_annuaire, $continent, $pays, $departement);
break;
case 'annuaire_envoyer_message':
$controleur = new MessageControleur();
 
$id_annuaire = $_GET['id_annuaire'];
$contenu_message = $_GET['contenu_message'];
$sujet_message = $_GET['sujet_message'];
$destinataires = array_keys($_GET['destinataires']);
 
$retour = $controleur->envoyerMailDirectOuModere($id_annuaire ,Config::get('identification'), $destinataires, $sujet_message, $contenu_message);
break;
 
// Fonctions de modération des messages
case 'message_moderation_confirmation':
if(isset($_GET['id'])) {
$id_message = $_GET['id'];
}
$controleur = new MessageControleur();
$retour = $controleur->envoyerMailModere($id_message);
break;
 
case 'message_moderation_suppression':
if(isset($_GET['id'])) {
$id_message = $_GET['id'];
}
$controleur = new MessageControleur();
$retour = $controleur->supprimerMailModere($id_message);
break;
 
case 'annuaire_bloquer_debloquer_utilisateur':
$id_annuaire = $_GET['id_annuaire'];
$id_utilisateur = $_GET['id_utilisateur'];
$action = $_GET['action'];
$controleur = new AnnuaireControleur();
$retour = $controleur->bloquerDebloquerUtilisateur($id_annuaire, $id_utilisateur, $action);
break;
 
default:
$controleur = new AnnuaireControleur();
$retour = $controleur->index();
break;
}
 
if (Config::get('sortie_encodage') != Config::get('appli_encodage')) {
$retour = mb_convert_encoding($retour, Config::get('sortie_encodage'),Config::get('appli_encodage'));
}
 
return $retour;
}
 
function afficherContenuTete() {
// c'est très moche, il ne faudrait pas faire comme ceci
if(function_exists('GEN_stockerStyleExterne')) {
GEN_stockerStyleExterne('annuaire_papyrus',Config::get('base_url_styles').'squelettes/css/annuaire_complexe.css');
GEN_stockerStyleExterne('annuaire_papyrus_simple',Config::get('base_url_styles').'squelettes/css/annuaire.css');
}
return '';
}
 
function afficherContenuPied() {
return '';
}
 
function afficherContenuNavigation() {
return '';
}
 
function afficherContenuMenu() {
 
if(isset($_GET['id_annuaire'])) {
$id_annuaire = $_GET['id_annuaire'];
} else {
$id_annuaire = Config::get('annuaire_defaut');
}
$controleur = new NavigationControleur();
return $controleur->afficherContenuMenu($id_annuaire,true);
}
 
?>
/tags/v1.1-andromede/doc/bdd/annuaire.sql
New file
0,0 → 1,5652
-- phpMyAdmin SQL Dump
-- version 3.1.1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mer 14 Juillet 2010 à 18:01
-- Version du serveur: 5.1.30
-- Version de PHP: 5.2.8
 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
 
--
-- Base de données: `annuaire`
--
 
-- --------------------------------------------------------
 
--
-- Structure de la table `annu_annuaire`
--
 
CREATE TABLE IF NOT EXISTS `annu_annuaire` (
`aa_id_annuaire` int(11) NOT NULL AUTO_INCREMENT COMMENT 'identifiant de cet annuaire',
`aa_nom` varchar(128) DEFAULT NULL COMMENT 'nom de l''annuaire',
`aa_description` varchar(255) DEFAULT NULL COMMENT 'description',
`aa_code` varchar(50) DEFAULT NULL COMMENT 'code ou abréviation',
`aa_table` varchar(255) DEFAULT NULL COMMENT 'nom de la table annuaire à utiliser',
`aa_bdd` varchar(255) DEFAULT NULL COMMENT 'base de données dans laquelle est situé cet annuaire',
PRIMARY KEY (`aa_id_annuaire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Structure de la table `annu_donnees_temp`
--
 
CREATE TABLE IF NOT EXISTS `annu_donnees_temp` (
`adt_id` varchar(32) NOT NULL,
`adt_donnees` text NOT NULL,
`adt_date` date NOT NULL,
PRIMARY KEY (`adt_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `annu_meta_colonne`
--
 
CREATE TABLE IF NOT EXISTS `annu_meta_colonne` (
`amc_id_champ` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant du nom du champ dans la table.',
`amc_ce_ontologie` int(11) NOT NULL DEFAULT '0',
`amc_ce_annuaire` int(11) NOT NULL COMMENT 'Annuaire lié à cette méta colonne',
`amc_ce_type` int(11) NOT NULL COMMENT 'Type SQL du champ, est une valeur de la liste des types',
`amc_nom` varchar(255) DEFAULT NULL COMMENT 'Intitulé du champ.',
`amc_abreviation` varchar(50) DEFAULT NULL COMMENT 'Abréviation du champ.',
`amc_description` varchar(510) DEFAULT NULL COMMENT 'Description du champ.',
`amc_longueur` int(11) DEFAULT NULL COMMENT 'Taille du format SQL du champ.',
`amc_ce_type_affichage` varchar(255) NOT NULL,
PRIMARY KEY (`amc_id_champ`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Contient l''ensemble des champs des tables de la base de donn' AUTO_INCREMENT=0 ;
 
--
-- Structure de la table `annu_meta_ontologie`
--
 
CREATE TABLE IF NOT EXISTS `annu_meta_ontologie` (
`amo_id_ontologie` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant d''une valeur de liste. Notez que les listes sont des valeurs de la liste des listes.',
`amo_ce_parent` int(11) NOT NULL,
`amo_nom` varchar(100) DEFAULT NULL COMMENT 'Nom de la valeur.',
`amo_abreviation` varchar(50) DEFAULT NULL COMMENT 'Abréviation, code ou identifiant de la valeur.',
`amo_description` varchar(255) DEFAULT NULL COMMENT 'Description de cette valeur.',
PRIMARY KEY (`amo_id_ontologie`),
KEY `amo_ce_parent` (`amo_ce_parent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Liste l''ensemble des valeurs des tables de type liste.\nUn ch' AUTO_INCREMENT=0 ;
 
--
-- Contenu de la table `annu_meta_ontologie`
--
 
INSERT INTO `annu_meta_ontologie` (`amo_id_ontologie`, `amo_ce_parent`, `amo_nom`, `amo_abreviation`, `amo_description`) VALUES
(1, 1001, 'Ajouté', 'A', NULL),
(2, 1001, 'Modifié', 'M', NULL),
(3, 1001, 'Supprimé', 'S', NULL),
(11, 1002, 'TINYINT', '1', NULL),
(12, 1002, 'SMALLINT', '2', NULL),
(13, 1002, 'MEDIUMINT', '3', NULL),
(14, 1002, 'INT', '4', NULL),
(15, 1002, 'INTEGER', '5', NULL),
(16, 1002, 'BIGINT', '6', NULL),
(17, 1002, 'FLOAT', '7', NULL),
(18, 1002, 'DOUBLE', '8', NULL),
(19, 1002, 'DOUBLE PRECISION', '9', NULL),
(20, 1002, 'REAL', '10', NULL),
(21, 1002, 'DECIMAL', '11', NULL),
(22, 1002, 'NUMERIC', '12', NULL),
(23, 1002, 'DATE', '13', NULL),
(24, 1002, 'DATETIME', '14', NULL),
(25, 1002, 'TIMESTAMP', '15', NULL),
(26, 1002, 'TIME', '16', NULL),
(27, 1002, 'YEAR', '17', NULL),
(28, 1002, 'CHAR', '18', NULL),
(29, 1002, 'VARCHAR', '19', NULL),
(30, 1002, 'BIT', '20', NULL),
(31, 1002, 'BOOL', '21', NULL),
(32, 1002, 'TINYBLOB', '22', NULL),
(33, 1002, 'BLOB', '23', NULL),
(34, 1002, 'MEDIUMBLOB', '24', NULL),
(35, 1002, 'LONGBLOB', '25', NULL),
(36, 1002, 'TINYTEXT', '26', NULL),
(37, 1002, 'TEXT', '27', NULL),
(38, 1002, 'MEDIUMTEXT', '28', NULL),
(39, 1002, 'LONGTEXT', '29', NULL),
(40, 1002, 'ENUM', '30', NULL),
(41, 1002, 'SET', '31', NULL),
(42, 1002, 'GEOMETRY', '32', NULL),
(43, 1002, 'LINESTRING', '33', NULL),
(44, 1002, 'POLYGON', '34', NULL),
(45, 1002, 'MULTIPOINT', '35', NULL),
(46, 1002, 'MULTILINESTRING', '36', NULL),
(47, 1002, 'MULTIPOLYGON', '37', NULL),
(48, 1002, 'GEOMETRYCOLLECTION', '38', NULL),
(101, 1003, 'annu_annuaire', 'aa', ''),
(102, 1003, 'annu_meta_colonne', 'amc', 'Contient l''ensemble des champs des tables de la base de données.\n'),
(103, 1003, 'annu_meta_valeurs', 'amv', 'Contient les champs supplémentaires (non standard ou de spécialisation) de la base de données.'),
(104, 1003, 'annu_meta_ontologie', 'amo', 'Liste l''ensemble des valeurs des tables de type liste.\nUn champ contient des valeurs dans cette table quand il est de type "LISTE".\n'),
(1001, 0, 'Liste des états des enregistrements de la base de données', '00a', NULL),
(1002, 0, 'Liste des formats de champs SQL de la base de données', '00b', NULL),
(1003, 0, 'Liste des tables de la base de données', '00c', NULL),
(1004, 0, 'Liste des préfixes de noms de personne', '1', NULL),
(1005, 0, 'Liste des suffixes de noms de personne', '2', NULL),
(1006, 0, 'Liste des types de noms complémentaires d''une personne', '3', NULL),
(1007, 0, 'Liste des types de téléphone', '4', NULL),
(1008, 0, 'Liste des types de spécialités botaniques (par groupes de plantes)', '5', ''),
(1009, 0, 'Liste des rôles d''une personne', '6', NULL),
(1010, 0, 'Liste des relations entre personnes', '7', NULL),
(1011, 0, 'Liste des relations entre une structure et une personne', '8', NULL),
(1012, 0, 'Liste des fonctions d''une personne au sein d''une structure', '9', NULL),
(1013, 0, 'Liste des statuts d''une personne au sein d''une structure', '10', NULL),
(1014, 0, 'Liste des types de structure dans le standard NCD', '11', NULL),
(1015, 0, 'Liste des types de structure privé', '12', NULL),
(1016, 0, 'Liste des types de structure publique', '13', NULL),
(1017, 0, 'Liste des identifiants alternatifs de structures à vocation botanique', '14', NULL),
(1018, 0, 'Liste des types de local de stockage de collections', '15', NULL),
(1019, 0, 'Liste des types de mobilier de stockage de collections', '16', NULL),
(1020, 0, 'Liste des paramètres de contrôle environnemental d''un local', '17', NULL),
(1021, 0, 'Liste des types de collection non botanique', '18', NULL),
(1022, 0, 'Liste des types d''opération de restauration pour les collections botaniques', '19', NULL),
(1023, 0, 'Liste oui/non/en partie', '20', NULL),
(1024, 0, 'Liste du matériel dit de nom conservation des parts d''herbier', '21', NULL),
(1025, 0, 'Liste de traitement anti-insecte pour les collections botaniques', '22', NULL),
(1026, 0, 'Liste des poisons utilisés pour les collections botaniques', '23', NULL),
(1027, 0, 'Liste des actions de valorisation des collections', '24', NULL),
(1028, 0, 'Liste des continents habités incluant aussi le pays France', '25', NULL),
(1029, 0, 'Liste des types de recherche nécessitant la consultation de collection botanique', '26', NULL),
(1030, 0, 'Liste des relations entre une collection et une personne', '27', NULL),
(1031, 0, 'Liste des relations entre collections', '28', NULL),
(1032, 0, 'Liste des types de collection dans le standard NCD', '29', NULL),
(1033, 0, 'Liste des types de dépôt de collection', '30', NULL),
(1034, 0, 'Liste des principes de groupement d''une collection dans le standard NCD', '31', NULL),
(1035, 0, 'Liste des buts de réalisation d''une collection dans le standard NCD', '32', NULL),
(1036, 0, 'Échelle Mc Ginley dans le standard NCD', '33', NULL),
(1037, 0, 'Liste des règnes du vivant dans le standard NCD', '34', NULL),
(1038, 0, 'Liste des méthodes de conservation dans le standard NCD', '35', NULL),
(1039, 0, 'Liste des états de croissance d''une collection dans le standard NCD', '36', NULL),
(1040, 0, 'Liste des siècles pour les collections naturalistes', '37', NULL),
(1041, 0, 'Liste indéterminé/peut-être/oui/non', '38', NULL),
(1042, 0, 'Liste des types de classement des spécimens types dans une collection', '39', NULL),
(1043, 0, 'Liste des natures végétales', '40', NULL),
(1044, 0, 'Liste des types d''unité de rangement pour les collections botaniques', '41', NULL),
(1045, 0, 'Liste des états', '42', NULL),
(1046, 0, 'Liste des types de support pour les spécimens des collections botaniques', '43', NULL),
(1047, 0, 'Liste des types de papier de support pour les spécimens des collections botaniques', '44', NULL),
(1048, 0, 'Liste des méthodes de rangement des supports pour les spécimens des collections botaniques', '45', NULL),
(1049, 0, 'Liste des méthodes de fixation sur le support pour les collections botaniques', '46', NULL),
(1050, 0, 'Liste des méthodes de fixation des étiquettes sur les spécimens pour les collections botaniques', '47', NULL),
(1051, 0, 'Liste des types d''écriture d''étiquette', '48', NULL),
(1052, 0, 'Liste des origines des dégradations des spécimens de collections botaniques', '49', NULL),
(1053, 0, 'Liste des origines des dégradations des supports de collections botaniques', '50', NULL),
(1054, 0, 'Liste des niveaux de détermination des spécimens de collections botaniques', '51', NULL),
(1055, 0, 'Liste des types de date de début', '52', NULL),
(1056, 0, 'Liste des types de date de fin', '53', NULL),
(1057, 0, 'Liste des états de classement', '54', NULL),
(1058, 0, 'Liste des informations présentes sur les étiquettes de collections botaniques', '55', NULL),
(1059, 0, 'Liste oui/non/en grande partie', '56', NULL),
(1060, 0, 'Liste indéterminé/parfois/oui/non', '57', NULL),
(1061, 0, 'Liste des formes d''inventaire', '58', NULL),
(1062, 0, 'Liste des types de logiciel pour les inventaires informatiques', '59', NULL),
(1063, 0, 'Liste des états d''inventaire', '60', NULL),
(1064, 0, 'Liste des relations entre une publication et une personne', '61', NULL),
(1065, 0, 'Liste des types de publication vis à vis d''une personne', '62', NULL),
(1066, 0, 'Liste des types d''url', '63', NULL),
(1067, 0, 'Liste du genre d''une personne', '64', NULL),
(1068, 0, 'Liste des types de commentaires associés à une collection', '65', NULL),
(1071, 0, 'Liste des langues du standard ISO-639-1', '68', NULL),
(1072, 0, 'Liste de durées de fonctionnement d''un script en heure ', '69', NULL),
(1073, 0, 'Liste de fréquences de lancement d''un script', '70', NULL),
(1074, 0, 'Liste des pays du standard ISO-3166-1', '71', NULL),
(1078, 0, 'Liste des noms de zones géographiques administrative de niveau 1 du projet Geonames', '75', NULL),
(1079, 0, 'Liste des noms de zones géographiques administrative de niveau 2 du projet Geonames', '76', NULL),
(1080, 0, 'Liste indéterminé/oui/non', '77', NULL),
(1081, 0, 'Liste des niveaux d''importance', '78', NULL),
(1082, 0, 'Liste exact/approximatif', '79', NULL),
(1083, 0, 'Liste des types de collection botanique', '80', NULL),
(2001, 1004, 'Mr.', '1', NULL),
(2002, 1004, 'Dr.', '2', NULL),
(2003, 1004, 'Abbé', '3', NULL),
(2004, 1004, 'Colonel', '4', NULL),
(2005, 1004, 'Prof.', '5', NULL),
(2006, 1004, 'von', '6', NULL),
(2007, 1004, 'Lord', '7', NULL),
(2008, 1005, 'Jr', '1', NULL),
(2009, 1005, 'I', '2', NULL),
(2010, 1005, 'II', '3', NULL),
(2011, 1005, 'III', '4', NULL),
(2012, 1006, 'Surnom', 'SNO', NULL),
(2013, 1006, 'Nom alternatif', 'ALT', NULL),
(2014, 1007, 'Portable', 'GSM', NULL),
(2015, 1007, 'Téléphone fixe', 'FIX', NULL),
(2016, 1007, 'Pager', 'PAG', NULL),
(2017, 1009, 'Super-Administrateur', '1', NULL),
(2018, 1009, 'Administrateur', '2', NULL),
(2019, 1009, 'Coordinateur', '3', NULL),
(2020, 1009, 'Contributeur', '4', NULL),
(2021, 1009, 'Utilisateur', '5', NULL),
(2022, 1010, 'Administrateur', '1', NULL),
(2023, 1010, 'Coordinateur', '2', NULL),
(2024, 1010, 'Contributeur', '3', NULL),
(2025, 1010, 'est coordinateur de', '4', NULL),
(2026, 1011, 'est administrer par', 'EAP', 'Indique quelle personne peut administrer les données dans l''application courante.'),
(2027, 1011, 'équipe', 'EQU', 'Rôle général d''une personne au sein d''une structure.'),
(2028, 1012, 'Directeur', '1', NULL),
(2029, 1012, 'Conservateur', '2', NULL),
(2030, 1012, 'Technicien', '3', NULL),
(2031, 1013, 'Salarié', '1', NULL),
(2032, 1013, 'Bénévole', '2', NULL),
(2033, 1014, 'Aquarium', '1', NULL),
(2034, 1014, 'Archive', '2', NULL),
(2035, 1014, 'Jardin botanique', '3', NULL),
(2036, 1014, 'Protection de la nature', '4', NULL),
(2037, 1014, 'Station d''étude', '5', NULL),
(2038, 1014, 'Établissement d''État', '6', NULL),
(2039, 1014, 'Société d''histoire', '7', NULL),
(2040, 1014, 'Établissement horticole', '8', NULL),
(2041, 1014, 'Industrie', '9', NULL),
(2042, 1014, 'Laboratoire', '10', NULL),
(2043, 1014, 'Bibliothèque', '11', NULL),
(2044, 1014, 'Gestion de la nature', '12', NULL),
(2045, 1014, 'Museum', '13', NULL),
(2046, 1014, 'Centre d''éducation à la nature', '14', NULL),
(2047, 1014, 'Établissement scolaire (Lycée)', '15', NULL),
(2048, 1014, 'Parc', '16', NULL),
(2049, 1014, 'Dépôt', '17', NULL),
(2050, 1014, 'Institut de Recherche', '18', NULL),
(2051, 1014, 'Établissement scolaire (École primaire)', '19', NULL),
(2052, 1014, 'Centre scientifique', '20', NULL),
(2053, 1014, 'Société', '21', NULL),
(2054, 1014, 'Établissement scolaire (Université)', '22', NULL),
(2055, 1014, 'Zoo', '23', NULL),
(2056, 1015, 'Association', '1', NULL),
(2057, 1015, 'Laboratoire', '2', NULL),
(2058, 1015, 'Fondation', '3', NULL),
(2059, 1015, 'Particulier', '4', NULL),
(2060, 1016, 'Service municipal', '1', NULL),
(2061, 1016, 'Conseil général', '2', NULL),
(2062, 1016, 'National', '3', NULL),
(2063, 1016, 'Université', '4', NULL),
(2064, 1016, 'Conseil Régional', '5', NULL),
(2065, 1017, 'Index Herbarorium', 'IH', 'Base de données mondiale où se trouvent répertoriées des informations sur plus de 3000 herbiers publics dans le monde ainsi que leurs équipes. Chaque herbier enregistré dans cet index est désigné également par un acronyme international. Exemple : Herbier '),
(2066, 1017, 'Muséum National d''Histoire Naturelle', 'MNHN', 'Pour toute demande de création d''un acronyme français contacter Marc PIGNAL <pignal@mnhn.fr>, chargé de conservation de l''herbier National de Paris (P).\nLes herbiers de moins de 5000 spécimens ne seront recensés qu''au niveau du MNHN. Par la suite, lorsque'),
(2067, 1018, 'Réserves', '1', 'Lieu de stockage des collections d''un musée, d''une bibliothèque, etc. qui sert à conserver les collections, les étudier et les gérer mais non accessible au public.'),
(2068, 1018, 'Bâtiment (ex. : Herbier)', '2', NULL),
(2069, 1018, 'Pièce', '3', NULL),
(2070, 1019, 'Rayonnages mobiles type Compactus', '1', 'Rayonnages sur rails pouvant être déplacés, manuellement ou automatiquement, de façon à utiliser l''espace ordinairement occupé par les allées de desserte entre travées.'),
(2071, 1019, 'Armoires métalliques', '2', NULL),
(2072, 1019, 'Armoires en bois', '3', NULL),
(2073, 1019, 'Étagères métalliques', '4', NULL),
(2074, 1019, 'Étagères en bois', '5', NULL),
(2075, 1020, 'Température extrêmement élevée', '1', NULL),
(2076, 1020, 'Hygrométrie', '2', NULL),
(2077, 1020, 'Lumière', '3', NULL),
(2078, 1020, 'Température extrêmement basse', '4', NULL),
(2079, 1021, 'Collection d''entomologie (insectes)', '1', NULL),
(2080, 1021, 'Animaux naturalisés', '2', NULL),
(2081, 1021, 'Bibliothèque générale', '3', NULL),
(2082, 1021, 'Bibliothèque botanique', '4', NULL),
(2083, 1021, 'Collections d''ethnologie', '5', NULL),
(2084, 1021, 'Archives papier', '6', NULL),
(2085, 1021, 'Collection de diapos/photos', '7', NULL),
(2086, 1021, 'Minéraux', '8', NULL),
(2087, 1022, 'Remplacement des contenants (cartons, planches, etc)', '1', NULL),
(2088, 1022, 'Remplacement du papier', '2', NULL),
(2089, 1022, 'Montage des échantillons', '3', NULL),
(2090, 1022, 'Montage des étiquettes', '4', NULL),
(2091, 1022, 'Reclassement', '5', NULL),
(2092, 1023, 'Non', '1', NULL),
(2093, 1023, 'Oui', '2', NULL),
(2094, 1023, 'En partie', '3', NULL),
(2096, 1024, 'Papier normal', '2', NULL),
(2097, 1024, 'Papier épais', '3', NULL),
(2098, 1024, 'Papier cartonné', '4', NULL),
(2099, 1024, 'Colle forte', '5', NULL),
(2100, 1024, 'Colle en stick', '6', NULL),
(2101, 1024, 'Colle blanche', '7', NULL),
(2102, 1024, 'Ruban adhésif standard', '8', NULL),
(2103, 1025, 'Fumigations', '1', NULL),
(2104, 1025, 'Paradichlorobenzène ou anti-mites', '2', NULL),
(2105, 1025, 'Insecticide en bombe', '3', NULL),
(2106, 1025, 'Anoxie', '4', NULL),
(2107, 1025, 'Surgélation', '5', NULL),
(2108, 1025, 'Congélation', '6', NULL),
(2109, 1025, 'Four micro-ondes', '7', NULL),
(2110, 1026, 'Préparation à base de mercure', '1', NULL),
(2111, 1026, 'Préparation à base d’arsenic', '2', NULL),
(2112, 1026, 'Préparation à base de mercure et d’arsenic', '3', NULL),
(2113, 1027, 'Ouvrages', '1', NULL),
(2114, 1027, 'Articles de presse ou interviews radio / TV', '2', NULL),
(2115, 1027, 'Animations', '3', NULL),
(2116, 1027, 'Articles scientifiques', '4', NULL),
(2117, 1027, 'Visites de groupes', '5', NULL),
(2118, 1027, 'Conférences', '6', NULL),
(2119, 1027, 'Expositions', '7', NULL),
(2120, 1028, 'France', '1', NULL),
(2121, 1028, 'Europe', '2', NULL),
(2122, 1028, 'Asie', '3', NULL),
(2123, 1028, 'Amérique', '4', NULL),
(2124, 1028, 'Afrique', '5', NULL),
(2125, 1028, 'Océanie', '6', NULL),
(2126, 1029, 'Systématique', '1', NULL),
(2127, 1029, 'Chorologie', '2', NULL),
(2128, 1029, 'Biologie moléculaire', '3', NULL),
(2129, 1029, 'Pharmacie', '4', NULL),
(2130, 1029, 'Ethnobotanique', '5', NULL),
(2131, 1029, 'Histoire des sciences', '6', NULL),
(2132, 1029, 'Palynologie', '7', NULL),
(2133, 1029, 'Paléobotanique', '8', NULL),
(2134, 1030, 'Contributeur (celui qui a saisi la fiche le premier)', '1', NULL),
(2135, 1030, 'Auteur', '2', NULL),
(2136, 1030, 'Collecteur', '3', NULL),
(2137, 1030, 'Déterminateur', '4', NULL),
(2138, 1030, 'Hébergeur (particulier possédant une collection chez lui)', '5', NULL),
(2139, 1031, 'inclu dans', '1', NULL),
(2140, 1032, 'Archive', 'archival', NULL),
(2141, 1032, 'Art', 'art', NULL),
(2142, 1032, 'Audio', 'audio', NULL),
(2143, 1032, 'Culture de cellules', 'cellcultures', NULL),
(2144, 1032, 'Électronique', 'electronic', NULL),
(2145, 1032, 'Facsimilés', 'facsimiles', NULL),
(2146, 1032, 'Fossiles', 'fossils', NULL),
(2147, 1032, 'Génétique', 'genetic', NULL),
(2148, 1032, 'Vivante', 'living', NULL),
(2149, 1032, 'Observations', 'observations', NULL),
(2150, 1032, 'Préservée', 'preserved', NULL),
(2151, 1032, 'Produits', 'products', NULL),
(2152, 1032, 'Spécimens', 'taxonomic', NULL),
(2153, 1032, 'Textes (Manuscrits)', 'texts', NULL),
(2154, 1032, 'Tissus biologiques', 'tissue', NULL),
(2155, 1032, 'Visuelle', 'visual', NULL),
(2156, 1032, 'Géologique', '_geologique_', NULL),
(2157, 1032, 'Herbier', '_herbier_', NULL),
(2158, 1032, 'Minéralogique', '_mineralogique_', NULL),
(2159, 1033, 'Patrimoine de l''institution', '1', NULL),
(2160, 1033, 'Dépôt permanent', '2', NULL),
(2161, 1033, 'Dépôt temporaire', '3', NULL),
(2162, 1033, 'Dépôt non consultable (privé)', '4', NULL),
(2163, 1033, 'Prêt', '5', NULL),
(2164, 1034, 'Culturel', 'cultural', NULL),
(2165, 1034, 'Écosystème', 'ecosystems', NULL),
(2166, 1034, 'Environmental', 'environmental', NULL),
(2167, 1034, 'Évènement', 'events', NULL),
(2168, 1034, 'Expédition', 'expeditions', NULL),
(2169, 1034, 'National', 'national', NULL),
(2170, 1034, 'Relation biologique', 'relationships', NULL),
(2171, 1034, 'Dépôt', 'repository', NULL),
(2172, 1034, 'Spatial', 'spatial', NULL),
(2173, 1034, 'Stade de développement', 'stage', NULL),
(2174, 1034, 'Taxonomique', 'taxonomic', NULL),
(2175, 1034, 'Période', 'temporal', NULL),
(2176, 1035, 'Commercial', 'commercial', NULL),
(2177, 1035, 'Analyses destructrices', 'destructiveAnalysis', NULL),
(2178, 1035, 'Éducation', 'education', NULL),
(2179, 1035, 'Présentation', 'exhibition', NULL),
(2180, 1035, 'Étude', 'monitoring', NULL),
(2181, 1035, 'Ornemental', 'ornamental', NULL),
(2182, 1035, 'personnel', 'personal', NULL),
(2183, 1035, 'Recherche', 'research', NULL),
(2184, 1035, 'Voucher (à traduire)', 'voucher', NULL),
(2185, 1036, 'Mac Ginley 1', 'McGinley1', 'Specimens deteriorating, potentially cullable, or unprepared. Collection unit in need of immediate attention; museum pests, rusting pins, crystallizing slide media, unringed Hoyer''s media, evaporated alcohol, fading labels, broken cover slip or slide, etc'),
(2186, 1036, 'Mac Ginley 2', 'McGinley2', 'Material properly prepared but not sorted or only rough-sorted; not readily available to specialists.'),
(2187, 1036, 'Mac Ginley 3', 'McGinley3', 'Specimens sorted to a level necessary to be efficiently accessible to research specialist for study. All specimens in soft-bottom trays, shell vials in jars or slide boxes, with appropriate levels denoting pertinent taxonomic information. Taxonomic catego'),
(2188, 1036, 'Mac Ginley 4', 'McGinley4', 'Valuable material that has been identified to the species level but not yet put away effectively inaccessible.'),
(2189, 1036, 'Mac Ginley 5', 'McGinley5', 'All specimens identified and integrated. However, this collection unit needs upgrading, e.g., names checked, header labels for unit trays prepared, transfer to soft-bottom trays, etc., box header labels checked against slides. Alcoholic collection with in'),
(2190, 1036, 'Mac Ginley 6', 'McGinley6', 'All specimens in soft-bottom unit trays; all unit-tray header labels, drawer or box, and cabinet labels completed; space left for expansion. When a collection reaches Level 6, the name(s) or who did the curation, the date of curation and listing of catalo'),
(2191, 1036, 'Mac Ginley 7', 'McGinley7', 'Species inventory with header or box label generation completed. Alcoholic collection with taxa listed on jar labels and in database, as in Level 6 plus species-level inventory.'),
(2192, 1036, 'Mac Ginley 8', 'McGinley8', 'Label data are recorded for systematic, biogeography or natural history studies. The data elements recorded will vary by group, however, a d standard core set includes the following: a) a country/province/place/latitude-longitude; b) date of collection; c'),
(2193, 1036, 'Mac Ginley 9', 'McGinley9', 'Measurements, graphics, or other pertinent (descriptions) of specimens are captured in a database.'),
(2194, 1036, 'Mac Ginley 10', 'McGinley10', 'Groups of specimens included in published monographic, synthetic, or revisionary works, including primary type collection if storage is at Level 7 or higher. When groups of specimens serve to voucher published scientific collection-based studies and have '),
(2195, 1037, 'Animal', 'Animalia', NULL),
(2196, 1037, 'Champignon', 'Fungi', NULL),
(2197, 1037, 'Végétal', 'Plantae', NULL),
(2198, 1037, 'Protiste', 'Protista', NULL),
(2199, 1037, 'Archéobactérie', 'Archaebacteria', NULL),
(2200, 1037, 'Eubactérie', 'Eubacteria', NULL),
(2201, 1038, 'Atmosphère contrôlée', 'controlledAtmosphere', NULL),
(2202, 1038, 'Cryogénisation', 'cryopreserved', NULL),
(2203, 1038, 'Séchée', 'dried', NULL),
(2204, 1038, 'Séchée et pressée', 'driedAndPressed', NULL),
(2205, 1038, 'Enchâssé (Maintenu dans une matrice solide, convenant pour la confection des lames minces)', 'embedded', NULL),
(2206, 1038, 'Préservation dans un liquide', 'fluidPreserved', NULL),
(2207, 1038, 'Réfrigéré et séché', 'freezeDried', NULL),
(2208, 1038, 'Congelé', 'frozen', NULL),
(2209, 1038, 'Glycérine', 'glycerin', NULL),
(2210, 1038, 'Inapplicable', 'notApplicable', NULL),
(2211, 1038, 'Aucun traitement', 'noTreatment', NULL),
(2212, 1038, 'Attaché (Épinglé)', 'pinned', NULL),
(2213, 1038, 'Enregistrement analogique', 'recordedAnalog', NULL),
(2214, 1038, 'Enregistrement numérique', 'recordedDigital', NULL),
(2215, 1038, 'Réfrigéré', 'refrigerated', NULL),
(2216, 1038, 'Préparation pour microscope électronique à balayage', 'semstub', NULL),
(2217, 1038, 'Squelette', 'skeletonized', NULL),
(2218, 1038, 'Préparation microscopique', 'slideMount', NULL),
(2219, 1038, 'Stase', 'stasis', NULL),
(2220, 1038, 'surfaceCoating', 'surfaceCoating', NULL),
(2221, 1038, 'Tanage', 'tanned', NULL),
(2222, 1038, 'Alcool', '_fluidPreservedAlcohol_', NULL),
(2223, 1038, 'Formol', '_fluidPreservedFormolin_', NULL),
(2224, 1038, 'Gomme arabique', '_gumArabic_', NULL),
(2225, 1039, 'Croissance active', 'activegrowth', NULL),
(2226, 1039, 'Fermée', 'closed', NULL),
(2227, 1039, 'Consommable', 'consumable', NULL),
(2228, 1039, 'Décroissance', 'decreasing', NULL),
(2229, 1039, 'Perdu', 'lost', NULL),
(2230, 1039, 'Manquante', 'missing', NULL),
(2231, 1039, 'Croissance passive', 'passivegrowth', NULL),
(2232, 1039, 'Statique', 'static', NULL),
(2233, 1040, '16ème siècle', '1', NULL),
(2234, 1040, '17ème siècle', '2', NULL),
(2235, 1040, '18ème siècle', '3', NULL),
(2236, 1040, '19ème siècle', '4', NULL),
(2237, 1040, '20ème siècle', '5', NULL),
(2238, 1040, '21ème siècle', '6', NULL),
(2239, 1041, 'Indéterminé (= ne sais pas)', '1', NULL),
(2240, 1041, 'Peut-être', '2', NULL),
(2241, 1041, 'Oui', '3', NULL),
(2242, 1041, 'Non', '4', NULL),
(2243, 1042, 'À part', '1', NULL),
(2244, 1042, 'Inclus', '2', NULL),
(2245, 1042, 'Partiellement extraits', '3', NULL),
(2246, 1043, 'Phanérogames', '1', NULL),
(2247, 1043, 'Gymnosperme (Conifère)', '2', NULL),
(2248, 1043, 'Angiosperme (plantes à fleur)', '3', NULL),
(2249, 1043, 'Cryptogames', '4', NULL),
(2250, 1043, 'Algues (y compris Characées et Diatomées)', '5', NULL),
(2251, 1043, 'Champignons', '6', NULL),
(2252, 1043, 'Lichens', '7', NULL),
(2253, 1043, 'Bryophytes (Mousses)', '8', NULL),
(2254, 1043, 'Ptéridophytes (Fougères)', '9', NULL),
(2255, 1044, 'Cartons d''herbiers', '1', NULL),
(2256, 1044, 'Liasses', '2', NULL),
(2257, 1044, 'Ouvrages reliés (cahiers, livres, ...)', '3', NULL),
(2258, 1044, 'Classeurs', '4', NULL),
(2259, 1044, 'Pochettes à élastiques', '5', NULL),
(2260, 1044, 'Bocaux', '6', NULL),
(2261, 1044, 'Boîtes d''herbier en bois', '7', NULL),
(2262, 1044, 'Piluliers (en bois, plastique, verre, ...)', '8', NULL),
(2263, 1044, 'Boîtes de péparations microscopiques', '9', NULL),
(2264, 1044, 'Boîtes à chaussures', '10', NULL),
(2265, 1045, 'Très mauvais état', '1', 'Remplacement ou restauration à faire d''urgence'),
(2266, 1045, 'Mauvais état', '2', 'Remplacement ou restauration à faire assez rapidement'),
(2267, 1045, 'État moyen', '3', 'Remplacement ou restauration à envisager'),
(2268, 1045, 'Bon état', '4', 'Peu de restauration à faire'),
(2269, 1045, 'Très bon état', '5', 'Pas de restauration'),
(2270, 1046, 'Planches d''herbiers', '1', NULL),
(2271, 1046, 'Lames de préparations microscopiques', '2', NULL),
(2272, 1046, 'Boîtes (à allumettes, à savons...)', '3', NULL),
(2273, 1046, 'Enveloppes', '4', NULL),
(2274, 1046, 'Plaques de carton', '5', NULL),
(2275, 1046, 'Pochettes en plastiques pour classeur', '6', NULL),
(2276, 1047, 'Journal', '1', NULL),
(2277, 1047, 'Papier cartonné', '2', NULL),
(2278, 1047, 'Papier normal', '3', NULL),
(2279, 1047, 'Papier épais', '4', NULL),
(2280, 1047, 'Buvard', '5', NULL),
(2281, 1047, 'Papier très fin', '6', NULL),
(2282, 1047, 'Cahier', '7', NULL),
(2283, 1048, 'Dans des chemises', '1', NULL),
(2284, 1048, 'Sur des feuilles', '2', NULL),
(2285, 1048, 'Sur des feuilles incluses dans des chemises', '3', NULL),
(2286, 1048, 'Sur des feuilles incluses dans des pochettes plastique', '4', NULL),
(2287, 1048, 'Dans des sachets cellophane', '5', NULL),
(2288, 1048, 'Sur des lames de verre', '6', NULL),
(2289, 1049, 'Papier gommé', '1', NULL),
(2290, 1049, 'Colle', '2', NULL),
(2291, 1049, 'Cousus au support', '3', NULL),
(2292, 1049, 'Épinglés au support', '4', NULL),
(2293, 1049, 'Glissés dans des fentes découpées dans le support', '5', NULL),
(2294, 1049, 'Plastifiés', '6', NULL),
(2295, 1049, 'Papier adhésif typescotch', '7', NULL),
(2296, 1050, 'Par épingles', '1', NULL),
(2297, 1050, 'Par un fil', '2', NULL),
(2298, 1050, 'Spécimens glissés dans des fentes découpées dans l''étiquette', '3', NULL),
(2299, 1051, 'Manuscrites', '1', NULL),
(2300, 1051, 'Dactylographiées', '2', NULL),
(2301, 1051, 'Imprimées', '3', NULL),
(2302, 1051, 'Ronéotypées', '4', NULL),
(2303, 1052, 'Humidité / moisissures', '1', NULL),
(2304, 1052, 'Attaques d''insectes', '2', NULL),
(2305, 1052, 'Attaques de rongeurs', '3', NULL),
(2306, 1053, 'Humidité / moisissures', '1', NULL),
(2307, 1053, 'Attaques d''insectes', '2', NULL),
(2308, 1053, 'Attaques de rongeurs', '3', NULL),
(2309, 1053, 'Papiers usagés', '4', NULL),
(2310, 1053, 'Mélange spécimens et étiquettes', '5', 'Les spécimens et/ou étiquettes sont mélangés ou détachés.'),
(2311, 1054, 'Uniquement des fragments, aucune détermination sure possible', '1', NULL),
(2312, 1054, 'Échantillons de tailles correctes mais majoritairement sans organes nécessaires à la détermination', '2', NULL),
(2313, 1054, 'Une bonne partie des échantillons peuvent être déterminés', '3', NULL),
(2314, 1054, 'La majorité des échantillons peuvent être déterminés', '4', NULL),
(2315, 1054, 'Tous les échantillons présentent les caractères nécessaires à la détermination', '5', NULL),
(2316, 1055, 'Date inconnue', '1', NULL),
(2317, 1055, 'Date exacte', '2', NULL),
(2318, 1055, 'Antérieure à', '3', NULL),
(2319, 1055, 'Postérieure à', '4', NULL),
(2320, 1055, 'Date estimée', '5', NULL),
(2321, 1056, 'Date inconnue', '1', NULL),
(2322, 1056, 'Date exacte', '2', NULL),
(2323, 1056, 'Antérieure à', '3', NULL),
(2324, 1056, 'Postérieure à', '4', NULL),
(2325, 1056, 'Date estimée', '5', NULL),
(2326, 1056, 'Encore en activité', '6', NULL),
(2327, 1057, 'Contenants et parts sans classement, recherche d''échantillon précis très difficile, classement à met', '1', NULL),
(2328, 1057, 'Classement existant à l''origine mais mélangé, rangement à faire assez rapidement', '2', NULL),
(2329, 1057, 'Classement respecté mais pas dans son intégralité, rangement à envisager', '3', NULL),
(2330, 1057, 'Peu déclassé, peu de rangement à effectuer', '4', NULL),
(2331, 1057, 'Entièrement classé', '5', NULL),
(2332, 1058, 'Nom de l''auteur de la collection botanique ou du titre de la collection', '1', NULL),
(2333, 1058, 'Nom de famille', '2', NULL),
(2334, 1058, 'Nom de genre', '3', NULL),
(2335, 1058, 'Nom de l''espèce', '4', NULL),
(2336, 1058, 'Nom d''auteur', '5', NULL),
(2337, 1058, 'Localité de récolte', '6', NULL),
(2338, 1058, 'Date de récolte', '7', NULL),
(2339, 1059, 'Oui', '1', NULL),
(2340, 1059, 'Non', '2', NULL),
(2341, 1059, 'En grande partie', '3', NULL),
(2342, 1060, 'Indéterminé (= ne sais pas)', '1', NULL),
(2343, 1060, 'Parfois', '2', NULL),
(2344, 1060, 'Oui', '3', NULL),
(2345, 1060, 'Non', '4', NULL),
(2346, 1061, 'Manuscrite', '1', NULL),
(2347, 1061, 'Imprimé', '2', NULL),
(2348, 1061, 'Informatique', '3', NULL),
(2349, 1062, 'Sonnerat/BryoMyco', '1', NULL),
(2350, 1062, '4D', '2', NULL),
(2351, 1062, 'SNBase', '3', NULL),
(2352, 1062, 'Dbase', '4', NULL),
(2353, 1062, 'Access', '5', NULL),
(2354, 1062, 'File Maker', '6', NULL),
(2355, 1062, 'Excel', '7', NULL),
(2356, 1062, 'Word', '8', NULL),
(2357, 1063, 'Indéterminé (= ne sais pas)', '1', NULL),
(2358, 1063, 'Complet', '2', NULL),
(2359, 1063, 'En cours', '3', NULL),
(2360, 1064, 'Auteur', '1', NULL),
(2361, 1065, 'Nécrologie', '1', NULL),
(2362, 1065, 'Biographie', '2', NULL),
(2363, 1065, 'Publication personnelle', '3', NULL),
(2364, 1066, 'Page Web', 'WEB', NULL),
(2365, 1066, 'URL d''un logo', 'LOGO', NULL),
(2366, 1067, 'Homme', 'H', NULL),
(2367, 1067, 'Femme', 'F', NULL),
(2368, 1068, 'Géographique', '1', NULL),
(2369, 1068, 'Taxinomique', '2', NULL),
(2370, 1068, 'Historique', '3', NULL),
(2371, 1068, 'Échantillons-types', '4', NULL),
(2372, 1068, 'Collecteurs', '5', NULL),
(2373, 1068, 'Statut', '6', NULL),
(2381, 1071, 'Afar', 'AA', NULL),
(2382, 1071, 'Abkhaze', 'AB', NULL),
(2383, 1071, 'Avestique', 'AE', NULL),
(2384, 1071, 'Afrikaans', 'AF', NULL),
(2385, 1071, 'Akan', 'AK', NULL),
(2386, 1071, 'Amharique', 'AM', NULL),
(2387, 1071, 'Aragonais', 'AN', NULL),
(2388, 1071, 'Arabe', 'AR', NULL),
(2389, 1071, 'Assamais', 'AS', NULL),
(2390, 1071, 'Avar', 'AV', NULL),
(2391, 1071, 'Aymara', 'AY', NULL),
(2392, 1071, 'Azéri', 'AZ', NULL),
(2393, 1071, 'Bachkir', 'BA', NULL),
(2394, 1071, 'Biélorusse', 'BE', NULL),
(2395, 1071, 'Bulgare', 'BG', NULL),
(2396, 1071, 'Bihari', 'BH', NULL),
(2397, 1071, 'Bichelamar', 'BI', NULL),
(2398, 1071, 'Bambara', 'BM', NULL),
(2399, 1071, 'Bengalî', 'BN', NULL),
(2400, 1071, 'Tibétain', 'BO', NULL),
(2401, 1071, 'Breton', 'BR', NULL),
(2402, 1071, 'Bosnien', 'BS', NULL),
(2403, 1071, 'Catalan', 'CA', NULL),
(2404, 1071, 'Tchétchène', 'CE', NULL),
(2405, 1071, 'Chamorro', 'CH', NULL),
(2406, 1071, 'Corse', 'CO', NULL),
(2407, 1071, 'Cri', 'CR', NULL),
(2408, 1071, 'Tchèque', 'CS', NULL),
(2409, 1071, 'Vieux slave', 'CU', NULL),
(2410, 1071, 'Tchouvache', 'CV', NULL),
(2411, 1071, 'Gallois', 'CY', NULL),
(2412, 1071, 'Danois', 'DA', NULL),
(2413, 1071, 'Allemand', 'DE', NULL),
(2414, 1071, 'Divehi', 'DV', NULL),
(2415, 1071, 'Dzongkha', 'DZ', NULL),
(2416, 1071, 'Ewe', 'EE', NULL),
(2417, 1071, 'Grec moderne', 'EL', NULL),
(2418, 1071, 'Anglais', 'EN', NULL),
(2419, 1071, 'Espéranto', 'EO', NULL),
(2420, 1071, 'Espagnol', 'ES', NULL),
(2421, 1071, 'Estonien', 'ET', NULL),
(2422, 1071, 'Basque', 'EU', NULL),
(2423, 1071, 'Perse', 'FA', NULL),
(2424, 1071, 'Peul', 'FF', NULL),
(2425, 1071, 'Finnois', 'FI', NULL),
(2426, 1071, 'Fidjien', 'FJ', NULL),
(2427, 1071, 'Féringien', 'FO', NULL),
(2428, 1071, 'Français', 'FR', NULL),
(2429, 1071, 'Frison', 'FY', NULL),
(2430, 1071, 'Irlandais', 'GA', NULL),
(2431, 1071, 'Écossais', 'GD', NULL),
(2432, 1071, 'Galicien', 'GL', NULL),
(2433, 1071, 'Guarani', 'GN', NULL),
(2434, 1071, 'Gujarâtî', 'GU', NULL),
(2435, 1071, 'Mannois', 'GV', NULL),
(2436, 1071, 'Haoussa', 'HA', NULL),
(2437, 1071, 'Hébreu', 'HE', NULL),
(2438, 1071, 'Hindî', 'HI', NULL),
(2439, 1071, 'Hiri motu', 'HO', NULL),
(2440, 1071, 'Croate', 'HR', NULL),
(2441, 1071, 'Créole haïtien', 'HT', NULL),
(2442, 1071, 'Hongrois', 'HU', NULL),
(2443, 1071, 'Arménien', 'HY', NULL),
(2444, 1071, 'Herero', 'HZ', NULL),
(2445, 1071, 'Interlingua', 'IA', NULL),
(2446, 1071, 'Indonésien', 'ID', NULL),
(2447, 1071, 'Occidental', 'IE', NULL),
(2448, 1071, 'Igbo', 'IG', NULL),
(2449, 1071, 'Yi', 'II', NULL),
(2450, 1071, 'Inupiaq', 'IK', NULL),
(2451, 1071, 'Ido', 'IO', NULL),
(2452, 1071, 'Islandais', 'IS', NULL),
(2453, 1071, 'Italien', 'IT', NULL),
(2454, 1071, 'Inuktitut', 'IU', NULL),
(2455, 1071, 'Japonais', 'JA', NULL),
(2456, 1071, 'Javanais', 'JV', NULL),
(2457, 1071, 'Géorgien', 'KA', NULL),
(2458, 1071, 'Kikongo', 'KG', NULL),
(2459, 1071, 'Kikuyu', 'KI', NULL),
(2460, 1071, 'Kuanyama', 'KJ', NULL),
(2461, 1071, 'Kazakh', 'KK', NULL),
(2462, 1071, 'Kalaallisut', 'KL', NULL),
(2463, 1071, 'Khmer', 'KM', NULL),
(2464, 1071, 'Kannara', 'KN', NULL),
(2465, 1071, 'Coréen', 'KO', NULL),
(2466, 1071, 'Kanouri', 'KR', NULL),
(2467, 1071, 'Kashmiri', 'KS', NULL),
(2468, 1071, 'Kurde', 'KU', NULL),
(2469, 1071, 'Komi', 'KV', NULL),
(2470, 1071, 'Cornique', 'KW', NULL),
(2471, 1071, 'Kirghiz', 'KY', NULL),
(2472, 1071, 'Latin', 'LA', NULL),
(2473, 1071, 'Luxembourgeois', 'LB', NULL),
(2474, 1071, 'Ganda', 'LG', NULL),
(2475, 1071, 'Limbourgeois', 'LI', NULL),
(2476, 1071, 'Lingala', 'LN', NULL),
(2477, 1071, 'Lao', 'LO', NULL),
(2478, 1071, 'Lituanien', 'LT', NULL),
(2479, 1071, 'Tchiluba', 'LU', NULL),
(2480, 1071, 'Letton', 'LV', NULL),
(2481, 1071, 'Malgache', 'MG', NULL),
(2482, 1071, 'Marshallais', 'MH', NULL),
(2483, 1071, 'Māori de Nouvelle-Zélande', 'MI', NULL),
(2484, 1071, 'Macédonien', 'MK', NULL),
(2485, 1071, 'Malayalam', 'ML', NULL),
(2486, 1071, 'Mongol', 'MN', NULL),
(2487, 1071, 'Moldave', 'MO', NULL),
(2488, 1071, 'Marâthî', 'MR', NULL),
(2489, 1071, 'Malais', 'MS', NULL),
(2490, 1071, 'Maltais', 'MT', NULL),
(2491, 1071, 'Birman', 'MY', NULL),
(2492, 1071, 'Nauruan', 'NA', NULL),
(2493, 1071, 'Norvégien Bokmål', 'NB', NULL),
(2494, 1071, 'Ndébélé du Nord', 'ND', NULL),
(2495, 1071, 'Népalais', 'NE', NULL),
(2496, 1071, 'Ndonga', 'NG', NULL),
(2497, 1071, 'Néerlandais', 'NL', NULL),
(2498, 1071, 'Norvégien Nynorsk', 'NN', NULL),
(2499, 1071, 'Norvégien', 'NO', NULL),
(2500, 1071, 'Ndébélé du Sud', 'NR', NULL),
(2501, 1071, 'Navajo', 'NV', NULL),
(2502, 1071, 'Chichewa', 'NY', NULL),
(2503, 1071, 'Occitan', 'OC', NULL),
(2504, 1071, 'Ojibwé', 'OJ', NULL),
(2505, 1071, 'Oromo', 'OM', NULL),
(2506, 1071, 'Oriya', 'OR', NULL),
(2507, 1071, 'Ossète', 'OS', NULL),
(2508, 1071, 'Panjâbî', 'PA', NULL),
(2509, 1071, 'Pâli', 'PI', NULL),
(2510, 1071, 'Polonais', 'PL', NULL),
(2511, 1071, 'Pachto', 'PS', NULL),
(2512, 1071, 'Portugais', 'PT', NULL),
(2513, 1071, 'Quechua', 'QU', NULL),
(2514, 1071, 'Romanche', 'RM', NULL),
(2515, 1071, 'Kirundi', 'RN', NULL),
(2516, 1071, 'Roumain', 'RO', NULL),
(2517, 1071, 'Russe', 'RU', NULL),
(2518, 1071, 'Kinyarwanda', 'RW', NULL),
(2519, 1071, 'Sanskrit', 'SA', NULL),
(2520, 1071, 'Sarde', 'SC', NULL),
(2521, 1071, 'Sindhi', 'SD', NULL),
(2522, 1071, 'Same du Nord', 'SE', NULL),
(2523, 1071, 'Sango', 'SG', NULL),
(2524, 1071, 'Serbo-croate', 'SH', NULL),
(2525, 1071, 'Cingalais', 'SI', NULL),
(2526, 1071, 'Slovaque', 'SK', NULL),
(2527, 1071, 'Slovène', 'SL', NULL),
(2528, 1071, 'Samoan', 'SM', NULL),
(2529, 1071, 'Shona', 'SN', NULL),
(2530, 1071, 'Somali', 'SO', NULL),
(2531, 1071, 'Albanais', 'SQ', NULL),
(2532, 1071, 'Serbe', 'SR', NULL),
(2533, 1071, 'Siswati', 'SS', NULL),
(2534, 1071, 'Sotho du Sud', 'ST', NULL),
(2535, 1071, 'Sundanais', 'SU', NULL),
(2536, 1071, 'Suédois', 'SV', NULL),
(2537, 1071, 'Swahili', 'SW', NULL),
(2538, 1071, 'Tamoul', 'TA', NULL),
(2539, 1071, 'Télougou', 'TE', NULL),
(2540, 1071, 'Tadjik', 'TG', NULL),
(2541, 1071, 'Thaï', 'TH', NULL),
(2542, 1071, 'Tigrinya', 'TI', NULL),
(2543, 1071, 'Turkmène', 'TK', NULL),
(2544, 1071, 'Tagalog', 'TL', NULL),
(2545, 1071, 'Tswana', 'TN', NULL),
(2546, 1071, 'Tongien', 'TO', NULL),
(2547, 1071, 'Turc', 'TR', NULL),
(2548, 1071, 'Tsonga', 'TS', NULL),
(2549, 1071, 'Tatar', 'TT', NULL),
(2550, 1071, 'Twi', 'TW', NULL),
(2551, 1071, 'Tahitien', 'TY', NULL),
(2552, 1071, 'Ouïghour', 'UG', NULL),
(2553, 1071, 'Ukrainien', 'UK', NULL),
(2554, 1071, 'Ourdou', 'UR', NULL),
(2555, 1071, 'Ouzbek', 'UZ', NULL),
(2556, 1071, 'Venda', 'VE', NULL),
(2557, 1071, 'Vietnamien', 'VI', NULL),
(2558, 1071, 'Volapük', 'VO', NULL),
(2559, 1071, 'Wallon', 'WA', NULL),
(2560, 1071, 'Wolof', 'WO', NULL),
(2561, 1071, 'Xhosa', 'XH', NULL),
(2562, 1071, 'Yiddish', 'YI', NULL),
(2563, 1071, 'Yoruba', 'YO', NULL),
(2564, 1071, 'Zhuang', 'ZA', NULL),
(2565, 1071, 'Chinois', 'ZH', NULL),
(2566, 1071, 'Zoulou', 'ZU', NULL),
(2567, 1072, '1 heure', '1h', NULL),
(2568, 1072, '2 heures', '2h', NULL),
(2569, 1072, '5 heures', '5h', NULL),
(2570, 1072, '10 heures', '10h', NULL),
(2571, 1073, 'Journalier', 'J', NULL),
(2572, 1073, 'Hebdomadaire', 'H', NULL),
(2573, 1073, 'Mensuel', 'M', NULL),
(2574, 1073, 'Bi-mensuel', 'B', NULL),
(2575, 1073, 'Trimestriel', 'T', NULL),
(2576, 1073, 'Semestriel', 'S', NULL),
(2577, 1074, 'Afghanistan', 'AF', NULL),
(2578, 1074, 'Afrique du Sud', 'ZA', NULL),
(2579, 1074, 'Åland', 'AX', NULL),
(2580, 1074, 'Albanie', 'AL', NULL),
(2581, 1074, 'Algérie', 'DZ', NULL),
(2582, 1074, 'Allemagne', 'DE', NULL),
(2583, 1074, 'Andorre', 'AD', NULL),
(2584, 1074, 'Angola', 'AO', NULL),
(2585, 1074, 'Anguilla', 'AI', NULL),
(2586, 1074, 'Antarctique', 'AQ', NULL),
(2587, 1074, 'Antigua-et-Barbuda', 'AG', NULL),
(2588, 1074, 'Antilles néerlandaises', 'AN', NULL),
(2589, 1074, 'Arabie saoudite', 'SA', NULL),
(2590, 1074, 'Argentine', 'AR', NULL),
(2591, 1074, 'Arménie', 'AM', NULL),
(2592, 1074, 'Aruba', 'AW', NULL),
(2593, 1074, 'Australie', 'AU', NULL),
(2594, 1074, 'Autriche', 'AT', NULL),
(2595, 1074, 'Azerbaïdjan', 'AZ', NULL),
(2596, 1074, 'Bahamas', 'BS', NULL),
(2597, 1074, 'Bahreïn', 'BH', NULL),
(2598, 1074, 'Bangladesh', 'BD', NULL),
(2599, 1074, 'Barbade', 'BB', NULL),
(2600, 1074, 'Biélorussie', 'BY', NULL),
(2601, 1074, 'Belgique', 'BE', NULL),
(2602, 1074, 'Belize', 'BZ', NULL),
(2603, 1074, 'Bénin', 'BJ', NULL),
(2604, 1074, 'Bermudes', 'BM', 'Territoire d''outre-mer autonome (Royaume-Uni)'),
(2605, 1074, 'Bhoutan', 'BT', NULL),
(2606, 1074, 'Bolivie', 'BO', NULL),
(2607, 1074, 'Bosnie-Herzégovine', 'BA', NULL),
(2608, 1074, 'Botswana', 'BW', NULL),
(2609, 1074, 'Île Bouvet', 'BV', NULL),
(2610, 1074, 'Brésil', 'BR', NULL),
(2611, 1074, 'Brunei', 'BN', NULL),
(2612, 1074, 'Bulgarie', 'BG', NULL),
(2613, 1074, 'Burkina Faso', 'BF', NULL),
(2614, 1074, 'Burundi', 'BI', NULL),
(2615, 1074, 'Îles Caïmans', 'KY', NULL),
(2616, 1074, 'Cambodge', 'KH', NULL),
(2617, 1074, 'Cameroun', 'CM', NULL),
(2618, 1074, 'Canada', 'CA', NULL),
(2619, 1074, 'Cap-Vert', 'CV', NULL),
(2620, 1074, 'République centrafricaine', 'CF', NULL),
(2621, 1074, 'Chili', 'CL', NULL),
(2622, 1074, 'Chine', 'CN', 'République populaire de Chine'),
(2623, 1074, 'Île Christmas', 'CX', 'Australie'),
(2624, 1074, 'Chypre', 'CY', NULL),
(2625, 1074, 'Îles Cocos', 'CC', NULL),
(2626, 1074, 'Colombie', 'CO', NULL),
(2627, 1074, 'Comores', 'KM', NULL),
(2628, 1074, 'Congo-Brazzaville / (Congo)', 'CG', 'Congo'),
(2629, 1074, 'Congo-Kinshasa / (République démocratique du Congo)', 'CD', 'République démocratique du Congo'),
(2630, 1074, 'Îles Cook', 'CK', NULL),
(2631, 1074, 'Corée du Sud', 'KR', NULL),
(2632, 1074, 'Corée du Nord', 'KP', NULL),
(2633, 1074, 'Costa Rica', 'CR', NULL),
(2634, 1074, 'Côte d''Ivoire', 'CI', NULL),
(2635, 1074, 'Croatie', 'HR', NULL),
(2636, 1074, 'Cuba', 'CU', NULL),
(2637, 1074, 'Danemark', 'DK', NULL),
(2638, 1074, 'Djibouti', 'DJ', NULL),
(2639, 1074, 'République dominicaine', 'DO', NULL),
(2640, 1074, 'Dominique', 'DM', NULL),
(2641, 1074, 'Égypte', 'EG', NULL),
(2642, 1074, 'Salvador', 'SV', NULL),
(2643, 1074, 'Émirats arabes unis', 'AE', NULL),
(2644, 1074, 'Équateur', 'EC', NULL),
(2645, 1074, 'Érythrée', 'ER', NULL),
(2646, 1074, 'Espagne', 'ES', NULL),
(2647, 1074, 'Estonie', 'EE', NULL),
(2648, 1074, 'États-Unis', 'US', NULL),
(2649, 1074, 'Éthiopie', 'ET', NULL),
(2650, 1074, 'Îles Malouines', 'FK', 'Territoire autonome (Royaume-Uni)'),
(2651, 1074, 'Îles Féroé', 'FO', NULL),
(2652, 1074, 'Fidji', 'FJ', NULL),
(2653, 1074, 'Finlande', 'FI', NULL),
(2654, 1074, 'France', 'FR', NULL),
(2655, 1074, 'Gabon', 'GA', NULL),
(2656, 1074, 'Gambie', 'GM', NULL),
(2657, 1074, 'Géorgie', 'GE', NULL),
(2658, 1074, 'Géorgie du Sud-et-les Îles Sandwich du Sud', 'GS', NULL),
(2659, 1074, 'Ghana', 'GH', NULL),
(2660, 1074, 'Gibraltar', 'GI', NULL),
(2661, 1074, 'Grèce', 'GR', NULL),
(2662, 1074, 'Grenade', 'GD', NULL),
(2663, 1074, 'Groenland', 'GL', NULL),
(2664, 1074, 'Guadeloupe', 'GP', NULL),
(2665, 1074, 'Guam', 'GU', NULL),
(2666, 1074, 'Guatemala', 'GT', NULL),
(2667, 1074, 'Guernesey', 'GG', NULL),
(2668, 1074, 'Guinée', 'GN', NULL),
(2669, 1074, 'Guinée-Bissau', 'GW', NULL),
(2670, 1074, 'Guinée équatoriale', 'GQ', NULL),
(2671, 1074, 'Guyana', 'GY', NULL),
(2672, 1074, 'Guyane', 'GF', NULL),
(2673, 1074, 'Haïti', 'HT', NULL),
(2674, 1074, 'Île Heard et îles McDonald', 'HM', 'Australie (Territoire)'),
(2675, 1074, 'Honduras', 'HN', NULL),
(2676, 1074, 'Hong Kong', 'HK', NULL),
(2677, 1074, 'Hongrie', 'HU', NULL),
(2678, 1074, 'Île de Man', 'IM', NULL),
(2679, 1074, 'Îles mineures éloignées des États-Unis', 'UM', NULL),
(2680, 1074, 'Îles Vierges britanniques', 'VG', NULL),
(2681, 1074, 'Îles Vierges américaines', 'VI', NULL),
(2682, 1074, 'Inde', 'IN', NULL),
(2683, 1074, 'Indonésie', 'ID', NULL),
(2684, 1074, 'Iran', 'IR', NULL),
(2685, 1074, 'Irak', 'IQ', NULL),
(2686, 1074, 'Irlande', 'IE', NULL),
(2687, 1074, 'Islande', 'IS', NULL),
(2688, 1074, 'Israël', 'IL', NULL),
(2689, 1074, 'Italie', 'IT', NULL),
(2690, 1074, 'Jamaïque', 'JM', NULL),
(2691, 1074, 'Japon', 'JP', NULL),
(2692, 1074, 'Jersey', 'JE', NULL),
(2693, 1074, 'Jordanie', 'JO', NULL),
(2694, 1074, 'Kazakhstan', 'KZ', NULL),
(2695, 1074, 'Kenya', 'KE', NULL),
(2696, 1074, 'Kirghizistan', 'KG', NULL),
(2697, 1074, 'Kiribati', 'KI', NULL),
(2698, 1074, 'Koweït', 'KW', NULL),
(2699, 1074, 'Laos', 'LA', NULL),
(2700, 1074, 'Lesotho', 'LS', NULL),
(2701, 1074, 'Lettonie', 'LV', NULL),
(2702, 1074, 'Liban', 'LB', NULL),
(2703, 1074, 'Libéria', 'LR', NULL),
(2704, 1074, 'Libye', 'LY', NULL),
(2705, 1074, 'Liechtenstein', 'LI', NULL),
(2706, 1074, 'Lituanie', 'LT', NULL),
(2707, 1074, 'Luxembourg', 'LU', NULL),
(2708, 1074, 'Macao', 'MO', NULL),
(2709, 1074, 'Macédoine', 'MK', NULL),
(2710, 1074, 'Madagascar', 'MG', NULL),
(2711, 1074, 'Malaisie', 'MY', NULL),
(2712, 1074, 'Malawi', 'MW', NULL),
(2713, 1074, 'Maldives', 'MV', NULL),
(2714, 1074, 'Mali', 'ML', NULL),
(2715, 1074, 'Malte', 'MT', NULL),
(2716, 1074, 'Îles Mariannes du Nord', 'MP', NULL),
(2717, 1074, 'Maroc', 'MA', NULL),
(2718, 1074, 'Îles Marshall', 'MH', NULL),
(2719, 1074, 'Martinique', 'MQ', NULL),
(2720, 1074, 'Maurice', 'MU', NULL),
(2721, 1074, 'Mauritanie', 'MR', NULL),
(2722, 1074, 'Mayotte', 'YT', NULL),
(2723, 1074, 'Mexique', 'MX', NULL),
(2724, 1074, 'Micronésie', 'FM', NULL),
(2725, 1074, 'Moldavie', 'MD', NULL),
(2726, 1074, 'Monaco', 'MC', NULL),
(2727, 1074, 'Mongolie', 'MN', NULL),
(2728, 1074, 'Monténégro', 'ME', NULL),
(2729, 1074, 'Montserrat', 'MS', NULL),
(2730, 1074, 'Mozambique', 'MZ', NULL),
(2731, 1074, 'Birmanie', 'MM', NULL),
(2732, 1074, 'Namibie', 'NA', NULL),
(2733, 1074, 'Nauru', 'NR', NULL),
(2734, 1074, 'Népal', 'NP', NULL),
(2735, 1074, 'Nicaragua', 'NI', NULL),
(2736, 1074, 'Niger', 'NE', NULL),
(2737, 1074, 'Nigeria', 'NG', NULL),
(2738, 1074, 'Niué', 'NU', NULL),
(2739, 1074, 'Norfolk', 'NF', NULL),
(2740, 1074, 'Norvège', 'NO', NULL),
(2741, 1074, 'Nouvelle-Calédonie', 'NC', NULL),
(2742, 1074, 'Nouvelle-Zélande', 'NZ', NULL),
(2743, 1074, 'Territoire britannique de l''océan Indien', 'IO', NULL),
(2744, 1074, 'Oman', 'OM', NULL),
(2745, 1074, 'Ouganda', 'UG', NULL),
(2746, 1074, 'Ouzbékistan', 'UZ', NULL),
(2747, 1074, 'Pakistan', 'PK', NULL),
(2748, 1074, 'Palaos', 'PW', NULL),
(2749, 1074, 'Palestine', 'PS', NULL),
(2750, 1074, 'Panamá', 'PA', NULL),
(2751, 1074, 'Papouasie-Nouvelle-Guinée', 'PG', NULL),
(2752, 1074, 'Paraguay', 'PY', NULL),
(2753, 1074, 'Pays-Bas', 'NL', NULL),
(2754, 1074, 'Pérou', 'PE', NULL),
(2755, 1074, 'Philippines', 'PH', NULL),
(2756, 1074, 'Pitcairn', 'PN', NULL),
(2757, 1074, 'Pologne', 'PL', NULL),
(2758, 1074, 'Polynésie française', 'PF', NULL),
(2759, 1074, 'Porto Rico', 'PR', NULL),
(2760, 1074, 'Portugal', 'PT', NULL),
(2761, 1074, 'Qatar', 'QA', NULL),
(2762, 1074, 'La Réunion', 'RE', NULL),
(2763, 1074, 'Roumanie', 'RO', NULL),
(2764, 1074, 'Royaume-Uni', 'GB', NULL),
(2765, 1074, 'Russie', 'RU', NULL),
(2766, 1074, 'Rwanda', 'RW', NULL),
(2767, 1074, 'Sahara occidental', 'EH', NULL),
(2768, 1074, 'Saint-Barthélemy', 'BL', NULL),
(2769, 1074, 'Saint-Christophe-et-Niévès', 'KN', NULL),
(2770, 1074, 'Saint-Marin', 'SM', NULL),
(2771, 1074, 'Saint-Martin', 'MF', NULL),
(2772, 1074, 'Saint-Pierre-et-Miquelon', 'PM', NULL),
(2773, 1074, 'Vatican / (Saint-Siège)', 'VA', NULL),
(2774, 1074, 'Saint-Vincent-et-les Grenadines', 'VC', NULL),
(2775, 1074, 'Sainte-Hélène (territoire)', 'SH', NULL),
(2776, 1074, 'Sainte-Lucie', 'LC', NULL),
(2777, 1074, 'Salomon', 'SB', NULL),
(2778, 1074, 'Samoa', 'WS', NULL),
(2779, 1074, 'Samoa américaines', 'AS', NULL),
(2780, 1074, 'Sao Tomé-et-Principe', 'ST', NULL),
(2781, 1074, 'Sénégal', 'SN', NULL),
(2782, 1074, 'Serbie', 'RS', NULL),
(2783, 1074, 'Seychelles', 'SC', NULL),
(2784, 1074, 'Sierra Leone', 'SL', NULL),
(2785, 1074, 'Singapour', 'SG', NULL),
(2786, 1074, 'Slovaquie', 'SK', NULL),
(2787, 1074, 'Slovénie', 'SI', NULL),
(2788, 1074, 'Somalie', 'SO', NULL),
(2789, 1074, 'Soudan', 'SD', NULL),
(2790, 1074, 'Sri Lanka', 'LK', NULL),
(2791, 1074, 'Suède', 'SE', NULL),
(2792, 1074, 'Suisse', 'CH', NULL),
(2793, 1074, 'Suriname', 'SR', NULL),
(2794, 1074, 'Svalbard et île Jan Mayen', 'SJ', NULL),
(2795, 1074, 'Swaziland', 'SZ', NULL),
(2796, 1074, 'Syrie', 'SY', NULL),
(2797, 1074, 'Tadjikistan', 'TJ', NULL),
(2798, 1074, 'Taïwan / (République de Chine (Taïwan))', 'TW', NULL),
(2799, 1074, 'Tanzanie', 'TZ', NULL),
(2800, 1074, 'Tchad', 'TD', NULL),
(2801, 1074, 'République tchèque', 'CZ', NULL),
(2802, 1074, 'Terres australes et antarctiques françaises', 'TF', NULL),
(2803, 1074, 'Thaïlande', 'TH', NULL),
(2804, 1074, 'Timor oriental', 'TL', NULL),
(2805, 1074, 'Togo', 'TG', NULL),
(2806, 1074, 'Tokelau', 'TK', NULL),
(2807, 1074, 'Tonga', 'TO', NULL),
(2808, 1074, 'Trinité-et-Tobago', 'TT', NULL),
(2809, 1074, 'Tunisie', 'TN', NULL),
(2810, 1074, 'Turkménistan', 'TM', NULL),
(2811, 1074, 'Îles Turques-et-Caïques', 'TC', NULL),
(2812, 1074, 'Turquie', 'TR', NULL),
(2813, 1074, 'Tuvalu', 'TV', NULL),
(2814, 1074, 'Ukraine', 'UA', NULL),
(2815, 1074, 'Uruguay', 'UY', NULL),
(2816, 1074, 'Vanuatu', 'VU', NULL),
(2817, 1074, 'Venezuela', 'VE', NULL),
(2818, 1074, 'Viêt Nam', 'VN', NULL),
(2819, 1074, 'Wallis-et-Futuna', 'WF', NULL),
(2820, 1074, 'Yémen', 'YE', NULL),
(2821, 1074, 'Zambie', 'ZM', NULL),
(2822, 1074, 'Zimbabwe', 'ZW', NULL),
(2830, 1011, 'Administrateur système', 'AS', 'Administrateur système (= System Administrator).'),
(2831, 1011, 'Administrateur données', 'AD', 'Administrateur des données (= Data Administrator).'),
(2834, 1066, 'URL d''une page d''information sur l''objet lié', 'INFO', NULL),
(2835, 1078, 'Andorra (general)', 'AD.00', NULL),
(2836, 1078, 'Andorra', 'AD.01', NULL),
(2837, 1078, 'Parròquia de Canillo', 'AD.02', NULL),
(2838, 1078, 'Parròquia d''Encamp', 'AD.03', NULL),
(2839, 1078, 'Parròquia de la Massana', 'AD.04', NULL),
(2840, 1078, 'Parròquia d''Ordino', 'AD.05', NULL),
(2841, 1078, 'Parròquia de Sant Julià de Lòria', 'AD.06', NULL),
(2842, 1078, 'Parròquia d''Andorra la Vella', 'AD.07', NULL),
(2843, 1078, 'Parròquia d''Escaldes-Engordany', 'AD.08', NULL),
(2844, 1078, 'United Arab Emirates (general)', 'AE.00', NULL),
(2845, 1078, 'Abū Z̧aby', 'AE.01', NULL),
(2846, 1078, '‘Ajmān', 'AE.02', NULL),
(2847, 1078, 'Dubayy', 'AE.03', NULL),
(2848, 1078, 'Al Fujayrah', 'AE.04', NULL),
(2849, 1078, 'Raʼs al Khaymah', 'AE.05', NULL),
(2850, 1078, 'Ash Shāriqah', 'AE.06', NULL),
(2851, 1078, 'Umm al Qaywayn', 'AE.07', NULL),
(2852, 1078, 'Afghanistan (general)', 'AF.00', NULL),
(2853, 1078, 'Badakhshan', 'AF.01', NULL),
(2854, 1078, 'Badghis Province', 'AF.02', NULL),
(2855, 1078, 'Baghlān', 'AF.03', NULL),
(2856, 1078, 'Bāmīān', 'AF.05', NULL),
(2857, 1078, 'Farah', 'AF.06', NULL),
(2858, 1078, 'Faryab Province', 'AF.07', NULL),
(2859, 1078, 'Ghaznī', 'AF.08', NULL),
(2860, 1078, 'Ghowr', 'AF.09', NULL),
(2861, 1078, 'Helmand', 'AF.10', NULL),
(2862, 1078, 'Herat Province', 'AF.11', NULL),
(2863, 1078, 'Kabul', 'AF.13', NULL),
(2864, 1078, 'Kāpīsā', 'AF.14', NULL),
(2865, 1078, 'Konarha', 'AF.15', NULL),
(2866, 1078, 'Laghman', 'AF.16', NULL),
(2867, 1078, 'Lowgar', 'AF.17', NULL),
(2868, 1078, 'Nangarhār', 'AF.18', NULL),
(2869, 1078, 'Nīmrūz', 'AF.19', NULL),
(2870, 1078, 'Orūzgān', 'AF.20', NULL),
(2871, 1078, 'Paktika', 'AF.21', NULL),
(2872, 1078, 'Parvān', 'AF.22', NULL),
(2873, 1078, 'Kandahār', 'AF.23', NULL),
(2874, 1078, 'Kunduz Province', 'AF.24', NULL),
(2875, 1078, 'Takhār', 'AF.26', NULL),
(2876, 1078, 'Vardak', 'AF.27', NULL),
(2877, 1078, 'Zabul Province', 'AF.28', NULL),
(2878, 1078, 'Paktīkā', 'AF.29', NULL),
(2879, 1078, 'Balkh', 'AF.30', NULL),
(2880, 1078, 'Jowzjān', 'AF.31', NULL),
(2881, 1078, 'Samangān', 'AF.32', NULL),
(2882, 1078, 'Sar-e Pol', 'AF.33', NULL),
(2883, 1078, 'Konar', 'AF.34', NULL),
(2884, 1078, 'Laghmān', 'AF.35', NULL),
(2885, 1078, 'Paktia Province', 'AF.36', NULL),
(2886, 1078, 'Khowst', 'AF.37', NULL),
(2887, 1078, 'Nūrestān', 'AF.38', NULL),
(2888, 1078, 'Orūzgān Province', 'AF.39', NULL),
(2889, 1078, 'Parvān', 'AF.40', NULL),
(2890, 1078, 'Dāykondī', 'AF.41', NULL),
(2891, 1078, 'Panjshīr', 'AF.42', NULL),
(2892, 1078, 'Antigua and Barbuda (general)', 'AG.00', NULL),
(2893, 1078, 'Barbuda', 'AG.01', NULL),
(2894, 1078, 'Saint George', 'AG.03', NULL),
(2895, 1078, 'Saint John', 'AG.04', NULL),
(2896, 1078, 'Saint Mary', 'AG.05', NULL),
(2897, 1078, 'Saint Paul', 'AG.06', NULL),
(2898, 1078, 'Saint Peter', 'AG.07', NULL),
(2899, 1078, 'Saint Philip', 'AG.08', NULL),
(2900, 1078, 'Anguilla (general)', 'AI.00', NULL),
(2901, 1078, 'Albania (general)', 'AL.00', NULL),
(2902, 1078, 'Berat', 'AL.40', NULL),
(2903, 1078, 'Dibër', 'AL.41', NULL),
(2904, 1078, 'Durrës', 'AL.42', NULL),
(2905, 1078, 'Elbasan', 'AL.43', NULL),
(2906, 1078, 'Fier', 'AL.44', NULL),
(2907, 1078, 'Gjirokastër', 'AL.45', NULL),
(2908, 1078, 'Korçë', 'AL.46', NULL),
(2909, 1078, 'Kukës', 'AL.47', NULL),
(2910, 1078, 'Lezhë', 'AL.48', NULL),
(2911, 1078, 'Shkodër', 'AL.49', NULL),
(2912, 1078, 'Tiranë', 'AL.50', NULL),
(2913, 1078, 'Vlorë', 'AL.51', NULL),
(2914, 1078, 'Armenia (general)', 'AM.00', NULL),
(2915, 1078, 'Aragatsotn', 'AM.01', NULL),
(2916, 1078, 'Ararat', 'AM.02', NULL),
(2917, 1078, 'Armavir', 'AM.03', NULL),
(2918, 1078, 'Gegharkʼunikʼ', 'AM.04', NULL),
(2919, 1078, 'Kotaykʼ', 'AM.05', NULL),
(2920, 1078, 'Lorri', 'AM.06', NULL),
(2921, 1078, 'Shirak', 'AM.07', NULL),
(2922, 1078, 'Syunikʼ', 'AM.08', NULL),
(2923, 1078, 'Tavush', 'AM.09', NULL),
(2924, 1078, 'Vayotsʼ Dzor', 'AM.10', NULL),
(2925, 1078, 'Yerevan', 'AM.11', NULL),
(2926, 1078, 'Netherlands Antilles (general)', 'AN.00', NULL),
(2927, 1078, 'Angola (general)', 'AO.00', NULL),
(2928, 1078, 'Benguela', 'AO.01', NULL),
(2929, 1078, 'Bié', 'AO.02', NULL),
(2930, 1078, 'Cabinda', 'AO.03', NULL),
(2931, 1078, 'Cuando Cubango', 'AO.04', NULL),
(2932, 1078, 'Cuanza Norte', 'AO.05', NULL),
(2933, 1078, 'Cuanza Sul', 'AO.06', NULL),
(2934, 1078, 'Cunene', 'AO.07', NULL),
(2935, 1078, 'Huambo', 'AO.08', NULL),
(2936, 1078, 'Huíla', 'AO.09', NULL),
(2937, 1078, 'Luanda', 'AO.10', NULL),
(2938, 1078, 'Malanje', 'AO.12', NULL),
(2939, 1078, 'Namibe', 'AO.13', NULL),
(2940, 1078, 'Moxico', 'AO.14', NULL),
(2941, 1078, 'Uíge', 'AO.15', NULL),
(2942, 1078, 'Zaire', 'AO.16', NULL),
(2943, 1078, 'Lunda Norte', 'AO.17', NULL),
(2944, 1078, 'Lunda Sul', 'AO.18', NULL),
(2945, 1078, 'Bengo', 'AO.19', NULL);
INSERT INTO `annu_meta_ontologie` (`amo_id_ontologie`, `amo_ce_parent`, `amo_nom`, `amo_abreviation`, `amo_description`) VALUES
(2946, 1078, 'Antarctica (general)', 'AQ.00', NULL),
(2947, 1078, 'Argentina (general)', 'AR.00', NULL),
(2948, 1078, 'Buenos Aires', 'AR.01', NULL),
(2949, 1078, 'Catamarca', 'AR.02', NULL),
(2950, 1078, 'Chaco', 'AR.03', NULL),
(2951, 1078, 'Chubut', 'AR.04', NULL),
(2952, 1078, 'Córdoba', 'AR.05', NULL),
(2953, 1078, 'Corrientes', 'AR.06', NULL),
(2954, 1078, 'Distrito Federal', 'AR.07', NULL),
(2955, 1078, 'Entre Ríos', 'AR.08', NULL),
(2956, 1078, 'Formosa', 'AR.09', NULL),
(2957, 1078, 'Jujuy', 'AR.10', NULL),
(2958, 1078, 'La Pampa', 'AR.11', NULL),
(2959, 1078, 'La Rioja', 'AR.12', NULL),
(2960, 1078, 'Mendoza', 'AR.13', NULL),
(2961, 1078, 'Misiones', 'AR.14', NULL),
(2962, 1078, 'Neuquén', 'AR.15', NULL),
(2963, 1078, 'Río Negro', 'AR.16', NULL),
(2964, 1078, 'Salta', 'AR.17', NULL),
(2965, 1078, 'San Juan', 'AR.18', NULL),
(2966, 1078, 'San Luis', 'AR.19', NULL),
(2967, 1078, 'Santa Cruz', 'AR.20', NULL),
(2968, 1078, 'Santa Fe', 'AR.21', NULL),
(2969, 1078, 'Santiago del Estero', 'AR.22', NULL),
(2970, 1078, 'Tierra del Fuego, Antártida e Islas del Atlántico Sur', 'AR.23', NULL),
(2971, 1078, 'Tucumán', 'AR.24', NULL),
(2972, 1078, 'Austria (general)', 'AT.00', NULL),
(2973, 1078, 'Burgenland', 'AT.01', NULL),
(2974, 1078, 'Carinthia', 'AT.02', NULL),
(2975, 1078, 'Lower Austria', 'AT.03', NULL),
(2976, 1078, 'Upper Austria', 'AT.04', NULL),
(2977, 1078, 'Salzburg', 'AT.05', NULL),
(2978, 1078, 'Styria', 'AT.06', NULL),
(2979, 1078, 'Tyrol', 'AT.07', NULL),
(2980, 1078, 'Vorarlberg', 'AT.08', NULL),
(2981, 1078, 'Vienna', 'AT.09', NULL),
(2982, 1078, 'Heard Island and McDonald Islands (general)', 'AU.00', NULL),
(2983, 1078, 'Australian Capital Territory', 'AU.01', NULL),
(2984, 1078, 'New South Wales', 'AU.02', NULL),
(2985, 1078, 'Northern Territory', 'AU.03', NULL),
(2986, 1078, 'Queensland', 'AU.04', NULL),
(2987, 1078, 'South Australia', 'AU.05', NULL),
(2988, 1078, 'Tasmania', 'AU.06', NULL),
(2989, 1078, 'Victoria', 'AU.07', NULL),
(2990, 1078, 'Western Australia', 'AU.08', NULL),
(2991, 1078, 'Aruba (general)', 'AW.00', NULL),
(2992, 1078, 'Azerbaijan (general)', 'AZ.00', NULL),
(2993, 1078, 'Abşeron', 'AZ.01', NULL),
(2994, 1078, 'Ağcabǝdi', 'AZ.02', NULL),
(2995, 1078, 'Ağdam', 'AZ.03', NULL),
(2996, 1078, 'Ağdaş', 'AZ.04', NULL),
(2997, 1078, 'Ağstafa', 'AZ.05', NULL),
(2998, 1078, 'Ağsu', 'AZ.06', NULL),
(2999, 1078, 'Əli Bayramli', 'AZ.07', NULL),
(3000, 1078, 'Astara', 'AZ.08', NULL),
(3001, 1078, 'Baki', 'AZ.09', NULL),
(3002, 1078, 'Balakǝn', 'AZ.10', NULL),
(3003, 1078, 'Bǝrdǝ', 'AZ.11', NULL),
(3004, 1078, 'Beylǝqan', 'AZ.12', NULL),
(3005, 1078, 'Bilǝsuvar', 'AZ.13', NULL),
(3006, 1078, 'Cǝbrayıl', 'AZ.14', NULL),
(3007, 1078, 'Cǝlilabad', 'AZ.15', NULL),
(3008, 1078, 'Daşkǝsǝn', 'AZ.16', NULL),
(3009, 1078, 'Dǝvǝçi', 'AZ.17', NULL),
(3010, 1078, 'Füzuli', 'AZ.18', NULL),
(3011, 1078, 'Gǝdǝbǝy', 'AZ.19', NULL),
(3012, 1078, 'Gǝncǝ', 'AZ.20', NULL),
(3013, 1078, 'Goranboy', 'AZ.21', NULL),
(3014, 1078, 'Göyçay', 'AZ.22', NULL),
(3015, 1078, 'Hacıqabul', 'AZ.23', NULL),
(3016, 1078, 'İmişli', 'AZ.24', NULL),
(3017, 1078, 'İsmayıllı', 'AZ.25', NULL),
(3018, 1078, 'Kǝlbǝcǝr', 'AZ.26', NULL),
(3019, 1078, 'Kürdǝmir', 'AZ.27', NULL),
(3020, 1078, 'Laçın', 'AZ.28', NULL),
(3021, 1078, 'Lǝnkǝran', 'AZ.29', NULL),
(3022, 1078, 'Lǝnkǝran Şǝhǝri', 'AZ.30', NULL),
(3023, 1078, 'Lerik', 'AZ.31', NULL),
(3024, 1078, 'Masallı', 'AZ.32', NULL),
(3025, 1078, 'Mingǝcevir', 'AZ.33', NULL),
(3026, 1078, 'Naftalan', 'AZ.34', NULL),
(3027, 1078, 'Nakhichevan', 'AZ.35', NULL),
(3028, 1078, 'Neftçala', 'AZ.36', NULL),
(3029, 1078, 'Oğuz', 'AZ.37', NULL),
(3030, 1078, 'Qǝbǝlǝ', 'AZ.38', NULL),
(3031, 1078, 'Qǝx', 'AZ.39', NULL),
(3032, 1078, 'Qazax', 'AZ.40', NULL),
(3033, 1078, 'Qobustan', 'AZ.41', NULL),
(3034, 1078, 'Quba', 'AZ.42', NULL),
(3035, 1078, 'Qubadlı', 'AZ.43', NULL),
(3036, 1078, 'Qusar', 'AZ.44', NULL),
(3037, 1078, 'Saatlı', 'AZ.45', NULL),
(3038, 1078, 'Sabirabad', 'AZ.46', NULL),
(3039, 1078, 'Şǝki', 'AZ.47', NULL),
(3040, 1078, 'Şǝki', 'AZ.48', NULL),
(3041, 1078, 'Salyan', 'AZ.49', NULL),
(3042, 1078, 'Şamaxı', 'AZ.50', NULL),
(3043, 1078, 'Şǝmkir', 'AZ.51', NULL),
(3044, 1078, 'Samux', 'AZ.52', NULL),
(3045, 1078, 'Siyǝzǝn', 'AZ.53', NULL),
(3046, 1078, 'Sumqayit', 'AZ.54', NULL),
(3047, 1078, 'Şuşa', 'AZ.55', NULL),
(3048, 1078, 'Şuşa Şəhəri', 'AZ.56', NULL),
(3049, 1078, 'Tǝrtǝr', 'AZ.57', NULL),
(3050, 1078, 'Tovuz', 'AZ.58', NULL),
(3051, 1078, 'Ucar', 'AZ.59', NULL),
(3052, 1078, 'Xaçmaz', 'AZ.60', NULL),
(3053, 1078, 'Xankǝndi', 'AZ.61', NULL),
(3054, 1078, 'Xanlar', 'AZ.62', NULL),
(3055, 1078, 'Xızı', 'AZ.63', NULL),
(3056, 1078, 'Xocalı', 'AZ.64', NULL),
(3057, 1078, 'Xocavǝnd', 'AZ.65', NULL),
(3058, 1078, 'Yardımlı', 'AZ.66', NULL),
(3059, 1078, 'Yevlax', 'AZ.67', NULL),
(3060, 1078, 'Yevlax', 'AZ.68', NULL),
(3061, 1078, 'Zǝngilan', 'AZ.69', NULL),
(3062, 1078, 'Zaqatala', 'AZ.70', NULL),
(3063, 1078, 'Zǝrdab', 'AZ.71', NULL),
(3064, 1078, 'Bosnia and Herzegovina (general)', 'BA.00', NULL),
(3065, 1078, 'Federation of Bosnia and Herzegovina', 'BA.01', NULL),
(3066, 1078, 'Republika Srpska', 'BA.02', NULL),
(3067, 1078, 'Brčko Distrikt', 'BA.BD', NULL),
(3068, 1078, 'Barbados (general)', 'BB.00', NULL),
(3069, 1078, 'Christ Church', 'BB.01', NULL),
(3070, 1078, 'Saint Andrew', 'BB.02', NULL),
(3071, 1078, 'Saint George', 'BB.03', NULL),
(3072, 1078, 'Saint James', 'BB.04', NULL),
(3073, 1078, 'Saint John', 'BB.05', NULL),
(3074, 1078, 'Saint Joseph', 'BB.06', NULL),
(3075, 1078, 'Saint Lucy', 'BB.07', NULL),
(3076, 1078, 'Saint Michael', 'BB.08', NULL),
(3077, 1078, 'Saint Peter', 'BB.09', NULL),
(3078, 1078, 'Saint Philip', 'BB.10', NULL),
(3079, 1078, 'Saint Thomas', 'BB.11', NULL),
(3080, 1078, 'Bangladesh (general)', 'BD.00', NULL),
(3081, 1078, 'BG80', 'BD.80', NULL),
(3082, 1078, 'Dhaka', 'BD.81', NULL),
(3083, 1078, 'Khulna', 'BD.82', NULL),
(3084, 1078, 'Rājshāhi', 'BD.83', NULL),
(3085, 1078, 'Chittagong', 'BD.84', NULL),
(3086, 1078, 'Barisāl', 'BD.85', NULL),
(3087, 1078, 'Sylhet', 'BD.86', NULL),
(3088, 1078, 'Belgium (general)', 'BE.00', NULL),
(3089, 1078, 'Région de Bruxelles-Capitale', 'BE.BRU', NULL),
(3090, 1078, 'Flanders', 'BE.VLG', NULL),
(3091, 1078, 'Wallonia', 'BE.WAL', NULL),
(3092, 1078, 'Burkina Faso (general)', 'BF.00', NULL),
(3093, 1078, 'Boucle du Mouhoun', 'BF.01', NULL),
(3094, 1078, 'Cascades', 'BF.02', NULL),
(3095, 1078, 'Centre', 'BF.03', NULL),
(3096, 1078, 'Centre-Est', 'BF.04', NULL),
(3097, 1078, 'Centre-Nord', 'BF.05', NULL),
(3098, 1078, 'Centre-Ouest', 'BF.06', NULL),
(3099, 1078, 'Centre-Sud', 'BF.07', NULL),
(3100, 1078, 'Est', 'BF.08', NULL),
(3101, 1078, 'Hauts-Bassins', 'BF.09', NULL),
(3102, 1078, 'Nord', 'BF.10', NULL),
(3103, 1078, 'Plateau-Central', 'BF.11', NULL),
(3104, 1078, 'Sahel', 'BF.12', NULL),
(3105, 1078, 'Sud-Ouest', 'BF.13', NULL),
(3106, 1078, 'Bam', 'BF.15', NULL),
(3107, 1078, 'Boulkiemdé', 'BF.19', NULL),
(3108, 1078, 'Ganzourgou', 'BF.20', NULL),
(3109, 1078, 'Gnagna', 'BF.21', NULL),
(3110, 1078, 'Kouritenga', 'BF.28', NULL),
(3111, 1078, 'Oudalan', 'BF.33', NULL),
(3112, 1078, 'Passore', 'BF.34', NULL),
(3113, 1078, 'Sanguié', 'BF.36', NULL),
(3114, 1078, '(UV37)', 'BF.37', NULL),
(3115, 1078, '(UV38)', 'BF.38', NULL),
(3116, 1078, '(UV39)', 'BF.39', NULL),
(3117, 1078, 'Soum', 'BF.40', NULL),
(3118, 1078, '(UV41)', 'BF.41', NULL),
(3119, 1078, 'Tapoa', 'BF.42', NULL),
(3120, 1078, '(UV43)', 'BF.43', NULL),
(3121, 1078, 'Zoundwéogo', 'BF.44', NULL),
(3122, 1078, 'Banwa', 'BF.46', NULL),
(3123, 1078, 'Bazèga', 'BF.47', NULL),
(3124, 1078, 'Bougouriba', 'BF.48', NULL),
(3125, 1078, 'Boulgou', 'BF.49', NULL),
(3126, 1078, 'Gourma', 'BF.50', NULL),
(3127, 1078, 'Houet', 'BF.51', NULL),
(3128, 1078, 'Ioba', 'BF.52', NULL),
(3129, 1078, 'Kadiogo', 'BF.53', NULL),
(3130, 1078, 'Kènèdougou', 'BF.54', NULL),
(3131, 1078, 'Comoé', 'BF.55', NULL),
(3132, 1078, 'Komondjari', 'BF.56', NULL),
(3133, 1078, 'Kompienga', 'BF.57', NULL),
(3134, 1078, 'Kossi', 'BF.58', NULL),
(3135, 1078, 'Koulpélogo', 'BF.59', NULL),
(3136, 1078, 'Kourwéogo', 'BF.60', NULL),
(3137, 1078, 'Léraba', 'BF.61', NULL),
(3138, 1078, 'Loroum', 'BF.62', NULL),
(3139, 1078, 'Mouhoun', 'BF.63', NULL),
(3140, 1078, 'Namentenga', 'BF.64', NULL),
(3141, 1078, 'Nahouri', 'BF.65', NULL),
(3142, 1078, 'Nayala', 'BF.66', NULL),
(3143, 1078, 'Noumbiel', 'BF.67', NULL),
(3144, 1078, 'Oubritenga', 'BF.68', NULL),
(3145, 1078, 'Poni', 'BF.69', NULL),
(3146, 1078, 'Sanmatenga', 'BF.70', NULL),
(3147, 1078, 'Séno', 'BF.71', NULL),
(3148, 1078, 'Sissili', 'BF.72', NULL),
(3149, 1078, 'Sourou', 'BF.73', NULL),
(3150, 1078, 'Tuy', 'BF.74', NULL),
(3151, 1078, 'Yagha', 'BF.75', NULL),
(3152, 1078, 'Yatenga', 'BF.76', NULL),
(3153, 1078, 'Ziro', 'BF.77', NULL),
(3154, 1078, 'Zondoma', 'BF.78', NULL),
(3155, 1078, 'Bulgaria (general)', 'BG.00', NULL),
(3156, 1078, 'Burgas', 'BG.29', NULL),
(3157, 1078, 'Grad', 'BG.30', NULL),
(3158, 1078, 'Khaskovo', 'BG.31', NULL),
(3159, 1078, 'Lovech', 'BG.32', NULL),
(3160, 1078, 'Mikhaylovgrad', 'BG.33', NULL),
(3161, 1078, 'Plovdiv', 'BG.34', NULL),
(3162, 1078, 'Razgrad', 'BG.35', NULL),
(3163, 1078, 'Sofiya', 'BG.36', NULL),
(3164, 1078, 'Varna', 'BG.37', NULL),
(3165, 1078, 'Blagoevgrad', 'BG.38', NULL),
(3166, 1078, 'Burgas', 'BG.39', NULL),
(3167, 1078, 'Dobrich', 'BG.40', NULL),
(3168, 1078, 'Gabrovo', 'BG.41', NULL),
(3169, 1078, 'Oblast Sofiya-Grad', 'BG.42', NULL),
(3170, 1078, 'Khaskovo', 'BG.43', NULL),
(3171, 1078, 'Kŭrdzhali', 'BG.44', NULL),
(3172, 1078, 'Kyustendil', 'BG.45', NULL),
(3173, 1078, 'Lovech', 'BG.46', NULL),
(3174, 1078, 'Montana', 'BG.47', NULL),
(3175, 1078, 'Pazardzhit', 'BG.48', NULL),
(3176, 1078, 'Pernik', 'BG.49', NULL),
(3177, 1078, 'Pleven', 'BG.50', NULL),
(3178, 1078, 'Plovdiv', 'BG.51', NULL),
(3179, 1078, 'Razgrad', 'BG.52', NULL),
(3180, 1078, 'Ruse', 'BG.53', NULL),
(3181, 1078, 'Shumen', 'BG.54', NULL),
(3182, 1078, 'Silistra', 'BG.55', NULL),
(3183, 1078, 'Sliven', 'BG.56', NULL),
(3184, 1078, 'Smolyan', 'BG.57', NULL),
(3185, 1078, 'Sofiya', 'BG.58', NULL),
(3186, 1078, 'Stara Zagora', 'BG.59', NULL),
(3187, 1078, 'Tŭrgovishte', 'BG.60', NULL),
(3188, 1078, 'Varna', 'BG.61', NULL),
(3189, 1078, 'Veliko Tŭrnovo', 'BG.62', NULL),
(3190, 1078, 'Vidin', 'BG.63', NULL),
(3191, 1078, 'Vratsa', 'BG.64', NULL),
(3192, 1078, 'Yambol', 'BG.65', NULL),
(3193, 1078, 'Bahrain (general)', 'BH.00', NULL),
(3194, 1078, 'Hedd', 'BH.01', NULL),
(3195, 1078, 'Manama', 'BH.02', NULL),
(3196, 1078, 'Muharraq', 'BH.03', NULL),
(3197, 1078, 'Jidd Haffs', 'BH.05', NULL),
(3198, 1078, 'Sitra', 'BH.06', NULL),
(3199, 1078, '(BA07)', 'BH.07', NULL),
(3200, 1078, 'Western Region', 'BH.08', NULL),
(3201, 1078, 'Hawar Islands', 'BH.09', NULL),
(3202, 1078, 'Northern Region', 'BH.10', NULL),
(3203, 1078, 'Central Region', 'BH.11', NULL),
(3204, 1078, 'Isa Town', 'BH.12', NULL),
(3205, 1078, 'Ar Rifa’ and Southern Region', 'BH.13', NULL),
(3206, 1078, 'Hamad town', 'BH.14', NULL),
(3207, 1078, 'Burundi (general)', 'BI.00', NULL),
(3208, 1078, 'Bujumbura', 'BI.02', NULL),
(3209, 1078, '(BY05)', 'BI.05', NULL),
(3210, 1078, 'Bubanza', 'BI.09', NULL),
(3211, 1078, 'Bururi', 'BI.10', NULL),
(3212, 1078, 'Cankuzo', 'BI.11', NULL),
(3213, 1078, 'Cibitoke', 'BI.12', NULL),
(3214, 1078, 'Gitega', 'BI.13', NULL),
(3215, 1078, 'Karuzi', 'BI.14', NULL),
(3216, 1078, 'Kayanza', 'BI.15', NULL),
(3217, 1078, 'Kirundo', 'BI.16', NULL),
(3218, 1078, 'Makamba', 'BI.17', NULL),
(3219, 1078, 'Muyinga', 'BI.18', NULL),
(3220, 1078, 'Ngozi', 'BI.19', NULL),
(3221, 1078, 'Rutana', 'BI.20', NULL),
(3222, 1078, 'Ruyigi', 'BI.21', NULL),
(3223, 1078, 'Muramvya', 'BI.22', NULL),
(3224, 1078, 'Mwaro', 'BI.23', NULL),
(3225, 1078, 'Benin (general)', 'BJ.00', NULL),
(3226, 1078, 'Atakora', 'BJ.01', NULL),
(3227, 1078, 'Atlantique', 'BJ.02', NULL),
(3228, 1078, 'Borgou', 'BJ.03', NULL),
(3229, 1078, 'Mono', 'BJ.04', NULL),
(3230, 1078, 'Oueme', 'BJ.05', NULL),
(3231, 1078, 'Zou', 'BJ.06', NULL),
(3232, 1078, 'Alibori', 'BJ.07', NULL),
(3233, 1078, 'Atakora', 'BJ.08', NULL),
(3234, 1078, 'Atlantique', 'BJ.09', NULL),
(3235, 1078, 'Borgou', 'BJ.10', NULL),
(3236, 1078, 'Collines', 'BJ.11', NULL),
(3237, 1078, 'Kouffo', 'BJ.12', NULL),
(3238, 1078, 'Donga', 'BJ.13', NULL),
(3239, 1078, 'Littoral', 'BJ.14', NULL),
(3240, 1078, 'Mono', 'BJ.15', NULL),
(3241, 1078, 'Quémé', 'BJ.16', NULL),
(3242, 1078, 'Plateau', 'BJ.17', NULL),
(3243, 1078, 'Zou', 'BJ.18', NULL),
(3244, 1078, 'Bermuda (general)', 'BM.00', NULL),
(3245, 1078, 'Devonshire', 'BM.01', NULL),
(3246, 1078, 'Hamilton Parish', 'BM.02', NULL),
(3247, 1078, 'Hamilton city', 'BM.03', NULL),
(3248, 1078, 'Paget', 'BM.04', NULL),
(3249, 1078, 'Pembroke', 'BM.05', NULL),
(3250, 1078, 'Saint George', 'BM.06', NULL),
(3251, 1078, 'Saint Georgeʼs', 'BM.07', NULL),
(3252, 1078, 'Sandys', 'BM.08', NULL),
(3253, 1078, 'Smithʼs', 'BM.09', NULL),
(3254, 1078, 'Southampton', 'BM.10', NULL),
(3255, 1078, 'Warwick', 'BM.11', NULL),
(3256, 1078, 'Brunei (general)', 'BN.00', NULL),
(3257, 1078, 'Belait', 'BN.01', NULL),
(3258, 1078, 'Brunei and Muara', 'BN.02', NULL),
(3259, 1078, 'Temburong', 'BN.03', NULL),
(3260, 1078, 'Tutong', 'BN.04', NULL),
(3261, 1078, 'Bolivia (general)', 'BO.00', NULL),
(3262, 1078, 'Chuquisaca', 'BO.01', NULL),
(3263, 1078, 'Cochabamba', 'BO.02', NULL),
(3264, 1078, 'El Beni', 'BO.03', NULL),
(3265, 1078, 'La Paz', 'BO.04', NULL),
(3266, 1078, 'Oruro', 'BO.05', NULL),
(3267, 1078, 'Pando', 'BO.06', NULL),
(3268, 1078, 'Potosí', 'BO.07', NULL),
(3269, 1078, 'Santa Cruz', 'BO.08', NULL),
(3270, 1078, 'Tarija', 'BO.09', NULL),
(3271, 1078, 'Brazil (general)', 'BR.00', NULL),
(3272, 1078, 'Acre', 'BR.01', NULL),
(3273, 1078, 'Alagoas', 'BR.02', NULL),
(3274, 1078, 'Amapá', 'BR.03', NULL),
(3275, 1078, 'Estado do Amazonas', 'BR.04', NULL),
(3276, 1078, 'Bahia', 'BR.05', NULL),
(3277, 1078, 'Ceará', 'BR.06', NULL),
(3278, 1078, 'Distrito Federal', 'BR.07', NULL),
(3279, 1078, 'Espírito Santo', 'BR.08', NULL),
(3280, 1078, 'Fernando de Noronha', 'BR.09', NULL),
(3281, 1078, 'Goias', 'BR.10', NULL),
(3282, 1078, 'Mato Grosso do Sul', 'BR.11', NULL),
(3283, 1078, 'Maranhão', 'BR.13', NULL),
(3284, 1078, 'Mato Grosso', 'BR.14', NULL),
(3285, 1078, 'Minas Gerais', 'BR.15', NULL),
(3286, 1078, 'Pará', 'BR.16', NULL),
(3287, 1078, 'Paraíba', 'BR.17', NULL),
(3288, 1078, 'Paraná', 'BR.18', NULL),
(3289, 1078, 'Pernambuco', 'BR.19', NULL),
(3290, 1078, 'Piauí', 'BR.20', NULL),
(3291, 1078, 'Rio de Janeiro', 'BR.21', NULL),
(3292, 1078, 'Rio Grande do Norte', 'BR.22', NULL),
(3293, 1078, 'Rio Grande do Sul', 'BR.23', NULL),
(3294, 1078, 'Rondônia', 'BR.24', NULL),
(3295, 1078, 'Roraima', 'BR.25', NULL),
(3296, 1078, 'Santa Catarina', 'BR.26', NULL),
(3297, 1078, 'São Paulo', 'BR.27', NULL),
(3298, 1078, 'Sergipe', 'BR.28', NULL),
(3299, 1078, 'Estado de Goiás', 'BR.29', NULL),
(3300, 1078, 'Pernambuco', 'BR.30', NULL),
(3301, 1078, 'Tocantins', 'BR.31', NULL),
(3302, 1078, 'Bahamas, The (general)', 'BS.00', NULL),
(3303, 1078, 'Bimini', 'BS.05', NULL),
(3304, 1078, 'Cat Island', 'BS.06', NULL),
(3305, 1078, 'Exuma', 'BS.10', NULL),
(3306, 1078, 'Inagua', 'BS.13', NULL),
(3307, 1078, 'Long Island', 'BS.15', NULL),
(3308, 1078, 'Mayaguana', 'BS.16', NULL),
(3309, 1078, 'Ragged Island', 'BS.18', NULL),
(3310, 1078, 'Harbour Island', 'BS.22', NULL),
(3311, 1078, 'New Providence', 'BS.23', NULL),
(3312, 1078, 'Acklins and Crooked Islands', 'BS.24', NULL),
(3313, 1078, 'Freeport', 'BS.25', NULL),
(3314, 1078, 'Fresh Creek', 'BS.26', NULL),
(3315, 1078, 'Governorʼs Harbour', 'BS.27', NULL),
(3316, 1078, 'Green Turtle Cay', 'BS.28', NULL),
(3317, 1078, 'High Rock', 'BS.29', NULL),
(3318, 1078, 'Kemps Bay', 'BS.30', NULL),
(3319, 1078, 'Marsh Harbour', 'BS.31', NULL),
(3320, 1078, 'Nichollstown and Berry Islands', 'BS.32', NULL),
(3321, 1078, 'Rock Sound', 'BS.33', NULL),
(3322, 1078, 'Sandy Point', 'BS.34', NULL),
(3323, 1078, 'San Salvador and Rum Cay', 'BS.35', NULL),
(3324, 1078, 'Bhutan (general)', 'BT.00', NULL),
(3325, 1078, 'Bumthang', 'BT.05', NULL),
(3326, 1078, 'Chhukha', 'BT.06', NULL),
(3327, 1078, 'Chirang', 'BT.07', NULL),
(3328, 1078, 'Daga', 'BT.08', NULL),
(3329, 1078, 'Geylegphug', 'BT.09', NULL),
(3330, 1078, 'Ha', 'BT.10', NULL),
(3331, 1078, 'Lhuntshi', 'BT.11', NULL),
(3332, 1078, 'Mongar', 'BT.12', NULL),
(3333, 1078, 'Paro District', 'BT.13', NULL),
(3334, 1078, 'Pemagatsel', 'BT.14', NULL),
(3335, 1078, 'Samchi', 'BT.16', NULL),
(3336, 1078, 'Samdrup Jongkhar District', 'BT.17', NULL),
(3337, 1078, 'Shemgang', 'BT.18', NULL),
(3338, 1078, 'Tashigang', 'BT.19', NULL),
(3339, 1078, 'Thimphu', 'BT.20', NULL),
(3340, 1078, 'Tongsa', 'BT.21', NULL),
(3341, 1078, 'Wangdi Phodrang', 'BT.22', NULL),
(3342, 1078, 'Botswana (general)', 'BW.00', NULL),
(3343, 1078, 'Central', 'BW.01', NULL),
(3344, 1078, 'Chobe', 'BW.02', NULL),
(3345, 1078, 'Ghanzi', 'BW.03', NULL),
(3346, 1078, 'Kgalagadi', 'BW.04', NULL),
(3347, 1078, 'Kgatleng', 'BW.05', NULL),
(3348, 1078, 'Kweneng', 'BW.06', NULL),
(3349, 1078, 'Ngamiland', 'BW.07', NULL),
(3350, 1078, 'North East', 'BW.08', NULL),
(3351, 1078, 'South East', 'BW.09', NULL),
(3352, 1078, 'Southern', 'BW.10', NULL),
(3353, 1078, 'North West', 'BW.11', NULL),
(3354, 1078, 'Belarus (general)', 'BY.00', NULL),
(3355, 1078, 'Brestskaya Voblastsʼ', 'BY.01', NULL),
(3356, 1078, 'Homyelʼskaya Voblastsʼ', 'BY.02', NULL),
(3357, 1078, 'Hrodzyenskaya Voblastsʼ', 'BY.03', NULL),
(3358, 1078, 'Mahilyowskaya Voblastsʼ', 'BY.04', NULL),
(3359, 1078, 'Horad Minsk', 'BY.05', NULL),
(3360, 1078, 'Minskaya Voblastsʼ', 'BY.06', NULL),
(3361, 1078, 'Vitsyebskaya Voblastsʼ', 'BY.07', NULL),
(3362, 1078, 'Belize (general)', 'BZ.00', NULL),
(3363, 1078, 'Belize', 'BZ.01', NULL),
(3364, 1078, 'Cayo', 'BZ.02', NULL),
(3365, 1078, 'Corozal', 'BZ.03', NULL),
(3366, 1078, 'Orange Walk', 'BZ.04', NULL),
(3367, 1078, 'Stann Creek', 'BZ.05', NULL),
(3368, 1078, 'Toledo', 'BZ.06', NULL),
(3369, 1078, 'Canada (general)', 'CA.00', NULL),
(3370, 1078, 'Alberta', 'CA.01', NULL),
(3371, 1078, 'British Columbia', 'CA.02', NULL),
(3372, 1078, 'Manitoba', 'CA.03', NULL),
(3373, 1078, 'New Brunswick', 'CA.04', NULL),
(3374, 1078, 'Newfoundland and Labrador', 'CA.05', NULL),
(3375, 1078, 'Nova Scotia', 'CA.07', NULL),
(3376, 1078, 'Ontario', 'CA.08', NULL),
(3377, 1078, 'Prince Edward Island', 'CA.09', NULL),
(3378, 1078, 'Quebec', 'CA.10', NULL),
(3379, 1078, 'Saskatchewan', 'CA.11', NULL),
(3380, 1078, 'Yukon', 'CA.12', NULL),
(3381, 1078, 'Northwest Territories', 'CA.13', NULL),
(3382, 1078, 'Nunavut', 'CA.14', NULL),
(3383, 1078, 'Cocos (Keeling) Islands (general)', 'CC.00', NULL),
(3384, 1078, 'Congo, Democratic Republic of The (general)', 'CD.00', NULL),
(3385, 1078, 'Bandundu', 'CD.01', NULL),
(3386, 1078, 'Équateur', 'CD.02', NULL),
(3387, 1078, 'Kasaï-Occidental', 'CD.03', NULL),
(3388, 1078, 'Kasaï-Oriental', 'CD.04', NULL),
(3389, 1078, 'Katanga', 'CD.05', NULL),
(3390, 1078, 'Kinshasa', 'CD.06', NULL),
(3391, 1078, 'Kivu Région du', 'CD.07', NULL),
(3392, 1078, 'Bas-Congo', 'CD.08', NULL),
(3393, 1078, 'Orientale', 'CD.09', NULL),
(3394, 1078, 'Maniema', 'CD.10', NULL),
(3395, 1078, 'Nord-Kivu', 'CD.11', NULL),
(3396, 1078, 'Sud-Kivu', 'CD.12', NULL),
(3397, 1078, 'Central African Republic (general)', 'CF.00', NULL),
(3398, 1078, 'Bamingui-Bangoran', 'CF.01', NULL),
(3399, 1078, 'Basse-Kotto', 'CF.02', NULL),
(3400, 1078, 'Haute-Kotto', 'CF.03', NULL),
(3401, 1078, 'Mambéré-Kadéï', 'CF.04', NULL),
(3402, 1078, 'Haut-Mbomou', 'CF.05', NULL),
(3403, 1078, 'Kémo', 'CF.06', NULL),
(3404, 1078, 'Lobaye', 'CF.07', NULL),
(3405, 1078, 'Mbomou', 'CF.08', NULL),
(3406, 1078, 'Nana-Mambéré', 'CF.09', NULL),
(3407, 1078, 'Ouaka', 'CF.11', NULL),
(3408, 1078, 'Ouham', 'CF.12', NULL),
(3409, 1078, 'Ouham-Pendé', 'CF.13', NULL),
(3410, 1078, 'Vakaga', 'CF.14', NULL),
(3411, 1078, 'Nana-Grébizi', 'CF.15', NULL),
(3412, 1078, 'Sangha-Mbaéré', 'CF.16', NULL),
(3413, 1078, 'Ombella-Mpoko', 'CF.17', NULL),
(3414, 1078, 'Bangui', 'CF.18', NULL),
(3415, 1078, 'Congo (general)', 'CG.00', NULL),
(3416, 1078, 'Bouenza', 'CG.01', NULL),
(3417, 1078, 'CF03', 'CG.03', NULL),
(3418, 1078, 'Kouilou', 'CG.04', NULL),
(3419, 1078, 'Lékoumou', 'CG.05', NULL),
(3420, 1078, 'Likouala', 'CG.06', NULL),
(3421, 1078, 'Niari', 'CG.07', NULL),
(3422, 1078, 'Plateaux', 'CG.08', NULL),
(3423, 1078, 'Sangha', 'CG.10', NULL),
(3424, 1078, 'Pool', 'CG.11', NULL),
(3425, 1078, 'Brazzaville', 'CG.12', NULL),
(3426, 1078, 'Cuvette', 'CG.13', NULL),
(3427, 1078, 'Cuvette-Ouest', 'CG.14', NULL),
(3428, 1078, 'Switzerland (general)', 'CH.00', NULL),
(3429, 1078, 'Aargau', 'CH.AG', NULL),
(3430, 1078, 'Appenzell Innerrhoden', 'CH.AI', NULL),
(3431, 1078, 'Appenzell Ausserrhoden', 'CH.AR', NULL),
(3432, 1078, 'Bern', 'CH.BE', NULL),
(3433, 1078, 'Basel-Landschaft', 'CH.BL', NULL),
(3434, 1078, 'Basel-Stadt', 'CH.BS', NULL),
(3435, 1078, 'Fribourg', 'CH.FR', NULL),
(3436, 1078, 'Genève', 'CH.GE', NULL),
(3437, 1078, 'Glarus', 'CH.GL', NULL),
(3438, 1078, 'Graubünden', 'CH.GR', NULL),
(3439, 1078, 'Jura', 'CH.JU', NULL),
(3440, 1078, 'Luzern', 'CH.LU', NULL),
(3441, 1078, 'Neuchâtel', 'CH.NE', NULL),
(3442, 1078, 'Nidwalden', 'CH.NW', NULL),
(3443, 1078, 'Obwalden', 'CH.OW', NULL),
(3444, 1078, 'Kanton St. Gallen', 'CH.SG', NULL),
(3445, 1078, 'Schaffhausen', 'CH.SH', NULL),
(3446, 1078, 'Solothurn', 'CH.SO', NULL),
(3447, 1078, 'Schwyz', 'CH.SZ', NULL),
(3448, 1078, 'Thurgau', 'CH.TG', NULL),
(3449, 1078, 'Ticino', 'CH.TI', NULL),
(3450, 1078, 'Uri', 'CH.UR', NULL),
(3451, 1078, 'Vaud', 'CH.VD', NULL),
(3452, 1078, 'Valais', 'CH.VS', NULL),
(3453, 1078, 'Zug', 'CH.ZG', NULL),
(3454, 1078, 'Zürich', 'CH.ZH', NULL),
(3455, 1078, 'Côte dʼIvoire (general)', 'CI.00', NULL),
(3456, 1078, 'Valparaíso Region', 'CI.01', NULL),
(3457, 1078, 'Antofagasta Region', 'CI.03', NULL),
(3458, 1078, 'Araucanía Region', 'CI.04', NULL),
(3459, 1078, 'Atacama Region', 'CI.05', NULL),
(3460, 1078, 'Biobío Region', 'CI.06', NULL),
(3461, 1078, 'Coquimbo Region', 'CI.07', NULL),
(3462, 1078, 'Maule Region', 'CI.11', NULL),
(3463, 1078, 'Santiago Metropolitan Region', 'CI.12', NULL),
(3464, 1078, 'Danane', 'CI.14', NULL),
(3465, 1078, 'Divo', 'CI.16', NULL),
(3466, 1078, 'Ferkessedougou', 'CI.17', NULL),
(3467, 1078, 'Gagnoa', 'CI.18', NULL),
(3468, 1078, 'Katiola', 'CI.20', NULL),
(3469, 1078, 'Korhogo', 'CI.21', NULL),
(3470, 1078, 'Odienne', 'CI.23', NULL),
(3471, 1078, 'Seguela', 'CI.25', NULL),
(3472, 1078, 'Touba', 'CI.26', NULL),
(3473, 1078, 'Bongouanou', 'CI.27', NULL),
(3474, 1078, 'Issia', 'CI.28', NULL),
(3475, 1078, 'Lakota', 'CI.29', NULL),
(3476, 1078, 'Mankono', 'CI.30', NULL),
(3477, 1078, 'Oume', 'CI.31', NULL),
(3478, 1078, 'Soubre', 'CI.32', NULL),
(3479, 1078, 'Tingrela', 'CI.33', NULL),
(3480, 1078, 'Zuenoula', 'CI.34', NULL),
(3481, 1078, '(IV35)', 'CI.35', NULL),
(3482, 1078, 'Bangolo', 'CI.36', NULL),
(3483, 1078, 'Beoumi', 'CI.37', NULL),
(3484, 1078, 'Bondoukou', 'CI.38', NULL),
(3485, 1078, 'Bouafle', 'CI.39', NULL),
(3486, 1078, 'Bouake', 'CI.40', NULL),
(3487, 1078, 'Daloa', 'CI.41', NULL),
(3488, 1078, 'Daoukro', 'CI.42', NULL),
(3489, 1078, '(IV43)', 'CI.43', NULL),
(3490, 1078, 'Duekoue', 'CI.44', NULL),
(3491, 1078, 'Grand-Lahou', 'CI.45', NULL),
(3492, 1078, '(IV46)', 'CI.46', NULL),
(3493, 1078, 'Man', 'CI.47', NULL),
(3494, 1078, 'Mbahiakro', 'CI.48', NULL),
(3495, 1078, 'Sakassou', 'CI.49', NULL),
(3496, 1078, 'San Pedro', 'CI.50', NULL),
(3497, 1078, 'Sassandra', 'CI.51', NULL),
(3498, 1078, 'Sinfra', 'CI.52', NULL),
(3499, 1078, 'Tabou', 'CI.53', NULL),
(3500, 1078, 'Tanda', 'CI.54', NULL),
(3501, 1078, 'Tiassale', 'CI.55', NULL),
(3502, 1078, 'Toumodi', 'CI.56', NULL),
(3503, 1078, 'Vavoua', 'CI.57', NULL),
(3504, 1078, '(IV58)', 'CI.58', NULL),
(3505, 1078, '(IV59)', 'CI.59', NULL),
(3506, 1078, '(IV60)', 'CI.60', NULL),
(3507, 1078, 'Abidjan', 'CI.61', NULL),
(3508, 1078, 'Aboisso', 'CI.62', NULL),
(3509, 1078, 'Adiake', 'CI.63', NULL),
(3510, 1078, 'Alepe', 'CI.64', NULL),
(3511, 1078, 'Bocanda', 'CI.65', NULL),
(3512, 1078, 'Dabou', 'CI.66', NULL),
(3513, 1078, 'Dimbokro', 'CI.67', NULL),
(3514, 1078, 'Grand-Bassam', 'CI.68', NULL),
(3515, 1078, 'Guiglo', 'CI.69', NULL),
(3516, 1078, 'Jacqueville', 'CI.70', NULL),
(3517, 1078, 'Tiebissou', 'CI.71', NULL),
(3518, 1078, 'Toulepleu', 'CI.72', NULL),
(3519, 1078, 'Yamoussoukro', 'CI.73', NULL),
(3520, 1078, 'Agnéby', 'CI.74', NULL),
(3521, 1078, 'Bafing', 'CI.75', NULL),
(3522, 1078, 'Bas-Sassandra', 'CI.76', NULL),
(3523, 1078, 'Denguélé', 'CI.77', NULL),
(3524, 1078, 'Dix-Huit Montagnes', 'CI.78', NULL),
(3525, 1078, 'Fromager', 'CI.79', NULL),
(3526, 1078, 'Haut-Sassandra', 'CI.80', NULL),
(3527, 1078, 'Lacs', 'CI.81', NULL),
(3528, 1078, 'Lagunes', 'CI.82', NULL),
(3529, 1078, 'Marahoué', 'CI.83', NULL),
(3530, 1078, 'Moyen-Cavally', 'CI.84', NULL),
(3531, 1078, 'Moyen-Comoé', 'CI.85', NULL),
(3532, 1078, 'Nʼzi-Comoé', 'CI.86', NULL),
(3533, 1078, 'Savanes', 'CI.87', NULL),
(3534, 1078, 'Sud-Bandama', 'CI.88', NULL),
(3535, 1078, 'Sud-Comoé', 'CI.89', NULL),
(3536, 1078, 'Vallée du Bandama', 'CI.90', NULL),
(3537, 1078, 'Worodougou', 'CI.91', NULL),
(3538, 1078, 'Zanzan', 'CI.92', NULL),
(3539, 1078, 'Cook Islands (general)', 'CK.00', NULL),
(3540, 1078, 'Chile (general)', 'CL.00', NULL),
(3541, 1078, 'Valparaíso', 'CL.01', NULL),
(3542, 1078, 'Aisén del General Carlos Ibáñez del Campo', 'CL.02', NULL),
(3543, 1078, 'Antofagasta', 'CL.03', NULL),
(3544, 1078, 'Araucanía', 'CL.04', NULL),
(3545, 1078, 'Atacama', 'CL.05', NULL),
(3546, 1078, 'Bío-Bío', 'CL.06', NULL),
(3547, 1078, 'Coquimbo', 'CL.07', NULL),
(3548, 1078, 'Libertador General Bernardo OʼHiggins', 'CL.08', NULL),
(3549, 1078, 'Magallanes y Antártica Chilena', 'CL.10', NULL),
(3550, 1078, 'Maule', 'CL.11', NULL),
(3551, 1078, 'Región Metropolitana', 'CL.12', NULL),
(3552, 1078, 'Cameroon (general)', 'CM.00', NULL),
(3553, 1078, 'Est', 'CM.04', NULL),
(3554, 1078, 'Littoral', 'CM.05', NULL),
(3555, 1078, 'North-West Province', 'CM.07', NULL),
(3556, 1078, 'Ouest', 'CM.08', NULL),
(3557, 1078, 'South-West Province', 'CM.09', NULL),
(3558, 1078, 'Adamaoua', 'CM.10', NULL),
(3559, 1078, 'Centre', 'CM.11', NULL),
(3560, 1078, 'Extreme-Nord', 'CM.12', NULL),
(3561, 1078, 'North Province', 'CM.13', NULL),
(3562, 1078, 'South Province', 'CM.14', NULL),
(3563, 1078, 'Paracel Islands (general)', 'CN.00', NULL),
(3564, 1078, 'Anhui', 'CN.01', NULL),
(3565, 1078, 'Zhejiang', 'CN.02', NULL),
(3566, 1078, 'Jiangxi', 'CN.03', NULL),
(3567, 1078, 'Jiangsu', 'CN.04', NULL),
(3568, 1078, 'Jilin', 'CN.05', NULL),
(3569, 1078, 'Qinghai', 'CN.06', NULL),
(3570, 1078, 'Fujian', 'CN.07', NULL),
(3571, 1078, 'Heilongjiang', 'CN.08', NULL),
(3572, 1078, 'Henan', 'CN.09', NULL),
(3573, 1078, 'disputed', 'CN.0Z', NULL),
(3574, 1078, 'Hebei', 'CN.10', NULL),
(3575, 1078, 'Hunan Province', 'CN.11', NULL),
(3576, 1078, 'Hubei', 'CN.12', NULL),
(3577, 1078, 'Xinjiang', 'CN.13', NULL),
(3578, 1078, 'Xizang', 'CN.14', NULL),
(3579, 1078, 'Gansu', 'CN.15', NULL),
(3580, 1078, 'Guangxi', 'CN.16', NULL),
(3581, 1078, 'Guizhou', 'CN.18', NULL),
(3582, 1078, 'Liaoning Province', 'CN.19', NULL),
(3583, 1078, 'Nei Mongol', 'CN.20', NULL),
(3584, 1078, 'Ningxia', 'CN.21', NULL),
(3585, 1078, 'Beijing', 'CN.22', NULL),
(3586, 1078, 'Shanghai', 'CN.23', NULL),
(3587, 1078, 'Shanxi', 'CN.24', NULL),
(3588, 1078, 'Shandong', 'CN.25', NULL),
(3589, 1078, 'Shaanxi', 'CN.26', NULL),
(3590, 1078, 'Tianjin', 'CN.28', NULL),
(3591, 1078, 'Yunnan Province', 'CN.29', NULL),
(3592, 1078, 'Guangdong', 'CN.30', NULL),
(3593, 1078, 'Hainan Province', 'CN.31', NULL),
(3594, 1078, 'Sichuan', 'CN.32', NULL),
(3595, 1078, 'Chongqing', 'CN.33', NULL),
(3596, 1078, 'PF99', 'CN.99', NULL),
(3597, 1078, 'Colombia (general)', 'CO.00', NULL),
(3598, 1078, 'Amazonas', 'CO.01', NULL),
(3599, 1078, 'Antioquia', 'CO.02', NULL),
(3600, 1078, 'Arauca', 'CO.03', NULL),
(3601, 1078, 'Atlántico', 'CO.04', NULL),
(3602, 1078, 'Bolívar', 'CO.05', NULL),
(3603, 1078, 'Boyacá', 'CO.06', NULL),
(3604, 1078, 'Caldas', 'CO.07', NULL),
(3605, 1078, 'Caquetá', 'CO.08', NULL),
(3606, 1078, 'Cauca', 'CO.09', NULL),
(3607, 1078, 'Cesar', 'CO.10', NULL),
(3608, 1078, 'Chocó', 'CO.11', NULL),
(3609, 1078, 'Córdoba', 'CO.12', NULL),
(3610, 1078, 'Guaviare', 'CO.14', NULL),
(3611, 1078, 'Guainía', 'CO.15', NULL),
(3612, 1078, 'Huila', 'CO.16', NULL),
(3613, 1078, 'La Guajira', 'CO.17', NULL),
(3614, 1078, 'Magdalena', 'CO.18', NULL),
(3615, 1078, 'Meta', 'CO.19', NULL),
(3616, 1078, 'Nariño', 'CO.20', NULL),
(3617, 1078, 'Norte de Santander', 'CO.21', NULL),
(3618, 1078, 'Putumayo', 'CO.22', NULL),
(3619, 1078, 'Quindío', 'CO.23', NULL),
(3620, 1078, 'Risaralda', 'CO.24', NULL),
(3621, 1078, 'Archipiélago de San Andrés, Providencia y Santa Catalina', 'CO.25', NULL),
(3622, 1078, 'Santander', 'CO.26', NULL),
(3623, 1078, 'Sucre', 'CO.27', NULL),
(3624, 1078, 'Tolima', 'CO.28', NULL),
(3625, 1078, 'Valle del Cauca', 'CO.29', NULL),
(3626, 1078, 'Vaupés', 'CO.30', NULL),
(3627, 1078, 'Vichada', 'CO.31', NULL),
(3628, 1078, 'Casanare', 'CO.32', NULL),
(3629, 1078, 'Cundinamarca', 'CO.33', NULL),
(3630, 1078, 'Bogota D.C.', 'CO.34', NULL),
(3631, 1078, 'Bolívar', 'CO.35', NULL),
(3632, 1078, 'Boyacá', 'CO.36', NULL),
(3633, 1078, 'Caldas', 'CO.37', NULL),
(3634, 1078, 'Magdalena', 'CO.38', NULL),
(3635, 1078, 'Costa Rica (general)', 'CR.00', NULL),
(3636, 1078, 'Alajuela', 'CR.01', NULL),
(3637, 1078, 'Cartago', 'CR.02', NULL),
(3638, 1078, 'Guanacaste', 'CR.03', NULL),
(3639, 1078, 'Heredia', 'CR.04', NULL),
(3640, 1078, 'Limón', 'CR.06', NULL),
(3641, 1078, 'Puntarenas', 'CR.07', NULL),
(3642, 1078, 'San José', 'CR.08', NULL),
(3643, 1078, 'Serbia and Montenegro (general)', 'CS.00', NULL),
(3644, 1078, 'Crna Gora (Montenegro)', 'CS.01', NULL),
(3645, 1078, 'Srbija (Serbia)', 'CS.02', NULL),
(3646, 1078, 'Cuba (general)', 'CU.00', NULL),
(3647, 1078, 'Pinar del Río', 'CU.01', NULL),
(3648, 1078, 'Ciudad de La Habana', 'CU.02', NULL),
(3649, 1078, 'Matanzas', 'CU.03', NULL),
(3650, 1078, 'Isla de la Juventud', 'CU.04', NULL),
(3651, 1078, 'Camagüey', 'CU.05', NULL),
(3652, 1078, 'Ciego de Ávila', 'CU.07', NULL),
(3653, 1078, 'Cienfuegos', 'CU.08', NULL),
(3654, 1078, 'Granma', 'CU.09', NULL),
(3655, 1078, 'Guantánamo', 'CU.10', NULL),
(3656, 1078, 'La Habana', 'CU.11', NULL),
(3657, 1078, 'Holguín', 'CU.12', NULL),
(3658, 1078, 'Las Tunas', 'CU.13', NULL),
(3659, 1078, 'Sancti Spíritus', 'CU.14', NULL),
(3660, 1078, 'Santiago de Cuba', 'CU.15', NULL),
(3661, 1078, 'Villa Clara', 'CU.16', NULL),
(3662, 1078, 'Cape Verde (general)', 'CV.00', NULL),
(3663, 1078, 'Boa Vista', 'CV.01', NULL),
(3664, 1078, 'Brava', 'CV.02', NULL),
(3665, 1078, 'Maio', 'CV.04', NULL),
(3666, 1078, 'Paul', 'CV.05', NULL),
(3667, 1078, 'Praia', 'CV.06', NULL),
(3668, 1078, 'Ribeira Grande', 'CV.07', NULL),
(3669, 1078, 'Sal', 'CV.08', NULL),
(3670, 1078, 'Santa Catarina ', 'CV.09', NULL),
(3671, 1078, 'São Nicolau', 'CV.10', NULL),
(3672, 1078, 'São Vicente', 'CV.11', NULL),
(3673, 1078, 'Tarrafal ', 'CV.12', NULL),
(3674, 1078, 'Mosteiros', 'CV.13', NULL),
(3675, 1078, 'Praia', 'CV.14', NULL),
(3676, 1078, 'Santa Catarina', 'CV.15', NULL),
(3677, 1078, 'Santa Cruz', 'CV.16', NULL),
(3678, 1078, 'São Domingos', 'CV.17', NULL),
(3679, 1078, 'São Filipe', 'CV.18', NULL),
(3680, 1078, 'São Miguel', 'CV.19', NULL),
(3681, 1078, 'Tarrafal', 'CV.20', NULL),
(3682, 1078, 'Christmas Island (general)', 'CX.00', NULL),
(3683, 1078, 'Cyprus (general)', 'CY.00', NULL),
(3684, 1078, 'Famagusta', 'CY.01', NULL),
(3685, 1078, 'Kyrenia', 'CY.02', NULL),
(3686, 1078, 'Larnaca', 'CY.03', NULL),
(3687, 1078, 'Nicosia', 'CY.04', NULL),
(3688, 1078, 'Limassol', 'CY.05', NULL),
(3689, 1078, 'Paphos', 'CY.06', NULL),
(3690, 1078, 'Czech Republic (general)', 'CZ.00', NULL),
(3691, 1078, 'Hradec Kralove', 'CZ.20', NULL),
(3692, 1078, 'Jablonec nad Nisou', 'CZ.21', NULL),
(3693, 1078, 'Jiein', 'CZ.23', NULL),
(3694, 1078, 'Jihlava', 'CZ.24', NULL),
(3695, 1078, 'Kolin', 'CZ.30', NULL),
(3696, 1078, 'Liberec', 'CZ.33', NULL),
(3697, 1078, 'Melnik', 'CZ.36', NULL),
(3698, 1078, 'Mlada Boleslav', 'CZ.37', NULL),
(3699, 1078, 'Nachod', 'CZ.39', NULL),
(3700, 1078, 'Nymburk', 'CZ.41', NULL),
(3701, 1078, 'Pardubice', 'CZ.45', NULL),
(3702, 1078, 'Hlavní Mesto Praha', 'CZ.52', NULL),
(3703, 1078, 'Semily', 'CZ.61', NULL),
(3704, 1078, 'Trutnov', 'CZ.70', NULL),
(3705, 1078, '(EZ73)', 'CZ.73', NULL),
(3706, 1078, 'South Moravian Region', 'CZ.78', NULL),
(3707, 1078, 'Jihočeský Kraj', 'CZ.79', NULL),
(3708, 1078, 'Vysočina', 'CZ.80', NULL),
(3709, 1078, 'Karlovarský Kraj', 'CZ.81', NULL),
(3710, 1078, 'Královéhradecký Kraj', 'CZ.82', NULL),
(3711, 1078, 'Liberecký Kraj', 'CZ.83', NULL),
(3712, 1078, 'Olomoucký Kraj', 'CZ.84', NULL),
(3713, 1078, 'Moravskoslezský Kraj', 'CZ.85', NULL),
(3714, 1078, 'Pardubický Kraj', 'CZ.86', NULL),
(3715, 1078, 'Plzeňský Kraj', 'CZ.87', NULL),
(3716, 1078, 'Středočeský Kraj', 'CZ.88', NULL),
(3717, 1078, 'Ústecký Kraj', 'CZ.89', NULL),
(3718, 1078, 'Zlínský Kraj', 'CZ.90', NULL),
(3719, 1078, 'Germany (general)', 'DE.00', NULL),
(3720, 1078, 'Baden-Württemberg', 'DE.01', NULL),
(3721, 1078, 'Bavaria', 'DE.02', NULL),
(3722, 1078, 'Bremen', 'DE.03', NULL),
(3723, 1078, 'Hamburg', 'DE.04', NULL),
(3724, 1078, 'Hesse', 'DE.05', NULL),
(3725, 1078, 'Lower Saxony', 'DE.06', NULL),
(3726, 1078, 'North Rhine-Westphalia', 'DE.07', NULL),
(3727, 1078, 'Rhineland-Palatinate', 'DE.08', NULL),
(3728, 1078, 'Saarland', 'DE.09', NULL),
(3729, 1078, 'Schleswig-Holstein', 'DE.10', NULL),
(3730, 1078, 'Brandenburg', 'DE.11', NULL),
(3731, 1078, 'Mecklenburg-Vorpommern', 'DE.12', NULL),
(3732, 1078, 'Saxony', 'DE.13', NULL),
(3733, 1078, 'Saxony-Anhalt', 'DE.14', NULL),
(3734, 1078, 'Thuringia', 'DE.15', NULL),
(3735, 1078, 'Berlin', 'DE.16', NULL),
(3736, 1078, 'Djibouti (general)', 'DJ.00', NULL),
(3737, 1078, 'Ali Sabieh', 'DJ.01', NULL),
(3738, 1078, 'Dikhil ', 'DJ.02', NULL),
(3739, 1078, 'Djibouti ', 'DJ.03', NULL),
(3740, 1078, 'Obock', 'DJ.04', NULL),
(3741, 1078, 'Tadjourah', 'DJ.05', NULL),
(3742, 1078, 'Dikhil', 'DJ.06', NULL),
(3743, 1078, 'Djibouti', 'DJ.07', NULL),
(3744, 1078, 'Arta', 'DJ.08', NULL),
(3745, 1078, 'Århus', 'DK.01', NULL),
(3746, 1078, 'Bornholm', 'DK.02', NULL),
(3747, 1078, 'Frederiksborg', 'DK.03', NULL),
(3748, 1078, 'Fyn', 'DK.04', NULL),
(3749, 1078, 'Copenhagen city', 'DK.05', NULL),
(3750, 1078, 'København', 'DK.06', NULL),
(3751, 1078, 'Nordjylland', 'DK.07', NULL),
(3752, 1078, 'Ribe', 'DK.08', NULL),
(3753, 1078, 'Ringkøbing', 'DK.09', NULL),
(3754, 1078, 'Roskilde', 'DK.10', NULL),
(3755, 1078, 'Sønderjylland', 'DK.11', NULL),
(3756, 1078, 'Storstrøm', 'DK.12', NULL),
(3757, 1078, 'Vejle', 'DK.13', NULL),
(3758, 1078, 'Vestsjælland', 'DK.14', NULL),
(3759, 1078, 'Viborg', 'DK.15', NULL),
(3760, 1078, 'Fredriksberg', 'DK.16', NULL),
(3761, 1078, 'Capital Region', 'DK.17', NULL),
(3762, 1078, 'Central Jutland', 'DK.18', NULL),
(3763, 1078, 'North Jutland', 'DK.19', NULL),
(3764, 1078, 'Region Zealand', 'DK.20', NULL),
(3765, 1078, 'Region South Denmark', 'DK.21', NULL),
(3766, 1078, 'Dominica (general)', 'DM.00', NULL),
(3767, 1078, 'Saint Andrew', 'DM.02', NULL),
(3768, 1078, 'Saint David', 'DM.03', NULL),
(3769, 1078, 'Saint George', 'DM.04', NULL),
(3770, 1078, 'Saint John', 'DM.05', NULL),
(3771, 1078, 'Saint Joseph', 'DM.06', NULL),
(3772, 1078, 'Saint Luke', 'DM.07', NULL),
(3773, 1078, 'Saint Mark', 'DM.08', NULL),
(3774, 1078, 'Saint Patrick', 'DM.09', NULL),
(3775, 1078, 'Saint Paul', 'DM.10', NULL),
(3776, 1078, 'Saint Peter', 'DM.11', NULL),
(3777, 1078, 'Dominican Republic (general)', 'DO.00', NULL),
(3778, 1078, 'Azua', 'DO.01', NULL),
(3779, 1078, 'Baoruco', 'DO.02', NULL),
(3780, 1078, 'Barahona', 'DO.03', NULL),
(3781, 1078, 'Dajabón', 'DO.04', NULL),
(3782, 1078, 'Duarte', 'DO.06', NULL),
(3783, 1078, 'Espaillat', 'DO.08', NULL),
(3784, 1078, 'Independencia', 'DO.09', NULL),
(3785, 1078, 'La Altagracia', 'DO.10', NULL),
(3786, 1078, 'Elías Piña', 'DO.11', NULL),
(3787, 1078, 'La Romana', 'DO.12', NULL),
(3788, 1078, 'María Trinidad Sánchez', 'DO.14', NULL),
(3789, 1078, 'Monte Cristi', 'DO.15', NULL),
(3790, 1078, 'Pedernales', 'DO.16', NULL),
(3791, 1078, 'Puerto Plata', 'DO.18', NULL),
(3792, 1078, 'Salcedo', 'DO.19', NULL),
(3793, 1078, 'Samaná', 'DO.20', NULL),
(3794, 1078, 'Sánchez Ramírez', 'DO.21', NULL),
(3795, 1078, 'San Juan', 'DO.23', NULL),
(3796, 1078, 'San Pedro de Macorís', 'DO.24', NULL),
(3797, 1078, 'Santiago', 'DO.25', NULL),
(3798, 1078, 'Santiago Rodríguez', 'DO.26', NULL),
(3799, 1078, 'Valverde', 'DO.27', NULL),
(3800, 1078, 'El Seíbo', 'DO.28', NULL),
(3801, 1078, 'Hato Mayor', 'DO.29', NULL),
(3802, 1078, 'La Vega', 'DO.30', NULL),
(3803, 1078, 'Monseñor Nouel', 'DO.31', NULL),
(3804, 1078, 'Monte Plata', 'DO.32', NULL),
(3805, 1078, 'San Cristóbal', 'DO.33', NULL),
(3806, 1078, 'Distrito Nacional', 'DO.34', NULL),
(3807, 1078, 'Peravia', 'DO.35', NULL),
(3808, 1078, 'Provincia de San José de Ocoa', 'DO.36', NULL),
(3809, 1078, 'Provincia de Santo Domingo', 'DO.37', NULL),
(3810, 1078, 'Algeria (general)', 'DZ.00', NULL),
(3811, 1078, 'Alger', 'DZ.01', NULL),
(3812, 1078, 'Batna', 'DZ.03', NULL),
(3813, 1078, 'Constantine', 'DZ.04', NULL),
(3814, 1078, 'Médéa', 'DZ.06', NULL),
(3815, 1078, 'Mostaganem', 'DZ.07', NULL),
(3816, 1078, 'Oran', 'DZ.09', NULL),
(3817, 1078, 'Saïda', 'DZ.10', NULL),
(3818, 1078, 'Sétif', 'DZ.12', NULL),
(3819, 1078, 'Tiaret', 'DZ.13', NULL),
(3820, 1078, 'Tizi Ouzou', 'DZ.14', NULL),
(3821, 1078, 'Tlemcen', 'DZ.15', NULL),
(3822, 1078, 'Bejaïa', 'DZ.18', NULL),
(3823, 1078, 'Biskra', 'DZ.19', NULL),
(3824, 1078, 'Blida', 'DZ.20', NULL),
(3825, 1078, 'Bouira', 'DZ.21', NULL),
(3826, 1078, 'Djelfa', 'DZ.22', NULL),
(3827, 1078, 'Guelma', 'DZ.23', NULL),
(3828, 1078, 'Jijel', 'DZ.24', NULL),
(3829, 1078, 'Laghouat', 'DZ.25', NULL),
(3830, 1078, 'Mascara', 'DZ.26', NULL),
(3831, 1078, 'Mʼsila', 'DZ.27', NULL),
(3832, 1078, 'Oum el Bouaghi', 'DZ.29', NULL),
(3833, 1078, 'Sidi Bel Abbès', 'DZ.30', NULL),
(3834, 1078, 'Skikda', 'DZ.31', NULL),
(3835, 1078, 'Tébessa', 'DZ.33', NULL),
(3836, 1078, 'Adrar', 'DZ.34', NULL),
(3837, 1078, 'Aïn Defla', 'DZ.35', NULL),
(3838, 1078, 'Aïn Temouchent', 'DZ.36', NULL),
(3839, 1078, 'Annaba', 'DZ.37', NULL),
(3840, 1078, 'Béchar', 'DZ.38', NULL),
(3841, 1078, 'Bordj Bou Arréridj', 'DZ.39', NULL),
(3842, 1078, 'Boumerdes', 'DZ.40', NULL),
(3843, 1078, 'Chlef', 'DZ.41', NULL),
(3844, 1078, 'El Bayadh', 'DZ.42', NULL),
(3845, 1078, 'El Oued', 'DZ.43', NULL),
(3846, 1078, 'El Tarf', 'DZ.44', NULL),
(3847, 1078, 'Ghardaïa', 'DZ.45', NULL),
(3848, 1078, 'Illizi', 'DZ.46', NULL),
(3849, 1078, 'Khenchela', 'DZ.47', NULL),
(3850, 1078, 'Mila', 'DZ.48', NULL),
(3851, 1078, 'Naama النعامة', 'DZ.49', NULL),
(3852, 1078, 'Ouargla', 'DZ.50', NULL),
(3853, 1078, 'Relizane', 'DZ.51', NULL),
(3854, 1078, 'Souk Ahras', 'DZ.52', NULL),
(3855, 1078, 'Tamanghasset', 'DZ.53', NULL),
(3856, 1078, 'Tindouf', 'DZ.54', NULL),
(3857, 1078, 'Tipaza', 'DZ.55', NULL),
(3858, 1078, 'Tissemsilt', 'DZ.56', NULL),
(3859, 1078, 'Ecuador (general)', 'EC.00', NULL),
(3860, 1078, 'Galápagos', 'EC.01', NULL),
(3861, 1078, 'Azuay', 'EC.02', NULL),
(3862, 1078, 'Bolívar', 'EC.03', NULL),
(3863, 1078, 'Cañar', 'EC.04', NULL),
(3864, 1078, 'Carchi', 'EC.05', NULL),
(3865, 1078, 'Chimborazo', 'EC.06', NULL),
(3866, 1078, 'Cotopaxi', 'EC.07', NULL),
(3867, 1078, 'El Oro', 'EC.08', NULL),
(3868, 1078, 'Esmeraldas', 'EC.09', NULL),
(3869, 1078, 'Guayas', 'EC.10', NULL),
(3870, 1078, 'Imbabura', 'EC.11', NULL),
(3871, 1078, 'Loja', 'EC.12', NULL),
(3872, 1078, 'Los Ríos', 'EC.13', NULL),
(3873, 1078, 'Manabí', 'EC.14', NULL),
(3874, 1078, 'Morona-Santiago', 'EC.15', NULL),
(3875, 1078, 'Napo', 'EC.16', NULL),
(3876, 1078, 'Pastaza', 'EC.17', NULL),
(3877, 1078, 'Pichincha', 'EC.18', NULL),
(3878, 1078, 'Tungurahua', 'EC.19', NULL),
(3879, 1078, 'Zamora-Chinchipe', 'EC.20', NULL),
(3880, 1078, 'Sucumbios', 'EC.22', NULL),
(3881, 1078, 'Napo', 'EC.23', NULL),
(3882, 1078, 'Orellana', 'EC.24', NULL),
(3883, 1078, 'Estonia (general)', 'EE.00', NULL),
(3884, 1078, 'Harjumaa', 'EE.01', NULL),
(3885, 1078, 'Hiiumaa', 'EE.02', NULL),
(3886, 1078, 'Ida-Virumaa', 'EE.03', NULL),
(3887, 1078, 'Järvamaa', 'EE.04', NULL),
(3888, 1078, 'Jõgevamaa', 'EE.05', NULL),
(3889, 1078, 'Läänemaa', 'EE.07', NULL),
(3890, 1078, 'Lääne-Virumaa', 'EE.08', NULL),
(3891, 1078, 'Pärnumaa', 'EE.11', NULL),
(3892, 1078, 'Põlvamaa', 'EE.12', NULL),
(3893, 1078, 'Raplamaa', 'EE.13', NULL),
(3894, 1078, 'Saaremaa', 'EE.14', NULL),
(3895, 1078, 'Tartumaa', 'EE.18', NULL),
(3896, 1078, 'Valgamaa', 'EE.19', NULL),
(3897, 1078, 'Viljandimaa', 'EE.20', NULL),
(3898, 1078, 'Võrumaa', 'EE.21', NULL),
(3899, 1078, 'Egypt (general)', 'EG.00', NULL),
(3900, 1078, 'Ad Daqahlīyah', 'EG.01', NULL),
(3901, 1078, 'Al Baḩr al Aḩmar', 'EG.02', NULL),
(3902, 1078, 'Al Buḩayrah', 'EG.03', NULL),
(3903, 1078, 'Al Fayyūm', 'EG.04', NULL),
(3904, 1078, 'Al Gharbīyah', 'EG.05', NULL),
(3905, 1078, 'Alexandria', 'EG.06', NULL),
(3906, 1078, 'Al Ismā‘īlīyah', 'EG.07', NULL),
(3907, 1078, 'Al Jīzah', 'EG.08', NULL),
(3908, 1078, 'Al Minūfīyah', 'EG.09', NULL),
(3909, 1078, 'Al Minyā', 'EG.10', NULL),
(3910, 1078, 'Al Qāhirah', 'EG.11', NULL),
(3911, 1078, 'Al Qalyūbīyah', 'EG.12', NULL),
(3912, 1078, 'Al Wādī al Jadīd', 'EG.13', NULL),
(3913, 1078, 'Eastern Province', 'EG.14', NULL),
(3914, 1078, 'As Suways', 'EG.15', NULL),
(3915, 1078, 'Aswān', 'EG.16', NULL),
(3916, 1078, 'Asyūţ', 'EG.17', NULL),
(3917, 1078, 'Banī Suwayf', 'EG.18', NULL),
(3918, 1078, 'Būr Sa‘īd', 'EG.19', NULL),
(3919, 1078, 'Dumyāţ', 'EG.20', NULL),
(3920, 1078, 'Kafr ash Shaykh', 'EG.21', NULL),
(3921, 1078, 'Maţrūḩ', 'EG.22', NULL),
(3922, 1078, 'Qinā', 'EG.23', NULL),
(3923, 1078, 'Sūhāj', 'EG.24', NULL),
(3924, 1078, 'Janūb Sīnāʼ', 'EG.26', NULL),
(3925, 1078, 'Shamāl Sīnāʼ', 'EG.27', NULL),
(3926, 1078, 'Western Sahara (general)', 'EH.00', NULL),
(3927, 1078, 'Eritrea (general)', 'ER.00', NULL),
(3928, 1078, 'Ānseba', 'ER.01', NULL),
(3929, 1078, 'Debub', 'ER.02', NULL),
(3930, 1078, 'Debubawī Kʼeyih Bahrī', 'ER.03', NULL),
(3931, 1078, 'Gash Barka', 'ER.04', NULL),
(3932, 1078, 'Maʼākel', 'ER.05', NULL),
(3933, 1078, 'Semēnawī Kʼeyih Bahrī', 'ER.06', NULL),
(3934, 1078, 'Ceuta', 'ES.00', NULL),
(3935, 1078, 'Balearic Islands', 'ES.07', NULL),
(3936, 1078, 'La Rioja', 'ES.27', NULL),
(3937, 1078, '(SP28)', 'ES.28', NULL),
(3938, 1078, 'Autonomous Region of Madrid', 'ES.29', NULL),
(3939, 1078, 'Murcia', 'ES.31', NULL),
(3940, 1078, 'Navarre', 'ES.32', NULL),
(3941, 1078, 'Asturias', 'ES.34', NULL),
(3942, 1078, 'Cantabria', 'ES.39', NULL),
(3943, 1078, 'Andalusia', 'ES.51', NULL),
(3944, 1078, 'Aragon', 'ES.52', NULL),
(3945, 1078, 'Canary Islands', 'ES.53', NULL),
(3946, 1078, 'Castille-La Mancha', 'ES.54', NULL),
(3947, 1078, 'Castille and León', 'ES.55', NULL),
(3948, 1078, 'Catalonia', 'ES.56', NULL),
(3949, 1078, 'Estremadura', 'ES.57', NULL),
(3950, 1078, 'Galicia', 'ES.58', NULL),
(3951, 1078, 'Basque Country', 'ES.59', NULL),
(3952, 1078, 'Valencia', 'ES.60', NULL),
(3953, 1078, 'Ethiopia (general)', 'ET.00', NULL),
(3954, 1078, 'Arsi', 'ET.01', NULL),
(3955, 1078, 'Gonder', 'ET.02', NULL),
(3956, 1078, 'Bale', 'ET.03', NULL),
(3957, 1078, 'Eritrea', 'ET.04', NULL),
(3958, 1078, 'Gamo Gofa', 'ET.05', NULL),
(3959, 1078, 'Gojam', 'ET.06', NULL),
(3960, 1078, 'Harerge', 'ET.07', NULL),
(3961, 1078, 'Ilubabor', 'ET.08', NULL),
(3962, 1078, 'Kefa', 'ET.09', NULL),
(3963, 1078, 'Addis Abeba', 'ET.10', NULL),
(3964, 1078, 'Sidamo', 'ET.11', NULL),
(3965, 1078, 'Tigray', 'ET.12', NULL),
(3966, 1078, 'Welega Kifle Hāger', 'ET.13', NULL),
(3967, 1078, 'Welo', 'ET.14', NULL),
(3968, 1078, 'Adis Abeba', 'ET.15', NULL),
(3969, 1078, 'Asosa', 'ET.17', NULL),
(3970, 1078, 'Borena ', 'ET.18', NULL),
(3971, 1078, 'Debub Gonder', 'ET.19', NULL),
(3972, 1078, 'Debub Shewa', 'ET.20', NULL),
(3973, 1078, 'Debub Welo', 'ET.21', NULL),
(3974, 1078, 'Dire Dawa', 'ET.22', NULL),
(3975, 1078, 'Gambela', 'ET.23', NULL),
(3976, 1078, 'Metekel', 'ET.24', NULL),
(3977, 1078, 'Mirab Gojam', 'ET.25', NULL),
(3978, 1078, 'Mirab Harerge', 'ET.26', NULL),
(3979, 1078, 'Mirab Shewa', 'ET.27', NULL),
(3980, 1078, 'Misrak Gojam', 'ET.28', NULL),
(3981, 1078, 'Misrak Harerge', 'ET.29', NULL),
(3982, 1078, 'Nazret', 'ET.30', NULL),
(3983, 1078, 'Ogaden', 'ET.31', NULL),
(3984, 1078, 'Omo', 'ET.32', NULL),
(3985, 1078, 'Semen Gonder', 'ET.33', NULL),
(3986, 1078, 'Semen Shewa', 'ET.34', NULL),
(3987, 1078, 'Semen Welo', 'ET.35', NULL),
(3988, 1078, 'Tigray', 'ET.37', NULL),
(3989, 1078, 'Bale', 'ET.38', NULL),
(3990, 1078, 'Gamo Gofa', 'ET.39', NULL),
(3991, 1078, 'Ilubabor', 'ET.40', NULL),
(3992, 1078, 'Kefa', 'ET.41', NULL),
(3993, 1078, 'Sidamo', 'ET.42', NULL),
(3994, 1078, 'Welega', 'ET.43', NULL),
(3995, 1078, 'Ādīs Ābeba', 'ET.44', NULL),
(3996, 1078, 'Āfar', 'ET.45', NULL),
(3997, 1078, 'Āmara', 'ET.46', NULL),
(3998, 1078, 'Bīnshangul Gumuz', 'ET.47', NULL),
(3999, 1078, 'Dirē Dawa', 'ET.48', NULL),
(4000, 1078, 'Gambēla Hizboch', 'ET.49', NULL),
(4001, 1078, 'Hārerī Hizb', 'ET.50', NULL),
(4002, 1078, 'Oromīya', 'ET.51', NULL),
(4003, 1078, 'Sumalē', 'ET.52', NULL),
(4004, 1078, 'Tigray', 'ET.53', NULL),
(4005, 1078, 'YeDebub Bihēroch Bihēreseboch na Hizboch', 'ET.54', NULL),
(4006, 1078, 'Finland (general)', 'FI.00', NULL),
(4007, 1078, 'Åland', 'FI.01', NULL),
(4008, 1078, 'Hame', 'FI.02', NULL),
(4009, 1078, 'Keski-Suomi', 'FI.03', NULL),
(4010, 1078, 'Kuopio', 'FI.04', NULL),
(4011, 1078, 'Kymi', 'FI.05', NULL),
(4012, 1078, 'Lapponia', 'FI.06', NULL),
(4013, 1078, 'Mikkeli', 'FI.07', NULL),
(4014, 1078, 'Oulu', 'FI.08', NULL),
(4015, 1078, 'Pohjois-Karjala', 'FI.09', NULL),
(4016, 1078, 'Turku ja Pori', 'FI.10', NULL),
(4017, 1078, 'Uusimaa', 'FI.11', NULL),
(4018, 1078, 'Vaasa', 'FI.12', NULL),
(4019, 1078, 'Southern Finland', 'FI.13', NULL),
(4020, 1078, 'Eastern Finland', 'FI.14', NULL),
(4021, 1078, 'Western Finland', 'FI.15', NULL),
(4022, 1078, 'Fiji (general)', 'FJ.00', NULL),
(4023, 1078, 'Central', 'FJ.01', NULL),
(4024, 1078, 'Eastern', 'FJ.02', NULL),
(4025, 1078, 'Northern', 'FJ.03', NULL),
(4026, 1078, 'Rotuma', 'FJ.04', NULL),
(4027, 1078, 'Western', 'FJ.05', NULL),
(4028, 1078, 'Falkland Islands (Islas Malvinas) (general)', 'FK.00', NULL),
(4029, 1078, 'Micronesia, Federated States of (general)', 'FM.00', NULL),
(4030, 1078, 'Kosrae', 'FM.01', NULL),
(4031, 1078, 'Pohnpei', 'FM.02', NULL),
(4032, 1078, 'Chuuk', 'FM.03', NULL),
(4033, 1078, 'Yap', 'FM.04', NULL),
(4034, 1078, '', 'FM.FM', NULL),
(4035, 1078, 'Norðoya Sýsla', 'FO.NO', NULL),
(4036, 1078, 'Eysturoyar Sýsla', 'FO.OS', NULL),
(4037, 1078, 'Sandoyar Sýsla', 'FO.SA', NULL),
(4038, 1078, 'Streymoyar Sýsla', 'FO.ST', NULL),
(4039, 1078, 'Suðuroyar Sunnara Sýsla', 'FO.SU', NULL),
(4040, 1078, 'Vága Sýsla', 'FO.VG', NULL),
(4041, 1078, 'France (general)', 'FR.00', NULL),
(4042, 1078, 'Aquitaine', 'FR.97', NULL),
(4043, 1078, 'Auvergne', 'FR.98', NULL),
(4044, 1078, 'Basse-Normandie', 'FR.99', NULL),
(4045, 1078, 'Bourgogne', 'FR.A1', NULL),
(4046, 1078, 'Brittany', 'FR.A2', NULL),
(4047, 1078, 'Centre', 'FR.A3', NULL),
(4048, 1078, 'Champagne-Ardenne', 'FR.A4', NULL),
(4049, 1078, 'Corsica', 'FR.A5', NULL),
(4050, 1078, 'Franche-Comté', 'FR.A6', NULL),
(4051, 1078, 'Haute-Normandie', 'FR.A7', NULL),
(4052, 1078, 'Île-de-France', 'FR.A8', NULL),
(4053, 1078, 'Languedoc-Roussillon', 'FR.A9', NULL),
(4054, 1078, 'Limousin', 'FR.B1', NULL),
(4055, 1078, 'Lorraine', 'FR.B2', NULL),
(4056, 1078, 'Midi-Pyrénées', 'FR.B3', NULL),
(4057, 1078, 'Nord-Pas-de-Calais', 'FR.B4', NULL),
(4058, 1078, 'Pays de la Loire', 'FR.B5', NULL),
(4059, 1078, 'Picardie', 'FR.B6', NULL),
(4060, 1078, 'Poitou-Charentes', 'FR.B7', NULL),
(4061, 1078, 'Provence-Alpes-Côte d''Azur', 'FR.B8', NULL),
(4062, 1078, 'Rhône-Alpes', 'FR.B9', NULL),
(4063, 1078, 'Alsace', 'FR.C1', NULL),
(4064, 1078, 'Gabon (general)', 'GA.00', NULL),
(4065, 1078, 'Estuaire', 'GA.01', NULL),
(4066, 1078, 'Haut-Ogooué', 'GA.02', NULL),
(4067, 1078, 'Moyen-Ogooué', 'GA.03', NULL),
(4068, 1078, 'Ngounié', 'GA.04', NULL),
(4069, 1078, 'Nyanga', 'GA.05', NULL),
(4070, 1078, 'Ogooué-Ivindo', 'GA.06', NULL),
(4071, 1078, 'Ogooué-Lolo', 'GA.07', NULL),
(4072, 1078, 'Ogooué-Maritime', 'GA.08', NULL),
(4073, 1078, 'Woleu-Ntem', 'GA.09', NULL),
(4074, 1078, '(UK11)', 'GB.11', NULL),
(4075, 1078, '(UK12)', 'GB.12', NULL),
(4076, 1078, '(UK13)', 'GB.13', NULL),
(4077, 1078, 'Greater London', 'GB.17', NULL),
(4078, 1078, '(UK19)', 'GB.19', NULL),
(4079, 1078, '(UK29)', 'GB.29', NULL),
(4080, 1078, '(UK32)', 'GB.32', NULL),
(4081, 1078, '(UK36)', 'GB.36', NULL),
(4082, 1078, '(UK52)', 'GB.52', NULL),
(4083, 1078, '(UK64)', 'GB.64', NULL),
(4084, 1078, '(UK80)', 'GB.80', NULL),
(4085, 1078, '(UK81)', 'GB.81', NULL),
(4086, 1078, 'Grampian', 'GB.82', NULL),
(4087, 1078, '(UK83)', 'GB.83', NULL),
(4088, 1078, 'Lothian', 'GB.84', NULL),
(4089, 1078, '(UK85)', 'GB.85', NULL),
(4090, 1078, '(UK86)', 'GB.86', NULL),
(4091, 1078, 'Strathclyde', 'GB.87', NULL),
(4092, 1078, 'Tayside', 'GB.88', NULL),
(4093, 1078, '(UK89)', 'GB.89', NULL),
(4094, 1078, 'Clwyd', 'GB.90', NULL),
(4095, 1078, 'Dyfed', 'GB.91', NULL),
(4096, 1078, 'Gwent', 'GB.92', NULL),
(4097, 1078, '(UK93)', 'GB.93', NULL),
(4098, 1078, 'South Glamorgan', 'GB.96', NULL),
(4099, 1078, 'Bath and North East Somerset', 'GB.A4', NULL),
(4100, 1078, 'England', 'GB.ENG', NULL),
(4101, 1078, 'North East Lincolnshire', 'GB.J2', NULL),
(4102, 1078, 'North Lincolnshire', 'GB.J3', NULL),
(4103, 1078, 'North Somerset', 'GB.J4', NULL),
(4104, 1078, 'South Gloucestershire', 'GB.M6', NULL),
(4105, 1078, 'Northern Ireland', 'GB.NIR', NULL),
(4106, 1078, 'Scotland', 'GB.SCT', NULL),
(4107, 1078, 'Argyll and Bute', 'GB.T8', NULL),
(4108, 1078, 'Wales', 'GB.WLS', NULL),
(4109, 1078, 'Grenada (general)', 'GD.00', NULL),
(4110, 1078, 'Saint Andrew', 'GD.01', NULL),
(4111, 1078, 'Saint David', 'GD.02', NULL),
(4112, 1078, 'Saint George', 'GD.03', NULL),
(4113, 1078, 'Saint John', 'GD.04', NULL),
(4114, 1078, 'Saint Mark', 'GD.05', NULL),
(4115, 1078, 'Saint Patrick', 'GD.06', NULL),
(4116, 1078, 'Abkhazia', 'GE.00', NULL),
(4117, 1078, 'Ajaria', 'GE.04', NULL),
(4118, 1078, 'Chʼkhorotsqus Raioni', 'GE.15', NULL),
(4119, 1078, 'Martvilis Raioni', 'GE.36', NULL),
(4120, 1078, 'T''bilisi', 'GE.51', NULL),
(4121, 1078, 'Zugdidis Raioni', 'GE.64', NULL),
(4122, 1078, 'Guyane', 'GF.GF', NULL),
(4123, 1078, 'Guernsey (general)', 'GG.00', NULL),
(4124, 1078, 'Ghana (general)', 'GH.00', NULL),
(4125, 1078, 'Greater Accra', 'GH.01', NULL),
(4126, 1078, 'Ashanti', 'GH.02', NULL),
(4127, 1078, 'Brong-Ahafo Region', 'GH.03', NULL),
(4128, 1078, 'Central', 'GH.04', NULL),
(4129, 1078, 'Eastern', 'GH.05', NULL),
(4130, 1078, 'Northern', 'GH.06', NULL),
(4131, 1078, 'Volta', 'GH.08', NULL),
(4132, 1078, 'Western', 'GH.09', NULL),
(4133, 1078, 'Upper East', 'GH.10', NULL),
(4134, 1078, 'Upper West', 'GH.11', NULL),
(4135, 1078, 'Gibraltar (general)', 'GI.00', NULL),
(4136, 1078, 'Greenland (general)', 'GL.00', NULL),
(4137, 1078, 'Nordgrønland', 'GL.01', NULL),
(4138, 1078, 'Østgrønland', 'GL.02', NULL),
(4139, 1078, 'Vestgrønland', 'GL.03', NULL),
(4140, 1078, 'Gambia, The (general)', 'GM.00', NULL),
(4141, 1078, 'Banjul', 'GM.01', NULL),
(4142, 1078, 'Lower River', 'GM.02', NULL),
(4143, 1078, 'Central River', 'GM.03', NULL),
(4144, 1078, 'Upper River', 'GM.04', NULL),
(4145, 1078, 'Western', 'GM.05', NULL),
(4146, 1078, 'North Bank', 'GM.07', NULL),
(4147, 1078, 'Guinea (general)', 'GN.00', NULL),
(4148, 1078, 'Beyla', 'GN.01', NULL),
(4149, 1078, 'Boffa', 'GN.02', NULL),
(4150, 1078, 'Boké', 'GN.03', NULL),
(4151, 1078, 'Conakry', 'GN.04', NULL),
(4152, 1078, 'Dabola', 'GN.05', NULL);
INSERT INTO `annu_meta_ontologie` (`amo_id_ontologie`, `amo_ce_parent`, `amo_nom`, `amo_abreviation`, `amo_description`) VALUES
(4153, 1078, 'Dalaba', 'GN.06', NULL),
(4154, 1078, 'Dinguiraye', 'GN.07', NULL),
(4155, 1078, '(GV08)', 'GN.08', NULL),
(4156, 1078, 'Faranah', 'GN.09', NULL),
(4157, 1078, 'Forécariah', 'GN.10', NULL),
(4158, 1078, 'Fria', 'GN.11', NULL),
(4159, 1078, 'Gaoual', 'GN.12', NULL),
(4160, 1078, 'Guéckédou', 'GN.13', NULL),
(4161, 1078, '(GV14)', 'GN.14', NULL),
(4162, 1078, 'Kérouané', 'GN.15', NULL),
(4163, 1078, 'Kindia', 'GN.16', NULL),
(4164, 1078, 'Kissidougou', 'GN.17', NULL),
(4165, 1078, 'Koundara', 'GN.18', NULL),
(4166, 1078, 'Kouroussa', 'GN.19', NULL),
(4167, 1078, '(GV20)', 'GN.20', NULL),
(4168, 1078, 'Macenta', 'GN.21', NULL),
(4169, 1078, 'Mali', 'GN.22', NULL),
(4170, 1078, 'Mamou', 'GN.23', NULL),
(4171, 1078, '(GV24)', 'GN.24', NULL),
(4172, 1078, 'Pita', 'GN.25', NULL),
(4173, 1078, '(GV26)', 'GN.26', NULL),
(4174, 1078, 'Télimélé', 'GN.27', NULL),
(4175, 1078, 'Tougué', 'GN.28', NULL),
(4176, 1078, 'Yomou', 'GN.29', NULL),
(4177, 1078, 'Coyah', 'GN.30', NULL),
(4178, 1078, 'Dubréka', 'GN.31', NULL),
(4179, 1078, 'Kankan', 'GN.32', NULL),
(4180, 1078, 'Koubia', 'GN.33', NULL),
(4181, 1078, 'Labé', 'GN.34', NULL),
(4182, 1078, 'Lélouma', 'GN.35', NULL),
(4183, 1078, 'Lola', 'GN.36', NULL),
(4184, 1078, 'Mandiana', 'GN.37', NULL),
(4185, 1078, 'Nzérékoré', 'GN.38', NULL),
(4186, 1078, 'Siguiri', 'GN.39', NULL),
(4187, 1078, 'Région Guadeloupe', 'GP.GP', NULL),
(4188, 1078, 'Equatorial Guinea (general)', 'GQ.00', NULL),
(4189, 1078, 'Annobón', 'GQ.03', NULL),
(4190, 1078, 'Bioko Norte', 'GQ.04', NULL),
(4191, 1078, 'Bioko Sur', 'GQ.05', NULL),
(4192, 1078, 'Centro Sur', 'GQ.06', NULL),
(4193, 1078, 'Kié-Ntem', 'GQ.07', NULL),
(4194, 1078, 'Litoral', 'GQ.08', NULL),
(4195, 1078, 'Wele-Nzas', 'GQ.09', NULL),
(4196, 1078, 'East Macedonia and Thrace', 'GR.ESYE11', NULL),
(4197, 1078, 'Central Macedonia', 'GR.ESYE12', NULL),
(4198, 1078, 'West Macedonia', 'GR.ESYE13', NULL),
(4199, 1078, 'Thessaly', 'GR.ESYE14', NULL),
(4200, 1078, 'Epirus', 'GR.ESYE21', NULL),
(4201, 1078, 'Ionian Islands', 'GR.ESYE22', NULL),
(4202, 1078, 'West Greece', 'GR.ESYE23', NULL),
(4203, 1078, 'Central Greece', 'GR.ESYE24', NULL),
(4204, 1078, 'Peloponnese', 'GR.ESYE25', NULL),
(4205, 1078, 'Attica', 'GR.ESYE31', NULL),
(4206, 1078, 'North Aegean', 'GR.ESYE41', NULL),
(4207, 1078, 'South Aegean', 'GR.ESYE42', NULL),
(4208, 1078, 'Crete', 'GR.ESYE43', NULL),
(4209, 1078, 'South Georgia and The South Sandwich Islands (general)', 'GS.00', NULL),
(4210, 1078, 'Guatemala (general)', 'GT.00', NULL),
(4211, 1078, 'Alta Verapaz', 'GT.01', NULL),
(4212, 1078, 'Baja Verapaz', 'GT.02', NULL),
(4213, 1078, 'Chimaltenango', 'GT.03', NULL),
(4214, 1078, 'Chiquimula', 'GT.04', NULL),
(4215, 1078, 'El Progreso', 'GT.05', NULL),
(4216, 1078, 'Escuintla', 'GT.06', NULL),
(4217, 1078, 'Guatemala', 'GT.07', NULL),
(4218, 1078, 'Huehuetenango', 'GT.08', NULL),
(4219, 1078, 'Izabal', 'GT.09', NULL),
(4220, 1078, 'Jalapa', 'GT.10', NULL),
(4221, 1078, 'Jutiapa', 'GT.11', NULL),
(4222, 1078, 'Petén', 'GT.12', NULL),
(4223, 1078, 'Quetzaltenango', 'GT.13', NULL),
(4224, 1078, 'Quiché', 'GT.14', NULL),
(4225, 1078, 'Retalhuleu', 'GT.15', NULL),
(4226, 1078, 'Sacatepéquez', 'GT.16', NULL),
(4227, 1078, 'San Marcos', 'GT.17', NULL),
(4228, 1078, 'Santa Rosa', 'GT.18', NULL),
(4229, 1078, 'Sololá', 'GT.19', NULL),
(4230, 1078, 'Suchitepéquez', 'GT.20', NULL),
(4231, 1078, 'Totonicapán', 'GT.21', NULL),
(4232, 1078, 'Zacapa', 'GT.22', NULL),
(4233, 1078, 'Guinea-Bissau (general)', 'GW.00', NULL),
(4234, 1078, 'Bafatá', 'GW.01', NULL),
(4235, 1078, 'Quinara', 'GW.02', NULL),
(4236, 1078, 'Oio', 'GW.04', NULL),
(4237, 1078, 'Bolama', 'GW.05', NULL),
(4238, 1078, 'Cacheu', 'GW.06', NULL),
(4239, 1078, 'Tombali', 'GW.07', NULL),
(4240, 1078, 'Gabú', 'GW.10', NULL),
(4241, 1078, 'Bissau', 'GW.11', NULL),
(4242, 1078, 'Biombo', 'GW.12', NULL),
(4243, 1078, 'Guyana (general)', 'GY.00', NULL),
(4244, 1078, 'Barima-Waini', 'GY.10', NULL),
(4245, 1078, 'Cuyuni-Mazaruni', 'GY.11', NULL),
(4246, 1078, 'Demerara-Mahaica', 'GY.12', NULL),
(4247, 1078, 'East Berbice-Corentyne', 'GY.13', NULL),
(4248, 1078, 'Essequibo Islands-West Demerara', 'GY.14', NULL),
(4249, 1078, 'Mahaica-Berbice', 'GY.15', NULL),
(4250, 1078, 'Pomeroon-Supenaam', 'GY.16', NULL),
(4251, 1078, 'Potaro-Siparuni', 'GY.17', NULL),
(4252, 1078, 'Upper Demerara-Berbice', 'GY.18', NULL),
(4253, 1078, 'Upper Takutu-Upper Essequibo', 'GY.19', NULL),
(4254, 1078, 'Hong Kong (general)', 'HK.00', NULL),
(4255, 1078, 'Honduras (general)', 'HN.00', NULL),
(4256, 1078, 'Atlántida', 'HN.01', NULL),
(4257, 1078, 'Choluteca', 'HN.02', NULL),
(4258, 1078, 'Colón', 'HN.03', NULL),
(4259, 1078, 'Comayagua', 'HN.04', NULL),
(4260, 1078, 'Copán', 'HN.05', NULL),
(4261, 1078, 'Cortés', 'HN.06', NULL),
(4262, 1078, 'El Paraíso', 'HN.07', NULL),
(4263, 1078, 'Francisco Morazán', 'HN.08', NULL),
(4264, 1078, 'Gracias a Dios', 'HN.09', NULL),
(4265, 1078, 'Intibucá', 'HN.10', NULL),
(4266, 1078, 'Islas de la Bahía', 'HN.11', NULL),
(4267, 1078, 'La Paz', 'HN.12', NULL),
(4268, 1078, 'Lempira', 'HN.13', NULL),
(4269, 1078, 'Ocotepeque', 'HN.14', NULL),
(4270, 1078, 'Olancho', 'HN.15', NULL),
(4271, 1078, 'Santa Bárbara', 'HN.16', NULL),
(4272, 1078, 'Valle', 'HN.17', NULL),
(4273, 1078, 'Yoro', 'HN.18', NULL),
(4274, 1078, 'Croatia (general)', 'HR.00', NULL),
(4275, 1078, 'Bjelovarsko-Bilogorska', 'HR.01', NULL),
(4276, 1078, 'Brodsko-Posavska', 'HR.02', NULL),
(4277, 1078, 'Dubrovačko-Neretvanska', 'HR.03', NULL),
(4278, 1078, 'Istarska', 'HR.04', NULL),
(4279, 1078, 'Karlovačka', 'HR.05', NULL),
(4280, 1078, 'Koprivničko-Križevačka', 'HR.06', NULL),
(4281, 1078, 'Krapinsko-Zagorska', 'HR.07', NULL),
(4282, 1078, 'Ličko-Senjska', 'HR.08', NULL),
(4283, 1078, 'Međimurska', 'HR.09', NULL),
(4284, 1078, 'Osječko-Baranjska', 'HR.10', NULL),
(4285, 1078, 'Požeško-Slavonska', 'HR.11', NULL),
(4286, 1078, 'Primorsko-Goranska', 'HR.12', NULL),
(4287, 1078, 'Šibensko-Kniniska', 'HR.13', NULL),
(4288, 1078, 'Sisačko-Moslavačka', 'HR.14', NULL),
(4289, 1078, 'Splitsko-Dalmatinska', 'HR.15', NULL),
(4290, 1078, 'Varaždinska', 'HR.16', NULL),
(4291, 1078, 'Virovitičk-Podravska', 'HR.17', NULL),
(4292, 1078, 'Vukovarsko-Srijemska', 'HR.18', NULL),
(4293, 1078, 'Zadarska', 'HR.19', NULL),
(4294, 1078, 'Zagrebačka', 'HR.20', NULL),
(4295, 1078, 'Grad Zagreb', 'HR.21', NULL),
(4296, 1078, 'Haiti (general)', 'HT.00', NULL),
(4297, 1078, 'Nord-Ouest', 'HT.03', NULL),
(4298, 1078, 'Artibonite', 'HT.06', NULL),
(4299, 1078, 'Centre', 'HT.07', NULL),
(4300, 1078, 'Nord', 'HT.09', NULL),
(4301, 1078, 'Nord-Est', 'HT.10', NULL),
(4302, 1078, 'Ouest', 'HT.11', NULL),
(4303, 1078, 'Sud', 'HT.12', NULL),
(4304, 1078, 'Sud-Est', 'HT.13', NULL),
(4305, 1078, 'GrandʼAnse', 'HT.14', NULL),
(4306, 1078, 'Hungary (general)', 'HU.00', NULL),
(4307, 1078, 'Bács-Kiskun', 'HU.01', NULL),
(4308, 1078, 'Baranya', 'HU.02', NULL),
(4309, 1078, 'Békés', 'HU.03', NULL),
(4310, 1078, 'Borsod-Abaúj-Zemplén', 'HU.04', NULL),
(4311, 1078, 'Budapest', 'HU.05', NULL),
(4312, 1078, 'Csongrád', 'HU.06', NULL),
(4313, 1078, 'Fejér', 'HU.08', NULL),
(4314, 1078, 'Győr-Moson-Sopron', 'HU.09', NULL),
(4315, 1078, 'Hajdú-Bihar', 'HU.10', NULL),
(4316, 1078, 'Heves', 'HU.11', NULL),
(4317, 1078, 'Komárom-Esztergom', 'HU.12', NULL),
(4318, 1078, 'Nógrád', 'HU.14', NULL),
(4319, 1078, 'Pest', 'HU.16', NULL),
(4320, 1078, 'Somogy', 'HU.17', NULL),
(4321, 1078, 'Szabolcs-Szatmár-Bereg', 'HU.18', NULL),
(4322, 1078, 'Jász-Nagykun-Szolnok', 'HU.20', NULL),
(4323, 1078, 'Tolna', 'HU.21', NULL),
(4324, 1078, 'Vas', 'HU.22', NULL),
(4325, 1078, 'Veszprém', 'HU.23', NULL),
(4326, 1078, 'Zala', 'HU.24', NULL),
(4327, 1078, 'Indonesia (general) ', 'ID.00', NULL),
(4328, 1078, 'Aceh', 'ID.01', NULL),
(4329, 1078, 'Bali', 'ID.02', NULL),
(4330, 1078, 'Bengkulu', 'ID.03', NULL),
(4331, 1078, 'Jakarta Raya', 'ID.04', NULL),
(4332, 1078, 'Jambi', 'ID.05', NULL),
(4333, 1078, 'Jawa Barat', 'ID.06', NULL),
(4334, 1078, 'East Java', 'ID.08', NULL),
(4335, 1078, '(ID09) ', 'ID.09', NULL),
(4336, 1078, 'Yogyakarta ', 'ID.10', NULL),
(4337, 1078, 'West Kalimantan', 'ID.11', NULL),
(4338, 1078, 'South Kalimantan', 'ID.12', NULL),
(4339, 1078, 'Kalimantan Tengah', 'ID.13', NULL),
(4340, 1078, 'East Kalimantan', 'ID.14', NULL),
(4341, 1078, 'Lampung', 'ID.15', NULL),
(4342, 1078, 'Nusa Tenggara Barat', 'ID.17', NULL),
(4343, 1078, 'East Nusa Tenggara', 'ID.18', NULL),
(4344, 1078, '(ID19) ', 'ID.19', NULL),
(4345, 1078, '(ID20) ', 'ID.20', NULL),
(4346, 1078, 'Central Sulawesi', 'ID.21', NULL),
(4347, 1078, 'Sulawesi Tenggara', 'ID.22', NULL),
(4348, 1078, 'Sulawesi Utara', 'ID.23', NULL),
(4349, 1078, 'West Sumatra', 'ID.24', NULL),
(4350, 1078, 'Sumatera Selatan', 'ID.25', NULL),
(4351, 1078, 'North Sumatra', 'ID.26', NULL),
(4352, 1078, 'Timor Timur', 'ID.27', NULL),
(4353, 1078, 'Maluku ', 'ID.28', NULL),
(4354, 1078, 'Maluku Utara', 'ID.29', NULL),
(4355, 1078, 'West Java', 'ID.30', NULL),
(4356, 1078, 'North Sulawesi', 'ID.31', NULL),
(4357, 1078, 'South Sumatra', 'ID.32', NULL),
(4358, 1078, 'Banten', 'ID.33', NULL),
(4359, 1078, 'Gorontalo', 'ID.34', NULL),
(4360, 1078, 'Bangka-Belitung', 'ID.35', NULL),
(4361, 1078, 'Papua', 'ID.36', NULL),
(4362, 1078, 'Riau', 'ID.37', NULL),
(4363, 1078, 'South Sulawesi', 'ID.38', NULL),
(4364, 1078, 'Irian Jaya Barat', 'ID.39', NULL),
(4365, 1078, 'Riau Islands', 'ID.40', NULL),
(4366, 1078, 'Sulawesi Barat', 'ID.41', NULL),
(4367, 1078, 'Ireland (general)', 'IE.00', NULL),
(4368, 1078, 'Carlow', 'IE.01', NULL),
(4369, 1078, 'County Cavan', 'IE.02', NULL),
(4370, 1078, 'County Clare', 'IE.03', NULL),
(4371, 1078, 'Cork', 'IE.04', NULL),
(4372, 1078, 'Donegal', 'IE.06', NULL),
(4373, 1078, 'Dublin', 'IE.07', NULL),
(4374, 1078, 'Galway', 'IE.10', NULL),
(4375, 1078, 'County Kerry', 'IE.11', NULL),
(4376, 1078, 'County Kildare', 'IE.12', NULL),
(4377, 1078, 'County Kilkenny', 'IE.13', NULL),
(4378, 1078, 'Leitrim', 'IE.14', NULL),
(4379, 1078, 'Leix', 'IE.15', NULL),
(4380, 1078, 'Limerick', 'IE.16', NULL),
(4381, 1078, 'County Longford', 'IE.18', NULL),
(4382, 1078, 'County Louth', 'IE.19', NULL),
(4383, 1078, 'County Mayo', 'IE.20', NULL),
(4384, 1078, 'County Meath', 'IE.21', NULL),
(4385, 1078, 'Monaghan', 'IE.22', NULL),
(4386, 1078, 'County Offaly', 'IE.23', NULL),
(4387, 1078, 'County Roscommon', 'IE.24', NULL),
(4388, 1078, 'County Sligo', 'IE.25', NULL),
(4389, 1078, 'Tipperary', 'IE.26', NULL),
(4390, 1078, 'County Waterford', 'IE.27', NULL),
(4391, 1078, 'County Westmeath', 'IE.29', NULL),
(4392, 1078, 'County Wexford', 'IE.30', NULL),
(4393, 1078, 'County Wicklow', 'IE.31', NULL),
(4394, 1078, 'Israel (general)', 'IL.00', NULL),
(4395, 1078, 'HaDarom', 'IL.01', NULL),
(4396, 1078, 'HaMerkaz', 'IL.02', NULL),
(4397, 1078, 'Northern District', 'IL.03', NULL),
(4398, 1078, 'H̱efa', 'IL.04', NULL),
(4399, 1078, 'Tel Aviv', 'IL.05', NULL),
(4400, 1078, 'Yerushalayim', 'IL.06', NULL),
(4401, 1078, 'Isle of Man (general)', 'IM.00', NULL),
(4402, 1078, 'India (general)', 'IN.00', NULL),
(4403, 1078, 'Andaman and Nicobar Islands', 'IN.01', NULL),
(4404, 1078, 'Andhra Pradesh', 'IN.02', NULL),
(4405, 1078, 'Assam', 'IN.03', NULL),
(4406, 1078, 'Bihar', 'IN.04', NULL),
(4407, 1078, 'Chandīgarh', 'IN.05', NULL),
(4408, 1078, 'Dādra and Nagar Haveli', 'IN.06', NULL),
(4409, 1078, 'Delhi', 'IN.07', NULL),
(4410, 1078, 'Gujarāt', 'IN.09', NULL),
(4411, 1078, 'Haryāna', 'IN.10', NULL),
(4412, 1078, 'Himāchal Pradesh', 'IN.11', NULL),
(4413, 1078, 'Kashmir', 'IN.12', NULL),
(4414, 1078, 'Kerala', 'IN.13', NULL),
(4415, 1078, 'Laccadives', 'IN.14', NULL),
(4416, 1078, 'Madhya Pradesh ', 'IN.15', NULL),
(4417, 1078, 'Mahārāshtra', 'IN.16', NULL),
(4418, 1078, 'Manipur', 'IN.17', NULL),
(4419, 1078, 'Meghālaya', 'IN.18', NULL),
(4420, 1078, 'Karnātaka', 'IN.19', NULL),
(4421, 1078, 'Nāgāland', 'IN.20', NULL),
(4422, 1078, 'Orissa', 'IN.21', NULL),
(4423, 1078, 'Pondicherry', 'IN.22', NULL),
(4424, 1078, 'Punjab', 'IN.23', NULL),
(4425, 1078, 'Rājasthān', 'IN.24', NULL),
(4426, 1078, 'Tamil Nādu', 'IN.25', NULL),
(4427, 1078, 'Tripura', 'IN.26', NULL),
(4428, 1078, 'Uttar Pradesh', 'IN.27', NULL),
(4429, 1078, 'Bengal', 'IN.28', NULL),
(4430, 1078, 'Sikkim', 'IN.29', NULL),
(4431, 1078, 'Arunāchal Pradesh', 'IN.30', NULL),
(4432, 1078, 'Mizoram', 'IN.31', NULL),
(4433, 1078, 'Daman and Diu', 'IN.32', NULL),
(4434, 1078, 'Goa', 'IN.33', NULL),
(4435, 1078, 'Bihār', 'IN.34', NULL),
(4436, 1078, 'Madhya Pradesh', 'IN.35', NULL),
(4437, 1078, 'Uttar Pradesh', 'IN.36', NULL),
(4438, 1078, 'Chhattisgarh', 'IN.37', NULL),
(4439, 1078, 'Jharkhand', 'IN.38', NULL),
(4440, 1078, 'Uttarakhand', 'IN.39', NULL),
(4441, 1078, 'British Indian Ocean Territory (general)', 'IO.00', NULL),
(4442, 1078, 'Iraq (general)', 'IQ.00', NULL),
(4443, 1078, 'Al Anbār', 'IQ.01', NULL),
(4444, 1078, 'Al Başrah', 'IQ.02', NULL),
(4445, 1078, 'Al Muthanná', 'IQ.03', NULL),
(4446, 1078, 'Al Qādisīyah', 'IQ.04', NULL),
(4447, 1078, 'As Sulaymānīyah', 'IQ.05', NULL),
(4448, 1078, 'Bābil', 'IQ.06', NULL),
(4449, 1078, 'Baghdād', 'IQ.07', NULL),
(4450, 1078, 'Dahūk', 'IQ.08', NULL),
(4451, 1078, 'Dhi Qar', 'IQ.09', NULL),
(4452, 1078, 'Diyala', 'IQ.10', NULL),
(4453, 1078, 'Arbīl', 'IQ.11', NULL),
(4454, 1078, 'Karbalāʼ', 'IQ.12', NULL),
(4455, 1078, 'At Taʼmīm', 'IQ.13', NULL),
(4456, 1078, 'Maysan', 'IQ.14', NULL),
(4457, 1078, 'Nīnawá', 'IQ.15', NULL),
(4458, 1078, 'Wāsiţ', 'IQ.16', NULL),
(4459, 1078, 'An Najaf', 'IQ.17', NULL),
(4460, 1078, 'Şalāḩ ad Dīn', 'IQ.18', NULL),
(4461, 1078, 'Iran (general)', 'IR.00', NULL),
(4462, 1078, 'Āz̄ārbāyjān-e Gharbī', 'IR.01', NULL),
(4463, 1078, 'Ostān-e Āz̄arbāyjān-e Sharqī', 'IR.02', NULL),
(4464, 1078, 'Chahār Maḩāll va Bakhtīārī', 'IR.03', NULL),
(4465, 1078, 'Sīstān va Balūchestān', 'IR.04', NULL),
(4466, 1078, 'Kohgīlūyeh va Būyer Aḩmad', 'IR.05', NULL),
(4467, 1078, 'Fārs Province', 'IR.07', NULL),
(4468, 1078, 'Gīlān', 'IR.08', NULL),
(4469, 1078, 'Hamadān', 'IR.09', NULL),
(4470, 1078, 'Īlām', 'IR.10', NULL),
(4471, 1078, 'Hormozgān Province', 'IR.11', NULL),
(4472, 1078, 'Kerman', 'IR.12', NULL),
(4473, 1078, 'Kermānshāh', 'IR.13', NULL),
(4474, 1078, 'Khūzestān', 'IR.15', NULL),
(4475, 1078, 'Kordestān', 'IR.16', NULL),
(4476, 1078, 'Mazandaran', 'IR.17', NULL),
(4477, 1078, 'Markazi', 'IR.19', NULL),
(4478, 1078, 'Zanjan', 'IR.21', NULL),
(4479, 1078, 'Bushehr Province', 'IR.22', NULL),
(4480, 1078, 'Lorestān', 'IR.23', NULL),
(4481, 1078, 'Markazi', 'IR.24', NULL),
(4482, 1078, 'Semnān Province', 'IR.25', NULL),
(4483, 1078, 'Tehrān', 'IR.26', NULL),
(4484, 1078, 'Zanjan', 'IR.27', NULL),
(4485, 1078, 'Eşfahān', 'IR.28', NULL),
(4486, 1078, 'Kermān', 'IR.29', NULL),
(4487, 1078, 'Ostan-e Khorasan-e Razavi', 'IR.30', NULL),
(4488, 1078, 'Yazd', 'IR.31', NULL),
(4489, 1078, 'Ardabīl', 'IR.32', NULL),
(4490, 1078, 'Āz̄ārbāyjān-e Sharqī', 'IR.33', NULL),
(4491, 1078, 'Markazi Province', 'IR.34', NULL),
(4492, 1078, 'Māzandarān Province', 'IR.35', NULL),
(4493, 1078, 'Zanjan Province', 'IR.36', NULL),
(4494, 1078, 'Golestān', 'IR.37', NULL),
(4495, 1078, 'Qazvīn', 'IR.38', NULL),
(4496, 1078, 'Qom', 'IR.39', NULL),
(4497, 1078, 'Yazd', 'IR.40', NULL),
(4498, 1078, 'Khorāsān-e Jonūbī', 'IR.41', NULL),
(4499, 1078, 'Razavi Khorasan Province', 'IR.42', NULL),
(4500, 1078, 'Khorāsān-e Shomālī', 'IR.43', NULL),
(4501, 1078, 'Iceland (general)', 'IS.00', NULL),
(4502, 1078, 'Borgarfjardarsysla', 'IS.07', NULL),
(4503, 1078, 'Dalasysla', 'IS.08', NULL),
(4504, 1078, 'Eyjafjardarsysla', 'IS.09', NULL),
(4505, 1078, 'Gullbringusysla', 'IS.10', NULL),
(4506, 1078, 'Hafnarfjördur', 'IS.11', NULL),
(4507, 1078, 'Husavik', 'IS.12', NULL),
(4508, 1078, 'Isafjördur', 'IS.13', NULL),
(4509, 1078, 'Keflavik', 'IS.14', NULL),
(4510, 1078, 'Kjosarsysla', 'IS.15', NULL),
(4511, 1078, 'Kopavogur', 'IS.16', NULL),
(4512, 1078, 'Myrasysla', 'IS.17', NULL),
(4513, 1078, 'Neskaupstadur', 'IS.18', NULL),
(4514, 1078, 'Nordur-Isafjardarsysla', 'IS.19', NULL),
(4515, 1078, 'Nordur-Mulasysla', 'IS.20', NULL),
(4516, 1078, 'Nordur-Tingeyjarsysla', 'IS.21', NULL),
(4517, 1078, 'Olafsfjördur', 'IS.22', NULL),
(4518, 1078, 'Rangarvallasysla', 'IS.23', NULL),
(4519, 1078, 'Reykjavík', 'IS.24', NULL),
(4520, 1078, 'Saudarkrokur', 'IS.25', NULL),
(4521, 1078, 'Seydisfjordur', 'IS.26', NULL),
(4522, 1078, 'Siglufjordur', 'IS.27', NULL),
(4523, 1078, 'Skagafjardarsysla', 'IS.28', NULL),
(4524, 1078, 'Snafellsnes- og Hnappadalssysla', 'IS.29', NULL),
(4525, 1078, 'Strandasysla', 'IS.30', NULL),
(4526, 1078, 'Sudur-Mulasysla', 'IS.31', NULL),
(4527, 1078, 'Sudur-Tingeyjarsysla', 'IS.32', NULL),
(4528, 1078, 'Vestmannaeyjar', 'IS.33', NULL),
(4529, 1078, 'Vestur-Bardastrandarsysla', 'IS.34', NULL),
(4530, 1078, 'Vestur-Hunavatnssysla', 'IS.35', NULL),
(4531, 1078, 'Vestur-Isafjardarsysla', 'IS.36', NULL),
(4532, 1078, 'Vestur-Skaftafellssysla', 'IS.37', NULL),
(4533, 1078, 'East', 'IS.38', NULL),
(4534, 1078, 'Capital Region', 'IS.39', NULL),
(4535, 1078, 'Northeast', 'IS.40', NULL),
(4536, 1078, 'Northwest', 'IS.41', NULL),
(4537, 1078, 'South', 'IS.42', NULL),
(4538, 1078, 'Southern Peninsula', 'IS.43', NULL),
(4539, 1078, 'Westfjords', 'IS.44', NULL),
(4540, 1078, 'West', 'IS.45', NULL),
(4541, 1078, 'Italy (general)', 'IT.00', NULL),
(4542, 1078, 'Abruzzo', 'IT.01', NULL),
(4543, 1078, 'Basilicate', 'IT.02', NULL),
(4544, 1078, 'Calabria', 'IT.03', NULL),
(4545, 1078, 'Campania', 'IT.04', NULL),
(4546, 1078, 'Emilia-Romagna', 'IT.05', NULL),
(4547, 1078, 'Friuli', 'IT.06', NULL),
(4548, 1078, 'Latium', 'IT.07', NULL),
(4549, 1078, 'Liguria', 'IT.08', NULL),
(4550, 1078, 'Lombardy', 'IT.09', NULL),
(4551, 1078, 'The Marches', 'IT.10', NULL),
(4552, 1078, 'Molise', 'IT.11', NULL),
(4553, 1078, 'Piedmont', 'IT.12', NULL),
(4554, 1078, 'Apulia', 'IT.13', NULL),
(4555, 1078, 'Sardinia', 'IT.14', NULL),
(4556, 1078, 'Sicily', 'IT.15', NULL),
(4557, 1078, 'Tuscany', 'IT.16', NULL),
(4558, 1078, 'Trentino-Alto Adige', 'IT.17', NULL),
(4559, 1078, 'Umbria', 'IT.18', NULL),
(4560, 1078, 'Aosta Valley', 'IT.19', NULL),
(4561, 1078, 'Veneto', 'IT.20', NULL),
(4562, 1078, 'Jamaica (general)', 'JM.00', NULL),
(4563, 1078, 'Clarendon', 'JM.01', NULL),
(4564, 1078, 'Hanover Parish', 'JM.02', NULL),
(4565, 1078, 'Manchester', 'JM.04', NULL),
(4566, 1078, 'Portland', 'JM.07', NULL),
(4567, 1078, 'Saint Andrew', 'JM.08', NULL),
(4568, 1078, 'Saint Ann', 'JM.09', NULL),
(4569, 1078, 'Saint Catherine', 'JM.10', NULL),
(4570, 1078, 'Saint Elizabeth', 'JM.11', NULL),
(4571, 1078, 'Saint James', 'JM.12', NULL),
(4572, 1078, 'Saint Mary', 'JM.13', NULL),
(4573, 1078, 'Saint Thomas', 'JM.14', NULL),
(4574, 1078, 'Trelawny', 'JM.15', NULL),
(4575, 1078, 'Westmoreland', 'JM.16', NULL),
(4576, 1078, 'Kingston', 'JM.17', NULL),
(4577, 1078, 'Jordan (general)', 'JO.00', NULL),
(4578, 1078, 'Balqa', 'JO.02', NULL),
(4579, 1078, 'Ma’an', 'JO.07', NULL),
(4580, 1078, 'Karak', 'JO.09', NULL),
(4581, 1078, 'Al Mafraq', 'JO.10', NULL),
(4582, 1078, 'Amman', 'JO.11', NULL),
(4583, 1078, 'Tafielah', 'JO.12', NULL),
(4584, 1078, 'Az Zarqa', 'JO.13', NULL),
(4585, 1078, 'Irbid', 'JO.14', NULL),
(4586, 1078, 'Mafraq', 'JO.15', NULL),
(4587, 1078, '‘Ammān', 'JO.16', NULL),
(4588, 1078, 'Zarqa', 'JO.17', NULL),
(4589, 1078, 'Irbid', 'JO.18', NULL),
(4590, 1078, 'Ma''an', 'JO.19', NULL),
(4591, 1078, 'Ajlun', 'JO.20', NULL),
(4592, 1078, 'Aqaba', 'JO.21', NULL),
(4593, 1078, 'Jerash', 'JO.22', NULL),
(4594, 1078, 'Madaba', 'JO.23', NULL),
(4595, 1078, 'Japan (general)', 'JP.00', NULL),
(4596, 1078, 'Aichi', 'JP.01', NULL),
(4597, 1078, 'Akita', 'JP.02', NULL),
(4598, 1078, 'Aomori', 'JP.03', NULL),
(4599, 1078, 'Chiba', 'JP.04', NULL),
(4600, 1078, 'Ehime', 'JP.05', NULL),
(4601, 1078, 'Fukui', 'JP.06', NULL),
(4602, 1078, 'Fukuoka', 'JP.07', NULL),
(4603, 1078, 'Fukushima', 'JP.08', NULL),
(4604, 1078, 'Gifu', 'JP.09', NULL),
(4605, 1078, 'Gumma', 'JP.10', NULL),
(4606, 1078, 'Hiroshima', 'JP.11', NULL),
(4607, 1078, 'Hokkaidō', 'JP.12', NULL),
(4608, 1078, 'Hyōgo', 'JP.13', NULL),
(4609, 1078, 'Ibaraki', 'JP.14', NULL),
(4610, 1078, 'Ishikawa', 'JP.15', NULL),
(4611, 1078, 'Iwate', 'JP.16', NULL),
(4612, 1078, 'Kagawa', 'JP.17', NULL),
(4613, 1078, 'Kagoshima', 'JP.18', NULL),
(4614, 1078, 'Kanagawa', 'JP.19', NULL),
(4615, 1078, 'Kōchi', 'JP.20', NULL),
(4616, 1078, 'Kumamoto', 'JP.21', NULL),
(4617, 1078, 'Kyōto', 'JP.22', NULL),
(4618, 1078, 'Mie', 'JP.23', NULL),
(4619, 1078, 'Miyagi', 'JP.24', NULL),
(4620, 1078, 'Miyazaki', 'JP.25', NULL),
(4621, 1078, 'Nagano', 'JP.26', NULL),
(4622, 1078, 'Nagasaki', 'JP.27', NULL),
(4623, 1078, 'Nara', 'JP.28', NULL),
(4624, 1078, 'Niigata', 'JP.29', NULL),
(4625, 1078, 'Ōita', 'JP.30', NULL),
(4626, 1078, 'Okayama', 'JP.31', NULL),
(4627, 1078, 'Ōsaka', 'JP.32', NULL),
(4628, 1078, 'Saga', 'JP.33', NULL),
(4629, 1078, 'Saitama', 'JP.34', NULL),
(4630, 1078, 'Shiga', 'JP.35', NULL),
(4631, 1078, 'Shimane', 'JP.36', NULL),
(4632, 1078, 'Shizuoka', 'JP.37', NULL),
(4633, 1078, 'Tochigi', 'JP.38', NULL),
(4634, 1078, 'Tokushima', 'JP.39', NULL),
(4635, 1078, 'Tōkyō', 'JP.40', NULL),
(4636, 1078, 'Tottori', 'JP.41', NULL),
(4637, 1078, 'Toyama', 'JP.42', NULL),
(4638, 1078, 'Wakayama', 'JP.43', NULL),
(4639, 1078, 'Yamagata', 'JP.44', NULL),
(4640, 1078, 'Yamaguchi', 'JP.45', NULL),
(4641, 1078, 'Yamanashi', 'JP.46', NULL),
(4642, 1078, 'Okinawa', 'JP.47', NULL),
(4643, 1078, 'Kenya (general)', 'KE.00', NULL),
(4644, 1078, 'Central', 'KE.01', NULL),
(4645, 1078, 'Coast', 'KE.02', NULL),
(4646, 1078, 'Eastern', 'KE.03', NULL),
(4647, 1078, 'Nairobi Area', 'KE.05', NULL),
(4648, 1078, 'North-Eastern', 'KE.06', NULL),
(4649, 1078, 'Nyanza', 'KE.07', NULL),
(4650, 1078, 'Rift Valley', 'KE.08', NULL),
(4651, 1078, 'Western', 'KE.09', NULL),
(4652, 1078, 'Kyrgyzstan (general)', 'KG.00', NULL),
(4653, 1078, 'Bishkek', 'KG.01', NULL),
(4654, 1078, 'Chüy', 'KG.02', NULL),
(4655, 1078, 'Jalal-Abad', 'KG.03', NULL),
(4656, 1078, 'Naryn', 'KG.04', NULL),
(4657, 1078, '(KG05)', 'KG.05', NULL),
(4658, 1078, 'Talas', 'KG.06', NULL),
(4659, 1078, 'Ysyk-Köl', 'KG.07', NULL),
(4660, 1078, 'Osh', 'KG.08', NULL),
(4661, 1078, 'Batken', 'KG.09', NULL),
(4662, 1078, 'Khétt Bântéay Méan Cheăy', 'KH.00', NULL),
(4663, 1078, 'Khétt Bătdâmbâng', 'KH.01', NULL),
(4664, 1078, 'Kâmpóng Cham', 'KH.02', NULL),
(4665, 1078, 'Kâmpóng Chhnăng', 'KH.03', NULL),
(4666, 1078, 'Khétt Kâmpóng Spœ', 'KH.04', NULL),
(4667, 1078, 'Kâmpóng Thum', 'KH.05', NULL),
(4668, 1078, 'Khétt Kâmpôt', 'KH.06', NULL),
(4669, 1078, 'Kândal', 'KH.07', NULL),
(4670, 1078, 'Kaôh Kŏng', 'KH.08', NULL),
(4671, 1078, 'Krâchéh', 'KH.09', NULL),
(4672, 1078, 'Môndól Kiri', 'KH.10', NULL),
(4673, 1078, 'Phnum Penh', 'KH.11', NULL),
(4674, 1078, 'Poŭthĭsăt', 'KH.12', NULL),
(4675, 1078, 'Preăh Vihéar', 'KH.13', NULL),
(4676, 1078, 'Prey Vêng', 'KH.14', NULL),
(4677, 1078, 'Khétt Rôtânăh Kiri', 'KH.15', NULL),
(4678, 1078, 'Stœ̆ng Trêng', 'KH.17', NULL),
(4679, 1078, 'Svay Riĕng', 'KH.18', NULL),
(4680, 1078, 'Takêv', 'KH.19', NULL),
(4681, 1078, '(CB20)', 'KH.20', NULL),
(4682, 1078, 'Kâmpôt', 'KH.21', NULL),
(4683, 1078, 'Phnum Pénh', 'KH.22', NULL),
(4684, 1078, 'Rôtânăh Kiri', 'KH.23', NULL),
(4685, 1078, 'Siĕm Réab', 'KH.24', NULL),
(4686, 1078, 'Bantéay Méan Cheăy', 'KH.25', NULL),
(4687, 1078, 'Kêb', 'KH.26', NULL),
(4688, 1078, 'Ŏtdâr Méan Cheăy', 'KH.27', NULL),
(4689, 1078, 'Preăh Seihânŭ', 'KH.28', NULL),
(4690, 1078, 'Bătdâmbâng', 'KH.29', NULL),
(4691, 1078, 'Palĭn', 'KH.30', NULL),
(4692, 1078, 'Line Islands', 'KI.00', NULL),
(4693, 1078, 'Gilbert Islands', 'KI.01', NULL),
(4694, 1078, 'Line Islands', 'KI.02', NULL),
(4695, 1078, 'Phoenix Islands', 'KI.03', NULL),
(4696, 1078, 'Comoros (general)', 'KM.00', NULL),
(4697, 1078, 'Anjouan', 'KM.01', NULL),
(4698, 1078, 'Grande Comore', 'KM.02', NULL),
(4699, 1078, 'Mohéli', 'KM.03', NULL),
(4700, 1078, 'Saint Kitts and Nevis (general)', 'KN.00', NULL),
(4701, 1078, 'Christ Church Nichola Town', 'KN.01', NULL),
(4702, 1078, 'Saint Anne Sandy Point', 'KN.02', NULL),
(4703, 1078, 'Saint George Basseterre', 'KN.03', NULL),
(4704, 1078, 'Saint George Gingerland', 'KN.04', NULL),
(4705, 1078, 'Saint James Windwa', 'KN.05', NULL),
(4706, 1078, 'Saint John Capesterre', 'KN.06', NULL),
(4707, 1078, 'Saint John Figtree', 'KN.07', NULL),
(4708, 1078, 'Saint Mary Cayon', 'KN.08', NULL),
(4709, 1078, 'Saint Paul Capesterre', 'KN.09', NULL),
(4710, 1078, 'Saint Paul Charlestown', 'KN.10', NULL),
(4711, 1078, 'Saint Peter Basseterre', 'KN.11', NULL),
(4712, 1078, 'Saint Thomas Lowland', 'KN.12', NULL),
(4713, 1078, 'Saint Thomas Middle Island', 'KN.13', NULL),
(4714, 1078, 'Trinity Palmetto Point', 'KN.15', NULL),
(4715, 1078, 'North Korea (general)', 'KP.00', NULL),
(4716, 1078, 'Chagang-do', 'KP.01', NULL),
(4717, 1078, 'Hamgyŏng-namdo', 'KP.03', NULL),
(4718, 1078, 'Hwanghae-namdo', 'KP.06', NULL),
(4719, 1078, 'Hwanghae-bukto', 'KP.07', NULL),
(4720, 1078, 'Kaesŏng-si', 'KP.08', NULL),
(4721, 1078, 'Gangwon', 'KP.09', NULL),
(4722, 1078, 'P''yŏngan-bukto', 'KP.11', NULL),
(4723, 1078, 'P''yŏngyang-si', 'KP.12', NULL),
(4724, 1078, 'Yanggang-do', 'KP.13', NULL),
(4725, 1078, 'Namp''o-si', 'KP.14', NULL),
(4726, 1078, 'P''yŏngan-namdo', 'KP.15', NULL),
(4727, 1078, '(KN16)', 'KP.16', NULL),
(4728, 1078, 'Hamgyŏng-bukto', 'KP.17', NULL),
(4729, 1078, 'Najin Sŏnbong-si', 'KP.18', NULL),
(4730, 1078, 'South Korea (general)', 'KR.00', NULL),
(4731, 1078, 'Jeju', 'KR.01', NULL),
(4732, 1078, 'North Jeolla', 'KR.03', NULL),
(4733, 1078, 'North Chungcheong', 'KR.05', NULL),
(4734, 1078, 'Gangwon', 'KR.06', NULL),
(4735, 1078, 'Busan', 'KR.10', NULL),
(4736, 1078, 'Seoul', 'KR.11', NULL),
(4737, 1078, 'Incheon', 'KR.12', NULL),
(4738, 1078, 'Gyeonggi', 'KR.13', NULL),
(4739, 1078, 'North Gyeongsang', 'KR.14', NULL),
(4740, 1078, 'Daegu', 'KR.15', NULL),
(4741, 1078, 'South Jeolla', 'KR.16', NULL),
(4742, 1078, 'South Chungcheong', 'KR.17', NULL),
(4743, 1078, 'Gwangju', 'KR.18', NULL),
(4744, 1078, 'Daejeon', 'KR.19', NULL),
(4745, 1078, 'South Gyeongsang', 'KR.20', NULL),
(4746, 1078, 'Ulsan', 'KR.21', NULL),
(4747, 1078, 'Muḩāfaz̧atalWafrah', 'KW.00', NULL),
(4748, 1078, 'Al ‘Āşimah', 'KW.02', NULL),
(4749, 1078, 'Ḩawallī', 'KW.03', NULL),
(4750, 1078, 'Al Aḩmadī', 'KW.04', NULL),
(4751, 1078, 'Al Jahrāʼ', 'KW.05', NULL),
(4752, 1078, 'Al Farwaniyah', 'KW.06', NULL),
(4753, 1078, 'Cayman Islands (general)', 'KY.00', NULL),
(4754, 1078, 'Creek', 'KY.01', NULL),
(4755, 1078, 'Eastern', 'KY.02', NULL),
(4756, 1078, 'Midland', 'KY.03', NULL),
(4757, 1078, 'South Town', 'KY.04', NULL),
(4758, 1078, 'Spot Bay', 'KY.05', NULL),
(4759, 1078, 'Stake Bay', 'KY.06', NULL),
(4760, 1078, 'West End', 'KY.07', NULL),
(4761, 1078, 'Western', 'KY.08', NULL),
(4762, 1078, 'Zhezqazghan Oblysy', 'KZ.00', NULL),
(4763, 1078, 'Almaty', 'KZ.01', NULL),
(4764, 1078, 'Almaty Qalasy', 'KZ.02', NULL),
(4765, 1078, 'Aqmola', 'KZ.03', NULL),
(4766, 1078, 'Aqtöbe', 'KZ.04', NULL),
(4767, 1078, 'Astana Qalasy', 'KZ.05', NULL),
(4768, 1078, 'Atyraū', 'KZ.06', NULL),
(4769, 1078, 'Batys Qazaqstan', 'KZ.07', NULL),
(4770, 1078, 'Mangghystaū', 'KZ.09', NULL),
(4771, 1078, 'Ongtüstik Qazaqstan', 'KZ.10', NULL),
(4772, 1078, 'Pavlodar', 'KZ.11', NULL),
(4773, 1078, 'Qaraghandy', 'KZ.12', NULL),
(4774, 1078, 'Qostanay', 'KZ.13', NULL),
(4775, 1078, 'Qyzylorda', 'KZ.14', NULL),
(4776, 1078, 'East Kazakhstan', 'KZ.15', NULL),
(4777, 1078, 'Soltüstik Qazaqstan', 'KZ.16', NULL),
(4778, 1078, 'Zhambyl', 'KZ.17', NULL),
(4779, 1078, 'Laos (general)', 'LA.00', NULL),
(4780, 1078, 'Attapu', 'LA.01', NULL),
(4781, 1078, 'Champasak', 'LA.02', NULL),
(4782, 1078, 'Houaphan', 'LA.03', NULL),
(4783, 1078, 'Khammouan', 'LA.04', NULL),
(4784, 1078, 'Louang Namtha', 'LA.05', NULL),
(4785, 1078, 'Louangphrabang', 'LA.06', NULL),
(4786, 1078, 'Oudômxai', 'LA.07', NULL),
(4787, 1078, 'Phongsali', 'LA.08', NULL),
(4788, 1078, 'Saravan', 'LA.09', NULL),
(4789, 1078, 'Savannakhet', 'LA.10', NULL),
(4790, 1078, 'Vientiane', 'LA.11', NULL),
(4791, 1078, 'Xiagnabouli', 'LA.13', NULL),
(4792, 1078, 'Xiangkhoang', 'LA.14', NULL),
(4793, 1078, 'Khammouan', 'LA.15', NULL),
(4794, 1078, 'Loungnamtha', 'LA.16', NULL),
(4795, 1078, 'Louangphabang', 'LA.17', NULL),
(4796, 1078, 'Phôngsali', 'LA.18', NULL),
(4797, 1078, 'Salavan', 'LA.19', NULL),
(4798, 1078, 'Savannahkhét', 'LA.20', NULL),
(4799, 1078, 'Bokèo', 'LA.22', NULL),
(4800, 1078, 'Bolikhamxai', 'LA.23', NULL),
(4801, 1078, 'Viangchan', 'LA.24', NULL),
(4802, 1078, 'Xaisômboun', 'LA.25', NULL),
(4803, 1078, 'Xékong', 'LA.26', NULL),
(4804, 1078, 'Viangchan', 'LA.27', NULL),
(4805, 1078, 'Lebanon (general)', 'LB.00', NULL),
(4806, 1078, 'Béqaa', 'LB.01', NULL),
(4807, 1078, '(LE02)', 'LB.02', NULL),
(4808, 1078, 'Liban-Nord', 'LB.03', NULL),
(4809, 1078, 'Beyrouth', 'LB.04', NULL),
(4810, 1078, 'Mont-Liban', 'LB.05', NULL),
(4811, 1078, 'Liban-Sud', 'LB.06', NULL),
(4812, 1078, 'Nabatîyé', 'LB.07', NULL),
(4813, 1078, 'Béqaa', 'LB.08', NULL),
(4814, 1078, 'Liban-Nord', 'LB.09', NULL),
(4815, 1078, 'Aakkâr', 'LB.10', NULL),
(4816, 1078, 'Baalbek-Hermel', 'LB.11', NULL),
(4817, 1078, 'Saint Lucia (general)', 'LC.00', NULL),
(4818, 1078, 'Anse-la-Raye', 'LC.01', NULL),
(4819, 1078, 'Dauphin', 'LC.02', NULL),
(4820, 1078, 'Castries', 'LC.03', NULL),
(4821, 1078, 'Choiseul', 'LC.04', NULL),
(4822, 1078, 'Dennery', 'LC.05', NULL),
(4823, 1078, 'Gros-Islet', 'LC.06', NULL),
(4824, 1078, 'Laborie', 'LC.07', NULL),
(4825, 1078, 'Micoud', 'LC.08', NULL),
(4826, 1078, 'Soufrière', 'LC.09', NULL),
(4827, 1078, 'Vieux-Fort', 'LC.10', NULL),
(4828, 1078, 'Praslin', 'LC.11', NULL),
(4829, 1078, 'Liechtenstein (general)', 'LI.00', NULL),
(4830, 1078, 'Balzers', 'LI.01', NULL),
(4831, 1078, 'Eschen', 'LI.02', NULL),
(4832, 1078, 'Gamprin', 'LI.03', NULL),
(4833, 1078, 'Mauren', 'LI.04', NULL),
(4834, 1078, 'Planken', 'LI.05', NULL),
(4835, 1078, 'Ruggell', 'LI.06', NULL),
(4836, 1078, 'Schaan', 'LI.07', NULL),
(4837, 1078, 'Schellenberg', 'LI.08', NULL),
(4838, 1078, 'Triesen', 'LI.09', NULL),
(4839, 1078, 'Triesenberg', 'LI.10', NULL),
(4840, 1078, 'Vaduz', 'LI.11', NULL),
(4841, 1078, 'Sri Lanka (general)', 'LK.00', NULL),
(4842, 1078, 'Central', 'LK.29', NULL),
(4843, 1078, 'North Central', 'LK.30', NULL),
(4844, 1078, 'North Eastern', 'LK.31', NULL),
(4845, 1078, 'North Western', 'LK.32', NULL),
(4846, 1078, 'Sabaragamuwa', 'LK.33', NULL),
(4847, 1078, 'Southern', 'LK.34', NULL),
(4848, 1078, 'Uva', 'LK.35', NULL),
(4849, 1078, 'Western', 'LK.36', NULL),
(4850, 1078, 'Liberia (general)', 'LR.00', NULL),
(4851, 1078, 'Bong', 'LR.01', NULL),
(4852, 1078, 'Grand Jide', 'LR.02', NULL),
(4853, 1078, 'Grand Cape Mount', 'LR.04', NULL),
(4854, 1078, 'Lofa', 'LR.05', NULL),
(4855, 1078, '(LI08)', 'LR.08', NULL),
(4856, 1078, 'Nimba', 'LR.09', NULL),
(4857, 1078, 'Sinoe', 'LR.10', NULL),
(4858, 1078, 'Grand Bassa County', 'LR.11', NULL),
(4859, 1078, 'Grand Cape Mount', 'LR.12', NULL),
(4860, 1078, 'Maryland', 'LR.13', NULL),
(4861, 1078, 'Montserrado', 'LR.14', NULL),
(4862, 1078, 'Bomi', 'LR.15', NULL),
(4863, 1078, 'Grand Kru', 'LR.16', NULL),
(4864, 1078, 'Margibi', 'LR.17', NULL),
(4865, 1078, 'River Cess', 'LR.18', NULL),
(4866, 1078, 'Grand Gedeh', 'LR.19', NULL),
(4867, 1078, 'Lofa', 'LR.20', NULL),
(4868, 1078, 'Gbarpolu', 'LR.21', NULL),
(4869, 1078, 'River Gee', 'LR.22', NULL),
(4870, 1078, 'Lesotho (general)', 'LS.00', NULL),
(4871, 1078, 'Balzers Commune', 'LS.01', NULL),
(4872, 1078, 'Eschen Commune', 'LS.02', NULL),
(4873, 1078, 'Gamprin Commune', 'LS.03', NULL),
(4874, 1078, 'Mauren Commune', 'LS.04', NULL),
(4875, 1078, 'Planken Commune', 'LS.05', NULL),
(4876, 1078, 'Ruggell Commune', 'LS.06', NULL),
(4877, 1078, 'Berea District', 'LS.10', NULL),
(4878, 1078, 'Butha-Buthe District', 'LS.11', NULL),
(4879, 1078, 'Leribe District', 'LS.12', NULL),
(4880, 1078, 'Mafeteng', 'LS.13', NULL),
(4881, 1078, 'Maseru', 'LS.14', NULL),
(4882, 1078, 'Mohaleʼs Hoek', 'LS.15', NULL),
(4883, 1078, 'Mokhotlong', 'LS.16', NULL),
(4884, 1078, 'Qachaʼs Nek', 'LS.17', NULL),
(4885, 1078, 'Quthing District', 'LS.18', NULL),
(4886, 1078, 'Thaba-Tseka District', 'LS.19', NULL),
(4887, 1078, 'Lithuania (general)', 'LT.00', NULL),
(4888, 1078, '(LH40)', 'LT.40', NULL),
(4889, 1078, 'Alytaus Apskritis', 'LT.56', NULL),
(4890, 1078, 'Kauno Apskritis', 'LT.57', NULL),
(4891, 1078, 'Klaipėdos Apskritis', 'LT.58', NULL),
(4892, 1078, 'Marijampolės Apskritis', 'LT.59', NULL),
(4893, 1078, 'Panevėžio Apskritis', 'LT.60', NULL),
(4894, 1078, 'Šiaulių Apskritis', 'LT.61', NULL),
(4895, 1078, 'Tauragės Apskritis', 'LT.62', NULL),
(4896, 1078, 'Telšių Apskritis', 'LT.63', NULL),
(4897, 1078, 'Utenos Apskritis', 'LT.64', NULL),
(4898, 1078, 'Vilniaus Apskritis', 'LT.65', NULL),
(4899, 1078, 'Luxembourg (general)', 'LU.00', NULL),
(4900, 1078, 'Diekirch', 'LU.01', NULL),
(4901, 1078, 'Grevenmacher', 'LU.02', NULL),
(4902, 1078, 'Luxembourg', 'LU.03', NULL),
(4903, 1078, 'Dobeles Rajons', 'LV.00', NULL),
(4904, 1078, 'Aizkraukles Rajons', 'LV.01', NULL),
(4905, 1078, 'Alūksnes Rajons', 'LV.02', NULL),
(4906, 1078, 'Balvu Rajons', 'LV.03', NULL),
(4907, 1078, 'Bauskas Rajons', 'LV.04', NULL),
(4908, 1078, 'Cēsu Rajons', 'LV.05', NULL),
(4909, 1078, 'Daugavpils', 'LV.06', NULL),
(4910, 1078, 'Daugavpils Rajons', 'LV.07', NULL),
(4911, 1078, 'Dobeles Rajons', 'LV.08', NULL),
(4912, 1078, 'Gulbenes Rajons', 'LV.09', NULL),
(4913, 1078, 'Jēkabpils Rajons', 'LV.10', NULL),
(4914, 1078, 'Jelgava', 'LV.11', NULL),
(4915, 1078, 'Jelgavas Rajons', 'LV.12', NULL),
(4916, 1078, 'Jūrmala', 'LV.13', NULL),
(4917, 1078, 'Krāslavas Rajons', 'LV.14', NULL),
(4918, 1078, 'Kuldīgas Rajons', 'LV.15', NULL),
(4919, 1078, 'Liepāja', 'LV.16', NULL),
(4920, 1078, 'Liepājas Rajons', 'LV.17', NULL),
(4921, 1078, 'Limbažu Rajons', 'LV.18', NULL),
(4922, 1078, 'Ludzas Rajons', 'LV.19', NULL),
(4923, 1078, 'Madonas Rajons', 'LV.20', NULL),
(4924, 1078, 'Ogres Rajons', 'LV.21', NULL),
(4925, 1078, 'Preiļu Rajons', 'LV.22', NULL),
(4926, 1078, 'Rēzekne', 'LV.23', NULL),
(4927, 1078, 'Rēzeknes Rajons', 'LV.24', NULL),
(4928, 1078, 'Rīga', 'LV.25', NULL),
(4929, 1078, 'Rīgas Rajons', 'LV.26', NULL),
(4930, 1078, 'Saldus Rajons', 'LV.27', NULL),
(4931, 1078, 'Talsu Rajons', 'LV.28', NULL),
(4932, 1078, 'Tukuma Rajons', 'LV.29', NULL),
(4933, 1078, 'Valkas Rajons', 'LV.30', NULL),
(4934, 1078, 'Valmieras Rajons', 'LV.31', NULL),
(4935, 1078, 'Ventspils', 'LV.32', NULL),
(4936, 1078, 'Ventspils Rajons', 'LV.33', NULL),
(4937, 1078, 'Libya (general)', 'LY.00', NULL),
(4938, 1078, 'Baladīyat al Abyār', 'LY.02', NULL),
(4939, 1078, 'Al ‘Azīzīyah', 'LY.03', NULL),
(4940, 1078, 'Baladīyat al Bayḑā''', 'LY.04', NULL),
(4941, 1078, 'Al Jufrah', 'LY.05', NULL),
(4942, 1078, 'Baladīyat al Jumayl', 'LY.06', NULL),
(4943, 1078, 'Al Kufrah', 'LY.08', NULL),
(4944, 1078, 'Baladīyat al Marj', 'LY.09', NULL),
(4945, 1078, 'Baladīyat al Qarābūll', 'LY.10', NULL),
(4946, 1078, 'Baladīyat al Qubbah', 'LY.11', NULL),
(4947, 1078, 'Baladīyat al `Ujaylāt', 'LY.12', NULL),
(4948, 1078, 'Ash Shāţiʼ', 'LY.13', NULL),
(4949, 1078, 'Baladīyat az Zahrā''', 'LY.15', NULL),
(4950, 1078, 'Baladīyat Banī Walīd', 'LY.18', NULL),
(4951, 1078, 'Baladīyat Bin Jawwād', 'LY.19', NULL),
(4952, 1078, 'Baladīyat Ghāt', 'LY.23', NULL),
(4953, 1078, 'Baladīyat Jādū', 'LY.24', NULL),
(4954, 1078, 'Baladīyat Jālū', 'LY.25', NULL),
(4955, 1078, 'Baladīyat Janzūr', 'LY.26', NULL),
(4956, 1078, 'Masallatah', 'LY.27', NULL),
(4957, 1078, 'Baladīyat Mizdah', 'LY.29', NULL),
(4958, 1078, 'Murzuq', 'LY.30', NULL),
(4959, 1078, 'Baladīyat Nālūt', 'LY.31', NULL),
(4960, 1078, 'Baladīyat Qamīnis', 'LY.32', NULL),
(4961, 1078, 'Baladīyat Qaşr Bin Ghashīr', 'LY.33', NULL),
(4962, 1078, 'Sabhā', 'LY.34', NULL),
(4963, 1078, 'Baladīyat Şabrātah', 'LY.35', NULL),
(4964, 1078, 'Baladīyat Shaḩḩāt', 'LY.36', NULL),
(4965, 1078, 'Baladīyat Şurmān', 'LY.37', NULL),
(4966, 1078, 'Tajura’ ', 'LY.39', NULL),
(4967, 1078, 'Tarhūnah', 'LY.41', NULL),
(4968, 1078, 'Ţubruq', 'LY.42', NULL),
(4969, 1078, 'Baladīyat Tūkrah', 'LY.43', NULL),
(4970, 1078, 'Zlīţan', 'LY.45', NULL),
(4971, 1078, 'Baladīyat Zuwārah', 'LY.46', NULL),
(4972, 1078, 'Ajdābiyā', 'LY.47', NULL),
(4973, 1078, 'Al Fātiḩ', 'LY.48', NULL),
(4974, 1078, 'Al Jabal al Akhḑar', 'LY.49', NULL),
(4975, 1078, 'Al Khums', 'LY.50', NULL),
(4976, 1078, 'An Nuqāţ al Khams', 'LY.51', NULL),
(4977, 1078, 'Awbārī', 'LY.52', NULL),
(4978, 1078, 'Az Zāwiyah', 'LY.53', NULL),
(4979, 1078, 'Banghāzī', 'LY.54', NULL),
(4980, 1078, 'Darnah', 'LY.55', NULL),
(4981, 1078, 'Ghadāmis', 'LY.56', NULL),
(4982, 1078, 'Gharyān', 'LY.57', NULL),
(4983, 1078, 'Mişrātah', 'LY.58', NULL),
(4984, 1078, 'Sawfajjīn', 'LY.59', NULL),
(4985, 1078, 'Surt', 'LY.60', NULL),
(4986, 1078, 'Ţarābulus', 'LY.61', NULL),
(4987, 1078, 'Yafran', 'LY.62', NULL),
(4988, 1078, 'Agadir', 'MA.01', NULL),
(4989, 1078, 'Al Hoceïma', 'MA.02', NULL),
(4990, 1078, 'Azizal', 'MA.03', NULL),
(4991, 1078, 'Ben Slimane', 'MA.04', NULL),
(4992, 1078, 'Beni Mellal', 'MA.05', NULL),
(4993, 1078, 'Boulemane', 'MA.06', NULL),
(4994, 1078, 'Casablanca', 'MA.07', NULL),
(4995, 1078, 'Chaouen', 'MA.08', NULL),
(4996, 1078, 'El Jadida', 'MA.09', NULL),
(4997, 1078, 'El Kelaa des Srarhna', 'MA.10', NULL),
(4998, 1078, 'Er Rachidia', 'MA.11', NULL),
(4999, 1078, 'Essaouira', 'MA.12', NULL),
(5000, 1078, 'Fes', 'MA.13', NULL),
(5001, 1078, 'Figuig', 'MA.14', NULL),
(5002, 1078, 'Kenitra', 'MA.15', NULL),
(5003, 1078, 'Khemisset', 'MA.16', NULL),
(5004, 1078, 'Khenifra', 'MA.17', NULL),
(5005, 1078, 'Khouribga', 'MA.18', NULL),
(5006, 1078, 'Marrakech', 'MA.19', NULL),
(5007, 1078, 'Meknes', 'MA.20', NULL),
(5008, 1078, 'Nador', 'MA.21', NULL),
(5009, 1078, 'Ouarzazate', 'MA.22', NULL),
(5010, 1078, 'Oujda', 'MA.23', NULL),
(5011, 1078, 'Rabat-Sale', 'MA.24', NULL),
(5012, 1078, 'Safi', 'MA.25', NULL),
(5013, 1078, 'Settat', 'MA.26', NULL),
(5014, 1078, 'Tanger', 'MA.27', NULL),
(5015, 1078, 'Tata', 'MA.29', NULL),
(5016, 1078, 'Taza', 'MA.30', NULL),
(5017, 1078, 'Tiznit', 'MA.32', NULL),
(5018, 1078, 'Guelmim', 'MA.33', NULL),
(5019, 1078, 'Ifrane', 'MA.34', NULL),
(5020, 1078, 'Laayoune', 'MA.35', NULL),
(5021, 1078, 'Tan-Tan', 'MA.36', NULL),
(5022, 1078, 'Taounate', 'MA.37', NULL),
(5023, 1078, 'Sidi Kacem', 'MA.38', NULL),
(5024, 1078, 'Taroudannt', 'MA.39', NULL),
(5025, 1078, 'Tetouan', 'MA.40', NULL),
(5026, 1078, 'Larache', 'MA.41', NULL),
(5027, 1078, '(MO42)', 'MA.42', NULL),
(5028, 1078, '(MO43)', 'MA.43', NULL),
(5029, 1078, '(MO44)', 'MA.44', NULL),
(5030, 1078, 'Grand Casablanca', 'MA.45', NULL),
(5031, 1078, 'Fès-Boulemane', 'MA.46', NULL),
(5032, 1078, 'Marrakech-Tensift-Al Haouz', 'MA.47', NULL),
(5033, 1078, 'Meknès-Tafilalet', 'MA.48', NULL),
(5034, 1078, 'Rabat-Salé-Zemmour-Zaër', 'MA.49', NULL),
(5035, 1078, 'Chaouia-Ouardigha', 'MA.50', NULL),
(5036, 1078, 'Doukkala-Abda', 'MA.51', NULL),
(5037, 1078, 'Gharb-Chrarda-Beni Hssen', 'MA.52', NULL),
(5038, 1078, 'Guelmim-Es Smara', 'MA.53', NULL),
(5039, 1078, 'Oriental', 'MA.54', NULL),
(5040, 1078, 'Souss-Massa-Drâa', 'MA.55', NULL),
(5041, 1078, 'Tadla-Azilal', 'MA.56', NULL),
(5042, 1078, 'Tanger-Tétouan', 'MA.57', NULL),
(5043, 1078, 'Taza-Al Hoceima-Taounate', 'MA.58', NULL),
(5044, 1078, 'Laâyoune-Boujdour-Sakia El Hamra', 'MA.59', NULL),
(5045, 1078, 'Monaco (general)', 'MC.00', NULL),
(5046, 1078, 'Ungheni Judetul', 'MD.00', NULL),
(5047, 1078, '(MD13)', 'MD.13', NULL),
(5048, 1078, 'Balti', 'MD.46', NULL),
(5049, 1078, 'Cahul', 'MD.47', NULL),
(5050, 1078, 'Stinga Nistrului', 'MD.49', NULL),
(5051, 1078, 'Edinet', 'MD.50', NULL),
(5052, 1078, 'Găgăuzia', 'MD.51', NULL),
(5053, 1078, 'Lapusna', 'MD.52', NULL),
(5054, 1078, 'Orhei', 'MD.53', NULL),
(5055, 1078, 'Soroca', 'MD.54', NULL),
(5056, 1078, 'Tighina', 'MD.55', NULL),
(5057, 1078, 'Ungheni', 'MD.56', NULL),
(5058, 1078, 'Chişinău', 'MD.57', NULL),
(5059, 1078, 'Stînga Nistrului', 'MD.58', NULL),
(5060, 1078, 'Raionul Anenii Noi', 'MD.59', NULL),
(5061, 1078, 'Bălţi', 'MD.60', NULL),
(5062, 1078, 'Raionul Basarabeasca', 'MD.61', NULL),
(5063, 1078, 'Bender', 'MD.62', NULL),
(5064, 1078, 'Raionul Briceni', 'MD.63', NULL),
(5065, 1078, 'Raionul Cahul', 'MD.64', NULL),
(5066, 1078, 'Raionul Cantemir', 'MD.65', NULL),
(5067, 1078, 'Călăraşi', 'MD.66', NULL),
(5068, 1078, 'Căuşeni', 'MD.67', NULL),
(5069, 1078, 'Raionul Cimişlia', 'MD.68', NULL),
(5070, 1078, 'Raionul Criuleni', 'MD.69', NULL),
(5071, 1078, 'Raionul Donduşeni', 'MD.70', NULL),
(5072, 1078, 'Raionul Drochia', 'MD.71', NULL),
(5073, 1078, 'Dubăsari', 'MD.72', NULL),
(5074, 1078, 'Raionul Edineţ', 'MD.73', NULL),
(5075, 1078, 'Raionul Făleşti', 'MD.74', NULL),
(5076, 1078, 'Raionul Floreşti', 'MD.75', NULL),
(5077, 1078, 'Raionul Glodeni', 'MD.76', NULL),
(5078, 1078, 'Raionul Hînceşti', 'MD.77', NULL),
(5079, 1078, 'Raionul Ialoveni', 'MD.78', NULL),
(5080, 1078, 'Raionul Leova', 'MD.79', NULL),
(5081, 1078, 'Raionul Nisporeni', 'MD.80', NULL),
(5082, 1078, 'Raionul Ocniţa', 'MD.81', NULL),
(5083, 1078, 'Raionul Orhei', 'MD.82', NULL),
(5084, 1078, 'Raionul Rezina', 'MD.83', NULL),
(5085, 1078, 'Raionul Rîşcani', 'MD.84', NULL),
(5086, 1078, 'Raionul Sîngerei', 'MD.85', NULL),
(5087, 1078, 'Raionul Şoldăneşti', 'MD.86', NULL),
(5088, 1078, 'Raionul Soroca', 'MD.87', NULL),
(5089, 1078, 'Ştefan-Vodă', 'MD.88', NULL),
(5090, 1078, 'Raionul Străşeni', 'MD.89', NULL),
(5091, 1078, 'Raionul Taraclia', 'MD.90', NULL),
(5092, 1078, 'Raionul Teleneşti', 'MD.91', NULL),
(5093, 1078, 'Raionul Ungheni', 'MD.92', NULL),
(5094, 1078, 'Montenegro (general)', 'ME.00', NULL),
(5095, 1078, 'Madagascar (general)', 'MG.00', NULL),
(5096, 1078, 'Antsiranana', 'MG.01', NULL),
(5097, 1078, 'Fianarantsoa', 'MG.02', NULL),
(5098, 1078, 'Mahajanga', 'MG.03', NULL),
(5099, 1078, 'Toamasina', 'MG.04', NULL),
(5100, 1078, 'Antananarivo', 'MG.05', NULL),
(5101, 1078, 'Toliara', 'MG.06', NULL),
(5102, 1078, 'Marshall Islands (general)', 'MH.00', NULL),
(5103, 1078, 'Macedonia, The Former Yugoslav Republic of (general)', 'MK.00', NULL),
(5104, 1078, 'Aračinovo', 'MK.01', NULL),
(5105, 1078, 'Bač', 'MK.02', NULL),
(5106, 1078, 'Belčišta', 'MK.03', NULL),
(5107, 1078, 'Berovo', 'MK.04', NULL),
(5108, 1078, 'Bistrica', 'MK.05', NULL),
(5109, 1078, 'Bitola', 'MK.06', NULL),
(5110, 1078, 'Blatec', 'MK.07', NULL),
(5111, 1078, 'Bogdanci', 'MK.08', NULL),
(5112, 1078, 'Opstina Bogomila', 'MK.09', NULL),
(5113, 1078, 'Bogovinje', 'MK.10', NULL),
(5114, 1078, 'Bosilovo', 'MK.11', NULL),
(5115, 1078, 'Brvenica', 'MK.12', NULL),
(5116, 1078, 'Čair', 'MK.13', NULL),
(5117, 1078, 'Capari', 'MK.14', NULL),
(5118, 1078, 'Čaška', 'MK.15', NULL),
(5119, 1078, 'Čegrana', 'MK.16', NULL),
(5120, 1078, 'Centar', 'MK.17', NULL),
(5121, 1078, 'Centar Župa', 'MK.18', NULL),
(5122, 1078, 'Češinovo', 'MK.19', NULL),
(5123, 1078, 'Čučer-Sandevo', 'MK.20', NULL),
(5124, 1078, 'Debar', 'MK.21', NULL),
(5125, 1078, 'Delčevo', 'MK.22', NULL),
(5126, 1078, 'Delogoždi', 'MK.23', NULL),
(5127, 1078, 'Demir Hisar', 'MK.24', NULL),
(5128, 1078, 'Demir Kapija', 'MK.25', NULL),
(5129, 1078, 'Dobruševo', 'MK.26', NULL),
(5130, 1078, 'Dolna Banjica', 'MK.27', NULL),
(5131, 1078, 'Dolneni', 'MK.28', NULL),
(5132, 1078, 'Opstina Gjorce Petrov', 'MK.29', NULL),
(5133, 1078, 'Drugovo', 'MK.30', NULL),
(5134, 1078, 'Džepčište', 'MK.31', NULL),
(5135, 1078, 'Gazi Baba', 'MK.32', NULL),
(5136, 1078, 'Gevgelija', 'MK.33', NULL),
(5137, 1078, 'Gostivar', 'MK.34', NULL),
(5138, 1078, 'Gradsko', 'MK.35', NULL),
(5139, 1078, 'Ilinden', 'MK.36', NULL),
(5140, 1078, 'Izvor', 'MK.37', NULL),
(5141, 1078, 'Jegunovce', 'MK.38', NULL),
(5142, 1078, 'Kamenjane', 'MK.39', NULL),
(5143, 1078, 'Karbinci', 'MK.40', NULL),
(5144, 1078, 'Karpoš', 'MK.41', NULL),
(5145, 1078, 'Kavadarci', 'MK.42', NULL),
(5146, 1078, 'Kičevo', 'MK.43', NULL),
(5147, 1078, 'Kisela Voda', 'MK.44', NULL),
(5148, 1078, 'Klečevce', 'MK.45', NULL),
(5149, 1078, 'Kočani', 'MK.46', NULL),
(5150, 1078, 'Konče', 'MK.47', NULL),
(5151, 1078, 'Kondovo', 'MK.48', NULL),
(5152, 1078, 'Konopište', 'MK.49', NULL),
(5153, 1078, 'Kosel', 'MK.50', NULL),
(5154, 1078, 'Kratovo', 'MK.51', NULL),
(5155, 1078, 'Kriva Palanka', 'MK.52', NULL),
(5156, 1078, 'Krivogaštani', 'MK.53', NULL),
(5157, 1078, 'Kruševo', 'MK.54', NULL),
(5158, 1078, 'Kukliš', 'MK.55', NULL),
(5159, 1078, 'Kukurečani', 'MK.56', NULL),
(5160, 1078, 'Kumanovo', 'MK.57', NULL),
(5161, 1078, 'Labuništa', 'MK.58', NULL),
(5162, 1078, 'Opstina Lipkovo', 'MK.59', NULL),
(5163, 1078, 'Lozovo', 'MK.60', NULL),
(5164, 1078, 'Lukovo', 'MK.61', NULL),
(5165, 1078, 'Makedonska Kamenica', 'MK.62', NULL),
(5166, 1078, 'Makedonski Brod', 'MK.63', NULL),
(5167, 1078, 'Mavrovi Anovi', 'MK.64', NULL),
(5168, 1078, 'Mešeišta', 'MK.65', NULL),
(5169, 1078, 'Miravci', 'MK.66', NULL),
(5170, 1078, 'Mogila', 'MK.67', NULL),
(5171, 1078, 'Murtino', 'MK.68', NULL),
(5172, 1078, 'Negotino', 'MK.69', NULL),
(5173, 1078, 'Negotino-Pološko', 'MK.70', NULL),
(5174, 1078, 'Novaci', 'MK.71', NULL),
(5175, 1078, 'Novo Selo', 'MK.72', NULL),
(5176, 1078, 'Obleševo', 'MK.73', NULL),
(5177, 1078, 'Ohrid', 'MK.74', NULL),
(5178, 1078, 'Orašac', 'MK.75', NULL),
(5179, 1078, 'Orizari', 'MK.76', NULL),
(5180, 1078, 'Oslomej', 'MK.77', NULL),
(5181, 1078, 'Pehčevo', 'MK.78', NULL),
(5182, 1078, 'Petrovec', 'MK.79', NULL),
(5183, 1078, 'Plasnica', 'MK.80', NULL),
(5184, 1078, 'Podareš', 'MK.81', NULL),
(5185, 1078, 'Prilep', 'MK.82', NULL),
(5186, 1078, 'Probištip', 'MK.83', NULL),
(5187, 1078, 'Radoviš', 'MK.84', NULL),
(5188, 1078, 'Opstina Rankovce', 'MK.85', NULL),
(5189, 1078, 'Resen', 'MK.86', NULL),
(5190, 1078, 'Rosoman', 'MK.87', NULL),
(5191, 1078, 'Rostuša', 'MK.88', NULL),
(5192, 1078, 'Samokov', 'MK.89', NULL),
(5193, 1078, 'Saraj', 'MK.90', NULL),
(5194, 1078, 'Šipkovica', 'MK.91', NULL),
(5195, 1078, 'Sopište', 'MK.92', NULL),
(5196, 1078, 'Sopotnica', 'MK.93', NULL),
(5197, 1078, 'Srbinovo', 'MK.94', NULL),
(5198, 1078, 'Staravina', 'MK.95', NULL),
(5199, 1078, 'Star Dojran', 'MK.96', NULL),
(5200, 1078, 'Staro Nagoričane', 'MK.97', NULL),
(5201, 1078, 'Štip', 'MK.98', NULL),
(5202, 1078, 'Struga', 'MK.99', NULL),
(5203, 1078, 'Strumica', 'MK.A1', NULL),
(5204, 1078, 'Studeničani', 'MK.A2', NULL),
(5205, 1078, 'Šuto Orizari', 'MK.A3', NULL),
(5206, 1078, 'Sveti Nikole', 'MK.A4', NULL),
(5207, 1078, 'Tearce', 'MK.A5', NULL),
(5208, 1078, 'Tetovo', 'MK.A6', NULL),
(5209, 1078, 'Topolčani', 'MK.A7', NULL),
(5210, 1078, 'Valandovo', 'MK.A8', NULL),
(5211, 1078, 'Vasilevo', 'MK.A9', NULL),
(5212, 1078, 'Veles', 'MK.B1', NULL),
(5213, 1078, 'Velešta', 'MK.B2', NULL),
(5214, 1078, 'Vevčani', 'MK.B3', NULL),
(5215, 1078, 'Vinica', 'MK.B4', NULL),
(5216, 1078, 'Vitolište', 'MK.B5', NULL),
(5217, 1078, 'Vraneštica', 'MK.B6', NULL),
(5218, 1078, 'Vrapčište', 'MK.B7', NULL),
(5219, 1078, 'Vratnica', 'MK.B8', NULL),
(5220, 1078, 'Vrutok', 'MK.B9', NULL),
(5221, 1078, 'Zajas', 'MK.C1', NULL),
(5222, 1078, 'Zelenikovo', 'MK.C2', NULL),
(5223, 1078, 'Želino', 'MK.C3', NULL),
(5224, 1078, 'Žitoše', 'MK.C4', NULL),
(5225, 1078, 'Zletovo', 'MK.C5', NULL),
(5226, 1078, 'Zrnovci', 'MK.C6', NULL),
(5227, 1078, 'Mali (general)', 'ML.00', NULL),
(5228, 1078, 'Bamako', 'ML.01', NULL),
(5229, 1078, 'Gao', 'ML.02', NULL),
(5230, 1078, 'Kayes', 'ML.03', NULL),
(5231, 1078, 'Mopti', 'ML.04', NULL),
(5232, 1078, 'Ségou', 'ML.05', NULL),
(5233, 1078, 'Sikasso', 'ML.06', NULL),
(5234, 1078, 'Koulikoro', 'ML.07', NULL),
(5235, 1078, 'Tombouctou', 'ML.08', NULL),
(5236, 1078, 'Gao', 'ML.09', NULL),
(5237, 1078, 'Kidal', 'ML.10', NULL),
(5238, 1078, 'Burma (general)', 'MM.00', NULL),
(5239, 1078, 'Rakhine State', 'MM.01', NULL),
(5240, 1078, 'Chin State', 'MM.02', NULL),
(5241, 1078, 'Ayeyarwady', 'MM.03', NULL),
(5242, 1078, 'Kachin State', 'MM.04', NULL),
(5243, 1078, 'Kayin State', 'MM.05', NULL),
(5244, 1078, 'Kayah State', 'MM.06', NULL),
(5245, 1078, 'Magwe', 'MM.07', NULL),
(5246, 1078, 'Mandalay', 'MM.08', NULL),
(5247, 1078, 'Pegu', 'MM.09', NULL),
(5248, 1078, 'Sagain', 'MM.10', NULL),
(5249, 1078, 'Shan State', 'MM.11', NULL),
(5250, 1078, 'Tanintharyi', 'MM.12', NULL),
(5251, 1078, 'Mon State', 'MM.13', NULL),
(5252, 1078, 'Rangoon', 'MM.14', NULL),
(5253, 1078, 'Magway', 'MM.15', NULL),
(5254, 1078, 'Bago', 'MM.16', NULL),
(5255, 1078, 'Yangon', 'MM.17', NULL),
(5256, 1078, '(BM22)', 'MM.22', NULL),
(5257, 1078, 'Erdenet Hot (historical)', 'MN.00', NULL),
(5258, 1078, 'Arhangay', 'MN.01', NULL),
(5259, 1078, 'Bayanhongor', 'MN.02', NULL),
(5260, 1078, 'Bayan-Ölgiy', 'MN.03', NULL),
(5261, 1078, 'East Aimak', 'MN.06', NULL),
(5262, 1078, 'East Gobi Aymag', 'MN.07', NULL),
(5263, 1078, 'Middle Govĭ', 'MN.08', NULL),
(5264, 1078, 'Dzavhan', 'MN.09', NULL),
(5265, 1078, 'Govĭ-Altay', 'MN.10', NULL),
(5266, 1078, 'Hentiy', 'MN.11', NULL),
(5267, 1078, 'Hovd', 'MN.12', NULL),
(5268, 1078, 'Hövsgöl', 'MN.13', NULL),
(5269, 1078, 'South Gobi Aimak', 'MN.14', NULL),
(5270, 1078, 'South Hangay', 'MN.15', NULL),
(5271, 1078, 'Selenge', 'MN.16', NULL),
(5272, 1078, 'Sühbaatar', 'MN.17', NULL),
(5273, 1078, 'Central Aimak', 'MN.18', NULL),
(5274, 1078, 'Uvs', 'MN.19', NULL),
(5275, 1078, 'Ulaanbaatar', 'MN.20', NULL),
(5276, 1078, 'Bulgan', 'MN.21', NULL),
(5277, 1078, 'Darhan Uul', 'MN.23', NULL),
(5278, 1078, 'Govĭ-Sumber', 'MN.24', NULL),
(5279, 1078, 'Orhon', 'MN.25', NULL),
(5280, 1078, 'Macau (general)', 'MO.00', NULL),
(5281, 1078, 'Ilhas', 'MO.01', NULL),
(5282, 1078, 'Macau', 'MO.02', NULL),
(5283, 1078, 'Région Martinique', 'MQ.MQ', NULL),
(5284, 1078, 'Nouakchott District de', 'MR.00', NULL),
(5285, 1078, 'Hodh Ech Chargui', 'MR.01', NULL),
(5286, 1078, 'Hodh El Gharbi', 'MR.02', NULL),
(5287, 1078, 'Assaba', 'MR.03', NULL),
(5288, 1078, 'Gorgol', 'MR.04', NULL),
(5289, 1078, 'Brakna', 'MR.05', NULL),
(5290, 1078, 'Trarza', 'MR.06', NULL),
(5291, 1078, 'Adrar', 'MR.07', NULL),
(5292, 1078, 'Dakhlet Nouadhibou', 'MR.08', NULL),
(5293, 1078, 'Tagant', 'MR.09', NULL),
(5294, 1078, 'Guidimaka', 'MR.10', NULL),
(5295, 1078, 'Tiris Zemmour', 'MR.11', NULL),
(5296, 1078, 'Inchiri', 'MR.12', NULL),
(5297, 1078, 'Montserrat (general)', 'MS.00', NULL),
(5298, 1078, 'Saint Anthony', 'MS.01', NULL),
(5299, 1078, 'Saint Georges', 'MS.02', NULL),
(5300, 1078, 'Saint Peter', 'MS.03', NULL),
(5301, 1078, 'Malta (general)', 'MT.00', NULL),
(5302, 1078, 'Mauritius (general)', 'MU.00', NULL),
(5303, 1078, 'Black River', 'MU.12', NULL),
(5304, 1078, 'Flacq', 'MU.13', NULL),
(5305, 1078, 'Grand Port', 'MU.14', NULL),
(5306, 1078, 'Moka', 'MU.15', NULL),
(5307, 1078, 'Pamplemousses', 'MU.16', NULL),
(5308, 1078, 'Plaines Wilhems', 'MU.17', NULL),
(5309, 1078, 'Port Louis', 'MU.18', NULL),
(5310, 1078, 'Rivière du Rempart', 'MU.19', NULL),
(5311, 1078, 'Savanne', 'MU.20', NULL),
(5312, 1078, 'Agalega Islands', 'MU.21', NULL),
(5313, 1078, 'Cargados Carajos', 'MU.22', NULL),
(5314, 1078, 'Rodrigues', 'MU.23', NULL),
(5315, 1078, 'Maale', 'MV.00', NULL),
(5316, 1078, 'Seenu', 'MV.01', NULL),
(5317, 1078, 'Alifu Atholhu', 'MV.02', NULL),
(5318, 1078, 'Lhaviyani Atholhu', 'MV.03', NULL),
(5319, 1078, 'Vaavu Atholhu', 'MV.04', NULL),
(5320, 1078, 'Laamu', 'MV.05', NULL),
(5321, 1078, 'Haa Alifu Atholhu', 'MV.07', NULL),
(5322, 1078, 'Thaa Atholhu', 'MV.08', NULL),
(5323, 1078, 'Meemu Atholhu', 'MV.12', NULL),
(5324, 1078, 'Raa Atholhu', 'MV.13', NULL),
(5325, 1078, 'Faafu Atholhu', 'MV.14', NULL),
(5326, 1078, 'Dhaalu Atholhu', 'MV.17', NULL),
(5327, 1078, 'Baa Atholhu', 'MV.20', NULL),
(5328, 1078, 'Haa Dhaalu Atholhu', 'MV.23', NULL),
(5329, 1078, 'Shaviyani Atholhu', 'MV.24', NULL),
(5330, 1078, 'Noonu Atholhu', 'MV.25', NULL),
(5331, 1078, 'Gaafu Alifu Atholhu', 'MV.27', NULL);
INSERT INTO `annu_meta_ontologie` (`amo_id_ontologie`, `amo_ce_parent`, `amo_nom`, `amo_abreviation`, `amo_description`) VALUES
(5332, 1078, 'Gaafu Dhaalu Atholhu', 'MV.28', NULL),
(5333, 1078, 'Gnyaviyani Atoll', 'MV.29', NULL),
(5334, 1078, 'Alifu', 'MV.30', NULL),
(5335, 1078, 'Baa', 'MV.31', NULL),
(5336, 1078, 'Dhaalu', 'MV.32', NULL),
(5337, 1078, 'Faafu', 'MV.33', NULL),
(5338, 1078, 'Gaafu Alifu', 'MV.34', NULL),
(5339, 1078, 'Gaafu Dhaalu', 'MV.35', NULL),
(5340, 1078, 'Haa Alifu', 'MV.36', NULL),
(5341, 1078, 'Haa Dhaalu', 'MV.37', NULL),
(5342, 1078, 'Kaafu', 'MV.38', NULL),
(5343, 1078, 'Lhaviyani', 'MV.39', NULL),
(5344, 1078, 'Maale', 'MV.40', NULL),
(5345, 1078, 'Meemu', 'MV.41', NULL),
(5346, 1078, 'Gnaviyani', 'MV.42', NULL),
(5347, 1078, 'Noonu', 'MV.43', NULL),
(5348, 1078, 'Raa', 'MV.44', NULL),
(5349, 1078, 'Shaviyani', 'MV.45', NULL),
(5350, 1078, 'Thaa', 'MV.46', NULL),
(5351, 1078, 'Vaavu', 'MV.47', NULL),
(5352, 1078, 'Malawi (general)', 'MW.00', NULL),
(5353, 1078, 'Chikwawa', 'MW.02', NULL),
(5354, 1078, 'Chiradzulu', 'MW.03', NULL),
(5355, 1078, 'Chitipa', 'MW.04', NULL),
(5356, 1078, 'Thyolo', 'MW.05', NULL),
(5357, 1078, 'Dedza', 'MW.06', NULL),
(5358, 1078, 'Dowa', 'MW.07', NULL),
(5359, 1078, 'Karonga', 'MW.08', NULL),
(5360, 1078, 'Kasungu', 'MW.09', NULL),
(5361, 1078, '(MI10)', 'MW.10', NULL),
(5362, 1078, 'Lilongwe', 'MW.11', NULL),
(5363, 1078, 'Mangochi', 'MW.12', NULL),
(5364, 1078, 'Mchinji', 'MW.13', NULL),
(5365, 1078, '(MI14)', 'MW.14', NULL),
(5366, 1078, 'Mzimba', 'MW.15', NULL),
(5367, 1078, 'Ntcheu', 'MW.16', NULL),
(5368, 1078, 'Nkhata Bay', 'MW.17', NULL),
(5369, 1078, 'Nkhotakota', 'MW.18', NULL),
(5370, 1078, 'Nsanje', 'MW.19', NULL),
(5371, 1078, 'Ntchisi', 'MW.20', NULL),
(5372, 1078, 'Rumphi', 'MW.21', NULL),
(5373, 1078, 'Salima', 'MW.22', NULL),
(5374, 1078, 'Zomba', 'MW.23', NULL),
(5375, 1078, 'Blantyre', 'MW.24', NULL),
(5376, 1078, 'Mwanza', 'MW.25', NULL),
(5377, 1078, 'Balaka', 'MW.26', NULL),
(5378, 1078, 'Likoma', 'MW.27', NULL),
(5379, 1078, 'Machinga', 'MW.28', NULL),
(5380, 1078, 'Mulanje', 'MW.29', NULL),
(5381, 1078, 'Phalombe', 'MW.30', NULL),
(5382, 1078, 'Mexico (general)', 'MX.00', NULL),
(5383, 1078, 'Aguascalientes', 'MX.01', NULL),
(5384, 1078, 'Baja California', 'MX.02', NULL),
(5385, 1078, 'Baja California Sur', 'MX.03', NULL),
(5386, 1078, 'Campeche', 'MX.04', NULL),
(5387, 1078, 'Chiapas', 'MX.05', NULL),
(5388, 1078, 'Chihuahua', 'MX.06', NULL),
(5389, 1078, 'Coahuila', 'MX.07', NULL),
(5390, 1078, 'Colima', 'MX.08', NULL),
(5391, 1078, 'The Federal District', 'MX.09', NULL),
(5392, 1078, 'Durango', 'MX.10', NULL),
(5393, 1078, 'Guanajuato', 'MX.11', NULL),
(5394, 1078, 'Guerrero', 'MX.12', NULL),
(5395, 1078, 'Hidalgo', 'MX.13', NULL),
(5396, 1078, 'Jalisco', 'MX.14', NULL),
(5397, 1078, 'México', 'MX.15', NULL),
(5398, 1078, 'Michoacán', 'MX.16', NULL),
(5399, 1078, 'Morelos', 'MX.17', NULL),
(5400, 1078, 'Nayarit', 'MX.18', NULL),
(5401, 1078, 'Nuevo León', 'MX.19', NULL),
(5402, 1078, 'Oaxaca', 'MX.20', NULL),
(5403, 1078, 'Puebla', 'MX.21', NULL),
(5404, 1078, 'Querétaro', 'MX.22', NULL),
(5405, 1078, 'Quintana Roo', 'MX.23', NULL),
(5406, 1078, 'San Luis Potosí', 'MX.24', NULL),
(5407, 1078, 'Sinaloa', 'MX.25', NULL),
(5408, 1078, 'Sonora', 'MX.26', NULL),
(5409, 1078, 'Tabasco', 'MX.27', NULL),
(5410, 1078, 'Tamaulipas', 'MX.28', NULL),
(5411, 1078, 'Tlaxcala', 'MX.29', NULL),
(5412, 1078, 'Veracruz-Llave', 'MX.30', NULL),
(5413, 1078, 'Yucatán', 'MX.31', NULL),
(5414, 1078, 'Zacatecas', 'MX.32', NULL),
(5415, 1078, 'Malaysia (general)', 'MY.00', NULL),
(5416, 1078, 'Johor', 'MY.01', NULL),
(5417, 1078, 'Kedah', 'MY.02', NULL),
(5418, 1078, 'Kelantan', 'MY.03', NULL),
(5419, 1078, 'Melaka', 'MY.04', NULL),
(5420, 1078, 'Negeri Sembilan', 'MY.05', NULL),
(5421, 1078, 'Pahang', 'MY.06', NULL),
(5422, 1078, 'Perak', 'MY.07', NULL),
(5423, 1078, 'Perlis', 'MY.08', NULL),
(5424, 1078, 'Pulau Pinang', 'MY.09', NULL),
(5425, 1078, 'Sarawak', 'MY.11', NULL),
(5426, 1078, 'Selangor', 'MY.12', NULL),
(5427, 1078, 'Terengganu', 'MY.13', NULL),
(5428, 1078, 'Kuala Lumpur', 'MY.14', NULL),
(5429, 1078, 'Federal Territory of Labuan', 'MY.15', NULL),
(5430, 1078, 'Sabah', 'MY.16', NULL),
(5431, 1078, 'Putrajaya', 'MY.17', NULL),
(5432, 1078, 'Mozambique (general)', 'MZ.00', NULL),
(5433, 1078, 'Cabo Delgado', 'MZ.01', NULL),
(5434, 1078, 'Gaza', 'MZ.02', NULL),
(5435, 1078, 'Inhambane', 'MZ.03', NULL),
(5436, 1078, 'Maputo Province', 'MZ.04', NULL),
(5437, 1078, 'Sofala', 'MZ.05', NULL),
(5438, 1078, 'Nampula', 'MZ.06', NULL),
(5439, 1078, 'Niassa', 'MZ.07', NULL),
(5440, 1078, 'Tete', 'MZ.08', NULL),
(5441, 1078, 'Zambézia', 'MZ.09', NULL),
(5442, 1078, 'Manica', 'MZ.10', NULL),
(5443, 1078, 'Maputo', 'MZ.11', NULL),
(5444, 1078, 'Namibia (general)', 'NA.00', NULL),
(5445, 1078, 'Bethanien', 'NA.01', NULL),
(5446, 1078, 'Caprivi Oos', 'NA.02', NULL),
(5447, 1078, 'Kaokoland', 'NA.06', NULL),
(5448, 1078, 'Otjiwarongo', 'NA.13', NULL),
(5449, 1078, 'Outjo', 'NA.14', NULL),
(5450, 1078, 'Owambo', 'NA.15', NULL),
(5451, 1078, 'Khomas', 'NA.21', NULL),
(5452, 1078, 'Kavango', 'NA.25', NULL),
(5453, 1078, 'Caprivi', 'NA.28', NULL),
(5454, 1078, 'Erongo', 'NA.29', NULL),
(5455, 1078, 'Hardap', 'NA.30', NULL),
(5456, 1078, 'Karas', 'NA.31', NULL),
(5457, 1078, 'Kunene', 'NA.32', NULL),
(5458, 1078, 'Ohangwena', 'NA.33', NULL),
(5459, 1078, 'Okavango', 'NA.34', NULL),
(5460, 1078, 'Omaheke', 'NA.35', NULL),
(5461, 1078, 'Omusati', 'NA.36', NULL),
(5462, 1078, 'Oshana', 'NA.37', NULL),
(5463, 1078, 'Oshikoto', 'NA.38', NULL),
(5464, 1078, 'Otjozondjupa', 'NA.39', NULL),
(5465, 1078, 'Niger (general)', 'NE.00', NULL),
(5466, 1078, 'Agadez', 'NE.01', NULL),
(5467, 1078, 'Diffa', 'NE.02', NULL),
(5468, 1078, 'Dosso', 'NE.03', NULL),
(5469, 1078, 'Maradi', 'NE.04', NULL),
(5470, 1078, 'Tahoua', 'NE.06', NULL),
(5471, 1078, 'Zinder', 'NE.07', NULL),
(5472, 1078, 'Tillabéri', 'NE.09', NULL),
(5473, 1078, 'Norfolk Island (general)', 'NF.00', NULL),
(5474, 1078, 'Bendel State', 'NG.00', NULL),
(5475, 1078, 'Lagos', 'NG.05', NULL),
(5476, 1078, '(NI10)', 'NG.10', NULL),
(5477, 1078, 'Abuja Federal Capital Territory', 'NG.11', NULL),
(5478, 1078, '(NI12)', 'NG.12', NULL),
(5479, 1078, 'Ogun', 'NG.16', NULL),
(5480, 1078, '(NI17)', 'NG.17', NULL),
(5481, 1078, '(NI18)', 'NG.18', NULL),
(5482, 1078, '(NI20)', 'NG.20', NULL),
(5483, 1078, 'Akwa Ibom', 'NG.21', NULL),
(5484, 1078, 'Cross River', 'NG.22', NULL),
(5485, 1078, 'Kaduna', 'NG.23', NULL),
(5486, 1078, 'Katsina', 'NG.24', NULL),
(5487, 1078, 'Anambra', 'NG.25', NULL),
(5488, 1078, 'Benue', 'NG.26', NULL),
(5489, 1078, 'Borno', 'NG.27', NULL),
(5490, 1078, 'Imo', 'NG.28', NULL),
(5491, 1078, 'Kano', 'NG.29', NULL),
(5492, 1078, 'Kwara', 'NG.30', NULL),
(5493, 1078, 'Niger', 'NG.31', NULL),
(5494, 1078, 'Oyo', 'NG.32', NULL),
(5495, 1078, '(NI34)', 'NG.34', NULL),
(5496, 1078, 'Adamawa', 'NG.35', NULL),
(5497, 1078, 'Delta', 'NG.36', NULL),
(5498, 1078, 'Edo', 'NG.37', NULL),
(5499, 1078, 'Jigawa', 'NG.39', NULL),
(5500, 1078, 'Kebbi', 'NG.40', NULL),
(5501, 1078, 'Kogi', 'NG.41', NULL),
(5502, 1078, 'Osun', 'NG.42', NULL),
(5503, 1078, 'Taraba', 'NG.43', NULL),
(5504, 1078, 'Yobe', 'NG.44', NULL),
(5505, 1078, 'Abia', 'NG.45', NULL),
(5506, 1078, 'Bauchi', 'NG.46', NULL),
(5507, 1078, 'Enugu', 'NG.47', NULL),
(5508, 1078, 'Ondo', 'NG.48', NULL),
(5509, 1078, 'Plateau', 'NG.49', NULL),
(5510, 1078, 'Rivers', 'NG.50', NULL),
(5511, 1078, 'Sokoto', 'NG.51', NULL),
(5512, 1078, 'Bayelsa', 'NG.52', NULL),
(5513, 1078, 'Ebonyi', 'NG.53', NULL),
(5514, 1078, 'Ekiti', 'NG.54', NULL),
(5515, 1078, 'Gombe', 'NG.55', NULL),
(5516, 1078, 'Nassarawa', 'NG.56', NULL),
(5517, 1078, 'Zamfara', 'NG.57', NULL),
(5518, 1078, 'Nicaragua (general)', 'NI.00', NULL),
(5519, 1078, 'Boaco', 'NI.01', NULL),
(5520, 1078, 'Carazo', 'NI.02', NULL),
(5521, 1078, 'Chinandega', 'NI.03', NULL),
(5522, 1078, 'Chontales', 'NI.04', NULL),
(5523, 1078, 'Estelí', 'NI.05', NULL),
(5524, 1078, 'Granada', 'NI.06', NULL),
(5525, 1078, 'Jinotega', 'NI.07', NULL),
(5526, 1078, 'León', 'NI.08', NULL),
(5527, 1078, 'Madriz', 'NI.09', NULL),
(5528, 1078, 'Managua', 'NI.10', NULL),
(5529, 1078, 'Masaya', 'NI.11', NULL),
(5530, 1078, 'Matagalpa', 'NI.12', NULL),
(5531, 1078, 'Nueva Segovia', 'NI.13', NULL),
(5532, 1078, 'Río San Juan', 'NI.14', NULL),
(5533, 1078, 'Rivas', 'NI.15', NULL),
(5534, 1078, 'Ogun State', 'NI.16', NULL),
(5535, 1078, 'Atlántico Norte', 'NI.17', NULL),
(5536, 1078, 'Región Autónoma Atlántico Sur', 'NI.18', NULL),
(5537, 1078, 'Netherlands (general)', 'NL.00', NULL),
(5538, 1078, 'Provincie Drenthe', 'NL.01', NULL),
(5539, 1078, 'Provincie Friesland', 'NL.02', NULL),
(5540, 1078, 'Gelderland', 'NL.03', NULL),
(5541, 1078, 'Groningen', 'NL.04', NULL),
(5542, 1078, 'Limburg', 'NL.05', NULL),
(5543, 1078, 'North Brabant', 'NL.06', NULL),
(5544, 1078, 'North Holland', 'NL.07', NULL),
(5545, 1078, 'Utrecht', 'NL.09', NULL),
(5546, 1078, 'Zeeland', 'NL.10', NULL),
(5547, 1078, 'South Holland', 'NL.11', NULL),
(5548, 1078, 'Overijssel', 'NL.15', NULL),
(5549, 1078, 'Flevoland', 'NL.16', NULL),
(5550, 1078, 'Jan Mayen', 'NO.00', NULL),
(5551, 1078, 'Akershus', 'NO.01', NULL),
(5552, 1078, 'Aust-Agder', 'NO.02', NULL),
(5553, 1078, 'Buskerud', 'NO.04', NULL),
(5554, 1078, 'Finnmark', 'NO.05', NULL),
(5555, 1078, 'Hedmark', 'NO.06', NULL),
(5556, 1078, 'Hordaland', 'NO.07', NULL),
(5557, 1078, 'Møre og Romsdal', 'NO.08', NULL),
(5558, 1078, 'Nordland', 'NO.09', NULL),
(5559, 1078, 'Nord-Trøndelag', 'NO.10', NULL),
(5560, 1078, 'Oppland', 'NO.11', NULL),
(5561, 1078, 'Oslo', 'NO.12', NULL),
(5562, 1078, 'Østfold', 'NO.13', NULL),
(5563, 1078, 'Rogaland', 'NO.14', NULL),
(5564, 1078, 'Sogn og Fjordane', 'NO.15', NULL),
(5565, 1078, 'Sør-Trøndelag', 'NO.16', NULL),
(5566, 1078, 'Telemark', 'NO.17', NULL),
(5567, 1078, 'Troms', 'NO.18', NULL),
(5568, 1078, 'Vest-Agder', 'NO.19', NULL),
(5569, 1078, 'Vestfold', 'NO.20', NULL),
(5570, 1078, 'Bāgmatī Zone', 'NP.00', NULL),
(5571, 1078, 'Bāgmatī', 'NP.01', NULL),
(5572, 1078, 'Bherī', 'NP.02', NULL),
(5573, 1078, 'Dhawalāgiri', 'NP.03', NULL),
(5574, 1078, 'Gandakī', 'NP.04', NULL),
(5575, 1078, 'Janakpur', 'NP.05', NULL),
(5576, 1078, 'Karnālī', 'NP.06', NULL),
(5577, 1078, 'Kosī', 'NP.07', NULL),
(5578, 1078, 'Lumbinī', 'NP.08', NULL),
(5579, 1078, 'Mahākālī', 'NP.09', NULL),
(5580, 1078, 'Mechī', 'NP.10', NULL),
(5581, 1078, 'Nārāyanī', 'NP.11', NULL),
(5582, 1078, 'Rāptī', 'NP.12', NULL),
(5583, 1078, 'Sagarmāthā', 'NP.13', NULL),
(5584, 1078, 'Setī', 'NP.14', NULL),
(5585, 1078, 'Nauru (general)', 'NR.00', NULL),
(5586, 1078, 'Aiwo', 'NR.01', NULL),
(5587, 1078, 'Anabar', 'NR.02', NULL),
(5588, 1078, 'Anetan', 'NR.03', NULL),
(5589, 1078, 'Anibare', 'NR.04', NULL),
(5590, 1078, 'Baiti', 'NR.05', NULL),
(5591, 1078, 'Boe', 'NR.06', NULL),
(5592, 1078, 'Buada', 'NR.07', NULL),
(5593, 1078, 'Denigomodu', 'NR.08', NULL),
(5594, 1078, 'Ewa', 'NR.09', NULL),
(5595, 1078, 'Ijuw', 'NR.10', NULL),
(5596, 1078, 'Meneng', 'NR.11', NULL),
(5597, 1078, 'Nibok', 'NR.12', NULL),
(5598, 1078, 'Uaboe', 'NR.13', NULL),
(5599, 1078, 'Yaren', 'NR.14', NULL),
(5600, 1078, 'Niue (general)', 'NU.00', NULL),
(5601, 1078, 'Akaroa', 'NZ.01', NULL),
(5602, 1078, 'Amuri', 'NZ.03', NULL),
(5603, 1078, 'Ashburton', 'NZ.04', NULL),
(5604, 1078, 'Bay of Islands', 'NZ.07', NULL),
(5605, 1078, 'Bruce', 'NZ.08', NULL),
(5606, 1078, 'Buller', 'NZ.09', NULL),
(5607, 1078, 'Chatham Islands', 'NZ.10', NULL),
(5608, 1078, 'Cheviot', 'NZ.11', NULL),
(5609, 1078, 'Clifton', 'NZ.12', NULL),
(5610, 1078, 'Clutha', 'NZ.13', NULL),
(5611, 1078, 'Cook', 'NZ.14', NULL),
(5612, 1078, 'Dannevirke', 'NZ.16', NULL),
(5613, 1078, 'Egmont', 'NZ.17', NULL),
(5614, 1078, 'Eketahuna', 'NZ.18', NULL),
(5615, 1078, 'Ellesmere', 'NZ.19', NULL),
(5616, 1078, 'Eltham', 'NZ.20', NULL),
(5617, 1078, 'Eyre', 'NZ.21', NULL),
(5618, 1078, 'Tasman', 'NZ.2181818', NULL),
(5619, 1078, 'Featherston', 'NZ.22', NULL),
(5620, 1078, 'Franklin', 'NZ.24', NULL),
(5621, 1078, 'Golden Bay', 'NZ.26', NULL),
(5622, 1078, 'Great Barrier Island', 'NZ.27', NULL),
(5623, 1078, 'Grey', 'NZ.28', NULL),
(5624, 1078, 'Hauraki Plains', 'NZ.29', NULL),
(5625, 1078, 'Hawera', 'NZ.30', NULL),
(5626, 1078, 'Hawkeʼs Bay', 'NZ.31', NULL),
(5627, 1078, 'Heathcote', 'NZ.32', NULL),
(5628, 1078, 'Hobson', 'NZ.33', NULL),
(5629, 1078, 'Hokianga', 'NZ.34', NULL),
(5630, 1078, 'Horowhenua', 'NZ.35', NULL),
(5631, 1078, 'Hutt', 'NZ.36', NULL),
(5632, 1078, 'Inangahua', 'NZ.37', NULL),
(5633, 1078, 'Inglewood', 'NZ.38', NULL),
(5634, 1078, 'Kaikoura', 'NZ.39', NULL),
(5635, 1078, 'Kairanga', 'NZ.40', NULL),
(5636, 1078, 'Kiwitea', 'NZ.41', NULL),
(5637, 1078, 'Lake', 'NZ.43', NULL),
(5638, 1078, 'Mackenzie', 'NZ.45', NULL),
(5639, 1078, 'Malvern', 'NZ.46', NULL),
(5640, 1078, 'Manawatu', 'NZ.47', NULL),
(5641, 1078, 'Mangonui', 'NZ.48', NULL),
(5642, 1078, 'Maniototo', 'NZ.49', NULL),
(5643, 1078, 'Marlborough', 'NZ.50', NULL),
(5644, 1078, 'Masterton', 'NZ.51', NULL),
(5645, 1078, 'Matamata', 'NZ.52', NULL),
(5646, 1078, 'Mount Herbert', 'NZ.53', NULL),
(5647, 1078, 'Ohinemuri', 'NZ.54', NULL),
(5648, 1078, 'Opotiki', 'NZ.55', NULL),
(5649, 1078, 'Oroua', 'NZ.56', NULL),
(5650, 1078, 'Otamatea', 'NZ.57', NULL),
(5651, 1078, 'Otorohanga', 'NZ.58', NULL),
(5652, 1078, 'Oxford', 'NZ.59', NULL),
(5653, 1078, 'Pahiatua', 'NZ.60', NULL),
(5654, 1078, 'Paparua', 'NZ.61', NULL),
(5655, 1078, 'Patea', 'NZ.63', NULL),
(5656, 1078, 'Piako', 'NZ.65', NULL),
(5657, 1078, 'Pohangina', 'NZ.66', NULL),
(5658, 1078, 'Raglan', 'NZ.67', NULL),
(5659, 1078, 'Rangiora', 'NZ.68', NULL),
(5660, 1078, 'Rangitikei', 'NZ.69', NULL),
(5661, 1078, 'Rodney', 'NZ.70', NULL),
(5662, 1078, 'Rotorua', 'NZ.71', NULL),
(5663, 1078, 'Southland', 'NZ.72', NULL),
(5664, 1078, 'Stewart Island', 'NZ.73', NULL),
(5665, 1078, 'Stratford', 'NZ.74', NULL),
(5666, 1078, 'Taranaki', 'NZ.76', NULL),
(5667, 1078, 'Taumarunui', 'NZ.77', NULL),
(5668, 1078, 'Taupo', 'NZ.78', NULL),
(5669, 1078, 'Tauranga', 'NZ.79', NULL),
(5670, 1078, 'Tuapeka', 'NZ.81', NULL),
(5671, 1078, 'Vincent', 'NZ.82', NULL),
(5672, 1078, 'Waiapu', 'NZ.83', NULL),
(5673, 1078, 'Waihemo', 'NZ.84', NULL),
(5674, 1078, 'Waikato', 'NZ.85', NULL),
(5675, 1078, 'Waikohu', 'NZ.86', NULL),
(5676, 1078, 'Waimairi', 'NZ.88', NULL),
(5677, 1078, 'Waimarino', 'NZ.89', NULL),
(5678, 1078, 'Waimate', 'NZ.90', NULL),
(5679, 1078, 'Waimate West', 'NZ.91', NULL),
(5680, 1078, 'Waimea', 'NZ.92', NULL),
(5681, 1078, 'Waipa', 'NZ.93', NULL),
(5682, 1078, 'Waipawa', 'NZ.95', NULL),
(5683, 1078, 'Waipukurau', 'NZ.96', NULL),
(5684, 1078, 'Wairarapa South', 'NZ.97', NULL),
(5685, 1078, 'Wairewa', 'NZ.98', NULL),
(5686, 1078, 'Wairoa', 'NZ.99', NULL),
(5687, 1078, 'Whangarei', 'NZ.A1', NULL),
(5688, 1078, 'Whangaroa', 'NZ.A2', NULL),
(5689, 1078, 'Woodville', 'NZ.A3', NULL),
(5690, 1078, 'Waitaki', 'NZ.A4', NULL),
(5691, 1078, 'Waitomo', 'NZ.A6', NULL),
(5692, 1078, 'Waitotara', 'NZ.A8', NULL),
(5693, 1078, 'North Auckland', 'NZ.AK', NULL),
(5694, 1078, 'Wanganui', 'NZ.B2', NULL),
(5695, 1078, 'Westland', 'NZ.B3', NULL),
(5696, 1078, 'Whakatane', 'NZ.B4', NULL),
(5697, 1078, 'Marlborough', 'NZ.BM', NULL),
(5698, 1078, 'Canterbury', 'NZ.CH', NULL),
(5699, 1078, 'Hurunui', 'NZ.D4', NULL),
(5700, 1078, 'Silverpeaks', 'NZ.D5', NULL),
(5701, 1078, 'Strathallan', 'NZ.D6', NULL),
(5702, 1078, 'Waiheke', 'NZ.D8', NULL),
(5703, 1078, 'Hikurangi', 'NZ.D9', NULL),
(5704, 1078, 'Otago', 'NZ.DN', NULL),
(5705, 1078, 'Manaia', 'NZ.E1', NULL),
(5706, 1078, 'Runanga', 'NZ.E2', NULL),
(5707, 1078, 'Saint Kilda', 'NZ.E3', NULL),
(5708, 1078, 'Thames-Coromandel', 'NZ.E4', NULL),
(5709, 1078, 'Waverley', 'NZ.E5', NULL),
(5710, 1078, 'Wallace', 'NZ.E6', NULL),
(5711, 1078, 'Auckland', 'NZ.E7', NULL),
(5712, 1078, 'Bay of Plenty', 'NZ.E8', NULL),
(5713, 1078, 'Canterbury', 'NZ.E9', NULL),
(5714, 1078, 'Gisborne', 'NZ.F1', NULL),
(5715, 1078, 'Hawke''s Bay', 'NZ.F2', NULL),
(5716, 1078, 'Manawatu-Wanganui', 'NZ.F3', NULL),
(5717, 1078, 'Marlborough', 'NZ.F4', NULL),
(5718, 1078, 'Nelson', 'NZ.F5', NULL),
(5719, 1078, 'Northland', 'NZ.F6', NULL),
(5720, 1078, 'Otago', 'NZ.F7', NULL),
(5721, 1078, 'Southland', 'NZ.F8', NULL),
(5722, 1078, 'Taranaki', 'NZ.F9', NULL),
(5723, 1078, 'Waikato', 'NZ.G1', NULL),
(5724, 1078, 'Wellington', 'NZ.G2', NULL),
(5725, 1078, 'West Coast', 'NZ.G3', NULL),
(5726, 1078, 'Gisborne', 'NZ.GS', NULL),
(5727, 1078, 'Westland', 'NZ.HK', NULL),
(5728, 1078, 'South Auckland', 'NZ.HN', NULL),
(5729, 1078, 'Southland', 'NZ.IN', NULL),
(5730, 1078, 'Hawke''s Bay', 'NZ.NA', NULL),
(5731, 1078, 'Nelson', 'NZ.NN', NULL),
(5732, 1078, 'Taranaki', 'NZ.NP', NULL),
(5733, 1078, 'Wellington', 'NZ.WN', NULL),
(5734, 1078, 'Oman (general)', 'OM.00', NULL),
(5735, 1078, 'Ad Dākhilīyah', 'OM.01', NULL),
(5736, 1078, 'Al Bāţinah', 'OM.02', NULL),
(5737, 1078, 'Al Wusţá', 'OM.03', NULL),
(5738, 1078, 'Ash Sharqīyah', 'OM.04', NULL),
(5739, 1078, 'Az̧ Z̧āhirah', 'OM.05', NULL),
(5740, 1078, 'Masqaţ', 'OM.06', NULL),
(5741, 1078, 'Musandam', 'OM.07', NULL),
(5742, 1078, 'Z̧ufār', 'OM.08', NULL),
(5743, 1078, 'Panama (general)', 'PA.00', NULL),
(5744, 1078, 'Bocas del Toro', 'PA.01', NULL),
(5745, 1078, 'Chiriquí', 'PA.02', NULL),
(5746, 1078, 'Coclé', 'PA.03', NULL),
(5747, 1078, 'Colón', 'PA.04', NULL),
(5748, 1078, 'Darién', 'PA.05', NULL),
(5749, 1078, 'Herrera', 'PA.06', NULL),
(5750, 1078, 'Los Santos', 'PA.07', NULL),
(5751, 1078, 'Panamá', 'PA.08', NULL),
(5752, 1078, 'San Blas', 'PA.09', NULL),
(5753, 1078, 'Veraguas', 'PA.10', NULL),
(5754, 1078, 'Peru (general)', 'PE.00', NULL),
(5755, 1078, 'Amazonas', 'PE.01', NULL),
(5756, 1078, 'Ancash', 'PE.02', NULL),
(5757, 1078, 'Apurímac', 'PE.03', NULL),
(5758, 1078, 'Arequipa', 'PE.04', NULL),
(5759, 1078, 'Ayacucho', 'PE.05', NULL),
(5760, 1078, 'Cajamarca', 'PE.06', NULL),
(5761, 1078, 'Callao', 'PE.07', NULL),
(5762, 1078, 'Cusco', 'PE.08', NULL),
(5763, 1078, 'Huancavelica', 'PE.09', NULL),
(5764, 1078, 'Huanuco', 'PE.10', NULL),
(5765, 1078, 'Ica', 'PE.11', NULL),
(5766, 1078, 'Junín', 'PE.12', NULL),
(5767, 1078, 'La Libertad', 'PE.13', NULL),
(5768, 1078, 'Lambayeque', 'PE.14', NULL),
(5769, 1078, 'Lima', 'PE.15', NULL),
(5770, 1078, 'Loreto', 'PE.16', NULL),
(5771, 1078, 'Madre de Dios', 'PE.17', NULL),
(5772, 1078, 'Moquegua', 'PE.18', NULL),
(5773, 1078, 'Pasco', 'PE.19', NULL),
(5774, 1078, 'Piura', 'PE.20', NULL),
(5775, 1078, 'Puno', 'PE.21', NULL),
(5776, 1078, 'San Martín', 'PE.22', NULL),
(5777, 1078, 'Tacna', 'PE.23', NULL),
(5778, 1078, 'Tumbes', 'PE.24', NULL),
(5779, 1078, 'Ucayali', 'PE.25', NULL),
(5780, 1078, 'Papua New Guinea (general)', 'PG.00', NULL),
(5781, 1078, 'Central', 'PG.01', NULL),
(5782, 1078, 'Gulf', 'PG.02', NULL),
(5783, 1078, 'Milne Bay', 'PG.03', NULL),
(5784, 1078, 'Northern', 'PG.04', NULL),
(5785, 1078, 'Southern Highlands', 'PG.05', NULL),
(5786, 1078, 'Western', 'PG.06', NULL),
(5787, 1078, 'Bougainville', 'PG.07', NULL),
(5788, 1078, 'Chimbu', 'PG.08', NULL),
(5789, 1078, 'Eastern Highlands', 'PG.09', NULL),
(5790, 1078, 'East New Britain', 'PG.10', NULL),
(5791, 1078, 'East Sepik', 'PG.11', NULL),
(5792, 1078, 'Madang', 'PG.12', NULL),
(5793, 1078, 'Manus', 'PG.13', NULL),
(5794, 1078, 'Morobe', 'PG.14', NULL),
(5795, 1078, 'New Ireland', 'PG.15', NULL),
(5796, 1078, 'Western Highlands', 'PG.16', NULL),
(5797, 1078, 'West New Britain', 'PG.17', NULL),
(5798, 1078, 'Sandaun', 'PG.18', NULL),
(5799, 1078, 'Enga', 'PG.19', NULL),
(5800, 1078, 'National Capital', 'PG.20', NULL),
(5801, 1078, 'Philippines (general)', 'PH.00', NULL),
(5802, 1078, 'Abra', 'PH.01', NULL),
(5803, 1078, 'Agusan del Norte', 'PH.02', NULL),
(5804, 1078, 'Agusan del Sur', 'PH.03', NULL),
(5805, 1078, 'Aklan', 'PH.04', NULL),
(5806, 1078, 'Albay', 'PH.05', NULL),
(5807, 1078, 'Antique', 'PH.06', NULL),
(5808, 1078, 'Bataan', 'PH.07', NULL),
(5809, 1078, 'Batanes', 'PH.08', NULL),
(5810, 1078, 'Batangas', 'PH.09', NULL),
(5811, 1078, 'Benguet', 'PH.10', NULL),
(5812, 1078, 'Bohol', 'PH.11', NULL),
(5813, 1078, 'Bukidnon', 'PH.12', NULL),
(5814, 1078, 'Bulacan', 'PH.13', NULL),
(5815, 1078, 'Cagayan', 'PH.14', NULL),
(5816, 1078, 'Camarines Norte', 'PH.15', NULL),
(5817, 1078, 'Camarines Sur', 'PH.16', NULL),
(5818, 1078, 'Camiguin', 'PH.17', NULL),
(5819, 1078, 'Capiz', 'PH.18', NULL),
(5820, 1078, 'Catanduanes', 'PH.19', NULL),
(5821, 1078, 'Cavite', 'PH.20', NULL),
(5822, 1078, 'Cebu', 'PH.21', NULL),
(5823, 1078, 'Basilan', 'PH.22', NULL),
(5824, 1078, 'Eastern Samar', 'PH.23', NULL),
(5825, 1078, 'Davao', 'PH.24', NULL),
(5826, 1078, 'Davao del Sur', 'PH.25', NULL),
(5827, 1078, 'Davao Oriental', 'PH.26', NULL),
(5828, 1078, 'Ifugao', 'PH.27', NULL),
(5829, 1078, 'Ilocos Norte', 'PH.28', NULL),
(5830, 1078, 'Ilocos Sur', 'PH.29', NULL),
(5831, 1078, 'Iloilo', 'PH.30', NULL),
(5832, 1078, 'Isabela', 'PH.31', NULL),
(5833, 1078, 'Kalinga-Apayao', 'PH.32', NULL),
(5834, 1078, 'Laguna', 'PH.33', NULL),
(5835, 1078, 'Lanao del Norte', 'PH.34', NULL),
(5836, 1078, 'Lanao del Sur', 'PH.35', NULL),
(5837, 1078, 'La Union', 'PH.36', NULL),
(5838, 1078, 'Leyte', 'PH.37', NULL),
(5839, 1078, 'Marinduque', 'PH.38', NULL),
(5840, 1078, 'Masbate', 'PH.39', NULL),
(5841, 1078, 'Mindoro Occidental', 'PH.40', NULL),
(5842, 1078, 'Mindoro Oriental', 'PH.41', NULL),
(5843, 1078, 'Misamis Occidental', 'PH.42', NULL),
(5844, 1078, 'Misamis Oriental', 'PH.43', NULL),
(5845, 1078, 'Mountain Province', 'PH.44', NULL),
(5846, 1078, '(RP45)', 'PH.45', NULL),
(5847, 1078, 'Negros Oriental', 'PH.46', NULL),
(5848, 1078, 'Nueva Ecija', 'PH.47', NULL),
(5849, 1078, 'Nueva Vizcaya', 'PH.48', NULL),
(5850, 1078, 'Palawan', 'PH.49', NULL),
(5851, 1078, 'Pampanga', 'PH.50', NULL),
(5852, 1078, 'Pangasinan', 'PH.51', NULL),
(5853, 1078, 'Rizal', 'PH.53', NULL),
(5854, 1078, 'Romblon', 'PH.54', NULL),
(5855, 1078, 'Samar', 'PH.55', NULL),
(5856, 1078, 'Maguindanao', 'PH.56', NULL),
(5857, 1078, 'North Cotabato', 'PH.57', NULL),
(5858, 1078, 'Sorsogon', 'PH.58', NULL),
(5859, 1078, 'Southern Leyte', 'PH.59', NULL),
(5860, 1078, 'Sulu', 'PH.60', NULL),
(5861, 1078, 'Surigao del Norte', 'PH.61', NULL),
(5862, 1078, 'Surigao del Sur', 'PH.62', NULL),
(5863, 1078, 'Tarlac', 'PH.63', NULL),
(5864, 1078, 'Zambales', 'PH.64', NULL),
(5865, 1078, 'Zamboanga del Norte', 'PH.65', NULL),
(5866, 1078, 'Zamboanga del Sur', 'PH.66', NULL),
(5867, 1078, 'Northern Samar', 'PH.67', NULL),
(5868, 1078, 'Quirino', 'PH.68', NULL),
(5869, 1078, 'Siquijor', 'PH.69', NULL),
(5870, 1078, 'South Cotabato', 'PH.70', NULL),
(5871, 1078, 'Sultan Kudarat', 'PH.71', NULL),
(5872, 1078, 'Tawi-Tawi', 'PH.72', NULL),
(5873, 1078, 'Angeles', 'PH.A1', NULL),
(5874, 1078, 'Bacolod City', 'PH.A2', NULL),
(5875, 1078, 'Bago', 'PH.A3', NULL),
(5876, 1078, 'Baguio', 'PH.A4', NULL),
(5877, 1078, 'Bais', 'PH.A5', NULL),
(5878, 1078, 'Basilan', 'PH.A6', NULL),
(5879, 1078, 'Batangas', 'PH.A7', NULL),
(5880, 1078, 'Butuan', 'PH.A8', NULL),
(5881, 1078, 'Cabanatuan', 'PH.A9', NULL),
(5882, 1078, 'Cadiz', 'PH.B1', NULL),
(5883, 1078, 'Calbayog', 'PH.B3', NULL),
(5884, 1078, 'Caloocan', 'PH.B4', NULL),
(5885, 1078, 'Canlaon', 'PH.B5', NULL),
(5886, 1078, 'Cavite', 'PH.B6', NULL),
(5887, 1078, 'Cebu City', 'PH.B7', NULL),
(5888, 1078, 'Cotabato', 'PH.B8', NULL),
(5889, 1078, 'Dagupan', 'PH.B9', NULL),
(5890, 1078, 'Danao', 'PH.C1', NULL),
(5891, 1078, 'Dapitan', 'PH.C2', NULL),
(5892, 1078, 'Davao', 'PH.C3', NULL),
(5893, 1078, 'Dipolog', 'PH.C4', NULL),
(5894, 1078, 'Dumaguete', 'PH.C5', NULL),
(5895, 1078, 'General Santos', 'PH.C6', NULL),
(5896, 1078, 'Gingoog', 'PH.C7', NULL),
(5897, 1078, 'Iloilo', 'PH.C9', NULL),
(5898, 1078, 'Iriga', 'PH.D1', NULL),
(5899, 1078, 'La Carlota', 'PH.D2', NULL),
(5900, 1078, 'Laoag', 'PH.D3', NULL),
(5901, 1078, 'Lapu-Lapu', 'PH.D4', NULL),
(5902, 1078, 'Legaspi', 'PH.D5', NULL),
(5903, 1078, 'Lipa', 'PH.D6', NULL),
(5904, 1078, 'Lucena', 'PH.D7', NULL),
(5905, 1078, 'Mandaue', 'PH.D8', NULL),
(5906, 1078, 'Manila', 'PH.D9', NULL),
(5907, 1078, 'Naga', 'PH.E2', NULL),
(5908, 1078, 'Olongapo', 'PH.E3', NULL),
(5909, 1078, 'Ormoc', 'PH.E4', NULL),
(5910, 1078, 'Oroquieta', 'PH.E5', NULL),
(5911, 1078, 'Ozamis', 'PH.E6', NULL),
(5912, 1078, 'Pagadian', 'PH.E7', NULL),
(5913, 1078, 'Palayan', 'PH.E8', NULL),
(5914, 1078, 'Pasay', 'PH.E9', NULL),
(5915, 1078, 'Puerto Princesa', 'PH.F1', NULL),
(5916, 1078, 'Quezon', 'PH.F2', NULL),
(5917, 1078, 'Roxas', 'PH.F3', NULL),
(5918, 1078, 'San Carlos, Negros Occidental', 'PH.F4', NULL),
(5919, 1078, 'San Carlos, Pangasinan', 'PH.F5', NULL),
(5920, 1078, 'San Jose', 'PH.F6', NULL),
(5921, 1078, 'San Pablo', 'PH.F7', NULL),
(5922, 1078, 'Silay', 'PH.F8', NULL),
(5923, 1078, 'Surigao', 'PH.F9', NULL),
(5924, 1078, 'Tacloban', 'PH.G1', NULL),
(5925, 1078, 'Tagaytay', 'PH.G2', NULL),
(5926, 1078, 'Tagbilaran', 'PH.G3', NULL),
(5927, 1078, 'Tangub', 'PH.G4', NULL),
(5928, 1078, 'Toledo', 'PH.G5', NULL),
(5929, 1078, 'Trece Martires', 'PH.G6', NULL),
(5930, 1078, 'Zamboanga City', 'PH.G7', NULL),
(5931, 1078, 'Aurora', 'PH.G8', NULL),
(5932, 1078, 'Quezon', 'PH.H2', NULL),
(5933, 1078, 'Negros Occidental', 'PH.H3', NULL),
(5934, 1078, 'Pakistan (general)', 'PK.00', NULL),
(5935, 1078, 'Federally Administered Tribal Areas', 'PK.01', NULL),
(5936, 1078, 'Balochistān', 'PK.02', NULL),
(5937, 1078, 'North-West Frontier', 'PK.03', NULL),
(5938, 1078, 'Punjab', 'PK.04', NULL),
(5939, 1078, 'Sindh', 'PK.05', NULL),
(5940, 1078, 'Azad Kashmir', 'PK.06', NULL),
(5941, 1078, 'Northern Areas', 'PK.07', NULL),
(5942, 1078, 'Islāmābād', 'PK.08', NULL),
(5943, 1078, 'Biala Podlaska', 'PL.23', NULL),
(5944, 1078, 'Bialystok', 'PL.24', NULL),
(5945, 1078, 'Bielsko', 'PL.25', NULL),
(5946, 1078, 'Bydgoszcz', 'PL.26', NULL),
(5947, 1078, 'Chelm', 'PL.27', NULL),
(5948, 1078, 'Ciechanow', 'PL.28', NULL),
(5949, 1078, 'Czestochowa', 'PL.29', NULL),
(5950, 1078, 'Elblag', 'PL.30', NULL),
(5951, 1078, 'Gdansk', 'PL.31', NULL),
(5952, 1078, 'Gorzow', 'PL.32', NULL),
(5953, 1078, 'Jelenia Gora', 'PL.33', NULL),
(5954, 1078, 'Kalisz', 'PL.34', NULL),
(5955, 1078, 'Katowice', 'PL.35', NULL),
(5956, 1078, 'Kielce', 'PL.36', NULL),
(5957, 1078, 'Konin', 'PL.37', NULL),
(5958, 1078, 'Koszalin', 'PL.38', NULL),
(5959, 1078, 'Krakow', 'PL.39', NULL),
(5960, 1078, 'Krosno', 'PL.40', NULL),
(5961, 1078, 'Legnica', 'PL.41', NULL),
(5962, 1078, 'Leszno', 'PL.42', NULL),
(5963, 1078, 'Lodz', 'PL.43', NULL),
(5964, 1078, 'Lomza', 'PL.44', NULL),
(5965, 1078, 'Lublin', 'PL.45', NULL),
(5966, 1078, 'Nowy Sacz', 'PL.46', NULL),
(5967, 1078, 'Olsztyn', 'PL.47', NULL),
(5968, 1078, 'Opole', 'PL.48', NULL),
(5969, 1078, 'Ostroleka', 'PL.49', NULL),
(5970, 1078, 'Pita', 'PL.50', NULL),
(5971, 1078, 'Piotrkow', 'PL.51', NULL),
(5972, 1078, 'Plock', 'PL.52', NULL),
(5973, 1078, 'Poznan', 'PL.53', NULL),
(5974, 1078, 'Przemysl', 'PL.54', NULL),
(5975, 1078, 'Radom', 'PL.55', NULL),
(5976, 1078, 'Rzeszow', 'PL.56', NULL),
(5977, 1078, 'Siedlce', 'PL.57', NULL),
(5978, 1078, 'Sieradz', 'PL.58', NULL),
(5979, 1078, 'Skierniewice', 'PL.59', NULL),
(5980, 1078, 'Slupsk', 'PL.60', NULL),
(5981, 1078, 'Suwalki', 'PL.61', NULL),
(5982, 1078, 'Szczecin', 'PL.62', NULL),
(5983, 1078, 'Tarnobrzeg', 'PL.63', NULL),
(5984, 1078, 'Tarnow', 'PL.64', NULL),
(5985, 1078, 'Torufi', 'PL.65', NULL),
(5986, 1078, 'Walbrzych', 'PL.66', NULL),
(5987, 1078, 'Warszawa', 'PL.67', NULL),
(5988, 1078, 'Wloclawek', 'PL.68', NULL),
(5989, 1078, 'Wroclaw', 'PL.69', NULL),
(5990, 1078, 'Zamosc', 'PL.70', NULL),
(5991, 1078, 'Zielona Gora', 'PL.71', NULL),
(5992, 1078, 'Lower Silesian Voivodeship', 'PL.72', NULL),
(5993, 1078, 'Kujawsko-Pomorskie Voivodship', 'PL.73', NULL),
(5994, 1078, 'Łódź Voivodeship', 'PL.74', NULL),
(5995, 1078, 'Lublin Voivodeship', 'PL.75', NULL),
(5996, 1078, 'Lubusz Voivodship', 'PL.76', NULL),
(5997, 1078, 'Lesser Poland Voivodeship', 'PL.77', NULL),
(5998, 1078, 'Masovian Voivodeship', 'PL.78', NULL),
(5999, 1078, 'Opole Voivodeship', 'PL.79', NULL),
(6000, 1078, 'Subcarpathian Voivodeship', 'PL.80', NULL),
(6001, 1078, 'Podlasie Voivodship', 'PL.81', NULL),
(6002, 1078, 'Pomeranian Voivodeship', 'PL.82', NULL),
(6003, 1078, 'Silesian Voivodeship', 'PL.83', NULL),
(6004, 1078, 'Świętokrzyskie Voivodship', 'PL.84', NULL),
(6005, 1078, 'Warmian-Masurian Voivodeship', 'PL.85', NULL),
(6006, 1078, 'Greater Poland Voivodeship', 'PL.86', NULL),
(6007, 1078, 'West Pomeranian Voivodeship', 'PL.87', NULL),
(6008, 1078, 'Collectivité territoriale de Saint-Pierre-et-Miquelon', 'PM.975', NULL),
(6009, 1078, 'Pitcairn Islands (general)', 'PN.00', NULL),
(6010, 1078, 'San Juan', 'PR.00', NULL),
(6011, 1078, 'Palestine (general)', 'PS.00', NULL),
(6012, 1078, 'Gaza Strip', 'PS.GZ', NULL),
(6013, 1078, 'West Bank', 'PS.WE', NULL),
(6014, 1078, 'Portugal (general)', 'PT.00', NULL),
(6015, 1078, 'Aveiro', 'PT.02', NULL),
(6016, 1078, 'Beja', 'PT.03', NULL),
(6017, 1078, 'Braga', 'PT.04', NULL),
(6018, 1078, 'Bragança', 'PT.05', NULL),
(6019, 1078, 'Castelo Branco', 'PT.06', NULL),
(6020, 1078, 'Coimbra', 'PT.07', NULL),
(6021, 1078, 'Évora', 'PT.08', NULL),
(6022, 1078, 'Faro', 'PT.09', NULL),
(6023, 1078, 'Madeira', 'PT.10', NULL),
(6024, 1078, 'Guarda', 'PT.11', NULL),
(6025, 1078, 'Leiria', 'PT.13', NULL),
(6026, 1078, 'Lisbon', 'PT.14', NULL),
(6027, 1078, 'Portalegre', 'PT.16', NULL),
(6028, 1078, 'Porto', 'PT.17', NULL),
(6029, 1078, 'Santarém', 'PT.18', NULL),
(6030, 1078, 'Setúbal', 'PT.19', NULL),
(6031, 1078, 'Viana do Castelo', 'PT.20', NULL),
(6032, 1078, 'Vila Real', 'PT.21', NULL),
(6033, 1078, 'Viseu', 'PT.22', NULL),
(6034, 1078, 'Azores', 'PT.23', NULL),
(6035, 1078, 'State of Ngeremlengui', 'PW.00', NULL),
(6036, 1078, 'Paraguay (general)', 'PY.00', NULL),
(6037, 1078, 'Alto Paraná', 'PY.01', NULL),
(6038, 1078, 'Amambay', 'PY.02', NULL),
(6039, 1078, 'Departamento de Alto Paraguay', 'PY.03', NULL),
(6040, 1078, 'Caaguazú', 'PY.04', NULL),
(6041, 1078, 'Caazapá', 'PY.05', NULL),
(6042, 1078, 'Central', 'PY.06', NULL),
(6043, 1078, 'Concepción', 'PY.07', NULL),
(6044, 1078, 'Cordillera', 'PY.08', NULL),
(6045, 1078, 'Guairá', 'PY.10', NULL),
(6046, 1078, 'Itapúa', 'PY.11', NULL),
(6047, 1078, 'Misiones', 'PY.12', NULL),
(6048, 1078, 'Ñeembucú', 'PY.13', NULL),
(6049, 1078, 'Paraguarí', 'PY.15', NULL),
(6050, 1078, 'Presidente Hayes', 'PY.16', NULL),
(6051, 1078, 'San Pedro', 'PY.17', NULL),
(6052, 1078, 'Canindeyú', 'PY.19', NULL),
(6053, 1078, 'Asunción', 'PY.22', NULL),
(6054, 1078, 'Asunción', 'PY.23', NULL),
(6055, 1078, 'Boquerón', 'PY.24', NULL),
(6056, 1078, 'Qatar (general)', 'QA.00', NULL),
(6057, 1078, 'Ad Dawḩah', 'QA.01', NULL),
(6058, 1078, 'Al Ghuwayrīyah', 'QA.02', NULL),
(6059, 1078, 'Al Jumaylīyah', 'QA.03', NULL),
(6060, 1078, 'Al Khawr', 'QA.04', NULL),
(6061, 1078, 'Al Wakrah Municipality', 'QA.05', NULL),
(6062, 1078, 'Ar Rayyān', 'QA.06', NULL),
(6063, 1078, 'Jarayan al Batinah', 'QA.07', NULL),
(6064, 1078, 'Madīnat ash Shamāl', 'QA.08', NULL),
(6065, 1078, 'Umm Şalāl', 'QA.09', NULL),
(6066, 1078, 'Al Wakrah', 'QA.10', NULL),
(6067, 1078, 'Jarayān al Bāţinah', 'QA.11', NULL),
(6068, 1078, 'Umm Sa‘īd', 'QA.12', NULL),
(6069, 1078, 'Région Réunion', 'RE.RE', NULL),
(6070, 1078, 'Alba', 'RO.01', NULL),
(6071, 1078, 'Arad', 'RO.02', NULL),
(6072, 1078, 'Argeş', 'RO.03', NULL),
(6073, 1078, 'Bacău', 'RO.04', NULL),
(6074, 1078, 'Bihor', 'RO.05', NULL),
(6075, 1078, 'Bistriţa-Năsăud', 'RO.06', NULL),
(6076, 1078, 'Botoşani', 'RO.07', NULL),
(6077, 1078, 'Brăila', 'RO.08', NULL),
(6078, 1078, 'Braşov', 'RO.09', NULL),
(6079, 1078, 'Bucureşti', 'RO.10', NULL),
(6080, 1078, 'Buzău', 'RO.11', NULL),
(6081, 1078, 'Caraş-Severin', 'RO.12', NULL),
(6082, 1078, 'Cluj', 'RO.13', NULL),
(6083, 1078, 'Constanţa', 'RO.14', NULL),
(6084, 1078, 'Covasna', 'RO.15', NULL),
(6085, 1078, 'Dâmboviţa', 'RO.16', NULL),
(6086, 1078, 'Dolj', 'RO.17', NULL),
(6087, 1078, 'Galaţi', 'RO.18', NULL),
(6088, 1078, 'Gorj', 'RO.19', NULL),
(6089, 1078, 'Harghita', 'RO.20', NULL),
(6090, 1078, 'Hunedoara', 'RO.21', NULL),
(6091, 1078, 'Ialomiţa', 'RO.22', NULL),
(6092, 1078, 'Iaşi', 'RO.23', NULL),
(6093, 1078, 'Maramureş', 'RO.25', NULL),
(6094, 1078, 'Mehedinţi', 'RO.26', NULL),
(6095, 1078, 'Mureş', 'RO.27', NULL),
(6096, 1078, 'Neamţ', 'RO.28', NULL),
(6097, 1078, 'Olt', 'RO.29', NULL),
(6098, 1078, 'Prahova', 'RO.30', NULL),
(6099, 1078, 'Sălaj', 'RO.31', NULL),
(6100, 1078, 'Satu Mare', 'RO.32', NULL),
(6101, 1078, 'Sibiu', 'RO.33', NULL),
(6102, 1078, 'Suceava', 'RO.34', NULL),
(6103, 1078, 'Teleorman', 'RO.35', NULL),
(6104, 1078, 'Timiş', 'RO.36', NULL),
(6105, 1078, 'Tulcea', 'RO.37', NULL),
(6106, 1078, 'Vaslui', 'RO.38', NULL),
(6107, 1078, 'Vâlcea', 'RO.39', NULL),
(6108, 1078, 'Judeţul Vrancea', 'RO.40', NULL),
(6109, 1078, 'Călăraşi', 'RO.41', NULL),
(6110, 1078, 'Giurgiu', 'RO.42', NULL),
(6111, 1078, 'Ilfov', 'RO.43', NULL),
(6112, 1078, 'Serbia (general)', 'RS.00', NULL),
(6113, 1078, 'Kosovo', 'RS.01', NULL),
(6114, 1078, 'Autonomna Pokrajina Vojvodina', 'RS.02', NULL),
(6115, 1078, 'Russia (general)', 'RU.00', NULL),
(6116, 1078, 'Adygeya', 'RU.01', NULL),
(6117, 1078, 'Aginskiy Buryatskiy Avtonomnyy Okrug', 'RU.02', NULL),
(6118, 1078, 'Altay', 'RU.03', NULL),
(6119, 1078, 'Altayskiy Kray', 'RU.04', NULL),
(6120, 1078, 'Amur', 'RU.05', NULL),
(6121, 1078, 'Arkhangelskaya oblast', 'RU.06', NULL),
(6122, 1078, 'Astrakhan', 'RU.07', NULL),
(6123, 1078, 'Bashkortostan', 'RU.08', NULL),
(6124, 1078, 'Belgorod', 'RU.09', NULL),
(6125, 1078, 'Brjansk', 'RU.10', NULL),
(6126, 1078, 'Buryatiya', 'RU.11', NULL),
(6127, 1078, 'Chechnya', 'RU.12', NULL),
(6128, 1078, 'Tsjeljabinsk', 'RU.13', NULL),
(6129, 1078, 'Tsjita', 'RU.14', NULL),
(6130, 1078, 'Chukotskiy Avtonomnyy Okrug', 'RU.15', NULL),
(6131, 1078, 'Chuvashia', 'RU.16', NULL),
(6132, 1078, 'Dagestan', 'RU.17', NULL),
(6133, 1078, 'Evenkiyskiy Avtonomnyy Okrug', 'RU.18', NULL),
(6134, 1078, 'Ingushetiya', 'RU.19', NULL),
(6135, 1078, 'Irkutsk', 'RU.20', NULL),
(6136, 1078, 'Ivanovo', 'RU.21', NULL),
(6137, 1078, 'Kabardino-Balkariya', 'RU.22', NULL),
(6138, 1078, 'Kaliningrad', 'RU.23', NULL),
(6139, 1078, 'Kalmykiya', 'RU.24', NULL),
(6140, 1078, 'Kaluga', 'RU.25', NULL),
(6141, 1078, 'Kamtsjatka', 'RU.26', NULL),
(6142, 1078, 'Karachayevo-Cherkesiya', 'RU.27', NULL),
(6143, 1078, 'Kareliya', 'RU.28', NULL),
(6144, 1078, 'Kemerovo', 'RU.29', NULL),
(6145, 1078, 'Khabarovsk Krai', 'RU.30', NULL),
(6146, 1078, 'Khakasiya', 'RU.31', NULL),
(6147, 1078, 'Khanty-Mansiyskiy Avtonomnyy Okrug', 'RU.32', NULL),
(6148, 1078, 'Kirov', 'RU.33', NULL),
(6149, 1078, 'Komi', 'RU.34', NULL),
(6150, 1078, 'Koryakskiy Avtonomnyy Okrug', 'RU.36', NULL),
(6151, 1078, 'Kostroma', 'RU.37', NULL),
(6152, 1078, 'Krasnodarskiy Kray', 'RU.38', NULL),
(6153, 1078, 'Krasnoyarskiy Kray', 'RU.39', NULL),
(6154, 1078, 'Kurgan', 'RU.40', NULL),
(6155, 1078, 'Kursk', 'RU.41', NULL),
(6156, 1078, 'Leningradskaya Oblast''', 'RU.42', NULL),
(6157, 1078, 'Lipetsk', 'RU.43', NULL),
(6158, 1078, 'Magadan', 'RU.44', NULL),
(6159, 1078, 'Mariy-El', 'RU.45', NULL),
(6160, 1078, 'Mordoviya', 'RU.46', NULL),
(6161, 1078, 'Moskovskaya Oblast''', 'RU.47', NULL),
(6162, 1078, 'Moscow', 'RU.48', NULL),
(6163, 1078, 'Murmansk Oblast', 'RU.49', NULL),
(6164, 1078, 'Nenetskiy Avtonomnyy Okrug', 'RU.50', NULL),
(6165, 1078, 'Nizjnij Novgorod', 'RU.51', NULL),
(6166, 1078, 'Novgorod', 'RU.52', NULL),
(6167, 1078, 'Novosibirsk', 'RU.53', NULL),
(6168, 1078, 'Omsk', 'RU.54', NULL),
(6169, 1078, 'Orenburg', 'RU.55', NULL),
(6170, 1078, 'Orjol', 'RU.56', NULL),
(6171, 1078, 'Penza', 'RU.57', NULL),
(6172, 1078, 'Primorskiy Kray', 'RU.59', NULL),
(6173, 1078, 'Pskov', 'RU.60', NULL),
(6174, 1078, 'Rostov', 'RU.61', NULL),
(6175, 1078, 'Rjazan', 'RU.62', NULL),
(6176, 1078, 'Sakha', 'RU.63', NULL),
(6177, 1078, 'Sakhalin', 'RU.64', NULL),
(6178, 1078, 'Samara', 'RU.65', NULL),
(6179, 1078, 'Sankt-Peterburg', 'RU.66', NULL),
(6180, 1078, 'Saratov', 'RU.67', NULL),
(6181, 1078, 'Severnaya Osetiya-Alaniya', 'RU.68', NULL),
(6182, 1078, 'Smolensk', 'RU.69', NULL),
(6183, 1078, 'Stavropol''skiy Kray', 'RU.70', NULL),
(6184, 1078, 'Sverdlovsk', 'RU.71', NULL),
(6185, 1078, 'Tambov', 'RU.72', NULL),
(6186, 1078, 'Tatarstan', 'RU.73', NULL),
(6187, 1078, 'Taymyrskiy (Dolgano-Nenetskiy) Avtonomnyy Okrug', 'RU.74', NULL),
(6188, 1078, 'Tomsk', 'RU.75', NULL),
(6189, 1078, 'Tula', 'RU.76', NULL),
(6190, 1078, 'Tverskaya Oblast’', 'RU.77', NULL),
(6191, 1078, 'Tjumen', 'RU.78', NULL),
(6192, 1078, 'Tyva', 'RU.79', NULL),
(6193, 1078, 'Udmurtiya', 'RU.80', NULL),
(6194, 1078, 'Uljanovsk', 'RU.81', NULL),
(6195, 1078, 'Ust''-Ordynskiy Buryatskiy Avtonomnyy Okrug', 'RU.82', NULL),
(6196, 1078, 'Vladimir', 'RU.83', NULL),
(6197, 1078, 'Volgograd', 'RU.84', NULL),
(6198, 1078, 'Vologda', 'RU.85', NULL),
(6199, 1078, 'Voronezj', 'RU.86', NULL),
(6200, 1078, 'Yamalo-Nenetskiy Avtonomnyy Okrug', 'RU.87', NULL),
(6201, 1078, 'Jaroslavl', 'RU.88', NULL),
(6202, 1078, 'Jewish Autonomous Oblast', 'RU.89', NULL),
(6203, 1078, 'Perm', 'RU.90', NULL),
(6204, 1078, 'RSJA', 'RU.JA', NULL),
(6205, 1078, 'Rwanda (general)', 'RW.00', NULL),
(6206, 1078, 'Butare', 'RW.01', NULL),
(6207, 1078, 'Byumba', 'RW.02', NULL),
(6208, 1078, 'Cyangugu', 'RW.03', NULL),
(6209, 1078, 'Gikongoro', 'RW.04', NULL),
(6210, 1078, 'Gisenyi', 'RW.05', NULL),
(6211, 1078, 'Gitarama', 'RW.06', NULL),
(6212, 1078, 'Kibungo', 'RW.07', NULL),
(6213, 1078, 'Kibuye', 'RW.08', NULL),
(6214, 1078, 'Kigali', 'RW.09', NULL),
(6215, 1078, 'Ruhengeri', 'RW.10', NULL),
(6216, 1078, 'Eastern Province', 'RW.11', NULL),
(6217, 1078, 'Kigali City', 'RW.12', NULL),
(6218, 1078, 'Northern Province', 'RW.13', NULL),
(6219, 1078, 'Western Province', 'RW.14', NULL),
(6220, 1078, 'Southern Province', 'RW.15', NULL),
(6221, 1078, 'Saudi Arabia (general)', 'SA.00', NULL),
(6222, 1078, 'Al Bāḩah', 'SA.02', NULL),
(6223, 1078, 'Al Madīnah', 'SA.05', NULL),
(6224, 1078, 'Ash Sharqīyah', 'SA.06', NULL),
(6225, 1078, 'Al Qaşīm', 'SA.08', NULL),
(6226, 1078, 'Ar Riyāḑ', 'SA.10', NULL),
(6227, 1078, '‘Asīr', 'SA.11', NULL),
(6228, 1078, 'Ḩāʼil', 'SA.13', NULL),
(6229, 1078, 'Makkah', 'SA.14', NULL),
(6230, 1078, 'Northern Borders Region', 'SA.15', NULL),
(6231, 1078, 'Najrān', 'SA.16', NULL),
(6232, 1078, 'Jīzān', 'SA.17', NULL),
(6233, 1078, 'Tabūk', 'SA.19', NULL),
(6234, 1078, 'Al Jawf', 'SA.20', NULL),
(6235, 1078, 'Makira Province', 'SB.00', NULL),
(6236, 1078, 'Malaita', 'SB.03', NULL),
(6237, 1078, 'Western', 'SB.04', NULL),
(6238, 1078, 'Central', 'SB.05', NULL),
(6239, 1078, 'Guadalcanal', 'SB.06', NULL),
(6240, 1078, 'Isabel', 'SB.07', NULL),
(6241, 1078, 'Makira', 'SB.08', NULL),
(6242, 1078, 'Temotu', 'SB.09', NULL),
(6243, 1078, 'Choiseul', 'SB.11', NULL),
(6244, 1078, 'Rennell and Bellona', 'SB.12', NULL),
(6245, 1078, 'Seychelles (general)', 'SC.00', NULL),
(6246, 1078, 'Anse aux Pins', 'SC.01', NULL),
(6247, 1078, 'Anse Boileau', 'SC.02', NULL),
(6248, 1078, 'Anse Etoile', 'SC.03', NULL),
(6249, 1078, 'Anse Louis', 'SC.04', NULL),
(6250, 1078, 'Anse Royale', 'SC.05', NULL),
(6251, 1078, 'Baie Lazare', 'SC.06', NULL),
(6252, 1078, 'Baie Sainte Anne', 'SC.07', NULL),
(6253, 1078, 'Beau Vallon', 'SC.08', NULL),
(6254, 1078, 'Bel Air', 'SC.09', NULL),
(6255, 1078, 'Bel Ombre', 'SC.10', NULL),
(6256, 1078, 'Cascade', 'SC.11', NULL),
(6257, 1078, 'Glacis', 'SC.12', NULL),
(6258, 1078, 'Saint Thomas Middle Island Parish', 'SC.13', NULL),
(6259, 1078, 'Grand Anse Praslin', 'SC.14', NULL),
(6260, 1078, 'Trinity Palmetto Point Parish', 'SC.15', NULL),
(6261, 1078, 'La Riviere Anglaise', 'SC.16', NULL),
(6262, 1078, 'Mont Buxton', 'SC.17', NULL),
(6263, 1078, 'Mont Fleuri', 'SC.18', NULL),
(6264, 1078, 'Plaisance', 'SC.19', NULL),
(6265, 1078, 'Pointe Larue', 'SC.20', NULL),
(6266, 1078, 'Port Glaud', 'SC.21', NULL),
(6267, 1078, 'Saint Louis', 'SC.22', NULL),
(6268, 1078, 'Takamaka', 'SC.23', NULL),
(6269, 1078, 'Anse aux Pins', 'SC.24', NULL),
(6270, 1078, 'Inner Islands', 'SC.25', NULL),
(6271, 1078, 'English River', 'SC.26', NULL),
(6272, 1078, 'Port Glaud', 'SC.27', NULL),
(6273, 1078, 'Baie Lazare', 'SC.28', NULL),
(6274, 1078, 'Beau Vallon', 'SC.29', NULL),
(6275, 1078, 'Bel Ombre', 'SC.30', NULL),
(6276, 1078, 'Glacis', 'SC.31', NULL),
(6277, 1078, 'Grand Anse Mahe', 'SC.32', NULL),
(6278, 1078, 'Grand Anse Praslin', 'SC.33', NULL),
(6279, 1078, 'Inner Islands', 'SC.34', NULL),
(6280, 1078, 'English River', 'SC.35', NULL),
(6281, 1078, 'Mont Fleuri', 'SC.36', NULL),
(6282, 1078, 'Plaisance', 'SC.37', NULL),
(6283, 1078, 'Pointe Larue', 'SC.38', NULL),
(6284, 1078, 'Port Glaud', 'SC.39', NULL),
(6285, 1078, 'Takamaka', 'SC.40', NULL),
(6286, 1078, 'Au Cap', 'SC.41', NULL),
(6287, 1078, 'Les Mamelles', 'SC.42', NULL),
(6288, 1078, 'Roche Caiman', 'SC.43', NULL),
(6289, 1078, 'Sudan (general)', 'SD.00', NULL),
(6290, 1078, '(SU26)', 'SD.26', NULL),
(6291, 1078, 'Al Wilāyah al Wusţá', 'SD.27', NULL),
(6292, 1078, 'Al Wilāyah al Istiwā''īyah', 'SD.28', NULL),
(6293, 1078, 'Khartoum', 'SD.29', NULL),
(6294, 1078, 'Ash Shamaliyah', 'SD.30', NULL),
(6295, 1078, 'Al Wilāyah ash Sharqīyah', 'SD.31', NULL),
(6296, 1078, 'Ba?r al Ghazal Wilayat', 'SD.32', NULL),
(6297, 1078, 'Darfur Wilayat', 'SD.33', NULL),
(6298, 1078, 'Kurdufan Wilayat', 'SD.34', NULL),
(6299, 1078, 'Upper Nile', 'SD.35', NULL),
(6300, 1078, 'Red Sea', 'SD.36', NULL),
(6301, 1078, 'Lakes', 'SD.37', NULL),
(6302, 1078, 'Al Jazirah', 'SD.38', NULL),
(6303, 1078, 'Al Qadarif', 'SD.39', NULL),
(6304, 1078, 'Unity', 'SD.40', NULL),
(6305, 1078, 'White Nile', 'SD.41', NULL),
(6306, 1078, 'Blue Nile', 'SD.42', NULL),
(6307, 1078, 'Northern', 'SD.43', NULL),
(6308, 1078, 'Central Equatoria', 'SD.44', NULL),
(6309, 1078, 'Gharb al Istiwāʼīyah', 'SD.45', NULL),
(6310, 1078, 'Western Bahr al Ghazal', 'SD.46', NULL),
(6311, 1078, 'Gharb Dārfūr', 'SD.47', NULL),
(6312, 1078, 'Gharb Kurdufān', 'SD.48', NULL),
(6313, 1078, 'Janūb Dārfūr', 'SD.49', NULL),
(6314, 1078, 'Janūb Kurdufān', 'SD.50', NULL),
(6315, 1078, 'Junqalī', 'SD.51', NULL),
(6316, 1078, 'Kassalā', 'SD.52', NULL),
(6317, 1078, 'Nahr an Nīl', 'SD.53', NULL),
(6318, 1078, 'Shamāl Baḩr al Ghazāl', 'SD.54', NULL),
(6319, 1078, 'Shamāl Dārfūr', 'SD.55', NULL),
(6320, 1078, 'Shamāl Kurdufān', 'SD.56', NULL),
(6321, 1078, 'Eastern Equatoria', 'SD.57', NULL),
(6322, 1078, 'Sinnār', 'SD.58', NULL),
(6323, 1078, 'Warab', 'SD.59', NULL),
(6324, 1078, 'Sweden (general)', 'SE.00', NULL),
(6325, 1078, 'Alvsborg ', 'SE.01', NULL),
(6326, 1078, 'Blekinge County', 'SE.02', NULL),
(6327, 1078, 'Gävleborg County', 'SE.03', NULL),
(6328, 1078, 'Goteborgs Och Bohus', 'SE.04', NULL),
(6329, 1078, 'Gotland County', 'SE.05', NULL),
(6330, 1078, 'Halland County', 'SE.06', NULL),
(6331, 1078, 'Jämtland County', 'SE.07', NULL),
(6332, 1078, 'Jönköping County', 'SE.08', NULL),
(6333, 1078, 'Kalmar County', 'SE.09', NULL),
(6334, 1078, 'Dalarna County', 'SE.10', NULL),
(6335, 1078, 'Kristianstad', 'SE.11', NULL),
(6336, 1078, 'Kronoberg County', 'SE.12', NULL),
(6337, 1078, 'Malmohus', 'SE.13', NULL),
(6338, 1078, 'Norrbotten County', 'SE.14', NULL),
(6339, 1078, 'Örebro County', 'SE.15', NULL),
(6340, 1078, 'Östergötland County', 'SE.16', NULL),
(6341, 1078, 'Skaraborg', 'SE.17', NULL),
(6342, 1078, 'Södermanland County', 'SE.18', NULL),
(6343, 1078, 'Uppsala County', 'SE.21', NULL),
(6344, 1078, 'Värmland County', 'SE.22', NULL),
(6345, 1078, 'Västerbotten County', 'SE.23', NULL),
(6346, 1078, 'Västernorrland County', 'SE.24', NULL),
(6347, 1078, 'Västmanland County', 'SE.25', NULL),
(6348, 1078, 'Stockholm County', 'SE.26', NULL),
(6349, 1078, 'Skåne County', 'SE.27', NULL),
(6350, 1078, 'Västra Götaland County', 'SE.28', NULL),
(6351, 1078, 'Singapore (general)', 'SG.00', NULL),
(6352, 1078, 'Saint Helena (general)', 'SH.00', NULL),
(6353, 1078, 'Ascension', 'SH.01', NULL),
(6354, 1078, 'Saint Helena', 'SH.02', NULL),
(6355, 1078, 'Tristan da Cunha', 'SH.03', NULL),
(6356, 1078, 'Bled', 'SI.03', NULL),
(6357, 1078, 'Bohinj', 'SI.04', NULL),
(6358, 1078, 'Borovnica', 'SI.05', NULL),
(6359, 1078, 'Bovec', 'SI.06', NULL),
(6360, 1078, 'Brda', 'SI.07', NULL),
(6361, 1078, 'Brežice', 'SI.08', NULL),
(6362, 1078, 'Brezovica', 'SI.09', NULL),
(6363, 1078, 'Celje', 'SI.11', NULL),
(6364, 1078, 'Občina Cerklje na Gorenjskem', 'SI.12', NULL),
(6365, 1078, 'Cerknica', 'SI.13', NULL),
(6366, 1078, 'Cerkno', 'SI.14', NULL),
(6367, 1078, 'Črenšovci', 'SI.15', NULL),
(6368, 1078, 'Črna na Koroškem', 'SI.16', NULL),
(6369, 1078, 'Črnomelj', 'SI.17', NULL),
(6370, 1078, 'Divača', 'SI.19', NULL),
(6371, 1078, 'Dobrepolje', 'SI.20', NULL),
(6372, 1078, 'Občina Dol pri Ljubljani', 'SI.22', NULL),
(6373, 1078, 'Dornava', 'SI.24', NULL),
(6374, 1078, 'Dravograd', 'SI.25', NULL),
(6375, 1078, 'Duplek', 'SI.26', NULL),
(6376, 1078, 'Gorenja Vas-Poljane', 'SI.27', NULL),
(6377, 1078, 'Gorišnica', 'SI.28', NULL),
(6378, 1078, 'Gornja Radgona', 'SI.29', NULL),
(6379, 1078, 'Gornji Grad', 'SI.30', NULL),
(6380, 1078, 'Gornji Petrovci', 'SI.31', NULL),
(6381, 1078, 'Grosuplje', 'SI.32', NULL),
(6382, 1078, 'Hrastnik', 'SI.34', NULL),
(6383, 1078, 'Hrpelje-Kozina', 'SI.35', NULL),
(6384, 1078, 'Idrija', 'SI.36', NULL),
(6385, 1078, 'Ig', 'SI.37', NULL),
(6386, 1078, 'Ilirska Bistrica', 'SI.38', NULL),
(6387, 1078, 'Ivančna Gorica', 'SI.39', NULL),
(6388, 1078, 'Izola-Isola', 'SI.40', NULL),
(6389, 1078, 'Juršinci', 'SI.42', NULL),
(6390, 1078, 'Kanal', 'SI.44', NULL),
(6391, 1078, 'Kidričevo', 'SI.45', NULL),
(6392, 1078, 'Kobarid', 'SI.46', NULL),
(6393, 1078, 'Kobilje', 'SI.47', NULL),
(6394, 1078, 'Komen', 'SI.49', NULL),
(6395, 1078, 'Koper-Capodistria', 'SI.50', NULL),
(6396, 1078, 'Kozje', 'SI.51', NULL),
(6397, 1078, 'Kranj', 'SI.52', NULL),
(6398, 1078, 'Kranjska Gora', 'SI.53', NULL),
(6399, 1078, 'Krško', 'SI.54', NULL),
(6400, 1078, 'Kungota', 'SI.55', NULL),
(6401, 1078, 'Laško', 'SI.57', NULL),
(6402, 1078, 'Ljubljana', 'SI.61', NULL),
(6403, 1078, 'Ljubno', 'SI.62', NULL),
(6404, 1078, 'Logatec', 'SI.64', NULL),
(6405, 1078, 'Loški Potok', 'SI.66', NULL),
(6406, 1078, 'Lukovica', 'SI.68', NULL),
(6407, 1078, 'Medvode', 'SI.71', NULL),
(6408, 1078, 'Mengeš', 'SI.72', NULL),
(6409, 1078, 'Metlika', 'SI.73', NULL),
(6410, 1078, 'Mežica', 'SI.74', NULL),
(6411, 1078, 'Mislinja', 'SI.76', NULL),
(6412, 1078, 'Moravče', 'SI.77', NULL),
(6413, 1078, 'Moravske Toplice', 'SI.78', NULL),
(6414, 1078, 'Mozirje', 'SI.79', NULL),
(6415, 1078, 'Murska Sobota', 'SI.80', NULL),
(6416, 1078, 'Muta', 'SI.81', NULL),
(6417, 1078, 'Naklo', 'SI.82', NULL),
(6418, 1078, 'Nazarje', 'SI.83', NULL),
(6419, 1078, 'Nova Gorica', 'SI.84', NULL),
(6420, 1078, 'Odranci', 'SI.86', NULL),
(6421, 1078, 'Ormož', 'SI.87', NULL),
(6422, 1078, 'Osilnica', 'SI.88', NULL),
(6423, 1078, 'Pesnica', 'SI.89', NULL),
(6424, 1078, 'Pivka', 'SI.91', NULL),
(6425, 1078, 'Podčetrtek', 'SI.92', NULL),
(6426, 1078, 'Postojna', 'SI.94', NULL),
(6427, 1078, 'Puconci', 'SI.97', NULL),
(6428, 1078, 'Rače-Fram', 'SI.98', NULL),
(6429, 1078, 'Radeče', 'SI.99', NULL),
(6430, 1078, 'Radenci', 'SI.A1', NULL),
(6431, 1078, 'Radlje ob Dravi', 'SI.A2', NULL),
(6432, 1078, 'Radovljica', 'SI.A3', NULL),
(6433, 1078, 'Rogašovci', 'SI.A6', NULL),
(6434, 1078, 'Rogaška Slatina', 'SI.A7', NULL),
(6435, 1078, 'Rogatec', 'SI.A8', NULL),
(6436, 1078, 'Semič', 'SI.B1', NULL),
(6437, 1078, 'Šenčur', 'SI.B2', NULL),
(6438, 1078, 'Šentilj', 'SI.B3', NULL),
(6439, 1078, 'Šentjernej', 'SI.B4', NULL),
(6440, 1078, 'Sevnica', 'SI.B6', NULL),
(6441, 1078, 'Sežana', 'SI.B7', NULL),
(6442, 1078, 'Škocjan', 'SI.B8', NULL),
(6443, 1078, 'Škofja Loka', 'SI.B9', NULL),
(6444, 1078, 'Škofljica', 'SI.C1', NULL),
(6445, 1078, 'Slovenj Gradec', 'SI.C2', NULL),
(6446, 1078, 'Slovenska Konjice', 'SI.C4', NULL),
(6447, 1078, 'Šmarje pri Jelšah', 'SI.C5', NULL),
(6448, 1078, 'Šmartno ob Paki', 'SI.C6', NULL),
(6449, 1078, 'Šoštanj', 'SI.C7', NULL),
(6450, 1078, 'Starše', 'SI.C8', NULL),
(6451, 1078, 'Štore', 'SI.C9', NULL),
(6452, 1078, 'Sveti Jurij', 'SI.D1', NULL),
(6453, 1078, 'Tolmin', 'SI.D2', NULL),
(6454, 1078, 'Trbovlje', 'SI.D3', NULL),
(6455, 1078, 'Trebnje', 'SI.D4', NULL),
(6456, 1078, 'Tržič', 'SI.D5', NULL),
(6457, 1078, 'Turnišče', 'SI.D6', NULL),
(6458, 1078, 'Velenje', 'SI.D7', NULL),
(6459, 1078, 'Velike Lašče', 'SI.D8', NULL),
(6460, 1078, 'Vipava', 'SI.E1', NULL),
(6461, 1078, 'Vitanje', 'SI.E2', NULL),
(6462, 1078, 'Vodice', 'SI.E3', NULL),
(6463, 1078, 'Vrhnika', 'SI.E5', NULL),
(6464, 1078, 'Vuzenica', 'SI.E6', NULL),
(6465, 1078, 'Zagorje ob Savi', 'SI.E7', NULL),
(6466, 1078, 'Zavrč', 'SI.E9', NULL),
(6467, 1078, 'Železniki', 'SI.F1', NULL),
(6468, 1078, 'Žiri', 'SI.F2', NULL),
(6469, 1078, 'Zreče', 'SI.F3', NULL),
(6470, 1078, 'Benedikt', 'SI.F4', NULL),
(6471, 1078, 'Bistrica ob Sotli', 'SI.F5', NULL),
(6472, 1078, 'Bloke', 'SI.F6', NULL),
(6473, 1078, 'Braslovče', 'SI.F7', NULL),
(6474, 1078, 'Cankova', 'SI.F8', NULL),
(6475, 1078, 'Cerkvenjak', 'SI.F9', NULL),
(6476, 1078, 'Destrnik', 'SI.G1', NULL),
(6477, 1078, 'Dobje', 'SI.G2', NULL),
(6478, 1078, 'Dobrna', 'SI.G3', NULL),
(6479, 1078, 'Dobrova-Horjul-Polhov Gradec', 'SI.G4', NULL),
(6480, 1078, 'Dobrovnik-Dobronak', 'SI.G5', NULL),
(6481, 1078, 'Dolenjske Toplice', 'SI.G6', NULL),
(6482, 1078, 'Domžale', 'SI.G7', NULL),
(6483, 1078, 'Grad', 'SI.G8', NULL),
(6484, 1078, 'Hajdina', 'SI.G9', NULL),
(6485, 1078, 'Hoče-Slivnica', 'SI.H1', NULL),
(6486, 1078, 'Hodoš-Hodos', 'SI.H2', NULL),
(6487, 1078, 'Horjul', 'SI.H3', NULL),
(6488, 1078, 'Jesenice', 'SI.H4', NULL),
(6489, 1078, 'Jezersko', 'SI.H5', NULL),
(6490, 1078, 'Kamnik', 'SI.H6', NULL),
(6491, 1078, 'Kočevje', 'SI.H7', NULL),
(6492, 1078, 'Komenda', 'SI.H8', NULL),
(6493, 1078, 'Kostel', 'SI.H9', NULL),
(6494, 1078, 'Križevci', 'SI.I1', NULL),
(6495, 1078, 'Kuzma', 'SI.I2', NULL),
(6496, 1078, 'Lenart', 'SI.I3', NULL),
(6497, 1078, 'Litija', 'SI.I5', NULL),
(6498, 1078, 'Ljutomer', 'SI.I6', NULL),
(6499, 1078, 'Loška Dolina', 'SI.I7', NULL),
(6500, 1078, 'Lovrenc na Pohorju', 'SI.I8', NULL),
(6501, 1078, 'Luče', 'SI.I9', NULL),
(6502, 1078, 'Majšperk', 'SI.J1', NULL),
(6503, 1078, 'Maribor', 'SI.J2', NULL),
(6504, 1078, 'Markovci', 'SI.J3', NULL),
(6505, 1078, 'Miklavž na Dravskem Polju', 'SI.J4', NULL),
(6506, 1078, 'Miren-Kostanjevica', 'SI.J5', NULL),
(6507, 1078, 'Mirna Peč', 'SI.J6', NULL),
(6508, 1078, 'Novo Mesto', 'SI.J7', NULL),
(6509, 1078, 'Oplotnica', 'SI.J8', NULL),
(6510, 1078, 'Piran-Pirano', 'SI.J9', NULL),
(6511, 1078, 'Podlehnik', 'SI.K1', NULL),
(6512, 1078, 'Polzela', 'SI.K3', NULL),
(6513, 1078, 'Prebold', 'SI.K4', NULL),
(6514, 1078, 'Preddvor', 'SI.K5', NULL),
(6515, 1078, 'Prevalje', 'SI.K6', NULL),
(6516, 1078, 'Ptuj', 'SI.K7', NULL),
(6517, 1078, 'Ravne na Koroškem', 'SI.K8', NULL),
(6518, 1078, 'Razkrižje', 'SI.K9', NULL),
(6519, 1078, 'Ribnica', 'SI.L1', NULL),
(6520, 1078, 'Ribnica na Pohorju', 'SI.L2', NULL),
(6521, 1078, 'Ruše', 'SI.L3', NULL),
(6522, 1078, 'Selnica ob Dravi', 'SI.L5', NULL),
(6523, 1078, 'Šempeter-Vrtojba', 'SI.L6', NULL),
(6524, 1078, 'Šentjur pri Celju', 'SI.L7', NULL),
(6525, 1078, 'Slovenska Bistrica', 'SI.L8', NULL),
(6526, 1078, 'Šmartno pri Litiji', 'SI.L9', NULL),
(6527, 1078, 'Sodražica', 'SI.M1', NULL),
(6528, 1078, 'Solčava', 'SI.M2', NULL),
(6529, 1078, 'Sveta Ana', 'SI.M3', NULL),
(6530, 1078, 'Sveti Andraž v Slovenskih Goricah', 'SI.M4', NULL),
(6531, 1078, 'Tabor', 'SI.M5', NULL),
(6532, 1078, 'Trzin', 'SI.M8', NULL),
(6533, 1078, 'Velika Polana', 'SI.M9', NULL),
(6534, 1078, 'Veržej', 'SI.N1', NULL),
(6535, 1078, 'Videm', 'SI.N2', NULL),
(6536, 1078, 'Vojnik', 'SI.N3', NULL),
(6537, 1078, 'Vransko', 'SI.N4', NULL),
(6538, 1078, 'Žalec', 'SI.N5', NULL),
(6539, 1078, 'Žetale', 'SI.N6', NULL),
(6540, 1078, 'Žirovnica', 'SI.N7', NULL),
(6541, 1078, 'Žužemberk', 'SI.N8', NULL),
(6542, 1078, 'Slovakia (general)', 'SK.00', NULL),
(6543, 1078, 'Banskobystrický', 'SK.01', NULL),
(6544, 1078, 'Bratislavský', 'SK.02', NULL),
(6545, 1078, 'Košický', 'SK.03', NULL),
(6546, 1078, 'Nitriansky', 'SK.04', NULL),
(6547, 1078, 'Prešovský', 'SK.05', NULL),
(6548, 1078, 'Trenčiansky', 'SK.06', NULL);
INSERT INTO `annu_meta_ontologie` (`amo_id_ontologie`, `amo_ce_parent`, `amo_nom`, `amo_abreviation`, `amo_description`) VALUES
(6549, 1078, 'Trnavský', 'SK.07', NULL),
(6550, 1078, 'Žilinský', 'SK.08', NULL),
(6551, 1078, 'Sierra Leone (general)', 'SL.00', NULL),
(6552, 1078, 'Eastern Province', 'SL.01', NULL),
(6553, 1078, 'Northern Province', 'SL.02', NULL),
(6554, 1078, 'Southern Province', 'SL.03', NULL),
(6555, 1078, 'Western Area', 'SL.04', NULL),
(6556, 1078, 'San Marino (general)', 'SM.00', NULL),
(6557, 1078, 'Acquaviva', 'SM.01', NULL),
(6558, 1078, 'Chiesanuova', 'SM.02', NULL),
(6559, 1078, 'Domagnano', 'SM.03', NULL),
(6560, 1078, 'Faetano', 'SM.04', NULL),
(6561, 1078, 'Fiorentino', 'SM.05', NULL),
(6562, 1078, 'Borgo Maggiore', 'SM.06', NULL),
(6563, 1078, 'San Marino', 'SM.07', NULL),
(6564, 1078, 'Montegiardino', 'SM.08', NULL),
(6565, 1078, 'Serravalle', 'SM.09', NULL),
(6566, 1078, 'Senegal (general)', 'SN.00', NULL),
(6567, 1078, 'Dakar', 'SN.01', NULL),
(6568, 1078, 'Diourbel', 'SN.03', NULL),
(6569, 1078, 'Saint-Louis', 'SN.04', NULL),
(6570, 1078, 'Tambacounda', 'SN.05', NULL),
(6571, 1078, 'Thiès', 'SN.07', NULL),
(6572, 1078, 'Louga', 'SN.08', NULL),
(6573, 1078, 'Fatick', 'SN.09', NULL),
(6574, 1078, 'Kaolack', 'SN.10', NULL),
(6575, 1078, 'Kolda Region', 'SN.11', NULL),
(6576, 1078, 'Ziguinchor', 'SN.12', NULL),
(6577, 1078, 'Louga', 'SN.13', NULL),
(6578, 1078, 'Saint-Louis', 'SN.14', NULL),
(6579, 1078, 'Matam', 'SN.15', NULL),
(6580, 1078, 'Somalia (general)', 'SO.00', NULL),
(6581, 1078, 'Bakool', 'SO.01', NULL),
(6582, 1078, 'Banaadir', 'SO.02', NULL),
(6583, 1078, 'Bari', 'SO.03', NULL),
(6584, 1078, 'Bay', 'SO.04', NULL),
(6585, 1078, 'Galguduud', 'SO.05', NULL),
(6586, 1078, 'Gedo', 'SO.06', NULL),
(6587, 1078, 'Hiiraan', 'SO.07', NULL),
(6588, 1078, 'Middle Juba', 'SO.08', NULL),
(6589, 1078, 'Lower Juba', 'SO.09', NULL),
(6590, 1078, 'Mudug', 'SO.10', NULL),
(6591, 1078, 'Sanaag', 'SO.12', NULL),
(6592, 1078, 'Middle Shabele', 'SO.13', NULL),
(6593, 1078, 'Shabeellaha Hoose', 'SO.14', NULL),
(6594, 1078, '(SO17)', 'SO.17', NULL),
(6595, 1078, 'Nugaal', 'SO.18', NULL),
(6596, 1078, 'Togdheer', 'SO.19', NULL),
(6597, 1078, 'Woqooyi Galbeed', 'SO.20', NULL),
(6598, 1078, 'Awdal', 'SO.21', NULL),
(6599, 1078, 'Sool', 'SO.22', NULL),
(6600, 1078, 'Suriname (general)', 'SR.00', NULL),
(6601, 1078, 'Brokopondo', 'SR.10', NULL),
(6602, 1078, 'Commewijne', 'SR.11', NULL),
(6603, 1078, 'Coronie', 'SR.12', NULL),
(6604, 1078, 'Marowijne', 'SR.13', NULL),
(6605, 1078, 'Nickerie', 'SR.14', NULL),
(6606, 1078, 'Para', 'SR.15', NULL),
(6607, 1078, 'Paramaribo', 'SR.16', NULL),
(6608, 1078, 'Saramacca', 'SR.17', NULL),
(6609, 1078, 'Sipaliwini', 'SR.18', NULL),
(6610, 1078, 'Wanica', 'SR.19', NULL),
(6611, 1078, 'Príncipe', 'ST.00', NULL),
(6612, 1078, 'Príncipe', 'ST.01', NULL),
(6613, 1078, 'São Tomé', 'ST.02', NULL),
(6614, 1078, 'El Salvador (general)', 'SV.00', NULL),
(6615, 1078, 'Ahuachapán', 'SV.01', NULL),
(6616, 1078, 'Cabañas', 'SV.02', NULL),
(6617, 1078, 'Chalatenango', 'SV.03', NULL),
(6618, 1078, 'Cuscatlán', 'SV.04', NULL),
(6619, 1078, 'La Libertad', 'SV.05', NULL),
(6620, 1078, 'La Paz', 'SV.06', NULL),
(6621, 1078, 'La Unión', 'SV.07', NULL),
(6622, 1078, 'Morazán', 'SV.08', NULL),
(6623, 1078, 'San Miguel', 'SV.09', NULL),
(6624, 1078, 'San Salvador', 'SV.10', NULL),
(6625, 1078, 'Santa Ana', 'SV.11', NULL),
(6626, 1078, 'San Vicente', 'SV.12', NULL),
(6627, 1078, 'Sonsonate', 'SV.13', NULL),
(6628, 1078, 'Usulután', 'SV.14', NULL),
(6629, 1078, 'Syria (general)', 'SY.00', NULL),
(6630, 1078, 'Al-Hasakah', 'SY.01', NULL),
(6631, 1078, 'Latakia', 'SY.02', NULL),
(6632, 1078, 'Quneitra', 'SY.03', NULL),
(6633, 1078, 'Ar-Raqqah', 'SY.04', NULL),
(6634, 1078, 'As-Suwayda', 'SY.05', NULL),
(6635, 1078, 'Daraa', 'SY.06', NULL),
(6636, 1078, 'Deir ez-Zor', 'SY.07', NULL),
(6637, 1078, 'Rif-dimashq', 'SY.08', NULL),
(6638, 1078, 'Aleppo', 'SY.09', NULL),
(6639, 1078, 'Hama Governorate', 'SY.10', NULL),
(6640, 1078, 'Homs', 'SY.11', NULL),
(6641, 1078, 'Idlib', 'SY.12', NULL),
(6642, 1078, 'Damascus City', 'SY.13', NULL),
(6643, 1078, 'Tartus', 'SY.14', NULL),
(6644, 1078, 'Swaziland (general)', 'SZ.00', NULL),
(6645, 1078, 'Hhohho', 'SZ.01', NULL),
(6646, 1078, 'Lubombo', 'SZ.02', NULL),
(6647, 1078, 'Manzini', 'SZ.03', NULL),
(6648, 1078, 'Shiselweni', 'SZ.04', NULL),
(6649, 1078, 'Turks and Caicos Islands (general)', 'TC.00', NULL),
(6650, 1078, 'Chad (general)', 'TD.00', NULL),
(6651, 1078, 'Batha', 'TD.01', NULL),
(6652, 1078, 'Biltine', 'TD.02', NULL),
(6653, 1078, 'Borkou-Ennedi-Tibesti', 'TD.03', NULL),
(6654, 1078, 'Chari-Baguirmi', 'TD.04', NULL),
(6655, 1078, 'Guéra', 'TD.05', NULL),
(6656, 1078, 'Kanem', 'TD.06', NULL),
(6657, 1078, 'Lac', 'TD.07', NULL),
(6658, 1078, 'Logone Occidental', 'TD.08', NULL),
(6659, 1078, 'Logone Oriental', 'TD.09', NULL),
(6660, 1078, 'Mayo-Kébbi', 'TD.10', NULL),
(6661, 1078, 'Moyen-Chari', 'TD.11', NULL),
(6662, 1078, 'Ouaddaï', 'TD.12', NULL),
(6663, 1078, 'Salamat', 'TD.13', NULL),
(6664, 1078, 'Tandjilé', 'TD.14', NULL),
(6665, 1078, 'District de Saint-Paul-et-Amsterdam', 'TF.01', NULL),
(6666, 1078, 'District de Crozet', 'TF.02', NULL),
(6667, 1078, 'District de Kerguelen', 'TF.03', NULL),
(6668, 1078, 'District de Terre Adélie', 'TF.04', NULL),
(6669, 1078, 'District des Îles Éparses', 'TF.05', NULL),
(6670, 1078, 'Togo (general)', 'TG.00', NULL),
(6671, 1078, 'Amlame', 'TG.01', NULL),
(6672, 1078, 'Aneho', 'TG.02', NULL),
(6673, 1078, 'Atakpame', 'TG.03', NULL),
(6674, 1078, 'Bafilo', 'TG.04', NULL),
(6675, 1078, 'Bassar', 'TG.05', NULL),
(6676, 1078, 'Dapaong', 'TG.06', NULL),
(6677, 1078, 'Kante', 'TG.07', NULL),
(6678, 1078, 'Klouto', 'TG.08', NULL),
(6679, 1078, 'Lama-Kara', 'TG.09', NULL),
(6680, 1078, 'Lome', 'TG.10', NULL),
(6681, 1078, 'Mango', 'TG.11', NULL),
(6682, 1078, 'Niamtougou', 'TG.12', NULL),
(6683, 1078, 'Notse', 'TG.13', NULL),
(6684, 1078, 'Kpagouda', 'TG.14', NULL),
(6685, 1078, 'Badou', 'TG.15', NULL),
(6686, 1078, 'Sotouboua', 'TG.16', NULL),
(6687, 1078, 'Tabligbo', 'TG.17', NULL),
(6688, 1078, 'Tsevie', 'TG.18', NULL),
(6689, 1078, 'Tchamba', 'TG.19', NULL),
(6690, 1078, 'Tchaoudjo', 'TG.20', NULL),
(6691, 1078, 'Vogan', 'TG.21', NULL),
(6692, 1078, 'Centrale', 'TG.22', NULL),
(6693, 1078, 'Kara', 'TG.23', NULL),
(6694, 1078, 'Maritime', 'TG.24', NULL),
(6695, 1078, 'Plateaux', 'TG.25', NULL),
(6696, 1078, 'Savanes', 'TG.26', NULL),
(6697, 1078, 'Thailand (general)', 'TH.00', NULL),
(6698, 1078, 'Mae Hong Son', 'TH.01', NULL),
(6699, 1078, 'Chiang Mai', 'TH.02', NULL),
(6700, 1078, 'Chiang Rai', 'TH.03', NULL),
(6701, 1078, 'Nan', 'TH.04', NULL),
(6702, 1078, 'Lamphun', 'TH.05', NULL),
(6703, 1078, 'Lampang', 'TH.06', NULL),
(6704, 1078, 'Phrae', 'TH.07', NULL),
(6705, 1078, 'Tak', 'TH.08', NULL),
(6706, 1078, 'Sukhothai', 'TH.09', NULL),
(6707, 1078, 'Uttaradit', 'TH.10', NULL),
(6708, 1078, 'Kamphaeng Phet', 'TH.11', NULL),
(6709, 1078, 'Phitsanulok', 'TH.12', NULL),
(6710, 1078, 'Phichit', 'TH.13', NULL),
(6711, 1078, 'Phetchabun', 'TH.14', NULL),
(6712, 1078, 'Uthai Thani', 'TH.15', NULL),
(6713, 1078, 'Nakhon Sawan', 'TH.16', NULL),
(6714, 1078, 'Nong Khai', 'TH.17', NULL),
(6715, 1078, 'Loei', 'TH.18', NULL),
(6716, 1078, 'Sakon Nakhon', 'TH.20', NULL),
(6717, 1078, 'Nakhon Phanom', 'TH.21', NULL),
(6718, 1078, 'Khon Kaen', 'TH.22', NULL),
(6719, 1078, 'Kalasin', 'TH.23', NULL),
(6720, 1078, 'Maha Sarakham', 'TH.24', NULL),
(6721, 1078, 'Roi Et', 'TH.25', NULL),
(6722, 1078, 'Chaiyaphum', 'TH.26', NULL),
(6723, 1078, 'Nakhon Ratchasima', 'TH.27', NULL),
(6724, 1078, 'Buriram', 'TH.28', NULL),
(6725, 1078, 'Surin', 'TH.29', NULL),
(6726, 1078, 'Sisaket', 'TH.30', NULL),
(6727, 1078, 'Narathiwat', 'TH.31', NULL),
(6728, 1078, 'Chai Nat', 'TH.32', NULL),
(6729, 1078, 'Sing Buri', 'TH.33', NULL),
(6730, 1078, 'Lop Buri', 'TH.34', NULL),
(6731, 1078, 'Ang Thong', 'TH.35', NULL),
(6732, 1078, 'Phra Nakhon Si Ayutthaya', 'TH.36', NULL),
(6733, 1078, 'Sara Buri', 'TH.37', NULL),
(6734, 1078, 'Nonthaburi', 'TH.38', NULL),
(6735, 1078, 'Pathum Thani', 'TH.39', NULL),
(6736, 1078, 'Phayao', 'TH.41', NULL),
(6737, 1078, 'Samut Prakan', 'TH.42', NULL),
(6738, 1078, 'Nakhon Nayok', 'TH.43', NULL),
(6739, 1078, 'Chachoengsao', 'TH.44', NULL),
(6740, 1078, 'Chon Buri', 'TH.46', NULL),
(6741, 1078, 'Rayong', 'TH.47', NULL),
(6742, 1078, 'Chanthaburi', 'TH.48', NULL),
(6743, 1078, 'Trat', 'TH.49', NULL),
(6744, 1078, 'Kanchanaburi', 'TH.50', NULL),
(6745, 1078, 'Suphan Buri', 'TH.51', NULL),
(6746, 1078, 'Ratchaburi', 'TH.52', NULL),
(6747, 1078, 'Nakhon Pathom', 'TH.53', NULL),
(6748, 1078, 'Samut Songkhram', 'TH.54', NULL),
(6749, 1078, 'Samut Sakhon', 'TH.55', NULL),
(6750, 1078, 'Phetchaburi', 'TH.56', NULL),
(6751, 1078, 'Prachuap Khiri Khan', 'TH.57', NULL),
(6752, 1078, 'Chumphon', 'TH.58', NULL),
(6753, 1078, 'Ranong', 'TH.59', NULL),
(6754, 1078, 'Surat Thani', 'TH.60', NULL),
(6755, 1078, 'Phangnga', 'TH.61', NULL),
(6756, 1078, 'Phuket', 'TH.62', NULL),
(6757, 1078, 'Krabi', 'TH.63', NULL),
(6758, 1078, 'Nakhon Si Thammarat', 'TH.64', NULL),
(6759, 1078, 'Trang', 'TH.65', NULL),
(6760, 1078, 'Phatthalung', 'TH.66', NULL),
(6761, 1078, 'Satun', 'TH.67', NULL),
(6762, 1078, 'Songkhla', 'TH.68', NULL),
(6763, 1078, 'Pattani', 'TH.69', NULL),
(6764, 1078, 'Yala', 'TH.70', NULL),
(6765, 1078, 'Yasothon', 'TH.72', NULL),
(6766, 1078, 'Nakhon Phanom', 'TH.73', NULL),
(6767, 1078, 'Prachin Buri', 'TH.74', NULL),
(6768, 1078, 'Ubon Ratchathani', 'TH.75', NULL),
(6769, 1078, 'Udon Thani', 'TH.76', NULL),
(6770, 1078, 'Amnat Charoen', 'TH.77', NULL),
(6771, 1078, 'Mukdahan', 'TH.78', NULL),
(6772, 1078, 'Nong Bua Lamphu', 'TH.79', NULL),
(6773, 1078, 'Sa Kaeo', 'TH.80', NULL),
(6774, 1078, 'Kulyabskaya Oblast''', 'TJ.00', NULL),
(6775, 1078, 'Gorno-Badakhshan', 'TJ.01', NULL),
(6776, 1078, 'Khatlon', 'TJ.02', NULL),
(6777, 1078, 'Leninobod', 'TJ.03', NULL),
(6778, 1078, 'Region of Republican Subordination', 'TJ.RR', NULL),
(6779, 1078, 'Tokelau (general)', 'TK.00', NULL),
(6780, 1078, 'Bobonaro', 'TL.00', NULL),
(6781, 1078, 'Turkmenistan (general)', 'TM.00', NULL),
(6782, 1078, 'Ahal', 'TM.01', NULL),
(6783, 1078, 'Balkan', 'TM.02', NULL),
(6784, 1078, 'Daşoguz', 'TM.03', NULL),
(6785, 1078, 'Lebap', 'TM.04', NULL),
(6786, 1078, 'Mary', 'TM.05', NULL),
(6787, 1078, 'Tunis al Janubiyah Wilayat', 'TN.00', NULL),
(6788, 1078, 'Al Qaşrayn', 'TN.02', NULL),
(6789, 1078, 'Al Qayrawān', 'TN.03', NULL),
(6790, 1078, 'Jundūbah', 'TN.06', NULL),
(6791, 1078, 'Kef', 'TN.14', NULL),
(6792, 1078, 'Al Mahdīyah', 'TN.15', NULL),
(6793, 1078, 'Al Munastīr', 'TN.16', NULL),
(6794, 1078, 'Bājah', 'TN.17', NULL),
(6795, 1078, 'Banzart', 'TN.18', NULL),
(6796, 1078, 'Nābul', 'TN.19', NULL),
(6797, 1078, 'Silyānah', 'TN.22', NULL),
(6798, 1078, 'Sūsah', 'TN.23', NULL),
(6799, 1078, '(TS26)', 'TN.26', NULL),
(6800, 1078, 'Bin ‘Arūs', 'TN.27', NULL),
(6801, 1078, 'Madanīn', 'TN.28', NULL),
(6802, 1078, 'Qābis', 'TN.29', NULL),
(6803, 1078, 'Qafşah', 'TN.30', NULL),
(6804, 1078, 'Qibilī', 'TN.31', NULL),
(6805, 1078, 'Şafāqis', 'TN.32', NULL),
(6806, 1078, 'Sīdī Bū Zayd', 'TN.33', NULL),
(6807, 1078, 'Taţāwīn', 'TN.34', NULL),
(6808, 1078, 'Tawzar', 'TN.35', NULL),
(6809, 1078, 'Tūnis', 'TN.36', NULL),
(6810, 1078, 'Zaghwān', 'TN.37', NULL),
(6811, 1078, 'Ariana', 'TN.38', NULL),
(6812, 1078, 'Manouba', 'TN.39', NULL),
(6813, 1078, 'Tonga (general)', 'TO.00', NULL),
(6814, 1078, 'Ha‘apai', 'TO.01', NULL),
(6815, 1078, 'Tongatapu', 'TO.02', NULL),
(6816, 1078, 'Vava‘u', 'TO.03', NULL),
(6817, 1078, 'Turkey (general)', 'TR.00', NULL),
(6818, 1078, 'Adana Province', 'TR.01', NULL),
(6819, 1078, 'Adıyaman', 'TR.02', NULL),
(6820, 1078, 'Afyonkarahisar', 'TR.03', NULL),
(6821, 1078, 'Ağrı Province', 'TR.04', NULL),
(6822, 1078, 'Amasya Province', 'TR.05', NULL),
(6823, 1078, 'Antalya Province', 'TR.07', NULL),
(6824, 1078, 'Artvin Province', 'TR.08', NULL),
(6825, 1078, 'Aydın Province', 'TR.09', NULL),
(6826, 1078, 'Balıkesir Province', 'TR.10', NULL),
(6827, 1078, 'Bilecik Province', 'TR.11', NULL),
(6828, 1078, 'Bingöl Province', 'TR.12', NULL),
(6829, 1078, 'Bitlis Province', 'TR.13', NULL),
(6830, 1078, 'Bolu Province', 'TR.14', NULL),
(6831, 1078, 'Burdur Province', 'TR.15', NULL),
(6832, 1078, 'Bursa', 'TR.16', NULL),
(6833, 1078, 'Çanakkale Province', 'TR.17', NULL),
(6834, 1078, 'Çorum Province', 'TR.19', NULL),
(6835, 1078, 'Denizli Province', 'TR.20', NULL),
(6836, 1078, 'Diyarbakır', 'TR.21', NULL),
(6837, 1078, 'Edirne Province', 'TR.22', NULL),
(6838, 1078, 'Elazığ', 'TR.23', NULL),
(6839, 1078, 'Erzincan Province', 'TR.24', NULL),
(6840, 1078, 'Erzurum Province', 'TR.25', NULL),
(6841, 1078, 'Giresun Province', 'TR.28', NULL),
(6842, 1078, 'Hatay Province', 'TR.31', NULL),
(6843, 1078, 'Mersin Province', 'TR.32', NULL),
(6844, 1078, 'Isparta Province', 'TR.33', NULL),
(6845, 1078, 'Istanbul', 'TR.34', NULL),
(6846, 1078, 'İzmir', 'TR.35', NULL),
(6847, 1078, 'Kastamonu Province', 'TR.37', NULL),
(6848, 1078, 'Kayseri Province', 'TR.38', NULL),
(6849, 1078, 'Kırklareli Province', 'TR.39', NULL),
(6850, 1078, 'Kırşehir Province', 'TR.40', NULL),
(6851, 1078, 'Kocaeli Province', 'TR.41', NULL),
(6852, 1078, 'Kütahya Province', 'TR.43', NULL),
(6853, 1078, 'Malatya Province', 'TR.44', NULL),
(6854, 1078, 'Manisa Province', 'TR.45', NULL),
(6855, 1078, 'Kahramanmaraş Province', 'TR.46', NULL),
(6856, 1078, 'Muğla Province', 'TR.48', NULL),
(6857, 1078, 'Muş Province', 'TR.49', NULL),
(6858, 1078, 'Nevşehir', 'TR.50', NULL),
(6859, 1078, 'Ordu', 'TR.52', NULL),
(6860, 1078, 'Rize', 'TR.53', NULL),
(6861, 1078, 'Sakarya Province', 'TR.54', NULL),
(6862, 1078, 'Samsun Province', 'TR.55', NULL),
(6863, 1078, 'Sinop Province', 'TR.57', NULL),
(6864, 1078, 'Sivas Province', 'TR.58', NULL),
(6865, 1078, 'Tekirdağ Province', 'TR.59', NULL),
(6866, 1078, 'Tokat', 'TR.60', NULL),
(6867, 1078, 'Trabzon Province', 'TR.61', NULL),
(6868, 1078, 'Tunceli Province', 'TR.62', NULL),
(6869, 1078, 'Şanlıurfa Province', 'TR.63', NULL),
(6870, 1078, 'Uşak Province', 'TR.64', NULL),
(6871, 1078, 'Van Province', 'TR.65', NULL),
(6872, 1078, 'Yozgat Province', 'TR.66', NULL),
(6873, 1078, 'Ankara Province', 'TR.68', NULL),
(6874, 1078, 'Gümüşhane', 'TR.69', NULL),
(6875, 1078, 'Hakkâri Province', 'TR.70', NULL),
(6876, 1078, 'Konya Province', 'TR.71', NULL),
(6877, 1078, 'Mardin Province', 'TR.72', NULL),
(6878, 1078, 'Niğde', 'TR.73', NULL),
(6879, 1078, 'Siirt Province', 'TR.74', NULL),
(6880, 1078, 'Aksaray Province', 'TR.75', NULL),
(6881, 1078, 'Batman Province', 'TR.76', NULL),
(6882, 1078, 'Bayburt', 'TR.77', NULL),
(6883, 1078, 'Karaman Province', 'TR.78', NULL),
(6884, 1078, 'Kırıkkale Province', 'TR.79', NULL),
(6885, 1078, 'Şırnak Province', 'TR.80', NULL),
(6886, 1078, 'Çankırı Province', 'TR.82', NULL),
(6887, 1078, 'Gaziantep Province', 'TR.83', NULL),
(6888, 1078, 'Kars', 'TR.84', NULL),
(6889, 1078, 'Zonguldak', 'TR.85', NULL),
(6890, 1078, 'Ardahan Province', 'TR.86', NULL),
(6891, 1078, 'Bartın Province', 'TR.87', NULL),
(6892, 1078, 'Iğdır Province', 'TR.88', NULL),
(6893, 1078, 'Karabük', 'TR.89', NULL),
(6894, 1078, 'Kilis Province', 'TR.90', NULL),
(6895, 1078, 'Osmaniye Province', 'TR.91', NULL),
(6896, 1078, 'Yalova Province', 'TR.92', NULL),
(6897, 1078, 'Düzce', 'TR.93', NULL),
(6898, 1078, 'Trinidad and Tobago (general)', 'TT.00', NULL),
(6899, 1078, 'Arima', 'TT.01', NULL),
(6900, 1078, 'Caroni', 'TT.02', NULL),
(6901, 1078, 'Mayaro', 'TT.03', NULL),
(6902, 1078, 'Nariva', 'TT.04', NULL),
(6903, 1078, 'Port-of-Spain', 'TT.05', NULL),
(6904, 1078, 'Saint Andrew', 'TT.06', NULL),
(6905, 1078, 'Saint David', 'TT.07', NULL),
(6906, 1078, 'Saint George', 'TT.08', NULL),
(6907, 1078, 'Saint Patrick', 'TT.09', NULL),
(6908, 1078, 'San Fernando', 'TT.10', NULL),
(6909, 1078, 'Tobago', 'TT.11', NULL),
(6910, 1078, 'Victoria', 'TT.12', NULL),
(6911, 1078, 'Tuvalu (general)', 'TV.00', NULL),
(6912, 1078, 'Taiwan (general)', 'TW.00', NULL),
(6913, 1078, 'Fu-chien', 'TW.01', NULL),
(6914, 1078, 'T''ai-pei', 'TW.03', NULL),
(6915, 1078, 'Tanzania (general)', 'TZ.00', NULL),
(6916, 1078, 'Arusha', 'TZ.01', NULL),
(6917, 1078, 'Pwani', 'TZ.02', NULL),
(6918, 1078, 'Dodoma', 'TZ.03', NULL),
(6919, 1078, 'Iringa', 'TZ.04', NULL),
(6920, 1078, 'Kigoma', 'TZ.05', NULL),
(6921, 1078, 'Kilimanjaro', 'TZ.06', NULL),
(6922, 1078, 'Lindi', 'TZ.07', NULL),
(6923, 1078, 'Mara', 'TZ.08', NULL),
(6924, 1078, 'Mbeya', 'TZ.09', NULL),
(6925, 1078, 'Morogoro', 'TZ.10', NULL),
(6926, 1078, 'Mtwara', 'TZ.11', NULL),
(6927, 1078, 'Mwanza', 'TZ.12', NULL),
(6928, 1078, 'Pemba North', 'TZ.13', NULL),
(6929, 1078, 'Ruvuma', 'TZ.14', NULL),
(6930, 1078, 'Shinyanga', 'TZ.15', NULL),
(6931, 1078, 'Singida', 'TZ.16', NULL),
(6932, 1078, 'Tabora', 'TZ.17', NULL),
(6933, 1078, 'Tanga', 'TZ.18', NULL),
(6934, 1078, 'Kagera', 'TZ.19', NULL),
(6935, 1078, 'Pemba South', 'TZ.20', NULL),
(6936, 1078, 'Zanzibar Central/South', 'TZ.21', NULL),
(6937, 1078, 'Zanzibar North', 'TZ.22', NULL),
(6938, 1078, 'Dar es Salaam', 'TZ.23', NULL),
(6939, 1078, 'Rukwa', 'TZ.24', NULL),
(6940, 1078, 'Zanzibar Urban/West', 'TZ.25', NULL),
(6941, 1078, 'Arusha', 'TZ.26', NULL),
(6942, 1078, 'Manyara', 'TZ.27', NULL),
(6943, 1078, 'Ukraine (general)', 'UA.00', NULL),
(6944, 1078, 'Cherkas''ka Oblast''', 'UA.01', NULL),
(6945, 1078, 'Chernihivs''ka Oblast''', 'UA.02', NULL),
(6946, 1078, 'Chernivets''ka Oblast''', 'UA.03', NULL),
(6947, 1078, 'Dnipropetrovs''ka Oblast''', 'UA.04', NULL),
(6948, 1078, 'Donets''ka Oblast''', 'UA.05', NULL),
(6949, 1078, 'Ivano-Frankivs''ka Oblast''', 'UA.06', NULL),
(6950, 1078, 'Kharkivs''ka Oblast''', 'UA.07', NULL),
(6951, 1078, 'Kherson Oblast', 'UA.08', NULL),
(6952, 1078, 'Khmel''nyts''ka Oblast''', 'UA.09', NULL),
(6953, 1078, 'Kirovohrads''ka Oblast''', 'UA.10', NULL),
(6954, 1078, 'Avtonomna Respublika Krym', 'UA.11', NULL),
(6955, 1078, 'Misto Kyyiv', 'UA.12', NULL),
(6956, 1078, 'Kiev Oblast', 'UA.13', NULL),
(6957, 1078, 'Luhans''ka Oblast''', 'UA.14', NULL),
(6958, 1078, 'L''vivs''ka Oblast''', 'UA.15', NULL),
(6959, 1078, 'Mykolayivs''ka Oblast''', 'UA.16', NULL),
(6960, 1078, 'Odessa Oblast', 'UA.17', NULL),
(6961, 1078, 'Poltava Oblast', 'UA.18', NULL),
(6962, 1078, 'Rivnens''ka Oblast''', 'UA.19', NULL),
(6963, 1078, 'Misto Sevastopol', 'UA.20', NULL),
(6964, 1078, 'Sumy Oblast', 'UA.21', NULL),
(6965, 1078, 'Ternopil''s''ka Oblast''', 'UA.22', NULL),
(6966, 1078, 'Vinnyts''ka Oblast''', 'UA.23', NULL),
(6967, 1078, 'Volyns''ka Oblast''', 'UA.24', NULL),
(6968, 1078, 'Zakarpats''ka Oblast''', 'UA.25', NULL),
(6969, 1078, 'Zaporiz''ka Oblast''', 'UA.26', NULL),
(6970, 1078, 'Zhytomyrs''ka Oblast''', 'UA.27', NULL),
(6971, 1078, 'Busoga Province', 'UG.00', NULL),
(6972, 1078, 'Kampala District', 'UG.18', NULL),
(6973, 1078, 'Apac', 'UG.26', NULL),
(6974, 1078, 'Arua', 'UG.27', NULL),
(6975, 1078, 'Bundibugyo', 'UG.28', NULL),
(6976, 1078, 'Bushenyi', 'UG.29', NULL),
(6977, 1078, 'Gulu', 'UG.30', NULL),
(6978, 1078, 'Hoima', 'UG.31', NULL),
(6979, 1078, 'Iganga', 'UG.32', NULL),
(6980, 1078, 'Jinja', 'UG.33', NULL),
(6981, 1078, 'Kabale', 'UG.34', NULL),
(6982, 1078, 'Kabarole', 'UG.35', NULL),
(6983, 1078, 'Kalangala', 'UG.36', NULL),
(6984, 1078, 'Kampala', 'UG.37', NULL),
(6985, 1078, 'Kamuli', 'UG.38', NULL),
(6986, 1078, 'Kapchorwa', 'UG.39', NULL),
(6987, 1078, 'Kasese', 'UG.40', NULL),
(6988, 1078, 'Kibale', 'UG.41', NULL),
(6989, 1078, 'Kiboga', 'UG.42', NULL),
(6990, 1078, 'Kisoro', 'UG.43', NULL),
(6991, 1078, 'Kitgum', 'UG.44', NULL),
(6992, 1078, 'Kotido', 'UG.45', NULL),
(6993, 1078, 'Kumi', 'UG.46', NULL),
(6994, 1078, 'Lira', 'UG.47', NULL),
(6995, 1078, 'Luwero', 'UG.48', NULL),
(6996, 1078, 'Masaka', 'UG.49', NULL),
(6997, 1078, 'Masindi', 'UG.50', NULL),
(6998, 1078, 'Mbale', 'UG.51', NULL),
(6999, 1078, 'Mbarara', 'UG.52', NULL),
(7000, 1078, 'Moroto', 'UG.53', NULL),
(7001, 1078, 'Moyo', 'UG.54', NULL),
(7002, 1078, 'Mpigi', 'UG.55', NULL),
(7003, 1078, 'Mubende', 'UG.56', NULL),
(7004, 1078, 'Mukuno', 'UG.57', NULL),
(7005, 1078, 'Nebbi', 'UG.58', NULL),
(7006, 1078, 'Ntungamo', 'UG.59', NULL),
(7007, 1078, 'Pallisa', 'UG.60', NULL),
(7008, 1078, 'Rakai', 'UG.61', NULL),
(7009, 1078, 'Rukungiri', 'UG.62', NULL),
(7010, 1078, 'Soroti', 'UG.63', NULL),
(7011, 1078, 'Tororo', 'UG.64', NULL),
(7012, 1078, 'Adjumani', 'UG.65', NULL),
(7013, 1078, 'Bugiri', 'UG.66', NULL),
(7014, 1078, 'Busia', 'UG.67', NULL),
(7015, 1078, 'Iganga', 'UG.68', NULL),
(7016, 1078, 'Katakwi', 'UG.69', NULL),
(7017, 1078, 'Luwero', 'UG.70', NULL),
(7018, 1078, 'Masaka', 'UG.71', NULL),
(7019, 1078, 'Moyo', 'UG.72', NULL),
(7020, 1078, 'Nakasongola', 'UG.73', NULL),
(7021, 1078, 'Sembabule', 'UG.74', NULL),
(7022, 1078, 'Soroti', 'UG.75', NULL),
(7023, 1078, 'Tororo', 'UG.76', NULL),
(7024, 1078, 'Arua', 'UG.77', NULL),
(7025, 1078, 'Iganga', 'UG.78', NULL),
(7026, 1078, 'Kabarole', 'UG.79', NULL),
(7027, 1078, 'Kaberamaido', 'UG.80', NULL),
(7028, 1078, 'Kamwenge', 'UG.81', NULL),
(7029, 1078, 'Kanungu', 'UG.82', NULL),
(7030, 1078, 'Kayunga', 'UG.83', NULL),
(7031, 1078, 'Kitgum', 'UG.84', NULL),
(7032, 1078, 'Kyenjojo', 'UG.85', NULL),
(7033, 1078, 'Mayuge', 'UG.86', NULL),
(7034, 1078, 'Mbale', 'UG.87', NULL),
(7035, 1078, 'Moroto', 'UG.88', NULL),
(7036, 1078, 'Mpigi', 'UG.89', NULL),
(7037, 1078, 'Mukono', 'UG.90', NULL),
(7038, 1078, 'Nakapiripirit', 'UG.91', NULL),
(7039, 1078, 'Pader', 'UG.92', NULL),
(7040, 1078, 'Rukungiri', 'UG.93', NULL),
(7041, 1078, 'Sironko', 'UG.94', NULL),
(7042, 1078, 'Soroti', 'UG.95', NULL),
(7043, 1078, 'Wakiso', 'UG.96', NULL),
(7044, 1078, 'Yumbe', 'UG.97', NULL),
(7045, 1078, 'United States (general)', 'US.00', NULL),
(7046, 1078, 'Alaska', 'US.AK', NULL),
(7047, 1078, 'Alabama', 'US.AL', NULL),
(7048, 1078, 'Arkansas', 'US.AR', NULL),
(7049, 1078, 'Arizona', 'US.AZ', NULL),
(7050, 1078, 'California', 'US.CA', NULL),
(7051, 1078, 'Colorado', 'US.CO', NULL),
(7052, 1078, 'Connecticut', 'US.CT', NULL),
(7053, 1078, 'Washington, D.C.', 'US.DC', NULL),
(7054, 1078, 'Delaware', 'US.DE', NULL),
(7055, 1078, 'Florida', 'US.FL', NULL),
(7056, 1078, 'Georgia', 'US.GA', NULL),
(7057, 1078, 'Hawaii', 'US.HI', NULL),
(7058, 1078, 'Iowa', 'US.IA', NULL),
(7059, 1078, 'Idaho', 'US.ID', NULL),
(7060, 1078, 'Illinois', 'US.IL', NULL),
(7061, 1078, 'Indiana', 'US.IN', NULL),
(7062, 1078, 'Kansas', 'US.KS', NULL),
(7063, 1078, 'Kentucky', 'US.KY', NULL),
(7064, 1078, 'Louisiana', 'US.LA', NULL),
(7065, 1078, 'Massachusetts', 'US.MA', NULL),
(7066, 1078, 'Maryland', 'US.MD', NULL),
(7067, 1078, 'Maine', 'US.ME', NULL),
(7068, 1078, 'Michigan', 'US.MI', NULL),
(7069, 1078, 'Minnesota', 'US.MN', NULL),
(7070, 1078, 'Missouri', 'US.MO', NULL),
(7071, 1078, 'Mississippi', 'US.MS', NULL),
(7072, 1078, 'Montana', 'US.MT', NULL),
(7073, 1078, 'North Carolina', 'US.NC', NULL),
(7074, 1078, 'North Dakota', 'US.ND', NULL),
(7075, 1078, 'Nebraska', 'US.NE', NULL),
(7076, 1078, 'New Hampshire', 'US.NH', NULL),
(7077, 1078, 'New Jersey', 'US.NJ', NULL),
(7078, 1078, 'New Mexico', 'US.NM', NULL),
(7079, 1078, 'Nevada', 'US.NV', NULL),
(7080, 1078, 'New York', 'US.NY', NULL),
(7081, 1078, 'Ohio', 'US.OH', NULL),
(7082, 1078, 'Oklahoma', 'US.OK', NULL),
(7083, 1078, 'Oregon', 'US.OR', NULL),
(7084, 1078, 'Pennsylvania', 'US.PA', NULL),
(7085, 1078, 'Rhode Island', 'US.RI', NULL),
(7086, 1078, 'South Carolina', 'US.SC', NULL),
(7087, 1078, 'South Dakota', 'US.SD', NULL),
(7088, 1078, 'Tennessee', 'US.TN', NULL),
(7089, 1078, 'Texas', 'US.TX', NULL),
(7090, 1078, 'Utah', 'US.UT', NULL),
(7091, 1078, 'Virginia', 'US.VA', NULL),
(7092, 1078, 'Vermont', 'US.VT', NULL),
(7093, 1078, 'Washington', 'US.WA', NULL),
(7094, 1078, 'Wisconsin', 'US.WI', NULL),
(7095, 1078, 'West Virginia', 'US.WV', NULL),
(7096, 1078, 'Wyoming', 'US.WY', NULL),
(7097, 1078, 'Uruguay (general)', 'UY.00', NULL),
(7098, 1078, 'Artigas Department', 'UY.01', NULL),
(7099, 1078, 'Canelones Department', 'UY.02', NULL),
(7100, 1078, 'Cerro Largo Department', 'UY.03', NULL),
(7101, 1078, 'Colonia Department', 'UY.04', NULL),
(7102, 1078, 'Durazno', 'UY.05', NULL),
(7103, 1078, 'Flores', 'UY.06', NULL),
(7104, 1078, 'Florida Department', 'UY.07', NULL),
(7105, 1078, 'Lavalleja Department', 'UY.08', NULL),
(7106, 1078, 'Maldonado Department', 'UY.09', NULL),
(7107, 1078, 'Montevideo', 'UY.10', NULL),
(7108, 1078, 'Paysandú', 'UY.11', NULL),
(7109, 1078, 'Río Negro', 'UY.12', NULL),
(7110, 1078, 'Rivera', 'UY.13', NULL),
(7111, 1078, 'Rocha', 'UY.14', NULL),
(7112, 1078, 'Salto', 'UY.15', NULL),
(7113, 1078, 'San José', 'UY.16', NULL),
(7114, 1078, 'Soriano Department', 'UY.17', NULL),
(7115, 1078, 'Tacuarembó', 'UY.18', NULL),
(7116, 1078, 'Treinta y Tres', 'UY.19', NULL),
(7117, 1078, 'Uzbekistan (general)', 'UZ.00', NULL),
(7118, 1078, 'Andijon', 'UZ.01', NULL),
(7119, 1078, 'Buxoro', 'UZ.02', NULL),
(7120, 1078, 'Farg ona', 'UZ.03', NULL),
(7121, 1078, 'Xorazm', 'UZ.05', NULL),
(7122, 1078, 'Namangan', 'UZ.06', NULL),
(7123, 1078, 'Navoiy', 'UZ.07', NULL),
(7124, 1078, 'Qashqadaryo', 'UZ.08', NULL),
(7125, 1078, 'Karakalpakstan', 'UZ.09', NULL),
(7126, 1078, 'Samarqand', 'UZ.10', NULL),
(7127, 1078, 'Surxondaryo', 'UZ.12', NULL),
(7128, 1078, 'Toshkent Shahri', 'UZ.13', NULL),
(7129, 1078, 'Toshkent', 'UZ.14', NULL),
(7130, 1078, 'Jizzax', 'UZ.15', NULL),
(7131, 1078, 'Sirdaryo', 'UZ.16', NULL),
(7132, 1078, 'Vatican City (general)', 'VA.00', NULL),
(7133, 1078, 'Saint Vincent and The Grenadines (general)', 'VC.00', NULL),
(7134, 1078, 'Charlotte', 'VC.01', NULL),
(7135, 1078, 'Saint Andrew', 'VC.02', NULL),
(7136, 1078, 'Saint David', 'VC.03', NULL),
(7137, 1078, 'Saint George', 'VC.04', NULL),
(7138, 1078, 'Saint Patrick', 'VC.05', NULL),
(7139, 1078, 'Grenadines', 'VC.06', NULL),
(7140, 1078, 'Venezuela (general)', 'VE.00', NULL),
(7141, 1078, 'Amazonas', 'VE.01', NULL),
(7142, 1078, 'Anzoátegui', 'VE.02', NULL),
(7143, 1078, 'Apure', 'VE.03', NULL),
(7144, 1078, 'Aragua', 'VE.04', NULL),
(7145, 1078, 'Barinas', 'VE.05', NULL),
(7146, 1078, 'Bolívar', 'VE.06', NULL),
(7147, 1078, 'Carabobo', 'VE.07', NULL),
(7148, 1078, 'Cojedes', 'VE.08', NULL),
(7149, 1078, 'Delta Amacuro', 'VE.09', NULL),
(7150, 1078, 'Distrito Federal', 'VE.10', NULL),
(7151, 1078, 'Falcón', 'VE.11', NULL),
(7152, 1078, 'Guárico', 'VE.12', NULL),
(7153, 1078, 'Lara', 'VE.13', NULL),
(7154, 1078, 'Mérida', 'VE.14', NULL),
(7155, 1078, 'Miranda', 'VE.15', NULL),
(7156, 1078, 'Monagas', 'VE.16', NULL),
(7157, 1078, 'Isla Margarita', 'VE.17', NULL),
(7158, 1078, 'Portuguesa', 'VE.18', NULL),
(7159, 1078, 'Sucre', 'VE.19', NULL),
(7160, 1078, 'Táchira', 'VE.20', NULL),
(7161, 1078, 'Trujillo', 'VE.21', NULL),
(7162, 1078, 'Yaracuy', 'VE.22', NULL),
(7163, 1078, 'Zulia', 'VE.23', NULL),
(7164, 1078, 'Dependencias Federales', 'VE.24', NULL),
(7165, 1078, 'Distrito Federal', 'VE.25', NULL),
(7166, 1078, 'Vargas', 'VE.26', NULL),
(7167, 1078, '(VE99)', 'VE.99', NULL),
(7168, 1078, 'British Virgin Islands (general)', 'VG.00', NULL),
(7169, 1078, 'Virgin Islands (general)', 'VI.00', NULL),
(7170, 1078, 'Vietnam (general)', 'VN.00', NULL),
(7171, 1078, 'An Giang', 'VN.01', NULL),
(7172, 1078, 'B?c Thái T?nh', 'VN.02', NULL),
(7173, 1078, 'Bến Tre', 'VN.03', NULL),
(7174, 1078, 'Cao Bang', 'VN.04', NULL),
(7175, 1078, 'Cao Bằng', 'VN.05', NULL),
(7176, 1078, 'Ten Bai', 'VN.06', NULL),
(7177, 1078, 'Ðắc Lắk', 'VN.07', NULL),
(7178, 1078, 'Ðồng Tháp', 'VN.09', NULL),
(7179, 1078, '(VM10)', 'VN.10', NULL),
(7180, 1078, 'Hà B?c T?nh', 'VN.11', NULL),
(7181, 1078, 'H?i Hung T?nh', 'VN.12', NULL),
(7182, 1078, 'Hải Phòng', 'VN.13', NULL),
(7183, 1078, 'Hoa Binh', 'VN.14', NULL),
(7184, 1078, 'Ha Tay', 'VN.15', NULL),
(7185, 1078, '(VM16)', 'VN.16', NULL),
(7186, 1078, '(VM17)', 'VN.17', NULL),
(7187, 1078, '(VM19)', 'VN.19', NULL),
(7188, 1078, 'Hồ Chí Minh', 'VN.20', NULL),
(7189, 1078, 'Kiến Giang', 'VN.21', NULL),
(7190, 1078, 'Lai Châu', 'VN.22', NULL),
(7191, 1078, 'Lâm Ðồng', 'VN.23', NULL),
(7192, 1078, 'Long An', 'VN.24', NULL),
(7193, 1078, 'Minh H?i T?nh', 'VN.25', NULL),
(7194, 1078, 'Thua Thien-Hue', 'VN.26', NULL),
(7195, 1078, 'Quang Nam', 'VN.27', NULL),
(7196, 1078, 'Kon Tum', 'VN.28', NULL),
(7197, 1078, 'Qu?ng Nam-Ðà N?ng T?nh', 'VN.29', NULL),
(7198, 1078, 'Quảng Ninh', 'VN.30', NULL),
(7199, 1078, 'Sông Bé T?nh', 'VN.31', NULL),
(7200, 1078, 'Sơn La', 'VN.32', NULL),
(7201, 1078, 'Tây Ninh', 'VN.33', NULL),
(7202, 1078, 'Thanh Hóa', 'VN.34', NULL),
(7203, 1078, 'Thái Bình', 'VN.35', NULL),
(7204, 1078, 'Nin Thuan', 'VN.36', NULL),
(7205, 1078, 'Tiền Giang', 'VN.37', NULL),
(7206, 1078, 'Vinh Phú T?nh', 'VN.38', NULL),
(7207, 1078, 'Lạng Sơn', 'VN.39', NULL),
(7208, 1078, 'Binh Thuan', 'VN.40', NULL),
(7209, 1078, 'Long An', 'VN.41', NULL),
(7210, 1078, 'Ðồng Nai', 'VN.43', NULL),
(7211, 1078, 'Ha Nội', 'VN.44', NULL),
(7212, 1078, 'Bà Rịa-Vũng Tàu', 'VN.45', NULL),
(7213, 1078, 'Bình Ðịnh', 'VN.46', NULL),
(7214, 1078, 'Bình Thuận', 'VN.47', NULL),
(7215, 1078, 'Cần Thơ', 'VN.48', NULL),
(7216, 1078, 'Gia Lai', 'VN.49', NULL),
(7217, 1078, 'Hà Giang', 'VN.50', NULL),
(7218, 1078, 'Hà Tây', 'VN.51', NULL),
(7219, 1078, 'Hà Tĩnh', 'VN.52', NULL),
(7220, 1078, 'Hòa Bình', 'VN.53', NULL),
(7221, 1078, 'Khánh Hòa', 'VN.54', NULL),
(7222, 1078, 'Kon Tum', 'VN.55', NULL),
(7223, 1078, 'Lào Cai', 'VN.56', NULL),
(7224, 1078, 'Nam Hà T?nh', 'VN.57', NULL),
(7225, 1078, 'Nghệ An', 'VN.58', NULL),
(7226, 1078, 'Ninh Bình', 'VN.59', NULL),
(7227, 1078, 'Ninh Thuận', 'VN.60', NULL),
(7228, 1078, 'Phú Yên', 'VN.61', NULL),
(7229, 1078, 'Quảng Bình', 'VN.62', NULL),
(7230, 1078, 'Quảng Ngãi', 'VN.63', NULL),
(7231, 1078, 'Quảng Trị', 'VN.64', NULL),
(7232, 1078, 'Sóc Trăng', 'VN.65', NULL),
(7233, 1078, 'Thừa Thiên-Huế', 'VN.66', NULL),
(7234, 1078, 'Trà Vinh', 'VN.67', NULL),
(7235, 1078, 'Tuyên Quang', 'VN.68', NULL),
(7236, 1078, 'Vĩnh Long', 'VN.69', NULL),
(7237, 1078, 'Yên Bái', 'VN.70', NULL),
(7238, 1078, 'Bắc Giang', 'VN.71', NULL),
(7239, 1078, 'Bắc Kạn', 'VN.72', NULL),
(7240, 1078, 'Bạc Liêu', 'VN.73', NULL),
(7241, 1078, 'Bắc Ninh', 'VN.74', NULL),
(7242, 1078, 'Bình Dương', 'VN.75', NULL),
(7243, 1078, 'Bình Phước', 'VN.76', NULL),
(7244, 1078, 'Cà Mau', 'VN.77', NULL),
(7245, 1078, 'Ðà Nẵng', 'VN.78', NULL),
(7246, 1078, 'Hải Dương', 'VN.79', NULL),
(7247, 1078, 'Hà Nam', 'VN.80', NULL),
(7248, 1078, 'Hưng Yên', 'VN.81', NULL),
(7249, 1078, 'Nam Ðịnh', 'VN.82', NULL),
(7250, 1078, 'Phú Thọ', 'VN.83', NULL),
(7251, 1078, 'Quảng Nam', 'VN.84', NULL),
(7252, 1078, 'Thái Nguyên', 'VN.85', NULL),
(7253, 1078, 'Vĩnh Phúc', 'VN.86', NULL),
(7254, 1078, 'Vanuatu (general)', 'VU.00', NULL),
(7255, 1078, 'Ambrym', 'VU.05', NULL),
(7256, 1078, 'Aoba/Maéwo', 'VU.06', NULL),
(7257, 1078, 'Torba', 'VU.07', NULL),
(7258, 1078, 'Éfaté', 'VU.08', NULL),
(7259, 1078, 'Épi', 'VU.09', NULL),
(7260, 1078, 'Malakula', 'VU.10', NULL),
(7261, 1078, 'Paama', 'VU.11', NULL),
(7262, 1078, 'Pentecôte', 'VU.12', NULL),
(7263, 1078, 'Sanma', 'VU.13', NULL),
(7264, 1078, 'Shepherd', 'VU.14', NULL),
(7265, 1078, 'Tafea', 'VU.15', NULL),
(7266, 1078, 'Malampa', 'VU.16', NULL),
(7267, 1078, 'Penama', 'VU.17', NULL),
(7268, 1078, 'Shefa', 'VU.18', NULL),
(7269, 1078, 'Samoa (general)', 'WS.00', NULL),
(7270, 1078, 'A‘ana', 'WS.01', NULL),
(7271, 1078, 'Aiga-i-le-Tai', 'WS.02', NULL),
(7272, 1078, 'Atua', 'WS.03', NULL),
(7273, 1078, 'Fa‘asaleleaga', 'WS.04', NULL),
(7274, 1078, 'Gaga‘emauga', 'WS.05', NULL),
(7275, 1078, 'Va‘a-o-Fonoti', 'WS.06', NULL),
(7276, 1078, 'Gagaifomauga', 'WS.07', NULL),
(7277, 1078, 'Palauli', 'WS.08', NULL),
(7278, 1078, 'Satupa‘itea', 'WS.09', NULL),
(7279, 1078, 'Tuamasaga', 'WS.10', NULL),
(7280, 1078, 'Vaisigano', 'WS.11', NULL),
(7281, 1078, 'Abyan', 'YE.01', NULL),
(7282, 1078, '‘Adan', 'YE.02', NULL),
(7283, 1078, 'Al Mahrah', 'YE.03', NULL),
(7284, 1078, 'Ḩaḑramawt', 'YE.04', NULL),
(7285, 1078, 'Shabwah', 'YE.05', NULL),
(7286, 1078, 'San’a’', 'YE.06', NULL),
(7287, 1078, 'Ta’izz', 'YE.07', NULL),
(7288, 1078, 'Al Ḩudaydah', 'YE.08', NULL),
(7289, 1078, 'Dhamar', 'YE.09', NULL),
(7290, 1078, 'Al Maḩwīt', 'YE.10', NULL),
(7291, 1078, 'Dhamār', 'YE.11', NULL),
(7292, 1078, '(YM12)', 'YE.12', NULL),
(7293, 1078, '(YM13)', 'YE.13', NULL),
(7294, 1078, 'Maʼrib', 'YE.14', NULL),
(7295, 1078, 'Şa‘dah', 'YE.15', NULL),
(7296, 1078, 'Şan‘āʼ', 'YE.16', NULL),
(7297, 1078, '(YM17)', 'YE.17', NULL),
(7298, 1078, 'Aḑ Ḑāli‘', 'YE.18', NULL),
(7299, 1078, 'Omran', 'YE.19', NULL),
(7300, 1078, 'Al Bayḑāʼ', 'YE.20', NULL),
(7301, 1078, 'Al Jawf', 'YE.21', NULL),
(7302, 1078, 'Ḩajjah', 'YE.22', NULL),
(7303, 1078, 'Ibb', 'YE.23', NULL),
(7304, 1078, 'Laḩij', 'YE.24', NULL),
(7305, 1078, 'Ta‘izz', 'YE.25', NULL),
(7306, 1078, 'Amanat Al Asimah', 'YE.26', NULL),
(7307, 1078, 'Muḩāfaz̧at Raymah', 'YE.27', NULL),
(7308, 1078, 'Mayotte (general)', 'YT.00', NULL),
(7309, 1078, 'South Africa (general)', 'ZA.00', NULL),
(7310, 1078, 'North-Western Province', 'ZA.01', NULL),
(7311, 1078, 'KwaZulu-Natal', 'ZA.02', NULL),
(7312, 1078, 'Free State', 'ZA.03', NULL),
(7313, 1078, 'Southern Province', 'ZA.04', NULL),
(7314, 1078, 'Eastern Cape', 'ZA.05', NULL),
(7315, 1078, 'Gauteng', 'ZA.06', NULL),
(7316, 1078, 'Mpumalanga', 'ZA.07', NULL),
(7317, 1078, 'Northern Cape', 'ZA.08', NULL),
(7318, 1078, 'Limpopo', 'ZA.09', NULL),
(7319, 1078, 'North-West', 'ZA.10', NULL),
(7320, 1078, 'Western Cape', 'ZA.11', NULL),
(7321, 1078, 'Zambia (general)', 'ZM.00', NULL),
(7322, 1078, 'North-Western', 'ZM.01', NULL),
(7323, 1078, 'Copperbelt Province', 'ZM.02', NULL),
(7324, 1078, 'Western', 'ZM.03', NULL),
(7325, 1078, 'Southern', 'ZM.04', NULL),
(7326, 1078, 'Central', 'ZM.05', NULL),
(7327, 1078, 'Eastern', 'ZM.06', NULL),
(7328, 1078, 'Northern', 'ZM.07', NULL),
(7329, 1078, 'Luapula', 'ZM.08', NULL),
(7330, 1078, 'Lusaka', 'ZM.09', NULL),
(7331, 1078, 'Zimbabwe (general)', 'ZW.00', NULL),
(7332, 1078, 'Manicaland', 'ZW.01', NULL),
(7333, 1078, 'Midlands', 'ZW.02', NULL),
(7334, 1078, 'Mashonaland Central', 'ZW.03', NULL),
(7335, 1078, 'Mashonaland East', 'ZW.04', NULL),
(7336, 1078, 'Mashonaland West', 'ZW.05', NULL),
(7337, 1078, 'Matabeleland North', 'ZW.06', NULL),
(7338, 1078, 'Matabeleland South', 'ZW.07', NULL),
(7339, 1078, 'Masvingo', 'ZW.08', NULL),
(7340, 1078, 'Bulawayo', 'ZW.09', NULL),
(7341, 1078, 'Harare', 'ZW.10', NULL),
(30744, 1080, 'Indeterminé', 'I', ''),
(30745, 1080, 'Oui', 'O', NULL),
(30746, 1080, 'Non', 'N', NULL),
(30747, 1007, 'Fax', 'FAX', NULL),
(30748, 1081, 'Très important [1]', '1', NULL),
(30749, 1081, 'Important [2]', '2', NULL),
(30750, 1081, 'Moyen [3]', '3', NULL),
(30751, 1081, 'Faible [4]', '4', NULL),
(30752, 1081, 'Très faible [5]', '5', NULL),
(30753, 1082, 'Exact', 'E', NULL),
(30754, 1082, 'Approximatif', 'A', NULL),
(30755, 1083, 'Herbier', 'HE', NULL),
(30756, 1083, 'Centurie (conservée en dehors d''un herbier)', 'CE', 'Un mode de distribution ou d’échange d’échantillons d''herbiers souvent pratiqué au 19ème siècle. Le principe de l''envoi par centuries correspond à un ou x envois de paquets de n échantillons. Ces n échantillons peuvent avoir le même collecteur ou non, mai'),
(30757, 1083, 'Droguier', 'DR', 'Collection de fragments de végétaux ou de préparations (poudres...) dans des récipients adaptés (bocaux) utilisée pour l''enseignement ou la recherche dans le domaine de la matière médicale.'),
(30758, 1083, 'Carpothèque', 'CA', 'Collection de fruits et graines non vivants séchés et conservés à température ambiante dans des récipients adaptés (sachets, bocaux...). Elle permet de conserver en-dehors des herbiers les échantillons de fruits ou de graines trop volumineux, et sert de r'),
(30759, 1083, 'Collection en alcool', 'AL', 'Certaines parties de plantes sont conservées en alcool car elles sont difficiles à sécher, pour conserver leur forme ou permettre des études particulières.'),
(30760, 1083, 'Xylothèque', 'XY', 'Collection d’échantillons de bois.'),
(30761, 1083, 'Collection de préparations microscopiques', 'PM', NULL),
(30801, 30832, 'Bibliographie', 'bibliographie', 'Spécialisation dans la bibliographie'),
(30768, 0, 'Liste des types de champs', 'ltc', ' Liste des types champs possible pour l''affichage d''une metadonnée (liste, case à cocher etc...). Ceux-ci doivent s''accompagner d''un ajout de template approprié '),
(30771, 30768, 'liste déroulante', 'select', 'liste select classique'),
(30772, 30768, 'champ texte', 'text', 'champ texte'),
(30770, 30768, 'checkbox', 'checkbox', 'cases à cocher'),
(30773, 30768, 'champ texte long', 'textarea', 'textarea'),
(30774, 0, 'Statuts d''un utilisateur', 'statuts', ' Un utilisateur peut être en attente, inscrit, ou bloqué '),
(30775, 30774, 'en attente', 'attente', 'statut d''un utilisateur qui n''a pas finalisé son inscription'),
(30776, 30774, 'inscrit', 'inscrit', 'statut d''un utilisateur inscrit'),
(30777, 30774, 'bloqué', 'bloqué', 'statut d''un utilisateur qui a été bloqué'),
(30778, 0, 'Liste des champs minimaux obligatoires', 'champs_minimaux', 'Liste contenant les noms de champs obligatoires dans un annuaire'),
(30792, 30768, 'image', 'image', 'Image '),
(30793, 30778, 'champ_nom', 'champ_nom', 'champ nom'),
(30780, 30768, 'champ mot de passe', 'password', 'Champ password (avec des étoiles)'),
(30781, 30832, 'Phytosociologie', 'phytosocio', 'Spécialisation dans la phytosociologie'),
(30782, 1008, 'Mycologie', 'mycolo', 'Spécialisation dans la mycologie'),
(30783, 1008, 'Orchidophilie', 'orchido', 'Spécialisation dans l''orchidophilie'),
(30784, 30832, 'Ethnobotanique', 'ethnobota', 'Spécialisation dans l''ethnobotanique'),
(30785, 0, 'Niveau d''expérience botanique', 'niveau_exp_bota', ' '),
(30786, 30785, 'Débutant', 'debutant', NULL),
(30787, 30785, 'Ayant une bonne pratique', 'bonne_pratique', NULL),
(30788, 30785, 'Confirmé', 'confirme', NULL),
(30789, 30768, 'boutons radio', 'radio', 'Boutons radio pour un choix unique dans une liste réduite'),
(30790, 30785, 'Ne se prononce pas', 'indefini', 'Indique que l''utilisateur ne peut ou ne veut se prononcer sur son niveau d''expérience'),
(30794, 30778, 'champ_prenom', 'champ_prenom', 'champ_prenom'),
(30795, 30778, 'champ_pass', 'champ_pass', 'champ_pass'),
(30796, 30778, 'champ_mail', 'champ_mail', 'champ_mail'),
(30797, 0, 'Liste des rapports d''une activite professionnelle avec la botanique', 'activite_pro', 'Liste des types de rapports d''une activité professionelle avec la botanique'),
(30798, 30797, 'est en rapport avec la botanique', 'en_rapport', 'L''activité professionnelle est en rapport avec la botanique'),
(30799, 30797, 'sans rapport avec la botanique', 'sans_rapport', 'L''activité professionnelle n''est pas en rapport avec la botanique'),
(30800, 30797, 'ne se prononce pas', 'ne_se_prononce_pas', 'Ne se prononce pas'),
(30802, 30768, 'lettre d''actualité', 'lettre', 'Abonnement à une lettre d''actualité'),
(30803, 30768, 'champ mail', 'mail', 'Champ mail qui implique une vérification sur le format de son contenu'),
(30804, 0, 'Spécialités botaniques (Zones géographiques)', 'specialite_bota_geo', 'Liste des zones géographiques dont on peut être spécialiste en botanique'),
(30805, 30804, 'Zones tempérées et boréales', 'temp_boreales', 'Zones géographiques : tempérées et boréales'),
(30806, 30804, 'Zones méditerranéennes', 'flore_medit', 'Zone géographique : Méditerranéenne'),
(30807, 30804, 'Zones subtropicales à tropicales', 'flore_sub_trop', 'Zones géographiques : subtropicales à tropicales'),
(30808, 30768, 'champ date', 'date', 'Champ date'),
(30809, 1008, 'Pédagogie', 'pedagogie', 'Spécialisation dans la pédagogie botanique'),
(30810, 0, 'Liste oui/non/ne se prononce pas', 'oui_non_prononce_pas', 'Liste contenant les éléments oui / non / ne se prononce pas'),
(30811, 30810, 'Oui', 'oui', 'Oui'),
(30812, 30810, 'Non', 'non', 'Non'),
(30813, 30810, 'Ne se prononce pas', 'ne_se_prononce_pas', 'Ne se prononce pas'),
(30814, 30832, 'Histoire de la botanique', 'histo_bota', 'Spécialisation dans l''histoire de la botanique'),
(30815, 1008, 'Bryophytes ', 'bryo', 'Spécialisation dans les bryophytes'),
(30816, 1008, 'Ptéridophytes ', 'pterido', 'Spécialisation dans les ptéridophytes'),
(30817, 1008, 'Lichens', 'lichens', 'Spécialisation dans les lichens'),
(30818, 1008, 'Rubus ', 'rubus', 'Spécialisation dans les rubus'),
(30820, 1008, 'Envahissantes', 'envahissantes', 'Spécialisation dans les plantes envahissantes'),
(30821, 30832, 'Outils informatiques', 'outils_info', 'Spécialisation dans les outils informatiques'),
(30822, 30832, 'Éducation à l''environnement', 'educ_envir', 'Spécialisation dans l''éducation à l''environnement'),
(30823, 0, 'Liste des flores utilisées par les telabotanistes', 'flore_telabot', 'Contient la liste des flore utilisées par les tela botanistes (petite bonnier, coste, etc...)'),
(30825, 30823, 'Petite Bonnier', 'petite_bonnier', 'Petite flore de bonnier'),
(30826, 30823, 'Flore de Coste', 'flore_coste', 'Flore de Coste'),
(30827, 30823, 'Plusieurs Flores', 'plusieurs_flore', 'Plusieurs flores'),
(30828, 30823, 'Je n''en ai plus vraiment besoin', 'flore_plus_besoin', 'Plus besoin de flore'),
(30829, 1008, 'Algues', 'algues', 'Spécialisation dans les algues'),
(30830, 30832, 'Collections d''herbiers', 'collection_herbiers', 'Spécialisation dans la collection d''herbiers'),
(30831, 0, 'Liste oui/non', 'oui_non', 'Liste contenant seulement les élements oui et non'),
(30832, 0, 'Liste des types de spécialités botaniques (par approche scientifique)', 'liste_spe_bota_approche_sc', 'Spécialités botaniques par approches scientifiques'),
(30833, 30831, 'Oui', 'oui', 'Oui'),
(30834, 30831, 'Non', 'non', 'Non');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `annu_meta_valeurs`
--
 
CREATE TABLE IF NOT EXISTS `annu_meta_valeurs` (
`amv_id_valeur` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant de la donnée.',
`amv_ce_colonne` int(11) NOT NULL COMMENT 'Identifiant du champ auquelle cette donnée est liée',
`amv_cle_ligne` varchar(64) NOT NULL COMMENT 'Identifiant de la ligne à laquelle le champ dans la table d''origine appartient. Pour les tables à clé primaire multi colonnes, bien respecter l''ordre des champs de la clé et inscrire chaque valeur de clé séparée par un tiret "-".',
`amv_valeur` varchar(255) NOT NULL COMMENT 'Valeur.',
PRIMARY KEY (`amv_id_valeur`),
KEY `amv_cle_ligne` (`amv_cle_ligne`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Contient les champs supplémentaires (non standard ou de spéc' AUTO_INCREMENT=0 ;
 
-- --------------------------------------------------------
 
--
-- Structure de la table `annu_triples`
--
 
CREATE TABLE IF NOT EXISTS `annu_triples` (
`at_id` int(11) NOT NULL AUTO_INCREMENT,
`at_ce_annuaire` int(11) NOT NULL,
`at_ressource` varchar(255) NOT NULL,
`at_action` varchar(50) NOT NULL,
`at_valeur` varchar(255) NOT NULL,
PRIMARY KEY (`at_id`),
KEY `at_action` (`at_action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
 
/tags/v1.1-andromede/doc/bdd/annuaire.xml
New file
0,0 → 1,479
<?xml version="1.0" standalone="yes" ?>
<DBMODEL Version="4.0">
<SETTINGS>
<GLOBALSETTINGS ModelName="annu_carto" IDModel="0" IDVersion="0" VersionStr="1.0.0.0" Comments="" UseVersionHistroy="1" AutoIncVersion="1" DatabaseType="MySQL" ZoomFac="100.00" XPos="0" YPos="264" DefaultDataType="5" DefaultTablePrefix="0" DefSaveDBConn="" DefSyncDBConn="" DefQueryDBConn="" Printer="" HPageCount="4.0" PageAspectRatio="1.440892512336408" PageOrientation="1" PageFormat="A4 (210x297 mm, 8.26x11.7 inches)" SelectedPages="" UsePositionGrid="0" PositionGridX="20" PositionGridY="20" TableNameInRefs="0" DefaultTableType="0" ActivateRefDefForNewRelations="1" FKPrefix="" FKPostfix="" CreateFKRefDefIndex="0" DBQuoteCharacter="`" CreateSQLforLinkedObjects="0" DefModelFont="Nimbus Sans L" CanvasWidth="4096" CanvasHeight="2842" />
<DATATYPEGROUPS>
<DATATYPEGROUP Name="Numeric Types" Icon="1" />
<DATATYPEGROUP Name="Date and Time Types" Icon="2" />
<DATATYPEGROUP Name="String Types" Icon="3" />
<DATATYPEGROUP Name="Blob and Text Types" Icon="4" />
<DATATYPEGROUP Name="User defined Types" Icon="5" />
<DATATYPEGROUP Name="Geographic Types" Icon="6" />
</DATATYPEGROUPS>
<DATATYPES>
<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="2" IDGroup="0" TypeName="SMALLINT" Description="A small integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="3" IDGroup="0" TypeName="MEDIUMINT" Description="A medium-size integer. The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="4" IDGroup="0" TypeName="INT" Description="A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="1" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="0" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="5" IDGroup="0" TypeName="INTEGER" Description="A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="1" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="6" IDGroup="0" TypeName="BIGINT" Description="A large integer. The signed range is -9223372036854775808 to 9223372036854775807. The unsigned range is 0 to 18446744073709551615." ParamCount="1" OptionCount="2" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="0" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="7" IDGroup="0" TypeName="FLOAT" Description="A small (single-precision) floating-point number. Cannot be unsigned. Allowable values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="precision" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="8" IDGroup="0" TypeName="FLOAT" Description="A small (single-precision) floating-point number. Cannot be unsigned. Allowable values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="9" IDGroup="0" TypeName="DOUBLE" Description="A normal-size (double-precision) floating-point number. Cannot be unsigned. Allowable values are -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="10" IDGroup="0" TypeName="DOUBLE PRECISION" Description="This is a synonym for DOUBLE." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="11" IDGroup="0" TypeName="REAL" Description="This is a synonym for DOUBLE." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="2" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="12" IDGroup="0" TypeName="DECIMAL" Description="An unpacked floating-point number. Cannot be unsigned. Behaves like a CHAR column." ParamCount="2" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="3" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="13" IDGroup="0" TypeName="NUMERIC" Description="This is a synonym for DECIMAL." ParamCount="2" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="3" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
<PARAM Name="decimals" />
</PARAMS>
<OPTIONS>
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="14" IDGroup="1" TypeName="DATE" Description="A date. The supported range is \a1000-01-01\a to \a9999-12-31\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="15" IDGroup="1" TypeName="DATETIME" Description="A date and time combination. The supported range is \a1000-01-01 00:00:00\a to \a9999-12-31 23:59:59\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="16" IDGroup="1" TypeName="TIMESTAMP" Description="A timestamp. The range is \a1970-01-01 00:00:00\a to sometime in the year 2037. The length can be 14 (or missing), 12, 10, 8, 6, 4, or 2 representing YYYYMMDDHHMMSS, ... , YYYYMMDD, ... , YY formats." ParamCount="1" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
</DATATYPE>
<DATATYPE ID="17" IDGroup="1" TypeName="TIME" Description="A time. The range is \a-838:59:59\a to \a838:59:59\a." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="18" IDGroup="1" TypeName="YEAR" Description="A year in 2- or 4-digit format (default is 4-digit)." ParamCount="1" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
</DATATYPE>
<DATATYPE ID="19" IDGroup="2" TypeName="CHAR" Description="A fixed-length string (1 to 255 characters) that is always right-padded with spaces to the specified length when stored. values are sorted and compared in case-insensitive fashion according to the default character set unless the BINARY keyword is given." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="BINARY" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="20" IDGroup="2" TypeName="VARCHAR" Description="A variable-length string (1 to 255 characters). Values are sorted and compared in case-sensitive fashion unless the BINARY keyword is given." ParamCount="1" OptionCount="1" ParamRequired="1" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="BINARY" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="21" IDGroup="2" TypeName="BIT" Description="This is a synonym for CHAR(1)." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="22" IDGroup="2" TypeName="BOOL" Description="This is a synonym for CHAR(1)." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="23" IDGroup="3" TypeName="TINYBLOB" Description="A column maximum length of 255 (2^8 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="24" IDGroup="3" TypeName="BLOB" Description="A column maximum length of 65535 (2^16 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="25" IDGroup="3" TypeName="MEDIUMBLOB" Description="A column maximum length of 16777215 (2^24 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="26" IDGroup="3" TypeName="LONGBLOB" Description="A column maximum length of 4294967295 (2^32 - 1) characters. Values are sorted and compared in case-sensitive fashion." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="27" IDGroup="3" TypeName="TINYTEXT" Description="A column maximum length of 255 (2^8 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="28" IDGroup="3" TypeName="TEXT" Description="A column maximum length of 65535 (2^16 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="29" IDGroup="3" TypeName="MEDIUMTEXT" Description="A column maximum length of 16777215 (2^24 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="30" IDGroup="3" TypeName="LONGTEXT" Description="A column maximum length of 4294967295 (2^32 - 1) characters." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="31" IDGroup="3" TypeName="ENUM" Description="An enumeration. A string object that can have only one value, chosen from the list of values." ParamCount="1" OptionCount="0" ParamRequired="1" EditParamsAsString="1" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="values" />
</PARAMS>
</DATATYPE>
<DATATYPE ID="32" IDGroup="3" TypeName="SET" Description="A set. A string object that can have zero or more values, each of which must be chosen from the list of values." ParamCount="1" OptionCount="0" ParamRequired="1" EditParamsAsString="1" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<PARAMS>
<PARAM Name="values" />
</PARAMS>
</DATATYPE>
<DATATYPE ID="33" IDGroup="4" TypeName="Varchar(20)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<OPTIONS>
<OPTION Name="BINARY" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="34" IDGroup="4" TypeName="Varchar(45)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<OPTIONS>
<OPTION Name="BINARY" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="35" IDGroup="4" TypeName="Varchar(255)" Description="" ParamCount="0" OptionCount="1" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
<OPTIONS>
<OPTION Name="BINARY" Default="0" />
</OPTIONS>
</DATATYPE>
<DATATYPE ID="36" IDGroup="5" TypeName="GEOMETRY" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="38" IDGroup="5" TypeName="LINESTRING" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="39" IDGroup="5" TypeName="POLYGON" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="40" IDGroup="5" TypeName="MULTIPOINT" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="41" IDGroup="5" TypeName="MULTILINESTRING" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="42" IDGroup="5" TypeName="MULTIPOLYGON" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
<DATATYPE ID="43" IDGroup="5" TypeName="GEOMETRYCOLLECTION" Description="Geographic Datatype" ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
</DATATYPE>
</DATATYPES>
<COMMON_DATATYPES>
<COMMON_DATATYPE ID="5" />
<COMMON_DATATYPE ID="8" />
<COMMON_DATATYPE ID="20" />
<COMMON_DATATYPE ID="15" />
<COMMON_DATATYPE ID="22" />
<COMMON_DATATYPE ID="28" />
<COMMON_DATATYPE ID="26" />
<COMMON_DATATYPE ID="33" />
<COMMON_DATATYPE ID="34" />
<COMMON_DATATYPE ID="35" />
</COMMON_DATATYPES>
<TABLEPREFIXES>
<TABLEPREFIX Name="Defaut (pas de prefixe)" />
</TABLEPREFIXES>
<REGIONCOLORS>
<REGIONCOLOR Color="Red=#FFEEEC" />
<REGIONCOLOR Color="Yellow=#FEFDED" />
<REGIONCOLOR Color="Green=#EAFFE5" />
<REGIONCOLOR Color="Cyan=#ECFDFF" />
<REGIONCOLOR Color="Blue=#F0F1FE" />
<REGIONCOLOR Color="Magenta=#FFEBFA" />
</REGIONCOLORS>
<POSITIONMARKERS>
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
<POSITIONMARKER ZoomFac="-1.0" X="0" Y="0" />
</POSITIONMARKERS>
</SETTINGS>
<METADATA>
<REGIONS>
<REGION ID="22452" RegionName="Metadonn\195\169es" XPos="78" YPos="856" Width="1171" Height="350" RegionColor="2" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="10" />
<REGION ID="22435" RegionName="Annuaire" XPos="79" YPos="572" Width="309" Height="278" RegionColor="0" TablePrefix="0" TableType="0" OverwriteTablePrefix="0" OverwriteTableType="0" Comments="" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="8" />
</REGIONS>
<TABLES>
<TABLE ID="22587" Tablename="annu_meta_valeurs" PrevTableName="Table_06" XPos="242" YPos="1097" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="Contient les champs suppl\195\169mentaires (non standard ou de sp\195\169cialisation) de la base de donn\195\169es." Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="30" >
<COLUMNS>
<COLUMN ID="22588" ColName="amv_id_valeur" PrevColName="cmt_id_donnee" Pos="0" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="1" NotNull="1" AutoInc="1" IsForeignKey="0" DefaultValue="" Comments="Identifiant de la donn\195\169e.">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23048" ColName="amv_ce_colonne" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="Identifiant du champ auquelle cette donn\195\169e est li\195\169e">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22590" ColName="amv_cle_ligne" PrevColName="cmd_ce_identifiant" Pos="3" idDatatype="20" DatatypeParams="(64)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Identifiant de la ligne \195\160 laquelle le champ dans la table d\aorigine appartient. Pour les tables \195\160 cl\195\169 primaire multi colonnes, bien respecter l\aordre des champs de la cl\195\169 et inscrire chaque valeur de cl\195\169 s\195\169par\195\169e par un tiret \A-\A.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22592" ColName="amv_valeur" PrevColName="cmd_valeur" Pos="3" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Valeur.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
</COLUMNS>
<RELATIONS_END>
<RELATION_END ID="22593" />
</RELATIONS_END>
<INDICES>
<INDEX ID="22595" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
<INDEXCOLUMNS>
<INDEXCOLUMN idColumn="22588" LengthParam="0" />
</INDEXCOLUMNS>
</INDEX>
</INDICES>
</TABLE>
<TABLE ID="22596" Tablename="annu_meta_colonne" PrevTableName="Table_07" XPos="277" YPos="876" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="Contient l\aensemble des champs des tables de la base de donn\195\169es.\nINFO : cmc_nom" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="26" >
<COLUMNS>
<COLUMN ID="22597" ColName="amc_id_champ" PrevColName="cmc_id_caracteristique" Pos="0" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="1" NotNull="1" AutoInc="1" IsForeignKey="0" DefaultValue="" Comments="Identifiant du nom du champ dans la table.">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23084" ColName="amc_ce_ontologie" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23060" ColName="amc_ce_annuaire" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="Annuaire li\195\169 \195\160 cette m\195\169ta colonne">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23081" ColName="amo_ce_type" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="Type SQL du champ, est une valeur de la liste des types">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22601" ColName="amc_nom" PrevColName="cmc_intitule" Pos="2" idDatatype="20" DatatypeParams="(50)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Intitul\195\169 du champ.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22602" ColName="amc_abreviation" PrevColName="cmc_abreviation" Pos="3" idDatatype="20" DatatypeParams="(20)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Abr\195\169viation du champ.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22603" ColName="amc_description" PrevColName="cmc_description" Pos="4" idDatatype="20" DatatypeParams="(510)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Description du champ.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22605" ColName="amc_longueur" PrevColName="cmc_taille" Pos="6" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Taille du format SQL du champ.">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
</COLUMNS>
<RELATIONS_START>
<RELATION_START ID="22593" />
</RELATIONS_START>
<RELATIONS_END>
<RELATION_END ID="23057" />
<RELATION_END ID="23061" />
<RELATION_END ID="23064" />
</RELATIONS_END>
<INDICES>
<INDEX ID="22613" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
<INDEXCOLUMNS>
<INDEXCOLUMN idColumn="22597" LengthParam="0" />
</INDEXCOLUMNS>
</INDEX>
</INDICES>
</TABLE>
<TABLE ID="22614" Tablename="annu_meta_ontologie" PrevTableName="Table_09" XPos="965" YPos="925" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="Liste l\aensemble des valeurs des tables de type liste.\nUn champ contient des valeurs dans cette table quand il est de type \ALISTE\A.\nINFO : cmlv_nom" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="25" >
<COLUMNS>
<COLUMN ID="22615" ColName="amo_id_ontologie" PrevColName="cmv_id_valeur" Pos="0" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="1" NotNull="1" AutoInc="1" IsForeignKey="0" DefaultValue="" Comments="Identifiant d\aune valeur de liste. Notez que les listes sont des valeurs de la liste des listes.">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23079" ColName="amo_ce_parent" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22618" ColName="amo_nom" PrevColName="cmv_nom" Pos="2" idDatatype="20" DatatypeParams="(100)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Nom de la valeur.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22619" ColName="amo_abreviation" PrevColName="cmv_abreviation" Pos="3" idDatatype="20" DatatypeParams="(50)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Abr\195\169viation, code ou identifiant de la valeur.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22620" ColName="amo_description" PrevColName="cmv_description" Pos="4" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="Description de cette valeur.">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
</COLUMNS>
<RELATIONS_START>
<RELATION_START ID="23054" />
<RELATION_START ID="23061" />
<RELATION_START ID="23064" />
</RELATIONS_START>
<RELATIONS_END>
<RELATION_END ID="23054" />
</RELATIONS_END>
<INDICES>
<INDEX ID="22665" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
<INDEXCOLUMNS>
<INDEXCOLUMN idColumn="22615" LengthParam="0" />
</INDEXCOLUMNS>
</INDEX>
</INDICES>
</TABLE>
<TABLE ID="22846" Tablename="annu_annuaire" PrevTableName="Table_10" XPos="114" YPos="633" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="\n" TableOptions="DelayKeyTblUpdates=0\nPackKeys=0\nRowChecksum=0\nRowFormat=0\nUseRaid=0\nRaidType=0\n" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="15" >
<COLUMNS>
<COLUMN ID="22848" ColName="aa_id_annuaire" PrevColName="" Pos="0" idDatatype="5" DatatypeParams="" Width="-1" Prec="-1" PrimaryKey="1" NotNull="1" AutoInc="1" IsForeignKey="0" DefaultValue="" Comments="identifiant de cet annuaire">
<OPTIONSELECTED>
<OPTIONSELECT Value="1" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22850" ColName="aa_nom" PrevColName="" Pos="1" idDatatype="20" DatatypeParams="(128)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="nom de l\aannuaire">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22851" ColName="aa_description" PrevColName="" Pos="2" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="description">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22852" ColName="aa_code" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(20)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="code ou abr\195\169viation">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="22859" ColName="aa_table" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="nom de la table annuaire \195\160 utiliser">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="23075" ColName="aa_bdd" PrevColName="" Pos="8" idDatatype="20" DatatypeParams="(255)" Width="-1" Prec="-1" PrimaryKey="0" NotNull="0" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="base de donn\195\169es dans laquelle est situ\195\169 cet annuaire">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
</COLUMNS>
<RELATIONS_START>
<RELATION_START ID="23057" />
</RELATIONS_START>
<INDICES>
<INDEX ID="22849" IndexName="PRIMARY" IndexKind="0" FKRefDef_Obj_id="-1">
<INDEXCOLUMNS>
<INDEXCOLUMN idColumn="22848" LengthParam="0" />
</INDEXCOLUMNS>
</INDEX>
</INDICES>
</TABLE>
</TABLES>
<RELATIONS>
<RELATION ID="22593" RelationName="fk_amc_amv" Kind="2" SrcTable="22596" DestTable="22587" FKFields="amc_id_champ=amv_ce_colonne\n" FKFieldsComments="\n" relDirection="3" MidOffset="0" OptionalStart="0" OptionalEnd="0" CaptionOffsetX="57" CaptionOffsetY="-25" StartIntervalOffsetX="0" StartIntervalOffsetY="0" EndIntervalOffsetX="0" EndIntervalOffsetY="0" CreateRefDef="1" Invisible="0" RefDef="Matching=0\nOnDelete=3\nOnUpdate=3\n" Comments="" FKRefDefIndex_Obj_id="-1" Splitted="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="34" />
<RELATION ID="23054" RelationName="fk_amo_amo" Kind="2" SrcTable="22614" DestTable="22614" FKFields="amo_id_ontologie=amo_ce_parent\n" FKFieldsComments="\n" relDirection="2" MidOffset="23" OptionalStart="0" OptionalEnd="0" CaptionOffsetX="0" CaptionOffsetY="0" StartIntervalOffsetX="0" StartIntervalOffsetY="0" EndIntervalOffsetX="0" EndIntervalOffsetY="0" CreateRefDef="1" Invisible="0" RefDef="Matching=0\nOnDelete=3\nOnUpdate=3\n" Comments="" FKRefDefIndex_Obj_id="-1" Splitted="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="10" />
<RELATION ID="23057" RelationName="fk_aa_amlc" Kind="2" SrcTable="22846" DestTable="22596" FKFields="aa_id_annuaire=amc_ce_annuaire\n" FKFieldsComments="\n" relDirection="3" MidOffset="0" OptionalStart="0" OptionalEnd="0" CaptionOffsetX="0" CaptionOffsetY="0" StartIntervalOffsetX="0" StartIntervalOffsetY="0" EndIntervalOffsetX="0" EndIntervalOffsetY="0" CreateRefDef="1" Invisible="0" RefDef="Matching=0\nOnDelete=3\nOnUpdate=3\n" Comments="" FKRefDefIndex_Obj_id="-1" Splitted="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="11" />
<RELATION ID="23061" RelationName="fk_amo_amc" Kind="2" SrcTable="22614" DestTable="22596" FKFields="amo_id_ontologie=amc_ce_ontologie\n" FKFieldsComments="\n" relDirection="4" MidOffset="0" OptionalStart="0" OptionalEnd="0" CaptionOffsetX="-1" CaptionOffsetY="0" StartIntervalOffsetX="0" StartIntervalOffsetY="0" EndIntervalOffsetX="0" EndIntervalOffsetY="0" CreateRefDef="1" Invisible="0" RefDef="Matching=0\nOnDelete=3\nOnUpdate=3\n" Comments="" FKRefDefIndex_Obj_id="-1" Splitted="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="12" />
<RELATION ID="23064" RelationName="fk_amo_amc_type" Kind="2" SrcTable="22614" DestTable="22596" FKFields="amo_id_ontologie=amo_ce_type\n" FKFieldsComments="\n" relDirection="4" MidOffset="0" OptionalStart="0" OptionalEnd="0" CaptionOffsetX="0" CaptionOffsetY="0" StartIntervalOffsetX="0" StartIntervalOffsetY="0" EndIntervalOffsetX="0" EndIntervalOffsetY="0" CreateRefDef="1" Invisible="0" RefDef="Matching=0\nOnDelete=3\nOnUpdate=3\n" Comments="" FKRefDefIndex_Obj_id="-1" Splitted="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="13" />
</RELATIONS>
<NOTES>
</NOTES>
<IMAGES>
</IMAGES>
</METADATA>
<PLUGINDATA>
<PLUGINDATARECORDS>
</PLUGINDATARECORDS>
</PLUGINDATA>
<QUERYDATA>
<QUERYRECORDS>
</QUERYRECORDS>
</QUERYDATA>
<LINKEDMODELS>
</LINKEDMODELS>
</DBMODEL>
/tags/v1.1-andromede/doc/bdd/annuaire_module_Annuaire_Tela.html
New file
0,0 → 1,88
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Annuaire Tela</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > Annuaire Tela</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Module Annuaire Tela</h1>
<p id="miniature" >
<a href="images/modules/Annuaire_Tela.png" title="Voir cette image avec un zoom de 100%.">
<img src="images/miniatures/miniature_Annuaire_Tela.png" alt="Miniature du modèle du module Annuaire Tela" />
</a>
</p>
<h2> Description générale </h2>
<p>
<br />
<b>Révision : </b>1.1
</p>
<h2> Liste des tables </h2>
<ol class="type_01">
<li><a href="annuaire_table_annuaire_inscrits.html">annuaire_inscrits</a> : </li>
</ol>
<h2> Dépot SVN </h2>
<p>
Voir la page concernant ce module sur le dépot SVN :
<a href="http://svn.tela-botanica.net/websvn/listing.php?repname=Applications.annuaireannuaire.xml">
annuaire.xml
</a>
</p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant ce module :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_Annuaire Tela">
discussion sur le module Annuaire Tela
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 10:42:27</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
/tags/v1.1-andromede/doc/bdd/annuaire_vocabulaire.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/tags/v1.1-andromede/doc/bdd/annuaire_vocabulaire.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/tags/v1.1-andromede/doc/bdd/annuaire_table_annu_meta_valeurs.html
New file
0,0 → 1,160
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Metadonnées - annu_meta_valeurs</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > <a href="annuaire_module_Metadonnees.html">Metadonnées</a> > annu_meta_valeurs</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table annu_meta_valeurs</h1>
<h2> Description générale </h2>
<p>
Contient les champs supplémentaires (non standard ou de spécialisation) de la base de données.
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<tr id="amv_id_valeur" class="pair" >
<td> 1 </td>
<td> amv_id_valeur </td>
<td> amv_id_v </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé primaire </td>
<td> oui </td>
<td> Identifiant de la donnée. </td>
</tr>
<tr id="amv_ce_colonne" class="pair" >
<td> 2 </td>
<td> amv_ce_colonne </td>
<td> amv_ce_c </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé étrangère </td>
<td> non </td>
<td> Identifiant du champ auquelle cette donnée est liée </td>
</tr>
<tr id="amv_cle_ligne" class="pair" >
<td> 3 </td>
<td> amv_cle_ligne </td>
<td> amv_cl </td>
<td> VARCHAR(64) </td>
<td> oui </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Identifiant de la ligne à laquelle le champ dans la table d'origine appartient. Pour les tables à clé primaire multi colonnes, bien respecter l'ordre des champs de la clé et inscrire chaque valeur de clé séparée par un tiret "-". </td>
</tr>
<tr id="amv_valeur" class="pair" >
<td> 4 </td>
<td> amv_valeur </td>
<td> amv_v </td>
<td> VARCHAR(255) </td>
<td> oui </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Valeur. </td>
</tr>
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
<tr class="pair" >
<td> 1 </td>
<td> fk_amc_amv </td>
<td> amv_ce_colonne </td>
<td> amc_id_champ </td>
<td> <a href="annuaire_table_annu_meta_colonne.html">annu_meta_colonne</a> </td>
</tr>
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_annu_meta_valeurs">
discussion sur la table annu_meta_valeurs
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_vocabulaire.csv
New file
0,0 → 1,5487
"ID";"ID PARENT";"ID PROJET";"NOM";"ABREVIATION";"DESCRIPTION";"NOTES";"DATE_MAJ";"ID MODIFIER PAR";"ID ETAT"
1;1001;1;"Ajouté";"A";"NULL";"Initialisation de la valeur «A» pour la liste «00a».";2009-03-19 13:07:46;1;1
2;1001;1;"Modifié";"M";"NULL";"Initialisation de la valeur «M» pour la liste «00a».";2009-03-19 13:07:46;1;1
3;1001;1;"Supprimé";"S";"NULL";"Initialisation de la valeur «S» pour la liste «00a».";2009-03-19 13:07:46;1;1
11;1002;1;"TINYINT";"1";"NULL";"Initialisation de la valeur «1» pour la liste «00b».";2009-03-19 13:07:46;1;1
12;1002;1;"SMALLINT";"2";"NULL";"Initialisation de la valeur «2» pour la liste «00b».";2009-03-19 13:07:46;1;1
13;1002;1;"MEDIUMINT";"3";"NULL";"Initialisation de la valeur «3» pour la liste «00b».";2009-03-19 13:07:46;1;1
14;1002;1;"INT";"4";"NULL";"Initialisation de la valeur «4» pour la liste «00b».";2009-03-19 13:07:46;1;1
15;1002;1;"INTEGER";"5";"NULL";"Initialisation de la valeur «5» pour la liste «00b».";2009-03-19 13:07:46;1;1
16;1002;1;"BIGINT";"6";"NULL";"Initialisation de la valeur «6» pour la liste «00b».";2009-03-19 13:07:46;1;1
17;1002;1;"FLOAT";"7";"NULL";"Initialisation de la valeur «7» pour la liste «00b».";2009-03-19 13:07:46;1;1
18;1002;1;"DOUBLE";"8";"NULL";"Initialisation de la valeur «8» pour la liste «00b».";2009-03-19 13:07:46;1;1
19;1002;1;"DOUBLE PRECISION";"9";"NULL";"Initialisation de la valeur «9» pour la liste «00b».";2009-03-19 13:07:46;1;1
20;1002;1;"REAL";"10";"NULL";"Initialisation de la valeur «10» pour la liste «00b».";2009-03-19 13:07:46;1;1
21;1002;1;"DECIMAL";"11";"NULL";"Initialisation de la valeur «11» pour la liste «00b».";2009-03-19 13:07:46;1;1
22;1002;1;"NUMERIC";"12";"NULL";"Initialisation de la valeur «12» pour la liste «00b».";2009-03-19 13:07:46;1;1
23;1002;1;"DATE";"13";"NULL";"Initialisation de la valeur «13» pour la liste «00b».";2009-03-19 13:07:46;1;1
24;1002;1;"DATETIME";"14";"NULL";"Initialisation de la valeur «14» pour la liste «00b».";2009-03-19 13:07:46;1;1
25;1002;1;"TIMESTAMP";"15";"NULL";"Initialisation de la valeur «15» pour la liste «00b».";2009-03-19 13:07:46;1;1
26;1002;1;"TIME";"16";"NULL";"Initialisation de la valeur «16» pour la liste «00b».";2009-03-19 13:07:46;1;1
27;1002;1;"YEAR";"17";"NULL";"Initialisation de la valeur «17» pour la liste «00b».";2009-03-19 13:07:46;1;1
28;1002;1;"CHAR";"18";"NULL";"Initialisation de la valeur «18» pour la liste «00b».";2009-03-19 13:07:46;1;1
29;1002;1;"VARCHAR";"19";"NULL";"Initialisation de la valeur «19» pour la liste «00b».";2009-03-19 13:07:46;1;1
30;1002;1;"BIT";"20";"NULL";"Initialisation de la valeur «20» pour la liste «00b».";2009-03-19 13:07:46;1;1
31;1002;1;"BOOL";"21";"NULL";"Initialisation de la valeur «21» pour la liste «00b».";2009-03-19 13:07:46;1;1
32;1002;1;"TINYBLOB";"22";"NULL";"Initialisation de la valeur «22» pour la liste «00b».";2009-03-19 13:07:46;1;1
33;1002;1;"BLOB";"23";"NULL";"Initialisation de la valeur «23» pour la liste «00b».";2009-03-19 13:07:46;1;1
34;1002;1;"MEDIUMBLOB";"24";"NULL";"Initialisation de la valeur «24» pour la liste «00b».";2009-03-19 13:07:46;1;1
35;1002;1;"LONGBLOB";"25";"NULL";"Initialisation de la valeur «25» pour la liste «00b».";2009-03-19 13:07:46;1;1
36;1002;1;"TINYTEXT";"26";"NULL";"Initialisation de la valeur «26» pour la liste «00b».";2009-03-19 13:07:46;1;1
37;1002;1;"TEXT";"27";"NULL";"Initialisation de la valeur «27» pour la liste «00b».";2009-03-19 13:07:46;1;1
38;1002;1;"MEDIUMTEXT";"28";"NULL";"Initialisation de la valeur «28» pour la liste «00b».";2009-03-19 13:07:46;1;1
39;1002;1;"LONGTEXT";"29";"NULL";"Initialisation de la valeur «29» pour la liste «00b».";2009-03-19 13:07:46;1;1
40;1002;1;"ENUM";"30";"NULL";"Initialisation de la valeur «30» pour la liste «00b».";2009-03-19 13:07:46;1;1
41;1002;1;"SET";"31";"NULL";"Initialisation de la valeur «31» pour la liste «00b».";2009-03-19 13:07:46;1;1
42;1002;1;"GEOMETRY";"32";"NULL";"Initialisation de la valeur «32» pour la liste «00b».";2009-03-19 13:07:46;1;1
43;1002;1;"LINESTRING";"33";"NULL";"Initialisation de la valeur «33» pour la liste «00b».";2009-03-19 13:07:46;1;1
44;1002;1;"POLYGON";"34";"NULL";"Initialisation de la valeur «34» pour la liste «00b».";2009-03-19 13:07:46;1;1
45;1002;1;"MULTIPOINT";"35";"NULL";"Initialisation de la valeur «35» pour la liste «00b».";2009-03-19 13:07:46;1;1
46;1002;1;"MULTILINESTRING";"36";"NULL";"Initialisation de la valeur «36» pour la liste «00b».";2009-03-19 13:07:46;1;1
47;1002;1;"MULTIPOLYGON";"37";"NULL";"Initialisation de la valeur «37» pour la liste «00b».";2009-03-19 13:07:46;1;1
48;1002;1;"GEOMETRYCOLLECTION";"38";"NULL";"Initialisation de la valeur «38» pour la liste «00b».";2009-03-19 13:07:46;1;1
1001;0;1;"Liste des états des enregistrements de la base de données";"00a";"NULL";"Initialisation de la liste «00a».";2009-03-19 13:07:46;1;1
1002;0;1;"Liste des formats de champs SQL de la base de données";"00b";"NULL";"Initialisation de la liste «00b».";2009-03-19 13:07:46;1;1
1003;0;1;"Liste des tables de la base de données";"00c";"NULL";"Initialisation de la liste «00c».";2009-03-19 13:07:46;1;1
1004;0;1;"Liste des préfixes de noms de personne";"1";"NULL";"Initialisation de la liste «01».";2009-03-19 13:07:46;1;1
1005;0;1;"Liste des suffixes de noms de personne";"2";"NULL";"Initialisation de la liste «02».";2009-03-19 13:07:46;1;1
1006;0;1;"Liste des types de noms complémentaires d'une personne";"3";"NULL";"Initialisation de la liste «03».";2009-03-19 13:07:46;1;1
1007;0;1;"Liste des types de téléphone";"4";"NULL";"Initialisation de la liste «04».";2009-03-19 13:07:46;1;1
1008;0;1;"Liste des types de spécialités botaniques";"5";"NULL";"Initialisation de la liste «05».";2009-03-19 13:07:46;1;1
1009;0;1;"Liste des rôles d'une personne";"6";"NULL";"Initialisation de la liste «06».";2009-03-19 13:07:46;1;1
1010;0;1;"Liste des relations entre personnes";"7";"NULL";"Initialisation de la liste «07».";2009-03-19 13:07:46;1;1
1011;0;1;"Liste des relations entre une structure et une personne";"8";"NULL";"Initialisation de la liste «08».";2009-03-19 13:07:46;1;1
1012;0;1;"Liste des fonctions d'une personne au sein d'une structure";"9";"NULL";"Initialisation de la liste «09».";2009-03-19 13:07:46;1;1
1013;0;1;"Liste des statuts d'une personne au sein d'une structure";"10";"NULL";"Initialisation de la liste «10».";2009-03-19 13:07:46;1;1
1014;0;1;"Liste des types de structure dans le standard NCD";"11";"NULL";"Initialisation de la liste «11».";2009-03-19 13:07:46;1;1
1015;0;1;"Liste des types de structure privé";"12";"NULL";"Initialisation de la liste «12».";2009-03-19 13:07:46;1;1
1016;0;1;"Liste des types de structure publique";"13";"NULL";"Initialisation de la liste «13».";2009-03-19 13:07:46;1;1
1017;0;1;"Liste des identifiants alternatifs de structures à vocation botanique";"14";"NULL";"Initialisation de la liste «14».";2009-03-19 13:07:46;1;1
1018;0;1;"Liste des types de local de stockage de collections";"15";"NULL";"Initialisation de la liste «15».";2009-03-19 13:07:46;1;1
1019;0;1;"Liste des types de mobilier de stockage de collections";"16";"NULL";"Initialisation de la liste «16».";2009-03-19 13:07:46;1;1
1020;0;1;"Liste des paramètres de contrôle environnemental d'un local";"17";"NULL";"Initialisation de la liste «17».";2009-03-19 13:07:46;1;1
1021;0;1;"Liste des types de collection non botanique";"18";"NULL";"Initialisation de la liste «18».";2009-03-19 13:07:46;1;1
1022;0;1;"Liste des types d'opération de restauration pour les collections botaniques";"19";"NULL";"Initialisation de la liste «19».";2009-03-19 13:07:46;1;1
1023;0;1;"Liste oui/non/en partie";"20";"NULL";"Initialisation de la liste «20».";2009-03-19 13:07:46;1;1
1024;0;1;"Liste du matériel dit de nom conservation des parts d'herbier";"21";"NULL";"Initialisation de la liste «21».";2009-03-19 13:07:46;1;1
1025;0;1;"Liste de traitement anti-insecte pour les collections botaniques";"22";"NULL";"Initialisation de la liste «22».";2009-03-19 13:07:46;1;1
1026;0;1;"Liste des poisons utilisés pour les collections botaniques";"23";"NULL";"Initialisation de la liste «23».";2009-03-19 13:07:46;1;1
1027;0;1;"Liste des actions de valorisation des collections";"24";"NULL";"Initialisation de la liste «24».";2009-03-19 13:07:46;1;1
1028;0;1;"Liste des continents habités incluant aussi le pays France";"25";"NULL";"Initialisation de la liste «25».";2009-03-19 13:07:46;1;1
1029;0;1;"Liste des types de recherche nécessitant la consultation de collection botanique";"26";"NULL";"Initialisation de la liste «26».";2009-03-19 13:07:46;1;1
1030;0;1;"Liste des relations entre une collection et une personne";"27";"NULL";"Initialisation de la liste «27».";2009-03-19 13:07:46;1;1
1031;0;1;"Liste des relations entre collections";"28";"NULL";"Initialisation de la liste «28».";2009-03-19 13:07:46;1;1
1032;0;1;"Liste des types de collection dans le standard NCD";"29";"NULL";"Initialisation de la liste «29».";2009-03-19 13:07:46;1;1
1033;0;1;"Liste des types de dépôt de collection";"30";"NULL";"Initialisation de la liste «30».";2009-03-19 13:07:46;1;1
1034;0;1;"Liste des principes de groupement d'une collection dans le standard NCD";"31";"NULL";"Initialisation de la liste «31».";2009-03-19 13:07:46;1;1
1035;0;1;"Liste des buts de réalisation d'une collection dans le standard NCD";"32";"NULL";"Initialisation de la liste «32».";2009-03-19 13:07:46;1;1
1036;0;1;"Échelle Mc Ginley dans le standard NCD";"33";"NULL";"Initialisation de la liste «33».";2009-03-19 13:07:46;1;1
1037;0;1;"Liste des règnes du vivant dans le standard NCD";"34";"NULL";"Initialisation de la liste «34».";2009-03-19 13:07:46;1;1
1038;0;1;"Liste des méthodes de conservation dans le standard NCD";"35";"NULL";"Initialisation de la liste «35».";2009-03-19 13:07:46;1;1
1039;0;1;"Liste des états de croissance d'une collection dans le standard NCD";"36";"NULL";"Initialisation de la liste «36».";2009-03-19 13:07:46;1;1
1040;0;1;"Liste des siècles pour les collections naturalistes";"37";"NULL";"Initialisation de la liste «37».";2009-03-19 13:07:46;1;1
1041;0;1;"Liste indéterminé/peut-être/oui/non";"38";"NULL";"Initialisation de la liste «38».";2009-03-19 13:07:46;1;1
1042;0;1;"Liste des types de classement des spécimens types dans une collection";"39";"NULL";"Initialisation de la liste «39».";2009-03-19 13:07:46;1;1
1043;0;1;"Liste des natures végétales";"40";"NULL";"Initialisation de la liste «40».";2009-03-19 13:07:46;1;1
1044;0;1;"Liste des types d'unité de rangement pour les collections botaniques";"41";"NULL";"Initialisation de la liste «41».";2009-03-19 13:07:46;1;1
1045;0;1;"Liste des états";"42";"NULL";"Initialisation de la liste «42».";2009-03-19 13:07:46;1;1
1046;0;1;"Liste des types de support pour les spécimens des collections botaniques";"43";"NULL";"Initialisation de la liste «43».";2009-03-19 13:07:46;1;1
1047;0;1;"Liste des types de papier de support pour les spécimens des collections botaniques";"44";"NULL";"Initialisation de la liste «44».";2009-03-19 13:07:46;1;1
1048;0;1;"Liste des méthodes de rangement des supports pour les spécimens des collections botaniques";"45";"NULL";"Initialisation de la liste «45».";2009-03-19 13:07:46;1;1
1049;0;1;"Liste des méthodes de fixation sur le support pour les collections botaniques";"46";"NULL";"Initialisation de la liste «46».";2009-03-19 13:07:46;1;1
1050;0;1;"Liste des méthodes de fixation des étiquettes sur les spécimens pour les collections botaniques";"47";"NULL";"Initialisation de la liste «47».";2009-03-19 13:07:46;1;1
1051;0;1;"Liste des types d'écriture d'étiquette";"48";"NULL";"Initialisation de la liste «48».";2009-03-19 13:07:46;1;1
1052;0;1;"Liste des origines des dégradations des spécimens de collections botaniques";"49";"NULL";"Initialisation de la liste «49».";2009-03-19 13:07:46;1;1
1053;0;1;"Liste des origines des dégradations des supports de collections botaniques";"50";"NULL";"Initialisation de la liste «50».";2009-03-19 13:07:46;1;1
1054;0;1;"Liste des niveaux de détermination des spécimens de collections botaniques";"51";"NULL";"Initialisation de la liste «51».";2009-03-19 13:07:46;1;1
1055;0;1;"Liste des types de date de début";"52";"NULL";"Initialisation de la liste «52».";2009-03-19 13:07:46;1;1
1056;0;1;"Liste des types de date de fin";"53";"NULL";"Initialisation de la liste «53».";2009-03-19 13:07:46;1;1
1057;0;1;"Liste des états de classement";"54";"NULL";"Initialisation de la liste «54».";2009-03-19 13:07:46;1;1
1058;0;1;"Liste des informations présentes sur les étiquettes de collections botaniques";"55";"NULL";"Initialisation de la liste «55».";2009-03-19 13:07:46;1;1
1059;0;1;"Liste oui/non/en grande partie";"56";"NULL";"Initialisation de la liste «56».";2009-03-19 13:07:46;1;1
1060;0;1;"Liste indéterminé/parfois/oui/non";"57";"NULL";"Initialisation de la liste «57».";2009-03-19 13:07:46;1;1
1061;0;1;"Liste des formes d'inventaire";"58";"NULL";"Initialisation de la liste «58».";2009-03-19 13:07:46;1;1
1062;0;1;"Liste des types de logiciel pour les inventaires informatiques";"59";"NULL";"Initialisation de la liste «59».";2009-03-19 13:07:46;1;1
1063;0;1;"Liste des états d'inventaire";"60";"NULL";"Initialisation de la liste «60».";2009-03-19 13:07:46;1;1
1064;0;1;"Liste des relations entre une publication et une personne";"61";"NULL";"Initialisation de la liste «61».";2009-03-19 13:07:46;1;1
1065;0;1;"Liste des types de publication vis à vis d'une personne";"62";"NULL";"Initialisation de la liste «62».";2009-03-19 13:07:46;1;1
1066;0;1;"Liste des types d'url";"63";"NULL";"Initialisation de la liste «63».";2009-03-19 13:07:46;1;1
1067;0;1;"Liste du genre d'une personne";"64";"NULL";"Initialisation de la liste «64».";2009-03-19 13:07:46;1;1
1068;0;1;"Liste des types de commentaires associés à une collection";"65";"NULL";"Initialisation de la liste «65».";2009-03-19 13:07:46;1;1
1069;0;1;"Liste des types de projet";"66";"NULL";"Initialisation de la liste «66».";2009-03-24 18:00:42;1;1
1070;0;1;"Liste des relations génériques";"67";"NULL";"Initialisation de la liste «67».";2009-03-24 18:00:42;1;1
1071;0;1;"Liste des langues du standard ISO-639-1";"68";"NULL";"Initialisation de la liste «68».";2009-03-24 18:00:42;1;1
1072;0;1;"Liste de durées de fonctionnement d'un script en heure ";"69";"NULL";"Initialisation de la liste «69».";2009-04-08 11:59:42;1;1
1073;0;1;"Liste de fréquences de lancement d'un script";"70";"NULL";"Initialisation de la liste «70».";2009-04-08 11:59:42;1;1
1074;0;1;"Liste des pays du standard ISO-3166-1";"71";"NULL";"Initialisation de la liste «71».";2009-04-08 11:59:43;1;1
1075;0;1;"Liste des types de points d'accès aux services web";"72";"NULL";"Initialisation de la liste «72».";2009-05-07 10:56:00;1;1
1076;0;1;"Liste des modèles de services web";"73";"NULL";"Initialisation de la liste «73».";2009-05-07 10:56:00;1;1
1077;0;1;"Liste des types de courriel";"74";"NULL";"Initialisation de la liste «74».";2009-05-12 14:17:00;1;1
1078;0;1;"Liste des noms de zones géographiques administrative de niveau 1 du projet Geonames";"75";"NULL";"Initialisation de la liste «75».";2009-07-29 01:17:00;1;1
1079;0;1;"Liste des noms de zones géographiques administrative de niveau 2 du projet Geonames";"76";"NULL";"Initialisation de la liste «76».";2009-07-29 01:15:00;1;1
1080;0;1;"Liste indéterminé/oui/non";"77";"NULL";"Initialisation de la liste «77».";2009-09-02 13:45:00;1;1
1081;0;1;"Liste des niveaux d'importance";"78";"NULL";"Initialisation de la liste «78».";2009-10-26 18:32:00;1;1
1082;0;1;"Liste exact/approximatif";"79";"NULL";"Initialisation de la liste «79».";2009-10-27 11:20:00;1;1
1083;0;1;"Liste des types de collection botanique";"80";"NULL";"Initialisation de la liste «80».";2009-09-29 13:58:00;1;1
2001;1004;1;"Mr.";"1";"NULL";"Initialisation de la valeur «1» pour la liste «01».";2009-03-19 13:07:46;1;1
2002;1004;1;"Dr.";"2";"NULL";"Initialisation de la valeur «2» pour la liste «01».";2009-03-19 13:07:46;1;1
2003;1004;1;"Abbé";"3";"NULL";"Initialisation de la valeur «3» pour la liste «01».";2009-03-19 13:07:46;1;1
2004;1004;1;"Colonel";"4";"NULL";"Initialisation de la valeur «4» pour la liste «01».";2009-03-19 13:07:46;1;1
2005;1004;1;"Prof.";"5";"NULL";"Initialisation de la valeur «5» pour la liste «01».";2009-03-19 13:07:46;1;1
2006;1004;1;"von";"6";"NULL";"Initialisation de la valeur «6» pour la liste «01».";2009-03-19 13:07:46;1;1
2007;1004;1;"Lord";"7";"NULL";"Initialisation de la valeur «7» pour la liste «01».";2009-03-19 13:07:46;1;1
2008;1005;1;"Jr";"1";"NULL";"Initialisation de la valeur «1» pour la liste «02».";2009-03-19 13:07:46;1;1
2009;1005;1;"I";"2";"NULL";"Initialisation de la valeur «2» pour la liste «02».";2009-03-19 13:07:46;1;1
2010;1005;1;"II";"3";"NULL";"Initialisation de la valeur «3» pour la liste «02».";2009-03-19 13:07:46;1;1
2011;1005;1;"III";"4";"NULL";"Initialisation de la valeur «4» pour la liste «02».";2009-03-19 13:07:46;1;1
2012;1006;1;"Surnom";"SNO";"NULL";"Initialisation de la valeur «SNO» pour la liste «03».";2009-03-19 13:07:46;1;1
2013;1006;1;"Nom alternatif";"ALT";"NULL";"Initialisation de la valeur «ALT» pour la liste «03».";2009-03-19 13:07:46;1;1
2014;1007;1;"Portable";"GSM";"NULL";"Initialisation de la valeur «GSM» pour la liste «04».";2009-03-19 13:07:46;1;1
2015;1007;1;"Téléphone fixe";"FIX";"NULL";"Initialisation de la valeur «FIX» pour la liste «04».";2009-03-19 13:07:46;1;1
2016;1007;1;"Pager";"PAG";"NULL";"Initialisation de la valeur «PAG» pour la liste «04».";2009-03-19 13:07:47;1;1
30747;1007;1;"Fax";"FAX";"NULL";"Initialisation de la valeur «FAX» pour la liste «04».";2009-09-02 13:56:00;1;1
2017;1009;1;"Super-Administrateur";"1";"NULL";"Initialisation de la valeur «1» pour la liste «06».";2009-03-19 13:07:47;1;1
2018;1009;1;"Administrateur";"2";"NULL";"Initialisation de la valeur «2» pour la liste «06».";2009-03-19 13:07:47;1;1
2019;1009;1;"Coordinateur";"3";"NULL";"Initialisation de la valeur «3» pour la liste «06».";2009-03-19 13:07:47;1;1
2020;1009;1;"Contributeur";"4";"NULL";"Initialisation de la valeur «4» pour la liste «06».";2009-03-19 13:07:47;1;1
2021;1009;1;"Utilisateur";"5";"NULL";"Initialisation de la valeur «5» pour la liste «06».";2009-03-19 13:07:47;1;1
2022;1010;1;"Administrateur";"1";"NULL";"Initialisation de la valeur «1» pour la liste «07».";2009-03-19 13:07:47;1;1
2023;1010;1;"Coordinateur";"2";"NULL";"Initialisation de la valeur «2» pour la liste «07».";2009-03-19 13:07:47;1;1
2024;1010;1;"Contributeur";"3";"NULL";"Initialisation de la valeur «3» pour la liste «07».";2009-03-19 13:07:47;1;1
2025;1010;1;"est coordinateur de";"4";"NULL";"Initialisation de la valeur «4» pour la liste «07».";2009-03-19 13:07:47;1;1
2026;1011;1;"est administrer par";"EAP";"Indique quelle personne peut administrer les données dans l'application courante.";"Initialisation de la valeur «1» pour la liste «08».";2009-03-19 13:07:47;1;1
2027;1011;1;"équipe";"EQU";"Rôle général d'une personne au sein d'une structure.";"Initialisation de la valeur «2» pour la liste «08».";2009-03-19 13:07:47;1;1
2830;1011;1;"Administrateur système";"AS";"Administrateur système (= System Administrator).";"Initialisation de la valeur «3» pour la liste «08».";2009-05-07 15:26:00;1;1
2831;1011;1;"Administrateur données";"AD";"Administrateur des données (= Data Administrator).";"Initialisation de la valeur «4» pour la liste «08».";2009-05-07 15:27:00;1;1
2028;1012;1;"Directeur";"1";"NULL";"Initialisation de la valeur «1» pour la liste «09».";2009-03-19 13:07:47;1;1
2029;1012;1;"Conservateur";"2";"NULL";"Initialisation de la valeur «2» pour la liste «09».";2009-03-19 13:07:47;1;1
2030;1012;1;"Technicien";"3";"NULL";"Initialisation de la valeur «3» pour la liste «09».";2009-03-19 13:07:47;1;1
2031;1013;1;"Salarié";"1";"NULL";"Initialisation de la valeur «1» pour la liste «10».";2009-03-19 13:07:47;1;1
2032;1013;1;"Bénévole";"2";"NULL";"Initialisation de la valeur «2» pour la liste «10».";2009-03-19 13:07:47;1;1
2033;1014;1;"Aquarium";"1";"NULL";"Initialisation de la valeur «1» pour la liste «11».";2009-03-19 13:07:47;1;1
2034;1014;1;"Archive";"2";"NULL";"Initialisation de la valeur «2» pour la liste «11».";2009-03-19 13:07:47;1;1
2035;1014;1;"Jardin botanique";"3";"NULL";"Initialisation de la valeur «3» pour la liste «11».";2009-03-19 13:07:47;1;1
2036;1014;1;"Protection de la nature";"4";"NULL";"Initialisation de la valeur «4» pour la liste «11».";2009-03-19 13:07:47;1;1
2037;1014;1;"Station d'étude";"5";"NULL";"Initialisation de la valeur «5» pour la liste «11».";2009-03-19 13:07:47;1;1
2038;1014;1;"Établissement d'État";"6";"NULL";"Initialisation de la valeur «6» pour la liste «11».";2009-03-19 13:07:47;1;1
2039;1014;1;"Société d'histoire";"7";"NULL";"Initialisation de la valeur «7» pour la liste «11».";2009-03-19 13:07:47;1;1
2040;1014;1;"Établissement horticole";"8";"NULL";"Initialisation de la valeur «8» pour la liste «11».";2009-03-19 13:07:47;1;1
2041;1014;1;"Industrie";"9";"NULL";"Initialisation de la valeur «9» pour la liste «11».";2009-03-19 13:07:47;1;1
2042;1014;1;"Laboratoire";"10";"NULL";"Initialisation de la valeur «10» pour la liste «11».";2009-03-19 13:07:47;1;1
2043;1014;1;"Bibliothèque";"11";"NULL";"Initialisation de la valeur «11» pour la liste «11».";2009-03-19 13:07:47;1;1
2044;1014;1;"Gestion de la nature";"12";"NULL";"Initialisation de la valeur «12» pour la liste «11».";2009-03-19 13:07:47;1;1
2045;1014;1;"Museum";"13";"NULL";"Initialisation de la valeur «13» pour la liste «11».";2009-03-19 13:07:47;1;1
2046;1014;1;"Centre d'éducation à la nature";"14";"NULL";"Initialisation de la valeur «14» pour la liste «11».";2009-03-19 13:07:47;1;1
2047;1014;1;"Établissement scolaire (Lycée)";"15";"NULL";"Initialisation de la valeur «15» pour la liste «11».";2009-03-19 13:07:47;1;1
2048;1014;1;"Parc";"16";"NULL";"Initialisation de la valeur «16» pour la liste «11».";2009-03-19 13:07:47;1;1
2049;1014;1;"Dépôt";"17";"NULL";"Initialisation de la valeur «17» pour la liste «11».";2009-03-19 13:07:47;1;1
2050;1014;1;"Institut de Recherche";"18";"NULL";"Initialisation de la valeur «18» pour la liste «11».";2009-03-19 13:07:47;1;1
2051;1014;1;"Établissement scolaire (École primaire)";"19";"NULL";"Initialisation de la valeur «19» pour la liste «11».";2009-03-19 13:07:47;1;1
2052;1014;1;"Centre scientifique";"20";"NULL";"Initialisation de la valeur «20» pour la liste «11».";2009-03-19 13:07:47;1;1
2053;1014;1;"Société";"21";"NULL";"Initialisation de la valeur «21» pour la liste «11».";2009-03-19 13:07:47;1;1
2054;1014;1;"Établissement scolaire (Université)";"22";"NULL";"Initialisation de la valeur «22» pour la liste «11».";2009-03-19 13:07:47;1;1
2055;1014;1;"Zoo";"23";"NULL";"Initialisation de la valeur «23» pour la liste «11».";2009-03-19 13:07:47;1;1
2056;1015;1;"Association";"1";"NULL";"Initialisation de la valeur «1» pour la liste «12».";2009-03-19 13:07:47;1;1
2057;1015;1;"Laboratoire";"2";"NULL";"Initialisation de la valeur «2» pour la liste «12».";2009-03-19 13:07:47;1;1
2058;1015;1;"Fondation";"3";"NULL";"Initialisation de la valeur «3» pour la liste «12».";2009-03-19 13:07:47;1;1
2059;1015;1;"Particulier";"4";"NULL";"Initialisation de la valeur «4» pour la liste «12».";2009-03-19 13:07:47;1;1
2060;1016;1;"Service municipal";"1";"NULL";"Initialisation de la valeur «1» pour la liste «13».";2009-03-19 13:07:47;1;1
2061;1016;1;"Conseil général";"2";"NULL";"Initialisation de la valeur «2» pour la liste «13».";2009-03-19 13:07:47;1;1
2062;1016;1;"National";"3";"NULL";"Initialisation de la valeur «3» pour la liste «13».";2009-03-19 13:07:47;1;1
2063;1016;1;"Université";"4";"NULL";"Initialisation de la valeur «4» pour la liste «13».";2009-03-19 13:07:47;1;1
2064;1016;1;"Conseil Régional";"5";"NULL";"Initialisation de la valeur «5» pour la liste «13».";2009-03-19 13:07:47;1;1
2065;1017;1;"Index Herbarorium";"IH";"Base de données mondiale où se trouvent répertoriées des informations sur plus de 3000 herbiers publics dans le monde ainsi que leurs équipes. Chaque herbier enregistré dans cet index est désigné également par un acronyme international. Exemple : Herbier de l'Université de Montpellier II = MPU.
Un herbier peut être enregistré dans cette base si ces collections totalisent plus de 5000 échantillons.
Site internet : http://sweetgum.nybg.org/ih/";"Initialisation de la valeur «IH» pour la liste «14».";2009-06-03 15:40:00;1;1
2066;1017;1;"Muséum National d'Histoire Naturelle";"MNHN";"Pour toute demande de création d'un acronyme français contacter Marc PIGNAL <pignal@mnhn.fr>, chargé de conservation de l'herbier National de Paris (P).
Les herbiers de moins de 5000 spécimens ne seront recensés qu'au niveau du MNHN. Par la suite, lorsque le chiffre de 5000 est atteint, le MNHN en avisera l'Index Herbariorum et communiquera les données.";"Initialisation de la valeur «MNHN» pour la liste «14».";2009-06-03 15:40:00;1;1
2067;1018;1;"Réserves";"1";"Lieu de stockage des collections d'un musée, d'une bibliothèque, etc. qui sert à conserver les collections, les étudier et les gérer mais non accessible au public.";"Initialisation de la valeur «1» pour la liste «15».";2009-06-03 15:13:00;1;1
2068;1018;1;"Bâtiment (ex. : Herbier)";"2";"NULL";"Initialisation de la valeur «2» pour la liste «15».";2009-03-19 13:07:47;1;1
2069;1018;1;"Pièce";"3";"NULL";"Initialisation de la valeur «3» pour la liste «15».";2009-03-19 13:07:47;1;1
2070;1019;1;"Rayonnages mobiles type Compactus";"1";"Rayonnages sur rails pouvant être déplacés, manuellement ou automatiquement, de façon à utiliser l'espace ordinairement occupé par les allées de desserte entre travées.";"Initialisation de la valeur «1» pour la liste «16».";2009-06-02 17:05:00;1;1
2071;1019;1;"Armoires métalliques";"2";"NULL";"Initialisation de la valeur «2» pour la liste «16».";2009-03-19 13:07:47;1;1
2072;1019;1;"Armoires en bois";"3";"NULL";"Initialisation de la valeur «3» pour la liste «16».";2009-03-19 13:07:47;1;1
2073;1019;1;"Étagères métalliques";"4";"NULL";"Initialisation de la valeur «4» pour la liste «16».";2009-03-19 13:07:47;1;1
2074;1019;1;"Étagères en bois";"5";"NULL";"Initialisation de la valeur «5» pour la liste «16».";2009-03-19 13:07:47;1;1
2075;1020;1;"Température extrêmement élevée";"1";"NULL";"Initialisation de la valeur «1» pour la liste «17».";2009-03-19 13:07:47;1;1
2076;1020;1;"Hygrométrie";"2";"NULL";"Initialisation de la valeur «2» pour la liste «17».";2009-03-19 13:07:47;1;1
2077;1020;1;"Lumière";"3";"NULL";"Initialisation de la valeur «3» pour la liste «17».";2009-03-19 13:07:47;1;1
2078;1020;1;"Température extrêmement basse";"4";"NULL";"Initialisation de la valeur «4» pour la liste «17».";2009-03-19 13:07:47;1;1
2079;1021;1;"Collection d'entomologie (insectes)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «18».";2009-03-19 13:07:47;1;1
2080;1021;1;"Animaux naturalisés";"2";"NULL";"Initialisation de la valeur «2» pour la liste «18».";2009-03-19 13:07:47;1;1
2081;1021;1;"Bibliothèque générale";"3";"NULL";"Initialisation de la valeur «3» pour la liste «18».";2009-03-19 13:07:47;1;1
2082;1021;1;"Bibliothèque botanique";"4";"NULL";"Initialisation de la valeur «4» pour la liste «18».";2009-03-19 13:07:47;1;1
2083;1021;1;"Collections d'ethnologie";"5";"NULL";"Initialisation de la valeur «5» pour la liste «18».";2009-03-19 13:07:47;1;1
2084;1021;1;"Archives papier";"6";"NULL";"Initialisation de la valeur «6» pour la liste «18».";2009-03-19 13:07:47;1;1
2085;1021;1;"Collection de diapos/photos";"7";"NULL";"Initialisation de la valeur «7» pour la liste «18».";2009-03-19 13:07:47;1;1
2086;1021;1;"Minéraux";"8";"NULL";"Initialisation de la valeur «8» pour la liste «18».";2009-03-19 13:07:47;1;1
2087;1022;1;"Remplacement des contenants (cartons, planches, etc)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «19».";2009-03-19 13:07:47;1;1
2088;1022;1;"Remplacement du papier";"2";"NULL";"Initialisation de la valeur «2» pour la liste «19».";2009-03-19 13:07:47;1;1
2089;1022;1;"Montage des échantillons";"3";"NULL";"Initialisation de la valeur «3» pour la liste «19».";2009-03-19 13:07:47;1;1
2090;1022;1;"Montage des étiquettes";"4";"NULL";"Initialisation de la valeur «4» pour la liste «19».";2009-03-19 13:07:47;1;1
2091;1022;1;"Reclassement";"5";"NULL";"Initialisation de la valeur «5» pour la liste «19».";2009-03-19 13:07:47;1;1
2092;1023;1;"Non";"1";"NULL";"Initialisation de la valeur «1» pour la liste «20».";2009-03-19 13:07:47;1;1
2093;1023;1;"Oui";"2";"NULL";"Initialisation de la valeur «2» pour la liste «20».";2009-03-19 13:07:47;1;1
2094;1023;1;"En partie";"3";"NULL";"Initialisation de la valeur «3» pour la liste «20».";2009-03-19 13:07:47;1;1
2096;1024;1;"Papier normal";"2";"NULL";"Initialisation de la valeur «2» pour la liste «21».";2009-03-19 13:07:47;1;1
2097;1024;1;"Papier épais";"3";"NULL";"Initialisation de la valeur «3» pour la liste «21».";2009-03-19 13:07:47;1;1
2098;1024;1;"Papier cartonné";"4";"NULL";"Initialisation de la valeur «4» pour la liste «21».";2009-03-19 13:07:47;1;1
2099;1024;1;"Colle forte";"5";"NULL";"Initialisation de la valeur «5» pour la liste «21».";2009-03-19 13:07:47;1;1
2100;1024;1;"Colle en stick";"6";"NULL";"Initialisation de la valeur «6» pour la liste «21».";2009-03-19 13:07:47;1;1
2101;1024;1;"Colle blanche";"7";"NULL";"Initialisation de la valeur «7» pour la liste «21».";2009-03-19 13:07:47;1;1
2102;1024;1;"Ruban adhésif standard";"8";"NULL";"Initialisation de la valeur «8» pour la liste «21».";2009-03-19 13:07:47;1;1
2103;1025;1;"Fumigations";"1";"NULL";"Initialisation de la valeur «1» pour la liste «22».";2009-03-19 13:07:47;1;1
2104;1025;1;"Paradichlorobenzène ou anti-mites";"2";"NULL";"Initialisation de la valeur «2» pour la liste «22».";2009-03-19 13:07:47;1;1
2105;1025;1;"Insecticide en bombe";"3";"NULL";"Initialisation de la valeur «3» pour la liste «22».";2009-03-19 13:07:47;1;1
2106;1025;1;"Anoxie";"4";"NULL";"Initialisation de la valeur «4» pour la liste «22».";2009-03-19 13:07:47;1;1
2107;1025;1;"Surgélation";"5";"NULL";"Initialisation de la valeur «5» pour la liste «22».";2009-03-19 13:07:47;1;1
2108;1025;1;"Congélation";"6";"NULL";"Initialisation de la valeur «6» pour la liste «22».";2009-03-19 13:07:47;1;1
2109;1025;1;"Four micro-ondes";"7";"NULL";"Initialisation de la valeur «7» pour la liste «22».";2009-03-19 13:07:47;1;1
2110;1026;1;"Préparation à base de mercure";"1";"NULL";"Initialisation de la valeur «1» pour la liste «23».";2009-03-19 13:07:47;1;1
2111;1026;1;"Préparation à base d’arsenic";"2";"NULL";"Initialisation de la valeur «2» pour la liste «23».";2009-03-19 13:07:47;1;1
2112;1026;1;"Préparation à base de mercure et d’arsenic";"3";"NULL";"Initialisation de la valeur «3» pour la liste «23».";2009-03-19 13:07:47;1;1
2113;1027;1;"Ouvrages";"1";"NULL";"Initialisation de la valeur «1» pour la liste «24».";2009-03-19 13:07:47;1;1
2114;1027;1;"Articles de presse ou interviews radio / TV";"2";"NULL";"Initialisation de la valeur «2» pour la liste «24».";2009-03-19 13:07:47;1;1
2115;1027;1;"Animations";"3";"NULL";"Initialisation de la valeur «3» pour la liste «24».";2009-03-19 13:07:47;1;1
2116;1027;1;"Articles scientifiques";"4";"NULL";"Initialisation de la valeur «4» pour la liste «24».";2009-03-19 13:07:47;1;1
2117;1027;1;"Visites de groupes";"5";"NULL";"Initialisation de la valeur «5» pour la liste «24».";2009-03-19 13:07:47;1;1
2118;1027;1;"Conférences";"6";"NULL";"Initialisation de la valeur «6» pour la liste «24».";2009-03-19 13:07:47;1;1
2119;1027;1;"Expositions";"7";"NULL";"Initialisation de la valeur «7» pour la liste «24».";2009-03-19 13:07:47;1;1
2120;1028;1;"France";"1";"NULL";"Initialisation de la valeur «1» pour la liste «25».";2009-03-19 13:07:47;1;1
2121;1028;1;"Europe";"2";"NULL";"Initialisation de la valeur «2» pour la liste «25».";2009-03-19 13:07:47;1;1
2122;1028;1;"Asie";"3";"NULL";"Initialisation de la valeur «3» pour la liste «25».";2009-03-19 13:07:47;1;1
2123;1028;1;"Amérique";"4";"NULL";"Initialisation de la valeur «4» pour la liste «25».";2009-03-19 13:07:47;1;1
2124;1028;1;"Afrique";"5";"NULL";"Initialisation de la valeur «5» pour la liste «25».";2009-03-19 13:07:47;1;1
2125;1028;1;"Océanie";"6";"NULL";"Initialisation de la valeur «6» pour la liste «25».";2009-03-19 13:07:47;1;1
2126;1029;1;"Systématique";"1";"NULL";"Initialisation de la valeur «1» pour la liste «26».";2009-03-19 13:07:47;1;1
2127;1029;1;"Chorologie";"2";"NULL";"Initialisation de la valeur «2» pour la liste «26».";2009-03-19 13:07:47;1;1
2128;1029;1;"Biologie moléculaire";"3";"NULL";"Initialisation de la valeur «3» pour la liste «26».";2009-03-19 13:07:47;1;1
2129;1029;1;"Pharmacie";"4";"NULL";"Initialisation de la valeur «4» pour la liste «26».";2009-03-19 13:07:47;1;1
2130;1029;1;"Ethnobotanique";"5";"NULL";"Initialisation de la valeur «5» pour la liste «26».";2009-03-19 13:07:47;1;1
2131;1029;1;"Histoire des sciences";"6";"NULL";"Initialisation de la valeur «6» pour la liste «26».";2009-03-19 13:07:47;1;1
2132;1029;1;"Palynologie";"7";"NULL";"Initialisation de la valeur «7» pour la liste «26».";2009-03-19 13:07:47;1;1
2133;1029;1;"Paléobotanique";"8";"NULL";"Initialisation de la valeur «8» pour la liste «26».";2009-03-19 13:07:47;1;1
2134;1030;1;"Contributeur (celui qui a saisi la fiche le premier)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «27».";2009-03-19 13:07:47;1;1
2135;1030;1;"Auteur";"2";"NULL";"Initialisation de la valeur «2» pour la liste «27».";2009-03-19 13:07:47;1;1
2136;1030;1;"Collecteur";"3";"NULL";"Initialisation de la valeur «3» pour la liste «27».";2009-03-19 13:07:47;1;1
2137;1030;1;"Déterminateur";"4";"NULL";"Initialisation de la valeur «4» pour la liste «27».";2009-03-19 13:07:47;1;1
2138;1030;1;"Hébergeur (particulier possédant une collection chez lui)";"5";"NULL";"Initialisation de la valeur «5» pour la liste «27».";2009-03-19 13:07:47;1;1
2139;1031;1;"inclu dans";"1";"NULL";"Initialisation de la valeur «1» pour la liste «28».";2009-03-19 13:07:47;1;1
2140;1032;1;"Archive";"archival";"NULL";"Initialisation de la valeur «archival» pour la liste «29».";2009-03-19 13:07:47;1;1
2141;1032;1;"Art";"art";"NULL";"Initialisation de la valeur «art» pour la liste «29».";2009-03-19 13:07:47;1;1
2142;1032;1;"Audio";"audio";"NULL";"Initialisation de la valeur «audio» pour la liste «29».";2009-03-19 13:07:47;1;1
2143;1032;1;"Culture de cellules";"cellcultures";"NULL";"Initialisation de la valeur «cellcultures» pour la liste «29».";2009-03-19 13:07:47;1;1
2144;1032;1;"Électronique";"electronic";"NULL";"Initialisation de la valeur «electronic» pour la liste «29».";2009-03-19 13:07:47;1;1
2145;1032;1;"Facsimilés";"facsimiles";"NULL";"Initialisation de la valeur «facsimiles» pour la liste «29».";2009-03-19 13:07:47;1;1
2146;1032;1;"Fossiles";"fossils";"NULL";"Initialisation de la valeur «fossils» pour la liste «29».";2009-03-19 13:07:47;1;1
2147;1032;1;"Génétique";"genetic";"NULL";"Initialisation de la valeur «genetic» pour la liste «29».";2009-03-19 13:07:47;1;1
2148;1032;1;"Vivante";"living";"NULL";"Initialisation de la valeur «living» pour la liste «29».";2009-03-19 13:07:47;1;1
2149;1032;1;"Observations";"observations";"NULL";"Initialisation de la valeur «observations» pour la liste «29».";2009-03-19 13:07:47;1;1
2150;1032;1;"Préservée";"preserved";"NULL";"Initialisation de la valeur «preserved» pour la liste «29».";2009-03-19 13:07:47;1;1
2151;1032;1;"Produits";"products";"NULL";"Initialisation de la valeur «products» pour la liste «29».";2009-03-19 13:07:47;1;1
2152;1032;1;"Spécimens";"taxonomic";"NULL";"Initialisation de la valeur «taxonomic» pour la liste «29».";2009-03-19 13:07:47;1;1
2153;1032;1;"Textes (Manuscrits)";"texts";"NULL";"Initialisation de la valeur «texts» pour la liste «29».";2009-03-19 13:07:47;1;1
2154;1032;1;"Tissus biologiques";"tissue";"NULL";"Initialisation de la valeur «tissue» pour la liste «29».";2009-03-19 13:07:47;1;1
2155;1032;1;"Visuelle";"visual";"NULL";"Initialisation de la valeur «visual» pour la liste «29».";2009-03-19 13:07:47;1;1
2156;1032;1;"Géologique";"_geologique_";"NULL";"Initialisation de la valeur «_geologique_» pour la liste «29».";2009-03-19 13:07:47;1;1
2157;1032;1;"Herbier";"_herbier_";"NULL";"Initialisation de la valeur «_herbier_» pour la liste «29».";2009-03-19 13:07:47;1;1
2158;1032;1;"Minéralogique";"_mineralogique_";"NULL";"Initialisation de la valeur «_mineralogique_» pour la liste «29».";2009-03-19 13:07:47;1;1
2159;1033;1;"Patrimoine de l'institution";"1";"NULL";"Initialisation de la valeur «1» pour la liste «30».";2009-03-19 13:07:47;1;1
2160;1033;1;"Dépôt permanent";"2";"NULL";"Initialisation de la valeur «2» pour la liste «30».";2009-03-19 13:07:47;1;1
2161;1033;1;"Dépôt temporaire";"3";"NULL";"Initialisation de la valeur «3» pour la liste «30».";2009-03-19 13:07:47;1;1
2162;1033;1;"Dépôt non consultable (privé)";"4";"NULL";"Initialisation de la valeur «4» pour la liste «30».";2009-03-19 13:07:47;1;1
2163;1033;1;"Prêt";"5";"NULL";"Initialisation de la valeur «5» pour la liste «30».";2009-03-19 13:07:47;1;1
2164;1034;1;"Culturel";"cultural";"NULL";"Initialisation de la valeur «cultural» pour la liste «31».";2009-03-19 13:07:47;1;1
2165;1034;1;"Écosystème";"ecosystems";"NULL";"Initialisation de la valeur «ecosystems» pour la liste «31».";2009-03-19 13:07:47;1;1
2166;1034;1;"Environmental";"environmental";"NULL";"Initialisation de la valeur «environmental» pour la liste «31».";2009-03-19 13:07:47;1;1
2167;1034;1;"Évènement";"events";"NULL";"Initialisation de la valeur «events» pour la liste «31».";2009-03-19 13:07:47;1;1
2168;1034;1;"Expédition";"expeditions";"NULL";"Initialisation de la valeur «expeditions» pour la liste «31».";2009-03-19 13:07:47;1;1
2169;1034;1;"National";"national";"NULL";"Initialisation de la valeur «national» pour la liste «31».";2009-03-19 13:07:47;1;1
2170;1034;1;"Relation biologique";"relationships";"NULL";"Initialisation de la valeur «relationships» pour la liste «31».";2009-03-19 13:07:47;1;1
2171;1034;1;"Dépôt";"repository";"NULL";"Initialisation de la valeur «repository» pour la liste «31».";2009-03-19 13:07:47;1;1
2172;1034;1;"Spatial";"spatial";"NULL";"Initialisation de la valeur «spatial» pour la liste «31».";2009-03-19 13:07:47;1;1
2173;1034;1;"Stade de développement";"stage";"NULL";"Initialisation de la valeur «stage» pour la liste «31».";2009-03-19 13:07:47;1;1
2174;1034;1;"Taxonomique";"taxonomic";"NULL";"Initialisation de la valeur «taxonomic» pour la liste «31».";2009-03-19 13:07:47;1;1
2175;1034;1;"Période";"temporal";"NULL";"Initialisation de la valeur «temporal» pour la liste «31».";2009-03-19 13:07:47;1;1
2176;1035;1;"Commercial";"commercial";"NULL";"Initialisation de la valeur «commercial» pour la liste «32».";2009-03-19 13:07:47;1;1
2177;1035;1;"Analyses destructrices";"destructiveAnalysis";"NULL";"Initialisation de la valeur «destructiveAnalysis» pour la liste «32».";2009-03-19 13:07:47;1;1
2178;1035;1;"Éducation";"education";"NULL";"Initialisation de la valeur «education» pour la liste «32».";2009-03-19 13:07:47;1;1
2179;1035;1;"Présentation";"exhibition";"NULL";"Initialisation de la valeur «exhibition» pour la liste «32».";2009-03-19 13:07:47;1;1
2180;1035;1;"Étude";"monitoring";"NULL";"Initialisation de la valeur «monitoring» pour la liste «32».";2009-03-19 13:07:47;1;1
2181;1035;1;"Ornemental";"ornamental";"NULL";"Initialisation de la valeur «ornamental» pour la liste «32».";2009-03-19 13:07:47;1;1
2182;1035;1;"personnel";"personal";"NULL";"Initialisation de la valeur «personal» pour la liste «32».";2009-03-19 13:07:47;1;1
2183;1035;1;"Recherche";"research";"NULL";"Initialisation de la valeur «research» pour la liste «32».";2009-03-19 13:07:47;1;1
2184;1035;1;"Voucher (à traduire)";"voucher";"NULL";"Initialisation de la valeur «voucher» pour la liste «32».";2009-03-19 13:07:47;1;1
2185;1036;1;"Mac Ginley 1";"McGinley1";"Specimens deteriorating, potentially cullable, or unprepared. Collection unit in need of immediate attention; museum pests, rusting pins, crystallizing slide media, unringed Hoyer's media, evaporated alcohol, fading labels, broken cover slip or slide, etc. Primary types missed in general collection.";"Initialisation de la valeur «McGinley1» pour la liste «33».";2009-03-19 13:07:47;1;1
2186;1036;1;"Mac Ginley 2";"McGinley2";"Material properly prepared but not sorted or only rough-sorted; not readily available to specialists.";"Initialisation de la valeur «McGinley2» pour la liste «33».";2009-03-19 13:07:47;1;1
2187;1036;1;"Mac Ginley 3";"McGinley3";"Specimens sorted to a level necessary to be efficiently accessible to research specialist for study. All specimens in soft-bottom trays, shell vials in jars or slide boxes, with appropriate levels denoting pertinent taxonomic information. Taxonomic category may vary among different taxa.";"Initialisation de la valeur «McGinley3» pour la liste «33».";2009-03-19 13:07:47;1;1
2188;1036;1;"Mac Ginley 4";"McGinley4";"Valuable material that has been identified to the species level but not yet put away effectively inaccessible.";"Initialisation de la valeur «McGinley4» pour la liste «33».";2009-03-19 13:07:47;1;1
2189;1036;1;"Mac Ginley 5";"McGinley5";"All specimens identified and integrated. However, this collection unit needs upgrading, e.g., names checked, header labels for unit trays prepared, transfer to soft-bottom trays, etc., box header labels checked against slides. Alcoholic collection with individual exposed vials, jar labels misleading or without detail, overall format heterogenous.";"Initialisation de la valeur «McGinley5» pour la liste «33».";2009-03-19 13:07:47;1;1
2190;1036;1;"Mac Ginley 6";"McGinley6";"All specimens in soft-bottom unit trays; all unit-tray header labels, drawer or box, and cabinet labels completed; space left for expansion. When a collection reaches Level 6, the name(s) or who did the curation, the date of curation and listing of catalogues or monographs on which the names are based should be entered in the Smithsonian Collection Inventory File computerized files. Vial within jar system established, labels complete and accurately typed, expansion space allocated, and alcohol levels adequate.";"Initialisation de la valeur «McGinley6» pour la liste «33».";2009-03-19 13:07:47;1;1
2191;1036;1;"Mac Ginley 7";"McGinley7";"Species inventory with header or box label generation completed. Alcoholic collection with taxa listed on jar labels and in database, as in Level 6 plus species-level inventory.";"Initialisation de la valeur «McGinley7» pour la liste «33».";2009-03-19 13:07:47;1;1
2192;1036;1;"Mac Ginley 8";"McGinley8";"Label data are recorded for systematic, biogeography or natural history studies. The data elements recorded will vary by group, however, a d standard core set includes the following: a) a country/province/place/latitude-longitude; b) date of collection; c) collector(s); d) miscellaneous (for example, elevation, host). Miscellaneous voucher specimens, including types, from various studies are also ranked at this level.";"Initialisation de la valeur «McGinley8» pour la liste «33».";2009-03-19 13:07:47;1;1
2193;1036;1;"Mac Ginley 9";"McGinley9";"Measurements, graphics, or other pertinent (descriptions) of specimens are captured in a database.";"Initialisation de la valeur «McGinley9» pour la liste «33».";2009-03-19 13:07:47;1;1
2194;1036;1;"Mac Ginley 10";"McGinley10";"Groups of specimens included in published monographic, synthetic, or revisionary works, including primary type collection if storage is at Level 7 or higher. When groups of specimens serve to voucher published scientific collection-based studies and have undergone conservation and accession requirements of at least Level 7.";"Initialisation de la valeur «McGinley10» pour la liste «33».";2009-03-19 13:07:47;1;1
2195;1037;1;"Animal";"Animalia";"NULL";"Initialisation de la valeur «Animalia» pour la liste «34».";2009-03-19 13:07:47;1;1
2196;1037;1;"Champignon";"Fungi";"NULL";"Initialisation de la valeur «Fungi» pour la liste «34».";2009-03-19 13:07:47;1;1
2197;1037;1;"Végétal";"Plantae";"NULL";"Initialisation de la valeur «Plantae» pour la liste «34».";2009-03-19 13:07:47;1;1
2198;1037;1;"Protiste";"Protista";"NULL";"Initialisation de la valeur «Protista» pour la liste «34».";2009-03-19 13:07:47;1;1
2199;1037;1;"Archéobactérie";"Archaebacteria";"NULL";"Initialisation de la valeur «Archaebacteria» pour la liste «34».";2009-03-19 13:07:47;1;1
2200;1037;1;"Eubactérie";"Eubacteria";"NULL";"Initialisation de la valeur «Eubacteria» pour la liste «34».";2009-03-19 13:07:47;1;1
2201;1038;1;"Atmosphère contrôlée";"controlledAtmosphere";"NULL";"Initialisation de la valeur «controlledAtmosphere» pour la liste «35».";2009-03-19 13:07:47;1;1
2202;1038;1;"Cryogénisation";"cryopreserved";"NULL";"Initialisation de la valeur «cryopreserved» pour la liste «35».";2009-03-19 13:07:47;1;1
2203;1038;1;"Séchée";"dried";"NULL";"Initialisation de la valeur «dried» pour la liste «35».";2009-03-19 13:07:47;1;1
2204;1038;1;"Séchée et pressée";"driedAndPressed";"NULL";"Initialisation de la valeur «driedAndPressed» pour la liste «35».";2009-03-19 13:07:47;1;1
2205;1038;1;"Enchâssé (Maintenu dans une matrice solide, convenant pour la confection des lames minces)";"embedded";"NULL";"Initialisation de la valeur «embedded» pour la liste «35».";2009-03-19 13:07:47;1;1
2206;1038;1;"Préservation dans un liquide";"fluidPreserved";"NULL";"Initialisation de la valeur «fluidPreserved» pour la liste «35».";2009-03-19 13:07:47;1;1
2207;1038;1;"Réfrigéré et séché";"freezeDried";"NULL";"Initialisation de la valeur «freezeDried» pour la liste «35».";2009-03-19 13:07:47;1;1
2208;1038;1;"Congelé";"frozen";"NULL";"Initialisation de la valeur «frozen» pour la liste «35».";2009-03-19 13:07:47;1;1
2209;1038;1;"Glycérine";"glycerin";"NULL";"Initialisation de la valeur «glycerin» pour la liste «35».";2009-03-19 13:07:47;1;1
2210;1038;1;"Inapplicable";"notApplicable";"NULL";"Initialisation de la valeur «notApplicable» pour la liste «35».";2009-03-19 13:07:47;1;1
2211;1038;1;"Aucun traitement";"noTreatment";"NULL";"Initialisation de la valeur «noTreatment» pour la liste «35».";2009-03-19 13:07:47;1;1
2212;1038;1;"Attaché (Épinglé)";"pinned";"NULL";"Initialisation de la valeur «pinned» pour la liste «35».";2009-03-19 13:07:47;1;1
2213;1038;1;"Enregistrement analogique";"recordedAnalog";"NULL";"Initialisation de la valeur «recordedAnalog» pour la liste «35».";2009-03-19 13:07:47;1;1
2214;1038;1;"Enregistrement numérique";"recordedDigital";"NULL";"Initialisation de la valeur «recordedDigital» pour la liste «35».";2009-03-19 13:07:47;1;1
2215;1038;1;"Réfrigéré";"refrigerated";"NULL";"Initialisation de la valeur «refrigerated» pour la liste «35».";2009-03-19 13:07:47;1;1
2216;1038;1;"Préparation pour microscope électronique à balayage";"semstub";"NULL";"Initialisation de la valeur «semstub» pour la liste «35».";2009-03-19 13:07:47;1;1
2217;1038;1;"Squelette";"skeletonized";"NULL";"Initialisation de la valeur «skeletonized» pour la liste «35».";2009-03-19 13:07:47;1;1
2218;1038;1;"Préparation microscopique";"slideMount";"NULL";"Initialisation de la valeur «slideMount» pour la liste «35».";2009-03-19 13:07:47;1;1
2219;1038;1;"Stase";"stasis";"NULL";"Initialisation de la valeur «stasis» pour la liste «35».";2009-03-19 13:07:47;1;1
2220;1038;1;"surfaceCoating";"surfaceCoating";"NULL";"Initialisation de la valeur «surfaceCoating» pour la liste «35».";2009-03-19 13:07:47;1;1
2221;1038;1;"Tanage";"tanned";"NULL";"Initialisation de la valeur «tanned» pour la liste «35».";2009-03-19 13:07:47;1;1
2222;1038;1;"Alcool";"_fluidPreservedAlcohol_";"NULL";"Initialisation de la valeur «_fluidPreservedAlcohol_» pour la liste «35».";2009-03-19 13:07:47;1;1
2223;1038;1;"Formol";"_fluidPreservedFormolin_";"NULL";"Initialisation de la valeur «_fluidPreservedFormolin_» pour la liste «35».";2009-03-19 13:07:47;1;1
2224;1038;1;"Gomme arabique";"_gumArabic_";"NULL";"Initialisation de la valeur «_gumArabic_» pour la liste «35».";2009-03-19 13:07:47;1;1
2225;1039;1;"Croissance active";"activegrowth";"NULL";"Initialisation de la valeur «activegrowth» pour la liste «36».";2009-03-19 13:07:47;1;1
2226;1039;1;"Fermée";"closed";"NULL";"Initialisation de la valeur «closed» pour la liste «36».";2009-03-19 13:07:47;1;1
2227;1039;1;"Consommable";"consumable";"NULL";"Initialisation de la valeur «consumable» pour la liste «36».";2009-03-19 13:07:47;1;1
2228;1039;1;"Décroissance";"decreasing";"NULL";"Initialisation de la valeur «decreasing» pour la liste «36».";2009-03-19 13:07:47;1;1
2229;1039;1;"Perdu";"lost";"NULL";"Initialisation de la valeur «lost» pour la liste «36».";2009-03-19 13:07:47;1;1
2230;1039;1;"Manquante";"missing";"NULL";"Initialisation de la valeur «missing» pour la liste «36».";2009-03-19 13:07:47;1;1
2231;1039;1;"Croissance passive";"passivegrowth";"NULL";"Initialisation de la valeur «passivegrowth» pour la liste «36».";2009-03-19 13:07:47;1;1
2232;1039;1;"Statique";"static";"NULL";"Initialisation de la valeur «static» pour la liste «36».";2009-03-19 13:07:47;1;1
2233;1040;1;"16ème siècle";"1";"NULL";"Initialisation de la valeur «1» pour la liste «37».";2009-03-19 13:07:47;1;1
2234;1040;1;"17ème siècle";"2";"NULL";"Initialisation de la valeur «2» pour la liste «37».";2009-03-19 13:07:47;1;1
2235;1040;1;"18ème siècle";"3";"NULL";"Initialisation de la valeur «3» pour la liste «37».";2009-03-19 13:07:47;1;1
2236;1040;1;"19ème siècle";"4";"NULL";"Initialisation de la valeur «4» pour la liste «37».";2009-03-19 13:07:47;1;1
2237;1040;1;"20ème siècle";"5";"NULL";"Initialisation de la valeur «5» pour la liste «37».";2009-03-19 13:07:47;1;1
2238;1040;1;"21ème siècle";"6";"NULL";"Initialisation de la valeur «6» pour la liste «37».";2009-03-19 13:07:47;1;1
2239;1041;1;"Indéterminé (= ne sais pas)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «38».";2009-03-19 13:07:47;1;1
2240;1041;1;"Peut-être";"2";"NULL";"Initialisation de la valeur «2» pour la liste «38».";2009-03-19 13:07:47;1;1
2241;1041;1;"Oui";"3";"NULL";"Initialisation de la valeur «3» pour la liste «38».";2009-03-19 13:07:47;1;1
2242;1041;1;"Non";"4";"NULL";"Initialisation de la valeur «4» pour la liste «38».";2009-03-19 13:07:47;1;1
2243;1042;1;"À part";"1";"NULL";"Initialisation de la valeur «1» pour la liste «39».";2009-03-19 13:07:47;1;1
2244;1042;1;"Inclus";"2";"NULL";"Initialisation de la valeur «2» pour la liste «39».";2009-03-19 13:07:47;1;1
2245;1042;1;"Partiellement extraits";"3";"NULL";"Initialisation de la valeur «3» pour la liste «39».";2009-03-19 13:07:47;1;1
2246;1043;1;"Phanérogames";"1";"NULL";"Initialisation de la valeur «1» pour la liste «40».";2009-03-19 13:07:47;1;1
2247;1043;1;"Gymnosperme (Conifère)";"2";"NULL";"Initialisation de la valeur «2» pour la liste «40».";2009-03-19 13:07:47;1;1
2248;1043;1;"Angiosperme (plantes à fleur)";"3";"NULL";"Initialisation de la valeur «3» pour la liste «40».";2009-03-19 13:07:47;1;1
2249;1043;1;"Cryptogames";"4";"NULL";"Initialisation de la valeur «4» pour la liste «40».";2009-03-19 13:07:47;1;1
2250;1043;1;"Algues (y compris Characées et Diatomées)";"5";"NULL";"Initialisation de la valeur «5» pour la liste «40».";2009-03-19 13:07:47;1;1
2251;1043;1;"Champignons";"6";"NULL";"Initialisation de la valeur «6» pour la liste «40».";2009-03-19 13:07:47;1;1
2252;1043;1;"Lichens";"7";"NULL";"Initialisation de la valeur «7» pour la liste «40».";2009-03-19 13:07:47;1;1
2253;1043;1;"Bryophytes (Mousses)";"8";"NULL";"Initialisation de la valeur «8» pour la liste «40».";2009-03-19 13:07:47;1;1
2254;1043;1;"Ptéridophytes (Fougères)";"9";"NULL";"Initialisation de la valeur «9» pour la liste «40».";2009-03-19 13:07:47;1;1
2255;1044;1;"Cartons d'herbiers";"1";"NULL";"Initialisation de la valeur «1» pour la liste «41».";2009-03-19 13:07:47;1;1
2256;1044;1;"Liasses";"2";"NULL";"Initialisation de la valeur «2» pour la liste «41».";2009-03-19 13:07:47;1;1
2257;1044;1;"Ouvrages reliés (cahiers, livres, ...)";"3";"NULL";"Initialisation de la valeur «3» pour la liste «41».";2009-03-19 13:07:47;1;1
2258;1044;1;"Classeurs";"4";"NULL";"Initialisation de la valeur «4» pour la liste «41».";2009-03-19 13:07:47;1;1
2259;1044;1;"Pochettes à élastiques";"5";"NULL";"Initialisation de la valeur «5» pour la liste «41».";2009-03-19 13:07:47;1;1
2260;1044;1;"Bocaux";"6";"NULL";"Initialisation de la valeur «6» pour la liste «41».";2009-03-19 13:07:47;1;1
2261;1044;1;"Boîtes d'herbier en bois";"7";"NULL";"Initialisation de la valeur «7» pour la liste «41».";2009-03-19 13:07:47;1;1
2262;1044;1;"Piluliers (en bois, plastique, verre, ...)";"8";"NULL";"Initialisation de la valeur «8» pour la liste «41».";2009-03-19 13:07:47;1;1
2263;1044;1;"Boîtes de péparations microscopiques";"9";"NULL";"Initialisation de la valeur «9» pour la liste «41».";2009-03-19 13:07:47;1;1
2264;1044;1;"Boîtes à chaussures";"10";"NULL";"Initialisation de la valeur «10» pour la liste «41».";2009-03-19 13:07:47;1;1
2265;1045;1;"Très mauvais état";"1";"Remplacement ou restauration à faire d'urgence";"Initialisation de la valeur «1» pour la liste «42».";2009-03-19 13:07:47;1;1
2266;1045;1;"Mauvais état";"2";"Remplacement ou restauration à faire assez rapidement";"Initialisation de la valeur «2» pour la liste «42».";2009-03-19 13:07:47;1;1
2267;1045;1;"État moyen";"3";"Remplacement ou restauration à envisager";"Initialisation de la valeur «3» pour la liste «42».";2009-03-19 13:07:47;1;1
2268;1045;1;"Bon état";"4";"Peu de restauration à faire";"Initialisation de la valeur «4» pour la liste «42».";2009-03-19 13:07:47;1;1
2269;1045;1;"Très bon état";"5";"Pas de restauration";"Initialisation de la valeur «5» pour la liste «42».";2009-03-19 13:07:47;1;1
2270;1046;1;"Planches d'herbiers";"1";"NULL";"Initialisation de la valeur «1» pour la liste «43».";2009-03-19 13:07:47;1;1
2271;1046;1;"Lames de préparations microscopiques";"2";"NULL";"Initialisation de la valeur «2» pour la liste «43».";2009-03-19 13:07:47;1;1
2272;1046;1;"Boîtes (à allumettes, à savons...)";"3";"NULL";"Initialisation de la valeur «3» pour la liste «43».";2009-03-19 13:07:47;1;1
2273;1046;1;"Enveloppes";"4";"NULL";"Initialisation de la valeur «4» pour la liste «43».";2009-03-19 13:07:47;1;1
2274;1046;1;"Plaques de carton";"5";"NULL";"Initialisation de la valeur «5» pour la liste «43».";2009-03-19 13:07:47;1;1
2275;1046;1;"Pochettes en plastiques pour classeur";"6";"NULL";"Initialisation de la valeur «6» pour la liste «43».";2009-03-19 13:07:47;1;1
2276;1047;1;"Journal";"1";"NULL";"Initialisation de la valeur «1» pour la liste «44».";2009-03-19 13:07:47;1;1
2277;1047;1;"Papier cartonné";"2";"NULL";"Initialisation de la valeur «2» pour la liste «44».";2009-03-19 13:07:47;1;1
2278;1047;1;"Papier normal";"3";"NULL";"Initialisation de la valeur «3» pour la liste «44».";2009-03-19 13:07:47;1;1
2279;1047;1;"Papier épais";"4";"NULL";"Initialisation de la valeur «4» pour la liste «44».";2009-03-19 13:07:47;1;1
2280;1047;1;"Buvard";"5";"NULL";"Initialisation de la valeur «5» pour la liste «44».";2009-03-19 13:07:47;1;1
2281;1047;1;"Papier très fin";"6";"NULL";"Initialisation de la valeur «6» pour la liste «44».";2009-03-19 13:07:47;1;1
2282;1047;1;"Cahier";"7";"NULL";"Initialisation de la valeur «7» pour la liste «44».";2009-03-19 13:07:47;1;1
2283;1048;1;"Dans des chemises";"1";"NULL";"Initialisation de la valeur «1» pour la liste «45».";2009-03-19 13:07:47;1;1
2284;1048;1;"Sur des feuilles";"2";"NULL";"Initialisation de la valeur «2» pour la liste «45».";2009-03-19 13:07:47;1;1
2285;1048;1;"Sur des feuilles incluses dans des chemises";"3";"NULL";"Initialisation de la valeur «3» pour la liste «45».";2009-03-19 13:07:47;1;1
2286;1048;1;"Sur des feuilles incluses dans des pochettes plastique";"4";"NULL";"Initialisation de la valeur «4» pour la liste «45».";2009-03-19 13:07:47;1;1
2287;1048;1;"Dans des sachets cellophane";"5";"NULL";"Initialisation de la valeur «5» pour la liste «45».";2009-03-19 13:07:47;1;1
2288;1048;1;"Sur des lames de verre";"6";"NULL";"Initialisation de la valeur «6» pour la liste «45».";2009-03-19 13:07:47;1;1
2289;1049;1;"Papier gommé";"1";"NULL";"Initialisation de la valeur «1» pour la liste «46».";2009-03-19 13:07:47;1;1
2290;1049;1;"Colle";"2";"NULL";"Initialisation de la valeur «2» pour la liste «46».";2009-03-19 13:07:47;1;1
2291;1049;1;"Cousus au support";"3";"NULL";"Initialisation de la valeur «3» pour la liste «46».";2009-03-19 13:07:47;1;1
2292;1049;1;"Épinglés au support";"4";"NULL";"Initialisation de la valeur «4» pour la liste «46».";2009-03-19 13:07:47;1;1
2293;1049;1;"Glissés dans des fentes découpées dans le support";"5";"NULL";"Initialisation de la valeur «5» pour la liste «46».";2009-03-19 13:07:47;1;1
2294;1049;1;"Plastifiés";"6";"NULL";"Initialisation de la valeur «6» pour la liste «46».";2009-03-19 13:07:47;1;1
2295;1049;1;"Papier adhésif typescotch";"7";"NULL";"Initialisation de la valeur «7» pour la liste «46».";2009-03-19 13:07:47;1;1
2296;1050;1;"Par épingles";"1";"NULL";"Initialisation de la valeur «1» pour la liste «47».";2009-03-19 13:07:47;1;1
2297;1050;1;"Par un fil";"2";"NULL";"Initialisation de la valeur «2» pour la liste «47».";2009-03-19 13:07:47;1;1
2298;1050;1;"Spécimens glissés dans des fentes découpées dans l'étiquette";"3";"NULL";"Initialisation de la valeur «3» pour la liste «47».";2009-03-19 13:07:47;1;1
2299;1051;1;"Manuscrites";"1";"NULL";"Initialisation de la valeur «1» pour la liste «48».";2009-03-19 13:07:47;1;1
2300;1051;1;"Dactylographiées";"2";"NULL";"Initialisation de la valeur «2» pour la liste «48».";2009-03-19 13:07:47;1;1
2301;1051;1;"Imprimées";"3";"NULL";"Initialisation de la valeur «3» pour la liste «48».";2009-03-19 13:07:47;1;1
2302;1051;1;"Ronéotypées";"4";"NULL";"Initialisation de la valeur «4» pour la liste «48».";2009-03-19 13:07:47;1;1
2303;1052;1;"Humidité / moisissures";"1";"NULL";"Initialisation de la valeur «1» pour la liste «49».";2009-03-19 13:07:47;1;1
2304;1052;1;"Attaques d'insectes";"2";"NULL";"Initialisation de la valeur «2» pour la liste «49».";2009-03-19 13:07:47;1;1
2305;1052;1;"Attaques de rongeurs";"3";"NULL";"Initialisation de la valeur «3» pour la liste «49».";2009-03-19 13:07:47;1;1
2306;1053;1;"Humidité / moisissures";"1";"NULL";"Initialisation de la valeur «1» pour la liste «50».";2009-03-19 13:07:47;1;1
2307;1053;1;"Attaques d'insectes";"2";"NULL";"Initialisation de la valeur «2» pour la liste «50».";2009-03-19 13:07:47;1;1
2308;1053;1;"Attaques de rongeurs";"3";"NULL";"Initialisation de la valeur «3» pour la liste «50».";2009-03-19 13:07:47;1;1
2309;1053;1;"Papiers usagés";"4";"NULL";"Initialisation de la valeur «4» pour la liste «50».";2009-03-19 13:07:47;1;1
2310;1053;1;"Mélange spécimens et étiquettes";"5";"Les spécimens et/ou étiquettes sont mélangés ou détachés.";"Initialisation de la valeur «5» pour la liste «50».";2009-03-19 13:07:47;1;1
2311;1054;1;"Uniquement des fragments, aucune détermination sure possible";"1";"NULL";"Initialisation de la valeur «1» pour la liste «51».";2009-03-19 13:07:47;1;1
2312;1054;1;"Échantillons de tailles correctes mais majoritairement sans organes nécessaires à la détermination";"2";"NULL";"Initialisation de la valeur «2» pour la liste «51».";2009-03-19 13:07:47;1;1
2313;1054;1;"Une bonne partie des échantillons peuvent être déterminés";"3";"NULL";"Initialisation de la valeur «3» pour la liste «51».";2009-03-19 13:07:47;1;1
2314;1054;1;"La majorité des échantillons peuvent être déterminés";"4";"NULL";"Initialisation de la valeur «4» pour la liste «51».";2009-03-19 13:07:47;1;1
2315;1054;1;"Tous les échantillons présentent les caractères nécessaires à la détermination";"5";"NULL";"Initialisation de la valeur «5» pour la liste «51».";2009-03-19 13:07:47;1;1
2316;1055;1;"Date inconnue";"1";"NULL";"Initialisation de la valeur «1» pour la liste «52».";2009-03-19 13:07:47;1;1
2317;1055;1;"Date exacte";"2";"NULL";"Initialisation de la valeur «2» pour la liste «52».";2009-03-19 13:07:47;1;1
2318;1055;1;"Antérieure à";"3";"NULL";"Initialisation de la valeur «3» pour la liste «52».";2009-03-19 13:07:47;1;1
2319;1055;1;"Postérieure à";"4";"NULL";"Initialisation de la valeur «4» pour la liste «52».";2009-03-19 13:07:47;1;1
2320;1055;1;"Date estimée";"5";"NULL";"Initialisation de la valeur «5» pour la liste «52».";2009-03-19 13:07:47;1;1
2321;1056;1;"Date inconnue";"1";"NULL";"Initialisation de la valeur «1» pour la liste «53».";2009-03-19 13:07:47;1;1
2322;1056;1;"Date exacte";"2";"NULL";"Initialisation de la valeur «2» pour la liste «53».";2009-03-19 13:07:47;1;1
2323;1056;1;"Antérieure à";"3";"NULL";"Initialisation de la valeur «3» pour la liste «53».";2009-03-19 13:07:47;1;1
2324;1056;1;"Postérieure à";"4";"NULL";"Initialisation de la valeur «4» pour la liste «53».";2009-03-19 13:07:47;1;1
2325;1056;1;"Date estimée";"5";"NULL";"Initialisation de la valeur «5» pour la liste «53».";2009-03-19 13:07:47;1;1
2326;1056;1;"Encore en activité";"6";"NULL";"Initialisation de la valeur «6» pour la liste «53».";2009-03-19 13:07:47;1;1
2327;1057;1;"Contenants et parts sans classement, recherche d'échantillon précis très difficile, classement à met";"1";"NULL";"Initialisation de la valeur «1» pour la liste «54».";2009-03-19 13:07:47;1;1
2328;1057;1;"Classement existant à l'origine mais mélangé, rangement à faire assez rapidement";"2";"NULL";"Initialisation de la valeur «2» pour la liste «54».";2009-03-19 13:07:47;1;1
2329;1057;1;"Classement respecté mais pas dans son intégralité, rangement à envisager";"3";"NULL";"Initialisation de la valeur «3» pour la liste «54».";2009-03-19 13:07:47;1;1
2330;1057;1;"Peu déclassé, peu de rangement à effectuer";"4";"NULL";"Initialisation de la valeur «4» pour la liste «54».";2009-03-19 13:07:47;1;1
2331;1057;1;"Entièrement classé";"5";"NULL";"Initialisation de la valeur «5» pour la liste «54».";2009-03-19 13:07:47;1;1
2332;1058;1;"Nom de l'auteur de la collection botanique ou du titre de la collection";"1";"NULL";"Initialisation de la valeur «1» pour la liste «55».";2009-03-19 13:07:47;1;1
2333;1058;1;"Nom de famille";"2";"NULL";"Initialisation de la valeur «2» pour la liste «55».";2009-03-19 13:07:47;1;1
2334;1058;1;"Nom de genre";"3";"NULL";"Initialisation de la valeur «3» pour la liste «55».";2009-03-19 13:07:47;1;1
2335;1058;1;"Nom de l'espèce";"4";"NULL";"Initialisation de la valeur «4» pour la liste «55».";2009-03-19 13:07:47;1;1
2336;1058;1;"Nom d'auteur";"5";"NULL";"Initialisation de la valeur «5» pour la liste «55».";2009-03-19 13:07:47;1;1
2337;1058;1;"Localité de récolte";"6";"NULL";"Initialisation de la valeur «6» pour la liste «55».";2009-03-19 13:07:47;1;1
2338;1058;1;"Date de récolte";"7";"NULL";"Initialisation de la valeur «7» pour la liste «55».";2009-03-19 13:07:47;1;1
2339;1059;1;"Oui";"1";"NULL";"Initialisation de la valeur «1» pour la liste «56».";2009-03-19 13:07:47;1;1
2340;1059;1;"Non";"2";"NULL";"Initialisation de la valeur «2» pour la liste «56».";2009-03-19 13:07:47;1;1
2341;1059;1;"En grande partie";"3";"NULL";"Initialisation de la valeur «3» pour la liste «56».";2009-03-19 13:07:47;1;1
2342;1060;1;"Indéterminé (= ne sais pas)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «57».";2009-03-19 13:07:47;1;1
2343;1060;1;"Parfois";"2";"NULL";"Initialisation de la valeur «2» pour la liste «57».";2009-03-19 13:07:47;1;1
2344;1060;1;"Oui";"3";"NULL";"Initialisation de la valeur «3» pour la liste «57».";2009-03-19 13:07:47;1;1
2345;1060;1;"Non";"4";"NULL";"Initialisation de la valeur «4» pour la liste «57».";2009-03-19 13:07:47;1;1
2346;1061;1;"Manuscrite";"1";"NULL";"Initialisation de la valeur «1» pour la liste «58».";2009-03-19 13:07:47;1;1
2347;1061;1;"Imprimé";"2";"NULL";"Initialisation de la valeur «2» pour la liste «58».";2009-03-19 13:07:47;1;1
2348;1061;1;"Informatique";"3";"NULL";"Initialisation de la valeur «3» pour la liste «58».";2009-03-19 13:07:47;1;1
2349;1062;1;"Sonnerat/BryoMyco";"1";"NULL";"Initialisation de la valeur «1» pour la liste «59».";2009-03-19 13:07:47;1;1
2350;1062;1;"4D";"2";"NULL";"Initialisation de la valeur «2» pour la liste «59».";2009-03-19 13:07:47;1;1
2351;1062;1;"SNBase";"3";"NULL";"Initialisation de la valeur «3» pour la liste «59».";2009-03-19 13:07:47;1;1
2352;1062;1;"Dbase";"4";"NULL";"Initialisation de la valeur «4» pour la liste «59».";2009-03-19 13:07:47;1;1
2353;1062;1;"Access";"5";"NULL";"Initialisation de la valeur «5» pour la liste «59».";2009-03-19 13:07:48;1;1
2354;1062;1;"File Maker";"6";"NULL";"Initialisation de la valeur «6» pour la liste «59».";2009-03-19 13:07:48;1;1
2355;1062;1;"Excel";"7";"NULL";"Initialisation de la valeur «7» pour la liste «59».";2009-03-19 13:07:48;1;1
2356;1062;1;"Word";"8";"NULL";"Initialisation de la valeur «8» pour la liste «59».";2009-03-19 13:07:48;1;1
2357;1063;1;"Indéterminé (= ne sais pas)";"1";"NULL";"Initialisation de la valeur «1» pour la liste «60».";2009-03-19 13:07:48;1;1
2358;1063;1;"Complet";"2";"NULL";"Initialisation de la valeur «2» pour la liste «60».";2009-03-19 13:07:48;1;1
2359;1063;1;"En cours";"3";"NULL";"Initialisation de la valeur «3» pour la liste «60».";2009-03-19 13:07:48;1;1
2360;1064;1;"Auteur";"1";"NULL";"Initialisation de la valeur «1» pour la liste «61».";2009-03-19 13:07:48;1;1
2361;1065;1;"Nécrologie";"1";"NULL";"Initialisation de la valeur «1» pour la liste «62».";2009-03-19 13:07:48;1;1
2362;1065;1;"Biographie";"2";"NULL";"Initialisation de la valeur «2» pour la liste «62».";2009-03-19 13:07:48;1;1
2363;1065;1;"Publication personnelle";"3";"NULL";"Initialisation de la valeur «3» pour la liste «62».";2009-03-19 13:07:48;1;1
2364;1066;1;"Page Web";"WEB";"NULL";"Initialisation de la valeur «WEB» pour la liste «63».";2009-03-19 13:07:48;1;1
2365;1066;1;"URL d'un logo";"LOGO";"NULL";"Initialisation de la valeur «LOGO» pour la liste «63».";2009-03-19 13:07:48;1;1
2834;1066;1;"URL d'une page d'information sur l'objet lié";"INFO";"NULL";"Initialisation de la valeur «INFO» pour la liste «63».";2009-05-25 13:03:00;1;1
2366;1067;1;"Homme";"H";"NULL";"Initialisation de la valeur «H» pour la liste «64».";2009-03-19 13:07:48;1;1
2367;1067;1;"Femme";"F";"NULL";"Initialisation de la valeur «F» pour la liste «64».";2009-03-19 13:07:48;1;1
2368;1068;1;"Géographique";"1";"NULL";"Initialisation de la valeur «1» pour la liste «65».";2009-03-19 13:07:48;1;1
2369;1068;1;"Taxinomique";"2";"NULL";"Initialisation de la valeur «2» pour la liste «65».";2009-03-19 13:07:48;1;1
2370;1068;1;"Historique";"3";"NULL";"Initialisation de la valeur «3» pour la liste «65».";2009-03-19 13:07:48;1;1
2371;1068;1;"Échantillons-types";"4";"NULL";"Initialisation de la valeur «4» pour la liste «65».";2009-03-19 13:07:48;1;1
2372;1068;1;"Collecteurs";"5";"NULL";"Initialisation de la valeur «5» pour la liste «65».";2009-03-19 13:07:48;1;1
2373;1068;1;"Statut";"6";"NULL";"Initialisation de la valeur «6» pour la liste «65».";2009-03-19 13:07:48;1;1
2374;1069;1;"Intégration de données de standards";"IDS";"NULL";"Initialisation de la valeur «IDS» pour la liste «66».";2009-03-19 13:07:48;1;1
2375;1069;1;"Informatisation de publication botanique";"IPB";"NULL";"Initialisation de la valeur «IPB» pour la liste «66».";2009-03-19 13:07:48;1;1
2376;1069;1;"Compilation d'informations";"CI";"NULL";"Initialisation de la valeur «CI» pour la liste «66».";2009-03-19 13:07:48;1;1
2377;1070;1;"avoir pour enfant";"AE";"NULL";"Initialisation de la valeur «AE» pour la liste «67».";2009-03-19 13:07:48;1;1
2378;1070;1;"être divisé en";"D";"NULL";"Initialisation de la valeur «D» pour la liste «67».";2009-03-19 13:07:48;1;1
2379;1070;1;"être fusionné en";"F";"NULL";"Initialisation de la valeur «F» pour la liste «67».";2009-03-19 13:07:48;1;1
2379;1070;1;"avoir pour parent";"AP";"NULL";"Initialisation de la valeur «AP» pour la liste «67».";2009-03-19 13:07:48;1;1
2380;1070;1;"être lié à";"EL";"NULL";"Initialisation de la valeur «EL» pour la liste «67».";2009-03-19 13:07:48;1;1
2381;1071;1;"Afar";"AA";"NULL";"Initialisation de la valeur «AA» pour la liste «68».";2009-04-08 12:04:18;1;1
2382;1071;1;"Abkhaze";"AB";"NULL";"Initialisation de la valeur «AB» pour la liste «68».";2009-04-08 12:04:19;1;1
2383;1071;1;"Avestique";"AE";"NULL";"Initialisation de la valeur «AE» pour la liste «68».";2009-04-08 12:04:20;1;1
2384;1071;1;"Afrikaans";"AF";"NULL";"Initialisation de la valeur «AF» pour la liste «68».";2009-04-08 12:04:21;1;1
2385;1071;1;"Akan";"AK";"NULL";"Initialisation de la valeur «AK» pour la liste «68».";2009-04-08 12:04:22;1;1
2386;1071;1;"Amharique";"AM";"NULL";"Initialisation de la valeur «AM» pour la liste «68».";2009-04-08 12:04:23;1;1
2387;1071;1;"Aragonais";"AN";"NULL";"Initialisation de la valeur «AN» pour la liste «68».";2009-04-08 12:04:24;1;1
2388;1071;1;"Arabe";"AR";"NULL";"Initialisation de la valeur «AR» pour la liste «68».";2009-04-08 12:04:25;1;1
2389;1071;1;"Assamais";"AS";"NULL";"Initialisation de la valeur «AS» pour la liste «68».";2009-04-08 12:04:26;1;1
2390;1071;1;"Avar";"AV";"NULL";"Initialisation de la valeur «AV» pour la liste «68».";2009-04-08 12:04:27;1;1
2391;1071;1;"Aymara";"AY";"NULL";"Initialisation de la valeur «AY» pour la liste «68».";2009-04-08 12:04:28;1;1
2392;1071;1;"Azéri";"AZ";"NULL";"Initialisation de la valeur «AZ» pour la liste «68».";2009-04-08 12:04:29;1;1
2393;1071;1;"Bachkir";"BA";"NULL";"Initialisation de la valeur «BA» pour la liste «68».";2009-04-08 12:04:30;1;1
2394;1071;1;"Biélorusse";"BE";"NULL";"Initialisation de la valeur «BE» pour la liste «68».";2009-04-08 12:04:31;1;1
2395;1071;1;"Bulgare";"BG";"NULL";"Initialisation de la valeur «BG» pour la liste «68».";2009-04-08 12:04:32;1;1
2396;1071;1;"Bihari";"BH";"NULL";"Initialisation de la valeur «BH» pour la liste «68».";2009-04-08 12:04:33;1;1
2397;1071;1;"Bichelamar";"BI";"NULL";"Initialisation de la valeur «BI» pour la liste «68».";2009-04-08 12:04:34;1;1
2398;1071;1;"Bambara";"BM";"NULL";"Initialisation de la valeur «BM» pour la liste «68».";2009-04-08 12:04:35;1;1
2399;1071;1;"Bengalî";"BN";"NULL";"Initialisation de la valeur «BN» pour la liste «68».";2009-04-08 12:04:36;1;1
2400;1071;1;"Tibétain";"BO";"NULL";"Initialisation de la valeur «BO» pour la liste «68».";2009-04-08 12:04:37;1;1
2401;1071;1;"Breton";"BR";"NULL";"Initialisation de la valeur «BR» pour la liste «68».";2009-04-08 12:04:38;1;1
2402;1071;1;"Bosnien";"BS";"NULL";"Initialisation de la valeur «BS» pour la liste «68».";2009-04-08 12:04:39;1;1
2403;1071;1;"Catalan";"CA";"NULL";"Initialisation de la valeur «CA» pour la liste «68».";2009-04-08 12:04:40;1;1
2404;1071;1;"Tchétchène";"CE";"NULL";"Initialisation de la valeur «CE» pour la liste «68».";2009-04-08 12:04:41;1;1
2405;1071;1;"Chamorro";"CH";"NULL";"Initialisation de la valeur «CH» pour la liste «68».";2009-04-08 12:04:42;1;1
2406;1071;1;"Corse";"CO";"NULL";"Initialisation de la valeur «CO» pour la liste «68».";2009-04-08 12:04:43;1;1
2407;1071;1;"Cri";"CR";"NULL";"Initialisation de la valeur «CR» pour la liste «68».";2009-04-08 12:04:44;1;1
2408;1071;1;"Tchèque";"CS";"NULL";"Initialisation de la valeur «CS» pour la liste «68».";2009-04-08 12:04:45;1;1
2409;1071;1;"Vieux slave";"CU";"NULL";"Initialisation de la valeur «CU» pour la liste «68».";2009-04-08 12:04:46;1;1
2410;1071;1;"Tchouvache";"CV";"NULL";"Initialisation de la valeur «CV» pour la liste «68».";2009-04-08 12:04:47;1;1
2411;1071;1;"Gallois";"CY";"NULL";"Initialisation de la valeur «CY» pour la liste «68».";2009-04-08 12:04:48;1;1
2412;1071;1;"Danois";"DA";"NULL";"Initialisation de la valeur «DA» pour la liste «68».";2009-04-08 12:04:49;1;1
2413;1071;1;"Allemand";"DE";"NULL";"Initialisation de la valeur «DE» pour la liste «68».";2009-04-08 12:04:50;1;1
2414;1071;1;"Divehi";"DV";"NULL";"Initialisation de la valeur «DV» pour la liste «68».";2009-04-08 12:04:51;1;1
2415;1071;1;"Dzongkha";"DZ";"NULL";"Initialisation de la valeur «DZ» pour la liste «68».";2009-04-08 12:04:52;1;1
2416;1071;1;"Ewe";"EE";"NULL";"Initialisation de la valeur «EE» pour la liste «68».";2009-04-08 12:04:53;1;1
2417;1071;1;"Grec moderne";"EL";"NULL";"Initialisation de la valeur «EL» pour la liste «68».";2009-04-08 12:04:54;1;1
2418;1071;1;"Anglais";"EN";"NULL";"Initialisation de la valeur «EN» pour la liste «68».";2009-04-08 12:04:55;1;1
2419;1071;1;"Espéranto";"EO";"NULL";"Initialisation de la valeur «EO» pour la liste «68».";2009-04-08 12:04:56;1;1
2420;1071;1;"Espagnol";"ES";"NULL";"Initialisation de la valeur «ES» pour la liste «68».";2009-04-08 12:04:57;1;1
2421;1071;1;"Estonien";"ET";"NULL";"Initialisation de la valeur «ET» pour la liste «68».";2009-04-08 12:04:58;1;1
2422;1071;1;"Basque";"EU";"NULL";"Initialisation de la valeur «EU» pour la liste «68».";2009-04-08 12:04:59;1;1
2423;1071;1;"Perse";"FA";"NULL";"Initialisation de la valeur «FA» pour la liste «68».";2009-04-08 12:05:00;1;1
2424;1071;1;"Peul";"FF";"NULL";"Initialisation de la valeur «FF» pour la liste «68».";2009-04-08 12:05:01;1;1
2425;1071;1;"Finnois";"FI";"NULL";"Initialisation de la valeur «FI» pour la liste «68».";2009-04-08 12:05:02;1;1
2426;1071;1;"Fidjien";"FJ";"NULL";"Initialisation de la valeur «FJ» pour la liste «68».";2009-04-08 12:05:03;1;1
2427;1071;1;"Féringien";"FO";"NULL";"Initialisation de la valeur «FO» pour la liste «68».";2009-04-08 12:05:04;1;1
2428;1071;1;"Français";"FR";"NULL";"Initialisation de la valeur «FR» pour la liste «68».";2009-04-08 12:05:05;1;1
2429;1071;1;"Frison";"FY";"NULL";"Initialisation de la valeur «FY» pour la liste «68».";2009-04-08 12:05:06;1;1
2430;1071;1;"Irlandais";"GA";"NULL";"Initialisation de la valeur «GA» pour la liste «68».";2009-04-08 12:05:07;1;1
2431;1071;1;"Écossais";"GD";"NULL";"Initialisation de la valeur «GD» pour la liste «68».";2009-04-08 12:05:08;1;1
2432;1071;1;"Galicien";"GL";"NULL";"Initialisation de la valeur «GL» pour la liste «68».";2009-04-08 12:05:09;1;1
2433;1071;1;"Guarani";"GN";"NULL";"Initialisation de la valeur «GN» pour la liste «68».";2009-04-08 12:05:10;1;1
2434;1071;1;"Gujarâtî";"GU";"NULL";"Initialisation de la valeur «GU» pour la liste «68».";2009-04-08 12:05:11;1;1
2435;1071;1;"Mannois";"GV";"NULL";"Initialisation de la valeur «GV» pour la liste «68».";2009-04-08 12:05:12;1;1
2436;1071;1;"Haoussa";"HA";"NULL";"Initialisation de la valeur «HA» pour la liste «68».";2009-04-08 12:05:13;1;1
2437;1071;1;"Hébreu";"HE";"NULL";"Initialisation de la valeur «HE» pour la liste «68».";2009-04-08 12:05:14;1;1
2438;1071;1;"Hindî";"HI";"NULL";"Initialisation de la valeur «HI» pour la liste «68».";2009-04-08 12:05:15;1;1
2439;1071;1;"Hiri motu";"HO";"NULL";"Initialisation de la valeur «HO» pour la liste «68».";2009-04-08 12:05:16;1;1
2440;1071;1;"Croate";"HR";"NULL";"Initialisation de la valeur «HR» pour la liste «68».";2009-04-08 12:05:17;1;1
2441;1071;1;"Créole haïtien";"HT";"NULL";"Initialisation de la valeur «HT» pour la liste «68».";2009-04-08 12:05:18;1;1
2442;1071;1;"Hongrois";"HU";"NULL";"Initialisation de la valeur «HU» pour la liste «68».";2009-04-08 12:05:19;1;1
2443;1071;1;"Arménien";"HY";"NULL";"Initialisation de la valeur «HY» pour la liste «68».";2009-04-08 12:05:20;1;1
2444;1071;1;"Herero";"HZ";"NULL";"Initialisation de la valeur «HZ» pour la liste «68».";2009-04-08 12:05:21;1;1
2445;1071;1;"Interlingua";"IA";"NULL";"Initialisation de la valeur «IA» pour la liste «68».";2009-04-08 12:05:22;1;1
2446;1071;1;"Indonésien";"ID";"NULL";"Initialisation de la valeur «ID» pour la liste «68».";2009-04-08 12:05:23;1;1
2447;1071;1;"Occidental";"IE";"NULL";"Initialisation de la valeur «IE» pour la liste «68».";2009-04-08 12:05:24;1;1
2448;1071;1;"Igbo";"IG";"NULL";"Initialisation de la valeur «IG» pour la liste «68».";2009-04-08 12:05:25;1;1
2449;1071;1;"Yi";"II";"NULL";"Initialisation de la valeur «II» pour la liste «68».";2009-04-08 12:05:26;1;1
2450;1071;1;"Inupiaq";"IK";"NULL";"Initialisation de la valeur «IK» pour la liste «68».";2009-04-08 12:05:27;1;1
2451;1071;1;"Ido";"IO";"NULL";"Initialisation de la valeur «IO» pour la liste «68».";2009-04-08 12:05:28;1;1
2452;1071;1;"Islandais";"IS";"NULL";"Initialisation de la valeur «IS» pour la liste «68».";2009-04-08 12:05:29;1;1
2453;1071;1;"Italien";"IT";"NULL";"Initialisation de la valeur «IT» pour la liste «68».";2009-04-08 12:05:30;1;1
2454;1071;1;"Inuktitut";"IU";"NULL";"Initialisation de la valeur «IU» pour la liste «68».";2009-04-08 12:05:31;1;1
2455;1071;1;"Japonais";"JA";"NULL";"Initialisation de la valeur «JA» pour la liste «68».";2009-04-08 12:05:32;1;1
2456;1071;1;"Javanais";"JV";"NULL";"Initialisation de la valeur «JV» pour la liste «68».";2009-04-08 12:05:33;1;1
2457;1071;1;"Géorgien";"KA";"NULL";"Initialisation de la valeur «KA» pour la liste «68».";2009-04-08 12:05:34;1;1
2458;1071;1;"Kikongo";"KG";"NULL";"Initialisation de la valeur «KG» pour la liste «68».";2009-04-08 12:05:35;1;1
2459;1071;1;"Kikuyu";"KI";"NULL";"Initialisation de la valeur «KI» pour la liste «68».";2009-04-08 12:05:36;1;1
2460;1071;1;"Kuanyama";"KJ";"NULL";"Initialisation de la valeur «KJ» pour la liste «68».";2009-04-08 12:05:37;1;1
2461;1071;1;"Kazakh";"KK";"NULL";"Initialisation de la valeur «KK» pour la liste «68».";2009-04-08 12:05:38;1;1
2462;1071;1;"Kalaallisut";"KL";"NULL";"Initialisation de la valeur «KL» pour la liste «68».";2009-04-08 12:05:39;1;1
2463;1071;1;"Khmer";"KM";"NULL";"Initialisation de la valeur «KM» pour la liste «68».";2009-04-08 12:05:40;1;1
2464;1071;1;"Kannara";"KN";"NULL";"Initialisation de la valeur «KN» pour la liste «68».";2009-04-08 12:05:41;1;1
2465;1071;1;"Coréen";"KO";"NULL";"Initialisation de la valeur «KO» pour la liste «68».";2009-04-08 12:05:42;1;1
2466;1071;1;"Kanouri";"KR";"NULL";"Initialisation de la valeur «KR» pour la liste «68».";2009-04-08 12:05:43;1;1
2467;1071;1;"Kashmiri";"KS";"NULL";"Initialisation de la valeur «KS» pour la liste «68».";2009-04-08 12:05:44;1;1
2468;1071;1;"Kurde";"KU";"NULL";"Initialisation de la valeur «KU» pour la liste «68».";2009-04-08 12:05:45;1;1
2469;1071;1;"Komi";"KV";"NULL";"Initialisation de la valeur «KV» pour la liste «68».";2009-04-08 12:05:46;1;1
2470;1071;1;"Cornique";"KW";"NULL";"Initialisation de la valeur «KW» pour la liste «68».";2009-04-08 12:05:47;1;1
2471;1071;1;"Kirghiz";"KY";"NULL";"Initialisation de la valeur «KY» pour la liste «68».";2009-04-08 12:05:48;1;1
2472;1071;1;"Latin";"LA";"NULL";"Initialisation de la valeur «LA» pour la liste «68».";2009-04-08 12:05:49;1;1
2473;1071;1;"Luxembourgeois";"LB";"NULL";"Initialisation de la valeur «LB» pour la liste «68».";2009-04-08 12:05:50;1;1
2474;1071;1;"Ganda";"LG";"NULL";"Initialisation de la valeur «LG» pour la liste «68».";2009-04-08 12:05:51;1;1
2475;1071;1;"Limbourgeois";"LI";"NULL";"Initialisation de la valeur «LI» pour la liste «68».";2009-04-08 12:05:52;1;1
2476;1071;1;"Lingala";"LN";"NULL";"Initialisation de la valeur «LN» pour la liste «68».";2009-04-08 12:05:53;1;1
2477;1071;1;"Lao";"LO";"NULL";"Initialisation de la valeur «LO» pour la liste «68».";2009-04-08 12:05:54;1;1
2478;1071;1;"Lituanien";"LT";"NULL";"Initialisation de la valeur «LT» pour la liste «68».";2009-04-08 12:05:55;1;1
2479;1071;1;"Tchiluba";"LU";"NULL";"Initialisation de la valeur «LU» pour la liste «68».";2009-04-08 12:05:56;1;1
2480;1071;1;"Letton";"LV";"NULL";"Initialisation de la valeur «LV» pour la liste «68».";2009-04-08 12:05:57;1;1
2481;1071;1;"Malgache";"MG";"NULL";"Initialisation de la valeur «MG» pour la liste «68».";2009-04-08 12:05:58;1;1
2482;1071;1;"Marshallais";"MH";"NULL";"Initialisation de la valeur «MH» pour la liste «68».";2009-04-08 12:05:59;1;1
2483;1071;1;"Māori de Nouvelle-Zélande";"MI";"NULL";"Initialisation de la valeur «MI» pour la liste «68».";2009-04-08 12:06:00;1;1
2484;1071;1;"Macédonien";"MK";"NULL";"Initialisation de la valeur «MK» pour la liste «68».";2009-04-08 12:06:01;1;1
2485;1071;1;"Malayalam";"ML";"NULL";"Initialisation de la valeur «ML» pour la liste «68».";2009-04-08 12:06:02;1;1
2486;1071;1;"Mongol";"MN";"NULL";"Initialisation de la valeur «MN» pour la liste «68».";2009-04-08 12:06:03;1;1
2487;1071;1;"Moldave";"MO";"NULL";"Initialisation de la valeur «MO» pour la liste «68».";2009-04-08 12:06:04;1;1
2488;1071;1;"Marâthî";"MR";"NULL";"Initialisation de la valeur «MR» pour la liste «68».";2009-04-08 12:06:05;1;1
2489;1071;1;"Malais";"MS";"NULL";"Initialisation de la valeur «MS» pour la liste «68».";2009-04-08 12:06:06;1;1
2490;1071;1;"Maltais";"MT";"NULL";"Initialisation de la valeur «MT» pour la liste «68».";2009-04-08 12:06:07;1;1
2491;1071;1;"Birman";"MY";"NULL";"Initialisation de la valeur «MY» pour la liste «68».";2009-04-08 12:06:08;1;1
2492;1071;1;"Nauruan";"NA";"NULL";"Initialisation de la valeur «NA» pour la liste «68».";2009-04-08 12:06:09;1;1
2493;1071;1;"Norvégien Bokmål";"NB";"NULL";"Initialisation de la valeur «NB» pour la liste «68».";2009-04-08 12:06:10;1;1
2494;1071;1;"Ndébélé du Nord";"ND";"NULL";"Initialisation de la valeur «ND» pour la liste «68».";2009-04-08 12:06:11;1;1
2495;1071;1;"Népalais";"NE";"NULL";"Initialisation de la valeur «NE» pour la liste «68».";2009-04-08 12:06:12;1;1
2496;1071;1;"Ndonga";"NG";"NULL";"Initialisation de la valeur «NG» pour la liste «68».";2009-04-08 12:06:13;1;1
2497;1071;1;"Néerlandais";"NL";"NULL";"Initialisation de la valeur «NL» pour la liste «68».";2009-04-08 12:06:14;1;1
2498;1071;1;"Norvégien Nynorsk";"NN";"NULL";"Initialisation de la valeur «NN» pour la liste «68».";2009-04-08 12:06:15;1;1
2499;1071;1;"Norvégien";"NO";"NULL";"Initialisation de la valeur «NO» pour la liste «68».";2009-04-08 12:06:16;1;1
2500;1071;1;"Ndébélé du Sud";"NR";"NULL";"Initialisation de la valeur «NR» pour la liste «68».";2009-04-08 12:06:17;1;1
2501;1071;1;"Navajo";"NV";"NULL";"Initialisation de la valeur «NV» pour la liste «68».";2009-04-08 12:06:18;1;1
2502;1071;1;"Chichewa";"NY";"NULL";"Initialisation de la valeur «NY» pour la liste «68».";2009-04-08 12:06:19;1;1
2503;1071;1;"Occitan";"OC";"NULL";"Initialisation de la valeur «OC» pour la liste «68».";2009-04-08 12:06:20;1;1
2504;1071;1;"Ojibwé";"OJ";"NULL";"Initialisation de la valeur «OJ» pour la liste «68».";2009-04-08 12:06:21;1;1
2505;1071;1;"Oromo";"OM";"NULL";"Initialisation de la valeur «OM» pour la liste «68».";2009-04-08 12:06:22;1;1
2506;1071;1;"Oriya";"OR";"NULL";"Initialisation de la valeur «OR» pour la liste «68».";2009-04-08 12:06:23;1;1
2507;1071;1;"Ossète";"OS";"NULL";"Initialisation de la valeur «OS» pour la liste «68».";2009-04-08 12:06:24;1;1
2508;1071;1;"Panjâbî";"PA";"NULL";"Initialisation de la valeur «PA» pour la liste «68».";2009-04-08 12:06:25;1;1
2509;1071;1;"Pâli";"PI";"NULL";"Initialisation de la valeur «PI» pour la liste «68».";2009-04-08 12:06:26;1;1
2510;1071;1;"Polonais";"PL";"NULL";"Initialisation de la valeur «PL» pour la liste «68».";2009-04-08 12:06:27;1;1
2511;1071;1;"Pachto";"PS";"NULL";"Initialisation de la valeur «PS» pour la liste «68».";2009-04-08 12:06:28;1;1
2512;1071;1;"Portugais";"PT";"NULL";"Initialisation de la valeur «PT» pour la liste «68».";2009-04-08 12:06:29;1;1
2513;1071;1;"Quechua";"QU";"NULL";"Initialisation de la valeur «QU» pour la liste «68».";2009-04-08 12:06:30;1;1
2514;1071;1;"Romanche";"RM";"NULL";"Initialisation de la valeur «RM» pour la liste «68».";2009-04-08 12:06:31;1;1
2515;1071;1;"Kirundi";"RN";"NULL";"Initialisation de la valeur «RN» pour la liste «68».";2009-04-08 12:06:32;1;1
2516;1071;1;"Roumain";"RO";"NULL";"Initialisation de la valeur «RO» pour la liste «68».";2009-04-08 12:06:33;1;1
2517;1071;1;"Russe";"RU";"NULL";"Initialisation de la valeur «RU» pour la liste «68».";2009-04-08 12:06:34;1;1
2518;1071;1;"Kinyarwanda";"RW";"NULL";"Initialisation de la valeur «RW» pour la liste «68».";2009-04-08 12:06:35;1;1
2519;1071;1;"Sanskrit";"SA";"NULL";"Initialisation de la valeur «SA» pour la liste «68».";2009-04-08 12:06:36;1;1
2520;1071;1;"Sarde";"SC";"NULL";"Initialisation de la valeur «SC» pour la liste «68».";2009-04-08 12:06:37;1;1
2521;1071;1;"Sindhi";"SD";"NULL";"Initialisation de la valeur «SD» pour la liste «68».";2009-04-08 12:06:38;1;1
2522;1071;1;"Same du Nord";"SE";"NULL";"Initialisation de la valeur «SE» pour la liste «68».";2009-04-08 12:06:39;1;1
2523;1071;1;"Sango";"SG";"NULL";"Initialisation de la valeur «SG» pour la liste «68».";2009-04-08 12:06:40;1;1
2524;1071;1;"Serbo-croate";"SH";"NULL";"Initialisation de la valeur «SH» pour la liste «68».";2009-04-08 12:06:41;1;1
2525;1071;1;"Cingalais";"SI";"NULL";"Initialisation de la valeur «SI» pour la liste «68».";2009-04-08 12:06:42;1;1
2526;1071;1;"Slovaque";"SK";"NULL";"Initialisation de la valeur «SK» pour la liste «68».";2009-04-08 12:06:43;1;1
2527;1071;1;"Slovène";"SL";"NULL";"Initialisation de la valeur «SL» pour la liste «68».";2009-04-08 12:06:44;1;1
2528;1071;1;"Samoan";"SM";"NULL";"Initialisation de la valeur «SM» pour la liste «68».";2009-04-08 12:06:45;1;1
2529;1071;1;"Shona";"SN";"NULL";"Initialisation de la valeur «SN» pour la liste «68».";2009-04-08 12:06:46;1;1
2530;1071;1;"Somali";"SO";"NULL";"Initialisation de la valeur «SO» pour la liste «68».";2009-04-08 12:06:47;1;1
2531;1071;1;"Albanais";"SQ";"NULL";"Initialisation de la valeur «SQ» pour la liste «68».";2009-04-08 12:06:48;1;1
2532;1071;1;"Serbe";"SR";"NULL";"Initialisation de la valeur «SR» pour la liste «68».";2009-04-08 12:06:49;1;1
2533;1071;1;"Siswati";"SS";"NULL";"Initialisation de la valeur «SS» pour la liste «68».";2009-04-08 12:06:50;1;1
2534;1071;1;"Sotho du Sud";"ST";"NULL";"Initialisation de la valeur «ST» pour la liste «68».";2009-04-08 12:06:51;1;1
2535;1071;1;"Sundanais";"SU";"NULL";"Initialisation de la valeur «SU» pour la liste «68».";2009-04-08 12:06:52;1;1
2536;1071;1;"Suédois";"SV";"NULL";"Initialisation de la valeur «SV» pour la liste «68».";2009-04-08 12:06:53;1;1
2537;1071;1;"Swahili";"SW";"NULL";"Initialisation de la valeur «SW» pour la liste «68».";2009-04-08 12:06:54;1;1
2538;1071;1;"Tamoul";"TA";"NULL";"Initialisation de la valeur «TA» pour la liste «68».";2009-04-08 12:06:55;1;1
2539;1071;1;"Télougou";"TE";"NULL";"Initialisation de la valeur «TE» pour la liste «68».";2009-04-08 12:06:56;1;1
2540;1071;1;"Tadjik";"TG";"NULL";"Initialisation de la valeur «TG» pour la liste «68».";2009-04-08 12:06:57;1;1
2541;1071;1;"Thaï";"TH";"NULL";"Initialisation de la valeur «TH» pour la liste «68».";2009-04-08 12:06:58;1;1
2542;1071;1;"Tigrinya";"TI";"NULL";"Initialisation de la valeur «TI» pour la liste «68».";2009-04-08 12:06:59;1;1
2543;1071;1;"Turkmène";"TK";"NULL";"Initialisation de la valeur «TK» pour la liste «68».";2009-04-08 12:07:00;1;1
2544;1071;1;"Tagalog";"TL";"NULL";"Initialisation de la valeur «TL» pour la liste «68».";2009-04-08 12:07:01;1;1
2545;1071;1;"Tswana";"TN";"NULL";"Initialisation de la valeur «TN» pour la liste «68».";2009-04-08 12:07:02;1;1
2546;1071;1;"Tongien";"TO";"NULL";"Initialisation de la valeur «TO» pour la liste «68».";2009-04-08 12:07:03;1;1
2547;1071;1;"Turc";"TR";"NULL";"Initialisation de la valeur «TR» pour la liste «68».";2009-04-08 12:07:04;1;1
2548;1071;1;"Tsonga";"TS";"NULL";"Initialisation de la valeur «TS» pour la liste «68».";2009-04-08 12:07:05;1;1
2549;1071;1;"Tatar";"TT";"NULL";"Initialisation de la valeur «TT» pour la liste «68».";2009-04-08 12:07:06;1;1
2550;1071;1;"Twi";"TW";"NULL";"Initialisation de la valeur «TW» pour la liste «68».";2009-04-08 12:07:07;1;1
2551;1071;1;"Tahitien";"TY";"NULL";"Initialisation de la valeur «TY» pour la liste «68».";2009-04-08 12:07:08;1;1
2552;1071;1;"Ouïghour";"UG";"NULL";"Initialisation de la valeur «UG» pour la liste «68».";2009-04-08 12:07:09;1;1
2553;1071;1;"Ukrainien";"UK";"NULL";"Initialisation de la valeur «UK» pour la liste «68».";2009-04-08 12:07:10;1;1
2554;1071;1;"Ourdou";"UR";"NULL";"Initialisation de la valeur «UR» pour la liste «68».";2009-04-08 12:07:11;1;1
2555;1071;1;"Ouzbek";"UZ";"NULL";"Initialisation de la valeur «UZ» pour la liste «68».";2009-04-08 12:07:12;1;1
2556;1071;1;"Venda";"VE";"NULL";"Initialisation de la valeur «VE» pour la liste «68».";2009-04-08 12:07:13;1;1
2557;1071;1;"Vietnamien";"VI";"NULL";"Initialisation de la valeur «VI» pour la liste «68».";2009-04-08 12:07:14;1;1
2558;1071;1;"Volapük";"VO";"NULL";"Initialisation de la valeur «VO» pour la liste «68».";2009-04-08 12:07:15;1;1
2559;1071;1;"Wallon";"WA";"NULL";"Initialisation de la valeur «WA» pour la liste «68».";2009-04-08 12:07:16;1;1
2560;1071;1;"Wolof";"WO";"NULL";"Initialisation de la valeur «WO» pour la liste «68».";2009-04-08 12:07:17;1;1
2561;1071;1;"Xhosa";"XH";"NULL";"Initialisation de la valeur «XH» pour la liste «68».";2009-04-08 12:07:18;1;1
2562;1071;1;"Yiddish";"YI";"NULL";"Initialisation de la valeur «YI» pour la liste «68».";2009-04-08 12:07:19;1;1
2563;1071;1;"Yoruba";"YO";"NULL";"Initialisation de la valeur «YO» pour la liste «68».";2009-04-08 12:07:20;1;1
2564;1071;1;"Zhuang";"ZA";"NULL";"Initialisation de la valeur «ZA» pour la liste «68».";2009-04-08 12:07:21;1;1
2565;1071;1;"Chinois";"ZH";"NULL";"Initialisation de la valeur «ZH» pour la liste «68».";2009-04-08 12:07:22;1;1
2566;1071;1;"Zoulou";"ZU";"NULL";"Initialisation de la valeur «ZU» pour la liste «68».";2009-04-08 12:07:23;1;1
2567;1072;1;"1 heure";"1h";"NULL";"Initialisation de la valeur «1h» pour la liste «69».";2009-04-08 12:07:24;1;1
2568;1072;1;"2 heures";"2h";"NULL";"Initialisation de la valeur «2h» pour la liste «69».";2009-04-08 12:07:25;1;1
2569;1072;1;"5 heures";"5h";"NULL";"Initialisation de la valeur «5h» pour la liste «69».";2009-04-08 12:07:26;1;1
2570;1072;1;"10 heures";"10h";"NULL";"Initialisation de la valeur «10h» pour la liste «69».";2009-04-08 12:07:27;1;1
2571;1073;1;"Journalier";"J";"NULL";"Initialisation de la valeur «J» pour la liste «70».";2009-04-08 12:07:28;1;1
2572;1073;1;"Hebdomadaire";"H";"NULL";"Initialisation de la valeur «H» pour la liste «70».";2009-04-08 12:07:29;1;1
2573;1073;1;"Mensuel";"M";"NULL";"Initialisation de la valeur «M» pour la liste «70».";2009-04-08 12:07:30;1;1
2574;1073;1;"Bi-mensuel";"B";"NULL";"Initialisation de la valeur «B» pour la liste «70».";2009-04-08 12:07:31;1;1
2575;1073;1;"Trimestriel";"T";"NULL";"Initialisation de la valeur «T» pour la liste «70».";2009-04-08 12:07:32;1;1
2576;1073;1;"Semestriel";"S";"NULL";"Initialisation de la valeur «S» pour la liste «70».";2009-04-08 12:07:33;1;1
2577;1074;1;"Afghanistan";"AF";"NULL";"Initialisation de la valeur «AF» pour la liste «71».";2009-04-08 12:07:34;1;1
2578;1074;1;"Afrique du Sud";"ZA";"NULL";"Initialisation de la valeur «ZA» pour la liste «71».";2009-04-08 12:07:35;1;1
2579;1074;1;"Åland";"AX";"NULL";"Initialisation de la valeur «AX» pour la liste «71».";2009-04-08 12:07:36;1;1
2580;1074;1;"Albanie";"AL";"NULL";"Initialisation de la valeur «AL» pour la liste «71».";2009-04-08 12:07:37;1;1
2581;1074;1;"Algérie";"DZ";"NULL";"Initialisation de la valeur «DZ» pour la liste «71».";2009-04-08 12:07:38;1;1
2582;1074;1;"Allemagne";"DE";"NULL";"Initialisation de la valeur «DE» pour la liste «71».";2009-04-08 12:07:39;1;1
2583;1074;1;"Andorre";"AD";"NULL";"Initialisation de la valeur «AD» pour la liste «71».";2009-04-08 12:07:40;1;1
2584;1074;1;"Angola";"AO";"NULL";"Initialisation de la valeur «AO» pour la liste «71».";2009-04-08 12:07:41;1;1
2585;1074;1;"Anguilla";"AI";"NULL";"Initialisation de la valeur «AI» pour la liste «71».";2009-04-08 12:07:42;1;1
2586;1074;1;"Antarctique";"AQ";"NULL";"Initialisation de la valeur «AQ» pour la liste «71».";2009-04-08 12:07:43;1;1
2587;1074;1;"Antigua-et-Barbuda";"AG";"NULL";"Initialisation de la valeur «AG» pour la liste «71».";2009-04-08 12:07:44;1;1
2588;1074;1;"Antilles néerlandaises";"AN";"NULL";"Initialisation de la valeur «AN» pour la liste «71».";2009-04-08 12:07:45;1;1
2589;1074;1;"Arabie saoudite";"SA";"NULL";"Initialisation de la valeur «SA» pour la liste «71».";2009-04-08 12:07:46;1;1
2590;1074;1;"Argentine";"AR";"NULL";"Initialisation de la valeur «AR» pour la liste «71».";2009-04-08 12:07:47;1;1
2591;1074;1;"Arménie";"AM";"NULL";"Initialisation de la valeur «AM» pour la liste «71».";2009-04-08 12:07:48;1;1
2592;1074;1;"Aruba";"AW";"NULL";"Initialisation de la valeur «AW» pour la liste «71».";2009-04-08 12:07:49;1;1
2593;1074;1;"Australie";"AU";"NULL";"Initialisation de la valeur «AU» pour la liste «71».";2009-04-08 12:07:50;1;1
2594;1074;1;"Autriche";"AT";"NULL";"Initialisation de la valeur «AT» pour la liste «71».";2009-04-08 12:07:51;1;1
2595;1074;1;"Azerbaïdjan";"AZ";"NULL";"Initialisation de la valeur «AZ» pour la liste «71».";2009-04-08 12:07:52;1;1
2596;1074;1;"Bahamas";"BS";"NULL";"Initialisation de la valeur «BS» pour la liste «71».";2009-04-08 12:07:53;1;1
2597;1074;1;"Bahreïn";"BH";"NULL";"Initialisation de la valeur «BH» pour la liste «71».";2009-04-08 12:07:54;1;1
2598;1074;1;"Bangladesh";"BD";"NULL";"Initialisation de la valeur «BD» pour la liste «71».";2009-04-08 12:07:55;1;1
2599;1074;1;"Barbade";"BB";"NULL";"Initialisation de la valeur «BB» pour la liste «71».";2009-04-08 12:07:56;1;1
2600;1074;1;"Biélorussie";"BY";"NULL";"Initialisation de la valeur «BY» pour la liste «71».";2009-04-08 12:07:57;1;1
2601;1074;1;"Belgique";"BE";"NULL";"Initialisation de la valeur «BE» pour la liste «71».";2009-04-08 12:07:58;1;1
2602;1074;1;"Belize";"BZ";"NULL";"Initialisation de la valeur «BZ» pour la liste «71».";2009-04-08 12:07:59;1;1
2603;1074;1;"Bénin";"BJ";"NULL";"Initialisation de la valeur «BJ» pour la liste «71».";2009-04-08 12:08:00;1;1
2604;1074;1;"Bermudes";"BM";"Territoire d'outre-mer autonome (Royaume-Uni)";"Initialisation de la valeur «BM» pour la liste «71».";2009-04-08 12:08:01;1;1
2605;1074;1;"Bhoutan";"BT";"NULL";"Initialisation de la valeur «BT» pour la liste «71».";2009-04-08 12:08:02;1;1
2606;1074;1;"Bolivie";"BO";"NULL";"Initialisation de la valeur «BO» pour la liste «71».";2009-04-08 12:08:03;1;1
2607;1074;1;"Bosnie-Herzégovine";"BA";"NULL";"Initialisation de la valeur «BA» pour la liste «71».";2009-04-08 12:08:04;1;1
2608;1074;1;"Botswana";"BW";"NULL";"Initialisation de la valeur «BW» pour la liste «71».";2009-04-08 12:08:05;1;1
2609;1074;1;"Île Bouvet";"BV";"NULL";"Initialisation de la valeur «BV» pour la liste «71».";2009-04-08 12:08:06;1;1
2610;1074;1;"Brésil";"BR";"NULL";"Initialisation de la valeur «BR» pour la liste «71».";2009-04-08 12:08:07;1;1
2611;1074;1;"Brunei";"BN";"NULL";"Initialisation de la valeur «BN» pour la liste «71».";2009-04-08 12:08:08;1;1
2612;1074;1;"Bulgarie";"BG";"NULL";"Initialisation de la valeur «BG» pour la liste «71».";2009-04-08 12:08:09;1;1
2613;1074;1;"Burkina Faso";"BF";"NULL";"Initialisation de la valeur «BF» pour la liste «71».";2009-04-08 12:08:10;1;1
2614;1074;1;"Burundi";"BI";"NULL";"Initialisation de la valeur «BI» pour la liste «71».";2009-04-08 12:08:11;1;1
2615;1074;1;"Îles Caïmans";"KY";"NULL";"Initialisation de la valeur «KY» pour la liste «71».";2009-04-08 12:08:12;1;1
2616;1074;1;"Cambodge";"KH";"NULL";"Initialisation de la valeur «KH» pour la liste «71».";2009-04-08 12:08:13;1;1
2617;1074;1;"Cameroun";"CM";"NULL";"Initialisation de la valeur «CM» pour la liste «71».";2009-04-08 12:08:14;1;1
2618;1074;1;"Canada";"CA";"NULL";"Initialisation de la valeur «CA» pour la liste «71».";2009-04-08 12:08:15;1;1
2619;1074;1;"Cap-Vert";"CV";"NULL";"Initialisation de la valeur «CV» pour la liste «71».";2009-04-08 12:08:16;1;1
2620;1074;1;"République centrafricaine";"CF";"NULL";"Initialisation de la valeur «CF» pour la liste «71».";2009-04-08 12:08:17;1;1
2621;1074;1;"Chili";"CL";"NULL";"Initialisation de la valeur «CL» pour la liste «71».";2009-04-08 12:08:18;1;1
2622;1074;1;"Chine";"CN";"République populaire de Chine";"Initialisation de la valeur «CN» pour la liste «71».";2009-04-08 12:08:19;1;1
2623;1074;1;"Île Christmas";"CX";"Australie";"Initialisation de la valeur «CX» pour la liste «71».";2009-04-08 12:08:20;1;1
2624;1074;1;"Chypre";"CY";"NULL";"Initialisation de la valeur «CY» pour la liste «71».";2009-04-08 12:08:21;1;1
2625;1074;1;"Îles Cocos";"CC";"NULL";"Initialisation de la valeur «CC» pour la liste «71».";2009-04-08 12:08:22;1;1
2626;1074;1;"Colombie";"CO";"NULL";"Initialisation de la valeur «CO» pour la liste «71».";2009-04-08 12:08:23;1;1
2627;1074;1;"Comores";"KM";"NULL";"Initialisation de la valeur «KM» pour la liste «71».";2009-04-08 12:08:24;1;1
2628;1074;1;"Congo-Brazzaville / (Congo)";"CG";"Congo";"Initialisation de la valeur «CG» pour la liste «71».";2009-04-08 12:08:25;1;1
2629;1074;1;"Congo-Kinshasa / (République démocratique du Congo)";"CD";"République démocratique du Congo";"Initialisation de la valeur «CD» pour la liste «71».";2009-04-08 12:08:26;1;1
2630;1074;1;"Îles Cook";"CK";"NULL";"Initialisation de la valeur «CK» pour la liste «71».";2009-04-08 12:08:27;1;1
2631;1074;1;"Corée du Sud";"KR";"NULL";"Initialisation de la valeur «KR» pour la liste «71».";2009-04-08 12:08:28;1;1
2632;1074;1;"Corée du Nord";"KP";"NULL";"Initialisation de la valeur «KP» pour la liste «71».";2009-04-08 12:08:29;1;1
2633;1074;1;"Costa Rica";"CR";"NULL";"Initialisation de la valeur «CR» pour la liste «71».";2009-04-08 12:08:30;1;1
2634;1074;1;"Côte d'Ivoire";"CI";"NULL";"Initialisation de la valeur «CI» pour la liste «71».";2009-04-08 12:08:31;1;1
2635;1074;1;"Croatie";"HR";"NULL";"Initialisation de la valeur «HR» pour la liste «71».";2009-04-08 12:08:32;1;1
2636;1074;1;"Cuba";"CU";"NULL";"Initialisation de la valeur «CU» pour la liste «71».";2009-04-08 12:08:33;1;1
2637;1074;1;"Danemark";"DK";"NULL";"Initialisation de la valeur «DK» pour la liste «71».";2009-04-08 12:08:34;1;1
2638;1074;1;"Djibouti";"DJ";"NULL";"Initialisation de la valeur «DJ» pour la liste «71».";2009-04-08 12:08:35;1;1
2639;1074;1;"République dominicaine";"DO";"NULL";"Initialisation de la valeur «DO» pour la liste «71».";2009-04-08 12:08:36;1;1
2640;1074;1;"Dominique";"DM";"NULL";"Initialisation de la valeur «DM» pour la liste «71».";2009-04-08 12:08:37;1;1
2641;1074;1;"Égypte";"EG";"NULL";"Initialisation de la valeur «EG» pour la liste «71».";2009-04-08 12:08:38;1;1
2642;1074;1;"Salvador";"SV";"NULL";"Initialisation de la valeur «SV» pour la liste «71».";2009-04-08 12:08:39;1;1
2643;1074;1;"Émirats arabes unis";"AE";"NULL";"Initialisation de la valeur «AE» pour la liste «71».";2009-04-08 12:08:40;1;1
2644;1074;1;"Équateur";"EC";"NULL";"Initialisation de la valeur «EC» pour la liste «71».";2009-04-08 12:08:41;1;1
2645;1074;1;"Érythrée";"ER";"NULL";"Initialisation de la valeur «ER» pour la liste «71».";2009-04-08 12:08:42;1;1
2646;1074;1;"Espagne";"ES";"NULL";"Initialisation de la valeur «ES» pour la liste «71».";2009-04-08 12:08:43;1;1
2647;1074;1;"Estonie";"EE";"NULL";"Initialisation de la valeur «EE» pour la liste «71».";2009-04-08 12:08:44;1;1
2648;1074;1;"États-Unis";"US";"NULL";"Initialisation de la valeur «US» pour la liste «71».";2009-04-08 12:08:45;1;1
2649;1074;1;"Éthiopie";"ET";"NULL";"Initialisation de la valeur «ET» pour la liste «71».";2009-04-08 12:08:46;1;1
2650;1074;1;"Îles Malouines";"FK";"Territoire autonome (Royaume-Uni)";"Initialisation de la valeur «FK» pour la liste «71».";2009-04-08 12:08:47;1;1
2651;1074;1;"Îles Féroé";"FO";"NULL";"Initialisation de la valeur «FO» pour la liste «71».";2009-04-08 12:08:48;1;1
2652;1074;1;"Fidji";"FJ";"NULL";"Initialisation de la valeur «FJ» pour la liste «71».";2009-04-08 12:08:49;1;1
2653;1074;1;"Finlande";"FI";"NULL";"Initialisation de la valeur «FI» pour la liste «71».";2009-04-08 12:08:50;1;1
2654;1074;1;"France";"FR";"NULL";"Initialisation de la valeur «FR» pour la liste «71».";2009-04-08 12:08:51;1;1
2655;1074;1;"Gabon";"GA";"NULL";"Initialisation de la valeur «GA» pour la liste «71».";2009-04-08 12:08:52;1;1
2656;1074;1;"Gambie";"GM";"NULL";"Initialisation de la valeur «GM» pour la liste «71».";2009-04-08 12:08:53;1;1
2657;1074;1;"Géorgie";"GE";"NULL";"Initialisation de la valeur «GE» pour la liste «71».";2009-04-08 12:08:54;1;1
2658;1074;1;"Géorgie du Sud-et-les Îles Sandwich du Sud";"GS";"NULL";"Initialisation de la valeur «GS» pour la liste «71».";2009-04-08 12:08:55;1;1
2659;1074;1;"Ghana";"GH";"NULL";"Initialisation de la valeur «GH» pour la liste «71».";2009-04-08 12:08:56;1;1
2660;1074;1;"Gibraltar";"GI";"NULL";"Initialisation de la valeur «GI» pour la liste «71».";2009-04-08 12:08:57;1;1
2661;1074;1;"Grèce";"GR";"NULL";"Initialisation de la valeur «GR» pour la liste «71».";2009-04-08 12:08:58;1;1
2662;1074;1;"Grenade";"GD";"NULL";"Initialisation de la valeur «GD» pour la liste «71».";2009-04-08 12:08:59;1;1
2663;1074;1;"Groenland";"GL";"NULL";"Initialisation de la valeur «GL» pour la liste «71».";2009-04-08 12:09:00;1;1
2664;1074;1;"Guadeloupe";"GP";"NULL";"Initialisation de la valeur «GP» pour la liste «71».";2009-04-08 12:09:01;1;1
2665;1074;1;"Guam";"GU";"NULL";"Initialisation de la valeur «GU» pour la liste «71».";2009-04-08 12:09:02;1;1
2666;1074;1;"Guatemala";"GT";"NULL";"Initialisation de la valeur «GT» pour la liste «71».";2009-04-08 12:09:03;1;1
2667;1074;1;"Guernesey";"GG";"NULL";"Initialisation de la valeur «GG» pour la liste «71».";2009-04-08 12:09:04;1;1
2668;1074;1;"Guinée";"GN";"NULL";"Initialisation de la valeur «GN» pour la liste «71».";2009-04-08 12:09:05;1;1
2669;1074;1;"Guinée-Bissau";"GW";"NULL";"Initialisation de la valeur «GW» pour la liste «71».";2009-04-08 12:09:06;1;1
2670;1074;1;"Guinée équatoriale";"GQ";"NULL";"Initialisation de la valeur «GQ» pour la liste «71».";2009-04-08 12:09:07;1;1
2671;1074;1;"Guyana";"GY";"NULL";"Initialisation de la valeur «GY» pour la liste «71».";2009-04-08 12:09:08;1;1
2672;1074;1;"Guyane";"GF";"NULL";"Initialisation de la valeur «GF» pour la liste «71».";2009-04-08 12:09:09;1;1
2673;1074;1;"Haïti";"HT";"NULL";"Initialisation de la valeur «HT» pour la liste «71».";2009-04-08 12:09:10;1;1
2674;1074;1;"Île Heard et îles McDonald";"HM";"Australie (Territoire)";"Initialisation de la valeur «HM» pour la liste «71».";2009-04-08 12:09:11;1;1
2675;1074;1;"Honduras";"HN";"NULL";"Initialisation de la valeur «HN» pour la liste «71».";2009-04-08 12:09:12;1;1
2676;1074;1;"Hong Kong";"HK";"NULL";"Initialisation de la valeur «HK» pour la liste «71».";2009-04-08 12:09:13;1;1
2677;1074;1;"Hongrie";"HU";"NULL";"Initialisation de la valeur «HU» pour la liste «71».";2009-04-08 12:09:14;1;1
2678;1074;1;"Île de Man";"IM";"NULL";"Initialisation de la valeur «IM» pour la liste «71».";2009-04-08 12:09:15;1;1
2679;1074;1;"Îles mineures éloignées des États-Unis";"UM";"NULL";"Initialisation de la valeur «UM» pour la liste «71».";2009-04-08 12:09:16;1;1
2680;1074;1;"Îles Vierges britanniques";"VG";"NULL";"Initialisation de la valeur «VG» pour la liste «71».";2009-04-08 12:09:17;1;1
2681;1074;1;"Îles Vierges américaines";"VI";"NULL";"Initialisation de la valeur «VI» pour la liste «71».";2009-04-08 12:09:18;1;1
2682;1074;1;"Inde";"IN";"NULL";"Initialisation de la valeur «IN» pour la liste «71».";2009-04-08 12:09:19;1;1
2683;1074;1;"Indonésie";"ID";"NULL";"Initialisation de la valeur «ID» pour la liste «71».";2009-04-08 12:09:20;1;1
2684;1074;1;"Iran";"IR";"NULL";"Initialisation de la valeur «IR» pour la liste «71».";2009-04-08 12:09:21;1;1
2685;1074;1;"Irak";"IQ";"NULL";"Initialisation de la valeur «IQ» pour la liste «71».";2009-04-08 12:09:22;1;1
2686;1074;1;"Irlande";"IE";"NULL";"Initialisation de la valeur «IE» pour la liste «71».";2009-04-08 12:09:23;1;1
2687;1074;1;"Islande";"IS";"NULL";"Initialisation de la valeur «IS» pour la liste «71».";2009-04-08 12:09:24;1;1
2688;1074;1;"Israël";"IL";"NULL";"Initialisation de la valeur «IL» pour la liste «71».";2009-04-08 12:09:25;1;1
2689;1074;1;"Italie";"IT";"NULL";"Initialisation de la valeur «IT» pour la liste «71».";2009-04-08 12:09:26;1;1
2690;1074;1;"Jamaïque";"JM";"NULL";"Initialisation de la valeur «JM» pour la liste «71».";2009-04-08 12:09:27;1;1
2691;1074;1;"Japon";"JP";"NULL";"Initialisation de la valeur «JP» pour la liste «71».";2009-04-08 12:09:28;1;1
2692;1074;1;"Jersey";"JE";"NULL";"Initialisation de la valeur «JE» pour la liste «71».";2009-04-08 12:09:29;1;1
2693;1074;1;"Jordanie";"JO";"NULL";"Initialisation de la valeur «JO» pour la liste «71».";2009-04-08 12:09:30;1;1
2694;1074;1;"Kazakhstan";"KZ";"NULL";"Initialisation de la valeur «KZ» pour la liste «71».";2009-04-08 12:09:31;1;1
2695;1074;1;"Kenya";"KE";"NULL";"Initialisation de la valeur «KE» pour la liste «71».";2009-04-08 12:09:32;1;1
2696;1074;1;"Kirghizistan";"KG";"NULL";"Initialisation de la valeur «KG» pour la liste «71».";2009-04-08 12:09:33;1;1
2697;1074;1;"Kiribati";"KI";"NULL";"Initialisation de la valeur «KI» pour la liste «71».";2009-04-08 12:09:34;1;1
2698;1074;1;"Koweït";"KW";"NULL";"Initialisation de la valeur «KW» pour la liste «71».";2009-04-08 12:09:35;1;1
2699;1074;1;"Laos";"LA";"NULL";"Initialisation de la valeur «LA» pour la liste «71».";2009-04-08 12:09:36;1;1
2700;1074;1;"Lesotho";"LS";"NULL";"Initialisation de la valeur «LS» pour la liste «71».";2009-04-08 12:09:37;1;1
2701;1074;1;"Lettonie";"LV";"NULL";"Initialisation de la valeur «LV» pour la liste «71».";2009-04-08 12:09:38;1;1
2702;1074;1;"Liban";"LB";"NULL";"Initialisation de la valeur «LB» pour la liste «71».";2009-04-08 12:09:39;1;1
2703;1074;1;"Libéria";"LR";"NULL";"Initialisation de la valeur «LR» pour la liste «71».";2009-04-08 12:09:40;1;1
2704;1074;1;"Libye";"LY";"NULL";"Initialisation de la valeur «LY» pour la liste «71».";2009-04-08 12:09:41;1;1
2705;1074;1;"Liechtenstein";"LI";"NULL";"Initialisation de la valeur «LI» pour la liste «71».";2009-04-08 12:09:42;1;1
2706;1074;1;"Lituanie";"LT";"NULL";"Initialisation de la valeur «LT» pour la liste «71».";2009-04-08 12:09:43;1;1
2707;1074;1;"Luxembourg";"LU";"NULL";"Initialisation de la valeur «LU» pour la liste «71».";2009-04-08 12:09:44;1;1
2708;1074;1;"Macao";"MO";"NULL";"Initialisation de la valeur «MO» pour la liste «71».";2009-04-08 12:09:45;1;1
2709;1074;1;"Macédoine";"MK";"NULL";"Initialisation de la valeur «MK» pour la liste «71».";2009-04-08 12:09:46;1;1
2710;1074;1;"Madagascar";"MG";"NULL";"Initialisation de la valeur «MG» pour la liste «71».";2009-04-08 12:09:47;1;1
2711;1074;1;"Malaisie";"MY";"NULL";"Initialisation de la valeur «MY» pour la liste «71».";2009-04-08 12:09:48;1;1
2712;1074;1;"Malawi";"MW";"NULL";"Initialisation de la valeur «MW» pour la liste «71».";2009-04-08 12:09:49;1;1
2713;1074;1;"Maldives";"MV";"NULL";"Initialisation de la valeur «MV» pour la liste «71».";2009-04-08 12:09:50;1;1
2714;1074;1;"Mali";"ML";"NULL";"Initialisation de la valeur «ML» pour la liste «71».";2009-04-08 12:09:51;1;1
2715;1074;1;"Malte";"MT";"NULL";"Initialisation de la valeur «MT» pour la liste «71».";2009-04-08 12:09:52;1;1
2716;1074;1;"Îles Mariannes du Nord";"MP";"NULL";"Initialisation de la valeur «MP» pour la liste «71».";2009-04-08 12:09:53;1;1
2717;1074;1;"Maroc";"MA";"NULL";"Initialisation de la valeur «MA» pour la liste «71».";2009-04-08 12:09:54;1;1
2718;1074;1;"Îles Marshall";"MH";"NULL";"Initialisation de la valeur «MH» pour la liste «71».";2009-04-08 12:09:55;1;1
2719;1074;1;"Martinique";"MQ";"NULL";"Initialisation de la valeur «MQ» pour la liste «71».";2009-04-08 12:09:56;1;1
2720;1074;1;"Maurice";"MU";"NULL";"Initialisation de la valeur «MU» pour la liste «71».";2009-04-08 12:09:57;1;1
2721;1074;1;"Mauritanie";"MR";"NULL";"Initialisation de la valeur «MR» pour la liste «71».";2009-04-08 12:09:58;1;1
2722;1074;1;"Mayotte";"YT";"NULL";"Initialisation de la valeur «YT» pour la liste «71».";2009-04-08 12:09:59;1;1
2723;1074;1;"Mexique";"MX";"NULL";"Initialisation de la valeur «MX» pour la liste «71».";2009-04-08 12:10:00;1;1
2724;1074;1;"Micronésie";"FM";"NULL";"Initialisation de la valeur «FM» pour la liste «71».";2009-04-08 12:10:01;1;1
2725;1074;1;"Moldavie";"MD";"NULL";"Initialisation de la valeur «MD» pour la liste «71».";2009-04-08 12:10:02;1;1
2726;1074;1;"Monaco";"MC";"NULL";"Initialisation de la valeur «MC» pour la liste «71».";2009-04-08 12:10:03;1;1
2727;1074;1;"Mongolie";"MN";"NULL";"Initialisation de la valeur «MN» pour la liste «71».";2009-04-08 12:10:04;1;1
2728;1074;1;"Monténégro";"ME";"NULL";"Initialisation de la valeur «ME» pour la liste «71».";2009-04-08 12:10:05;1;1
2729;1074;1;"Montserrat";"MS";"NULL";"Initialisation de la valeur «MS» pour la liste «71».";2009-04-08 12:10:06;1;1
2730;1074;1;"Mozambique";"MZ";"NULL";"Initialisation de la valeur «MZ» pour la liste «71».";2009-04-08 12:10:07;1;1
2731;1074;1;"Birmanie";"MM";"NULL";"Initialisation de la valeur «MM» pour la liste «71».";2009-04-08 12:10:08;1;1
2732;1074;1;"Namibie";"NA";"NULL";"Initialisation de la valeur «NA» pour la liste «71».";2009-04-08 12:10:09;1;1
2733;1074;1;"Nauru";"NR";"NULL";"Initialisation de la valeur «NR» pour la liste «71».";2009-04-08 12:10:10;1;1
2734;1074;1;"Népal";"NP";"NULL";"Initialisation de la valeur «NP» pour la liste «71».";2009-04-08 12:10:11;1;1
2735;1074;1;"Nicaragua";"NI";"NULL";"Initialisation de la valeur «NI» pour la liste «71».";2009-04-08 12:10:12;1;1
2736;1074;1;"Niger";"NE";"NULL";"Initialisation de la valeur «NE» pour la liste «71».";2009-04-08 12:10:13;1;1
2737;1074;1;"Nigeria";"NG";"NULL";"Initialisation de la valeur «NG» pour la liste «71».";2009-04-08 12:10:14;1;1
2738;1074;1;"Niué";"NU";"NULL";"Initialisation de la valeur «NU» pour la liste «71».";2009-04-08 12:10:15;1;1
2739;1074;1;"Norfolk";"NF";"NULL";"Initialisation de la valeur «NF» pour la liste «71».";2009-04-08 12:10:16;1;1
2740;1074;1;"Norvège";"NO";"NULL";"Initialisation de la valeur «NO» pour la liste «71».";2009-04-08 12:10:17;1;1
2741;1074;1;"Nouvelle-Calédonie";"NC";"NULL";"Initialisation de la valeur «NC» pour la liste «71».";2009-04-08 12:10:18;1;1
2742;1074;1;"Nouvelle-Zélande";"NZ";"NULL";"Initialisation de la valeur «NZ» pour la liste «71».";2009-04-08 12:10:19;1;1
2743;1074;1;"Territoire britannique de l'océan Indien";"IO";"NULL";"Initialisation de la valeur «IO» pour la liste «71».";2009-04-08 12:10:20;1;1
2744;1074;1;"Oman";"OM";"NULL";"Initialisation de la valeur «OM» pour la liste «71».";2009-04-08 12:10:21;1;1
2745;1074;1;"Ouganda";"UG";"NULL";"Initialisation de la valeur «UG» pour la liste «71».";2009-04-08 12:10:22;1;1
2746;1074;1;"Ouzbékistan";"UZ";"NULL";"Initialisation de la valeur «UZ» pour la liste «71».";2009-04-08 12:10:23;1;1
2747;1074;1;"Pakistan";"PK";"NULL";"Initialisation de la valeur «PK» pour la liste «71».";2009-04-08 12:10:24;1;1
2748;1074;1;"Palaos";"PW";"NULL";"Initialisation de la valeur «PW» pour la liste «71».";2009-04-08 12:10:25;1;1
2749;1074;1;"Palestine";"PS";"NULL";"Initialisation de la valeur «PS» pour la liste «71».";2009-04-08 12:10:26;1;1
2750;1074;1;"Panamá";"PA";"NULL";"Initialisation de la valeur «PA» pour la liste «71».";2009-04-08 12:10:27;1;1
2751;1074;1;"Papouasie-Nouvelle-Guinée";"PG";"NULL";"Initialisation de la valeur «PG» pour la liste «71».";2009-04-08 12:10:28;1;1
2752;1074;1;"Paraguay";"PY";"NULL";"Initialisation de la valeur «PY» pour la liste «71».";2009-04-08 12:10:29;1;1
2753;1074;1;"Pays-Bas";"NL";"NULL";"Initialisation de la valeur «NL» pour la liste «71».";2009-04-08 12:10:30;1;1
2754;1074;1;"Pérou";"PE";"NULL";"Initialisation de la valeur «PE» pour la liste «71».";2009-04-08 12:10:31;1;1
2755;1074;1;"Philippines";"PH";"NULL";"Initialisation de la valeur «PH» pour la liste «71».";2009-04-08 12:10:32;1;1
2756;1074;1;"Pitcairn";"PN";"NULL";"Initialisation de la valeur «PN» pour la liste «71».";2009-04-08 12:10:33;1;1
2757;1074;1;"Pologne";"PL";"NULL";"Initialisation de la valeur «PL» pour la liste «71».";2009-04-08 12:10:34;1;1
2758;1074;1;"Polynésie française";"PF";"NULL";"Initialisation de la valeur «PF» pour la liste «71».";2009-04-08 12:10:35;1;1
2759;1074;1;"Porto Rico";"PR";"NULL";"Initialisation de la valeur «PR» pour la liste «71».";2009-04-08 12:10:36;1;1
2760;1074;1;"Portugal";"PT";"NULL";"Initialisation de la valeur «PT» pour la liste «71».";2009-04-08 12:10:37;1;1
2761;1074;1;"Qatar";"QA";"NULL";"Initialisation de la valeur «QA» pour la liste «71».";2009-04-08 12:10:38;1;1
2762;1074;1;"La Réunion";"RE";"NULL";"Initialisation de la valeur «RE» pour la liste «71».";2009-04-08 12:10:39;1;1
2763;1074;1;"Roumanie";"RO";"NULL";"Initialisation de la valeur «RO» pour la liste «71».";2009-04-08 12:10:40;1;1
2764;1074;1;"Royaume-Uni";"GB";"NULL";"Initialisation de la valeur «GB» pour la liste «71».";2009-04-08 12:10:41;1;1
2765;1074;1;"Russie";"RU";"NULL";"Initialisation de la valeur «RU» pour la liste «71».";2009-04-08 12:10:42;1;1
2766;1074;1;"Rwanda";"RW";"NULL";"Initialisation de la valeur «RW» pour la liste «71».";2009-04-08 12:10:43;1;1
2767;1074;1;"Sahara occidental";"EH";"NULL";"Initialisation de la valeur «EH» pour la liste «71».";2009-04-08 12:10:44;1;1
2768;1074;1;"Saint-Barthélemy";"BL";"NULL";"Initialisation de la valeur «BL» pour la liste «71».";2009-04-08 12:10:45;1;1
2769;1074;1;"Saint-Christophe-et-Niévès";"KN";"NULL";"Initialisation de la valeur «KN» pour la liste «71».";2009-04-08 12:10:46;1;1
2770;1074;1;"Saint-Marin";"SM";"NULL";"Initialisation de la valeur «SM» pour la liste «71».";2009-04-08 12:10:47;1;1
2771;1074;1;"Saint-Martin";"MF";"NULL";"Initialisation de la valeur «MF» pour la liste «71».";2009-04-08 12:10:48;1;1
2772;1074;1;"Saint-Pierre-et-Miquelon";"PM";"NULL";"Initialisation de la valeur «PM» pour la liste «71».";2009-04-08 12:10:49;1;1
2773;1074;1;"Vatican / (Saint-Siège)";"VA";"NULL";"Initialisation de la valeur «VA» pour la liste «71».";2009-04-08 12:10:50;1;1
2774;1074;1;"Saint-Vincent-et-les Grenadines";"VC";"NULL";"Initialisation de la valeur «VC» pour la liste «71».";2009-04-08 12:10:51;1;1
2775;1074;1;"Sainte-Hélène (territoire)";"SH";"NULL";"Initialisation de la valeur «SH» pour la liste «71».";2009-04-08 12:10:52;1;1
2776;1074;1;"Sainte-Lucie";"LC";"NULL";"Initialisation de la valeur «LC» pour la liste «71».";2009-04-08 12:10:53;1;1
2777;1074;1;"Salomon";"SB";"NULL";"Initialisation de la valeur «SB» pour la liste «71».";2009-04-08 12:10:54;1;1
2778;1074;1;"Samoa";"WS";"NULL";"Initialisation de la valeur «WS» pour la liste «71».";2009-04-08 12:10:55;1;1
2779;1074;1;"Samoa américaines";"AS";"NULL";"Initialisation de la valeur «AS» pour la liste «71».";2009-04-08 12:10:56;1;1
2780;1074;1;"Sao Tomé-et-Principe";"ST";"NULL";"Initialisation de la valeur «ST» pour la liste «71».";2009-04-08 12:10:57;1;1
2781;1074;1;"Sénégal";"SN";"NULL";"Initialisation de la valeur «SN» pour la liste «71».";2009-04-08 12:10:58;1;1
2782;1074;1;"Serbie";"RS";"NULL";"Initialisation de la valeur «RS» pour la liste «71».";2009-04-08 12:10:59;1;1
2783;1074;1;"Seychelles";"SC";"NULL";"Initialisation de la valeur «SC» pour la liste «71».";2009-04-08 12:11:00;1;1
2784;1074;1;"Sierra Leone";"SL";"NULL";"Initialisation de la valeur «SL» pour la liste «71».";2009-04-08 12:11:01;1;1
2785;1074;1;"Singapour";"SG";"NULL";"Initialisation de la valeur «SG» pour la liste «71».";2009-04-08 12:11:02;1;1
2786;1074;1;"Slovaquie";"SK";"NULL";"Initialisation de la valeur «SK» pour la liste «71».";2009-04-08 12:11:03;1;1
2787;1074;1;"Slovénie";"SI";"NULL";"Initialisation de la valeur «SI» pour la liste «71».";2009-04-08 12:11:04;1;1
2788;1074;1;"Somalie";"SO";"NULL";"Initialisation de la valeur «SO» pour la liste «71».";2009-04-08 12:11:05;1;1
2789;1074;1;"Soudan";"SD";"NULL";"Initialisation de la valeur «SD» pour la liste «71».";2009-04-08 12:11:06;1;1
2790;1074;1;"Sri Lanka";"LK";"NULL";"Initialisation de la valeur «LK» pour la liste «71».";2009-04-08 12:11:07;1;1
2791;1074;1;"Suède";"SE";"NULL";"Initialisation de la valeur «SE» pour la liste «71».";2009-04-08 12:11:08;1;1
2792;1074;1;"Suisse";"CH";"NULL";"Initialisation de la valeur «CH» pour la liste «71».";2009-04-08 12:11:09;1;1
2793;1074;1;"Suriname";"SR";"NULL";"Initialisation de la valeur «SR» pour la liste «71».";2009-04-08 12:11:10;1;1
2794;1074;1;"Svalbard et île Jan Mayen";"SJ";"NULL";"Initialisation de la valeur «SJ» pour la liste «71».";2009-04-08 12:11:11;1;1
2795;1074;1;"Swaziland";"SZ";"NULL";"Initialisation de la valeur «SZ» pour la liste «71».";2009-04-08 12:11:12;1;1
2796;1074;1;"Syrie";"SY";"NULL";"Initialisation de la valeur «SY» pour la liste «71».";2009-04-08 12:11:13;1;1
2797;1074;1;"Tadjikistan";"TJ";"NULL";"Initialisation de la valeur «TJ» pour la liste «71».";2009-04-08 12:11:14;1;1
2798;1074;1;"Taïwan / (République de Chine (Taïwan))";"TW";"NULL";"Initialisation de la valeur «TW» pour la liste «71».";2009-04-08 12:11:15;1;1
2799;1074;1;"Tanzanie";"TZ";"NULL";"Initialisation de la valeur «TZ» pour la liste «71».";2009-04-08 12:11:16;1;1
2800;1074;1;"Tchad";"TD";"NULL";"Initialisation de la valeur «TD» pour la liste «71».";2009-04-08 12:11:17;1;1
2801;1074;1;"République tchèque";"CZ";"NULL";"Initialisation de la valeur «CZ» pour la liste «71».";2009-04-08 12:11:18;1;1
2802;1074;1;"Terres australes et antarctiques françaises";"TF";"NULL";"Initialisation de la valeur «TF» pour la liste «71».";2009-04-08 12:11:19;1;1
2803;1074;1;"Thaïlande";"TH";"NULL";"Initialisation de la valeur «TH» pour la liste «71».";2009-04-08 12:11:20;1;1
2804;1074;1;"Timor oriental";"TL";"NULL";"Initialisation de la valeur «TL» pour la liste «71».";2009-04-08 12:11:21;1;1
2805;1074;1;"Togo";"TG";"NULL";"Initialisation de la valeur «TG» pour la liste «71».";2009-04-08 12:11:22;1;1
2806;1074;1;"Tokelau";"TK";"NULL";"Initialisation de la valeur «TK» pour la liste «71».";2009-04-08 12:11:23;1;1
2807;1074;1;"Tonga";"TO";"NULL";"Initialisation de la valeur «TO» pour la liste «71».";2009-04-08 12:11:24;1;1
2808;1074;1;"Trinité-et-Tobago";"TT";"NULL";"Initialisation de la valeur «TT» pour la liste «71».";2009-04-08 12:11:25;1;1
2809;1074;1;"Tunisie";"TN";"NULL";"Initialisation de la valeur «TN» pour la liste «71».";2009-04-08 12:11:26;1;1
2810;1074;1;"Turkménistan";"TM";"NULL";"Initialisation de la valeur «TM» pour la liste «71».";2009-04-08 12:11:27;1;1
2811;1074;1;"Îles Turques-et-Caïques";"TC";"NULL";"Initialisation de la valeur «TC» pour la liste «71».";2009-04-08 12:11:28;1;1
2812;1074;1;"Turquie";"TR";"NULL";"Initialisation de la valeur «TR» pour la liste «71».";2009-04-08 12:11:29;1;1
2813;1074;1;"Tuvalu";"TV";"NULL";"Initialisation de la valeur «TV» pour la liste «71».";2009-04-08 12:11:30;1;1
2814;1074;1;"Ukraine";"UA";"NULL";"Initialisation de la valeur «UA» pour la liste «71».";2009-04-08 12:11:31;1;1
2815;1074;1;"Uruguay";"UY";"NULL";"Initialisation de la valeur «UY» pour la liste «71».";2009-04-08 12:11:32;1;1
2816;1074;1;"Vanuatu";"VU";"NULL";"Initialisation de la valeur «VU» pour la liste «71».";2009-04-08 12:11:33;1;1
2817;1074;1;"Venezuela";"VE";"NULL";"Initialisation de la valeur «VE» pour la liste «71».";2009-04-08 12:11:34;1;1
2818;1074;1;"Viêt Nam";"VN";"NULL";"Initialisation de la valeur «VN» pour la liste «71».";2009-04-08 12:11:35;1;1
2819;1074;1;"Wallis-et-Futuna";"WF";"NULL";"Initialisation de la valeur «WF» pour la liste «71».";2009-04-08 12:11:36;1;1
2820;1074;1;"Yémen";"YE";"NULL";"Initialisation de la valeur «YE» pour la liste «71».";2009-04-08 12:11:37;1;1
2821;1074;1;"Zambie";"ZM";"NULL";"Initialisation de la valeur «ZM» pour la liste «71».";2009-04-08 12:11:38;1;1
2822;1074;1;"Zimbabwe";"ZW";"NULL";"Initialisation de la valeur «ZW» pour la liste «71».";2009-04-08 12:11:39;1;1
2823;1075;1;"Courriel";"mailto";"Le point d'accès est une adresse électronique qui doit être référencée comme suit : mailto:jpm@tela-botanica.org";"Initialisation de la valeur «mailto» pour la liste «72».";2009-05-07 10:57:00;1;1
2824;1075;1;"Adresse HTTP";"http";"Le point d'accès est une URL HTTP qui doit être référencée comme suit : http://www.tela-botanica.org/tapirlink";"Initialisation de la valeur «http» pour la liste «72».";2009-05-07 10:57:00;1;1
2825;1075;1;"Adresse HTTP sécurisé";"https";"Le point d'accès est une URL HTTP sécurisé qui doit être référencée comme suit : https://www.tela-botanica.org/tapirlink";"Initialisation de la valeur «https» pour la liste «72».";2009-05-07 10:57:00;1;1
2826;1075;1;"Adresse FTP";"ftp";"Le point d'accès est un dossier FTP, exemple : ftp://ftp.tela-botanica.org/public";"Initialisation de la valeur «ftp» pour la liste «72».";2009-05-07 10:57:00;1;1
2827;1075;1;"Numéro de fax";"fax";"Le point d'accès est un numéro de FAX au format international, exemple : +334 67 52 41 22.";"Initialisation de la valeur «fax» pour la liste «72».";2009-05-07 10:57:00;1;1
2828;1075;1;"Numéro de téléphone";"phone";"Le point d'accès est un numéro de téléphone au format international, exemple : +334 67 52 41 22.";"Initialisation de la valeur «phone» pour la liste «72».";2009-05-07 10:57:00;1;1
2829;1076;1;"Protocole TAPIR";"TAPIR";"Protocole TAPIR du TDWG. Documentation : http://www.tdwg.org/activities/tapir/";"Initialisation de la valeur «tapir» pour la liste «73».";2009-05-07 10:57:00;1;1
2832;1077;1;"Professionnel";"PRO";"Courriel de type professionnel.";"Initialisation de la valeur «PRO» pour la liste «74».";2009-05-12 14:17:00;1;1
2833;1077;1;"Personnel";"PERSO";"Courriel de type personnel.";"Initialisation de la valeur «PERSO» pour la liste «74».";2009-05-12 14:17:00;1;1
2835;1078;1;"Andorra (general)";"AD.00";"NULL";"Initialisation de la valeur «AD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2836;1078;1;"Andorra";"AD.01";"NULL";"Initialisation de la valeur «AD.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2837;1078;1;"Parròquia de Canillo";"AD.02";"NULL";"Initialisation de la valeur «AD.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2838;1078;1;"Parròquia d'Encamp";"AD.03";"NULL";"Initialisation de la valeur «AD.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2839;1078;1;"Parròquia de la Massana";"AD.04";"NULL";"Initialisation de la valeur «AD.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2840;1078;1;"Parròquia d'Ordino";"AD.05";"NULL";"Initialisation de la valeur «AD.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2841;1078;1;"Parròquia de Sant Julià de Lòria";"AD.06";"NULL";"Initialisation de la valeur «AD.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2842;1078;1;"Parròquia d'Andorra la Vella";"AD.07";"NULL";"Initialisation de la valeur «AD.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2843;1078;1;"Parròquia d'Escaldes-Engordany";"AD.08";"NULL";"Initialisation de la valeur «AD.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2844;1078;1;"United Arab Emirates (general)";"AE.00";"NULL";"Initialisation de la valeur «AE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2845;1078;1;"Abū Z̧aby";"AE.01";"NULL";"Initialisation de la valeur «AE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2846;1078;1;"‘Ajmān";"AE.02";"NULL";"Initialisation de la valeur «AE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2847;1078;1;"Dubayy";"AE.03";"NULL";"Initialisation de la valeur «AE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2848;1078;1;"Al Fujayrah";"AE.04";"NULL";"Initialisation de la valeur «AE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2849;1078;1;"Raʼs al Khaymah";"AE.05";"NULL";"Initialisation de la valeur «AE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2850;1078;1;"Ash Shāriqah";"AE.06";"NULL";"Initialisation de la valeur «AE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2851;1078;1;"Umm al Qaywayn";"AE.07";"NULL";"Initialisation de la valeur «AE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2852;1078;1;"Afghanistan (general)";"AF.00";"NULL";"Initialisation de la valeur «AF.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2853;1078;1;"Badakhshan";"AF.01";"NULL";"Initialisation de la valeur «AF.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2854;1078;1;"Badghis Province";"AF.02";"NULL";"Initialisation de la valeur «AF.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2855;1078;1;"Baghlān";"AF.03";"NULL";"Initialisation de la valeur «AF.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2856;1078;1;"Bāmīān";"AF.05";"NULL";"Initialisation de la valeur «AF.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2857;1078;1;"Farah";"AF.06";"NULL";"Initialisation de la valeur «AF.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2858;1078;1;"Faryab Province";"AF.07";"NULL";"Initialisation de la valeur «AF.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2859;1078;1;"Ghaznī";"AF.08";"NULL";"Initialisation de la valeur «AF.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2860;1078;1;"Ghowr";"AF.09";"NULL";"Initialisation de la valeur «AF.09» pour la liste «75».";2009-07-29 00:00:00;1;1
2861;1078;1;"Helmand";"AF.10";"NULL";"Initialisation de la valeur «AF.10» pour la liste «75».";2009-07-29 00:00:00;1;1
2862;1078;1;"Herat Province";"AF.11";"NULL";"Initialisation de la valeur «AF.11» pour la liste «75».";2009-07-29 00:00:00;1;1
2863;1078;1;"Kabul";"AF.13";"NULL";"Initialisation de la valeur «AF.13» pour la liste «75».";2009-07-29 00:00:00;1;1
2864;1078;1;"Kāpīsā";"AF.14";"NULL";"Initialisation de la valeur «AF.14» pour la liste «75».";2009-07-29 00:00:00;1;1
2865;1078;1;"Konarha";"AF.15";"NULL";"Initialisation de la valeur «AF.15» pour la liste «75».";2009-07-29 00:00:00;1;1
2866;1078;1;"Laghman";"AF.16";"NULL";"Initialisation de la valeur «AF.16» pour la liste «75».";2009-07-29 00:00:00;1;1
2867;1078;1;"Lowgar";"AF.17";"NULL";"Initialisation de la valeur «AF.17» pour la liste «75».";2009-07-29 00:00:00;1;1
2868;1078;1;"Nangarhār";"AF.18";"NULL";"Initialisation de la valeur «AF.18» pour la liste «75».";2009-07-29 00:00:00;1;1
2869;1078;1;"Nīmrūz";"AF.19";"NULL";"Initialisation de la valeur «AF.19» pour la liste «75».";2009-07-29 00:00:00;1;1
2870;1078;1;"Orūzgān";"AF.20";"NULL";"Initialisation de la valeur «AF.20» pour la liste «75».";2009-07-29 00:00:00;1;1
2871;1078;1;"Paktika";"AF.21";"NULL";"Initialisation de la valeur «AF.21» pour la liste «75».";2009-07-29 00:00:00;1;1
2872;1078;1;"Parvān";"AF.22";"NULL";"Initialisation de la valeur «AF.22» pour la liste «75».";2009-07-29 00:00:00;1;1
2873;1078;1;"Kandahār";"AF.23";"NULL";"Initialisation de la valeur «AF.23» pour la liste «75».";2009-07-29 00:00:00;1;1
2874;1078;1;"Kunduz Province";"AF.24";"NULL";"Initialisation de la valeur «AF.24» pour la liste «75».";2009-07-29 00:00:00;1;1
2875;1078;1;"Takhār";"AF.26";"NULL";"Initialisation de la valeur «AF.26» pour la liste «75».";2009-07-29 00:00:00;1;1
2876;1078;1;"Vardak";"AF.27";"NULL";"Initialisation de la valeur «AF.27» pour la liste «75».";2009-07-29 00:00:00;1;1
2877;1078;1;"Zabul Province";"AF.28";"NULL";"Initialisation de la valeur «AF.28» pour la liste «75».";2009-07-29 00:00:00;1;1
2878;1078;1;"Paktīkā";"AF.29";"NULL";"Initialisation de la valeur «AF.29» pour la liste «75».";2009-07-29 00:00:00;1;1
2879;1078;1;"Balkh";"AF.30";"NULL";"Initialisation de la valeur «AF.30» pour la liste «75».";2009-07-29 00:00:00;1;1
2880;1078;1;"Jowzjān";"AF.31";"NULL";"Initialisation de la valeur «AF.31» pour la liste «75».";2009-07-29 00:00:00;1;1
2881;1078;1;"Samangān";"AF.32";"NULL";"Initialisation de la valeur «AF.32» pour la liste «75».";2009-07-29 00:00:00;1;1
2882;1078;1;"Sar-e Pol";"AF.33";"NULL";"Initialisation de la valeur «AF.33» pour la liste «75».";2009-07-29 00:00:00;1;1
2883;1078;1;"Konar";"AF.34";"NULL";"Initialisation de la valeur «AF.34» pour la liste «75».";2009-07-29 00:00:00;1;1
2884;1078;1;"Laghmān";"AF.35";"NULL";"Initialisation de la valeur «AF.35» pour la liste «75».";2009-07-29 00:00:00;1;1
2885;1078;1;"Paktia Province";"AF.36";"NULL";"Initialisation de la valeur «AF.36» pour la liste «75».";2009-07-29 00:00:00;1;1
2886;1078;1;"Khowst";"AF.37";"NULL";"Initialisation de la valeur «AF.37» pour la liste «75».";2009-07-29 00:00:00;1;1
2887;1078;1;"Nūrestān";"AF.38";"NULL";"Initialisation de la valeur «AF.38» pour la liste «75».";2009-07-29 00:00:00;1;1
2888;1078;1;"Orūzgān Province";"AF.39";"NULL";"Initialisation de la valeur «AF.39» pour la liste «75».";2009-07-29 00:00:00;1;1
2889;1078;1;"Parvān";"AF.40";"NULL";"Initialisation de la valeur «AF.40» pour la liste «75».";2009-07-29 00:00:00;1;1
2890;1078;1;"Dāykondī";"AF.41";"NULL";"Initialisation de la valeur «AF.41» pour la liste «75».";2009-07-29 00:00:00;1;1
2891;1078;1;"Panjshīr";"AF.42";"NULL";"Initialisation de la valeur «AF.42» pour la liste «75».";2009-07-29 00:00:00;1;1
2892;1078;1;"Antigua and Barbuda (general)";"AG.00";"NULL";"Initialisation de la valeur «AG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2893;1078;1;"Barbuda";"AG.01";"NULL";"Initialisation de la valeur «AG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2894;1078;1;"Saint George";"AG.03";"NULL";"Initialisation de la valeur «AG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2895;1078;1;"Saint John";"AG.04";"NULL";"Initialisation de la valeur «AG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2896;1078;1;"Saint Mary";"AG.05";"NULL";"Initialisation de la valeur «AG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2897;1078;1;"Saint Paul";"AG.06";"NULL";"Initialisation de la valeur «AG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2898;1078;1;"Saint Peter";"AG.07";"NULL";"Initialisation de la valeur «AG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2899;1078;1;"Saint Philip";"AG.08";"NULL";"Initialisation de la valeur «AG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2900;1078;1;"Anguilla (general)";"AI.00";"NULL";"Initialisation de la valeur «AI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2901;1078;1;"Albania (general)";"AL.00";"NULL";"Initialisation de la valeur «AL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2902;1078;1;"Berat";"AL.40";"NULL";"Initialisation de la valeur «AL.40» pour la liste «75».";2009-07-29 00:00:00;1;1
2903;1078;1;"Dibër";"AL.41";"NULL";"Initialisation de la valeur «AL.41» pour la liste «75».";2009-07-29 00:00:00;1;1
2904;1078;1;"Durrës";"AL.42";"NULL";"Initialisation de la valeur «AL.42» pour la liste «75».";2009-07-29 00:00:00;1;1
2905;1078;1;"Elbasan";"AL.43";"NULL";"Initialisation de la valeur «AL.43» pour la liste «75».";2009-07-29 00:00:00;1;1
2906;1078;1;"Fier";"AL.44";"NULL";"Initialisation de la valeur «AL.44» pour la liste «75».";2009-07-29 00:00:00;1;1
2907;1078;1;"Gjirokastër";"AL.45";"NULL";"Initialisation de la valeur «AL.45» pour la liste «75».";2009-07-29 00:00:00;1;1
2908;1078;1;"Korçë";"AL.46";"NULL";"Initialisation de la valeur «AL.46» pour la liste «75».";2009-07-29 00:00:00;1;1
2909;1078;1;"Kukës";"AL.47";"NULL";"Initialisation de la valeur «AL.47» pour la liste «75».";2009-07-29 00:00:00;1;1
2910;1078;1;"Lezhë";"AL.48";"NULL";"Initialisation de la valeur «AL.48» pour la liste «75».";2009-07-29 00:00:00;1;1
2911;1078;1;"Shkodër";"AL.49";"NULL";"Initialisation de la valeur «AL.49» pour la liste «75».";2009-07-29 00:00:00;1;1
2912;1078;1;"Tiranë";"AL.50";"NULL";"Initialisation de la valeur «AL.50» pour la liste «75».";2009-07-29 00:00:00;1;1
2913;1078;1;"Vlorë";"AL.51";"NULL";"Initialisation de la valeur «AL.51» pour la liste «75».";2009-07-29 00:00:00;1;1
2914;1078;1;"Armenia (general)";"AM.00";"NULL";"Initialisation de la valeur «AM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2915;1078;1;"Aragatsotn";"AM.01";"NULL";"Initialisation de la valeur «AM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2916;1078;1;"Ararat";"AM.02";"NULL";"Initialisation de la valeur «AM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2917;1078;1;"Armavir";"AM.03";"NULL";"Initialisation de la valeur «AM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2918;1078;1;"Gegharkʼunikʼ";"AM.04";"NULL";"Initialisation de la valeur «AM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2919;1078;1;"Kotaykʼ";"AM.05";"NULL";"Initialisation de la valeur «AM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2920;1078;1;"Lorri";"AM.06";"NULL";"Initialisation de la valeur «AM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2921;1078;1;"Shirak";"AM.07";"NULL";"Initialisation de la valeur «AM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2922;1078;1;"Syunikʼ";"AM.08";"NULL";"Initialisation de la valeur «AM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2923;1078;1;"Tavush";"AM.09";"NULL";"Initialisation de la valeur «AM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
2924;1078;1;"Vayotsʼ Dzor";"AM.10";"NULL";"Initialisation de la valeur «AM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
2925;1078;1;"Yerevan";"AM.11";"NULL";"Initialisation de la valeur «AM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
2926;1078;1;"Netherlands Antilles (general)";"AN.00";"NULL";"Initialisation de la valeur «AN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2927;1078;1;"Angola (general)";"AO.00";"NULL";"Initialisation de la valeur «AO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2928;1078;1;"Benguela";"AO.01";"NULL";"Initialisation de la valeur «AO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2929;1078;1;"Bié";"AO.02";"NULL";"Initialisation de la valeur «AO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2930;1078;1;"Cabinda";"AO.03";"NULL";"Initialisation de la valeur «AO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2931;1078;1;"Cuando Cubango";"AO.04";"NULL";"Initialisation de la valeur «AO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2932;1078;1;"Cuanza Norte";"AO.05";"NULL";"Initialisation de la valeur «AO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2933;1078;1;"Cuanza Sul";"AO.06";"NULL";"Initialisation de la valeur «AO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2934;1078;1;"Cunene";"AO.07";"NULL";"Initialisation de la valeur «AO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2935;1078;1;"Huambo";"AO.08";"NULL";"Initialisation de la valeur «AO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2936;1078;1;"Huíla";"AO.09";"NULL";"Initialisation de la valeur «AO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
2937;1078;1;"Luanda";"AO.10";"NULL";"Initialisation de la valeur «AO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
2938;1078;1;"Malanje";"AO.12";"NULL";"Initialisation de la valeur «AO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
2939;1078;1;"Namibe";"AO.13";"NULL";"Initialisation de la valeur «AO.13» pour la liste «75».";2009-07-29 00:00:00;1;1
2940;1078;1;"Moxico";"AO.14";"NULL";"Initialisation de la valeur «AO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
2941;1078;1;"Uíge";"AO.15";"NULL";"Initialisation de la valeur «AO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
2942;1078;1;"Zaire";"AO.16";"NULL";"Initialisation de la valeur «AO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
2943;1078;1;"Lunda Norte";"AO.17";"NULL";"Initialisation de la valeur «AO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
2944;1078;1;"Lunda Sul";"AO.18";"NULL";"Initialisation de la valeur «AO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
2945;1078;1;"Bengo";"AO.19";"NULL";"Initialisation de la valeur «AO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
2946;1078;1;"Antarctica (general)";"AQ.00";"NULL";"Initialisation de la valeur «AQ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2947;1078;1;"Argentina (general)";"AR.00";"NULL";"Initialisation de la valeur «AR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2948;1078;1;"Buenos Aires";"AR.01";"NULL";"Initialisation de la valeur «AR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2949;1078;1;"Catamarca";"AR.02";"NULL";"Initialisation de la valeur «AR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2950;1078;1;"Chaco";"AR.03";"NULL";"Initialisation de la valeur «AR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2951;1078;1;"Chubut";"AR.04";"NULL";"Initialisation de la valeur «AR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2952;1078;1;"Córdoba";"AR.05";"NULL";"Initialisation de la valeur «AR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2953;1078;1;"Corrientes";"AR.06";"NULL";"Initialisation de la valeur «AR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2954;1078;1;"Distrito Federal";"AR.07";"NULL";"Initialisation de la valeur «AR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2955;1078;1;"Entre Ríos";"AR.08";"NULL";"Initialisation de la valeur «AR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2956;1078;1;"Formosa";"AR.09";"NULL";"Initialisation de la valeur «AR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
2957;1078;1;"Jujuy";"AR.10";"NULL";"Initialisation de la valeur «AR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
2958;1078;1;"La Pampa";"AR.11";"NULL";"Initialisation de la valeur «AR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
2959;1078;1;"La Rioja";"AR.12";"NULL";"Initialisation de la valeur «AR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
2960;1078;1;"Mendoza";"AR.13";"NULL";"Initialisation de la valeur «AR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
2961;1078;1;"Misiones";"AR.14";"NULL";"Initialisation de la valeur «AR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
2962;1078;1;"Neuquén";"AR.15";"NULL";"Initialisation de la valeur «AR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
2963;1078;1;"Río Negro";"AR.16";"NULL";"Initialisation de la valeur «AR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
2964;1078;1;"Salta";"AR.17";"NULL";"Initialisation de la valeur «AR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
2965;1078;1;"San Juan";"AR.18";"NULL";"Initialisation de la valeur «AR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
2966;1078;1;"San Luis";"AR.19";"NULL";"Initialisation de la valeur «AR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
2967;1078;1;"Santa Cruz";"AR.20";"NULL";"Initialisation de la valeur «AR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
2968;1078;1;"Santa Fe";"AR.21";"NULL";"Initialisation de la valeur «AR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
2969;1078;1;"Santiago del Estero";"AR.22";"NULL";"Initialisation de la valeur «AR.22» pour la liste «75».";2009-07-29 00:00:00;1;1
2970;1078;1;"Tierra del Fuego, Antártida e Islas del Atlántico Sur";"AR.23";"NULL";"Initialisation de la valeur «AR.23» pour la liste «75».";2009-07-29 00:00:00;1;1
2971;1078;1;"Tucumán";"AR.24";"NULL";"Initialisation de la valeur «AR.24» pour la liste «75».";2009-07-29 00:00:00;1;1
2972;1078;1;"Austria (general)";"AT.00";"NULL";"Initialisation de la valeur «AT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2973;1078;1;"Burgenland";"AT.01";"NULL";"Initialisation de la valeur «AT.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2974;1078;1;"Carinthia";"AT.02";"NULL";"Initialisation de la valeur «AT.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2975;1078;1;"Lower Austria";"AT.03";"NULL";"Initialisation de la valeur «AT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2976;1078;1;"Upper Austria";"AT.04";"NULL";"Initialisation de la valeur «AT.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2977;1078;1;"Salzburg";"AT.05";"NULL";"Initialisation de la valeur «AT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2978;1078;1;"Styria";"AT.06";"NULL";"Initialisation de la valeur «AT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2979;1078;1;"Tyrol";"AT.07";"NULL";"Initialisation de la valeur «AT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2980;1078;1;"Vorarlberg";"AT.08";"NULL";"Initialisation de la valeur «AT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2981;1078;1;"Vienna";"AT.09";"NULL";"Initialisation de la valeur «AT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
2982;1078;1;"Heard Island and McDonald Islands (general)";"AU.00";"NULL";"Initialisation de la valeur «AU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2983;1078;1;"Australian Capital Territory";"AU.01";"NULL";"Initialisation de la valeur «AU.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2984;1078;1;"New South Wales";"AU.02";"NULL";"Initialisation de la valeur «AU.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2985;1078;1;"Northern Territory";"AU.03";"NULL";"Initialisation de la valeur «AU.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2986;1078;1;"Queensland";"AU.04";"NULL";"Initialisation de la valeur «AU.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2987;1078;1;"South Australia";"AU.05";"NULL";"Initialisation de la valeur «AU.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2988;1078;1;"Tasmania";"AU.06";"NULL";"Initialisation de la valeur «AU.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2989;1078;1;"Victoria";"AU.07";"NULL";"Initialisation de la valeur «AU.07» pour la liste «75».";2009-07-29 00:00:00;1;1
2990;1078;1;"Western Australia";"AU.08";"NULL";"Initialisation de la valeur «AU.08» pour la liste «75».";2009-07-29 00:00:00;1;1
2991;1078;1;"Aruba (general)";"AW.00";"NULL";"Initialisation de la valeur «AW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2992;1078;1;"Azerbaijan (general)";"AZ.00";"NULL";"Initialisation de la valeur «AZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
2993;1078;1;"Abşeron";"AZ.01";"NULL";"Initialisation de la valeur «AZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
2994;1078;1;"Ağcabǝdi";"AZ.02";"NULL";"Initialisation de la valeur «AZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
2995;1078;1;"Ağdam";"AZ.03";"NULL";"Initialisation de la valeur «AZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
2996;1078;1;"Ağdaş";"AZ.04";"NULL";"Initialisation de la valeur «AZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
2997;1078;1;"Ağstafa";"AZ.05";"NULL";"Initialisation de la valeur «AZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
2998;1078;1;"Ağsu";"AZ.06";"NULL";"Initialisation de la valeur «AZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
2999;1078;1;"Əli Bayramli";"AZ.07";"NULL";"Initialisation de la valeur «AZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3000;1078;1;"Astara";"AZ.08";"NULL";"Initialisation de la valeur «AZ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3001;1078;1;"Baki";"AZ.09";"NULL";"Initialisation de la valeur «AZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3002;1078;1;"Balakǝn";"AZ.10";"NULL";"Initialisation de la valeur «AZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3003;1078;1;"Bǝrdǝ";"AZ.11";"NULL";"Initialisation de la valeur «AZ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3004;1078;1;"Beylǝqan";"AZ.12";"NULL";"Initialisation de la valeur «AZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3005;1078;1;"Bilǝsuvar";"AZ.13";"NULL";"Initialisation de la valeur «AZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3006;1078;1;"Cǝbrayıl";"AZ.14";"NULL";"Initialisation de la valeur «AZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3007;1078;1;"Cǝlilabad";"AZ.15";"NULL";"Initialisation de la valeur «AZ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3008;1078;1;"Daşkǝsǝn";"AZ.16";"NULL";"Initialisation de la valeur «AZ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3009;1078;1;"Dǝvǝçi";"AZ.17";"NULL";"Initialisation de la valeur «AZ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3010;1078;1;"Füzuli";"AZ.18";"NULL";"Initialisation de la valeur «AZ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3011;1078;1;"Gǝdǝbǝy";"AZ.19";"NULL";"Initialisation de la valeur «AZ.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3012;1078;1;"Gǝncǝ";"AZ.20";"NULL";"Initialisation de la valeur «AZ.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3013;1078;1;"Goranboy";"AZ.21";"NULL";"Initialisation de la valeur «AZ.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3014;1078;1;"Göyçay";"AZ.22";"NULL";"Initialisation de la valeur «AZ.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3015;1078;1;"Hacıqabul";"AZ.23";"NULL";"Initialisation de la valeur «AZ.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3016;1078;1;"İmişli";"AZ.24";"NULL";"Initialisation de la valeur «AZ.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3017;1078;1;"İsmayıllı";"AZ.25";"NULL";"Initialisation de la valeur «AZ.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3018;1078;1;"Kǝlbǝcǝr";"AZ.26";"NULL";"Initialisation de la valeur «AZ.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3019;1078;1;"Kürdǝmir";"AZ.27";"NULL";"Initialisation de la valeur «AZ.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3020;1078;1;"Laçın";"AZ.28";"NULL";"Initialisation de la valeur «AZ.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3021;1078;1;"Lǝnkǝran";"AZ.29";"NULL";"Initialisation de la valeur «AZ.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3022;1078;1;"Lǝnkǝran Şǝhǝri";"AZ.30";"NULL";"Initialisation de la valeur «AZ.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3023;1078;1;"Lerik";"AZ.31";"NULL";"Initialisation de la valeur «AZ.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3024;1078;1;"Masallı";"AZ.32";"NULL";"Initialisation de la valeur «AZ.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3025;1078;1;"Mingǝcevir";"AZ.33";"NULL";"Initialisation de la valeur «AZ.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3026;1078;1;"Naftalan";"AZ.34";"NULL";"Initialisation de la valeur «AZ.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3027;1078;1;"Nakhichevan";"AZ.35";"NULL";"Initialisation de la valeur «AZ.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3028;1078;1;"Neftçala";"AZ.36";"NULL";"Initialisation de la valeur «AZ.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3029;1078;1;"Oğuz";"AZ.37";"NULL";"Initialisation de la valeur «AZ.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3030;1078;1;"Qǝbǝlǝ";"AZ.38";"NULL";"Initialisation de la valeur «AZ.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3031;1078;1;"Qǝx";"AZ.39";"NULL";"Initialisation de la valeur «AZ.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3032;1078;1;"Qazax";"AZ.40";"NULL";"Initialisation de la valeur «AZ.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3033;1078;1;"Qobustan";"AZ.41";"NULL";"Initialisation de la valeur «AZ.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3034;1078;1;"Quba";"AZ.42";"NULL";"Initialisation de la valeur «AZ.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3035;1078;1;"Qubadlı";"AZ.43";"NULL";"Initialisation de la valeur «AZ.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3036;1078;1;"Qusar";"AZ.44";"NULL";"Initialisation de la valeur «AZ.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3037;1078;1;"Saatlı";"AZ.45";"NULL";"Initialisation de la valeur «AZ.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3038;1078;1;"Sabirabad";"AZ.46";"NULL";"Initialisation de la valeur «AZ.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3039;1078;1;"Şǝki";"AZ.47";"NULL";"Initialisation de la valeur «AZ.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3040;1078;1;"Şǝki";"AZ.48";"NULL";"Initialisation de la valeur «AZ.48» pour la liste «75».";2009-07-29 00:00:00;1;1
3041;1078;1;"Salyan";"AZ.49";"NULL";"Initialisation de la valeur «AZ.49» pour la liste «75».";2009-07-29 00:00:00;1;1
3042;1078;1;"Şamaxı";"AZ.50";"NULL";"Initialisation de la valeur «AZ.50» pour la liste «75».";2009-07-29 00:00:00;1;1
3043;1078;1;"Şǝmkir";"AZ.51";"NULL";"Initialisation de la valeur «AZ.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3044;1078;1;"Samux";"AZ.52";"NULL";"Initialisation de la valeur «AZ.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3045;1078;1;"Siyǝzǝn";"AZ.53";"NULL";"Initialisation de la valeur «AZ.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3046;1078;1;"Sumqayit";"AZ.54";"NULL";"Initialisation de la valeur «AZ.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3047;1078;1;"Şuşa";"AZ.55";"NULL";"Initialisation de la valeur «AZ.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3048;1078;1;"Şuşa Şəhəri";"AZ.56";"NULL";"Initialisation de la valeur «AZ.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3049;1078;1;"Tǝrtǝr";"AZ.57";"NULL";"Initialisation de la valeur «AZ.57» pour la liste «75».";2009-07-29 00:00:00;1;1
3050;1078;1;"Tovuz";"AZ.58";"NULL";"Initialisation de la valeur «AZ.58» pour la liste «75».";2009-07-29 00:00:00;1;1
3051;1078;1;"Ucar";"AZ.59";"NULL";"Initialisation de la valeur «AZ.59» pour la liste «75».";2009-07-29 00:00:00;1;1
3052;1078;1;"Xaçmaz";"AZ.60";"NULL";"Initialisation de la valeur «AZ.60» pour la liste «75».";2009-07-29 00:00:00;1;1
3053;1078;1;"Xankǝndi";"AZ.61";"NULL";"Initialisation de la valeur «AZ.61» pour la liste «75».";2009-07-29 00:00:00;1;1
3054;1078;1;"Xanlar";"AZ.62";"NULL";"Initialisation de la valeur «AZ.62» pour la liste «75».";2009-07-29 00:00:00;1;1
3055;1078;1;"Xızı";"AZ.63";"NULL";"Initialisation de la valeur «AZ.63» pour la liste «75».";2009-07-29 00:00:00;1;1
3056;1078;1;"Xocalı";"AZ.64";"NULL";"Initialisation de la valeur «AZ.64» pour la liste «75».";2009-07-29 00:00:00;1;1
3057;1078;1;"Xocavǝnd";"AZ.65";"NULL";"Initialisation de la valeur «AZ.65» pour la liste «75».";2009-07-29 00:00:00;1;1
3058;1078;1;"Yardımlı";"AZ.66";"NULL";"Initialisation de la valeur «AZ.66» pour la liste «75».";2009-07-29 00:00:00;1;1
3059;1078;1;"Yevlax";"AZ.67";"NULL";"Initialisation de la valeur «AZ.67» pour la liste «75».";2009-07-29 00:00:00;1;1
3060;1078;1;"Yevlax";"AZ.68";"NULL";"Initialisation de la valeur «AZ.68» pour la liste «75».";2009-07-29 00:00:00;1;1
3061;1078;1;"Zǝngilan";"AZ.69";"NULL";"Initialisation de la valeur «AZ.69» pour la liste «75».";2009-07-29 00:00:00;1;1
3062;1078;1;"Zaqatala";"AZ.70";"NULL";"Initialisation de la valeur «AZ.70» pour la liste «75».";2009-07-29 00:00:00;1;1
3063;1078;1;"Zǝrdab";"AZ.71";"NULL";"Initialisation de la valeur «AZ.71» pour la liste «75».";2009-07-29 00:00:00;1;1
3064;1078;1;"Bosnia and Herzegovina (general)";"BA.00";"NULL";"Initialisation de la valeur «BA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3065;1078;1;"Federation of Bosnia and Herzegovina";"BA.01";"NULL";"Initialisation de la valeur «BA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3066;1078;1;"Republika Srpska";"BA.02";"NULL";"Initialisation de la valeur «BA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3067;1078;1;"Brčko Distrikt";"BA.BD";"NULL";"Initialisation de la valeur «BA.BD» pour la liste «75».";2009-07-29 00:00:00;1;1
3068;1078;1;"Barbados (general)";"BB.00";"NULL";"Initialisation de la valeur «BB.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3069;1078;1;"Christ Church";"BB.01";"NULL";"Initialisation de la valeur «BB.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3070;1078;1;"Saint Andrew";"BB.02";"NULL";"Initialisation de la valeur «BB.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3071;1078;1;"Saint George";"BB.03";"NULL";"Initialisation de la valeur «BB.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3072;1078;1;"Saint James";"BB.04";"NULL";"Initialisation de la valeur «BB.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3073;1078;1;"Saint John";"BB.05";"NULL";"Initialisation de la valeur «BB.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3074;1078;1;"Saint Joseph";"BB.06";"NULL";"Initialisation de la valeur «BB.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3075;1078;1;"Saint Lucy";"BB.07";"NULL";"Initialisation de la valeur «BB.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3076;1078;1;"Saint Michael";"BB.08";"NULL";"Initialisation de la valeur «BB.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3077;1078;1;"Saint Peter";"BB.09";"NULL";"Initialisation de la valeur «BB.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3078;1078;1;"Saint Philip";"BB.10";"NULL";"Initialisation de la valeur «BB.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3079;1078;1;"Saint Thomas";"BB.11";"NULL";"Initialisation de la valeur «BB.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3080;1078;1;"Bangladesh (general)";"BD.00";"NULL";"Initialisation de la valeur «BD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3081;1078;1;"BG80";"BD.80";"NULL";"Initialisation de la valeur «BD.80» pour la liste «75».";2009-07-29 00:00:00;1;1
3082;1078;1;"Dhaka";"BD.81";"NULL";"Initialisation de la valeur «BD.81» pour la liste «75».";2009-07-29 00:00:00;1;1
3083;1078;1;"Khulna";"BD.82";"NULL";"Initialisation de la valeur «BD.82» pour la liste «75».";2009-07-29 00:00:00;1;1
3084;1078;1;"Rājshāhi";"BD.83";"NULL";"Initialisation de la valeur «BD.83» pour la liste «75».";2009-07-29 00:00:00;1;1
3085;1078;1;"Chittagong";"BD.84";"NULL";"Initialisation de la valeur «BD.84» pour la liste «75».";2009-07-29 00:00:00;1;1
3086;1078;1;"Barisāl";"BD.85";"NULL";"Initialisation de la valeur «BD.85» pour la liste «75».";2009-07-29 00:00:00;1;1
3087;1078;1;"Sylhet";"BD.86";"NULL";"Initialisation de la valeur «BD.86» pour la liste «75».";2009-07-29 00:00:00;1;1
3088;1078;1;"Belgium (general)";"BE.00";"NULL";"Initialisation de la valeur «BE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3089;1078;1;"Région de Bruxelles-Capitale";"BE.BRU";"NULL";"Initialisation de la valeur «BE.BRU» pour la liste «75».";2009-07-29 00:00:00;1;1
3090;1078;1;"Flanders";"BE.VLG";"NULL";"Initialisation de la valeur «BE.VLG» pour la liste «75».";2009-07-29 00:00:00;1;1
3091;1078;1;"Wallonia";"BE.WAL";"NULL";"Initialisation de la valeur «BE.WAL» pour la liste «75».";2009-07-29 00:00:00;1;1
3092;1078;1;"Burkina Faso (general)";"BF.00";"NULL";"Initialisation de la valeur «BF.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3093;1078;1;"Boucle du Mouhoun";"BF.01";"NULL";"Initialisation de la valeur «BF.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3094;1078;1;"Cascades";"BF.02";"NULL";"Initialisation de la valeur «BF.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3095;1078;1;"Centre";"BF.03";"NULL";"Initialisation de la valeur «BF.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3096;1078;1;"Centre-Est";"BF.04";"NULL";"Initialisation de la valeur «BF.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3097;1078;1;"Centre-Nord";"BF.05";"NULL";"Initialisation de la valeur «BF.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3098;1078;1;"Centre-Ouest";"BF.06";"NULL";"Initialisation de la valeur «BF.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3099;1078;1;"Centre-Sud";"BF.07";"NULL";"Initialisation de la valeur «BF.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3100;1078;1;"Est";"BF.08";"NULL";"Initialisation de la valeur «BF.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3101;1078;1;"Hauts-Bassins";"BF.09";"NULL";"Initialisation de la valeur «BF.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3102;1078;1;"Nord";"BF.10";"NULL";"Initialisation de la valeur «BF.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3103;1078;1;"Plateau-Central";"BF.11";"NULL";"Initialisation de la valeur «BF.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3104;1078;1;"Sahel";"BF.12";"NULL";"Initialisation de la valeur «BF.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3105;1078;1;"Sud-Ouest";"BF.13";"NULL";"Initialisation de la valeur «BF.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3106;1078;1;"Bam";"BF.15";"NULL";"Initialisation de la valeur «BF.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3107;1078;1;"Boulkiemdé";"BF.19";"NULL";"Initialisation de la valeur «BF.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3108;1078;1;"Ganzourgou";"BF.20";"NULL";"Initialisation de la valeur «BF.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3109;1078;1;"Gnagna";"BF.21";"NULL";"Initialisation de la valeur «BF.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3110;1078;1;"Kouritenga";"BF.28";"NULL";"Initialisation de la valeur «BF.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3111;1078;1;"Oudalan";"BF.33";"NULL";"Initialisation de la valeur «BF.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3112;1078;1;"Passore";"BF.34";"NULL";"Initialisation de la valeur «BF.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3113;1078;1;"Sanguié";"BF.36";"NULL";"Initialisation de la valeur «BF.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3114;1078;1;"(UV37)";"BF.37";"NULL";"Initialisation de la valeur «BF.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3115;1078;1;"(UV38)";"BF.38";"NULL";"Initialisation de la valeur «BF.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3116;1078;1;"(UV39)";"BF.39";"NULL";"Initialisation de la valeur «BF.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3117;1078;1;"Soum";"BF.40";"NULL";"Initialisation de la valeur «BF.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3118;1078;1;"(UV41)";"BF.41";"NULL";"Initialisation de la valeur «BF.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3119;1078;1;"Tapoa";"BF.42";"NULL";"Initialisation de la valeur «BF.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3120;1078;1;"(UV43)";"BF.43";"NULL";"Initialisation de la valeur «BF.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3121;1078;1;"Zoundwéogo";"BF.44";"NULL";"Initialisation de la valeur «BF.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3122;1078;1;"Banwa";"BF.46";"NULL";"Initialisation de la valeur «BF.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3123;1078;1;"Bazèga";"BF.47";"NULL";"Initialisation de la valeur «BF.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3124;1078;1;"Bougouriba";"BF.48";"NULL";"Initialisation de la valeur «BF.48» pour la liste «75».";2009-07-29 00:00:00;1;1
3125;1078;1;"Boulgou";"BF.49";"NULL";"Initialisation de la valeur «BF.49» pour la liste «75».";2009-07-29 00:00:00;1;1
3126;1078;1;"Gourma";"BF.50";"NULL";"Initialisation de la valeur «BF.50» pour la liste «75».";2009-07-29 00:00:00;1;1
3127;1078;1;"Houet";"BF.51";"NULL";"Initialisation de la valeur «BF.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3128;1078;1;"Ioba";"BF.52";"NULL";"Initialisation de la valeur «BF.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3129;1078;1;"Kadiogo";"BF.53";"NULL";"Initialisation de la valeur «BF.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3130;1078;1;"Kènèdougou";"BF.54";"NULL";"Initialisation de la valeur «BF.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3131;1078;1;"Comoé";"BF.55";"NULL";"Initialisation de la valeur «BF.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3132;1078;1;"Komondjari";"BF.56";"NULL";"Initialisation de la valeur «BF.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3133;1078;1;"Kompienga";"BF.57";"NULL";"Initialisation de la valeur «BF.57» pour la liste «75».";2009-07-29 00:00:00;1;1
3134;1078;1;"Kossi";"BF.58";"NULL";"Initialisation de la valeur «BF.58» pour la liste «75».";2009-07-29 00:00:00;1;1
3135;1078;1;"Koulpélogo";"BF.59";"NULL";"Initialisation de la valeur «BF.59» pour la liste «75».";2009-07-29 00:00:00;1;1
3136;1078;1;"Kourwéogo";"BF.60";"NULL";"Initialisation de la valeur «BF.60» pour la liste «75».";2009-07-29 00:00:00;1;1
3137;1078;1;"Léraba";"BF.61";"NULL";"Initialisation de la valeur «BF.61» pour la liste «75».";2009-07-29 00:00:00;1;1
3138;1078;1;"Loroum";"BF.62";"NULL";"Initialisation de la valeur «BF.62» pour la liste «75».";2009-07-29 00:00:00;1;1
3139;1078;1;"Mouhoun";"BF.63";"NULL";"Initialisation de la valeur «BF.63» pour la liste «75».";2009-07-29 00:00:00;1;1
3140;1078;1;"Namentenga";"BF.64";"NULL";"Initialisation de la valeur «BF.64» pour la liste «75».";2009-07-29 00:00:00;1;1
3141;1078;1;"Nahouri";"BF.65";"NULL";"Initialisation de la valeur «BF.65» pour la liste «75».";2009-07-29 00:00:00;1;1
3142;1078;1;"Nayala";"BF.66";"NULL";"Initialisation de la valeur «BF.66» pour la liste «75».";2009-07-29 00:00:00;1;1
3143;1078;1;"Noumbiel";"BF.67";"NULL";"Initialisation de la valeur «BF.67» pour la liste «75».";2009-07-29 00:00:00;1;1
3144;1078;1;"Oubritenga";"BF.68";"NULL";"Initialisation de la valeur «BF.68» pour la liste «75».";2009-07-29 00:00:00;1;1
3145;1078;1;"Poni";"BF.69";"NULL";"Initialisation de la valeur «BF.69» pour la liste «75».";2009-07-29 00:00:00;1;1
3146;1078;1;"Sanmatenga";"BF.70";"NULL";"Initialisation de la valeur «BF.70» pour la liste «75».";2009-07-29 00:00:00;1;1
3147;1078;1;"Séno";"BF.71";"NULL";"Initialisation de la valeur «BF.71» pour la liste «75».";2009-07-29 00:00:00;1;1
3148;1078;1;"Sissili";"BF.72";"NULL";"Initialisation de la valeur «BF.72» pour la liste «75».";2009-07-29 00:00:00;1;1
3149;1078;1;"Sourou";"BF.73";"NULL";"Initialisation de la valeur «BF.73» pour la liste «75».";2009-07-29 00:00:00;1;1
3150;1078;1;"Tuy";"BF.74";"NULL";"Initialisation de la valeur «BF.74» pour la liste «75».";2009-07-29 00:00:00;1;1
3151;1078;1;"Yagha";"BF.75";"NULL";"Initialisation de la valeur «BF.75» pour la liste «75».";2009-07-29 00:00:00;1;1
3152;1078;1;"Yatenga";"BF.76";"NULL";"Initialisation de la valeur «BF.76» pour la liste «75».";2009-07-29 00:00:00;1;1
3153;1078;1;"Ziro";"BF.77";"NULL";"Initialisation de la valeur «BF.77» pour la liste «75».";2009-07-29 00:00:00;1;1
3154;1078;1;"Zondoma";"BF.78";"NULL";"Initialisation de la valeur «BF.78» pour la liste «75».";2009-07-29 00:00:00;1;1
3155;1078;1;"Bulgaria (general)";"BG.00";"NULL";"Initialisation de la valeur «BG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3156;1078;1;"Burgas";"BG.29";"NULL";"Initialisation de la valeur «BG.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3157;1078;1;"Grad";"BG.30";"NULL";"Initialisation de la valeur «BG.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3158;1078;1;"Khaskovo";"BG.31";"NULL";"Initialisation de la valeur «BG.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3159;1078;1;"Lovech";"BG.32";"NULL";"Initialisation de la valeur «BG.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3160;1078;1;"Mikhaylovgrad";"BG.33";"NULL";"Initialisation de la valeur «BG.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3161;1078;1;"Plovdiv";"BG.34";"NULL";"Initialisation de la valeur «BG.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3162;1078;1;"Razgrad";"BG.35";"NULL";"Initialisation de la valeur «BG.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3163;1078;1;"Sofiya";"BG.36";"NULL";"Initialisation de la valeur «BG.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3164;1078;1;"Varna";"BG.37";"NULL";"Initialisation de la valeur «BG.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3165;1078;1;"Blagoevgrad";"BG.38";"NULL";"Initialisation de la valeur «BG.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3166;1078;1;"Burgas";"BG.39";"NULL";"Initialisation de la valeur «BG.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3167;1078;1;"Dobrich";"BG.40";"NULL";"Initialisation de la valeur «BG.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3168;1078;1;"Gabrovo";"BG.41";"NULL";"Initialisation de la valeur «BG.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3169;1078;1;"Oblast Sofiya-Grad";"BG.42";"NULL";"Initialisation de la valeur «BG.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3170;1078;1;"Khaskovo";"BG.43";"NULL";"Initialisation de la valeur «BG.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3171;1078;1;"Kŭrdzhali";"BG.44";"NULL";"Initialisation de la valeur «BG.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3172;1078;1;"Kyustendil";"BG.45";"NULL";"Initialisation de la valeur «BG.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3173;1078;1;"Lovech";"BG.46";"NULL";"Initialisation de la valeur «BG.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3174;1078;1;"Montana";"BG.47";"NULL";"Initialisation de la valeur «BG.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3175;1078;1;"Pazardzhit";"BG.48";"NULL";"Initialisation de la valeur «BG.48» pour la liste «75».";2009-07-29 00:00:00;1;1
3176;1078;1;"Pernik";"BG.49";"NULL";"Initialisation de la valeur «BG.49» pour la liste «75».";2009-07-29 00:00:00;1;1
3177;1078;1;"Pleven";"BG.50";"NULL";"Initialisation de la valeur «BG.50» pour la liste «75».";2009-07-29 00:00:00;1;1
3178;1078;1;"Plovdiv";"BG.51";"NULL";"Initialisation de la valeur «BG.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3179;1078;1;"Razgrad";"BG.52";"NULL";"Initialisation de la valeur «BG.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3180;1078;1;"Ruse";"BG.53";"NULL";"Initialisation de la valeur «BG.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3181;1078;1;"Shumen";"BG.54";"NULL";"Initialisation de la valeur «BG.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3182;1078;1;"Silistra";"BG.55";"NULL";"Initialisation de la valeur «BG.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3183;1078;1;"Sliven";"BG.56";"NULL";"Initialisation de la valeur «BG.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3184;1078;1;"Smolyan";"BG.57";"NULL";"Initialisation de la valeur «BG.57» pour la liste «75».";2009-07-29 00:00:00;1;1
3185;1078;1;"Sofiya";"BG.58";"NULL";"Initialisation de la valeur «BG.58» pour la liste «75».";2009-07-29 00:00:00;1;1
3186;1078;1;"Stara Zagora";"BG.59";"NULL";"Initialisation de la valeur «BG.59» pour la liste «75».";2009-07-29 00:00:00;1;1
3187;1078;1;"Tŭrgovishte";"BG.60";"NULL";"Initialisation de la valeur «BG.60» pour la liste «75».";2009-07-29 00:00:00;1;1
3188;1078;1;"Varna";"BG.61";"NULL";"Initialisation de la valeur «BG.61» pour la liste «75».";2009-07-29 00:00:00;1;1
3189;1078;1;"Veliko Tŭrnovo";"BG.62";"NULL";"Initialisation de la valeur «BG.62» pour la liste «75».";2009-07-29 00:00:00;1;1
3190;1078;1;"Vidin";"BG.63";"NULL";"Initialisation de la valeur «BG.63» pour la liste «75».";2009-07-29 00:00:00;1;1
3191;1078;1;"Vratsa";"BG.64";"NULL";"Initialisation de la valeur «BG.64» pour la liste «75».";2009-07-29 00:00:00;1;1
3192;1078;1;"Yambol";"BG.65";"NULL";"Initialisation de la valeur «BG.65» pour la liste «75».";2009-07-29 00:00:00;1;1
3193;1078;1;"Bahrain (general)";"BH.00";"NULL";"Initialisation de la valeur «BH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3194;1078;1;"Hedd";"BH.01";"NULL";"Initialisation de la valeur «BH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3195;1078;1;"Manama";"BH.02";"NULL";"Initialisation de la valeur «BH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3196;1078;1;"Muharraq";"BH.03";"NULL";"Initialisation de la valeur «BH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3197;1078;1;"Jidd Haffs";"BH.05";"NULL";"Initialisation de la valeur «BH.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3198;1078;1;"Sitra";"BH.06";"NULL";"Initialisation de la valeur «BH.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3199;1078;1;"(BA07)";"BH.07";"NULL";"Initialisation de la valeur «BH.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3200;1078;1;"Western Region";"BH.08";"NULL";"Initialisation de la valeur «BH.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3201;1078;1;"Hawar Islands";"BH.09";"NULL";"Initialisation de la valeur «BH.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3202;1078;1;"Northern Region";"BH.10";"NULL";"Initialisation de la valeur «BH.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3203;1078;1;"Central Region";"BH.11";"NULL";"Initialisation de la valeur «BH.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3204;1078;1;"Isa Town";"BH.12";"NULL";"Initialisation de la valeur «BH.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3205;1078;1;"Ar Rifa’ and Southern Region";"BH.13";"NULL";"Initialisation de la valeur «BH.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3206;1078;1;"Hamad town";"BH.14";"NULL";"Initialisation de la valeur «BH.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3207;1078;1;"Burundi (general)";"BI.00";"NULL";"Initialisation de la valeur «BI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3208;1078;1;"Bujumbura";"BI.02";"NULL";"Initialisation de la valeur «BI.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3209;1078;1;"(BY05)";"BI.05";"NULL";"Initialisation de la valeur «BI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3210;1078;1;"Bubanza";"BI.09";"NULL";"Initialisation de la valeur «BI.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3211;1078;1;"Bururi";"BI.10";"NULL";"Initialisation de la valeur «BI.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3212;1078;1;"Cankuzo";"BI.11";"NULL";"Initialisation de la valeur «BI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3213;1078;1;"Cibitoke";"BI.12";"NULL";"Initialisation de la valeur «BI.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3214;1078;1;"Gitega";"BI.13";"NULL";"Initialisation de la valeur «BI.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3215;1078;1;"Karuzi";"BI.14";"NULL";"Initialisation de la valeur «BI.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3216;1078;1;"Kayanza";"BI.15";"NULL";"Initialisation de la valeur «BI.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3217;1078;1;"Kirundo";"BI.16";"NULL";"Initialisation de la valeur «BI.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3218;1078;1;"Makamba";"BI.17";"NULL";"Initialisation de la valeur «BI.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3219;1078;1;"Muyinga";"BI.18";"NULL";"Initialisation de la valeur «BI.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3220;1078;1;"Ngozi";"BI.19";"NULL";"Initialisation de la valeur «BI.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3221;1078;1;"Rutana";"BI.20";"NULL";"Initialisation de la valeur «BI.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3222;1078;1;"Ruyigi";"BI.21";"NULL";"Initialisation de la valeur «BI.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3223;1078;1;"Muramvya";"BI.22";"NULL";"Initialisation de la valeur «BI.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3224;1078;1;"Mwaro";"BI.23";"NULL";"Initialisation de la valeur «BI.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3225;1078;1;"Benin (general)";"BJ.00";"NULL";"Initialisation de la valeur «BJ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3226;1078;1;"Atakora";"BJ.01";"NULL";"Initialisation de la valeur «BJ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3227;1078;1;"Atlantique";"BJ.02";"NULL";"Initialisation de la valeur «BJ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3228;1078;1;"Borgou";"BJ.03";"NULL";"Initialisation de la valeur «BJ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3229;1078;1;"Mono";"BJ.04";"NULL";"Initialisation de la valeur «BJ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3230;1078;1;"Oueme";"BJ.05";"NULL";"Initialisation de la valeur «BJ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3231;1078;1;"Zou";"BJ.06";"NULL";"Initialisation de la valeur «BJ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3232;1078;1;"Alibori";"BJ.07";"NULL";"Initialisation de la valeur «BJ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3233;1078;1;"Atakora";"BJ.08";"NULL";"Initialisation de la valeur «BJ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3234;1078;1;"Atlantique";"BJ.09";"NULL";"Initialisation de la valeur «BJ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3235;1078;1;"Borgou";"BJ.10";"NULL";"Initialisation de la valeur «BJ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3236;1078;1;"Collines";"BJ.11";"NULL";"Initialisation de la valeur «BJ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3237;1078;1;"Kouffo";"BJ.12";"NULL";"Initialisation de la valeur «BJ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3238;1078;1;"Donga";"BJ.13";"NULL";"Initialisation de la valeur «BJ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3239;1078;1;"Littoral";"BJ.14";"NULL";"Initialisation de la valeur «BJ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3240;1078;1;"Mono";"BJ.15";"NULL";"Initialisation de la valeur «BJ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3241;1078;1;"Quémé";"BJ.16";"NULL";"Initialisation de la valeur «BJ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3242;1078;1;"Plateau";"BJ.17";"NULL";"Initialisation de la valeur «BJ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3243;1078;1;"Zou";"BJ.18";"NULL";"Initialisation de la valeur «BJ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3244;1078;1;"Bermuda (general)";"BM.00";"NULL";"Initialisation de la valeur «BM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3245;1078;1;"Devonshire";"BM.01";"NULL";"Initialisation de la valeur «BM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3246;1078;1;"Hamilton Parish";"BM.02";"NULL";"Initialisation de la valeur «BM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3247;1078;1;"Hamilton city";"BM.03";"NULL";"Initialisation de la valeur «BM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3248;1078;1;"Paget";"BM.04";"NULL";"Initialisation de la valeur «BM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3249;1078;1;"Pembroke";"BM.05";"NULL";"Initialisation de la valeur «BM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3250;1078;1;"Saint George";"BM.06";"NULL";"Initialisation de la valeur «BM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3251;1078;1;"Saint Georgeʼs";"BM.07";"NULL";"Initialisation de la valeur «BM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3252;1078;1;"Sandys";"BM.08";"NULL";"Initialisation de la valeur «BM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3253;1078;1;"Smithʼs";"BM.09";"NULL";"Initialisation de la valeur «BM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3254;1078;1;"Southampton";"BM.10";"NULL";"Initialisation de la valeur «BM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3255;1078;1;"Warwick";"BM.11";"NULL";"Initialisation de la valeur «BM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3256;1078;1;"Brunei (general)";"BN.00";"NULL";"Initialisation de la valeur «BN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3257;1078;1;"Belait";"BN.01";"NULL";"Initialisation de la valeur «BN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3258;1078;1;"Brunei and Muara";"BN.02";"NULL";"Initialisation de la valeur «BN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3259;1078;1;"Temburong";"BN.03";"NULL";"Initialisation de la valeur «BN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3260;1078;1;"Tutong";"BN.04";"NULL";"Initialisation de la valeur «BN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3261;1078;1;"Bolivia (general)";"BO.00";"NULL";"Initialisation de la valeur «BO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3262;1078;1;"Chuquisaca";"BO.01";"NULL";"Initialisation de la valeur «BO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3263;1078;1;"Cochabamba";"BO.02";"NULL";"Initialisation de la valeur «BO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3264;1078;1;"El Beni";"BO.03";"NULL";"Initialisation de la valeur «BO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3265;1078;1;"La Paz";"BO.04";"NULL";"Initialisation de la valeur «BO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3266;1078;1;"Oruro";"BO.05";"NULL";"Initialisation de la valeur «BO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3267;1078;1;"Pando";"BO.06";"NULL";"Initialisation de la valeur «BO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3268;1078;1;"Potosí";"BO.07";"NULL";"Initialisation de la valeur «BO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3269;1078;1;"Santa Cruz";"BO.08";"NULL";"Initialisation de la valeur «BO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3270;1078;1;"Tarija";"BO.09";"NULL";"Initialisation de la valeur «BO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3271;1078;1;"Brazil (general)";"BR.00";"NULL";"Initialisation de la valeur «BR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3272;1078;1;"Acre";"BR.01";"NULL";"Initialisation de la valeur «BR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3273;1078;1;"Alagoas";"BR.02";"NULL";"Initialisation de la valeur «BR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3274;1078;1;"Amapá";"BR.03";"NULL";"Initialisation de la valeur «BR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3275;1078;1;"Estado do Amazonas";"BR.04";"NULL";"Initialisation de la valeur «BR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3276;1078;1;"Bahia";"BR.05";"NULL";"Initialisation de la valeur «BR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3277;1078;1;"Ceará";"BR.06";"NULL";"Initialisation de la valeur «BR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3278;1078;1;"Distrito Federal";"BR.07";"NULL";"Initialisation de la valeur «BR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3279;1078;1;"Espírito Santo";"BR.08";"NULL";"Initialisation de la valeur «BR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3280;1078;1;"Fernando de Noronha";"BR.09";"NULL";"Initialisation de la valeur «BR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3281;1078;1;"Goias";"BR.10";"NULL";"Initialisation de la valeur «BR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3282;1078;1;"Mato Grosso do Sul";"BR.11";"NULL";"Initialisation de la valeur «BR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3283;1078;1;"Maranhão";"BR.13";"NULL";"Initialisation de la valeur «BR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3284;1078;1;"Mato Grosso";"BR.14";"NULL";"Initialisation de la valeur «BR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3285;1078;1;"Minas Gerais";"BR.15";"NULL";"Initialisation de la valeur «BR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3286;1078;1;"Pará";"BR.16";"NULL";"Initialisation de la valeur «BR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3287;1078;1;"Paraíba";"BR.17";"NULL";"Initialisation de la valeur «BR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3288;1078;1;"Paraná";"BR.18";"NULL";"Initialisation de la valeur «BR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3289;1078;1;"Pernambuco";"BR.19";"NULL";"Initialisation de la valeur «BR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3290;1078;1;"Piauí";"BR.20";"NULL";"Initialisation de la valeur «BR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3291;1078;1;"Rio de Janeiro";"BR.21";"NULL";"Initialisation de la valeur «BR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3292;1078;1;"Rio Grande do Norte";"BR.22";"NULL";"Initialisation de la valeur «BR.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3293;1078;1;"Rio Grande do Sul";"BR.23";"NULL";"Initialisation de la valeur «BR.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3294;1078;1;"Rondônia";"BR.24";"NULL";"Initialisation de la valeur «BR.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3295;1078;1;"Roraima";"BR.25";"NULL";"Initialisation de la valeur «BR.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3296;1078;1;"Santa Catarina";"BR.26";"NULL";"Initialisation de la valeur «BR.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3297;1078;1;"São Paulo";"BR.27";"NULL";"Initialisation de la valeur «BR.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3298;1078;1;"Sergipe";"BR.28";"NULL";"Initialisation de la valeur «BR.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3299;1078;1;"Estado de Goiás";"BR.29";"NULL";"Initialisation de la valeur «BR.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3300;1078;1;"Pernambuco";"BR.30";"NULL";"Initialisation de la valeur «BR.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3301;1078;1;"Tocantins";"BR.31";"NULL";"Initialisation de la valeur «BR.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3302;1078;1;"Bahamas, The (general)";"BS.00";"NULL";"Initialisation de la valeur «BS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3303;1078;1;"Bimini";"BS.05";"NULL";"Initialisation de la valeur «BS.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3304;1078;1;"Cat Island";"BS.06";"NULL";"Initialisation de la valeur «BS.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3305;1078;1;"Exuma";"BS.10";"NULL";"Initialisation de la valeur «BS.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3306;1078;1;"Inagua";"BS.13";"NULL";"Initialisation de la valeur «BS.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3307;1078;1;"Long Island";"BS.15";"NULL";"Initialisation de la valeur «BS.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3308;1078;1;"Mayaguana";"BS.16";"NULL";"Initialisation de la valeur «BS.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3309;1078;1;"Ragged Island";"BS.18";"NULL";"Initialisation de la valeur «BS.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3310;1078;1;"Harbour Island";"BS.22";"NULL";"Initialisation de la valeur «BS.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3311;1078;1;"New Providence";"BS.23";"NULL";"Initialisation de la valeur «BS.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3312;1078;1;"Acklins and Crooked Islands";"BS.24";"NULL";"Initialisation de la valeur «BS.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3313;1078;1;"Freeport";"BS.25";"NULL";"Initialisation de la valeur «BS.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3314;1078;1;"Fresh Creek";"BS.26";"NULL";"Initialisation de la valeur «BS.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3315;1078;1;"Governorʼs Harbour";"BS.27";"NULL";"Initialisation de la valeur «BS.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3316;1078;1;"Green Turtle Cay";"BS.28";"NULL";"Initialisation de la valeur «BS.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3317;1078;1;"High Rock";"BS.29";"NULL";"Initialisation de la valeur «BS.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3318;1078;1;"Kemps Bay";"BS.30";"NULL";"Initialisation de la valeur «BS.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3319;1078;1;"Marsh Harbour";"BS.31";"NULL";"Initialisation de la valeur «BS.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3320;1078;1;"Nichollstown and Berry Islands";"BS.32";"NULL";"Initialisation de la valeur «BS.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3321;1078;1;"Rock Sound";"BS.33";"NULL";"Initialisation de la valeur «BS.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3322;1078;1;"Sandy Point";"BS.34";"NULL";"Initialisation de la valeur «BS.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3323;1078;1;"San Salvador and Rum Cay";"BS.35";"NULL";"Initialisation de la valeur «BS.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3324;1078;1;"Bhutan (general)";"BT.00";"NULL";"Initialisation de la valeur «BT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3325;1078;1;"Bumthang";"BT.05";"NULL";"Initialisation de la valeur «BT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3326;1078;1;"Chhukha";"BT.06";"NULL";"Initialisation de la valeur «BT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3327;1078;1;"Chirang";"BT.07";"NULL";"Initialisation de la valeur «BT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3328;1078;1;"Daga";"BT.08";"NULL";"Initialisation de la valeur «BT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3329;1078;1;"Geylegphug";"BT.09";"NULL";"Initialisation de la valeur «BT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3330;1078;1;"Ha";"BT.10";"NULL";"Initialisation de la valeur «BT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3331;1078;1;"Lhuntshi";"BT.11";"NULL";"Initialisation de la valeur «BT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3332;1078;1;"Mongar";"BT.12";"NULL";"Initialisation de la valeur «BT.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3333;1078;1;"Paro District";"BT.13";"NULL";"Initialisation de la valeur «BT.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3334;1078;1;"Pemagatsel";"BT.14";"NULL";"Initialisation de la valeur «BT.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3335;1078;1;"Samchi";"BT.16";"NULL";"Initialisation de la valeur «BT.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3336;1078;1;"Samdrup Jongkhar District";"BT.17";"NULL";"Initialisation de la valeur «BT.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3337;1078;1;"Shemgang";"BT.18";"NULL";"Initialisation de la valeur «BT.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3338;1078;1;"Tashigang";"BT.19";"NULL";"Initialisation de la valeur «BT.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3339;1078;1;"Thimphu";"BT.20";"NULL";"Initialisation de la valeur «BT.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3340;1078;1;"Tongsa";"BT.21";"NULL";"Initialisation de la valeur «BT.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3341;1078;1;"Wangdi Phodrang";"BT.22";"NULL";"Initialisation de la valeur «BT.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3342;1078;1;"Botswana (general)";"BW.00";"NULL";"Initialisation de la valeur «BW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3343;1078;1;"Central";"BW.01";"NULL";"Initialisation de la valeur «BW.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3344;1078;1;"Chobe";"BW.02";"NULL";"Initialisation de la valeur «BW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3345;1078;1;"Ghanzi";"BW.03";"NULL";"Initialisation de la valeur «BW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3346;1078;1;"Kgalagadi";"BW.04";"NULL";"Initialisation de la valeur «BW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3347;1078;1;"Kgatleng";"BW.05";"NULL";"Initialisation de la valeur «BW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3348;1078;1;"Kweneng";"BW.06";"NULL";"Initialisation de la valeur «BW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3349;1078;1;"Ngamiland";"BW.07";"NULL";"Initialisation de la valeur «BW.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3350;1078;1;"North East";"BW.08";"NULL";"Initialisation de la valeur «BW.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3351;1078;1;"South East";"BW.09";"NULL";"Initialisation de la valeur «BW.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3352;1078;1;"Southern";"BW.10";"NULL";"Initialisation de la valeur «BW.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3353;1078;1;"North West";"BW.11";"NULL";"Initialisation de la valeur «BW.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3354;1078;1;"Belarus (general)";"BY.00";"NULL";"Initialisation de la valeur «BY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3355;1078;1;"Brestskaya Voblastsʼ";"BY.01";"NULL";"Initialisation de la valeur «BY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3356;1078;1;"Homyelʼskaya Voblastsʼ";"BY.02";"NULL";"Initialisation de la valeur «BY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3357;1078;1;"Hrodzyenskaya Voblastsʼ";"BY.03";"NULL";"Initialisation de la valeur «BY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3358;1078;1;"Mahilyowskaya Voblastsʼ";"BY.04";"NULL";"Initialisation de la valeur «BY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3359;1078;1;"Horad Minsk";"BY.05";"NULL";"Initialisation de la valeur «BY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3360;1078;1;"Minskaya Voblastsʼ";"BY.06";"NULL";"Initialisation de la valeur «BY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3361;1078;1;"Vitsyebskaya Voblastsʼ";"BY.07";"NULL";"Initialisation de la valeur «BY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3362;1078;1;"Belize (general)";"BZ.00";"NULL";"Initialisation de la valeur «BZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3363;1078;1;"Belize";"BZ.01";"NULL";"Initialisation de la valeur «BZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3364;1078;1;"Cayo";"BZ.02";"NULL";"Initialisation de la valeur «BZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3365;1078;1;"Corozal";"BZ.03";"NULL";"Initialisation de la valeur «BZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3366;1078;1;"Orange Walk";"BZ.04";"NULL";"Initialisation de la valeur «BZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3367;1078;1;"Stann Creek";"BZ.05";"NULL";"Initialisation de la valeur «BZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3368;1078;1;"Toledo";"BZ.06";"NULL";"Initialisation de la valeur «BZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3369;1078;1;"Canada (general)";"CA.00";"NULL";"Initialisation de la valeur «CA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3370;1078;1;"Alberta";"CA.01";"NULL";"Initialisation de la valeur «CA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3371;1078;1;"British Columbia";"CA.02";"NULL";"Initialisation de la valeur «CA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3372;1078;1;"Manitoba";"CA.03";"NULL";"Initialisation de la valeur «CA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3373;1078;1;"New Brunswick";"CA.04";"NULL";"Initialisation de la valeur «CA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3374;1078;1;"Newfoundland and Labrador";"CA.05";"NULL";"Initialisation de la valeur «CA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3375;1078;1;"Nova Scotia";"CA.07";"NULL";"Initialisation de la valeur «CA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3376;1078;1;"Ontario";"CA.08";"NULL";"Initialisation de la valeur «CA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3377;1078;1;"Prince Edward Island";"CA.09";"NULL";"Initialisation de la valeur «CA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3378;1078;1;"Quebec";"CA.10";"NULL";"Initialisation de la valeur «CA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3379;1078;1;"Saskatchewan";"CA.11";"NULL";"Initialisation de la valeur «CA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3380;1078;1;"Yukon";"CA.12";"NULL";"Initialisation de la valeur «CA.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3381;1078;1;"Northwest Territories";"CA.13";"NULL";"Initialisation de la valeur «CA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3382;1078;1;"Nunavut";"CA.14";"NULL";"Initialisation de la valeur «CA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3383;1078;1;"Cocos (Keeling) Islands (general)";"CC.00";"NULL";"Initialisation de la valeur «CC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3384;1078;1;"Congo, Democratic Republic of The (general)";"CD.00";"NULL";"Initialisation de la valeur «CD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3385;1078;1;"Bandundu";"CD.01";"NULL";"Initialisation de la valeur «CD.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3386;1078;1;"Équateur";"CD.02";"NULL";"Initialisation de la valeur «CD.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3387;1078;1;"Kasaï-Occidental";"CD.03";"NULL";"Initialisation de la valeur «CD.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3388;1078;1;"Kasaï-Oriental";"CD.04";"NULL";"Initialisation de la valeur «CD.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3389;1078;1;"Katanga";"CD.05";"NULL";"Initialisation de la valeur «CD.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3390;1078;1;"Kinshasa";"CD.06";"NULL";"Initialisation de la valeur «CD.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3391;1078;1;"Kivu Région du";"CD.07";"NULL";"Initialisation de la valeur «CD.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3392;1078;1;"Bas-Congo";"CD.08";"NULL";"Initialisation de la valeur «CD.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3393;1078;1;"Orientale";"CD.09";"NULL";"Initialisation de la valeur «CD.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3394;1078;1;"Maniema";"CD.10";"NULL";"Initialisation de la valeur «CD.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3395;1078;1;"Nord-Kivu";"CD.11";"NULL";"Initialisation de la valeur «CD.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3396;1078;1;"Sud-Kivu";"CD.12";"NULL";"Initialisation de la valeur «CD.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3397;1078;1;"Central African Republic (general)";"CF.00";"NULL";"Initialisation de la valeur «CF.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3398;1078;1;"Bamingui-Bangoran";"CF.01";"NULL";"Initialisation de la valeur «CF.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3399;1078;1;"Basse-Kotto";"CF.02";"NULL";"Initialisation de la valeur «CF.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3400;1078;1;"Haute-Kotto";"CF.03";"NULL";"Initialisation de la valeur «CF.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3401;1078;1;"Mambéré-Kadéï";"CF.04";"NULL";"Initialisation de la valeur «CF.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3402;1078;1;"Haut-Mbomou";"CF.05";"NULL";"Initialisation de la valeur «CF.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3403;1078;1;"Kémo";"CF.06";"NULL";"Initialisation de la valeur «CF.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3404;1078;1;"Lobaye";"CF.07";"NULL";"Initialisation de la valeur «CF.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3405;1078;1;"Mbomou";"CF.08";"NULL";"Initialisation de la valeur «CF.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3406;1078;1;"Nana-Mambéré";"CF.09";"NULL";"Initialisation de la valeur «CF.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3407;1078;1;"Ouaka";"CF.11";"NULL";"Initialisation de la valeur «CF.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3408;1078;1;"Ouham";"CF.12";"NULL";"Initialisation de la valeur «CF.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3409;1078;1;"Ouham-Pendé";"CF.13";"NULL";"Initialisation de la valeur «CF.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3410;1078;1;"Vakaga";"CF.14";"NULL";"Initialisation de la valeur «CF.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3411;1078;1;"Nana-Grébizi";"CF.15";"NULL";"Initialisation de la valeur «CF.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3412;1078;1;"Sangha-Mbaéré";"CF.16";"NULL";"Initialisation de la valeur «CF.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3413;1078;1;"Ombella-Mpoko";"CF.17";"NULL";"Initialisation de la valeur «CF.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3414;1078;1;"Bangui";"CF.18";"NULL";"Initialisation de la valeur «CF.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3415;1078;1;"Congo (general)";"CG.00";"NULL";"Initialisation de la valeur «CG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3416;1078;1;"Bouenza";"CG.01";"NULL";"Initialisation de la valeur «CG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3417;1078;1;"CF03";"CG.03";"NULL";"Initialisation de la valeur «CG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3418;1078;1;"Kouilou";"CG.04";"NULL";"Initialisation de la valeur «CG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3419;1078;1;"Lékoumou";"CG.05";"NULL";"Initialisation de la valeur «CG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3420;1078;1;"Likouala";"CG.06";"NULL";"Initialisation de la valeur «CG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3421;1078;1;"Niari";"CG.07";"NULL";"Initialisation de la valeur «CG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3422;1078;1;"Plateaux";"CG.08";"NULL";"Initialisation de la valeur «CG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3423;1078;1;"Sangha";"CG.10";"NULL";"Initialisation de la valeur «CG.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3424;1078;1;"Pool";"CG.11";"NULL";"Initialisation de la valeur «CG.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3425;1078;1;"Brazzaville";"CG.12";"NULL";"Initialisation de la valeur «CG.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3426;1078;1;"Cuvette";"CG.13";"NULL";"Initialisation de la valeur «CG.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3427;1078;1;"Cuvette-Ouest";"CG.14";"NULL";"Initialisation de la valeur «CG.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3428;1078;1;"Switzerland (general)";"CH.00";"NULL";"Initialisation de la valeur «CH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3429;1078;1;"Aargau";"CH.AG";"NULL";"Initialisation de la valeur «CH.AG» pour la liste «75».";2009-07-29 00:00:00;1;1
3430;1078;1;"Appenzell Innerrhoden";"CH.AI";"NULL";"Initialisation de la valeur «CH.AI» pour la liste «75».";2009-07-29 00:00:00;1;1
3431;1078;1;"Appenzell Ausserrhoden";"CH.AR";"NULL";"Initialisation de la valeur «CH.AR» pour la liste «75».";2009-07-29 00:00:00;1;1
3432;1078;1;"Bern";"CH.BE";"NULL";"Initialisation de la valeur «CH.BE» pour la liste «75».";2009-07-29 00:00:00;1;1
3433;1078;1;"Basel-Landschaft";"CH.BL";"NULL";"Initialisation de la valeur «CH.BL» pour la liste «75».";2009-07-29 00:00:00;1;1
3434;1078;1;"Basel-Stadt";"CH.BS";"NULL";"Initialisation de la valeur «CH.BS» pour la liste «75».";2009-07-29 00:00:00;1;1
3435;1078;1;"Fribourg";"CH.FR";"NULL";"Initialisation de la valeur «CH.FR» pour la liste «75».";2009-07-29 00:00:00;1;1
3436;1078;1;"Genève";"CH.GE";"NULL";"Initialisation de la valeur «CH.GE» pour la liste «75».";2009-07-29 00:00:00;1;1
3437;1078;1;"Glarus";"CH.GL";"NULL";"Initialisation de la valeur «CH.GL» pour la liste «75».";2009-07-29 00:00:00;1;1
3438;1078;1;"Graubünden";"CH.GR";"NULL";"Initialisation de la valeur «CH.GR» pour la liste «75».";2009-07-29 00:00:00;1;1
3439;1078;1;"Jura";"CH.JU";"NULL";"Initialisation de la valeur «CH.JU» pour la liste «75».";2009-07-29 00:00:00;1;1
3440;1078;1;"Luzern";"CH.LU";"NULL";"Initialisation de la valeur «CH.LU» pour la liste «75».";2009-07-29 00:00:00;1;1
3441;1078;1;"Neuchâtel";"CH.NE";"NULL";"Initialisation de la valeur «CH.NE» pour la liste «75».";2009-07-29 00:00:00;1;1
3442;1078;1;"Nidwalden";"CH.NW";"NULL";"Initialisation de la valeur «CH.NW» pour la liste «75».";2009-07-29 00:00:00;1;1
3443;1078;1;"Obwalden";"CH.OW";"NULL";"Initialisation de la valeur «CH.OW» pour la liste «75».";2009-07-29 00:00:00;1;1
3444;1078;1;"Kanton St. Gallen";"CH.SG";"NULL";"Initialisation de la valeur «CH.SG» pour la liste «75».";2009-07-29 00:00:00;1;1
3445;1078;1;"Schaffhausen";"CH.SH";"NULL";"Initialisation de la valeur «CH.SH» pour la liste «75».";2009-07-29 00:00:00;1;1
3446;1078;1;"Solothurn";"CH.SO";"NULL";"Initialisation de la valeur «CH.SO» pour la liste «75».";2009-07-29 00:00:00;1;1
3447;1078;1;"Schwyz";"CH.SZ";"NULL";"Initialisation de la valeur «CH.SZ» pour la liste «75».";2009-07-29 00:00:00;1;1
3448;1078;1;"Thurgau";"CH.TG";"NULL";"Initialisation de la valeur «CH.TG» pour la liste «75».";2009-07-29 00:00:00;1;1
3449;1078;1;"Ticino";"CH.TI";"NULL";"Initialisation de la valeur «CH.TI» pour la liste «75».";2009-07-29 00:00:00;1;1
3450;1078;1;"Uri";"CH.UR";"NULL";"Initialisation de la valeur «CH.UR» pour la liste «75».";2009-07-29 00:00:00;1;1
3451;1078;1;"Vaud";"CH.VD";"NULL";"Initialisation de la valeur «CH.VD» pour la liste «75».";2009-07-29 00:00:00;1;1
3452;1078;1;"Valais";"CH.VS";"NULL";"Initialisation de la valeur «CH.VS» pour la liste «75».";2009-07-29 00:00:00;1;1
3453;1078;1;"Zug";"CH.ZG";"NULL";"Initialisation de la valeur «CH.ZG» pour la liste «75».";2009-07-29 00:00:00;1;1
3454;1078;1;"Zürich";"CH.ZH";"NULL";"Initialisation de la valeur «CH.ZH» pour la liste «75».";2009-07-29 00:00:00;1;1
3455;1078;1;"Côte dʼIvoire (general)";"CI.00";"NULL";"Initialisation de la valeur «CI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3456;1078;1;"Valparaíso Region";"CI.01";"NULL";"Initialisation de la valeur «CI.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3457;1078;1;"Antofagasta Region";"CI.03";"NULL";"Initialisation de la valeur «CI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3458;1078;1;"Araucanía Region";"CI.04";"NULL";"Initialisation de la valeur «CI.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3459;1078;1;"Atacama Region";"CI.05";"NULL";"Initialisation de la valeur «CI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3460;1078;1;"Biobío Region";"CI.06";"NULL";"Initialisation de la valeur «CI.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3461;1078;1;"Coquimbo Region";"CI.07";"NULL";"Initialisation de la valeur «CI.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3462;1078;1;"Maule Region";"CI.11";"NULL";"Initialisation de la valeur «CI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3463;1078;1;"Santiago Metropolitan Region";"CI.12";"NULL";"Initialisation de la valeur «CI.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3464;1078;1;"Danane";"CI.14";"NULL";"Initialisation de la valeur «CI.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3465;1078;1;"Divo";"CI.16";"NULL";"Initialisation de la valeur «CI.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3466;1078;1;"Ferkessedougou";"CI.17";"NULL";"Initialisation de la valeur «CI.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3467;1078;1;"Gagnoa";"CI.18";"NULL";"Initialisation de la valeur «CI.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3468;1078;1;"Katiola";"CI.20";"NULL";"Initialisation de la valeur «CI.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3469;1078;1;"Korhogo";"CI.21";"NULL";"Initialisation de la valeur «CI.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3470;1078;1;"Odienne";"CI.23";"NULL";"Initialisation de la valeur «CI.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3471;1078;1;"Seguela";"CI.25";"NULL";"Initialisation de la valeur «CI.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3472;1078;1;"Touba";"CI.26";"NULL";"Initialisation de la valeur «CI.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3473;1078;1;"Bongouanou";"CI.27";"NULL";"Initialisation de la valeur «CI.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3474;1078;1;"Issia";"CI.28";"NULL";"Initialisation de la valeur «CI.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3475;1078;1;"Lakota";"CI.29";"NULL";"Initialisation de la valeur «CI.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3476;1078;1;"Mankono";"CI.30";"NULL";"Initialisation de la valeur «CI.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3477;1078;1;"Oume";"CI.31";"NULL";"Initialisation de la valeur «CI.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3478;1078;1;"Soubre";"CI.32";"NULL";"Initialisation de la valeur «CI.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3479;1078;1;"Tingrela";"CI.33";"NULL";"Initialisation de la valeur «CI.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3480;1078;1;"Zuenoula";"CI.34";"NULL";"Initialisation de la valeur «CI.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3481;1078;1;"(IV35)";"CI.35";"NULL";"Initialisation de la valeur «CI.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3482;1078;1;"Bangolo";"CI.36";"NULL";"Initialisation de la valeur «CI.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3483;1078;1;"Beoumi";"CI.37";"NULL";"Initialisation de la valeur «CI.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3484;1078;1;"Bondoukou";"CI.38";"NULL";"Initialisation de la valeur «CI.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3485;1078;1;"Bouafle";"CI.39";"NULL";"Initialisation de la valeur «CI.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3486;1078;1;"Bouake";"CI.40";"NULL";"Initialisation de la valeur «CI.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3487;1078;1;"Daloa";"CI.41";"NULL";"Initialisation de la valeur «CI.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3488;1078;1;"Daoukro";"CI.42";"NULL";"Initialisation de la valeur «CI.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3489;1078;1;"(IV43)";"CI.43";"NULL";"Initialisation de la valeur «CI.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3490;1078;1;"Duekoue";"CI.44";"NULL";"Initialisation de la valeur «CI.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3491;1078;1;"Grand-Lahou";"CI.45";"NULL";"Initialisation de la valeur «CI.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3492;1078;1;"(IV46)";"CI.46";"NULL";"Initialisation de la valeur «CI.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3493;1078;1;"Man";"CI.47";"NULL";"Initialisation de la valeur «CI.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3494;1078;1;"Mbahiakro";"CI.48";"NULL";"Initialisation de la valeur «CI.48» pour la liste «75».";2009-07-29 00:00:00;1;1
3495;1078;1;"Sakassou";"CI.49";"NULL";"Initialisation de la valeur «CI.49» pour la liste «75».";2009-07-29 00:00:00;1;1
3496;1078;1;"San Pedro";"CI.50";"NULL";"Initialisation de la valeur «CI.50» pour la liste «75».";2009-07-29 00:00:00;1;1
3497;1078;1;"Sassandra";"CI.51";"NULL";"Initialisation de la valeur «CI.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3498;1078;1;"Sinfra";"CI.52";"NULL";"Initialisation de la valeur «CI.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3499;1078;1;"Tabou";"CI.53";"NULL";"Initialisation de la valeur «CI.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3500;1078;1;"Tanda";"CI.54";"NULL";"Initialisation de la valeur «CI.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3501;1078;1;"Tiassale";"CI.55";"NULL";"Initialisation de la valeur «CI.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3502;1078;1;"Toumodi";"CI.56";"NULL";"Initialisation de la valeur «CI.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3503;1078;1;"Vavoua";"CI.57";"NULL";"Initialisation de la valeur «CI.57» pour la liste «75».";2009-07-29 00:00:00;1;1
3504;1078;1;"(IV58)";"CI.58";"NULL";"Initialisation de la valeur «CI.58» pour la liste «75».";2009-07-29 00:00:00;1;1
3505;1078;1;"(IV59)";"CI.59";"NULL";"Initialisation de la valeur «CI.59» pour la liste «75».";2009-07-29 00:00:00;1;1
3506;1078;1;"(IV60)";"CI.60";"NULL";"Initialisation de la valeur «CI.60» pour la liste «75».";2009-07-29 00:00:00;1;1
3507;1078;1;"Abidjan";"CI.61";"NULL";"Initialisation de la valeur «CI.61» pour la liste «75».";2009-07-29 00:00:00;1;1
3508;1078;1;"Aboisso";"CI.62";"NULL";"Initialisation de la valeur «CI.62» pour la liste «75».";2009-07-29 00:00:00;1;1
3509;1078;1;"Adiake";"CI.63";"NULL";"Initialisation de la valeur «CI.63» pour la liste «75».";2009-07-29 00:00:00;1;1
3510;1078;1;"Alepe";"CI.64";"NULL";"Initialisation de la valeur «CI.64» pour la liste «75».";2009-07-29 00:00:00;1;1
3511;1078;1;"Bocanda";"CI.65";"NULL";"Initialisation de la valeur «CI.65» pour la liste «75».";2009-07-29 00:00:00;1;1
3512;1078;1;"Dabou";"CI.66";"NULL";"Initialisation de la valeur «CI.66» pour la liste «75».";2009-07-29 00:00:00;1;1
3513;1078;1;"Dimbokro";"CI.67";"NULL";"Initialisation de la valeur «CI.67» pour la liste «75».";2009-07-29 00:00:00;1;1
3514;1078;1;"Grand-Bassam";"CI.68";"NULL";"Initialisation de la valeur «CI.68» pour la liste «75».";2009-07-29 00:00:00;1;1
3515;1078;1;"Guiglo";"CI.69";"NULL";"Initialisation de la valeur «CI.69» pour la liste «75».";2009-07-29 00:00:00;1;1
3516;1078;1;"Jacqueville";"CI.70";"NULL";"Initialisation de la valeur «CI.70» pour la liste «75».";2009-07-29 00:00:00;1;1
3517;1078;1;"Tiebissou";"CI.71";"NULL";"Initialisation de la valeur «CI.71» pour la liste «75».";2009-07-29 00:00:00;1;1
3518;1078;1;"Toulepleu";"CI.72";"NULL";"Initialisation de la valeur «CI.72» pour la liste «75».";2009-07-29 00:00:00;1;1
3519;1078;1;"Yamoussoukro";"CI.73";"NULL";"Initialisation de la valeur «CI.73» pour la liste «75».";2009-07-29 00:00:00;1;1
3520;1078;1;"Agnéby";"CI.74";"NULL";"Initialisation de la valeur «CI.74» pour la liste «75».";2009-07-29 00:00:00;1;1
3521;1078;1;"Bafing";"CI.75";"NULL";"Initialisation de la valeur «CI.75» pour la liste «75».";2009-07-29 00:00:00;1;1
3522;1078;1;"Bas-Sassandra";"CI.76";"NULL";"Initialisation de la valeur «CI.76» pour la liste «75».";2009-07-29 00:00:00;1;1
3523;1078;1;"Denguélé";"CI.77";"NULL";"Initialisation de la valeur «CI.77» pour la liste «75».";2009-07-29 00:00:00;1;1
3524;1078;1;"Dix-Huit Montagnes";"CI.78";"NULL";"Initialisation de la valeur «CI.78» pour la liste «75».";2009-07-29 00:00:00;1;1
3525;1078;1;"Fromager";"CI.79";"NULL";"Initialisation de la valeur «CI.79» pour la liste «75».";2009-07-29 00:00:00;1;1
3526;1078;1;"Haut-Sassandra";"CI.80";"NULL";"Initialisation de la valeur «CI.80» pour la liste «75».";2009-07-29 00:00:00;1;1
3527;1078;1;"Lacs";"CI.81";"NULL";"Initialisation de la valeur «CI.81» pour la liste «75».";2009-07-29 00:00:00;1;1
3528;1078;1;"Lagunes";"CI.82";"NULL";"Initialisation de la valeur «CI.82» pour la liste «75».";2009-07-29 00:00:00;1;1
3529;1078;1;"Marahoué";"CI.83";"NULL";"Initialisation de la valeur «CI.83» pour la liste «75».";2009-07-29 00:00:00;1;1
3530;1078;1;"Moyen-Cavally";"CI.84";"NULL";"Initialisation de la valeur «CI.84» pour la liste «75».";2009-07-29 00:00:00;1;1
3531;1078;1;"Moyen-Comoé";"CI.85";"NULL";"Initialisation de la valeur «CI.85» pour la liste «75».";2009-07-29 00:00:00;1;1
3532;1078;1;"Nʼzi-Comoé";"CI.86";"NULL";"Initialisation de la valeur «CI.86» pour la liste «75».";2009-07-29 00:00:00;1;1
3533;1078;1;"Savanes";"CI.87";"NULL";"Initialisation de la valeur «CI.87» pour la liste «75».";2009-07-29 00:00:00;1;1
3534;1078;1;"Sud-Bandama";"CI.88";"NULL";"Initialisation de la valeur «CI.88» pour la liste «75».";2009-07-29 00:00:00;1;1
3535;1078;1;"Sud-Comoé";"CI.89";"NULL";"Initialisation de la valeur «CI.89» pour la liste «75».";2009-07-29 00:00:00;1;1
3536;1078;1;"Vallée du Bandama";"CI.90";"NULL";"Initialisation de la valeur «CI.90» pour la liste «75».";2009-07-29 00:00:00;1;1
3537;1078;1;"Worodougou";"CI.91";"NULL";"Initialisation de la valeur «CI.91» pour la liste «75».";2009-07-29 00:00:00;1;1
3538;1078;1;"Zanzan";"CI.92";"NULL";"Initialisation de la valeur «CI.92» pour la liste «75».";2009-07-29 00:00:00;1;1
3539;1078;1;"Cook Islands (general)";"CK.00";"NULL";"Initialisation de la valeur «CK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3540;1078;1;"Chile (general)";"CL.00";"NULL";"Initialisation de la valeur «CL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3541;1078;1;"Valparaíso";"CL.01";"NULL";"Initialisation de la valeur «CL.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3542;1078;1;"Aisén del General Carlos Ibáñez del Campo";"CL.02";"NULL";"Initialisation de la valeur «CL.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3543;1078;1;"Antofagasta";"CL.03";"NULL";"Initialisation de la valeur «CL.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3544;1078;1;"Araucanía";"CL.04";"NULL";"Initialisation de la valeur «CL.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3545;1078;1;"Atacama";"CL.05";"NULL";"Initialisation de la valeur «CL.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3546;1078;1;"Bío-Bío";"CL.06";"NULL";"Initialisation de la valeur «CL.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3547;1078;1;"Coquimbo";"CL.07";"NULL";"Initialisation de la valeur «CL.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3548;1078;1;"Libertador General Bernardo OʼHiggins";"CL.08";"NULL";"Initialisation de la valeur «CL.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3549;1078;1;"Magallanes y Antártica Chilena";"CL.10";"NULL";"Initialisation de la valeur «CL.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3550;1078;1;"Maule";"CL.11";"NULL";"Initialisation de la valeur «CL.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3551;1078;1;"Región Metropolitana";"CL.12";"NULL";"Initialisation de la valeur «CL.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3552;1078;1;"Cameroon (general)";"CM.00";"NULL";"Initialisation de la valeur «CM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3553;1078;1;"Est";"CM.04";"NULL";"Initialisation de la valeur «CM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3554;1078;1;"Littoral";"CM.05";"NULL";"Initialisation de la valeur «CM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3555;1078;1;"North-West Province";"CM.07";"NULL";"Initialisation de la valeur «CM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3556;1078;1;"Ouest";"CM.08";"NULL";"Initialisation de la valeur «CM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3557;1078;1;"South-West Province";"CM.09";"NULL";"Initialisation de la valeur «CM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3558;1078;1;"Adamaoua";"CM.10";"NULL";"Initialisation de la valeur «CM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3559;1078;1;"Centre";"CM.11";"NULL";"Initialisation de la valeur «CM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3560;1078;1;"Extreme-Nord";"CM.12";"NULL";"Initialisation de la valeur «CM.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3561;1078;1;"North Province";"CM.13";"NULL";"Initialisation de la valeur «CM.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3562;1078;1;"South Province";"CM.14";"NULL";"Initialisation de la valeur «CM.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3563;1078;1;"Paracel Islands (general)";"CN.00";"NULL";"Initialisation de la valeur «CN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3564;1078;1;"Anhui";"CN.01";"NULL";"Initialisation de la valeur «CN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3565;1078;1;"Zhejiang";"CN.02";"NULL";"Initialisation de la valeur «CN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3566;1078;1;"Jiangxi";"CN.03";"NULL";"Initialisation de la valeur «CN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3567;1078;1;"Jiangsu";"CN.04";"NULL";"Initialisation de la valeur «CN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3568;1078;1;"Jilin";"CN.05";"NULL";"Initialisation de la valeur «CN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3569;1078;1;"Qinghai";"CN.06";"NULL";"Initialisation de la valeur «CN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3570;1078;1;"Fujian";"CN.07";"NULL";"Initialisation de la valeur «CN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3571;1078;1;"Heilongjiang";"CN.08";"NULL";"Initialisation de la valeur «CN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3572;1078;1;"Henan";"CN.09";"NULL";"Initialisation de la valeur «CN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3573;1078;1;"disputed";"CN.0Z";"NULL";"Initialisation de la valeur «CN.0Z» pour la liste «75».";2009-07-29 00:00:00;1;1
3574;1078;1;"Hebei";"CN.10";"NULL";"Initialisation de la valeur «CN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3575;1078;1;"Hunan Province";"CN.11";"NULL";"Initialisation de la valeur «CN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3576;1078;1;"Hubei";"CN.12";"NULL";"Initialisation de la valeur «CN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3577;1078;1;"Xinjiang";"CN.13";"NULL";"Initialisation de la valeur «CN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3578;1078;1;"Xizang";"CN.14";"NULL";"Initialisation de la valeur «CN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3579;1078;1;"Gansu";"CN.15";"NULL";"Initialisation de la valeur «CN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3580;1078;1;"Guangxi";"CN.16";"NULL";"Initialisation de la valeur «CN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3581;1078;1;"Guizhou";"CN.18";"NULL";"Initialisation de la valeur «CN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3582;1078;1;"Liaoning Province";"CN.19";"NULL";"Initialisation de la valeur «CN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3583;1078;1;"Nei Mongol";"CN.20";"NULL";"Initialisation de la valeur «CN.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3584;1078;1;"Ningxia";"CN.21";"NULL";"Initialisation de la valeur «CN.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3585;1078;1;"Beijing";"CN.22";"NULL";"Initialisation de la valeur «CN.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3586;1078;1;"Shanghai";"CN.23";"NULL";"Initialisation de la valeur «CN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3587;1078;1;"Shanxi";"CN.24";"NULL";"Initialisation de la valeur «CN.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3588;1078;1;"Shandong";"CN.25";"NULL";"Initialisation de la valeur «CN.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3589;1078;1;"Shaanxi";"CN.26";"NULL";"Initialisation de la valeur «CN.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3590;1078;1;"Tianjin";"CN.28";"NULL";"Initialisation de la valeur «CN.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3591;1078;1;"Yunnan Province";"CN.29";"NULL";"Initialisation de la valeur «CN.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3592;1078;1;"Guangdong";"CN.30";"NULL";"Initialisation de la valeur «CN.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3593;1078;1;"Hainan Province";"CN.31";"NULL";"Initialisation de la valeur «CN.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3594;1078;1;"Sichuan";"CN.32";"NULL";"Initialisation de la valeur «CN.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3595;1078;1;"Chongqing";"CN.33";"NULL";"Initialisation de la valeur «CN.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3596;1078;1;"PF99";"CN.99";"NULL";"Initialisation de la valeur «CN.99» pour la liste «75».";2009-07-29 00:00:00;1;1
3597;1078;1;"Colombia (general)";"CO.00";"NULL";"Initialisation de la valeur «CO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3598;1078;1;"Amazonas";"CO.01";"NULL";"Initialisation de la valeur «CO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3599;1078;1;"Antioquia";"CO.02";"NULL";"Initialisation de la valeur «CO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3600;1078;1;"Arauca";"CO.03";"NULL";"Initialisation de la valeur «CO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3601;1078;1;"Atlántico";"CO.04";"NULL";"Initialisation de la valeur «CO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3602;1078;1;"Bolívar";"CO.05";"NULL";"Initialisation de la valeur «CO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3603;1078;1;"Boyacá";"CO.06";"NULL";"Initialisation de la valeur «CO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3604;1078;1;"Caldas";"CO.07";"NULL";"Initialisation de la valeur «CO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3605;1078;1;"Caquetá";"CO.08";"NULL";"Initialisation de la valeur «CO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3606;1078;1;"Cauca";"CO.09";"NULL";"Initialisation de la valeur «CO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3607;1078;1;"Cesar";"CO.10";"NULL";"Initialisation de la valeur «CO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3608;1078;1;"Chocó";"CO.11";"NULL";"Initialisation de la valeur «CO.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3609;1078;1;"Córdoba";"CO.12";"NULL";"Initialisation de la valeur «CO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3610;1078;1;"Guaviare";"CO.14";"NULL";"Initialisation de la valeur «CO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3611;1078;1;"Guainía";"CO.15";"NULL";"Initialisation de la valeur «CO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3612;1078;1;"Huila";"CO.16";"NULL";"Initialisation de la valeur «CO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3613;1078;1;"La Guajira";"CO.17";"NULL";"Initialisation de la valeur «CO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3614;1078;1;"Magdalena";"CO.18";"NULL";"Initialisation de la valeur «CO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3615;1078;1;"Meta";"CO.19";"NULL";"Initialisation de la valeur «CO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3616;1078;1;"Nariño";"CO.20";"NULL";"Initialisation de la valeur «CO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3617;1078;1;"Norte de Santander";"CO.21";"NULL";"Initialisation de la valeur «CO.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3618;1078;1;"Putumayo";"CO.22";"NULL";"Initialisation de la valeur «CO.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3619;1078;1;"Quindío";"CO.23";"NULL";"Initialisation de la valeur «CO.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3620;1078;1;"Risaralda";"CO.24";"NULL";"Initialisation de la valeur «CO.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3621;1078;1;"Archipiélago de San Andrés, Providencia y Santa Catalina";"CO.25";"NULL";"Initialisation de la valeur «CO.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3622;1078;1;"Santander";"CO.26";"NULL";"Initialisation de la valeur «CO.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3623;1078;1;"Sucre";"CO.27";"NULL";"Initialisation de la valeur «CO.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3624;1078;1;"Tolima";"CO.28";"NULL";"Initialisation de la valeur «CO.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3625;1078;1;"Valle del Cauca";"CO.29";"NULL";"Initialisation de la valeur «CO.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3626;1078;1;"Vaupés";"CO.30";"NULL";"Initialisation de la valeur «CO.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3627;1078;1;"Vichada";"CO.31";"NULL";"Initialisation de la valeur «CO.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3628;1078;1;"Casanare";"CO.32";"NULL";"Initialisation de la valeur «CO.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3629;1078;1;"Cundinamarca";"CO.33";"NULL";"Initialisation de la valeur «CO.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3630;1078;1;"Bogota D.C.";"CO.34";"NULL";"Initialisation de la valeur «CO.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3631;1078;1;"Bolívar";"CO.35";"NULL";"Initialisation de la valeur «CO.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3632;1078;1;"Boyacá";"CO.36";"NULL";"Initialisation de la valeur «CO.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3633;1078;1;"Caldas";"CO.37";"NULL";"Initialisation de la valeur «CO.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3634;1078;1;"Magdalena";"CO.38";"NULL";"Initialisation de la valeur «CO.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3635;1078;1;"Costa Rica (general)";"CR.00";"NULL";"Initialisation de la valeur «CR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3636;1078;1;"Alajuela";"CR.01";"NULL";"Initialisation de la valeur «CR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3637;1078;1;"Cartago";"CR.02";"NULL";"Initialisation de la valeur «CR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3638;1078;1;"Guanacaste";"CR.03";"NULL";"Initialisation de la valeur «CR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3639;1078;1;"Heredia";"CR.04";"NULL";"Initialisation de la valeur «CR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3640;1078;1;"Limón";"CR.06";"NULL";"Initialisation de la valeur «CR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3641;1078;1;"Puntarenas";"CR.07";"NULL";"Initialisation de la valeur «CR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3642;1078;1;"San José";"CR.08";"NULL";"Initialisation de la valeur «CR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3643;1078;1;"Serbia and Montenegro (general)";"CS.00";"NULL";"Initialisation de la valeur «CS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3644;1078;1;"Crna Gora (Montenegro)";"CS.01";"NULL";"Initialisation de la valeur «CS.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3645;1078;1;"Srbija (Serbia)";"CS.02";"NULL";"Initialisation de la valeur «CS.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3646;1078;1;"Cuba (general)";"CU.00";"NULL";"Initialisation de la valeur «CU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3647;1078;1;"Pinar del Río";"CU.01";"NULL";"Initialisation de la valeur «CU.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3648;1078;1;"Ciudad de La Habana";"CU.02";"NULL";"Initialisation de la valeur «CU.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3649;1078;1;"Matanzas";"CU.03";"NULL";"Initialisation de la valeur «CU.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3650;1078;1;"Isla de la Juventud";"CU.04";"NULL";"Initialisation de la valeur «CU.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3651;1078;1;"Camagüey";"CU.05";"NULL";"Initialisation de la valeur «CU.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3652;1078;1;"Ciego de Ávila";"CU.07";"NULL";"Initialisation de la valeur «CU.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3653;1078;1;"Cienfuegos";"CU.08";"NULL";"Initialisation de la valeur «CU.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3654;1078;1;"Granma";"CU.09";"NULL";"Initialisation de la valeur «CU.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3655;1078;1;"Guantánamo";"CU.10";"NULL";"Initialisation de la valeur «CU.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3656;1078;1;"La Habana";"CU.11";"NULL";"Initialisation de la valeur «CU.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3657;1078;1;"Holguín";"CU.12";"NULL";"Initialisation de la valeur «CU.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3658;1078;1;"Las Tunas";"CU.13";"NULL";"Initialisation de la valeur «CU.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3659;1078;1;"Sancti Spíritus";"CU.14";"NULL";"Initialisation de la valeur «CU.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3660;1078;1;"Santiago de Cuba";"CU.15";"NULL";"Initialisation de la valeur «CU.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3661;1078;1;"Villa Clara";"CU.16";"NULL";"Initialisation de la valeur «CU.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3662;1078;1;"Cape Verde (general)";"CV.00";"NULL";"Initialisation de la valeur «CV.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3663;1078;1;"Boa Vista";"CV.01";"NULL";"Initialisation de la valeur «CV.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3664;1078;1;"Brava";"CV.02";"NULL";"Initialisation de la valeur «CV.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3665;1078;1;"Maio";"CV.04";"NULL";"Initialisation de la valeur «CV.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3666;1078;1;"Paul";"CV.05";"NULL";"Initialisation de la valeur «CV.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3667;1078;1;"Praia";"CV.06";"NULL";"Initialisation de la valeur «CV.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3668;1078;1;"Ribeira Grande";"CV.07";"NULL";"Initialisation de la valeur «CV.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3669;1078;1;"Sal";"CV.08";"NULL";"Initialisation de la valeur «CV.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3670;1078;1;"Santa Catarina ";"CV.09";"NULL";"Initialisation de la valeur «CV.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3671;1078;1;"São Nicolau";"CV.10";"NULL";"Initialisation de la valeur «CV.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3672;1078;1;"São Vicente";"CV.11";"NULL";"Initialisation de la valeur «CV.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3673;1078;1;"Tarrafal ";"CV.12";"NULL";"Initialisation de la valeur «CV.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3674;1078;1;"Mosteiros";"CV.13";"NULL";"Initialisation de la valeur «CV.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3675;1078;1;"Praia";"CV.14";"NULL";"Initialisation de la valeur «CV.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3676;1078;1;"Santa Catarina";"CV.15";"NULL";"Initialisation de la valeur «CV.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3677;1078;1;"Santa Cruz";"CV.16";"NULL";"Initialisation de la valeur «CV.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3678;1078;1;"São Domingos";"CV.17";"NULL";"Initialisation de la valeur «CV.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3679;1078;1;"São Filipe";"CV.18";"NULL";"Initialisation de la valeur «CV.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3680;1078;1;"São Miguel";"CV.19";"NULL";"Initialisation de la valeur «CV.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3681;1078;1;"Tarrafal";"CV.20";"NULL";"Initialisation de la valeur «CV.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3682;1078;1;"Christmas Island (general)";"CX.00";"NULL";"Initialisation de la valeur «CX.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3683;1078;1;"Cyprus (general)";"CY.00";"NULL";"Initialisation de la valeur «CY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3684;1078;1;"Famagusta";"CY.01";"NULL";"Initialisation de la valeur «CY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3685;1078;1;"Kyrenia";"CY.02";"NULL";"Initialisation de la valeur «CY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3686;1078;1;"Larnaca";"CY.03";"NULL";"Initialisation de la valeur «CY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3687;1078;1;"Nicosia";"CY.04";"NULL";"Initialisation de la valeur «CY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3688;1078;1;"Limassol";"CY.05";"NULL";"Initialisation de la valeur «CY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3689;1078;1;"Paphos";"CY.06";"NULL";"Initialisation de la valeur «CY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3690;1078;1;"Czech Republic (general)";"CZ.00";"NULL";"Initialisation de la valeur «CZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3691;1078;1;"Hradec Kralove";"CZ.20";"NULL";"Initialisation de la valeur «CZ.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3692;1078;1;"Jablonec nad Nisou";"CZ.21";"NULL";"Initialisation de la valeur «CZ.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3693;1078;1;"Jiein";"CZ.23";"NULL";"Initialisation de la valeur «CZ.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3694;1078;1;"Jihlava";"CZ.24";"NULL";"Initialisation de la valeur «CZ.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3695;1078;1;"Kolin";"CZ.30";"NULL";"Initialisation de la valeur «CZ.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3696;1078;1;"Liberec";"CZ.33";"NULL";"Initialisation de la valeur «CZ.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3697;1078;1;"Melnik";"CZ.36";"NULL";"Initialisation de la valeur «CZ.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3698;1078;1;"Mlada Boleslav";"CZ.37";"NULL";"Initialisation de la valeur «CZ.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3699;1078;1;"Nachod";"CZ.39";"NULL";"Initialisation de la valeur «CZ.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3700;1078;1;"Nymburk";"CZ.41";"NULL";"Initialisation de la valeur «CZ.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3701;1078;1;"Pardubice";"CZ.45";"NULL";"Initialisation de la valeur «CZ.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3702;1078;1;"Hlavní Mesto Praha";"CZ.52";"NULL";"Initialisation de la valeur «CZ.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3703;1078;1;"Semily";"CZ.61";"NULL";"Initialisation de la valeur «CZ.61» pour la liste «75».";2009-07-29 00:00:00;1;1
3704;1078;1;"Trutnov";"CZ.70";"NULL";"Initialisation de la valeur «CZ.70» pour la liste «75».";2009-07-29 00:00:00;1;1
3705;1078;1;"(EZ73)";"CZ.73";"NULL";"Initialisation de la valeur «CZ.73» pour la liste «75».";2009-07-29 00:00:00;1;1
3706;1078;1;"South Moravian Region";"CZ.78";"NULL";"Initialisation de la valeur «CZ.78» pour la liste «75».";2009-07-29 00:00:00;1;1
3707;1078;1;"Jihočeský Kraj";"CZ.79";"NULL";"Initialisation de la valeur «CZ.79» pour la liste «75».";2009-07-29 00:00:00;1;1
3708;1078;1;"Vysočina";"CZ.80";"NULL";"Initialisation de la valeur «CZ.80» pour la liste «75».";2009-07-29 00:00:00;1;1
3709;1078;1;"Karlovarský Kraj";"CZ.81";"NULL";"Initialisation de la valeur «CZ.81» pour la liste «75».";2009-07-29 00:00:00;1;1
3710;1078;1;"Královéhradecký Kraj";"CZ.82";"NULL";"Initialisation de la valeur «CZ.82» pour la liste «75».";2009-07-29 00:00:00;1;1
3711;1078;1;"Liberecký Kraj";"CZ.83";"NULL";"Initialisation de la valeur «CZ.83» pour la liste «75».";2009-07-29 00:00:00;1;1
3712;1078;1;"Olomoucký Kraj";"CZ.84";"NULL";"Initialisation de la valeur «CZ.84» pour la liste «75».";2009-07-29 00:00:00;1;1
3713;1078;1;"Moravskoslezský Kraj";"CZ.85";"NULL";"Initialisation de la valeur «CZ.85» pour la liste «75».";2009-07-29 00:00:00;1;1
3714;1078;1;"Pardubický Kraj";"CZ.86";"NULL";"Initialisation de la valeur «CZ.86» pour la liste «75».";2009-07-29 00:00:00;1;1
3715;1078;1;"Plzeňský Kraj";"CZ.87";"NULL";"Initialisation de la valeur «CZ.87» pour la liste «75».";2009-07-29 00:00:00;1;1
3716;1078;1;"Středočeský Kraj";"CZ.88";"NULL";"Initialisation de la valeur «CZ.88» pour la liste «75».";2009-07-29 00:00:00;1;1
3717;1078;1;"Ústecký Kraj";"CZ.89";"NULL";"Initialisation de la valeur «CZ.89» pour la liste «75».";2009-07-29 00:00:00;1;1
3718;1078;1;"Zlínský Kraj";"CZ.90";"NULL";"Initialisation de la valeur «CZ.90» pour la liste «75».";2009-07-29 00:00:00;1;1
3719;1078;1;"Germany (general)";"DE.00";"NULL";"Initialisation de la valeur «DE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3720;1078;1;"Baden-Württemberg";"DE.01";"NULL";"Initialisation de la valeur «DE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3721;1078;1;"Bavaria";"DE.02";"NULL";"Initialisation de la valeur «DE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3722;1078;1;"Bremen";"DE.03";"NULL";"Initialisation de la valeur «DE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3723;1078;1;"Hamburg";"DE.04";"NULL";"Initialisation de la valeur «DE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3724;1078;1;"Hesse";"DE.05";"NULL";"Initialisation de la valeur «DE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3725;1078;1;"Lower Saxony";"DE.06";"NULL";"Initialisation de la valeur «DE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3726;1078;1;"North Rhine-Westphalia";"DE.07";"NULL";"Initialisation de la valeur «DE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3727;1078;1;"Rhineland-Palatinate";"DE.08";"NULL";"Initialisation de la valeur «DE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3728;1078;1;"Saarland";"DE.09";"NULL";"Initialisation de la valeur «DE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3729;1078;1;"Schleswig-Holstein";"DE.10";"NULL";"Initialisation de la valeur «DE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3730;1078;1;"Brandenburg";"DE.11";"NULL";"Initialisation de la valeur «DE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3731;1078;1;"Mecklenburg-Vorpommern";"DE.12";"NULL";"Initialisation de la valeur «DE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3732;1078;1;"Saxony";"DE.13";"NULL";"Initialisation de la valeur «DE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3733;1078;1;"Saxony-Anhalt";"DE.14";"NULL";"Initialisation de la valeur «DE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3734;1078;1;"Thuringia";"DE.15";"NULL";"Initialisation de la valeur «DE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3735;1078;1;"Berlin";"DE.16";"NULL";"Initialisation de la valeur «DE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3736;1078;1;"Djibouti (general)";"DJ.00";"NULL";"Initialisation de la valeur «DJ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3737;1078;1;"Ali Sabieh";"DJ.01";"NULL";"Initialisation de la valeur «DJ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3738;1078;1;"Dikhil ";"DJ.02";"NULL";"Initialisation de la valeur «DJ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3739;1078;1;"Djibouti ";"DJ.03";"NULL";"Initialisation de la valeur «DJ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3740;1078;1;"Obock";"DJ.04";"NULL";"Initialisation de la valeur «DJ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3741;1078;1;"Tadjourah";"DJ.05";"NULL";"Initialisation de la valeur «DJ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3742;1078;1;"Dikhil";"DJ.06";"NULL";"Initialisation de la valeur «DJ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3743;1078;1;"Djibouti";"DJ.07";"NULL";"Initialisation de la valeur «DJ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3744;1078;1;"Arta";"DJ.08";"NULL";"Initialisation de la valeur «DJ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3745;1078;1;"Århus";"DK.01";"NULL";"Initialisation de la valeur «DK.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3746;1078;1;"Bornholm";"DK.02";"NULL";"Initialisation de la valeur «DK.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3747;1078;1;"Frederiksborg";"DK.03";"NULL";"Initialisation de la valeur «DK.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3748;1078;1;"Fyn";"DK.04";"NULL";"Initialisation de la valeur «DK.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3749;1078;1;"Copenhagen city";"DK.05";"NULL";"Initialisation de la valeur «DK.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3750;1078;1;"København";"DK.06";"NULL";"Initialisation de la valeur «DK.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3751;1078;1;"Nordjylland";"DK.07";"NULL";"Initialisation de la valeur «DK.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3752;1078;1;"Ribe";"DK.08";"NULL";"Initialisation de la valeur «DK.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3753;1078;1;"Ringkøbing";"DK.09";"NULL";"Initialisation de la valeur «DK.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3754;1078;1;"Roskilde";"DK.10";"NULL";"Initialisation de la valeur «DK.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3755;1078;1;"Sønderjylland";"DK.11";"NULL";"Initialisation de la valeur «DK.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3756;1078;1;"Storstrøm";"DK.12";"NULL";"Initialisation de la valeur «DK.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3757;1078;1;"Vejle";"DK.13";"NULL";"Initialisation de la valeur «DK.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3758;1078;1;"Vestsjælland";"DK.14";"NULL";"Initialisation de la valeur «DK.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3759;1078;1;"Viborg";"DK.15";"NULL";"Initialisation de la valeur «DK.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3760;1078;1;"Fredriksberg";"DK.16";"NULL";"Initialisation de la valeur «DK.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3761;1078;1;"Capital Region";"DK.17";"NULL";"Initialisation de la valeur «DK.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3762;1078;1;"Central Jutland";"DK.18";"NULL";"Initialisation de la valeur «DK.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3763;1078;1;"North Jutland";"DK.19";"NULL";"Initialisation de la valeur «DK.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3764;1078;1;"Region Zealand";"DK.20";"NULL";"Initialisation de la valeur «DK.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3765;1078;1;"Region South Denmark";"DK.21";"NULL";"Initialisation de la valeur «DK.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3766;1078;1;"Dominica (general)";"DM.00";"NULL";"Initialisation de la valeur «DM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3767;1078;1;"Saint Andrew";"DM.02";"NULL";"Initialisation de la valeur «DM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3768;1078;1;"Saint David";"DM.03";"NULL";"Initialisation de la valeur «DM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3769;1078;1;"Saint George";"DM.04";"NULL";"Initialisation de la valeur «DM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3770;1078;1;"Saint John";"DM.05";"NULL";"Initialisation de la valeur «DM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3771;1078;1;"Saint Joseph";"DM.06";"NULL";"Initialisation de la valeur «DM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3772;1078;1;"Saint Luke";"DM.07";"NULL";"Initialisation de la valeur «DM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3773;1078;1;"Saint Mark";"DM.08";"NULL";"Initialisation de la valeur «DM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3774;1078;1;"Saint Patrick";"DM.09";"NULL";"Initialisation de la valeur «DM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3775;1078;1;"Saint Paul";"DM.10";"NULL";"Initialisation de la valeur «DM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3776;1078;1;"Saint Peter";"DM.11";"NULL";"Initialisation de la valeur «DM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3777;1078;1;"Dominican Republic (general)";"DO.00";"NULL";"Initialisation de la valeur «DO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3778;1078;1;"Azua";"DO.01";"NULL";"Initialisation de la valeur «DO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3779;1078;1;"Baoruco";"DO.02";"NULL";"Initialisation de la valeur «DO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3780;1078;1;"Barahona";"DO.03";"NULL";"Initialisation de la valeur «DO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3781;1078;1;"Dajabón";"DO.04";"NULL";"Initialisation de la valeur «DO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3782;1078;1;"Duarte";"DO.06";"NULL";"Initialisation de la valeur «DO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3783;1078;1;"Espaillat";"DO.08";"NULL";"Initialisation de la valeur «DO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3784;1078;1;"Independencia";"DO.09";"NULL";"Initialisation de la valeur «DO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3785;1078;1;"La Altagracia";"DO.10";"NULL";"Initialisation de la valeur «DO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3786;1078;1;"Elías Piña";"DO.11";"NULL";"Initialisation de la valeur «DO.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3787;1078;1;"La Romana";"DO.12";"NULL";"Initialisation de la valeur «DO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3788;1078;1;"María Trinidad Sánchez";"DO.14";"NULL";"Initialisation de la valeur «DO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3789;1078;1;"Monte Cristi";"DO.15";"NULL";"Initialisation de la valeur «DO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3790;1078;1;"Pedernales";"DO.16";"NULL";"Initialisation de la valeur «DO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3791;1078;1;"Puerto Plata";"DO.18";"NULL";"Initialisation de la valeur «DO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3792;1078;1;"Salcedo";"DO.19";"NULL";"Initialisation de la valeur «DO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3793;1078;1;"Samaná";"DO.20";"NULL";"Initialisation de la valeur «DO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3794;1078;1;"Sánchez Ramírez";"DO.21";"NULL";"Initialisation de la valeur «DO.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3795;1078;1;"San Juan";"DO.23";"NULL";"Initialisation de la valeur «DO.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3796;1078;1;"San Pedro de Macorís";"DO.24";"NULL";"Initialisation de la valeur «DO.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3797;1078;1;"Santiago";"DO.25";"NULL";"Initialisation de la valeur «DO.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3798;1078;1;"Santiago Rodríguez";"DO.26";"NULL";"Initialisation de la valeur «DO.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3799;1078;1;"Valverde";"DO.27";"NULL";"Initialisation de la valeur «DO.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3800;1078;1;"El Seíbo";"DO.28";"NULL";"Initialisation de la valeur «DO.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3801;1078;1;"Hato Mayor";"DO.29";"NULL";"Initialisation de la valeur «DO.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3802;1078;1;"La Vega";"DO.30";"NULL";"Initialisation de la valeur «DO.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3803;1078;1;"Monseñor Nouel";"DO.31";"NULL";"Initialisation de la valeur «DO.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3804;1078;1;"Monte Plata";"DO.32";"NULL";"Initialisation de la valeur «DO.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3805;1078;1;"San Cristóbal";"DO.33";"NULL";"Initialisation de la valeur «DO.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3806;1078;1;"Distrito Nacional";"DO.34";"NULL";"Initialisation de la valeur «DO.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3807;1078;1;"Peravia";"DO.35";"NULL";"Initialisation de la valeur «DO.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3808;1078;1;"Provincia de San José de Ocoa";"DO.36";"NULL";"Initialisation de la valeur «DO.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3809;1078;1;"Provincia de Santo Domingo";"DO.37";"NULL";"Initialisation de la valeur «DO.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3810;1078;1;"Algeria (general)";"DZ.00";"NULL";"Initialisation de la valeur «DZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3811;1078;1;"Alger";"DZ.01";"NULL";"Initialisation de la valeur «DZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3812;1078;1;"Batna";"DZ.03";"NULL";"Initialisation de la valeur «DZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3813;1078;1;"Constantine";"DZ.04";"NULL";"Initialisation de la valeur «DZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3814;1078;1;"Médéa";"DZ.06";"NULL";"Initialisation de la valeur «DZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3815;1078;1;"Mostaganem";"DZ.07";"NULL";"Initialisation de la valeur «DZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3816;1078;1;"Oran";"DZ.09";"NULL";"Initialisation de la valeur «DZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3817;1078;1;"Saïda";"DZ.10";"NULL";"Initialisation de la valeur «DZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3818;1078;1;"Sétif";"DZ.12";"NULL";"Initialisation de la valeur «DZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3819;1078;1;"Tiaret";"DZ.13";"NULL";"Initialisation de la valeur «DZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3820;1078;1;"Tizi Ouzou";"DZ.14";"NULL";"Initialisation de la valeur «DZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3821;1078;1;"Tlemcen";"DZ.15";"NULL";"Initialisation de la valeur «DZ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3822;1078;1;"Bejaïa";"DZ.18";"NULL";"Initialisation de la valeur «DZ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3823;1078;1;"Biskra";"DZ.19";"NULL";"Initialisation de la valeur «DZ.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3824;1078;1;"Blida";"DZ.20";"NULL";"Initialisation de la valeur «DZ.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3825;1078;1;"Bouira";"DZ.21";"NULL";"Initialisation de la valeur «DZ.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3826;1078;1;"Djelfa";"DZ.22";"NULL";"Initialisation de la valeur «DZ.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3827;1078;1;"Guelma";"DZ.23";"NULL";"Initialisation de la valeur «DZ.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3828;1078;1;"Jijel";"DZ.24";"NULL";"Initialisation de la valeur «DZ.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3829;1078;1;"Laghouat";"DZ.25";"NULL";"Initialisation de la valeur «DZ.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3830;1078;1;"Mascara";"DZ.26";"NULL";"Initialisation de la valeur «DZ.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3831;1078;1;"Mʼsila";"DZ.27";"NULL";"Initialisation de la valeur «DZ.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3832;1078;1;"Oum el Bouaghi";"DZ.29";"NULL";"Initialisation de la valeur «DZ.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3833;1078;1;"Sidi Bel Abbès";"DZ.30";"NULL";"Initialisation de la valeur «DZ.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3834;1078;1;"Skikda";"DZ.31";"NULL";"Initialisation de la valeur «DZ.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3835;1078;1;"Tébessa";"DZ.33";"NULL";"Initialisation de la valeur «DZ.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3836;1078;1;"Adrar";"DZ.34";"NULL";"Initialisation de la valeur «DZ.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3837;1078;1;"Aïn Defla";"DZ.35";"NULL";"Initialisation de la valeur «DZ.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3838;1078;1;"Aïn Temouchent";"DZ.36";"NULL";"Initialisation de la valeur «DZ.36» pour la liste «75».";2009-07-29 00:00:00;1;1
3839;1078;1;"Annaba";"DZ.37";"NULL";"Initialisation de la valeur «DZ.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3840;1078;1;"Béchar";"DZ.38";"NULL";"Initialisation de la valeur «DZ.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3841;1078;1;"Bordj Bou Arréridj";"DZ.39";"NULL";"Initialisation de la valeur «DZ.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3842;1078;1;"Boumerdes";"DZ.40";"NULL";"Initialisation de la valeur «DZ.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3843;1078;1;"Chlef";"DZ.41";"NULL";"Initialisation de la valeur «DZ.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3844;1078;1;"El Bayadh";"DZ.42";"NULL";"Initialisation de la valeur «DZ.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3845;1078;1;"El Oued";"DZ.43";"NULL";"Initialisation de la valeur «DZ.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3846;1078;1;"El Tarf";"DZ.44";"NULL";"Initialisation de la valeur «DZ.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3847;1078;1;"Ghardaïa";"DZ.45";"NULL";"Initialisation de la valeur «DZ.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3848;1078;1;"Illizi";"DZ.46";"NULL";"Initialisation de la valeur «DZ.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3849;1078;1;"Khenchela";"DZ.47";"NULL";"Initialisation de la valeur «DZ.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3850;1078;1;"Mila";"DZ.48";"NULL";"Initialisation de la valeur «DZ.48» pour la liste «75».";2009-07-29 00:00:00;1;1
3851;1078;1;"Naama النعامة";"DZ.49";"NULL";"Initialisation de la valeur «DZ.49» pour la liste «75».";2009-07-29 00:00:00;1;1
3852;1078;1;"Ouargla";"DZ.50";"NULL";"Initialisation de la valeur «DZ.50» pour la liste «75».";2009-07-29 00:00:00;1;1
3853;1078;1;"Relizane";"DZ.51";"NULL";"Initialisation de la valeur «DZ.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3854;1078;1;"Souk Ahras";"DZ.52";"NULL";"Initialisation de la valeur «DZ.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3855;1078;1;"Tamanghasset";"DZ.53";"NULL";"Initialisation de la valeur «DZ.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3856;1078;1;"Tindouf";"DZ.54";"NULL";"Initialisation de la valeur «DZ.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3857;1078;1;"Tipaza";"DZ.55";"NULL";"Initialisation de la valeur «DZ.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3858;1078;1;"Tissemsilt";"DZ.56";"NULL";"Initialisation de la valeur «DZ.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3859;1078;1;"Ecuador (general)";"EC.00";"NULL";"Initialisation de la valeur «EC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3860;1078;1;"Galápagos";"EC.01";"NULL";"Initialisation de la valeur «EC.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3861;1078;1;"Azuay";"EC.02";"NULL";"Initialisation de la valeur «EC.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3862;1078;1;"Bolívar";"EC.03";"NULL";"Initialisation de la valeur «EC.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3863;1078;1;"Cañar";"EC.04";"NULL";"Initialisation de la valeur «EC.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3864;1078;1;"Carchi";"EC.05";"NULL";"Initialisation de la valeur «EC.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3865;1078;1;"Chimborazo";"EC.06";"NULL";"Initialisation de la valeur «EC.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3866;1078;1;"Cotopaxi";"EC.07";"NULL";"Initialisation de la valeur «EC.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3867;1078;1;"El Oro";"EC.08";"NULL";"Initialisation de la valeur «EC.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3868;1078;1;"Esmeraldas";"EC.09";"NULL";"Initialisation de la valeur «EC.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3869;1078;1;"Guayas";"EC.10";"NULL";"Initialisation de la valeur «EC.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3870;1078;1;"Imbabura";"EC.11";"NULL";"Initialisation de la valeur «EC.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3871;1078;1;"Loja";"EC.12";"NULL";"Initialisation de la valeur «EC.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3872;1078;1;"Los Ríos";"EC.13";"NULL";"Initialisation de la valeur «EC.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3873;1078;1;"Manabí";"EC.14";"NULL";"Initialisation de la valeur «EC.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3874;1078;1;"Morona-Santiago";"EC.15";"NULL";"Initialisation de la valeur «EC.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3875;1078;1;"Napo";"EC.16";"NULL";"Initialisation de la valeur «EC.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3876;1078;1;"Pastaza";"EC.17";"NULL";"Initialisation de la valeur «EC.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3877;1078;1;"Pichincha";"EC.18";"NULL";"Initialisation de la valeur «EC.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3878;1078;1;"Tungurahua";"EC.19";"NULL";"Initialisation de la valeur «EC.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3879;1078;1;"Zamora-Chinchipe";"EC.20";"NULL";"Initialisation de la valeur «EC.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3880;1078;1;"Sucumbios";"EC.22";"NULL";"Initialisation de la valeur «EC.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3881;1078;1;"Napo";"EC.23";"NULL";"Initialisation de la valeur «EC.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3882;1078;1;"Orellana";"EC.24";"NULL";"Initialisation de la valeur «EC.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3883;1078;1;"Estonia (general)";"EE.00";"NULL";"Initialisation de la valeur «EE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3884;1078;1;"Harjumaa";"EE.01";"NULL";"Initialisation de la valeur «EE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3885;1078;1;"Hiiumaa";"EE.02";"NULL";"Initialisation de la valeur «EE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3886;1078;1;"Ida-Virumaa";"EE.03";"NULL";"Initialisation de la valeur «EE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3887;1078;1;"Järvamaa";"EE.04";"NULL";"Initialisation de la valeur «EE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3888;1078;1;"Jõgevamaa";"EE.05";"NULL";"Initialisation de la valeur «EE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3889;1078;1;"Läänemaa";"EE.07";"NULL";"Initialisation de la valeur «EE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3890;1078;1;"Lääne-Virumaa";"EE.08";"NULL";"Initialisation de la valeur «EE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3891;1078;1;"Pärnumaa";"EE.11";"NULL";"Initialisation de la valeur «EE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3892;1078;1;"Põlvamaa";"EE.12";"NULL";"Initialisation de la valeur «EE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3893;1078;1;"Raplamaa";"EE.13";"NULL";"Initialisation de la valeur «EE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3894;1078;1;"Saaremaa";"EE.14";"NULL";"Initialisation de la valeur «EE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3895;1078;1;"Tartumaa";"EE.18";"NULL";"Initialisation de la valeur «EE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3896;1078;1;"Valgamaa";"EE.19";"NULL";"Initialisation de la valeur «EE.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3897;1078;1;"Viljandimaa";"EE.20";"NULL";"Initialisation de la valeur «EE.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3898;1078;1;"Võrumaa";"EE.21";"NULL";"Initialisation de la valeur «EE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3899;1078;1;"Egypt (general)";"EG.00";"NULL";"Initialisation de la valeur «EG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3900;1078;1;"Ad Daqahlīyah";"EG.01";"NULL";"Initialisation de la valeur «EG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3901;1078;1;"Al Baḩr al Aḩmar";"EG.02";"NULL";"Initialisation de la valeur «EG.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3902;1078;1;"Al Buḩayrah";"EG.03";"NULL";"Initialisation de la valeur «EG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3903;1078;1;"Al Fayyūm";"EG.04";"NULL";"Initialisation de la valeur «EG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3904;1078;1;"Al Gharbīyah";"EG.05";"NULL";"Initialisation de la valeur «EG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3905;1078;1;"Alexandria";"EG.06";"NULL";"Initialisation de la valeur «EG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3906;1078;1;"Al Ismā‘īlīyah";"EG.07";"NULL";"Initialisation de la valeur «EG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3907;1078;1;"Al Jīzah";"EG.08";"NULL";"Initialisation de la valeur «EG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3908;1078;1;"Al Minūfīyah";"EG.09";"NULL";"Initialisation de la valeur «EG.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3909;1078;1;"Al Minyā";"EG.10";"NULL";"Initialisation de la valeur «EG.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3910;1078;1;"Al Qāhirah";"EG.11";"NULL";"Initialisation de la valeur «EG.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3911;1078;1;"Al Qalyūbīyah";"EG.12";"NULL";"Initialisation de la valeur «EG.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3912;1078;1;"Al Wādī al Jadīd";"EG.13";"NULL";"Initialisation de la valeur «EG.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3913;1078;1;"Eastern Province";"EG.14";"NULL";"Initialisation de la valeur «EG.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3914;1078;1;"As Suways";"EG.15";"NULL";"Initialisation de la valeur «EG.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3915;1078;1;"Aswān";"EG.16";"NULL";"Initialisation de la valeur «EG.16» pour la liste «75».";2009-07-29 00:00:00;1;1
3916;1078;1;"Asyūţ";"EG.17";"NULL";"Initialisation de la valeur «EG.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3917;1078;1;"Banī Suwayf";"EG.18";"NULL";"Initialisation de la valeur «EG.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3918;1078;1;"Būr Sa‘īd";"EG.19";"NULL";"Initialisation de la valeur «EG.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3919;1078;1;"Dumyāţ";"EG.20";"NULL";"Initialisation de la valeur «EG.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3920;1078;1;"Kafr ash Shaykh";"EG.21";"NULL";"Initialisation de la valeur «EG.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3921;1078;1;"Maţrūḩ";"EG.22";"NULL";"Initialisation de la valeur «EG.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3922;1078;1;"Qinā";"EG.23";"NULL";"Initialisation de la valeur «EG.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3923;1078;1;"Sūhāj";"EG.24";"NULL";"Initialisation de la valeur «EG.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3924;1078;1;"Janūb Sīnāʼ";"EG.26";"NULL";"Initialisation de la valeur «EG.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3925;1078;1;"Shamāl Sīnāʼ";"EG.27";"NULL";"Initialisation de la valeur «EG.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3926;1078;1;"Western Sahara (general)";"EH.00";"NULL";"Initialisation de la valeur «EH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3927;1078;1;"Eritrea (general)";"ER.00";"NULL";"Initialisation de la valeur «ER.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3928;1078;1;"Ānseba";"ER.01";"NULL";"Initialisation de la valeur «ER.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3929;1078;1;"Debub";"ER.02";"NULL";"Initialisation de la valeur «ER.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3930;1078;1;"Debubawī Kʼeyih Bahrī";"ER.03";"NULL";"Initialisation de la valeur «ER.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3931;1078;1;"Gash Barka";"ER.04";"NULL";"Initialisation de la valeur «ER.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3932;1078;1;"Maʼākel";"ER.05";"NULL";"Initialisation de la valeur «ER.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3933;1078;1;"Semēnawī Kʼeyih Bahrī";"ER.06";"NULL";"Initialisation de la valeur «ER.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3934;1078;1;"Ceuta";"ES.00";"NULL";"Initialisation de la valeur «ES.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3935;1078;1;"Balearic Islands";"ES.07";"NULL";"Initialisation de la valeur «ES.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3936;1078;1;"La Rioja";"ES.27";"NULL";"Initialisation de la valeur «ES.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3937;1078;1;"(SP28)";"ES.28";"NULL";"Initialisation de la valeur «ES.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3938;1078;1;"Autonomous Region of Madrid";"ES.29";"NULL";"Initialisation de la valeur «ES.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3939;1078;1;"Murcia";"ES.31";"NULL";"Initialisation de la valeur «ES.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3940;1078;1;"Navarre";"ES.32";"NULL";"Initialisation de la valeur «ES.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3941;1078;1;"Asturias";"ES.34";"NULL";"Initialisation de la valeur «ES.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3942;1078;1;"Cantabria";"ES.39";"NULL";"Initialisation de la valeur «ES.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3943;1078;1;"Andalusia";"ES.51";"NULL";"Initialisation de la valeur «ES.51» pour la liste «75».";2009-07-29 00:00:00;1;1
3944;1078;1;"Aragon";"ES.52";"NULL";"Initialisation de la valeur «ES.52» pour la liste «75».";2009-07-29 00:00:00;1;1
3945;1078;1;"Canary Islands";"ES.53";"NULL";"Initialisation de la valeur «ES.53» pour la liste «75».";2009-07-29 00:00:00;1;1
3946;1078;1;"Castille-La Mancha";"ES.54";"NULL";"Initialisation de la valeur «ES.54» pour la liste «75».";2009-07-29 00:00:00;1;1
3947;1078;1;"Castille and León";"ES.55";"NULL";"Initialisation de la valeur «ES.55» pour la liste «75».";2009-07-29 00:00:00;1;1
3948;1078;1;"Catalonia";"ES.56";"NULL";"Initialisation de la valeur «ES.56» pour la liste «75».";2009-07-29 00:00:00;1;1
3949;1078;1;"Estremadura";"ES.57";"NULL";"Initialisation de la valeur «ES.57» pour la liste «75».";2009-07-29 00:00:00;1;1
3950;1078;1;"Galicia";"ES.58";"NULL";"Initialisation de la valeur «ES.58» pour la liste «75».";2009-07-29 00:00:00;1;1
3951;1078;1;"Basque Country";"ES.59";"NULL";"Initialisation de la valeur «ES.59» pour la liste «75».";2009-07-29 00:00:00;1;1
3952;1078;1;"Valencia";"ES.60";"NULL";"Initialisation de la valeur «ES.60» pour la liste «75».";2009-07-29 00:00:00;1;1
3953;1078;1;"Ethiopia (general)";"ET.00";"NULL";"Initialisation de la valeur «ET.00» pour la liste «75».";2009-07-29 00:00:00;1;1
3954;1078;1;"Arsi";"ET.01";"NULL";"Initialisation de la valeur «ET.01» pour la liste «75».";2009-07-29 00:00:00;1;1
3955;1078;1;"Gonder";"ET.02";"NULL";"Initialisation de la valeur «ET.02» pour la liste «75».";2009-07-29 00:00:00;1;1
3956;1078;1;"Bale";"ET.03";"NULL";"Initialisation de la valeur «ET.03» pour la liste «75».";2009-07-29 00:00:00;1;1
3957;1078;1;"Eritrea";"ET.04";"NULL";"Initialisation de la valeur «ET.04» pour la liste «75».";2009-07-29 00:00:00;1;1
3958;1078;1;"Gamo Gofa";"ET.05";"NULL";"Initialisation de la valeur «ET.05» pour la liste «75».";2009-07-29 00:00:00;1;1
3959;1078;1;"Gojam";"ET.06";"NULL";"Initialisation de la valeur «ET.06» pour la liste «75».";2009-07-29 00:00:00;1;1
3960;1078;1;"Harerge";"ET.07";"NULL";"Initialisation de la valeur «ET.07» pour la liste «75».";2009-07-29 00:00:00;1;1
3961;1078;1;"Ilubabor";"ET.08";"NULL";"Initialisation de la valeur «ET.08» pour la liste «75».";2009-07-29 00:00:00;1;1
3962;1078;1;"Kefa";"ET.09";"NULL";"Initialisation de la valeur «ET.09» pour la liste «75».";2009-07-29 00:00:00;1;1
3963;1078;1;"Addis Abeba";"ET.10";"NULL";"Initialisation de la valeur «ET.10» pour la liste «75».";2009-07-29 00:00:00;1;1
3964;1078;1;"Sidamo";"ET.11";"NULL";"Initialisation de la valeur «ET.11» pour la liste «75».";2009-07-29 00:00:00;1;1
3965;1078;1;"Tigray";"ET.12";"NULL";"Initialisation de la valeur «ET.12» pour la liste «75».";2009-07-29 00:00:00;1;1
3966;1078;1;"Welega Kifle Hāger";"ET.13";"NULL";"Initialisation de la valeur «ET.13» pour la liste «75».";2009-07-29 00:00:00;1;1
3967;1078;1;"Welo";"ET.14";"NULL";"Initialisation de la valeur «ET.14» pour la liste «75».";2009-07-29 00:00:00;1;1
3968;1078;1;"Adis Abeba";"ET.15";"NULL";"Initialisation de la valeur «ET.15» pour la liste «75».";2009-07-29 00:00:00;1;1
3969;1078;1;"Asosa";"ET.17";"NULL";"Initialisation de la valeur «ET.17» pour la liste «75».";2009-07-29 00:00:00;1;1
3970;1078;1;"Borena ";"ET.18";"NULL";"Initialisation de la valeur «ET.18» pour la liste «75».";2009-07-29 00:00:00;1;1
3971;1078;1;"Debub Gonder";"ET.19";"NULL";"Initialisation de la valeur «ET.19» pour la liste «75».";2009-07-29 00:00:00;1;1
3972;1078;1;"Debub Shewa";"ET.20";"NULL";"Initialisation de la valeur «ET.20» pour la liste «75».";2009-07-29 00:00:00;1;1
3973;1078;1;"Debub Welo";"ET.21";"NULL";"Initialisation de la valeur «ET.21» pour la liste «75».";2009-07-29 00:00:00;1;1
3974;1078;1;"Dire Dawa";"ET.22";"NULL";"Initialisation de la valeur «ET.22» pour la liste «75».";2009-07-29 00:00:00;1;1
3975;1078;1;"Gambela";"ET.23";"NULL";"Initialisation de la valeur «ET.23» pour la liste «75».";2009-07-29 00:00:00;1;1
3976;1078;1;"Metekel";"ET.24";"NULL";"Initialisation de la valeur «ET.24» pour la liste «75».";2009-07-29 00:00:00;1;1
3977;1078;1;"Mirab Gojam";"ET.25";"NULL";"Initialisation de la valeur «ET.25» pour la liste «75».";2009-07-29 00:00:00;1;1
3978;1078;1;"Mirab Harerge";"ET.26";"NULL";"Initialisation de la valeur «ET.26» pour la liste «75».";2009-07-29 00:00:00;1;1
3979;1078;1;"Mirab Shewa";"ET.27";"NULL";"Initialisation de la valeur «ET.27» pour la liste «75».";2009-07-29 00:00:00;1;1
3980;1078;1;"Misrak Gojam";"ET.28";"NULL";"Initialisation de la valeur «ET.28» pour la liste «75».";2009-07-29 00:00:00;1;1
3981;1078;1;"Misrak Harerge";"ET.29";"NULL";"Initialisation de la valeur «ET.29» pour la liste «75».";2009-07-29 00:00:00;1;1
3982;1078;1;"Nazret";"ET.30";"NULL";"Initialisation de la valeur «ET.30» pour la liste «75».";2009-07-29 00:00:00;1;1
3983;1078;1;"Ogaden";"ET.31";"NULL";"Initialisation de la valeur «ET.31» pour la liste «75».";2009-07-29 00:00:00;1;1
3984;1078;1;"Omo";"ET.32";"NULL";"Initialisation de la valeur «ET.32» pour la liste «75».";2009-07-29 00:00:00;1;1
3985;1078;1;"Semen Gonder";"ET.33";"NULL";"Initialisation de la valeur «ET.33» pour la liste «75».";2009-07-29 00:00:00;1;1
3986;1078;1;"Semen Shewa";"ET.34";"NULL";"Initialisation de la valeur «ET.34» pour la liste «75».";2009-07-29 00:00:00;1;1
3987;1078;1;"Semen Welo";"ET.35";"NULL";"Initialisation de la valeur «ET.35» pour la liste «75».";2009-07-29 00:00:00;1;1
3988;1078;1;"Tigray";"ET.37";"NULL";"Initialisation de la valeur «ET.37» pour la liste «75».";2009-07-29 00:00:00;1;1
3989;1078;1;"Bale";"ET.38";"NULL";"Initialisation de la valeur «ET.38» pour la liste «75».";2009-07-29 00:00:00;1;1
3990;1078;1;"Gamo Gofa";"ET.39";"NULL";"Initialisation de la valeur «ET.39» pour la liste «75».";2009-07-29 00:00:00;1;1
3991;1078;1;"Ilubabor";"ET.40";"NULL";"Initialisation de la valeur «ET.40» pour la liste «75».";2009-07-29 00:00:00;1;1
3992;1078;1;"Kefa";"ET.41";"NULL";"Initialisation de la valeur «ET.41» pour la liste «75».";2009-07-29 00:00:00;1;1
3993;1078;1;"Sidamo";"ET.42";"NULL";"Initialisation de la valeur «ET.42» pour la liste «75».";2009-07-29 00:00:00;1;1
3994;1078;1;"Welega";"ET.43";"NULL";"Initialisation de la valeur «ET.43» pour la liste «75».";2009-07-29 00:00:00;1;1
3995;1078;1;"Ādīs Ābeba";"ET.44";"NULL";"Initialisation de la valeur «ET.44» pour la liste «75».";2009-07-29 00:00:00;1;1
3996;1078;1;"Āfar";"ET.45";"NULL";"Initialisation de la valeur «ET.45» pour la liste «75».";2009-07-29 00:00:00;1;1
3997;1078;1;"Āmara";"ET.46";"NULL";"Initialisation de la valeur «ET.46» pour la liste «75».";2009-07-29 00:00:00;1;1
3998;1078;1;"Bīnshangul Gumuz";"ET.47";"NULL";"Initialisation de la valeur «ET.47» pour la liste «75».";2009-07-29 00:00:00;1;1
3999;1078;1;"Dirē Dawa";"ET.48";"NULL";"Initialisation de la valeur «ET.48» pour la liste «75».";2009-07-29 00:00:00;1;1
4000;1078;1;"Gambēla Hizboch";"ET.49";"NULL";"Initialisation de la valeur «ET.49» pour la liste «75».";2009-07-29 00:00:00;1;1
4001;1078;1;"Hārerī Hizb";"ET.50";"NULL";"Initialisation de la valeur «ET.50» pour la liste «75».";2009-07-29 00:00:00;1;1
4002;1078;1;"Oromīya";"ET.51";"NULL";"Initialisation de la valeur «ET.51» pour la liste «75».";2009-07-29 00:00:00;1;1
4003;1078;1;"Sumalē";"ET.52";"NULL";"Initialisation de la valeur «ET.52» pour la liste «75».";2009-07-29 00:00:00;1;1
4004;1078;1;"Tigray";"ET.53";"NULL";"Initialisation de la valeur «ET.53» pour la liste «75».";2009-07-29 00:00:00;1;1
4005;1078;1;"YeDebub Bihēroch Bihēreseboch na Hizboch";"ET.54";"NULL";"Initialisation de la valeur «ET.54» pour la liste «75».";2009-07-29 00:00:00;1;1
4006;1078;1;"Finland (general)";"FI.00";"NULL";"Initialisation de la valeur «FI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4007;1078;1;"Åland";"FI.01";"NULL";"Initialisation de la valeur «FI.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4008;1078;1;"Hame";"FI.02";"NULL";"Initialisation de la valeur «FI.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4009;1078;1;"Keski-Suomi";"FI.03";"NULL";"Initialisation de la valeur «FI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4010;1078;1;"Kuopio";"FI.04";"NULL";"Initialisation de la valeur «FI.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4011;1078;1;"Kymi";"FI.05";"NULL";"Initialisation de la valeur «FI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4012;1078;1;"Lapponia";"FI.06";"NULL";"Initialisation de la valeur «FI.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4013;1078;1;"Mikkeli";"FI.07";"NULL";"Initialisation de la valeur «FI.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4014;1078;1;"Oulu";"FI.08";"NULL";"Initialisation de la valeur «FI.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4015;1078;1;"Pohjois-Karjala";"FI.09";"NULL";"Initialisation de la valeur «FI.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4016;1078;1;"Turku ja Pori";"FI.10";"NULL";"Initialisation de la valeur «FI.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4017;1078;1;"Uusimaa";"FI.11";"NULL";"Initialisation de la valeur «FI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4018;1078;1;"Vaasa";"FI.12";"NULL";"Initialisation de la valeur «FI.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4019;1078;1;"Southern Finland";"FI.13";"NULL";"Initialisation de la valeur «FI.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4020;1078;1;"Eastern Finland";"FI.14";"NULL";"Initialisation de la valeur «FI.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4021;1078;1;"Western Finland";"FI.15";"NULL";"Initialisation de la valeur «FI.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4022;1078;1;"Fiji (general)";"FJ.00";"NULL";"Initialisation de la valeur «FJ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4023;1078;1;"Central";"FJ.01";"NULL";"Initialisation de la valeur «FJ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4024;1078;1;"Eastern";"FJ.02";"NULL";"Initialisation de la valeur «FJ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4025;1078;1;"Northern";"FJ.03";"NULL";"Initialisation de la valeur «FJ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4026;1078;1;"Rotuma";"FJ.04";"NULL";"Initialisation de la valeur «FJ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4027;1078;1;"Western";"FJ.05";"NULL";"Initialisation de la valeur «FJ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4028;1078;1;"Falkland Islands (Islas Malvinas) (general)";"FK.00";"NULL";"Initialisation de la valeur «FK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4029;1078;1;"Micronesia, Federated States of (general)";"FM.00";"NULL";"Initialisation de la valeur «FM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4030;1078;1;"Kosrae";"FM.01";"NULL";"Initialisation de la valeur «FM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4031;1078;1;"Pohnpei";"FM.02";"NULL";"Initialisation de la valeur «FM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4032;1078;1;"Chuuk";"FM.03";"NULL";"Initialisation de la valeur «FM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4033;1078;1;"Yap";"FM.04";"NULL";"Initialisation de la valeur «FM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4034;1078;1;;"FM.FM";"NULL";"Initialisation de la valeur «FM.FM» pour la liste «75».";2009-07-29 00:00:00;1;1
4035;1078;1;"Norðoya Sýsla";"FO.NO";"NULL";"Initialisation de la valeur «FO.NO» pour la liste «75».";2009-07-29 00:00:00;1;1
4036;1078;1;"Eysturoyar Sýsla";"FO.OS";"NULL";"Initialisation de la valeur «FO.OS» pour la liste «75».";2009-07-29 00:00:00;1;1
4037;1078;1;"Sandoyar Sýsla";"FO.SA";"NULL";"Initialisation de la valeur «FO.SA» pour la liste «75».";2009-07-29 00:00:00;1;1
4038;1078;1;"Streymoyar Sýsla";"FO.ST";"NULL";"Initialisation de la valeur «FO.ST» pour la liste «75».";2009-07-29 00:00:00;1;1
4039;1078;1;"Suðuroyar Sunnara Sýsla";"FO.SU";"NULL";"Initialisation de la valeur «FO.SU» pour la liste «75».";2009-07-29 00:00:00;1;1
4040;1078;1;"Vága Sýsla";"FO.VG";"NULL";"Initialisation de la valeur «FO.VG» pour la liste «75».";2009-07-29 00:00:00;1;1
4041;1078;1;"France (general)";"FR.00";"NULL";"Initialisation de la valeur «FR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4042;1078;1;"Aquitaine";"FR.97";"NULL";"Initialisation de la valeur «FR.97» pour la liste «75».";2009-07-29 00:00:00;1;1
4043;1078;1;"Auvergne";"FR.98";"NULL";"Initialisation de la valeur «FR.98» pour la liste «75».";2009-07-29 00:00:00;1;1
4044;1078;1;"Basse-Normandie";"FR.99";"NULL";"Initialisation de la valeur «FR.99» pour la liste «75».";2009-07-29 00:00:00;1;1
4045;1078;1;"Bourgogne";"FR.A1";"NULL";"Initialisation de la valeur «FR.A1» pour la liste «75».";2009-07-29 00:00:00;1;1
4046;1078;1;"Brittany";"FR.A2";"NULL";"Initialisation de la valeur «FR.A2» pour la liste «75».";2009-07-29 00:00:00;1;1
4047;1078;1;"Centre";"FR.A3";"NULL";"Initialisation de la valeur «FR.A3» pour la liste «75».";2009-07-29 00:00:00;1;1
4048;1078;1;"Champagne-Ardenne";"FR.A4";"NULL";"Initialisation de la valeur «FR.A4» pour la liste «75».";2009-07-29 00:00:00;1;1
4049;1078;1;"Corsica";"FR.A5";"NULL";"Initialisation de la valeur «FR.A5» pour la liste «75».";2009-07-29 00:00:00;1;1
4050;1078;1;"Franche-Comté";"FR.A6";"NULL";"Initialisation de la valeur «FR.A6» pour la liste «75».";2009-07-29 00:00:00;1;1
4051;1078;1;"Haute-Normandie";"FR.A7";"NULL";"Initialisation de la valeur «FR.A7» pour la liste «75».";2009-07-29 00:00:00;1;1
4052;1078;1;"Île-de-France";"FR.A8";"NULL";"Initialisation de la valeur «FR.A8» pour la liste «75».";2009-07-29 00:00:00;1;1
4053;1078;1;"Languedoc-Roussillon";"FR.A9";"NULL";"Initialisation de la valeur «FR.A9» pour la liste «75».";2009-07-29 00:00:00;1;1
4054;1078;1;"Limousin";"FR.B1";"NULL";"Initialisation de la valeur «FR.B1» pour la liste «75».";2009-07-29 00:00:00;1;1
4055;1078;1;"Lorraine";"FR.B2";"NULL";"Initialisation de la valeur «FR.B2» pour la liste «75».";2009-07-29 00:00:00;1;1
4056;1078;1;"Midi-Pyrénées";"FR.B3";"NULL";"Initialisation de la valeur «FR.B3» pour la liste «75».";2009-07-29 00:00:00;1;1
4057;1078;1;"Nord-Pas-de-Calais";"FR.B4";"NULL";"Initialisation de la valeur «FR.B4» pour la liste «75».";2009-07-29 00:00:00;1;1
4058;1078;1;"Pays de la Loire";"FR.B5";"NULL";"Initialisation de la valeur «FR.B5» pour la liste «75».";2009-07-29 00:00:00;1;1
4059;1078;1;"Picardie";"FR.B6";"NULL";"Initialisation de la valeur «FR.B6» pour la liste «75».";2009-07-29 00:00:00;1;1
4060;1078;1;"Poitou-Charentes";"FR.B7";"NULL";"Initialisation de la valeur «FR.B7» pour la liste «75».";2009-07-29 00:00:00;1;1
4061;1078;1;"Provence-Alpes-Côte d'Azur";"FR.B8";"NULL";"Initialisation de la valeur «FR.B8» pour la liste «75».";2009-07-29 00:00:00;1;1
4062;1078;1;"Rhône-Alpes";"FR.B9";"NULL";"Initialisation de la valeur «FR.B9» pour la liste «75».";2009-07-29 00:00:00;1;1
4063;1078;1;"Alsace";"FR.C1";"NULL";"Initialisation de la valeur «FR.C1» pour la liste «75».";2009-07-29 00:00:00;1;1
4064;1078;1;"Gabon (general)";"GA.00";"NULL";"Initialisation de la valeur «GA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4065;1078;1;"Estuaire";"GA.01";"NULL";"Initialisation de la valeur «GA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4066;1078;1;"Haut-Ogooué";"GA.02";"NULL";"Initialisation de la valeur «GA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4067;1078;1;"Moyen-Ogooué";"GA.03";"NULL";"Initialisation de la valeur «GA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4068;1078;1;"Ngounié";"GA.04";"NULL";"Initialisation de la valeur «GA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4069;1078;1;"Nyanga";"GA.05";"NULL";"Initialisation de la valeur «GA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4070;1078;1;"Ogooué-Ivindo";"GA.06";"NULL";"Initialisation de la valeur «GA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4071;1078;1;"Ogooué-Lolo";"GA.07";"NULL";"Initialisation de la valeur «GA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4072;1078;1;"Ogooué-Maritime";"GA.08";"NULL";"Initialisation de la valeur «GA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4073;1078;1;"Woleu-Ntem";"GA.09";"NULL";"Initialisation de la valeur «GA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4074;1078;1;"(UK11)";"GB.11";"NULL";"Initialisation de la valeur «GB.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4075;1078;1;"(UK12)";"GB.12";"NULL";"Initialisation de la valeur «GB.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4076;1078;1;"(UK13)";"GB.13";"NULL";"Initialisation de la valeur «GB.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4077;1078;1;"Greater London";"GB.17";"NULL";"Initialisation de la valeur «GB.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4078;1078;1;"(UK19)";"GB.19";"NULL";"Initialisation de la valeur «GB.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4079;1078;1;"(UK29)";"GB.29";"NULL";"Initialisation de la valeur «GB.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4080;1078;1;"(UK32)";"GB.32";"NULL";"Initialisation de la valeur «GB.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4081;1078;1;"(UK36)";"GB.36";"NULL";"Initialisation de la valeur «GB.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4082;1078;1;"(UK52)";"GB.52";"NULL";"Initialisation de la valeur «GB.52» pour la liste «75».";2009-07-29 00:00:00;1;1
4083;1078;1;"(UK64)";"GB.64";"NULL";"Initialisation de la valeur «GB.64» pour la liste «75».";2009-07-29 00:00:00;1;1
4084;1078;1;"(UK80)";"GB.80";"NULL";"Initialisation de la valeur «GB.80» pour la liste «75».";2009-07-29 00:00:00;1;1
4085;1078;1;"(UK81)";"GB.81";"NULL";"Initialisation de la valeur «GB.81» pour la liste «75».";2009-07-29 00:00:00;1;1
4086;1078;1;"Grampian";"GB.82";"NULL";"Initialisation de la valeur «GB.82» pour la liste «75».";2009-07-29 00:00:00;1;1
4087;1078;1;"(UK83)";"GB.83";"NULL";"Initialisation de la valeur «GB.83» pour la liste «75».";2009-07-29 00:00:00;1;1
4088;1078;1;"Lothian";"GB.84";"NULL";"Initialisation de la valeur «GB.84» pour la liste «75».";2009-07-29 00:00:00;1;1
4089;1078;1;"(UK85)";"GB.85";"NULL";"Initialisation de la valeur «GB.85» pour la liste «75».";2009-07-29 00:00:00;1;1
4090;1078;1;"(UK86)";"GB.86";"NULL";"Initialisation de la valeur «GB.86» pour la liste «75».";2009-07-29 00:00:00;1;1
4091;1078;1;"Strathclyde";"GB.87";"NULL";"Initialisation de la valeur «GB.87» pour la liste «75».";2009-07-29 00:00:00;1;1
4092;1078;1;"Tayside";"GB.88";"NULL";"Initialisation de la valeur «GB.88» pour la liste «75».";2009-07-29 00:00:00;1;1
4093;1078;1;"(UK89)";"GB.89";"NULL";"Initialisation de la valeur «GB.89» pour la liste «75».";2009-07-29 00:00:00;1;1
4094;1078;1;"Clwyd";"GB.90";"NULL";"Initialisation de la valeur «GB.90» pour la liste «75».";2009-07-29 00:00:00;1;1
4095;1078;1;"Dyfed";"GB.91";"NULL";"Initialisation de la valeur «GB.91» pour la liste «75».";2009-07-29 00:00:00;1;1
4096;1078;1;"Gwent";"GB.92";"NULL";"Initialisation de la valeur «GB.92» pour la liste «75».";2009-07-29 00:00:00;1;1
4097;1078;1;"(UK93)";"GB.93";"NULL";"Initialisation de la valeur «GB.93» pour la liste «75».";2009-07-29 00:00:00;1;1
4098;1078;1;"South Glamorgan";"GB.96";"NULL";"Initialisation de la valeur «GB.96» pour la liste «75».";2009-07-29 00:00:00;1;1
4099;1078;1;"Bath and North East Somerset";"GB.A4";"NULL";"Initialisation de la valeur «GB.A4» pour la liste «75».";2009-07-29 00:00:00;1;1
4100;1078;1;"England";"GB.ENG";"NULL";"Initialisation de la valeur «GB.ENG» pour la liste «75».";2009-07-29 00:00:00;1;1
4101;1078;1;"North East Lincolnshire";"GB.J2";"NULL";"Initialisation de la valeur «GB.J2» pour la liste «75».";2009-07-29 00:00:00;1;1
4102;1078;1;"North Lincolnshire";"GB.J3";"NULL";"Initialisation de la valeur «GB.J3» pour la liste «75».";2009-07-29 00:00:00;1;1
4103;1078;1;"North Somerset";"GB.J4";"NULL";"Initialisation de la valeur «GB.J4» pour la liste «75».";2009-07-29 00:00:00;1;1
4104;1078;1;"South Gloucestershire";"GB.M6";"NULL";"Initialisation de la valeur «GB.M6» pour la liste «75».";2009-07-29 00:00:00;1;1
4105;1078;1;"Northern Ireland";"GB.NIR";"NULL";"Initialisation de la valeur «GB.NIR» pour la liste «75».";2009-07-29 00:00:00;1;1
4106;1078;1;"Scotland";"GB.SCT";"NULL";"Initialisation de la valeur «GB.SCT» pour la liste «75».";2009-07-29 00:00:00;1;1
4107;1078;1;"Argyll and Bute";"GB.T8";"NULL";"Initialisation de la valeur «GB.T8» pour la liste «75».";2009-07-29 00:00:00;1;1
4108;1078;1;"Wales";"GB.WLS";"NULL";"Initialisation de la valeur «GB.WLS» pour la liste «75».";2009-07-29 00:00:00;1;1
4109;1078;1;"Grenada (general)";"GD.00";"NULL";"Initialisation de la valeur «GD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4110;1078;1;"Saint Andrew";"GD.01";"NULL";"Initialisation de la valeur «GD.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4111;1078;1;"Saint David";"GD.02";"NULL";"Initialisation de la valeur «GD.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4112;1078;1;"Saint George";"GD.03";"NULL";"Initialisation de la valeur «GD.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4113;1078;1;"Saint John";"GD.04";"NULL";"Initialisation de la valeur «GD.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4114;1078;1;"Saint Mark";"GD.05";"NULL";"Initialisation de la valeur «GD.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4115;1078;1;"Saint Patrick";"GD.06";"NULL";"Initialisation de la valeur «GD.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4116;1078;1;"Abkhazia";"GE.00";"NULL";"Initialisation de la valeur «GE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4117;1078;1;"Ajaria";"GE.04";"NULL";"Initialisation de la valeur «GE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4118;1078;1;"Chʼkhorotsqus Raioni";"GE.15";"NULL";"Initialisation de la valeur «GE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4119;1078;1;"Martvilis Raioni";"GE.36";"NULL";"Initialisation de la valeur «GE.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4120;1078;1;"T'bilisi";"GE.51";"NULL";"Initialisation de la valeur «GE.51» pour la liste «75».";2009-07-29 00:00:00;1;1
4121;1078;1;"Zugdidis Raioni";"GE.64";"NULL";"Initialisation de la valeur «GE.64» pour la liste «75».";2009-07-29 00:00:00;1;1
4122;1078;1;"Guyane";"GF.GF";"NULL";"Initialisation de la valeur «GF.GF» pour la liste «75».";2009-07-29 00:00:00;1;1
4123;1078;1;"Guernsey (general)";"GG.00";"NULL";"Initialisation de la valeur «GG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4124;1078;1;"Ghana (general)";"GH.00";"NULL";"Initialisation de la valeur «GH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4125;1078;1;"Greater Accra";"GH.01";"NULL";"Initialisation de la valeur «GH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4126;1078;1;"Ashanti";"GH.02";"NULL";"Initialisation de la valeur «GH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4127;1078;1;"Brong-Ahafo Region";"GH.03";"NULL";"Initialisation de la valeur «GH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4128;1078;1;"Central";"GH.04";"NULL";"Initialisation de la valeur «GH.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4129;1078;1;"Eastern";"GH.05";"NULL";"Initialisation de la valeur «GH.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4130;1078;1;"Northern";"GH.06";"NULL";"Initialisation de la valeur «GH.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4131;1078;1;"Volta";"GH.08";"NULL";"Initialisation de la valeur «GH.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4132;1078;1;"Western";"GH.09";"NULL";"Initialisation de la valeur «GH.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4133;1078;1;"Upper East";"GH.10";"NULL";"Initialisation de la valeur «GH.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4134;1078;1;"Upper West";"GH.11";"NULL";"Initialisation de la valeur «GH.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4135;1078;1;"Gibraltar (general)";"GI.00";"NULL";"Initialisation de la valeur «GI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4136;1078;1;"Greenland (general)";"GL.00";"NULL";"Initialisation de la valeur «GL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4137;1078;1;"Nordgrønland";"GL.01";"NULL";"Initialisation de la valeur «GL.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4138;1078;1;"Østgrønland";"GL.02";"NULL";"Initialisation de la valeur «GL.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4139;1078;1;"Vestgrønland";"GL.03";"NULL";"Initialisation de la valeur «GL.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4140;1078;1;"Gambia, The (general)";"GM.00";"NULL";"Initialisation de la valeur «GM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4141;1078;1;"Banjul";"GM.01";"NULL";"Initialisation de la valeur «GM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4142;1078;1;"Lower River";"GM.02";"NULL";"Initialisation de la valeur «GM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4143;1078;1;"Central River";"GM.03";"NULL";"Initialisation de la valeur «GM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4144;1078;1;"Upper River";"GM.04";"NULL";"Initialisation de la valeur «GM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4145;1078;1;"Western";"GM.05";"NULL";"Initialisation de la valeur «GM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4146;1078;1;"North Bank";"GM.07";"NULL";"Initialisation de la valeur «GM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4147;1078;1;"Guinea (general)";"GN.00";"NULL";"Initialisation de la valeur «GN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4148;1078;1;"Beyla";"GN.01";"NULL";"Initialisation de la valeur «GN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4149;1078;1;"Boffa";"GN.02";"NULL";"Initialisation de la valeur «GN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4150;1078;1;"Boké";"GN.03";"NULL";"Initialisation de la valeur «GN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4151;1078;1;"Conakry";"GN.04";"NULL";"Initialisation de la valeur «GN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4152;1078;1;"Dabola";"GN.05";"NULL";"Initialisation de la valeur «GN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4153;1078;1;"Dalaba";"GN.06";"NULL";"Initialisation de la valeur «GN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4154;1078;1;"Dinguiraye";"GN.07";"NULL";"Initialisation de la valeur «GN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4155;1078;1;"(GV08)";"GN.08";"NULL";"Initialisation de la valeur «GN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4156;1078;1;"Faranah";"GN.09";"NULL";"Initialisation de la valeur «GN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4157;1078;1;"Forécariah";"GN.10";"NULL";"Initialisation de la valeur «GN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4158;1078;1;"Fria";"GN.11";"NULL";"Initialisation de la valeur «GN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4159;1078;1;"Gaoual";"GN.12";"NULL";"Initialisation de la valeur «GN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4160;1078;1;"Guéckédou";"GN.13";"NULL";"Initialisation de la valeur «GN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4161;1078;1;"(GV14)";"GN.14";"NULL";"Initialisation de la valeur «GN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4162;1078;1;"Kérouané";"GN.15";"NULL";"Initialisation de la valeur «GN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4163;1078;1;"Kindia";"GN.16";"NULL";"Initialisation de la valeur «GN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4164;1078;1;"Kissidougou";"GN.17";"NULL";"Initialisation de la valeur «GN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4165;1078;1;"Koundara";"GN.18";"NULL";"Initialisation de la valeur «GN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4166;1078;1;"Kouroussa";"GN.19";"NULL";"Initialisation de la valeur «GN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4167;1078;1;"(GV20)";"GN.20";"NULL";"Initialisation de la valeur «GN.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4168;1078;1;"Macenta";"GN.21";"NULL";"Initialisation de la valeur «GN.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4169;1078;1;"Mali";"GN.22";"NULL";"Initialisation de la valeur «GN.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4170;1078;1;"Mamou";"GN.23";"NULL";"Initialisation de la valeur «GN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4171;1078;1;"(GV24)";"GN.24";"NULL";"Initialisation de la valeur «GN.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4172;1078;1;"Pita";"GN.25";"NULL";"Initialisation de la valeur «GN.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4173;1078;1;"(GV26)";"GN.26";"NULL";"Initialisation de la valeur «GN.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4174;1078;1;"Télimélé";"GN.27";"NULL";"Initialisation de la valeur «GN.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4175;1078;1;"Tougué";"GN.28";"NULL";"Initialisation de la valeur «GN.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4176;1078;1;"Yomou";"GN.29";"NULL";"Initialisation de la valeur «GN.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4177;1078;1;"Coyah";"GN.30";"NULL";"Initialisation de la valeur «GN.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4178;1078;1;"Dubréka";"GN.31";"NULL";"Initialisation de la valeur «GN.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4179;1078;1;"Kankan";"GN.32";"NULL";"Initialisation de la valeur «GN.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4180;1078;1;"Koubia";"GN.33";"NULL";"Initialisation de la valeur «GN.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4181;1078;1;"Labé";"GN.34";"NULL";"Initialisation de la valeur «GN.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4182;1078;1;"Lélouma";"GN.35";"NULL";"Initialisation de la valeur «GN.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4183;1078;1;"Lola";"GN.36";"NULL";"Initialisation de la valeur «GN.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4184;1078;1;"Mandiana";"GN.37";"NULL";"Initialisation de la valeur «GN.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4185;1078;1;"Nzérékoré";"GN.38";"NULL";"Initialisation de la valeur «GN.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4186;1078;1;"Siguiri";"GN.39";"NULL";"Initialisation de la valeur «GN.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4187;1078;1;"Région Guadeloupe";"GP.GP";"NULL";"Initialisation de la valeur «GP.GP» pour la liste «75».";2009-07-29 00:00:00;1;1
4188;1078;1;"Equatorial Guinea (general)";"GQ.00";"NULL";"Initialisation de la valeur «GQ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4189;1078;1;"Annobón";"GQ.03";"NULL";"Initialisation de la valeur «GQ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4190;1078;1;"Bioko Norte";"GQ.04";"NULL";"Initialisation de la valeur «GQ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4191;1078;1;"Bioko Sur";"GQ.05";"NULL";"Initialisation de la valeur «GQ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4192;1078;1;"Centro Sur";"GQ.06";"NULL";"Initialisation de la valeur «GQ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4193;1078;1;"Kié-Ntem";"GQ.07";"NULL";"Initialisation de la valeur «GQ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4194;1078;1;"Litoral";"GQ.08";"NULL";"Initialisation de la valeur «GQ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4195;1078;1;"Wele-Nzas";"GQ.09";"NULL";"Initialisation de la valeur «GQ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4196;1078;1;"East Macedonia and Thrace";"GR.ESYE11";"NULL";"Initialisation de la valeur «GR.ESYE11» pour la liste «75».";2009-07-29 00:00:00;1;1
4197;1078;1;"Central Macedonia";"GR.ESYE12";"NULL";"Initialisation de la valeur «GR.ESYE12» pour la liste «75».";2009-07-29 00:00:00;1;1
4198;1078;1;"West Macedonia";"GR.ESYE13";"NULL";"Initialisation de la valeur «GR.ESYE13» pour la liste «75».";2009-07-29 00:00:00;1;1
4199;1078;1;"Thessaly";"GR.ESYE14";"NULL";"Initialisation de la valeur «GR.ESYE14» pour la liste «75».";2009-07-29 00:00:00;1;1
4200;1078;1;"Epirus";"GR.ESYE21";"NULL";"Initialisation de la valeur «GR.ESYE21» pour la liste «75».";2009-07-29 00:00:00;1;1
4201;1078;1;"Ionian Islands";"GR.ESYE22";"NULL";"Initialisation de la valeur «GR.ESYE22» pour la liste «75».";2009-07-29 00:00:00;1;1
4202;1078;1;"West Greece";"GR.ESYE23";"NULL";"Initialisation de la valeur «GR.ESYE23» pour la liste «75».";2009-07-29 00:00:00;1;1
4203;1078;1;"Central Greece";"GR.ESYE24";"NULL";"Initialisation de la valeur «GR.ESYE24» pour la liste «75».";2009-07-29 00:00:00;1;1
4204;1078;1;"Peloponnese";"GR.ESYE25";"NULL";"Initialisation de la valeur «GR.ESYE25» pour la liste «75».";2009-07-29 00:00:00;1;1
4205;1078;1;"Attica";"GR.ESYE31";"NULL";"Initialisation de la valeur «GR.ESYE31» pour la liste «75».";2009-07-29 00:00:00;1;1
4206;1078;1;"North Aegean";"GR.ESYE41";"NULL";"Initialisation de la valeur «GR.ESYE41» pour la liste «75».";2009-07-29 00:00:00;1;1
4207;1078;1;"South Aegean";"GR.ESYE42";"NULL";"Initialisation de la valeur «GR.ESYE42» pour la liste «75».";2009-07-29 00:00:00;1;1
4208;1078;1;"Crete";"GR.ESYE43";"NULL";"Initialisation de la valeur «GR.ESYE43» pour la liste «75».";2009-07-29 00:00:00;1;1
4209;1078;1;"South Georgia and The South Sandwich Islands (general)";"GS.00";"NULL";"Initialisation de la valeur «GS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4210;1078;1;"Guatemala (general)";"GT.00";"NULL";"Initialisation de la valeur «GT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4211;1078;1;"Alta Verapaz";"GT.01";"NULL";"Initialisation de la valeur «GT.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4212;1078;1;"Baja Verapaz";"GT.02";"NULL";"Initialisation de la valeur «GT.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4213;1078;1;"Chimaltenango";"GT.03";"NULL";"Initialisation de la valeur «GT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4214;1078;1;"Chiquimula";"GT.04";"NULL";"Initialisation de la valeur «GT.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4215;1078;1;"El Progreso";"GT.05";"NULL";"Initialisation de la valeur «GT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4216;1078;1;"Escuintla";"GT.06";"NULL";"Initialisation de la valeur «GT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4217;1078;1;"Guatemala";"GT.07";"NULL";"Initialisation de la valeur «GT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4218;1078;1;"Huehuetenango";"GT.08";"NULL";"Initialisation de la valeur «GT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4219;1078;1;"Izabal";"GT.09";"NULL";"Initialisation de la valeur «GT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4220;1078;1;"Jalapa";"GT.10";"NULL";"Initialisation de la valeur «GT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4221;1078;1;"Jutiapa";"GT.11";"NULL";"Initialisation de la valeur «GT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4222;1078;1;"Petén";"GT.12";"NULL";"Initialisation de la valeur «GT.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4223;1078;1;"Quetzaltenango";"GT.13";"NULL";"Initialisation de la valeur «GT.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4224;1078;1;"Quiché";"GT.14";"NULL";"Initialisation de la valeur «GT.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4225;1078;1;"Retalhuleu";"GT.15";"NULL";"Initialisation de la valeur «GT.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4226;1078;1;"Sacatepéquez";"GT.16";"NULL";"Initialisation de la valeur «GT.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4227;1078;1;"San Marcos";"GT.17";"NULL";"Initialisation de la valeur «GT.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4228;1078;1;"Santa Rosa";"GT.18";"NULL";"Initialisation de la valeur «GT.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4229;1078;1;"Sololá";"GT.19";"NULL";"Initialisation de la valeur «GT.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4230;1078;1;"Suchitepéquez";"GT.20";"NULL";"Initialisation de la valeur «GT.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4231;1078;1;"Totonicapán";"GT.21";"NULL";"Initialisation de la valeur «GT.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4232;1078;1;"Zacapa";"GT.22";"NULL";"Initialisation de la valeur «GT.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4233;1078;1;"Guinea-Bissau (general)";"GW.00";"NULL";"Initialisation de la valeur «GW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4234;1078;1;"Bafatá";"GW.01";"NULL";"Initialisation de la valeur «GW.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4235;1078;1;"Quinara";"GW.02";"NULL";"Initialisation de la valeur «GW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4236;1078;1;"Oio";"GW.04";"NULL";"Initialisation de la valeur «GW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4237;1078;1;"Bolama";"GW.05";"NULL";"Initialisation de la valeur «GW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4238;1078;1;"Cacheu";"GW.06";"NULL";"Initialisation de la valeur «GW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4239;1078;1;"Tombali";"GW.07";"NULL";"Initialisation de la valeur «GW.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4240;1078;1;"Gabú";"GW.10";"NULL";"Initialisation de la valeur «GW.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4241;1078;1;"Bissau";"GW.11";"NULL";"Initialisation de la valeur «GW.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4242;1078;1;"Biombo";"GW.12";"NULL";"Initialisation de la valeur «GW.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4243;1078;1;"Guyana (general)";"GY.00";"NULL";"Initialisation de la valeur «GY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4244;1078;1;"Barima-Waini";"GY.10";"NULL";"Initialisation de la valeur «GY.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4245;1078;1;"Cuyuni-Mazaruni";"GY.11";"NULL";"Initialisation de la valeur «GY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4246;1078;1;"Demerara-Mahaica";"GY.12";"NULL";"Initialisation de la valeur «GY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4247;1078;1;"East Berbice-Corentyne";"GY.13";"NULL";"Initialisation de la valeur «GY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4248;1078;1;"Essequibo Islands-West Demerara";"GY.14";"NULL";"Initialisation de la valeur «GY.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4249;1078;1;"Mahaica-Berbice";"GY.15";"NULL";"Initialisation de la valeur «GY.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4250;1078;1;"Pomeroon-Supenaam";"GY.16";"NULL";"Initialisation de la valeur «GY.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4251;1078;1;"Potaro-Siparuni";"GY.17";"NULL";"Initialisation de la valeur «GY.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4252;1078;1;"Upper Demerara-Berbice";"GY.18";"NULL";"Initialisation de la valeur «GY.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4253;1078;1;"Upper Takutu-Upper Essequibo";"GY.19";"NULL";"Initialisation de la valeur «GY.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4254;1078;1;"Hong Kong (general)";"HK.00";"NULL";"Initialisation de la valeur «HK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4255;1078;1;"Honduras (general)";"HN.00";"NULL";"Initialisation de la valeur «HN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4256;1078;1;"Atlántida";"HN.01";"NULL";"Initialisation de la valeur «HN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4257;1078;1;"Choluteca";"HN.02";"NULL";"Initialisation de la valeur «HN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4258;1078;1;"Colón";"HN.03";"NULL";"Initialisation de la valeur «HN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4259;1078;1;"Comayagua";"HN.04";"NULL";"Initialisation de la valeur «HN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4260;1078;1;"Copán";"HN.05";"NULL";"Initialisation de la valeur «HN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4261;1078;1;"Cortés";"HN.06";"NULL";"Initialisation de la valeur «HN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4262;1078;1;"El Paraíso";"HN.07";"NULL";"Initialisation de la valeur «HN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4263;1078;1;"Francisco Morazán";"HN.08";"NULL";"Initialisation de la valeur «HN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4264;1078;1;"Gracias a Dios";"HN.09";"NULL";"Initialisation de la valeur «HN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4265;1078;1;"Intibucá";"HN.10";"NULL";"Initialisation de la valeur «HN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4266;1078;1;"Islas de la Bahía";"HN.11";"NULL";"Initialisation de la valeur «HN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4267;1078;1;"La Paz";"HN.12";"NULL";"Initialisation de la valeur «HN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4268;1078;1;"Lempira";"HN.13";"NULL";"Initialisation de la valeur «HN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4269;1078;1;"Ocotepeque";"HN.14";"NULL";"Initialisation de la valeur «HN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4270;1078;1;"Olancho";"HN.15";"NULL";"Initialisation de la valeur «HN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4271;1078;1;"Santa Bárbara";"HN.16";"NULL";"Initialisation de la valeur «HN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4272;1078;1;"Valle";"HN.17";"NULL";"Initialisation de la valeur «HN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4273;1078;1;"Yoro";"HN.18";"NULL";"Initialisation de la valeur «HN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4274;1078;1;"Croatia (general)";"HR.00";"NULL";"Initialisation de la valeur «HR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4275;1078;1;"Bjelovarsko-Bilogorska";"HR.01";"NULL";"Initialisation de la valeur «HR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4276;1078;1;"Brodsko-Posavska";"HR.02";"NULL";"Initialisation de la valeur «HR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4277;1078;1;"Dubrovačko-Neretvanska";"HR.03";"NULL";"Initialisation de la valeur «HR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4278;1078;1;"Istarska";"HR.04";"NULL";"Initialisation de la valeur «HR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4279;1078;1;"Karlovačka";"HR.05";"NULL";"Initialisation de la valeur «HR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4280;1078;1;"Koprivničko-Križevačka";"HR.06";"NULL";"Initialisation de la valeur «HR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4281;1078;1;"Krapinsko-Zagorska";"HR.07";"NULL";"Initialisation de la valeur «HR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4282;1078;1;"Ličko-Senjska";"HR.08";"NULL";"Initialisation de la valeur «HR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4283;1078;1;"Međimurska";"HR.09";"NULL";"Initialisation de la valeur «HR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4284;1078;1;"Osječko-Baranjska";"HR.10";"NULL";"Initialisation de la valeur «HR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4285;1078;1;"Požeško-Slavonska";"HR.11";"NULL";"Initialisation de la valeur «HR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4286;1078;1;"Primorsko-Goranska";"HR.12";"NULL";"Initialisation de la valeur «HR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4287;1078;1;"Šibensko-Kniniska";"HR.13";"NULL";"Initialisation de la valeur «HR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4288;1078;1;"Sisačko-Moslavačka";"HR.14";"NULL";"Initialisation de la valeur «HR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4289;1078;1;"Splitsko-Dalmatinska";"HR.15";"NULL";"Initialisation de la valeur «HR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4290;1078;1;"Varaždinska";"HR.16";"NULL";"Initialisation de la valeur «HR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4291;1078;1;"Virovitičk-Podravska";"HR.17";"NULL";"Initialisation de la valeur «HR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4292;1078;1;"Vukovarsko-Srijemska";"HR.18";"NULL";"Initialisation de la valeur «HR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4293;1078;1;"Zadarska";"HR.19";"NULL";"Initialisation de la valeur «HR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4294;1078;1;"Zagrebačka";"HR.20";"NULL";"Initialisation de la valeur «HR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4295;1078;1;"Grad Zagreb";"HR.21";"NULL";"Initialisation de la valeur «HR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4296;1078;1;"Haiti (general)";"HT.00";"NULL";"Initialisation de la valeur «HT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4297;1078;1;"Nord-Ouest";"HT.03";"NULL";"Initialisation de la valeur «HT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4298;1078;1;"Artibonite";"HT.06";"NULL";"Initialisation de la valeur «HT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4299;1078;1;"Centre";"HT.07";"NULL";"Initialisation de la valeur «HT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4300;1078;1;"Nord";"HT.09";"NULL";"Initialisation de la valeur «HT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4301;1078;1;"Nord-Est";"HT.10";"NULL";"Initialisation de la valeur «HT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4302;1078;1;"Ouest";"HT.11";"NULL";"Initialisation de la valeur «HT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4303;1078;1;"Sud";"HT.12";"NULL";"Initialisation de la valeur «HT.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4304;1078;1;"Sud-Est";"HT.13";"NULL";"Initialisation de la valeur «HT.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4305;1078;1;"GrandʼAnse";"HT.14";"NULL";"Initialisation de la valeur «HT.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4306;1078;1;"Hungary (general)";"HU.00";"NULL";"Initialisation de la valeur «HU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4307;1078;1;"Bács-Kiskun";"HU.01";"NULL";"Initialisation de la valeur «HU.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4308;1078;1;"Baranya";"HU.02";"NULL";"Initialisation de la valeur «HU.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4309;1078;1;"Békés";"HU.03";"NULL";"Initialisation de la valeur «HU.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4310;1078;1;"Borsod-Abaúj-Zemplén";"HU.04";"NULL";"Initialisation de la valeur «HU.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4311;1078;1;"Budapest";"HU.05";"NULL";"Initialisation de la valeur «HU.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4312;1078;1;"Csongrád";"HU.06";"NULL";"Initialisation de la valeur «HU.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4313;1078;1;"Fejér";"HU.08";"NULL";"Initialisation de la valeur «HU.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4314;1078;1;"Győr-Moson-Sopron";"HU.09";"NULL";"Initialisation de la valeur «HU.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4315;1078;1;"Hajdú-Bihar";"HU.10";"NULL";"Initialisation de la valeur «HU.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4316;1078;1;"Heves";"HU.11";"NULL";"Initialisation de la valeur «HU.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4317;1078;1;"Komárom-Esztergom";"HU.12";"NULL";"Initialisation de la valeur «HU.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4318;1078;1;"Nógrád";"HU.14";"NULL";"Initialisation de la valeur «HU.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4319;1078;1;"Pest";"HU.16";"NULL";"Initialisation de la valeur «HU.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4320;1078;1;"Somogy";"HU.17";"NULL";"Initialisation de la valeur «HU.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4321;1078;1;"Szabolcs-Szatmár-Bereg";"HU.18";"NULL";"Initialisation de la valeur «HU.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4322;1078;1;"Jász-Nagykun-Szolnok";"HU.20";"NULL";"Initialisation de la valeur «HU.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4323;1078;1;"Tolna";"HU.21";"NULL";"Initialisation de la valeur «HU.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4324;1078;1;"Vas";"HU.22";"NULL";"Initialisation de la valeur «HU.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4325;1078;1;"Veszprém";"HU.23";"NULL";"Initialisation de la valeur «HU.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4326;1078;1;"Zala";"HU.24";"NULL";"Initialisation de la valeur «HU.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4327;1078;1;"Indonesia (general) ";"ID.00";"NULL";"Initialisation de la valeur «ID.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4328;1078;1;"Aceh";"ID.01";"NULL";"Initialisation de la valeur «ID.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4329;1078;1;"Bali";"ID.02";"NULL";"Initialisation de la valeur «ID.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4330;1078;1;"Bengkulu";"ID.03";"NULL";"Initialisation de la valeur «ID.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4331;1078;1;"Jakarta Raya";"ID.04";"NULL";"Initialisation de la valeur «ID.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4332;1078;1;"Jambi";"ID.05";"NULL";"Initialisation de la valeur «ID.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4333;1078;1;"Jawa Barat";"ID.06";"NULL";"Initialisation de la valeur «ID.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4334;1078;1;"East Java";"ID.08";"NULL";"Initialisation de la valeur «ID.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4335;1078;1;"(ID09) ";"ID.09";"NULL";"Initialisation de la valeur «ID.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4336;1078;1;"Yogyakarta ";"ID.10";"NULL";"Initialisation de la valeur «ID.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4337;1078;1;"West Kalimantan";"ID.11";"NULL";"Initialisation de la valeur «ID.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4338;1078;1;"South Kalimantan";"ID.12";"NULL";"Initialisation de la valeur «ID.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4339;1078;1;"Kalimantan Tengah";"ID.13";"NULL";"Initialisation de la valeur «ID.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4340;1078;1;"East Kalimantan";"ID.14";"NULL";"Initialisation de la valeur «ID.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4341;1078;1;"Lampung";"ID.15";"NULL";"Initialisation de la valeur «ID.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4342;1078;1;"Nusa Tenggara Barat";"ID.17";"NULL";"Initialisation de la valeur «ID.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4343;1078;1;"East Nusa Tenggara";"ID.18";"NULL";"Initialisation de la valeur «ID.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4344;1078;1;"(ID19) ";"ID.19";"NULL";"Initialisation de la valeur «ID.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4345;1078;1;"(ID20) ";"ID.20";"NULL";"Initialisation de la valeur «ID.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4346;1078;1;"Central Sulawesi";"ID.21";"NULL";"Initialisation de la valeur «ID.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4347;1078;1;"Sulawesi Tenggara";"ID.22";"NULL";"Initialisation de la valeur «ID.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4348;1078;1;"Sulawesi Utara";"ID.23";"NULL";"Initialisation de la valeur «ID.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4349;1078;1;"West Sumatra";"ID.24";"NULL";"Initialisation de la valeur «ID.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4350;1078;1;"Sumatera Selatan";"ID.25";"NULL";"Initialisation de la valeur «ID.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4351;1078;1;"North Sumatra";"ID.26";"NULL";"Initialisation de la valeur «ID.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4352;1078;1;"Timor Timur";"ID.27";"NULL";"Initialisation de la valeur «ID.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4353;1078;1;"Maluku ";"ID.28";"NULL";"Initialisation de la valeur «ID.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4354;1078;1;"Maluku Utara";"ID.29";"NULL";"Initialisation de la valeur «ID.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4355;1078;1;"West Java";"ID.30";"NULL";"Initialisation de la valeur «ID.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4356;1078;1;"North Sulawesi";"ID.31";"NULL";"Initialisation de la valeur «ID.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4357;1078;1;"South Sumatra";"ID.32";"NULL";"Initialisation de la valeur «ID.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4358;1078;1;"Banten";"ID.33";"NULL";"Initialisation de la valeur «ID.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4359;1078;1;"Gorontalo";"ID.34";"NULL";"Initialisation de la valeur «ID.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4360;1078;1;"Bangka-Belitung";"ID.35";"NULL";"Initialisation de la valeur «ID.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4361;1078;1;"Papua";"ID.36";"NULL";"Initialisation de la valeur «ID.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4362;1078;1;"Riau";"ID.37";"NULL";"Initialisation de la valeur «ID.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4363;1078;1;"South Sulawesi";"ID.38";"NULL";"Initialisation de la valeur «ID.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4364;1078;1;"Irian Jaya Barat";"ID.39";"NULL";"Initialisation de la valeur «ID.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4365;1078;1;"Riau Islands";"ID.40";"NULL";"Initialisation de la valeur «ID.40» pour la liste «75».";2009-07-29 00:00:00;1;1
4366;1078;1;"Sulawesi Barat";"ID.41";"NULL";"Initialisation de la valeur «ID.41» pour la liste «75».";2009-07-29 00:00:00;1;1
4367;1078;1;"Ireland (general)";"IE.00";"NULL";"Initialisation de la valeur «IE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4368;1078;1;"Carlow";"IE.01";"NULL";"Initialisation de la valeur «IE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4369;1078;1;"County Cavan";"IE.02";"NULL";"Initialisation de la valeur «IE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4370;1078;1;"County Clare";"IE.03";"NULL";"Initialisation de la valeur «IE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4371;1078;1;"Cork";"IE.04";"NULL";"Initialisation de la valeur «IE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4372;1078;1;"Donegal";"IE.06";"NULL";"Initialisation de la valeur «IE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4373;1078;1;"Dublin";"IE.07";"NULL";"Initialisation de la valeur «IE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4374;1078;1;"Galway";"IE.10";"NULL";"Initialisation de la valeur «IE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4375;1078;1;"County Kerry";"IE.11";"NULL";"Initialisation de la valeur «IE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4376;1078;1;"County Kildare";"IE.12";"NULL";"Initialisation de la valeur «IE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4377;1078;1;"County Kilkenny";"IE.13";"NULL";"Initialisation de la valeur «IE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4378;1078;1;"Leitrim";"IE.14";"NULL";"Initialisation de la valeur «IE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4379;1078;1;"Leix";"IE.15";"NULL";"Initialisation de la valeur «IE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4380;1078;1;"Limerick";"IE.16";"NULL";"Initialisation de la valeur «IE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4381;1078;1;"County Longford";"IE.18";"NULL";"Initialisation de la valeur «IE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4382;1078;1;"County Louth";"IE.19";"NULL";"Initialisation de la valeur «IE.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4383;1078;1;"County Mayo";"IE.20";"NULL";"Initialisation de la valeur «IE.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4384;1078;1;"County Meath";"IE.21";"NULL";"Initialisation de la valeur «IE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4385;1078;1;"Monaghan";"IE.22";"NULL";"Initialisation de la valeur «IE.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4386;1078;1;"County Offaly";"IE.23";"NULL";"Initialisation de la valeur «IE.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4387;1078;1;"County Roscommon";"IE.24";"NULL";"Initialisation de la valeur «IE.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4388;1078;1;"County Sligo";"IE.25";"NULL";"Initialisation de la valeur «IE.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4389;1078;1;"Tipperary";"IE.26";"NULL";"Initialisation de la valeur «IE.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4390;1078;1;"County Waterford";"IE.27";"NULL";"Initialisation de la valeur «IE.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4391;1078;1;"County Westmeath";"IE.29";"NULL";"Initialisation de la valeur «IE.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4392;1078;1;"County Wexford";"IE.30";"NULL";"Initialisation de la valeur «IE.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4393;1078;1;"County Wicklow";"IE.31";"NULL";"Initialisation de la valeur «IE.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4394;1078;1;"Israel (general)";"IL.00";"NULL";"Initialisation de la valeur «IL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4395;1078;1;"HaDarom";"IL.01";"NULL";"Initialisation de la valeur «IL.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4396;1078;1;"HaMerkaz";"IL.02";"NULL";"Initialisation de la valeur «IL.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4397;1078;1;"Northern District";"IL.03";"NULL";"Initialisation de la valeur «IL.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4398;1078;1;"H̱efa";"IL.04";"NULL";"Initialisation de la valeur «IL.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4399;1078;1;"Tel Aviv";"IL.05";"NULL";"Initialisation de la valeur «IL.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4400;1078;1;"Yerushalayim";"IL.06";"NULL";"Initialisation de la valeur «IL.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4401;1078;1;"Isle of Man (general)";"IM.00";"NULL";"Initialisation de la valeur «IM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4402;1078;1;"India (general)";"IN.00";"NULL";"Initialisation de la valeur «IN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4403;1078;1;"Andaman and Nicobar Islands";"IN.01";"NULL";"Initialisation de la valeur «IN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4404;1078;1;"Andhra Pradesh";"IN.02";"NULL";"Initialisation de la valeur «IN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4405;1078;1;"Assam";"IN.03";"NULL";"Initialisation de la valeur «IN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4406;1078;1;"Bihar";"IN.04";"NULL";"Initialisation de la valeur «IN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4407;1078;1;"Chandīgarh";"IN.05";"NULL";"Initialisation de la valeur «IN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4408;1078;1;"Dādra and Nagar Haveli";"IN.06";"NULL";"Initialisation de la valeur «IN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4409;1078;1;"Delhi";"IN.07";"NULL";"Initialisation de la valeur «IN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4410;1078;1;"Gujarāt";"IN.09";"NULL";"Initialisation de la valeur «IN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4411;1078;1;"Haryāna";"IN.10";"NULL";"Initialisation de la valeur «IN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4412;1078;1;"Himāchal Pradesh";"IN.11";"NULL";"Initialisation de la valeur «IN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4413;1078;1;"Kashmir";"IN.12";"NULL";"Initialisation de la valeur «IN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4414;1078;1;"Kerala";"IN.13";"NULL";"Initialisation de la valeur «IN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4415;1078;1;"Laccadives";"IN.14";"NULL";"Initialisation de la valeur «IN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4416;1078;1;"Madhya Pradesh ";"IN.15";"NULL";"Initialisation de la valeur «IN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4417;1078;1;"Mahārāshtra";"IN.16";"NULL";"Initialisation de la valeur «IN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4418;1078;1;"Manipur";"IN.17";"NULL";"Initialisation de la valeur «IN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4419;1078;1;"Meghālaya";"IN.18";"NULL";"Initialisation de la valeur «IN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4420;1078;1;"Karnātaka";"IN.19";"NULL";"Initialisation de la valeur «IN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4421;1078;1;"Nāgāland";"IN.20";"NULL";"Initialisation de la valeur «IN.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4422;1078;1;"Orissa";"IN.21";"NULL";"Initialisation de la valeur «IN.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4423;1078;1;"Pondicherry";"IN.22";"NULL";"Initialisation de la valeur «IN.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4424;1078;1;"Punjab";"IN.23";"NULL";"Initialisation de la valeur «IN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4425;1078;1;"Rājasthān";"IN.24";"NULL";"Initialisation de la valeur «IN.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4426;1078;1;"Tamil Nādu";"IN.25";"NULL";"Initialisation de la valeur «IN.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4427;1078;1;"Tripura";"IN.26";"NULL";"Initialisation de la valeur «IN.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4428;1078;1;"Uttar Pradesh";"IN.27";"NULL";"Initialisation de la valeur «IN.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4429;1078;1;"Bengal";"IN.28";"NULL";"Initialisation de la valeur «IN.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4430;1078;1;"Sikkim";"IN.29";"NULL";"Initialisation de la valeur «IN.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4431;1078;1;"Arunāchal Pradesh";"IN.30";"NULL";"Initialisation de la valeur «IN.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4432;1078;1;"Mizoram";"IN.31";"NULL";"Initialisation de la valeur «IN.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4433;1078;1;"Daman and Diu";"IN.32";"NULL";"Initialisation de la valeur «IN.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4434;1078;1;"Goa";"IN.33";"NULL";"Initialisation de la valeur «IN.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4435;1078;1;"Bihār";"IN.34";"NULL";"Initialisation de la valeur «IN.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4436;1078;1;"Madhya Pradesh";"IN.35";"NULL";"Initialisation de la valeur «IN.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4437;1078;1;"Uttar Pradesh";"IN.36";"NULL";"Initialisation de la valeur «IN.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4438;1078;1;"Chhattisgarh";"IN.37";"NULL";"Initialisation de la valeur «IN.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4439;1078;1;"Jharkhand";"IN.38";"NULL";"Initialisation de la valeur «IN.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4440;1078;1;"Uttarakhand";"IN.39";"NULL";"Initialisation de la valeur «IN.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4441;1078;1;"British Indian Ocean Territory (general)";"IO.00";"NULL";"Initialisation de la valeur «IO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4442;1078;1;"Iraq (general)";"IQ.00";"NULL";"Initialisation de la valeur «IQ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4443;1078;1;"Al Anbār";"IQ.01";"NULL";"Initialisation de la valeur «IQ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4444;1078;1;"Al Başrah";"IQ.02";"NULL";"Initialisation de la valeur «IQ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4445;1078;1;"Al Muthanná";"IQ.03";"NULL";"Initialisation de la valeur «IQ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4446;1078;1;"Al Qādisīyah";"IQ.04";"NULL";"Initialisation de la valeur «IQ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4447;1078;1;"As Sulaymānīyah";"IQ.05";"NULL";"Initialisation de la valeur «IQ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4448;1078;1;"Bābil";"IQ.06";"NULL";"Initialisation de la valeur «IQ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4449;1078;1;"Baghdād";"IQ.07";"NULL";"Initialisation de la valeur «IQ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4450;1078;1;"Dahūk";"IQ.08";"NULL";"Initialisation de la valeur «IQ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4451;1078;1;"Dhi Qar";"IQ.09";"NULL";"Initialisation de la valeur «IQ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4452;1078;1;"Diyala";"IQ.10";"NULL";"Initialisation de la valeur «IQ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4453;1078;1;"Arbīl";"IQ.11";"NULL";"Initialisation de la valeur «IQ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4454;1078;1;"Karbalāʼ";"IQ.12";"NULL";"Initialisation de la valeur «IQ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4455;1078;1;"At Taʼmīm";"IQ.13";"NULL";"Initialisation de la valeur «IQ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4456;1078;1;"Maysan";"IQ.14";"NULL";"Initialisation de la valeur «IQ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4457;1078;1;"Nīnawá";"IQ.15";"NULL";"Initialisation de la valeur «IQ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4458;1078;1;"Wāsiţ";"IQ.16";"NULL";"Initialisation de la valeur «IQ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4459;1078;1;"An Najaf";"IQ.17";"NULL";"Initialisation de la valeur «IQ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4460;1078;1;"Şalāḩ ad Dīn";"IQ.18";"NULL";"Initialisation de la valeur «IQ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4461;1078;1;"Iran (general)";"IR.00";"NULL";"Initialisation de la valeur «IR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4462;1078;1;"Āz̄ārbāyjān-e Gharbī";"IR.01";"NULL";"Initialisation de la valeur «IR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4463;1078;1;"Ostān-e Āz̄arbāyjān-e Sharqī";"IR.02";"NULL";"Initialisation de la valeur «IR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4464;1078;1;"Chahār Maḩāll va Bakhtīārī";"IR.03";"NULL";"Initialisation de la valeur «IR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4465;1078;1;"Sīstān va Balūchestān";"IR.04";"NULL";"Initialisation de la valeur «IR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4466;1078;1;"Kohgīlūyeh va Būyer Aḩmad";"IR.05";"NULL";"Initialisation de la valeur «IR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4467;1078;1;"Fārs Province";"IR.07";"NULL";"Initialisation de la valeur «IR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4468;1078;1;"Gīlān";"IR.08";"NULL";"Initialisation de la valeur «IR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4469;1078;1;"Hamadān";"IR.09";"NULL";"Initialisation de la valeur «IR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4470;1078;1;"Īlām";"IR.10";"NULL";"Initialisation de la valeur «IR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4471;1078;1;"Hormozgān Province";"IR.11";"NULL";"Initialisation de la valeur «IR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4472;1078;1;"Kerman";"IR.12";"NULL";"Initialisation de la valeur «IR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4473;1078;1;"Kermānshāh";"IR.13";"NULL";"Initialisation de la valeur «IR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4474;1078;1;"Khūzestān";"IR.15";"NULL";"Initialisation de la valeur «IR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4475;1078;1;"Kordestān";"IR.16";"NULL";"Initialisation de la valeur «IR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4476;1078;1;"Mazandaran";"IR.17";"NULL";"Initialisation de la valeur «IR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4477;1078;1;"Markazi";"IR.19";"NULL";"Initialisation de la valeur «IR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4478;1078;1;"Zanjan";"IR.21";"NULL";"Initialisation de la valeur «IR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4479;1078;1;"Bushehr Province";"IR.22";"NULL";"Initialisation de la valeur «IR.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4480;1078;1;"Lorestān";"IR.23";"NULL";"Initialisation de la valeur «IR.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4481;1078;1;"Markazi";"IR.24";"NULL";"Initialisation de la valeur «IR.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4482;1078;1;"Semnān Province";"IR.25";"NULL";"Initialisation de la valeur «IR.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4483;1078;1;"Tehrān";"IR.26";"NULL";"Initialisation de la valeur «IR.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4484;1078;1;"Zanjan";"IR.27";"NULL";"Initialisation de la valeur «IR.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4485;1078;1;"Eşfahān";"IR.28";"NULL";"Initialisation de la valeur «IR.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4486;1078;1;"Kermān";"IR.29";"NULL";"Initialisation de la valeur «IR.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4487;1078;1;"Ostan-e Khorasan-e Razavi";"IR.30";"NULL";"Initialisation de la valeur «IR.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4488;1078;1;"Yazd";"IR.31";"NULL";"Initialisation de la valeur «IR.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4489;1078;1;"Ardabīl";"IR.32";"NULL";"Initialisation de la valeur «IR.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4490;1078;1;"Āz̄ārbāyjān-e Sharqī";"IR.33";"NULL";"Initialisation de la valeur «IR.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4491;1078;1;"Markazi Province";"IR.34";"NULL";"Initialisation de la valeur «IR.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4492;1078;1;"Māzandarān Province";"IR.35";"NULL";"Initialisation de la valeur «IR.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4493;1078;1;"Zanjan Province";"IR.36";"NULL";"Initialisation de la valeur «IR.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4494;1078;1;"Golestān";"IR.37";"NULL";"Initialisation de la valeur «IR.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4495;1078;1;"Qazvīn";"IR.38";"NULL";"Initialisation de la valeur «IR.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4496;1078;1;"Qom";"IR.39";"NULL";"Initialisation de la valeur «IR.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4497;1078;1;"Yazd";"IR.40";"NULL";"Initialisation de la valeur «IR.40» pour la liste «75».";2009-07-29 00:00:00;1;1
4498;1078;1;"Khorāsān-e Jonūbī";"IR.41";"NULL";"Initialisation de la valeur «IR.41» pour la liste «75».";2009-07-29 00:00:00;1;1
4499;1078;1;"Razavi Khorasan Province";"IR.42";"NULL";"Initialisation de la valeur «IR.42» pour la liste «75».";2009-07-29 00:00:00;1;1
4500;1078;1;"Khorāsān-e Shomālī";"IR.43";"NULL";"Initialisation de la valeur «IR.43» pour la liste «75».";2009-07-29 00:00:00;1;1
4501;1078;1;"Iceland (general)";"IS.00";"NULL";"Initialisation de la valeur «IS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4502;1078;1;"Borgarfjardarsysla";"IS.07";"NULL";"Initialisation de la valeur «IS.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4503;1078;1;"Dalasysla";"IS.08";"NULL";"Initialisation de la valeur «IS.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4504;1078;1;"Eyjafjardarsysla";"IS.09";"NULL";"Initialisation de la valeur «IS.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4505;1078;1;"Gullbringusysla";"IS.10";"NULL";"Initialisation de la valeur «IS.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4506;1078;1;"Hafnarfjördur";"IS.11";"NULL";"Initialisation de la valeur «IS.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4507;1078;1;"Husavik";"IS.12";"NULL";"Initialisation de la valeur «IS.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4508;1078;1;"Isafjördur";"IS.13";"NULL";"Initialisation de la valeur «IS.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4509;1078;1;"Keflavik";"IS.14";"NULL";"Initialisation de la valeur «IS.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4510;1078;1;"Kjosarsysla";"IS.15";"NULL";"Initialisation de la valeur «IS.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4511;1078;1;"Kopavogur";"IS.16";"NULL";"Initialisation de la valeur «IS.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4512;1078;1;"Myrasysla";"IS.17";"NULL";"Initialisation de la valeur «IS.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4513;1078;1;"Neskaupstadur";"IS.18";"NULL";"Initialisation de la valeur «IS.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4514;1078;1;"Nordur-Isafjardarsysla";"IS.19";"NULL";"Initialisation de la valeur «IS.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4515;1078;1;"Nordur-Mulasysla";"IS.20";"NULL";"Initialisation de la valeur «IS.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4516;1078;1;"Nordur-Tingeyjarsysla";"IS.21";"NULL";"Initialisation de la valeur «IS.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4517;1078;1;"Olafsfjördur";"IS.22";"NULL";"Initialisation de la valeur «IS.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4518;1078;1;"Rangarvallasysla";"IS.23";"NULL";"Initialisation de la valeur «IS.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4519;1078;1;"Reykjavík";"IS.24";"NULL";"Initialisation de la valeur «IS.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4520;1078;1;"Saudarkrokur";"IS.25";"NULL";"Initialisation de la valeur «IS.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4521;1078;1;"Seydisfjordur";"IS.26";"NULL";"Initialisation de la valeur «IS.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4522;1078;1;"Siglufjordur";"IS.27";"NULL";"Initialisation de la valeur «IS.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4523;1078;1;"Skagafjardarsysla";"IS.28";"NULL";"Initialisation de la valeur «IS.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4524;1078;1;"Snafellsnes- og Hnappadalssysla";"IS.29";"NULL";"Initialisation de la valeur «IS.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4525;1078;1;"Strandasysla";"IS.30";"NULL";"Initialisation de la valeur «IS.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4526;1078;1;"Sudur-Mulasysla";"IS.31";"NULL";"Initialisation de la valeur «IS.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4527;1078;1;"Sudur-Tingeyjarsysla";"IS.32";"NULL";"Initialisation de la valeur «IS.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4528;1078;1;"Vestmannaeyjar";"IS.33";"NULL";"Initialisation de la valeur «IS.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4529;1078;1;"Vestur-Bardastrandarsysla";"IS.34";"NULL";"Initialisation de la valeur «IS.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4530;1078;1;"Vestur-Hunavatnssysla";"IS.35";"NULL";"Initialisation de la valeur «IS.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4531;1078;1;"Vestur-Isafjardarsysla";"IS.36";"NULL";"Initialisation de la valeur «IS.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4532;1078;1;"Vestur-Skaftafellssysla";"IS.37";"NULL";"Initialisation de la valeur «IS.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4533;1078;1;"East";"IS.38";"NULL";"Initialisation de la valeur «IS.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4534;1078;1;"Capital Region";"IS.39";"NULL";"Initialisation de la valeur «IS.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4535;1078;1;"Northeast";"IS.40";"NULL";"Initialisation de la valeur «IS.40» pour la liste «75».";2009-07-29 00:00:00;1;1
4536;1078;1;"Northwest";"IS.41";"NULL";"Initialisation de la valeur «IS.41» pour la liste «75».";2009-07-29 00:00:00;1;1
4537;1078;1;"South";"IS.42";"NULL";"Initialisation de la valeur «IS.42» pour la liste «75».";2009-07-29 00:00:00;1;1
4538;1078;1;"Southern Peninsula";"IS.43";"NULL";"Initialisation de la valeur «IS.43» pour la liste «75».";2009-07-29 00:00:00;1;1
4539;1078;1;"Westfjords";"IS.44";"NULL";"Initialisation de la valeur «IS.44» pour la liste «75».";2009-07-29 00:00:00;1;1
4540;1078;1;"West";"IS.45";"NULL";"Initialisation de la valeur «IS.45» pour la liste «75».";2009-07-29 00:00:00;1;1
4541;1078;1;"Italy (general)";"IT.00";"NULL";"Initialisation de la valeur «IT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4542;1078;1;"Abruzzo";"IT.01";"NULL";"Initialisation de la valeur «IT.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4543;1078;1;"Basilicate";"IT.02";"NULL";"Initialisation de la valeur «IT.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4544;1078;1;"Calabria";"IT.03";"NULL";"Initialisation de la valeur «IT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4545;1078;1;"Campania";"IT.04";"NULL";"Initialisation de la valeur «IT.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4546;1078;1;"Emilia-Romagna";"IT.05";"NULL";"Initialisation de la valeur «IT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4547;1078;1;"Friuli";"IT.06";"NULL";"Initialisation de la valeur «IT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4548;1078;1;"Latium";"IT.07";"NULL";"Initialisation de la valeur «IT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4549;1078;1;"Liguria";"IT.08";"NULL";"Initialisation de la valeur «IT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4550;1078;1;"Lombardy";"IT.09";"NULL";"Initialisation de la valeur «IT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4551;1078;1;"The Marches";"IT.10";"NULL";"Initialisation de la valeur «IT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4552;1078;1;"Molise";"IT.11";"NULL";"Initialisation de la valeur «IT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4553;1078;1;"Piedmont";"IT.12";"NULL";"Initialisation de la valeur «IT.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4554;1078;1;"Apulia";"IT.13";"NULL";"Initialisation de la valeur «IT.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4555;1078;1;"Sardinia";"IT.14";"NULL";"Initialisation de la valeur «IT.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4556;1078;1;"Sicily";"IT.15";"NULL";"Initialisation de la valeur «IT.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4557;1078;1;"Tuscany";"IT.16";"NULL";"Initialisation de la valeur «IT.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4558;1078;1;"Trentino-Alto Adige";"IT.17";"NULL";"Initialisation de la valeur «IT.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4559;1078;1;"Umbria";"IT.18";"NULL";"Initialisation de la valeur «IT.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4560;1078;1;"Aosta Valley";"IT.19";"NULL";"Initialisation de la valeur «IT.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4561;1078;1;"Veneto";"IT.20";"NULL";"Initialisation de la valeur «IT.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4562;1078;1;"Jamaica (general)";"JM.00";"NULL";"Initialisation de la valeur «JM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4563;1078;1;"Clarendon";"JM.01";"NULL";"Initialisation de la valeur «JM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4564;1078;1;"Hanover Parish";"JM.02";"NULL";"Initialisation de la valeur «JM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4565;1078;1;"Manchester";"JM.04";"NULL";"Initialisation de la valeur «JM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4566;1078;1;"Portland";"JM.07";"NULL";"Initialisation de la valeur «JM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4567;1078;1;"Saint Andrew";"JM.08";"NULL";"Initialisation de la valeur «JM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4568;1078;1;"Saint Ann";"JM.09";"NULL";"Initialisation de la valeur «JM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4569;1078;1;"Saint Catherine";"JM.10";"NULL";"Initialisation de la valeur «JM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4570;1078;1;"Saint Elizabeth";"JM.11";"NULL";"Initialisation de la valeur «JM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4571;1078;1;"Saint James";"JM.12";"NULL";"Initialisation de la valeur «JM.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4572;1078;1;"Saint Mary";"JM.13";"NULL";"Initialisation de la valeur «JM.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4573;1078;1;"Saint Thomas";"JM.14";"NULL";"Initialisation de la valeur «JM.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4574;1078;1;"Trelawny";"JM.15";"NULL";"Initialisation de la valeur «JM.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4575;1078;1;"Westmoreland";"JM.16";"NULL";"Initialisation de la valeur «JM.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4576;1078;1;"Kingston";"JM.17";"NULL";"Initialisation de la valeur «JM.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4577;1078;1;"Jordan (general)";"JO.00";"NULL";"Initialisation de la valeur «JO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4578;1078;1;"Balqa";"JO.02";"NULL";"Initialisation de la valeur «JO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4579;1078;1;"Ma’an";"JO.07";"NULL";"Initialisation de la valeur «JO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4580;1078;1;"Karak";"JO.09";"NULL";"Initialisation de la valeur «JO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4581;1078;1;"Al Mafraq";"JO.10";"NULL";"Initialisation de la valeur «JO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4582;1078;1;"Amman";"JO.11";"NULL";"Initialisation de la valeur «JO.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4583;1078;1;"Tafielah";"JO.12";"NULL";"Initialisation de la valeur «JO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4584;1078;1;"Az Zarqa";"JO.13";"NULL";"Initialisation de la valeur «JO.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4585;1078;1;"Irbid";"JO.14";"NULL";"Initialisation de la valeur «JO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4586;1078;1;"Mafraq";"JO.15";"NULL";"Initialisation de la valeur «JO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4587;1078;1;"‘Ammān";"JO.16";"NULL";"Initialisation de la valeur «JO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4588;1078;1;"Zarqa";"JO.17";"NULL";"Initialisation de la valeur «JO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4589;1078;1;"Irbid";"JO.18";"NULL";"Initialisation de la valeur «JO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4590;1078;1;"Ma'an";"JO.19";"NULL";"Initialisation de la valeur «JO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4591;1078;1;"Ajlun";"JO.20";"NULL";"Initialisation de la valeur «JO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4592;1078;1;"Aqaba";"JO.21";"NULL";"Initialisation de la valeur «JO.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4593;1078;1;"Jerash";"JO.22";"NULL";"Initialisation de la valeur «JO.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4594;1078;1;"Madaba";"JO.23";"NULL";"Initialisation de la valeur «JO.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4595;1078;1;"Japan (general)";"JP.00";"NULL";"Initialisation de la valeur «JP.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4596;1078;1;"Aichi";"JP.01";"NULL";"Initialisation de la valeur «JP.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4597;1078;1;"Akita";"JP.02";"NULL";"Initialisation de la valeur «JP.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4598;1078;1;"Aomori";"JP.03";"NULL";"Initialisation de la valeur «JP.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4599;1078;1;"Chiba";"JP.04";"NULL";"Initialisation de la valeur «JP.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4600;1078;1;"Ehime";"JP.05";"NULL";"Initialisation de la valeur «JP.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4601;1078;1;"Fukui";"JP.06";"NULL";"Initialisation de la valeur «JP.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4602;1078;1;"Fukuoka";"JP.07";"NULL";"Initialisation de la valeur «JP.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4603;1078;1;"Fukushima";"JP.08";"NULL";"Initialisation de la valeur «JP.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4604;1078;1;"Gifu";"JP.09";"NULL";"Initialisation de la valeur «JP.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4605;1078;1;"Gumma";"JP.10";"NULL";"Initialisation de la valeur «JP.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4606;1078;1;"Hiroshima";"JP.11";"NULL";"Initialisation de la valeur «JP.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4607;1078;1;"Hokkaidō";"JP.12";"NULL";"Initialisation de la valeur «JP.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4608;1078;1;"Hyōgo";"JP.13";"NULL";"Initialisation de la valeur «JP.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4609;1078;1;"Ibaraki";"JP.14";"NULL";"Initialisation de la valeur «JP.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4610;1078;1;"Ishikawa";"JP.15";"NULL";"Initialisation de la valeur «JP.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4611;1078;1;"Iwate";"JP.16";"NULL";"Initialisation de la valeur «JP.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4612;1078;1;"Kagawa";"JP.17";"NULL";"Initialisation de la valeur «JP.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4613;1078;1;"Kagoshima";"JP.18";"NULL";"Initialisation de la valeur «JP.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4614;1078;1;"Kanagawa";"JP.19";"NULL";"Initialisation de la valeur «JP.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4615;1078;1;"Kōchi";"JP.20";"NULL";"Initialisation de la valeur «JP.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4616;1078;1;"Kumamoto";"JP.21";"NULL";"Initialisation de la valeur «JP.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4617;1078;1;"Kyōto";"JP.22";"NULL";"Initialisation de la valeur «JP.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4618;1078;1;"Mie";"JP.23";"NULL";"Initialisation de la valeur «JP.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4619;1078;1;"Miyagi";"JP.24";"NULL";"Initialisation de la valeur «JP.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4620;1078;1;"Miyazaki";"JP.25";"NULL";"Initialisation de la valeur «JP.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4621;1078;1;"Nagano";"JP.26";"NULL";"Initialisation de la valeur «JP.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4622;1078;1;"Nagasaki";"JP.27";"NULL";"Initialisation de la valeur «JP.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4623;1078;1;"Nara";"JP.28";"NULL";"Initialisation de la valeur «JP.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4624;1078;1;"Niigata";"JP.29";"NULL";"Initialisation de la valeur «JP.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4625;1078;1;"Ōita";"JP.30";"NULL";"Initialisation de la valeur «JP.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4626;1078;1;"Okayama";"JP.31";"NULL";"Initialisation de la valeur «JP.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4627;1078;1;"Ōsaka";"JP.32";"NULL";"Initialisation de la valeur «JP.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4628;1078;1;"Saga";"JP.33";"NULL";"Initialisation de la valeur «JP.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4629;1078;1;"Saitama";"JP.34";"NULL";"Initialisation de la valeur «JP.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4630;1078;1;"Shiga";"JP.35";"NULL";"Initialisation de la valeur «JP.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4631;1078;1;"Shimane";"JP.36";"NULL";"Initialisation de la valeur «JP.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4632;1078;1;"Shizuoka";"JP.37";"NULL";"Initialisation de la valeur «JP.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4633;1078;1;"Tochigi";"JP.38";"NULL";"Initialisation de la valeur «JP.38» pour la liste «75».";2009-07-29 00:00:00;1;1
4634;1078;1;"Tokushima";"JP.39";"NULL";"Initialisation de la valeur «JP.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4635;1078;1;"Tōkyō";"JP.40";"NULL";"Initialisation de la valeur «JP.40» pour la liste «75».";2009-07-29 00:00:00;1;1
4636;1078;1;"Tottori";"JP.41";"NULL";"Initialisation de la valeur «JP.41» pour la liste «75».";2009-07-29 00:00:00;1;1
4637;1078;1;"Toyama";"JP.42";"NULL";"Initialisation de la valeur «JP.42» pour la liste «75».";2009-07-29 00:00:00;1;1
4638;1078;1;"Wakayama";"JP.43";"NULL";"Initialisation de la valeur «JP.43» pour la liste «75».";2009-07-29 00:00:00;1;1
4639;1078;1;"Yamagata";"JP.44";"NULL";"Initialisation de la valeur «JP.44» pour la liste «75».";2009-07-29 00:00:00;1;1
4640;1078;1;"Yamaguchi";"JP.45";"NULL";"Initialisation de la valeur «JP.45» pour la liste «75».";2009-07-29 00:00:00;1;1
4641;1078;1;"Yamanashi";"JP.46";"NULL";"Initialisation de la valeur «JP.46» pour la liste «75».";2009-07-29 00:00:00;1;1
4642;1078;1;"Okinawa";"JP.47";"NULL";"Initialisation de la valeur «JP.47» pour la liste «75».";2009-07-29 00:00:00;1;1
4643;1078;1;"Kenya (general)";"KE.00";"NULL";"Initialisation de la valeur «KE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4644;1078;1;"Central";"KE.01";"NULL";"Initialisation de la valeur «KE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4645;1078;1;"Coast";"KE.02";"NULL";"Initialisation de la valeur «KE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4646;1078;1;"Eastern";"KE.03";"NULL";"Initialisation de la valeur «KE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4647;1078;1;"Nairobi Area";"KE.05";"NULL";"Initialisation de la valeur «KE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4648;1078;1;"North-Eastern";"KE.06";"NULL";"Initialisation de la valeur «KE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4649;1078;1;"Nyanza";"KE.07";"NULL";"Initialisation de la valeur «KE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4650;1078;1;"Rift Valley";"KE.08";"NULL";"Initialisation de la valeur «KE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4651;1078;1;"Western";"KE.09";"NULL";"Initialisation de la valeur «KE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4652;1078;1;"Kyrgyzstan (general)";"KG.00";"NULL";"Initialisation de la valeur «KG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4653;1078;1;"Bishkek";"KG.01";"NULL";"Initialisation de la valeur «KG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4654;1078;1;"Chüy";"KG.02";"NULL";"Initialisation de la valeur «KG.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4655;1078;1;"Jalal-Abad";"KG.03";"NULL";"Initialisation de la valeur «KG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4656;1078;1;"Naryn";"KG.04";"NULL";"Initialisation de la valeur «KG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4657;1078;1;"(KG05)";"KG.05";"NULL";"Initialisation de la valeur «KG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4658;1078;1;"Talas";"KG.06";"NULL";"Initialisation de la valeur «KG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4659;1078;1;"Ysyk-Köl";"KG.07";"NULL";"Initialisation de la valeur «KG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4660;1078;1;"Osh";"KG.08";"NULL";"Initialisation de la valeur «KG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4661;1078;1;"Batken";"KG.09";"NULL";"Initialisation de la valeur «KG.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4662;1078;1;"Khétt Bântéay Méan Cheăy";"KH.00";"NULL";"Initialisation de la valeur «KH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4663;1078;1;"Khétt Bătdâmbâng";"KH.01";"NULL";"Initialisation de la valeur «KH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4664;1078;1;"Kâmpóng Cham";"KH.02";"NULL";"Initialisation de la valeur «KH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4665;1078;1;"Kâmpóng Chhnăng";"KH.03";"NULL";"Initialisation de la valeur «KH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4666;1078;1;"Khétt Kâmpóng Spœ";"KH.04";"NULL";"Initialisation de la valeur «KH.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4667;1078;1;"Kâmpóng Thum";"KH.05";"NULL";"Initialisation de la valeur «KH.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4668;1078;1;"Khétt Kâmpôt";"KH.06";"NULL";"Initialisation de la valeur «KH.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4669;1078;1;"Kândal";"KH.07";"NULL";"Initialisation de la valeur «KH.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4670;1078;1;"Kaôh Kŏng";"KH.08";"NULL";"Initialisation de la valeur «KH.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4671;1078;1;"Krâchéh";"KH.09";"NULL";"Initialisation de la valeur «KH.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4672;1078;1;"Môndól Kiri";"KH.10";"NULL";"Initialisation de la valeur «KH.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4673;1078;1;"Phnum Penh";"KH.11";"NULL";"Initialisation de la valeur «KH.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4674;1078;1;"Poŭthĭsăt";"KH.12";"NULL";"Initialisation de la valeur «KH.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4675;1078;1;"Preăh Vihéar";"KH.13";"NULL";"Initialisation de la valeur «KH.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4676;1078;1;"Prey Vêng";"KH.14";"NULL";"Initialisation de la valeur «KH.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4677;1078;1;"Khétt Rôtânăh Kiri";"KH.15";"NULL";"Initialisation de la valeur «KH.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4678;1078;1;"Stœ̆ng Trêng";"KH.17";"NULL";"Initialisation de la valeur «KH.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4679;1078;1;"Svay Riĕng";"KH.18";"NULL";"Initialisation de la valeur «KH.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4680;1078;1;"Takêv";"KH.19";"NULL";"Initialisation de la valeur «KH.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4681;1078;1;"(CB20)";"KH.20";"NULL";"Initialisation de la valeur «KH.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4682;1078;1;"Kâmpôt";"KH.21";"NULL";"Initialisation de la valeur «KH.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4683;1078;1;"Phnum Pénh";"KH.22";"NULL";"Initialisation de la valeur «KH.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4684;1078;1;"Rôtânăh Kiri";"KH.23";"NULL";"Initialisation de la valeur «KH.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4685;1078;1;"Siĕm Réab";"KH.24";"NULL";"Initialisation de la valeur «KH.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4686;1078;1;"Bantéay Méan Cheăy";"KH.25";"NULL";"Initialisation de la valeur «KH.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4687;1078;1;"Kêb";"KH.26";"NULL";"Initialisation de la valeur «KH.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4688;1078;1;"Ŏtdâr Méan Cheăy";"KH.27";"NULL";"Initialisation de la valeur «KH.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4689;1078;1;"Preăh Seihânŭ";"KH.28";"NULL";"Initialisation de la valeur «KH.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4690;1078;1;"Bătdâmbâng";"KH.29";"NULL";"Initialisation de la valeur «KH.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4691;1078;1;"Palĭn";"KH.30";"NULL";"Initialisation de la valeur «KH.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4692;1078;1;"Line Islands";"KI.00";"NULL";"Initialisation de la valeur «KI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4693;1078;1;"Gilbert Islands";"KI.01";"NULL";"Initialisation de la valeur «KI.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4694;1078;1;"Line Islands";"KI.02";"NULL";"Initialisation de la valeur «KI.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4695;1078;1;"Phoenix Islands";"KI.03";"NULL";"Initialisation de la valeur «KI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4696;1078;1;"Comoros (general)";"KM.00";"NULL";"Initialisation de la valeur «KM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4697;1078;1;"Anjouan";"KM.01";"NULL";"Initialisation de la valeur «KM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4698;1078;1;"Grande Comore";"KM.02";"NULL";"Initialisation de la valeur «KM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4699;1078;1;"Mohéli";"KM.03";"NULL";"Initialisation de la valeur «KM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4700;1078;1;"Saint Kitts and Nevis (general)";"KN.00";"NULL";"Initialisation de la valeur «KN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4701;1078;1;"Christ Church Nichola Town";"KN.01";"NULL";"Initialisation de la valeur «KN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4702;1078;1;"Saint Anne Sandy Point";"KN.02";"NULL";"Initialisation de la valeur «KN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4703;1078;1;"Saint George Basseterre";"KN.03";"NULL";"Initialisation de la valeur «KN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4704;1078;1;"Saint George Gingerland";"KN.04";"NULL";"Initialisation de la valeur «KN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4705;1078;1;"Saint James Windwa";"KN.05";"NULL";"Initialisation de la valeur «KN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4706;1078;1;"Saint John Capesterre";"KN.06";"NULL";"Initialisation de la valeur «KN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4707;1078;1;"Saint John Figtree";"KN.07";"NULL";"Initialisation de la valeur «KN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4708;1078;1;"Saint Mary Cayon";"KN.08";"NULL";"Initialisation de la valeur «KN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4709;1078;1;"Saint Paul Capesterre";"KN.09";"NULL";"Initialisation de la valeur «KN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4710;1078;1;"Saint Paul Charlestown";"KN.10";"NULL";"Initialisation de la valeur «KN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4711;1078;1;"Saint Peter Basseterre";"KN.11";"NULL";"Initialisation de la valeur «KN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4712;1078;1;"Saint Thomas Lowland";"KN.12";"NULL";"Initialisation de la valeur «KN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4713;1078;1;"Saint Thomas Middle Island";"KN.13";"NULL";"Initialisation de la valeur «KN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4714;1078;1;"Trinity Palmetto Point";"KN.15";"NULL";"Initialisation de la valeur «KN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4715;1078;1;"North Korea (general)";"KP.00";"NULL";"Initialisation de la valeur «KP.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4716;1078;1;"Chagang-do";"KP.01";"NULL";"Initialisation de la valeur «KP.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4717;1078;1;"Hamgyŏng-namdo";"KP.03";"NULL";"Initialisation de la valeur «KP.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4718;1078;1;"Hwanghae-namdo";"KP.06";"NULL";"Initialisation de la valeur «KP.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4719;1078;1;"Hwanghae-bukto";"KP.07";"NULL";"Initialisation de la valeur «KP.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4720;1078;1;"Kaesŏng-si";"KP.08";"NULL";"Initialisation de la valeur «KP.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4721;1078;1;"Gangwon";"KP.09";"NULL";"Initialisation de la valeur «KP.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4722;1078;1;"P'yŏngan-bukto";"KP.11";"NULL";"Initialisation de la valeur «KP.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4723;1078;1;"P'yŏngyang-si";"KP.12";"NULL";"Initialisation de la valeur «KP.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4724;1078;1;"Yanggang-do";"KP.13";"NULL";"Initialisation de la valeur «KP.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4725;1078;1;"Namp'o-si";"KP.14";"NULL";"Initialisation de la valeur «KP.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4726;1078;1;"P'yŏngan-namdo";"KP.15";"NULL";"Initialisation de la valeur «KP.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4727;1078;1;"(KN16)";"KP.16";"NULL";"Initialisation de la valeur «KP.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4728;1078;1;"Hamgyŏng-bukto";"KP.17";"NULL";"Initialisation de la valeur «KP.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4729;1078;1;"Najin Sŏnbong-si";"KP.18";"NULL";"Initialisation de la valeur «KP.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4730;1078;1;"South Korea (general)";"KR.00";"NULL";"Initialisation de la valeur «KR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4731;1078;1;"Jeju";"KR.01";"NULL";"Initialisation de la valeur «KR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4732;1078;1;"North Jeolla";"KR.03";"NULL";"Initialisation de la valeur «KR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4733;1078;1;"North Chungcheong";"KR.05";"NULL";"Initialisation de la valeur «KR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4734;1078;1;"Gangwon";"KR.06";"NULL";"Initialisation de la valeur «KR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4735;1078;1;"Busan";"KR.10";"NULL";"Initialisation de la valeur «KR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4736;1078;1;"Seoul";"KR.11";"NULL";"Initialisation de la valeur «KR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4737;1078;1;"Incheon";"KR.12";"NULL";"Initialisation de la valeur «KR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4738;1078;1;"Gyeonggi";"KR.13";"NULL";"Initialisation de la valeur «KR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4739;1078;1;"North Gyeongsang";"KR.14";"NULL";"Initialisation de la valeur «KR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4740;1078;1;"Daegu";"KR.15";"NULL";"Initialisation de la valeur «KR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4741;1078;1;"South Jeolla";"KR.16";"NULL";"Initialisation de la valeur «KR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4742;1078;1;"South Chungcheong";"KR.17";"NULL";"Initialisation de la valeur «KR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4743;1078;1;"Gwangju";"KR.18";"NULL";"Initialisation de la valeur «KR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4744;1078;1;"Daejeon";"KR.19";"NULL";"Initialisation de la valeur «KR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4745;1078;1;"South Gyeongsang";"KR.20";"NULL";"Initialisation de la valeur «KR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4746;1078;1;"Ulsan";"KR.21";"NULL";"Initialisation de la valeur «KR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4747;1078;1;"Muḩāfaz̧atalWafrah";"KW.00";"NULL";"Initialisation de la valeur «KW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4748;1078;1;"Al ‘Āşimah";"KW.02";"NULL";"Initialisation de la valeur «KW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4749;1078;1;"Ḩawallī";"KW.03";"NULL";"Initialisation de la valeur «KW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4750;1078;1;"Al Aḩmadī";"KW.04";"NULL";"Initialisation de la valeur «KW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4751;1078;1;"Al Jahrāʼ";"KW.05";"NULL";"Initialisation de la valeur «KW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4752;1078;1;"Al Farwaniyah";"KW.06";"NULL";"Initialisation de la valeur «KW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4753;1078;1;"Cayman Islands (general)";"KY.00";"NULL";"Initialisation de la valeur «KY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4754;1078;1;"Creek";"KY.01";"NULL";"Initialisation de la valeur «KY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4755;1078;1;"Eastern";"KY.02";"NULL";"Initialisation de la valeur «KY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4756;1078;1;"Midland";"KY.03";"NULL";"Initialisation de la valeur «KY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4757;1078;1;"South Town";"KY.04";"NULL";"Initialisation de la valeur «KY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4758;1078;1;"Spot Bay";"KY.05";"NULL";"Initialisation de la valeur «KY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4759;1078;1;"Stake Bay";"KY.06";"NULL";"Initialisation de la valeur «KY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4760;1078;1;"West End";"KY.07";"NULL";"Initialisation de la valeur «KY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4761;1078;1;"Western";"KY.08";"NULL";"Initialisation de la valeur «KY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4762;1078;1;"Zhezqazghan Oblysy";"KZ.00";"NULL";"Initialisation de la valeur «KZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4763;1078;1;"Almaty";"KZ.01";"NULL";"Initialisation de la valeur «KZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4764;1078;1;"Almaty Qalasy";"KZ.02";"NULL";"Initialisation de la valeur «KZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4765;1078;1;"Aqmola";"KZ.03";"NULL";"Initialisation de la valeur «KZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4766;1078;1;"Aqtöbe";"KZ.04";"NULL";"Initialisation de la valeur «KZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4767;1078;1;"Astana Qalasy";"KZ.05";"NULL";"Initialisation de la valeur «KZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4768;1078;1;"Atyraū";"KZ.06";"NULL";"Initialisation de la valeur «KZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4769;1078;1;"Batys Qazaqstan";"KZ.07";"NULL";"Initialisation de la valeur «KZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4770;1078;1;"Mangghystaū";"KZ.09";"NULL";"Initialisation de la valeur «KZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4771;1078;1;"Ongtüstik Qazaqstan";"KZ.10";"NULL";"Initialisation de la valeur «KZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4772;1078;1;"Pavlodar";"KZ.11";"NULL";"Initialisation de la valeur «KZ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4773;1078;1;"Qaraghandy";"KZ.12";"NULL";"Initialisation de la valeur «KZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4774;1078;1;"Qostanay";"KZ.13";"NULL";"Initialisation de la valeur «KZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4775;1078;1;"Qyzylorda";"KZ.14";"NULL";"Initialisation de la valeur «KZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4776;1078;1;"East Kazakhstan";"KZ.15";"NULL";"Initialisation de la valeur «KZ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4777;1078;1;"Soltüstik Qazaqstan";"KZ.16";"NULL";"Initialisation de la valeur «KZ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4778;1078;1;"Zhambyl";"KZ.17";"NULL";"Initialisation de la valeur «KZ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4779;1078;1;"Laos (general)";"LA.00";"NULL";"Initialisation de la valeur «LA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4780;1078;1;"Attapu";"LA.01";"NULL";"Initialisation de la valeur «LA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4781;1078;1;"Champasak";"LA.02";"NULL";"Initialisation de la valeur «LA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4782;1078;1;"Houaphan";"LA.03";"NULL";"Initialisation de la valeur «LA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4783;1078;1;"Khammouan";"LA.04";"NULL";"Initialisation de la valeur «LA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4784;1078;1;"Louang Namtha";"LA.05";"NULL";"Initialisation de la valeur «LA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4785;1078;1;"Louangphrabang";"LA.06";"NULL";"Initialisation de la valeur «LA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4786;1078;1;"Oudômxai";"LA.07";"NULL";"Initialisation de la valeur «LA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4787;1078;1;"Phongsali";"LA.08";"NULL";"Initialisation de la valeur «LA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4788;1078;1;"Saravan";"LA.09";"NULL";"Initialisation de la valeur «LA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4789;1078;1;"Savannakhet";"LA.10";"NULL";"Initialisation de la valeur «LA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4790;1078;1;"Vientiane";"LA.11";"NULL";"Initialisation de la valeur «LA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4791;1078;1;"Xiagnabouli";"LA.13";"NULL";"Initialisation de la valeur «LA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4792;1078;1;"Xiangkhoang";"LA.14";"NULL";"Initialisation de la valeur «LA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4793;1078;1;"Khammouan";"LA.15";"NULL";"Initialisation de la valeur «LA.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4794;1078;1;"Loungnamtha";"LA.16";"NULL";"Initialisation de la valeur «LA.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4795;1078;1;"Louangphabang";"LA.17";"NULL";"Initialisation de la valeur «LA.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4796;1078;1;"Phôngsali";"LA.18";"NULL";"Initialisation de la valeur «LA.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4797;1078;1;"Salavan";"LA.19";"NULL";"Initialisation de la valeur «LA.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4798;1078;1;"Savannahkhét";"LA.20";"NULL";"Initialisation de la valeur «LA.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4799;1078;1;"Bokèo";"LA.22";"NULL";"Initialisation de la valeur «LA.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4800;1078;1;"Bolikhamxai";"LA.23";"NULL";"Initialisation de la valeur «LA.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4801;1078;1;"Viangchan";"LA.24";"NULL";"Initialisation de la valeur «LA.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4802;1078;1;"Xaisômboun";"LA.25";"NULL";"Initialisation de la valeur «LA.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4803;1078;1;"Xékong";"LA.26";"NULL";"Initialisation de la valeur «LA.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4804;1078;1;"Viangchan";"LA.27";"NULL";"Initialisation de la valeur «LA.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4805;1078;1;"Lebanon (general)";"LB.00";"NULL";"Initialisation de la valeur «LB.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4806;1078;1;"Béqaa";"LB.01";"NULL";"Initialisation de la valeur «LB.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4807;1078;1;"(LE02)";"LB.02";"NULL";"Initialisation de la valeur «LB.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4808;1078;1;"Liban-Nord";"LB.03";"NULL";"Initialisation de la valeur «LB.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4809;1078;1;"Beyrouth";"LB.04";"NULL";"Initialisation de la valeur «LB.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4810;1078;1;"Mont-Liban";"LB.05";"NULL";"Initialisation de la valeur «LB.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4811;1078;1;"Liban-Sud";"LB.06";"NULL";"Initialisation de la valeur «LB.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4812;1078;1;"Nabatîyé";"LB.07";"NULL";"Initialisation de la valeur «LB.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4813;1078;1;"Béqaa";"LB.08";"NULL";"Initialisation de la valeur «LB.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4814;1078;1;"Liban-Nord";"LB.09";"NULL";"Initialisation de la valeur «LB.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4815;1078;1;"Aakkâr";"LB.10";"NULL";"Initialisation de la valeur «LB.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4816;1078;1;"Baalbek-Hermel";"LB.11";"NULL";"Initialisation de la valeur «LB.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4817;1078;1;"Saint Lucia (general)";"LC.00";"NULL";"Initialisation de la valeur «LC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4818;1078;1;"Anse-la-Raye";"LC.01";"NULL";"Initialisation de la valeur «LC.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4819;1078;1;"Dauphin";"LC.02";"NULL";"Initialisation de la valeur «LC.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4820;1078;1;"Castries";"LC.03";"NULL";"Initialisation de la valeur «LC.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4821;1078;1;"Choiseul";"LC.04";"NULL";"Initialisation de la valeur «LC.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4822;1078;1;"Dennery";"LC.05";"NULL";"Initialisation de la valeur «LC.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4823;1078;1;"Gros-Islet";"LC.06";"NULL";"Initialisation de la valeur «LC.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4824;1078;1;"Laborie";"LC.07";"NULL";"Initialisation de la valeur «LC.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4825;1078;1;"Micoud";"LC.08";"NULL";"Initialisation de la valeur «LC.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4826;1078;1;"Soufrière";"LC.09";"NULL";"Initialisation de la valeur «LC.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4827;1078;1;"Vieux-Fort";"LC.10";"NULL";"Initialisation de la valeur «LC.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4828;1078;1;"Praslin";"LC.11";"NULL";"Initialisation de la valeur «LC.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4829;1078;1;"Liechtenstein (general)";"LI.00";"NULL";"Initialisation de la valeur «LI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4830;1078;1;"Balzers";"LI.01";"NULL";"Initialisation de la valeur «LI.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4831;1078;1;"Eschen";"LI.02";"NULL";"Initialisation de la valeur «LI.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4832;1078;1;"Gamprin";"LI.03";"NULL";"Initialisation de la valeur «LI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4833;1078;1;"Mauren";"LI.04";"NULL";"Initialisation de la valeur «LI.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4834;1078;1;"Planken";"LI.05";"NULL";"Initialisation de la valeur «LI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4835;1078;1;"Ruggell";"LI.06";"NULL";"Initialisation de la valeur «LI.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4836;1078;1;"Schaan";"LI.07";"NULL";"Initialisation de la valeur «LI.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4837;1078;1;"Schellenberg";"LI.08";"NULL";"Initialisation de la valeur «LI.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4838;1078;1;"Triesen";"LI.09";"NULL";"Initialisation de la valeur «LI.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4839;1078;1;"Triesenberg";"LI.10";"NULL";"Initialisation de la valeur «LI.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4840;1078;1;"Vaduz";"LI.11";"NULL";"Initialisation de la valeur «LI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4841;1078;1;"Sri Lanka (general)";"LK.00";"NULL";"Initialisation de la valeur «LK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4842;1078;1;"Central";"LK.29";"NULL";"Initialisation de la valeur «LK.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4843;1078;1;"North Central";"LK.30";"NULL";"Initialisation de la valeur «LK.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4844;1078;1;"North Eastern";"LK.31";"NULL";"Initialisation de la valeur «LK.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4845;1078;1;"North Western";"LK.32";"NULL";"Initialisation de la valeur «LK.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4846;1078;1;"Sabaragamuwa";"LK.33";"NULL";"Initialisation de la valeur «LK.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4847;1078;1;"Southern";"LK.34";"NULL";"Initialisation de la valeur «LK.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4848;1078;1;"Uva";"LK.35";"NULL";"Initialisation de la valeur «LK.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4849;1078;1;"Western";"LK.36";"NULL";"Initialisation de la valeur «LK.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4850;1078;1;"Liberia (general)";"LR.00";"NULL";"Initialisation de la valeur «LR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4851;1078;1;"Bong";"LR.01";"NULL";"Initialisation de la valeur «LR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4852;1078;1;"Grand Jide";"LR.02";"NULL";"Initialisation de la valeur «LR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4853;1078;1;"Grand Cape Mount";"LR.04";"NULL";"Initialisation de la valeur «LR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4854;1078;1;"Lofa";"LR.05";"NULL";"Initialisation de la valeur «LR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4855;1078;1;"(LI08)";"LR.08";"NULL";"Initialisation de la valeur «LR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4856;1078;1;"Nimba";"LR.09";"NULL";"Initialisation de la valeur «LR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4857;1078;1;"Sinoe";"LR.10";"NULL";"Initialisation de la valeur «LR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4858;1078;1;"Grand Bassa County";"LR.11";"NULL";"Initialisation de la valeur «LR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4859;1078;1;"Grand Cape Mount";"LR.12";"NULL";"Initialisation de la valeur «LR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4860;1078;1;"Maryland";"LR.13";"NULL";"Initialisation de la valeur «LR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4861;1078;1;"Montserrado";"LR.14";"NULL";"Initialisation de la valeur «LR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4862;1078;1;"Bomi";"LR.15";"NULL";"Initialisation de la valeur «LR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4863;1078;1;"Grand Kru";"LR.16";"NULL";"Initialisation de la valeur «LR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4864;1078;1;"Margibi";"LR.17";"NULL";"Initialisation de la valeur «LR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4865;1078;1;"River Cess";"LR.18";"NULL";"Initialisation de la valeur «LR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4866;1078;1;"Grand Gedeh";"LR.19";"NULL";"Initialisation de la valeur «LR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4867;1078;1;"Lofa";"LR.20";"NULL";"Initialisation de la valeur «LR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4868;1078;1;"Gbarpolu";"LR.21";"NULL";"Initialisation de la valeur «LR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4869;1078;1;"River Gee";"LR.22";"NULL";"Initialisation de la valeur «LR.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4870;1078;1;"Lesotho (general)";"LS.00";"NULL";"Initialisation de la valeur «LS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4871;1078;1;"Balzers Commune";"LS.01";"NULL";"Initialisation de la valeur «LS.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4872;1078;1;"Eschen Commune";"LS.02";"NULL";"Initialisation de la valeur «LS.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4873;1078;1;"Gamprin Commune";"LS.03";"NULL";"Initialisation de la valeur «LS.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4874;1078;1;"Mauren Commune";"LS.04";"NULL";"Initialisation de la valeur «LS.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4875;1078;1;"Planken Commune";"LS.05";"NULL";"Initialisation de la valeur «LS.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4876;1078;1;"Ruggell Commune";"LS.06";"NULL";"Initialisation de la valeur «LS.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4877;1078;1;"Berea District";"LS.10";"NULL";"Initialisation de la valeur «LS.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4878;1078;1;"Butha-Buthe District";"LS.11";"NULL";"Initialisation de la valeur «LS.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4879;1078;1;"Leribe District";"LS.12";"NULL";"Initialisation de la valeur «LS.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4880;1078;1;"Mafeteng";"LS.13";"NULL";"Initialisation de la valeur «LS.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4881;1078;1;"Maseru";"LS.14";"NULL";"Initialisation de la valeur «LS.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4882;1078;1;"Mohaleʼs Hoek";"LS.15";"NULL";"Initialisation de la valeur «LS.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4883;1078;1;"Mokhotlong";"LS.16";"NULL";"Initialisation de la valeur «LS.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4884;1078;1;"Qachaʼs Nek";"LS.17";"NULL";"Initialisation de la valeur «LS.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4885;1078;1;"Quthing District";"LS.18";"NULL";"Initialisation de la valeur «LS.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4886;1078;1;"Thaba-Tseka District";"LS.19";"NULL";"Initialisation de la valeur «LS.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4887;1078;1;"Lithuania (general)";"LT.00";"NULL";"Initialisation de la valeur «LT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4888;1078;1;"(LH40)";"LT.40";"NULL";"Initialisation de la valeur «LT.40» pour la liste «75».";2009-07-29 00:00:00;1;1
4889;1078;1;"Alytaus Apskritis";"LT.56";"NULL";"Initialisation de la valeur «LT.56» pour la liste «75».";2009-07-29 00:00:00;1;1
4890;1078;1;"Kauno Apskritis";"LT.57";"NULL";"Initialisation de la valeur «LT.57» pour la liste «75».";2009-07-29 00:00:00;1;1
4891;1078;1;"Klaipėdos Apskritis";"LT.58";"NULL";"Initialisation de la valeur «LT.58» pour la liste «75».";2009-07-29 00:00:00;1;1
4892;1078;1;"Marijampolės Apskritis";"LT.59";"NULL";"Initialisation de la valeur «LT.59» pour la liste «75».";2009-07-29 00:00:00;1;1
4893;1078;1;"Panevėžio Apskritis";"LT.60";"NULL";"Initialisation de la valeur «LT.60» pour la liste «75».";2009-07-29 00:00:00;1;1
4894;1078;1;"Šiaulių Apskritis";"LT.61";"NULL";"Initialisation de la valeur «LT.61» pour la liste «75».";2009-07-29 00:00:00;1;1
4895;1078;1;"Tauragės Apskritis";"LT.62";"NULL";"Initialisation de la valeur «LT.62» pour la liste «75».";2009-07-29 00:00:00;1;1
4896;1078;1;"Telšių Apskritis";"LT.63";"NULL";"Initialisation de la valeur «LT.63» pour la liste «75».";2009-07-29 00:00:00;1;1
4897;1078;1;"Utenos Apskritis";"LT.64";"NULL";"Initialisation de la valeur «LT.64» pour la liste «75».";2009-07-29 00:00:00;1;1
4898;1078;1;"Vilniaus Apskritis";"LT.65";"NULL";"Initialisation de la valeur «LT.65» pour la liste «75».";2009-07-29 00:00:00;1;1
4899;1078;1;"Luxembourg (general)";"LU.00";"NULL";"Initialisation de la valeur «LU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4900;1078;1;"Diekirch";"LU.01";"NULL";"Initialisation de la valeur «LU.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4901;1078;1;"Grevenmacher";"LU.02";"NULL";"Initialisation de la valeur «LU.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4902;1078;1;"Luxembourg";"LU.03";"NULL";"Initialisation de la valeur «LU.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4903;1078;1;"Dobeles Rajons";"LV.00";"NULL";"Initialisation de la valeur «LV.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4904;1078;1;"Aizkraukles Rajons";"LV.01";"NULL";"Initialisation de la valeur «LV.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4905;1078;1;"Alūksnes Rajons";"LV.02";"NULL";"Initialisation de la valeur «LV.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4906;1078;1;"Balvu Rajons";"LV.03";"NULL";"Initialisation de la valeur «LV.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4907;1078;1;"Bauskas Rajons";"LV.04";"NULL";"Initialisation de la valeur «LV.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4908;1078;1;"Cēsu Rajons";"LV.05";"NULL";"Initialisation de la valeur «LV.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4909;1078;1;"Daugavpils";"LV.06";"NULL";"Initialisation de la valeur «LV.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4910;1078;1;"Daugavpils Rajons";"LV.07";"NULL";"Initialisation de la valeur «LV.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4911;1078;1;"Dobeles Rajons";"LV.08";"NULL";"Initialisation de la valeur «LV.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4912;1078;1;"Gulbenes Rajons";"LV.09";"NULL";"Initialisation de la valeur «LV.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4913;1078;1;"Jēkabpils Rajons";"LV.10";"NULL";"Initialisation de la valeur «LV.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4914;1078;1;"Jelgava";"LV.11";"NULL";"Initialisation de la valeur «LV.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4915;1078;1;"Jelgavas Rajons";"LV.12";"NULL";"Initialisation de la valeur «LV.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4916;1078;1;"Jūrmala";"LV.13";"NULL";"Initialisation de la valeur «LV.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4917;1078;1;"Krāslavas Rajons";"LV.14";"NULL";"Initialisation de la valeur «LV.14» pour la liste «75».";2009-07-29 00:00:00;1;1
4918;1078;1;"Kuldīgas Rajons";"LV.15";"NULL";"Initialisation de la valeur «LV.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4919;1078;1;"Liepāja";"LV.16";"NULL";"Initialisation de la valeur «LV.16» pour la liste «75».";2009-07-29 00:00:00;1;1
4920;1078;1;"Liepājas Rajons";"LV.17";"NULL";"Initialisation de la valeur «LV.17» pour la liste «75».";2009-07-29 00:00:00;1;1
4921;1078;1;"Limbažu Rajons";"LV.18";"NULL";"Initialisation de la valeur «LV.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4922;1078;1;"Ludzas Rajons";"LV.19";"NULL";"Initialisation de la valeur «LV.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4923;1078;1;"Madonas Rajons";"LV.20";"NULL";"Initialisation de la valeur «LV.20» pour la liste «75».";2009-07-29 00:00:00;1;1
4924;1078;1;"Ogres Rajons";"LV.21";"NULL";"Initialisation de la valeur «LV.21» pour la liste «75».";2009-07-29 00:00:00;1;1
4925;1078;1;"Preiļu Rajons";"LV.22";"NULL";"Initialisation de la valeur «LV.22» pour la liste «75».";2009-07-29 00:00:00;1;1
4926;1078;1;"Rēzekne";"LV.23";"NULL";"Initialisation de la valeur «LV.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4927;1078;1;"Rēzeknes Rajons";"LV.24";"NULL";"Initialisation de la valeur «LV.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4928;1078;1;"Rīga";"LV.25";"NULL";"Initialisation de la valeur «LV.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4929;1078;1;"Rīgas Rajons";"LV.26";"NULL";"Initialisation de la valeur «LV.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4930;1078;1;"Saldus Rajons";"LV.27";"NULL";"Initialisation de la valeur «LV.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4931;1078;1;"Talsu Rajons";"LV.28";"NULL";"Initialisation de la valeur «LV.28» pour la liste «75».";2009-07-29 00:00:00;1;1
4932;1078;1;"Tukuma Rajons";"LV.29";"NULL";"Initialisation de la valeur «LV.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4933;1078;1;"Valkas Rajons";"LV.30";"NULL";"Initialisation de la valeur «LV.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4934;1078;1;"Valmieras Rajons";"LV.31";"NULL";"Initialisation de la valeur «LV.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4935;1078;1;"Ventspils";"LV.32";"NULL";"Initialisation de la valeur «LV.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4936;1078;1;"Ventspils Rajons";"LV.33";"NULL";"Initialisation de la valeur «LV.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4937;1078;1;"Libya (general)";"LY.00";"NULL";"Initialisation de la valeur «LY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
4938;1078;1;"Baladīyat al Abyār";"LY.02";"NULL";"Initialisation de la valeur «LY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4939;1078;1;"Al ‘Azīzīyah";"LY.03";"NULL";"Initialisation de la valeur «LY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4940;1078;1;"Baladīyat al Bayḑā'";"LY.04";"NULL";"Initialisation de la valeur «LY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4941;1078;1;"Al Jufrah";"LY.05";"NULL";"Initialisation de la valeur «LY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4942;1078;1;"Baladīyat al Jumayl";"LY.06";"NULL";"Initialisation de la valeur «LY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4943;1078;1;"Al Kufrah";"LY.08";"NULL";"Initialisation de la valeur «LY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4944;1078;1;"Baladīyat al Marj";"LY.09";"NULL";"Initialisation de la valeur «LY.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4945;1078;1;"Baladīyat al Qarābūll";"LY.10";"NULL";"Initialisation de la valeur «LY.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4946;1078;1;"Baladīyat al Qubbah";"LY.11";"NULL";"Initialisation de la valeur «LY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4947;1078;1;"Baladīyat al `Ujaylāt";"LY.12";"NULL";"Initialisation de la valeur «LY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
4948;1078;1;"Ash Shāţiʼ";"LY.13";"NULL";"Initialisation de la valeur «LY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
4949;1078;1;"Baladīyat az Zahrā'";"LY.15";"NULL";"Initialisation de la valeur «LY.15» pour la liste «75».";2009-07-29 00:00:00;1;1
4950;1078;1;"Baladīyat Banī Walīd";"LY.18";"NULL";"Initialisation de la valeur «LY.18» pour la liste «75».";2009-07-29 00:00:00;1;1
4951;1078;1;"Baladīyat Bin Jawwād";"LY.19";"NULL";"Initialisation de la valeur «LY.19» pour la liste «75».";2009-07-29 00:00:00;1;1
4952;1078;1;"Baladīyat Ghāt";"LY.23";"NULL";"Initialisation de la valeur «LY.23» pour la liste «75».";2009-07-29 00:00:00;1;1
4953;1078;1;"Baladīyat Jādū";"LY.24";"NULL";"Initialisation de la valeur «LY.24» pour la liste «75».";2009-07-29 00:00:00;1;1
4954;1078;1;"Baladīyat Jālū";"LY.25";"NULL";"Initialisation de la valeur «LY.25» pour la liste «75».";2009-07-29 00:00:00;1;1
4955;1078;1;"Baladīyat Janzūr";"LY.26";"NULL";"Initialisation de la valeur «LY.26» pour la liste «75».";2009-07-29 00:00:00;1;1
4956;1078;1;"Masallatah";"LY.27";"NULL";"Initialisation de la valeur «LY.27» pour la liste «75».";2009-07-29 00:00:00;1;1
4957;1078;1;"Baladīyat Mizdah";"LY.29";"NULL";"Initialisation de la valeur «LY.29» pour la liste «75».";2009-07-29 00:00:00;1;1
4958;1078;1;"Murzuq";"LY.30";"NULL";"Initialisation de la valeur «LY.30» pour la liste «75».";2009-07-29 00:00:00;1;1
4959;1078;1;"Baladīyat Nālūt";"LY.31";"NULL";"Initialisation de la valeur «LY.31» pour la liste «75».";2009-07-29 00:00:00;1;1
4960;1078;1;"Baladīyat Qamīnis";"LY.32";"NULL";"Initialisation de la valeur «LY.32» pour la liste «75».";2009-07-29 00:00:00;1;1
4961;1078;1;"Baladīyat Qaşr Bin Ghashīr";"LY.33";"NULL";"Initialisation de la valeur «LY.33» pour la liste «75».";2009-07-29 00:00:00;1;1
4962;1078;1;"Sabhā";"LY.34";"NULL";"Initialisation de la valeur «LY.34» pour la liste «75».";2009-07-29 00:00:00;1;1
4963;1078;1;"Baladīyat Şabrātah";"LY.35";"NULL";"Initialisation de la valeur «LY.35» pour la liste «75».";2009-07-29 00:00:00;1;1
4964;1078;1;"Baladīyat Shaḩḩāt";"LY.36";"NULL";"Initialisation de la valeur «LY.36» pour la liste «75».";2009-07-29 00:00:00;1;1
4965;1078;1;"Baladīyat Şurmān";"LY.37";"NULL";"Initialisation de la valeur «LY.37» pour la liste «75».";2009-07-29 00:00:00;1;1
4966;1078;1;"Tajura’ ";"LY.39";"NULL";"Initialisation de la valeur «LY.39» pour la liste «75».";2009-07-29 00:00:00;1;1
4967;1078;1;"Tarhūnah";"LY.41";"NULL";"Initialisation de la valeur «LY.41» pour la liste «75».";2009-07-29 00:00:00;1;1
4968;1078;1;"Ţubruq";"LY.42";"NULL";"Initialisation de la valeur «LY.42» pour la liste «75».";2009-07-29 00:00:00;1;1
4969;1078;1;"Baladīyat Tūkrah";"LY.43";"NULL";"Initialisation de la valeur «LY.43» pour la liste «75».";2009-07-29 00:00:00;1;1
4970;1078;1;"Zlīţan";"LY.45";"NULL";"Initialisation de la valeur «LY.45» pour la liste «75».";2009-07-29 00:00:00;1;1
4971;1078;1;"Baladīyat Zuwārah";"LY.46";"NULL";"Initialisation de la valeur «LY.46» pour la liste «75».";2009-07-29 00:00:00;1;1
4972;1078;1;"Ajdābiyā";"LY.47";"NULL";"Initialisation de la valeur «LY.47» pour la liste «75».";2009-07-29 00:00:00;1;1
4973;1078;1;"Al Fātiḩ";"LY.48";"NULL";"Initialisation de la valeur «LY.48» pour la liste «75».";2009-07-29 00:00:00;1;1
4974;1078;1;"Al Jabal al Akhḑar";"LY.49";"NULL";"Initialisation de la valeur «LY.49» pour la liste «75».";2009-07-29 00:00:00;1;1
4975;1078;1;"Al Khums";"LY.50";"NULL";"Initialisation de la valeur «LY.50» pour la liste «75».";2009-07-29 00:00:00;1;1
4976;1078;1;"An Nuqāţ al Khams";"LY.51";"NULL";"Initialisation de la valeur «LY.51» pour la liste «75».";2009-07-29 00:00:00;1;1
4977;1078;1;"Awbārī";"LY.52";"NULL";"Initialisation de la valeur «LY.52» pour la liste «75».";2009-07-29 00:00:00;1;1
4978;1078;1;"Az Zāwiyah";"LY.53";"NULL";"Initialisation de la valeur «LY.53» pour la liste «75».";2009-07-29 00:00:00;1;1
4979;1078;1;"Banghāzī";"LY.54";"NULL";"Initialisation de la valeur «LY.54» pour la liste «75».";2009-07-29 00:00:00;1;1
4980;1078;1;"Darnah";"LY.55";"NULL";"Initialisation de la valeur «LY.55» pour la liste «75».";2009-07-29 00:00:00;1;1
4981;1078;1;"Ghadāmis";"LY.56";"NULL";"Initialisation de la valeur «LY.56» pour la liste «75».";2009-07-29 00:00:00;1;1
4982;1078;1;"Gharyān";"LY.57";"NULL";"Initialisation de la valeur «LY.57» pour la liste «75».";2009-07-29 00:00:00;1;1
4983;1078;1;"Mişrātah";"LY.58";"NULL";"Initialisation de la valeur «LY.58» pour la liste «75».";2009-07-29 00:00:00;1;1
4984;1078;1;"Sawfajjīn";"LY.59";"NULL";"Initialisation de la valeur «LY.59» pour la liste «75».";2009-07-29 00:00:00;1;1
4985;1078;1;"Surt";"LY.60";"NULL";"Initialisation de la valeur «LY.60» pour la liste «75».";2009-07-29 00:00:00;1;1
4986;1078;1;"Ţarābulus";"LY.61";"NULL";"Initialisation de la valeur «LY.61» pour la liste «75».";2009-07-29 00:00:00;1;1
4987;1078;1;"Yafran";"LY.62";"NULL";"Initialisation de la valeur «LY.62» pour la liste «75».";2009-07-29 00:00:00;1;1
4988;1078;1;"Agadir";"MA.01";"NULL";"Initialisation de la valeur «MA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
4989;1078;1;"Al Hoceïma";"MA.02";"NULL";"Initialisation de la valeur «MA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
4990;1078;1;"Azizal";"MA.03";"NULL";"Initialisation de la valeur «MA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
4991;1078;1;"Ben Slimane";"MA.04";"NULL";"Initialisation de la valeur «MA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
4992;1078;1;"Beni Mellal";"MA.05";"NULL";"Initialisation de la valeur «MA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
4993;1078;1;"Boulemane";"MA.06";"NULL";"Initialisation de la valeur «MA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
4994;1078;1;"Casablanca";"MA.07";"NULL";"Initialisation de la valeur «MA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
4995;1078;1;"Chaouen";"MA.08";"NULL";"Initialisation de la valeur «MA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
4996;1078;1;"El Jadida";"MA.09";"NULL";"Initialisation de la valeur «MA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
4997;1078;1;"El Kelaa des Srarhna";"MA.10";"NULL";"Initialisation de la valeur «MA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
4998;1078;1;"Er Rachidia";"MA.11";"NULL";"Initialisation de la valeur «MA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
4999;1078;1;"Essaouira";"MA.12";"NULL";"Initialisation de la valeur «MA.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5000;1078;1;"Fes";"MA.13";"NULL";"Initialisation de la valeur «MA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5001;1078;1;"Figuig";"MA.14";"NULL";"Initialisation de la valeur «MA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5002;1078;1;"Kenitra";"MA.15";"NULL";"Initialisation de la valeur «MA.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5003;1078;1;"Khemisset";"MA.16";"NULL";"Initialisation de la valeur «MA.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5004;1078;1;"Khenifra";"MA.17";"NULL";"Initialisation de la valeur «MA.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5005;1078;1;"Khouribga";"MA.18";"NULL";"Initialisation de la valeur «MA.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5006;1078;1;"Marrakech";"MA.19";"NULL";"Initialisation de la valeur «MA.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5007;1078;1;"Meknes";"MA.20";"NULL";"Initialisation de la valeur «MA.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5008;1078;1;"Nador";"MA.21";"NULL";"Initialisation de la valeur «MA.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5009;1078;1;"Ouarzazate";"MA.22";"NULL";"Initialisation de la valeur «MA.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5010;1078;1;"Oujda";"MA.23";"NULL";"Initialisation de la valeur «MA.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5011;1078;1;"Rabat-Sale";"MA.24";"NULL";"Initialisation de la valeur «MA.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5012;1078;1;"Safi";"MA.25";"NULL";"Initialisation de la valeur «MA.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5013;1078;1;"Settat";"MA.26";"NULL";"Initialisation de la valeur «MA.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5014;1078;1;"Tanger";"MA.27";"NULL";"Initialisation de la valeur «MA.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5015;1078;1;"Tata";"MA.29";"NULL";"Initialisation de la valeur «MA.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5016;1078;1;"Taza";"MA.30";"NULL";"Initialisation de la valeur «MA.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5017;1078;1;"Tiznit";"MA.32";"NULL";"Initialisation de la valeur «MA.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5018;1078;1;"Guelmim";"MA.33";"NULL";"Initialisation de la valeur «MA.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5019;1078;1;"Ifrane";"MA.34";"NULL";"Initialisation de la valeur «MA.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5020;1078;1;"Laayoune";"MA.35";"NULL";"Initialisation de la valeur «MA.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5021;1078;1;"Tan-Tan";"MA.36";"NULL";"Initialisation de la valeur «MA.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5022;1078;1;"Taounate";"MA.37";"NULL";"Initialisation de la valeur «MA.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5023;1078;1;"Sidi Kacem";"MA.38";"NULL";"Initialisation de la valeur «MA.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5024;1078;1;"Taroudannt";"MA.39";"NULL";"Initialisation de la valeur «MA.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5025;1078;1;"Tetouan";"MA.40";"NULL";"Initialisation de la valeur «MA.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5026;1078;1;"Larache";"MA.41";"NULL";"Initialisation de la valeur «MA.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5027;1078;1;"(MO42)";"MA.42";"NULL";"Initialisation de la valeur «MA.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5028;1078;1;"(MO43)";"MA.43";"NULL";"Initialisation de la valeur «MA.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5029;1078;1;"(MO44)";"MA.44";"NULL";"Initialisation de la valeur «MA.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5030;1078;1;"Grand Casablanca";"MA.45";"NULL";"Initialisation de la valeur «MA.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5031;1078;1;"Fès-Boulemane";"MA.46";"NULL";"Initialisation de la valeur «MA.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5032;1078;1;"Marrakech-Tensift-Al Haouz";"MA.47";"NULL";"Initialisation de la valeur «MA.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5033;1078;1;"Meknès-Tafilalet";"MA.48";"NULL";"Initialisation de la valeur «MA.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5034;1078;1;"Rabat-Salé-Zemmour-Zaër";"MA.49";"NULL";"Initialisation de la valeur «MA.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5035;1078;1;"Chaouia-Ouardigha";"MA.50";"NULL";"Initialisation de la valeur «MA.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5036;1078;1;"Doukkala-Abda";"MA.51";"NULL";"Initialisation de la valeur «MA.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5037;1078;1;"Gharb-Chrarda-Beni Hssen";"MA.52";"NULL";"Initialisation de la valeur «MA.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5038;1078;1;"Guelmim-Es Smara";"MA.53";"NULL";"Initialisation de la valeur «MA.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5039;1078;1;"Oriental";"MA.54";"NULL";"Initialisation de la valeur «MA.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5040;1078;1;"Souss-Massa-Drâa";"MA.55";"NULL";"Initialisation de la valeur «MA.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5041;1078;1;"Tadla-Azilal";"MA.56";"NULL";"Initialisation de la valeur «MA.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5042;1078;1;"Tanger-Tétouan";"MA.57";"NULL";"Initialisation de la valeur «MA.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5043;1078;1;"Taza-Al Hoceima-Taounate";"MA.58";"NULL";"Initialisation de la valeur «MA.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5044;1078;1;"Laâyoune-Boujdour-Sakia El Hamra";"MA.59";"NULL";"Initialisation de la valeur «MA.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5045;1078;1;"Monaco (general)";"MC.00";"NULL";"Initialisation de la valeur «MC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5046;1078;1;"Ungheni Judetul";"MD.00";"NULL";"Initialisation de la valeur «MD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5047;1078;1;"(MD13)";"MD.13";"NULL";"Initialisation de la valeur «MD.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5048;1078;1;"Balti";"MD.46";"NULL";"Initialisation de la valeur «MD.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5049;1078;1;"Cahul";"MD.47";"NULL";"Initialisation de la valeur «MD.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5050;1078;1;"Stinga Nistrului";"MD.49";"NULL";"Initialisation de la valeur «MD.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5051;1078;1;"Edinet";"MD.50";"NULL";"Initialisation de la valeur «MD.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5052;1078;1;"Găgăuzia";"MD.51";"NULL";"Initialisation de la valeur «MD.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5053;1078;1;"Lapusna";"MD.52";"NULL";"Initialisation de la valeur «MD.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5054;1078;1;"Orhei";"MD.53";"NULL";"Initialisation de la valeur «MD.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5055;1078;1;"Soroca";"MD.54";"NULL";"Initialisation de la valeur «MD.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5056;1078;1;"Tighina";"MD.55";"NULL";"Initialisation de la valeur «MD.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5057;1078;1;"Ungheni";"MD.56";"NULL";"Initialisation de la valeur «MD.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5058;1078;1;"Chişinău";"MD.57";"NULL";"Initialisation de la valeur «MD.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5059;1078;1;"Stînga Nistrului";"MD.58";"NULL";"Initialisation de la valeur «MD.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5060;1078;1;"Raionul Anenii Noi";"MD.59";"NULL";"Initialisation de la valeur «MD.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5061;1078;1;"Bălţi";"MD.60";"NULL";"Initialisation de la valeur «MD.60» pour la liste «75».";2009-07-29 00:00:00;1;1
5062;1078;1;"Raionul Basarabeasca";"MD.61";"NULL";"Initialisation de la valeur «MD.61» pour la liste «75».";2009-07-29 00:00:00;1;1
5063;1078;1;"Bender";"MD.62";"NULL";"Initialisation de la valeur «MD.62» pour la liste «75».";2009-07-29 00:00:00;1;1
5064;1078;1;"Raionul Briceni";"MD.63";"NULL";"Initialisation de la valeur «MD.63» pour la liste «75».";2009-07-29 00:00:00;1;1
5065;1078;1;"Raionul Cahul";"MD.64";"NULL";"Initialisation de la valeur «MD.64» pour la liste «75».";2009-07-29 00:00:00;1;1
5066;1078;1;"Raionul Cantemir";"MD.65";"NULL";"Initialisation de la valeur «MD.65» pour la liste «75».";2009-07-29 00:00:00;1;1
5067;1078;1;"Călăraşi";"MD.66";"NULL";"Initialisation de la valeur «MD.66» pour la liste «75».";2009-07-29 00:00:00;1;1
5068;1078;1;"Căuşeni";"MD.67";"NULL";"Initialisation de la valeur «MD.67» pour la liste «75».";2009-07-29 00:00:00;1;1
5069;1078;1;"Raionul Cimişlia";"MD.68";"NULL";"Initialisation de la valeur «MD.68» pour la liste «75».";2009-07-29 00:00:00;1;1
5070;1078;1;"Raionul Criuleni";"MD.69";"NULL";"Initialisation de la valeur «MD.69» pour la liste «75».";2009-07-29 00:00:00;1;1
5071;1078;1;"Raionul Donduşeni";"MD.70";"NULL";"Initialisation de la valeur «MD.70» pour la liste «75».";2009-07-29 00:00:00;1;1
5072;1078;1;"Raionul Drochia";"MD.71";"NULL";"Initialisation de la valeur «MD.71» pour la liste «75».";2009-07-29 00:00:00;1;1
5073;1078;1;"Dubăsari";"MD.72";"NULL";"Initialisation de la valeur «MD.72» pour la liste «75».";2009-07-29 00:00:00;1;1
5074;1078;1;"Raionul Edineţ";"MD.73";"NULL";"Initialisation de la valeur «MD.73» pour la liste «75».";2009-07-29 00:00:00;1;1
5075;1078;1;"Raionul Făleşti";"MD.74";"NULL";"Initialisation de la valeur «MD.74» pour la liste «75».";2009-07-29 00:00:00;1;1
5076;1078;1;"Raionul Floreşti";"MD.75";"NULL";"Initialisation de la valeur «MD.75» pour la liste «75».";2009-07-29 00:00:00;1;1
5077;1078;1;"Raionul Glodeni";"MD.76";"NULL";"Initialisation de la valeur «MD.76» pour la liste «75».";2009-07-29 00:00:00;1;1
5078;1078;1;"Raionul Hînceşti";"MD.77";"NULL";"Initialisation de la valeur «MD.77» pour la liste «75».";2009-07-29 00:00:00;1;1
5079;1078;1;"Raionul Ialoveni";"MD.78";"NULL";"Initialisation de la valeur «MD.78» pour la liste «75».";2009-07-29 00:00:00;1;1
5080;1078;1;"Raionul Leova";"MD.79";"NULL";"Initialisation de la valeur «MD.79» pour la liste «75».";2009-07-29 00:00:00;1;1
5081;1078;1;"Raionul Nisporeni";"MD.80";"NULL";"Initialisation de la valeur «MD.80» pour la liste «75».";2009-07-29 00:00:00;1;1
5082;1078;1;"Raionul Ocniţa";"MD.81";"NULL";"Initialisation de la valeur «MD.81» pour la liste «75».";2009-07-29 00:00:00;1;1
5083;1078;1;"Raionul Orhei";"MD.82";"NULL";"Initialisation de la valeur «MD.82» pour la liste «75».";2009-07-29 00:00:00;1;1
5084;1078;1;"Raionul Rezina";"MD.83";"NULL";"Initialisation de la valeur «MD.83» pour la liste «75».";2009-07-29 00:00:00;1;1
5085;1078;1;"Raionul Rîşcani";"MD.84";"NULL";"Initialisation de la valeur «MD.84» pour la liste «75».";2009-07-29 00:00:00;1;1
5086;1078;1;"Raionul Sîngerei";"MD.85";"NULL";"Initialisation de la valeur «MD.85» pour la liste «75».";2009-07-29 00:00:00;1;1
5087;1078;1;"Raionul Şoldăneşti";"MD.86";"NULL";"Initialisation de la valeur «MD.86» pour la liste «75».";2009-07-29 00:00:00;1;1
5088;1078;1;"Raionul Soroca";"MD.87";"NULL";"Initialisation de la valeur «MD.87» pour la liste «75».";2009-07-29 00:00:00;1;1
5089;1078;1;"Ştefan-Vodă";"MD.88";"NULL";"Initialisation de la valeur «MD.88» pour la liste «75».";2009-07-29 00:00:00;1;1
5090;1078;1;"Raionul Străşeni";"MD.89";"NULL";"Initialisation de la valeur «MD.89» pour la liste «75».";2009-07-29 00:00:00;1;1
5091;1078;1;"Raionul Taraclia";"MD.90";"NULL";"Initialisation de la valeur «MD.90» pour la liste «75».";2009-07-29 00:00:00;1;1
5092;1078;1;"Raionul Teleneşti";"MD.91";"NULL";"Initialisation de la valeur «MD.91» pour la liste «75».";2009-07-29 00:00:00;1;1
5093;1078;1;"Raionul Ungheni";"MD.92";"NULL";"Initialisation de la valeur «MD.92» pour la liste «75».";2009-07-29 00:00:00;1;1
5094;1078;1;"Montenegro (general)";"ME.00";"NULL";"Initialisation de la valeur «ME.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5095;1078;1;"Madagascar (general)";"MG.00";"NULL";"Initialisation de la valeur «MG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5096;1078;1;"Antsiranana";"MG.01";"NULL";"Initialisation de la valeur «MG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5097;1078;1;"Fianarantsoa";"MG.02";"NULL";"Initialisation de la valeur «MG.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5098;1078;1;"Mahajanga";"MG.03";"NULL";"Initialisation de la valeur «MG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5099;1078;1;"Toamasina";"MG.04";"NULL";"Initialisation de la valeur «MG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5100;1078;1;"Antananarivo";"MG.05";"NULL";"Initialisation de la valeur «MG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5101;1078;1;"Toliara";"MG.06";"NULL";"Initialisation de la valeur «MG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5102;1078;1;"Marshall Islands (general)";"MH.00";"NULL";"Initialisation de la valeur «MH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5103;1078;1;"Macedonia, The Former Yugoslav Republic of (general)";"MK.00";"NULL";"Initialisation de la valeur «MK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5104;1078;1;"Aračinovo";"MK.01";"NULL";"Initialisation de la valeur «MK.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5105;1078;1;"Bač";"MK.02";"NULL";"Initialisation de la valeur «MK.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5106;1078;1;"Belčišta";"MK.03";"NULL";"Initialisation de la valeur «MK.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5107;1078;1;"Berovo";"MK.04";"NULL";"Initialisation de la valeur «MK.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5108;1078;1;"Bistrica";"MK.05";"NULL";"Initialisation de la valeur «MK.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5109;1078;1;"Bitola";"MK.06";"NULL";"Initialisation de la valeur «MK.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5110;1078;1;"Blatec";"MK.07";"NULL";"Initialisation de la valeur «MK.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5111;1078;1;"Bogdanci";"MK.08";"NULL";"Initialisation de la valeur «MK.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5112;1078;1;"Opstina Bogomila";"MK.09";"NULL";"Initialisation de la valeur «MK.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5113;1078;1;"Bogovinje";"MK.10";"NULL";"Initialisation de la valeur «MK.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5114;1078;1;"Bosilovo";"MK.11";"NULL";"Initialisation de la valeur «MK.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5115;1078;1;"Brvenica";"MK.12";"NULL";"Initialisation de la valeur «MK.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5116;1078;1;"Čair";"MK.13";"NULL";"Initialisation de la valeur «MK.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5117;1078;1;"Capari";"MK.14";"NULL";"Initialisation de la valeur «MK.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5118;1078;1;"Čaška";"MK.15";"NULL";"Initialisation de la valeur «MK.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5119;1078;1;"Čegrana";"MK.16";"NULL";"Initialisation de la valeur «MK.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5120;1078;1;"Centar";"MK.17";"NULL";"Initialisation de la valeur «MK.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5121;1078;1;"Centar Župa";"MK.18";"NULL";"Initialisation de la valeur «MK.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5122;1078;1;"Češinovo";"MK.19";"NULL";"Initialisation de la valeur «MK.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5123;1078;1;"Čučer-Sandevo";"MK.20";"NULL";"Initialisation de la valeur «MK.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5124;1078;1;"Debar";"MK.21";"NULL";"Initialisation de la valeur «MK.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5125;1078;1;"Delčevo";"MK.22";"NULL";"Initialisation de la valeur «MK.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5126;1078;1;"Delogoždi";"MK.23";"NULL";"Initialisation de la valeur «MK.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5127;1078;1;"Demir Hisar";"MK.24";"NULL";"Initialisation de la valeur «MK.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5128;1078;1;"Demir Kapija";"MK.25";"NULL";"Initialisation de la valeur «MK.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5129;1078;1;"Dobruševo";"MK.26";"NULL";"Initialisation de la valeur «MK.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5130;1078;1;"Dolna Banjica";"MK.27";"NULL";"Initialisation de la valeur «MK.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5131;1078;1;"Dolneni";"MK.28";"NULL";"Initialisation de la valeur «MK.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5132;1078;1;"Opstina Gjorce Petrov";"MK.29";"NULL";"Initialisation de la valeur «MK.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5133;1078;1;"Drugovo";"MK.30";"NULL";"Initialisation de la valeur «MK.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5134;1078;1;"Džepčište";"MK.31";"NULL";"Initialisation de la valeur «MK.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5135;1078;1;"Gazi Baba";"MK.32";"NULL";"Initialisation de la valeur «MK.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5136;1078;1;"Gevgelija";"MK.33";"NULL";"Initialisation de la valeur «MK.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5137;1078;1;"Gostivar";"MK.34";"NULL";"Initialisation de la valeur «MK.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5138;1078;1;"Gradsko";"MK.35";"NULL";"Initialisation de la valeur «MK.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5139;1078;1;"Ilinden";"MK.36";"NULL";"Initialisation de la valeur «MK.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5140;1078;1;"Izvor";"MK.37";"NULL";"Initialisation de la valeur «MK.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5141;1078;1;"Jegunovce";"MK.38";"NULL";"Initialisation de la valeur «MK.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5142;1078;1;"Kamenjane";"MK.39";"NULL";"Initialisation de la valeur «MK.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5143;1078;1;"Karbinci";"MK.40";"NULL";"Initialisation de la valeur «MK.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5144;1078;1;"Karpoš";"MK.41";"NULL";"Initialisation de la valeur «MK.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5145;1078;1;"Kavadarci";"MK.42";"NULL";"Initialisation de la valeur «MK.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5146;1078;1;"Kičevo";"MK.43";"NULL";"Initialisation de la valeur «MK.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5147;1078;1;"Kisela Voda";"MK.44";"NULL";"Initialisation de la valeur «MK.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5148;1078;1;"Klečevce";"MK.45";"NULL";"Initialisation de la valeur «MK.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5149;1078;1;"Kočani";"MK.46";"NULL";"Initialisation de la valeur «MK.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5150;1078;1;"Konče";"MK.47";"NULL";"Initialisation de la valeur «MK.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5151;1078;1;"Kondovo";"MK.48";"NULL";"Initialisation de la valeur «MK.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5152;1078;1;"Konopište";"MK.49";"NULL";"Initialisation de la valeur «MK.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5153;1078;1;"Kosel";"MK.50";"NULL";"Initialisation de la valeur «MK.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5154;1078;1;"Kratovo";"MK.51";"NULL";"Initialisation de la valeur «MK.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5155;1078;1;"Kriva Palanka";"MK.52";"NULL";"Initialisation de la valeur «MK.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5156;1078;1;"Krivogaštani";"MK.53";"NULL";"Initialisation de la valeur «MK.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5157;1078;1;"Kruševo";"MK.54";"NULL";"Initialisation de la valeur «MK.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5158;1078;1;"Kukliš";"MK.55";"NULL";"Initialisation de la valeur «MK.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5159;1078;1;"Kukurečani";"MK.56";"NULL";"Initialisation de la valeur «MK.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5160;1078;1;"Kumanovo";"MK.57";"NULL";"Initialisation de la valeur «MK.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5161;1078;1;"Labuništa";"MK.58";"NULL";"Initialisation de la valeur «MK.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5162;1078;1;"Opstina Lipkovo";"MK.59";"NULL";"Initialisation de la valeur «MK.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5163;1078;1;"Lozovo";"MK.60";"NULL";"Initialisation de la valeur «MK.60» pour la liste «75».";2009-07-29 00:00:00;1;1
5164;1078;1;"Lukovo";"MK.61";"NULL";"Initialisation de la valeur «MK.61» pour la liste «75».";2009-07-29 00:00:00;1;1
5165;1078;1;"Makedonska Kamenica";"MK.62";"NULL";"Initialisation de la valeur «MK.62» pour la liste «75».";2009-07-29 00:00:00;1;1
5166;1078;1;"Makedonski Brod";"MK.63";"NULL";"Initialisation de la valeur «MK.63» pour la liste «75».";2009-07-29 00:00:00;1;1
5167;1078;1;"Mavrovi Anovi";"MK.64";"NULL";"Initialisation de la valeur «MK.64» pour la liste «75».";2009-07-29 00:00:00;1;1
5168;1078;1;"Mešeišta";"MK.65";"NULL";"Initialisation de la valeur «MK.65» pour la liste «75».";2009-07-29 00:00:00;1;1
5169;1078;1;"Miravci";"MK.66";"NULL";"Initialisation de la valeur «MK.66» pour la liste «75».";2009-07-29 00:00:00;1;1
5170;1078;1;"Mogila";"MK.67";"NULL";"Initialisation de la valeur «MK.67» pour la liste «75».";2009-07-29 00:00:00;1;1
5171;1078;1;"Murtino";"MK.68";"NULL";"Initialisation de la valeur «MK.68» pour la liste «75».";2009-07-29 00:00:00;1;1
5172;1078;1;"Negotino";"MK.69";"NULL";"Initialisation de la valeur «MK.69» pour la liste «75».";2009-07-29 00:00:00;1;1
5173;1078;1;"Negotino-Pološko";"MK.70";"NULL";"Initialisation de la valeur «MK.70» pour la liste «75».";2009-07-29 00:00:00;1;1
5174;1078;1;"Novaci";"MK.71";"NULL";"Initialisation de la valeur «MK.71» pour la liste «75».";2009-07-29 00:00:00;1;1
5175;1078;1;"Novo Selo";"MK.72";"NULL";"Initialisation de la valeur «MK.72» pour la liste «75».";2009-07-29 00:00:00;1;1
5176;1078;1;"Obleševo";"MK.73";"NULL";"Initialisation de la valeur «MK.73» pour la liste «75».";2009-07-29 00:00:00;1;1
5177;1078;1;"Ohrid";"MK.74";"NULL";"Initialisation de la valeur «MK.74» pour la liste «75».";2009-07-29 00:00:00;1;1
5178;1078;1;"Orašac";"MK.75";"NULL";"Initialisation de la valeur «MK.75» pour la liste «75».";2009-07-29 00:00:00;1;1
5179;1078;1;"Orizari";"MK.76";"NULL";"Initialisation de la valeur «MK.76» pour la liste «75».";2009-07-29 00:00:00;1;1
5180;1078;1;"Oslomej";"MK.77";"NULL";"Initialisation de la valeur «MK.77» pour la liste «75».";2009-07-29 00:00:00;1;1
5181;1078;1;"Pehčevo";"MK.78";"NULL";"Initialisation de la valeur «MK.78» pour la liste «75».";2009-07-29 00:00:00;1;1
5182;1078;1;"Petrovec";"MK.79";"NULL";"Initialisation de la valeur «MK.79» pour la liste «75».";2009-07-29 00:00:00;1;1
5183;1078;1;"Plasnica";"MK.80";"NULL";"Initialisation de la valeur «MK.80» pour la liste «75».";2009-07-29 00:00:00;1;1
5184;1078;1;"Podareš";"MK.81";"NULL";"Initialisation de la valeur «MK.81» pour la liste «75».";2009-07-29 00:00:00;1;1
5185;1078;1;"Prilep";"MK.82";"NULL";"Initialisation de la valeur «MK.82» pour la liste «75».";2009-07-29 00:00:00;1;1
5186;1078;1;"Probištip";"MK.83";"NULL";"Initialisation de la valeur «MK.83» pour la liste «75».";2009-07-29 00:00:00;1;1
5187;1078;1;"Radoviš";"MK.84";"NULL";"Initialisation de la valeur «MK.84» pour la liste «75».";2009-07-29 00:00:00;1;1
5188;1078;1;"Opstina Rankovce";"MK.85";"NULL";"Initialisation de la valeur «MK.85» pour la liste «75».";2009-07-29 00:00:00;1;1
5189;1078;1;"Resen";"MK.86";"NULL";"Initialisation de la valeur «MK.86» pour la liste «75».";2009-07-29 00:00:00;1;1
5190;1078;1;"Rosoman";"MK.87";"NULL";"Initialisation de la valeur «MK.87» pour la liste «75».";2009-07-29 00:00:00;1;1
5191;1078;1;"Rostuša";"MK.88";"NULL";"Initialisation de la valeur «MK.88» pour la liste «75».";2009-07-29 00:00:00;1;1
5192;1078;1;"Samokov";"MK.89";"NULL";"Initialisation de la valeur «MK.89» pour la liste «75».";2009-07-29 00:00:00;1;1
5193;1078;1;"Saraj";"MK.90";"NULL";"Initialisation de la valeur «MK.90» pour la liste «75».";2009-07-29 00:00:00;1;1
5194;1078;1;"Šipkovica";"MK.91";"NULL";"Initialisation de la valeur «MK.91» pour la liste «75».";2009-07-29 00:00:00;1;1
5195;1078;1;"Sopište";"MK.92";"NULL";"Initialisation de la valeur «MK.92» pour la liste «75».";2009-07-29 00:00:00;1;1
5196;1078;1;"Sopotnica";"MK.93";"NULL";"Initialisation de la valeur «MK.93» pour la liste «75».";2009-07-29 00:00:00;1;1
5197;1078;1;"Srbinovo";"MK.94";"NULL";"Initialisation de la valeur «MK.94» pour la liste «75».";2009-07-29 00:00:00;1;1
5198;1078;1;"Staravina";"MK.95";"NULL";"Initialisation de la valeur «MK.95» pour la liste «75».";2009-07-29 00:00:00;1;1
5199;1078;1;"Star Dojran";"MK.96";"NULL";"Initialisation de la valeur «MK.96» pour la liste «75».";2009-07-29 00:00:00;1;1
5200;1078;1;"Staro Nagoričane";"MK.97";"NULL";"Initialisation de la valeur «MK.97» pour la liste «75».";2009-07-29 00:00:00;1;1
5201;1078;1;"Štip";"MK.98";"NULL";"Initialisation de la valeur «MK.98» pour la liste «75».";2009-07-29 00:00:00;1;1
5202;1078;1;"Struga";"MK.99";"NULL";"Initialisation de la valeur «MK.99» pour la liste «75».";2009-07-29 00:00:00;1;1
5203;1078;1;"Strumica";"MK.A1";"NULL";"Initialisation de la valeur «MK.A1» pour la liste «75».";2009-07-29 00:00:00;1;1
5204;1078;1;"Studeničani";"MK.A2";"NULL";"Initialisation de la valeur «MK.A2» pour la liste «75».";2009-07-29 00:00:00;1;1
5205;1078;1;"Šuto Orizari";"MK.A3";"NULL";"Initialisation de la valeur «MK.A3» pour la liste «75».";2009-07-29 00:00:00;1;1
5206;1078;1;"Sveti Nikole";"MK.A4";"NULL";"Initialisation de la valeur «MK.A4» pour la liste «75».";2009-07-29 00:00:00;1;1
5207;1078;1;"Tearce";"MK.A5";"NULL";"Initialisation de la valeur «MK.A5» pour la liste «75».";2009-07-29 00:00:00;1;1
5208;1078;1;"Tetovo";"MK.A6";"NULL";"Initialisation de la valeur «MK.A6» pour la liste «75».";2009-07-29 00:00:00;1;1
5209;1078;1;"Topolčani";"MK.A7";"NULL";"Initialisation de la valeur «MK.A7» pour la liste «75».";2009-07-29 00:00:00;1;1
5210;1078;1;"Valandovo";"MK.A8";"NULL";"Initialisation de la valeur «MK.A8» pour la liste «75».";2009-07-29 00:00:00;1;1
5211;1078;1;"Vasilevo";"MK.A9";"NULL";"Initialisation de la valeur «MK.A9» pour la liste «75».";2009-07-29 00:00:00;1;1
5212;1078;1;"Veles";"MK.B1";"NULL";"Initialisation de la valeur «MK.B1» pour la liste «75».";2009-07-29 00:00:00;1;1
5213;1078;1;"Velešta";"MK.B2";"NULL";"Initialisation de la valeur «MK.B2» pour la liste «75».";2009-07-29 00:00:00;1;1
5214;1078;1;"Vevčani";"MK.B3";"NULL";"Initialisation de la valeur «MK.B3» pour la liste «75».";2009-07-29 00:00:00;1;1
5215;1078;1;"Vinica";"MK.B4";"NULL";"Initialisation de la valeur «MK.B4» pour la liste «75».";2009-07-29 00:00:00;1;1
5216;1078;1;"Vitolište";"MK.B5";"NULL";"Initialisation de la valeur «MK.B5» pour la liste «75».";2009-07-29 00:00:00;1;1
5217;1078;1;"Vraneštica";"MK.B6";"NULL";"Initialisation de la valeur «MK.B6» pour la liste «75».";2009-07-29 00:00:00;1;1
5218;1078;1;"Vrapčište";"MK.B7";"NULL";"Initialisation de la valeur «MK.B7» pour la liste «75».";2009-07-29 00:00:00;1;1
5219;1078;1;"Vratnica";"MK.B8";"NULL";"Initialisation de la valeur «MK.B8» pour la liste «75».";2009-07-29 00:00:00;1;1
5220;1078;1;"Vrutok";"MK.B9";"NULL";"Initialisation de la valeur «MK.B9» pour la liste «75».";2009-07-29 00:00:00;1;1
5221;1078;1;"Zajas";"MK.C1";"NULL";"Initialisation de la valeur «MK.C1» pour la liste «75».";2009-07-29 00:00:00;1;1
5222;1078;1;"Zelenikovo";"MK.C2";"NULL";"Initialisation de la valeur «MK.C2» pour la liste «75».";2009-07-29 00:00:00;1;1
5223;1078;1;"Želino";"MK.C3";"NULL";"Initialisation de la valeur «MK.C3» pour la liste «75».";2009-07-29 00:00:00;1;1
5224;1078;1;"Žitoše";"MK.C4";"NULL";"Initialisation de la valeur «MK.C4» pour la liste «75».";2009-07-29 00:00:00;1;1
5225;1078;1;"Zletovo";"MK.C5";"NULL";"Initialisation de la valeur «MK.C5» pour la liste «75».";2009-07-29 00:00:00;1;1
5226;1078;1;"Zrnovci";"MK.C6";"NULL";"Initialisation de la valeur «MK.C6» pour la liste «75».";2009-07-29 00:00:00;1;1
5227;1078;1;"Mali (general)";"ML.00";"NULL";"Initialisation de la valeur «ML.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5228;1078;1;"Bamako";"ML.01";"NULL";"Initialisation de la valeur «ML.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5229;1078;1;"Gao";"ML.02";"NULL";"Initialisation de la valeur «ML.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5230;1078;1;"Kayes";"ML.03";"NULL";"Initialisation de la valeur «ML.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5231;1078;1;"Mopti";"ML.04";"NULL";"Initialisation de la valeur «ML.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5232;1078;1;"Ségou";"ML.05";"NULL";"Initialisation de la valeur «ML.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5233;1078;1;"Sikasso";"ML.06";"NULL";"Initialisation de la valeur «ML.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5234;1078;1;"Koulikoro";"ML.07";"NULL";"Initialisation de la valeur «ML.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5235;1078;1;"Tombouctou";"ML.08";"NULL";"Initialisation de la valeur «ML.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5236;1078;1;"Gao";"ML.09";"NULL";"Initialisation de la valeur «ML.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5237;1078;1;"Kidal";"ML.10";"NULL";"Initialisation de la valeur «ML.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5238;1078;1;"Burma (general)";"MM.00";"NULL";"Initialisation de la valeur «MM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5239;1078;1;"Rakhine State";"MM.01";"NULL";"Initialisation de la valeur «MM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5240;1078;1;"Chin State";"MM.02";"NULL";"Initialisation de la valeur «MM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5241;1078;1;"Ayeyarwady";"MM.03";"NULL";"Initialisation de la valeur «MM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5242;1078;1;"Kachin State";"MM.04";"NULL";"Initialisation de la valeur «MM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5243;1078;1;"Kayin State";"MM.05";"NULL";"Initialisation de la valeur «MM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5244;1078;1;"Kayah State";"MM.06";"NULL";"Initialisation de la valeur «MM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5245;1078;1;"Magwe";"MM.07";"NULL";"Initialisation de la valeur «MM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5246;1078;1;"Mandalay";"MM.08";"NULL";"Initialisation de la valeur «MM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5247;1078;1;"Pegu";"MM.09";"NULL";"Initialisation de la valeur «MM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5248;1078;1;"Sagain";"MM.10";"NULL";"Initialisation de la valeur «MM.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5249;1078;1;"Shan State";"MM.11";"NULL";"Initialisation de la valeur «MM.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5250;1078;1;"Tanintharyi";"MM.12";"NULL";"Initialisation de la valeur «MM.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5251;1078;1;"Mon State";"MM.13";"NULL";"Initialisation de la valeur «MM.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5252;1078;1;"Rangoon";"MM.14";"NULL";"Initialisation de la valeur «MM.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5253;1078;1;"Magway";"MM.15";"NULL";"Initialisation de la valeur «MM.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5254;1078;1;"Bago";"MM.16";"NULL";"Initialisation de la valeur «MM.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5255;1078;1;"Yangon";"MM.17";"NULL";"Initialisation de la valeur «MM.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5256;1078;1;"(BM22)";"MM.22";"NULL";"Initialisation de la valeur «MM.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5257;1078;1;"Erdenet Hot (historical)";"MN.00";"NULL";"Initialisation de la valeur «MN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5258;1078;1;"Arhangay";"MN.01";"NULL";"Initialisation de la valeur «MN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5259;1078;1;"Bayanhongor";"MN.02";"NULL";"Initialisation de la valeur «MN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5260;1078;1;"Bayan-Ölgiy";"MN.03";"NULL";"Initialisation de la valeur «MN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5261;1078;1;"East Aimak";"MN.06";"NULL";"Initialisation de la valeur «MN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5262;1078;1;"East Gobi Aymag";"MN.07";"NULL";"Initialisation de la valeur «MN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5263;1078;1;"Middle Govĭ";"MN.08";"NULL";"Initialisation de la valeur «MN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5264;1078;1;"Dzavhan";"MN.09";"NULL";"Initialisation de la valeur «MN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5265;1078;1;"Govĭ-Altay";"MN.10";"NULL";"Initialisation de la valeur «MN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5266;1078;1;"Hentiy";"MN.11";"NULL";"Initialisation de la valeur «MN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5267;1078;1;"Hovd";"MN.12";"NULL";"Initialisation de la valeur «MN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5268;1078;1;"Hövsgöl";"MN.13";"NULL";"Initialisation de la valeur «MN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5269;1078;1;"South Gobi Aimak";"MN.14";"NULL";"Initialisation de la valeur «MN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5270;1078;1;"South Hangay";"MN.15";"NULL";"Initialisation de la valeur «MN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5271;1078;1;"Selenge";"MN.16";"NULL";"Initialisation de la valeur «MN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5272;1078;1;"Sühbaatar";"MN.17";"NULL";"Initialisation de la valeur «MN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5273;1078;1;"Central Aimak";"MN.18";"NULL";"Initialisation de la valeur «MN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5274;1078;1;"Uvs";"MN.19";"NULL";"Initialisation de la valeur «MN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5275;1078;1;"Ulaanbaatar";"MN.20";"NULL";"Initialisation de la valeur «MN.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5276;1078;1;"Bulgan";"MN.21";"NULL";"Initialisation de la valeur «MN.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5277;1078;1;"Darhan Uul";"MN.23";"NULL";"Initialisation de la valeur «MN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5278;1078;1;"Govĭ-Sumber";"MN.24";"NULL";"Initialisation de la valeur «MN.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5279;1078;1;"Orhon";"MN.25";"NULL";"Initialisation de la valeur «MN.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5280;1078;1;"Macau (general)";"MO.00";"NULL";"Initialisation de la valeur «MO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5281;1078;1;"Ilhas";"MO.01";"NULL";"Initialisation de la valeur «MO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5282;1078;1;"Macau";"MO.02";"NULL";"Initialisation de la valeur «MO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5283;1078;1;"Région Martinique";"MQ.MQ";"NULL";"Initialisation de la valeur «MQ.MQ» pour la liste «75».";2009-07-29 00:00:00;1;1
5284;1078;1;"Nouakchott District de";"MR.00";"NULL";"Initialisation de la valeur «MR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5285;1078;1;"Hodh Ech Chargui";"MR.01";"NULL";"Initialisation de la valeur «MR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5286;1078;1;"Hodh El Gharbi";"MR.02";"NULL";"Initialisation de la valeur «MR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5287;1078;1;"Assaba";"MR.03";"NULL";"Initialisation de la valeur «MR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5288;1078;1;"Gorgol";"MR.04";"NULL";"Initialisation de la valeur «MR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5289;1078;1;"Brakna";"MR.05";"NULL";"Initialisation de la valeur «MR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5290;1078;1;"Trarza";"MR.06";"NULL";"Initialisation de la valeur «MR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5291;1078;1;"Adrar";"MR.07";"NULL";"Initialisation de la valeur «MR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5292;1078;1;"Dakhlet Nouadhibou";"MR.08";"NULL";"Initialisation de la valeur «MR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5293;1078;1;"Tagant";"MR.09";"NULL";"Initialisation de la valeur «MR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5294;1078;1;"Guidimaka";"MR.10";"NULL";"Initialisation de la valeur «MR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5295;1078;1;"Tiris Zemmour";"MR.11";"NULL";"Initialisation de la valeur «MR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5296;1078;1;"Inchiri";"MR.12";"NULL";"Initialisation de la valeur «MR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5297;1078;1;"Montserrat (general)";"MS.00";"NULL";"Initialisation de la valeur «MS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5298;1078;1;"Saint Anthony";"MS.01";"NULL";"Initialisation de la valeur «MS.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5299;1078;1;"Saint Georges";"MS.02";"NULL";"Initialisation de la valeur «MS.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5300;1078;1;"Saint Peter";"MS.03";"NULL";"Initialisation de la valeur «MS.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5301;1078;1;"Malta (general)";"MT.00";"NULL";"Initialisation de la valeur «MT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5302;1078;1;"Mauritius (general)";"MU.00";"NULL";"Initialisation de la valeur «MU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5303;1078;1;"Black River";"MU.12";"NULL";"Initialisation de la valeur «MU.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5304;1078;1;"Flacq";"MU.13";"NULL";"Initialisation de la valeur «MU.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5305;1078;1;"Grand Port";"MU.14";"NULL";"Initialisation de la valeur «MU.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5306;1078;1;"Moka";"MU.15";"NULL";"Initialisation de la valeur «MU.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5307;1078;1;"Pamplemousses";"MU.16";"NULL";"Initialisation de la valeur «MU.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5308;1078;1;"Plaines Wilhems";"MU.17";"NULL";"Initialisation de la valeur «MU.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5309;1078;1;"Port Louis";"MU.18";"NULL";"Initialisation de la valeur «MU.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5310;1078;1;"Rivière du Rempart";"MU.19";"NULL";"Initialisation de la valeur «MU.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5311;1078;1;"Savanne";"MU.20";"NULL";"Initialisation de la valeur «MU.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5312;1078;1;"Agalega Islands";"MU.21";"NULL";"Initialisation de la valeur «MU.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5313;1078;1;"Cargados Carajos";"MU.22";"NULL";"Initialisation de la valeur «MU.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5314;1078;1;"Rodrigues";"MU.23";"NULL";"Initialisation de la valeur «MU.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5315;1078;1;"Maale";"MV.00";"NULL";"Initialisation de la valeur «MV.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5316;1078;1;"Seenu";"MV.01";"NULL";"Initialisation de la valeur «MV.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5317;1078;1;"Alifu Atholhu";"MV.02";"NULL";"Initialisation de la valeur «MV.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5318;1078;1;"Lhaviyani Atholhu";"MV.03";"NULL";"Initialisation de la valeur «MV.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5319;1078;1;"Vaavu Atholhu";"MV.04";"NULL";"Initialisation de la valeur «MV.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5320;1078;1;"Laamu";"MV.05";"NULL";"Initialisation de la valeur «MV.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5321;1078;1;"Haa Alifu Atholhu";"MV.07";"NULL";"Initialisation de la valeur «MV.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5322;1078;1;"Thaa Atholhu";"MV.08";"NULL";"Initialisation de la valeur «MV.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5323;1078;1;"Meemu Atholhu";"MV.12";"NULL";"Initialisation de la valeur «MV.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5324;1078;1;"Raa Atholhu";"MV.13";"NULL";"Initialisation de la valeur «MV.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5325;1078;1;"Faafu Atholhu";"MV.14";"NULL";"Initialisation de la valeur «MV.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5326;1078;1;"Dhaalu Atholhu";"MV.17";"NULL";"Initialisation de la valeur «MV.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5327;1078;1;"Baa Atholhu";"MV.20";"NULL";"Initialisation de la valeur «MV.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5328;1078;1;"Haa Dhaalu Atholhu";"MV.23";"NULL";"Initialisation de la valeur «MV.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5329;1078;1;"Shaviyani Atholhu";"MV.24";"NULL";"Initialisation de la valeur «MV.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5330;1078;1;"Noonu Atholhu";"MV.25";"NULL";"Initialisation de la valeur «MV.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5331;1078;1;"Gaafu Alifu Atholhu";"MV.27";"NULL";"Initialisation de la valeur «MV.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5332;1078;1;"Gaafu Dhaalu Atholhu";"MV.28";"NULL";"Initialisation de la valeur «MV.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5333;1078;1;"Gnyaviyani Atoll";"MV.29";"NULL";"Initialisation de la valeur «MV.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5334;1078;1;"Alifu";"MV.30";"NULL";"Initialisation de la valeur «MV.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5335;1078;1;"Baa";"MV.31";"NULL";"Initialisation de la valeur «MV.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5336;1078;1;"Dhaalu";"MV.32";"NULL";"Initialisation de la valeur «MV.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5337;1078;1;"Faafu";"MV.33";"NULL";"Initialisation de la valeur «MV.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5338;1078;1;"Gaafu Alifu";"MV.34";"NULL";"Initialisation de la valeur «MV.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5339;1078;1;"Gaafu Dhaalu";"MV.35";"NULL";"Initialisation de la valeur «MV.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5340;1078;1;"Haa Alifu";"MV.36";"NULL";"Initialisation de la valeur «MV.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5341;1078;1;"Haa Dhaalu";"MV.37";"NULL";"Initialisation de la valeur «MV.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5342;1078;1;"Kaafu";"MV.38";"NULL";"Initialisation de la valeur «MV.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5343;1078;1;"Lhaviyani";"MV.39";"NULL";"Initialisation de la valeur «MV.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5344;1078;1;"Maale";"MV.40";"NULL";"Initialisation de la valeur «MV.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5345;1078;1;"Meemu";"MV.41";"NULL";"Initialisation de la valeur «MV.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5346;1078;1;"Gnaviyani";"MV.42";"NULL";"Initialisation de la valeur «MV.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5347;1078;1;"Noonu";"MV.43";"NULL";"Initialisation de la valeur «MV.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5348;1078;1;"Raa";"MV.44";"NULL";"Initialisation de la valeur «MV.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5349;1078;1;"Shaviyani";"MV.45";"NULL";"Initialisation de la valeur «MV.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5350;1078;1;"Thaa";"MV.46";"NULL";"Initialisation de la valeur «MV.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5351;1078;1;"Vaavu";"MV.47";"NULL";"Initialisation de la valeur «MV.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5352;1078;1;"Malawi (general)";"MW.00";"NULL";"Initialisation de la valeur «MW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5353;1078;1;"Chikwawa";"MW.02";"NULL";"Initialisation de la valeur «MW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5354;1078;1;"Chiradzulu";"MW.03";"NULL";"Initialisation de la valeur «MW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5355;1078;1;"Chitipa";"MW.04";"NULL";"Initialisation de la valeur «MW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5356;1078;1;"Thyolo";"MW.05";"NULL";"Initialisation de la valeur «MW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5357;1078;1;"Dedza";"MW.06";"NULL";"Initialisation de la valeur «MW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5358;1078;1;"Dowa";"MW.07";"NULL";"Initialisation de la valeur «MW.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5359;1078;1;"Karonga";"MW.08";"NULL";"Initialisation de la valeur «MW.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5360;1078;1;"Kasungu";"MW.09";"NULL";"Initialisation de la valeur «MW.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5361;1078;1;"(MI10)";"MW.10";"NULL";"Initialisation de la valeur «MW.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5362;1078;1;"Lilongwe";"MW.11";"NULL";"Initialisation de la valeur «MW.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5363;1078;1;"Mangochi";"MW.12";"NULL";"Initialisation de la valeur «MW.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5364;1078;1;"Mchinji";"MW.13";"NULL";"Initialisation de la valeur «MW.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5365;1078;1;"(MI14)";"MW.14";"NULL";"Initialisation de la valeur «MW.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5366;1078;1;"Mzimba";"MW.15";"NULL";"Initialisation de la valeur «MW.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5367;1078;1;"Ntcheu";"MW.16";"NULL";"Initialisation de la valeur «MW.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5368;1078;1;"Nkhata Bay";"MW.17";"NULL";"Initialisation de la valeur «MW.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5369;1078;1;"Nkhotakota";"MW.18";"NULL";"Initialisation de la valeur «MW.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5370;1078;1;"Nsanje";"MW.19";"NULL";"Initialisation de la valeur «MW.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5371;1078;1;"Ntchisi";"MW.20";"NULL";"Initialisation de la valeur «MW.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5372;1078;1;"Rumphi";"MW.21";"NULL";"Initialisation de la valeur «MW.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5373;1078;1;"Salima";"MW.22";"NULL";"Initialisation de la valeur «MW.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5374;1078;1;"Zomba";"MW.23";"NULL";"Initialisation de la valeur «MW.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5375;1078;1;"Blantyre";"MW.24";"NULL";"Initialisation de la valeur «MW.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5376;1078;1;"Mwanza";"MW.25";"NULL";"Initialisation de la valeur «MW.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5377;1078;1;"Balaka";"MW.26";"NULL";"Initialisation de la valeur «MW.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5378;1078;1;"Likoma";"MW.27";"NULL";"Initialisation de la valeur «MW.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5379;1078;1;"Machinga";"MW.28";"NULL";"Initialisation de la valeur «MW.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5380;1078;1;"Mulanje";"MW.29";"NULL";"Initialisation de la valeur «MW.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5381;1078;1;"Phalombe";"MW.30";"NULL";"Initialisation de la valeur «MW.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5382;1078;1;"Mexico (general)";"MX.00";"NULL";"Initialisation de la valeur «MX.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5383;1078;1;"Aguascalientes";"MX.01";"NULL";"Initialisation de la valeur «MX.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5384;1078;1;"Baja California";"MX.02";"NULL";"Initialisation de la valeur «MX.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5385;1078;1;"Baja California Sur";"MX.03";"NULL";"Initialisation de la valeur «MX.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5386;1078;1;"Campeche";"MX.04";"NULL";"Initialisation de la valeur «MX.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5387;1078;1;"Chiapas";"MX.05";"NULL";"Initialisation de la valeur «MX.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5388;1078;1;"Chihuahua";"MX.06";"NULL";"Initialisation de la valeur «MX.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5389;1078;1;"Coahuila";"MX.07";"NULL";"Initialisation de la valeur «MX.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5390;1078;1;"Colima";"MX.08";"NULL";"Initialisation de la valeur «MX.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5391;1078;1;"The Federal District";"MX.09";"NULL";"Initialisation de la valeur «MX.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5392;1078;1;"Durango";"MX.10";"NULL";"Initialisation de la valeur «MX.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5393;1078;1;"Guanajuato";"MX.11";"NULL";"Initialisation de la valeur «MX.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5394;1078;1;"Guerrero";"MX.12";"NULL";"Initialisation de la valeur «MX.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5395;1078;1;"Hidalgo";"MX.13";"NULL";"Initialisation de la valeur «MX.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5396;1078;1;"Jalisco";"MX.14";"NULL";"Initialisation de la valeur «MX.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5397;1078;1;"México";"MX.15";"NULL";"Initialisation de la valeur «MX.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5398;1078;1;"Michoacán";"MX.16";"NULL";"Initialisation de la valeur «MX.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5399;1078;1;"Morelos";"MX.17";"NULL";"Initialisation de la valeur «MX.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5400;1078;1;"Nayarit";"MX.18";"NULL";"Initialisation de la valeur «MX.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5401;1078;1;"Nuevo León";"MX.19";"NULL";"Initialisation de la valeur «MX.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5402;1078;1;"Oaxaca";"MX.20";"NULL";"Initialisation de la valeur «MX.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5403;1078;1;"Puebla";"MX.21";"NULL";"Initialisation de la valeur «MX.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5404;1078;1;"Querétaro";"MX.22";"NULL";"Initialisation de la valeur «MX.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5405;1078;1;"Quintana Roo";"MX.23";"NULL";"Initialisation de la valeur «MX.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5406;1078;1;"San Luis Potosí";"MX.24";"NULL";"Initialisation de la valeur «MX.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5407;1078;1;"Sinaloa";"MX.25";"NULL";"Initialisation de la valeur «MX.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5408;1078;1;"Sonora";"MX.26";"NULL";"Initialisation de la valeur «MX.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5409;1078;1;"Tabasco";"MX.27";"NULL";"Initialisation de la valeur «MX.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5410;1078;1;"Tamaulipas";"MX.28";"NULL";"Initialisation de la valeur «MX.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5411;1078;1;"Tlaxcala";"MX.29";"NULL";"Initialisation de la valeur «MX.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5412;1078;1;"Veracruz-Llave";"MX.30";"NULL";"Initialisation de la valeur «MX.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5413;1078;1;"Yucatán";"MX.31";"NULL";"Initialisation de la valeur «MX.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5414;1078;1;"Zacatecas";"MX.32";"NULL";"Initialisation de la valeur «MX.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5415;1078;1;"Malaysia (general)";"MY.00";"NULL";"Initialisation de la valeur «MY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5416;1078;1;"Johor";"MY.01";"NULL";"Initialisation de la valeur «MY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5417;1078;1;"Kedah";"MY.02";"NULL";"Initialisation de la valeur «MY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5418;1078;1;"Kelantan";"MY.03";"NULL";"Initialisation de la valeur «MY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5419;1078;1;"Melaka";"MY.04";"NULL";"Initialisation de la valeur «MY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5420;1078;1;"Negeri Sembilan";"MY.05";"NULL";"Initialisation de la valeur «MY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5421;1078;1;"Pahang";"MY.06";"NULL";"Initialisation de la valeur «MY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5422;1078;1;"Perak";"MY.07";"NULL";"Initialisation de la valeur «MY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5423;1078;1;"Perlis";"MY.08";"NULL";"Initialisation de la valeur «MY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5424;1078;1;"Pulau Pinang";"MY.09";"NULL";"Initialisation de la valeur «MY.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5425;1078;1;"Sarawak";"MY.11";"NULL";"Initialisation de la valeur «MY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5426;1078;1;"Selangor";"MY.12";"NULL";"Initialisation de la valeur «MY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5427;1078;1;"Terengganu";"MY.13";"NULL";"Initialisation de la valeur «MY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5428;1078;1;"Kuala Lumpur";"MY.14";"NULL";"Initialisation de la valeur «MY.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5429;1078;1;"Federal Territory of Labuan";"MY.15";"NULL";"Initialisation de la valeur «MY.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5430;1078;1;"Sabah";"MY.16";"NULL";"Initialisation de la valeur «MY.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5431;1078;1;"Putrajaya";"MY.17";"NULL";"Initialisation de la valeur «MY.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5432;1078;1;"Mozambique (general)";"MZ.00";"NULL";"Initialisation de la valeur «MZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5433;1078;1;"Cabo Delgado";"MZ.01";"NULL";"Initialisation de la valeur «MZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5434;1078;1;"Gaza";"MZ.02";"NULL";"Initialisation de la valeur «MZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5435;1078;1;"Inhambane";"MZ.03";"NULL";"Initialisation de la valeur «MZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5436;1078;1;"Maputo Province";"MZ.04";"NULL";"Initialisation de la valeur «MZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5437;1078;1;"Sofala";"MZ.05";"NULL";"Initialisation de la valeur «MZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5438;1078;1;"Nampula";"MZ.06";"NULL";"Initialisation de la valeur «MZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5439;1078;1;"Niassa";"MZ.07";"NULL";"Initialisation de la valeur «MZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5440;1078;1;"Tete";"MZ.08";"NULL";"Initialisation de la valeur «MZ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5441;1078;1;"Zambézia";"MZ.09";"NULL";"Initialisation de la valeur «MZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5442;1078;1;"Manica";"MZ.10";"NULL";"Initialisation de la valeur «MZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5443;1078;1;"Maputo";"MZ.11";"NULL";"Initialisation de la valeur «MZ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5444;1078;1;"Namibia (general)";"NA.00";"NULL";"Initialisation de la valeur «NA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5445;1078;1;"Bethanien";"NA.01";"NULL";"Initialisation de la valeur «NA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5446;1078;1;"Caprivi Oos";"NA.02";"NULL";"Initialisation de la valeur «NA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5447;1078;1;"Kaokoland";"NA.06";"NULL";"Initialisation de la valeur «NA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5448;1078;1;"Otjiwarongo";"NA.13";"NULL";"Initialisation de la valeur «NA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5449;1078;1;"Outjo";"NA.14";"NULL";"Initialisation de la valeur «NA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5450;1078;1;"Owambo";"NA.15";"NULL";"Initialisation de la valeur «NA.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5451;1078;1;"Khomas";"NA.21";"NULL";"Initialisation de la valeur «NA.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5452;1078;1;"Kavango";"NA.25";"NULL";"Initialisation de la valeur «NA.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5453;1078;1;"Caprivi";"NA.28";"NULL";"Initialisation de la valeur «NA.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5454;1078;1;"Erongo";"NA.29";"NULL";"Initialisation de la valeur «NA.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5455;1078;1;"Hardap";"NA.30";"NULL";"Initialisation de la valeur «NA.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5456;1078;1;"Karas";"NA.31";"NULL";"Initialisation de la valeur «NA.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5457;1078;1;"Kunene";"NA.32";"NULL";"Initialisation de la valeur «NA.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5458;1078;1;"Ohangwena";"NA.33";"NULL";"Initialisation de la valeur «NA.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5459;1078;1;"Okavango";"NA.34";"NULL";"Initialisation de la valeur «NA.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5460;1078;1;"Omaheke";"NA.35";"NULL";"Initialisation de la valeur «NA.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5461;1078;1;"Omusati";"NA.36";"NULL";"Initialisation de la valeur «NA.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5462;1078;1;"Oshana";"NA.37";"NULL";"Initialisation de la valeur «NA.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5463;1078;1;"Oshikoto";"NA.38";"NULL";"Initialisation de la valeur «NA.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5464;1078;1;"Otjozondjupa";"NA.39";"NULL";"Initialisation de la valeur «NA.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5465;1078;1;"Niger (general)";"NE.00";"NULL";"Initialisation de la valeur «NE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5466;1078;1;"Agadez";"NE.01";"NULL";"Initialisation de la valeur «NE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5467;1078;1;"Diffa";"NE.02";"NULL";"Initialisation de la valeur «NE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5468;1078;1;"Dosso";"NE.03";"NULL";"Initialisation de la valeur «NE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5469;1078;1;"Maradi";"NE.04";"NULL";"Initialisation de la valeur «NE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5470;1078;1;"Tahoua";"NE.06";"NULL";"Initialisation de la valeur «NE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5471;1078;1;"Zinder";"NE.07";"NULL";"Initialisation de la valeur «NE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5472;1078;1;"Tillabéri";"NE.09";"NULL";"Initialisation de la valeur «NE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5473;1078;1;"Norfolk Island (general)";"NF.00";"NULL";"Initialisation de la valeur «NF.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5474;1078;1;"Bendel State";"NG.00";"NULL";"Initialisation de la valeur «NG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5475;1078;1;"Lagos";"NG.05";"NULL";"Initialisation de la valeur «NG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5476;1078;1;"(NI10)";"NG.10";"NULL";"Initialisation de la valeur «NG.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5477;1078;1;"Abuja Federal Capital Territory";"NG.11";"NULL";"Initialisation de la valeur «NG.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5478;1078;1;"(NI12)";"NG.12";"NULL";"Initialisation de la valeur «NG.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5479;1078;1;"Ogun";"NG.16";"NULL";"Initialisation de la valeur «NG.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5480;1078;1;"(NI17)";"NG.17";"NULL";"Initialisation de la valeur «NG.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5481;1078;1;"(NI18)";"NG.18";"NULL";"Initialisation de la valeur «NG.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5482;1078;1;"(NI20)";"NG.20";"NULL";"Initialisation de la valeur «NG.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5483;1078;1;"Akwa Ibom";"NG.21";"NULL";"Initialisation de la valeur «NG.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5484;1078;1;"Cross River";"NG.22";"NULL";"Initialisation de la valeur «NG.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5485;1078;1;"Kaduna";"NG.23";"NULL";"Initialisation de la valeur «NG.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5486;1078;1;"Katsina";"NG.24";"NULL";"Initialisation de la valeur «NG.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5487;1078;1;"Anambra";"NG.25";"NULL";"Initialisation de la valeur «NG.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5488;1078;1;"Benue";"NG.26";"NULL";"Initialisation de la valeur «NG.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5489;1078;1;"Borno";"NG.27";"NULL";"Initialisation de la valeur «NG.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5490;1078;1;"Imo";"NG.28";"NULL";"Initialisation de la valeur «NG.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5491;1078;1;"Kano";"NG.29";"NULL";"Initialisation de la valeur «NG.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5492;1078;1;"Kwara";"NG.30";"NULL";"Initialisation de la valeur «NG.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5493;1078;1;"Niger";"NG.31";"NULL";"Initialisation de la valeur «NG.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5494;1078;1;"Oyo";"NG.32";"NULL";"Initialisation de la valeur «NG.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5495;1078;1;"(NI34)";"NG.34";"NULL";"Initialisation de la valeur «NG.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5496;1078;1;"Adamawa";"NG.35";"NULL";"Initialisation de la valeur «NG.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5497;1078;1;"Delta";"NG.36";"NULL";"Initialisation de la valeur «NG.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5498;1078;1;"Edo";"NG.37";"NULL";"Initialisation de la valeur «NG.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5499;1078;1;"Jigawa";"NG.39";"NULL";"Initialisation de la valeur «NG.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5500;1078;1;"Kebbi";"NG.40";"NULL";"Initialisation de la valeur «NG.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5501;1078;1;"Kogi";"NG.41";"NULL";"Initialisation de la valeur «NG.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5502;1078;1;"Osun";"NG.42";"NULL";"Initialisation de la valeur «NG.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5503;1078;1;"Taraba";"NG.43";"NULL";"Initialisation de la valeur «NG.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5504;1078;1;"Yobe";"NG.44";"NULL";"Initialisation de la valeur «NG.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5505;1078;1;"Abia";"NG.45";"NULL";"Initialisation de la valeur «NG.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5506;1078;1;"Bauchi";"NG.46";"NULL";"Initialisation de la valeur «NG.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5507;1078;1;"Enugu";"NG.47";"NULL";"Initialisation de la valeur «NG.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5508;1078;1;"Ondo";"NG.48";"NULL";"Initialisation de la valeur «NG.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5509;1078;1;"Plateau";"NG.49";"NULL";"Initialisation de la valeur «NG.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5510;1078;1;"Rivers";"NG.50";"NULL";"Initialisation de la valeur «NG.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5511;1078;1;"Sokoto";"NG.51";"NULL";"Initialisation de la valeur «NG.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5512;1078;1;"Bayelsa";"NG.52";"NULL";"Initialisation de la valeur «NG.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5513;1078;1;"Ebonyi";"NG.53";"NULL";"Initialisation de la valeur «NG.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5514;1078;1;"Ekiti";"NG.54";"NULL";"Initialisation de la valeur «NG.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5515;1078;1;"Gombe";"NG.55";"NULL";"Initialisation de la valeur «NG.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5516;1078;1;"Nassarawa";"NG.56";"NULL";"Initialisation de la valeur «NG.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5517;1078;1;"Zamfara";"NG.57";"NULL";"Initialisation de la valeur «NG.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5518;1078;1;"Nicaragua (general)";"NI.00";"NULL";"Initialisation de la valeur «NI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5519;1078;1;"Boaco";"NI.01";"NULL";"Initialisation de la valeur «NI.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5520;1078;1;"Carazo";"NI.02";"NULL";"Initialisation de la valeur «NI.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5521;1078;1;"Chinandega";"NI.03";"NULL";"Initialisation de la valeur «NI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5522;1078;1;"Chontales";"NI.04";"NULL";"Initialisation de la valeur «NI.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5523;1078;1;"Estelí";"NI.05";"NULL";"Initialisation de la valeur «NI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5524;1078;1;"Granada";"NI.06";"NULL";"Initialisation de la valeur «NI.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5525;1078;1;"Jinotega";"NI.07";"NULL";"Initialisation de la valeur «NI.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5526;1078;1;"León";"NI.08";"NULL";"Initialisation de la valeur «NI.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5527;1078;1;"Madriz";"NI.09";"NULL";"Initialisation de la valeur «NI.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5528;1078;1;"Managua";"NI.10";"NULL";"Initialisation de la valeur «NI.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5529;1078;1;"Masaya";"NI.11";"NULL";"Initialisation de la valeur «NI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5530;1078;1;"Matagalpa";"NI.12";"NULL";"Initialisation de la valeur «NI.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5531;1078;1;"Nueva Segovia";"NI.13";"NULL";"Initialisation de la valeur «NI.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5532;1078;1;"Río San Juan";"NI.14";"NULL";"Initialisation de la valeur «NI.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5533;1078;1;"Rivas";"NI.15";"NULL";"Initialisation de la valeur «NI.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5534;1078;1;"Ogun State";"NI.16";"NULL";"Initialisation de la valeur «NI.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5535;1078;1;"Atlántico Norte";"NI.17";"NULL";"Initialisation de la valeur «NI.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5536;1078;1;"Región Autónoma Atlántico Sur";"NI.18";"NULL";"Initialisation de la valeur «NI.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5537;1078;1;"Netherlands (general)";"NL.00";"NULL";"Initialisation de la valeur «NL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5538;1078;1;"Provincie Drenthe";"NL.01";"NULL";"Initialisation de la valeur «NL.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5539;1078;1;"Provincie Friesland";"NL.02";"NULL";"Initialisation de la valeur «NL.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5540;1078;1;"Gelderland";"NL.03";"NULL";"Initialisation de la valeur «NL.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5541;1078;1;"Groningen";"NL.04";"NULL";"Initialisation de la valeur «NL.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5542;1078;1;"Limburg";"NL.05";"NULL";"Initialisation de la valeur «NL.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5543;1078;1;"North Brabant";"NL.06";"NULL";"Initialisation de la valeur «NL.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5544;1078;1;"North Holland";"NL.07";"NULL";"Initialisation de la valeur «NL.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5545;1078;1;"Utrecht";"NL.09";"NULL";"Initialisation de la valeur «NL.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5546;1078;1;"Zeeland";"NL.10";"NULL";"Initialisation de la valeur «NL.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5547;1078;1;"South Holland";"NL.11";"NULL";"Initialisation de la valeur «NL.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5548;1078;1;"Overijssel";"NL.15";"NULL";"Initialisation de la valeur «NL.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5549;1078;1;"Flevoland";"NL.16";"NULL";"Initialisation de la valeur «NL.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5550;1078;1;"Jan Mayen";"NO.00";"NULL";"Initialisation de la valeur «NO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5551;1078;1;"Akershus";"NO.01";"NULL";"Initialisation de la valeur «NO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5552;1078;1;"Aust-Agder";"NO.02";"NULL";"Initialisation de la valeur «NO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5553;1078;1;"Buskerud";"NO.04";"NULL";"Initialisation de la valeur «NO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5554;1078;1;"Finnmark";"NO.05";"NULL";"Initialisation de la valeur «NO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5555;1078;1;"Hedmark";"NO.06";"NULL";"Initialisation de la valeur «NO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5556;1078;1;"Hordaland";"NO.07";"NULL";"Initialisation de la valeur «NO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5557;1078;1;"Møre og Romsdal";"NO.08";"NULL";"Initialisation de la valeur «NO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5558;1078;1;"Nordland";"NO.09";"NULL";"Initialisation de la valeur «NO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5559;1078;1;"Nord-Trøndelag";"NO.10";"NULL";"Initialisation de la valeur «NO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5560;1078;1;"Oppland";"NO.11";"NULL";"Initialisation de la valeur «NO.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5561;1078;1;"Oslo";"NO.12";"NULL";"Initialisation de la valeur «NO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5562;1078;1;"Østfold";"NO.13";"NULL";"Initialisation de la valeur «NO.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5563;1078;1;"Rogaland";"NO.14";"NULL";"Initialisation de la valeur «NO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5564;1078;1;"Sogn og Fjordane";"NO.15";"NULL";"Initialisation de la valeur «NO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5565;1078;1;"Sør-Trøndelag";"NO.16";"NULL";"Initialisation de la valeur «NO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5566;1078;1;"Telemark";"NO.17";"NULL";"Initialisation de la valeur «NO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5567;1078;1;"Troms";"NO.18";"NULL";"Initialisation de la valeur «NO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5568;1078;1;"Vest-Agder";"NO.19";"NULL";"Initialisation de la valeur «NO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5569;1078;1;"Vestfold";"NO.20";"NULL";"Initialisation de la valeur «NO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5570;1078;1;"Bāgmatī Zone";"NP.00";"NULL";"Initialisation de la valeur «NP.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5571;1078;1;"Bāgmatī";"NP.01";"NULL";"Initialisation de la valeur «NP.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5572;1078;1;"Bherī";"NP.02";"NULL";"Initialisation de la valeur «NP.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5573;1078;1;"Dhawalāgiri";"NP.03";"NULL";"Initialisation de la valeur «NP.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5574;1078;1;"Gandakī";"NP.04";"NULL";"Initialisation de la valeur «NP.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5575;1078;1;"Janakpur";"NP.05";"NULL";"Initialisation de la valeur «NP.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5576;1078;1;"Karnālī";"NP.06";"NULL";"Initialisation de la valeur «NP.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5577;1078;1;"Kosī";"NP.07";"NULL";"Initialisation de la valeur «NP.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5578;1078;1;"Lumbinī";"NP.08";"NULL";"Initialisation de la valeur «NP.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5579;1078;1;"Mahākālī";"NP.09";"NULL";"Initialisation de la valeur «NP.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5580;1078;1;"Mechī";"NP.10";"NULL";"Initialisation de la valeur «NP.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5581;1078;1;"Nārāyanī";"NP.11";"NULL";"Initialisation de la valeur «NP.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5582;1078;1;"Rāptī";"NP.12";"NULL";"Initialisation de la valeur «NP.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5583;1078;1;"Sagarmāthā";"NP.13";"NULL";"Initialisation de la valeur «NP.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5584;1078;1;"Setī";"NP.14";"NULL";"Initialisation de la valeur «NP.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5585;1078;1;"Nauru (general)";"NR.00";"NULL";"Initialisation de la valeur «NR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5586;1078;1;"Aiwo";"NR.01";"NULL";"Initialisation de la valeur «NR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5587;1078;1;"Anabar";"NR.02";"NULL";"Initialisation de la valeur «NR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5588;1078;1;"Anetan";"NR.03";"NULL";"Initialisation de la valeur «NR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5589;1078;1;"Anibare";"NR.04";"NULL";"Initialisation de la valeur «NR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5590;1078;1;"Baiti";"NR.05";"NULL";"Initialisation de la valeur «NR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5591;1078;1;"Boe";"NR.06";"NULL";"Initialisation de la valeur «NR.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5592;1078;1;"Buada";"NR.07";"NULL";"Initialisation de la valeur «NR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5593;1078;1;"Denigomodu";"NR.08";"NULL";"Initialisation de la valeur «NR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5594;1078;1;"Ewa";"NR.09";"NULL";"Initialisation de la valeur «NR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5595;1078;1;"Ijuw";"NR.10";"NULL";"Initialisation de la valeur «NR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5596;1078;1;"Meneng";"NR.11";"NULL";"Initialisation de la valeur «NR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5597;1078;1;"Nibok";"NR.12";"NULL";"Initialisation de la valeur «NR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5598;1078;1;"Uaboe";"NR.13";"NULL";"Initialisation de la valeur «NR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5599;1078;1;"Yaren";"NR.14";"NULL";"Initialisation de la valeur «NR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5600;1078;1;"Niue (general)";"NU.00";"NULL";"Initialisation de la valeur «NU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5601;1078;1;"Akaroa";"NZ.01";"NULL";"Initialisation de la valeur «NZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5602;1078;1;"Amuri";"NZ.03";"NULL";"Initialisation de la valeur «NZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5603;1078;1;"Ashburton";"NZ.04";"NULL";"Initialisation de la valeur «NZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5604;1078;1;"Bay of Islands";"NZ.07";"NULL";"Initialisation de la valeur «NZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5605;1078;1;"Bruce";"NZ.08";"NULL";"Initialisation de la valeur «NZ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5606;1078;1;"Buller";"NZ.09";"NULL";"Initialisation de la valeur «NZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5607;1078;1;"Chatham Islands";"NZ.10";"NULL";"Initialisation de la valeur «NZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5608;1078;1;"Cheviot";"NZ.11";"NULL";"Initialisation de la valeur «NZ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5609;1078;1;"Clifton";"NZ.12";"NULL";"Initialisation de la valeur «NZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5610;1078;1;"Clutha";"NZ.13";"NULL";"Initialisation de la valeur «NZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5611;1078;1;"Cook";"NZ.14";"NULL";"Initialisation de la valeur «NZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5612;1078;1;"Dannevirke";"NZ.16";"NULL";"Initialisation de la valeur «NZ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5613;1078;1;"Egmont";"NZ.17";"NULL";"Initialisation de la valeur «NZ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5614;1078;1;"Eketahuna";"NZ.18";"NULL";"Initialisation de la valeur «NZ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5615;1078;1;"Ellesmere";"NZ.19";"NULL";"Initialisation de la valeur «NZ.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5616;1078;1;"Eltham";"NZ.20";"NULL";"Initialisation de la valeur «NZ.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5617;1078;1;"Eyre";"NZ.21";"NULL";"Initialisation de la valeur «NZ.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5618;1078;1;"Tasman";"NZ.2181818";"NULL";"Initialisation de la valeur «NZ.2181818» pour la liste «75».";2009-07-29 00:00:00;1;1
5619;1078;1;"Featherston";"NZ.22";"NULL";"Initialisation de la valeur «NZ.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5620;1078;1;"Franklin";"NZ.24";"NULL";"Initialisation de la valeur «NZ.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5621;1078;1;"Golden Bay";"NZ.26";"NULL";"Initialisation de la valeur «NZ.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5622;1078;1;"Great Barrier Island";"NZ.27";"NULL";"Initialisation de la valeur «NZ.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5623;1078;1;"Grey";"NZ.28";"NULL";"Initialisation de la valeur «NZ.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5624;1078;1;"Hauraki Plains";"NZ.29";"NULL";"Initialisation de la valeur «NZ.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5625;1078;1;"Hawera";"NZ.30";"NULL";"Initialisation de la valeur «NZ.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5626;1078;1;"Hawkeʼs Bay";"NZ.31";"NULL";"Initialisation de la valeur «NZ.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5627;1078;1;"Heathcote";"NZ.32";"NULL";"Initialisation de la valeur «NZ.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5628;1078;1;"Hobson";"NZ.33";"NULL";"Initialisation de la valeur «NZ.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5629;1078;1;"Hokianga";"NZ.34";"NULL";"Initialisation de la valeur «NZ.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5630;1078;1;"Horowhenua";"NZ.35";"NULL";"Initialisation de la valeur «NZ.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5631;1078;1;"Hutt";"NZ.36";"NULL";"Initialisation de la valeur «NZ.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5632;1078;1;"Inangahua";"NZ.37";"NULL";"Initialisation de la valeur «NZ.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5633;1078;1;"Inglewood";"NZ.38";"NULL";"Initialisation de la valeur «NZ.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5634;1078;1;"Kaikoura";"NZ.39";"NULL";"Initialisation de la valeur «NZ.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5635;1078;1;"Kairanga";"NZ.40";"NULL";"Initialisation de la valeur «NZ.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5636;1078;1;"Kiwitea";"NZ.41";"NULL";"Initialisation de la valeur «NZ.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5637;1078;1;"Lake";"NZ.43";"NULL";"Initialisation de la valeur «NZ.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5638;1078;1;"Mackenzie";"NZ.45";"NULL";"Initialisation de la valeur «NZ.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5639;1078;1;"Malvern";"NZ.46";"NULL";"Initialisation de la valeur «NZ.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5640;1078;1;"Manawatu";"NZ.47";"NULL";"Initialisation de la valeur «NZ.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5641;1078;1;"Mangonui";"NZ.48";"NULL";"Initialisation de la valeur «NZ.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5642;1078;1;"Maniototo";"NZ.49";"NULL";"Initialisation de la valeur «NZ.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5643;1078;1;"Marlborough";"NZ.50";"NULL";"Initialisation de la valeur «NZ.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5644;1078;1;"Masterton";"NZ.51";"NULL";"Initialisation de la valeur «NZ.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5645;1078;1;"Matamata";"NZ.52";"NULL";"Initialisation de la valeur «NZ.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5646;1078;1;"Mount Herbert";"NZ.53";"NULL";"Initialisation de la valeur «NZ.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5647;1078;1;"Ohinemuri";"NZ.54";"NULL";"Initialisation de la valeur «NZ.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5648;1078;1;"Opotiki";"NZ.55";"NULL";"Initialisation de la valeur «NZ.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5649;1078;1;"Oroua";"NZ.56";"NULL";"Initialisation de la valeur «NZ.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5650;1078;1;"Otamatea";"NZ.57";"NULL";"Initialisation de la valeur «NZ.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5651;1078;1;"Otorohanga";"NZ.58";"NULL";"Initialisation de la valeur «NZ.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5652;1078;1;"Oxford";"NZ.59";"NULL";"Initialisation de la valeur «NZ.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5653;1078;1;"Pahiatua";"NZ.60";"NULL";"Initialisation de la valeur «NZ.60» pour la liste «75».";2009-07-29 00:00:00;1;1
5654;1078;1;"Paparua";"NZ.61";"NULL";"Initialisation de la valeur «NZ.61» pour la liste «75».";2009-07-29 00:00:00;1;1
5655;1078;1;"Patea";"NZ.63";"NULL";"Initialisation de la valeur «NZ.63» pour la liste «75».";2009-07-29 00:00:00;1;1
5656;1078;1;"Piako";"NZ.65";"NULL";"Initialisation de la valeur «NZ.65» pour la liste «75».";2009-07-29 00:00:00;1;1
5657;1078;1;"Pohangina";"NZ.66";"NULL";"Initialisation de la valeur «NZ.66» pour la liste «75».";2009-07-29 00:00:00;1;1
5658;1078;1;"Raglan";"NZ.67";"NULL";"Initialisation de la valeur «NZ.67» pour la liste «75».";2009-07-29 00:00:00;1;1
5659;1078;1;"Rangiora";"NZ.68";"NULL";"Initialisation de la valeur «NZ.68» pour la liste «75».";2009-07-29 00:00:00;1;1
5660;1078;1;"Rangitikei";"NZ.69";"NULL";"Initialisation de la valeur «NZ.69» pour la liste «75».";2009-07-29 00:00:00;1;1
5661;1078;1;"Rodney";"NZ.70";"NULL";"Initialisation de la valeur «NZ.70» pour la liste «75».";2009-07-29 00:00:00;1;1
5662;1078;1;"Rotorua";"NZ.71";"NULL";"Initialisation de la valeur «NZ.71» pour la liste «75».";2009-07-29 00:00:00;1;1
5663;1078;1;"Southland";"NZ.72";"NULL";"Initialisation de la valeur «NZ.72» pour la liste «75».";2009-07-29 00:00:00;1;1
5664;1078;1;"Stewart Island";"NZ.73";"NULL";"Initialisation de la valeur «NZ.73» pour la liste «75».";2009-07-29 00:00:00;1;1
5665;1078;1;"Stratford";"NZ.74";"NULL";"Initialisation de la valeur «NZ.74» pour la liste «75».";2009-07-29 00:00:00;1;1
5666;1078;1;"Taranaki";"NZ.76";"NULL";"Initialisation de la valeur «NZ.76» pour la liste «75».";2009-07-29 00:00:00;1;1
5667;1078;1;"Taumarunui";"NZ.77";"NULL";"Initialisation de la valeur «NZ.77» pour la liste «75».";2009-07-29 00:00:00;1;1
5668;1078;1;"Taupo";"NZ.78";"NULL";"Initialisation de la valeur «NZ.78» pour la liste «75».";2009-07-29 00:00:00;1;1
5669;1078;1;"Tauranga";"NZ.79";"NULL";"Initialisation de la valeur «NZ.79» pour la liste «75».";2009-07-29 00:00:00;1;1
5670;1078;1;"Tuapeka";"NZ.81";"NULL";"Initialisation de la valeur «NZ.81» pour la liste «75».";2009-07-29 00:00:00;1;1
5671;1078;1;"Vincent";"NZ.82";"NULL";"Initialisation de la valeur «NZ.82» pour la liste «75».";2009-07-29 00:00:00;1;1
5672;1078;1;"Waiapu";"NZ.83";"NULL";"Initialisation de la valeur «NZ.83» pour la liste «75».";2009-07-29 00:00:00;1;1
5673;1078;1;"Waihemo";"NZ.84";"NULL";"Initialisation de la valeur «NZ.84» pour la liste «75».";2009-07-29 00:00:00;1;1
5674;1078;1;"Waikato";"NZ.85";"NULL";"Initialisation de la valeur «NZ.85» pour la liste «75».";2009-07-29 00:00:00;1;1
5675;1078;1;"Waikohu";"NZ.86";"NULL";"Initialisation de la valeur «NZ.86» pour la liste «75».";2009-07-29 00:00:00;1;1
5676;1078;1;"Waimairi";"NZ.88";"NULL";"Initialisation de la valeur «NZ.88» pour la liste «75».";2009-07-29 00:00:00;1;1
5677;1078;1;"Waimarino";"NZ.89";"NULL";"Initialisation de la valeur «NZ.89» pour la liste «75».";2009-07-29 00:00:00;1;1
5678;1078;1;"Waimate";"NZ.90";"NULL";"Initialisation de la valeur «NZ.90» pour la liste «75».";2009-07-29 00:00:00;1;1
5679;1078;1;"Waimate West";"NZ.91";"NULL";"Initialisation de la valeur «NZ.91» pour la liste «75».";2009-07-29 00:00:00;1;1
5680;1078;1;"Waimea";"NZ.92";"NULL";"Initialisation de la valeur «NZ.92» pour la liste «75».";2009-07-29 00:00:00;1;1
5681;1078;1;"Waipa";"NZ.93";"NULL";"Initialisation de la valeur «NZ.93» pour la liste «75».";2009-07-29 00:00:00;1;1
5682;1078;1;"Waipawa";"NZ.95";"NULL";"Initialisation de la valeur «NZ.95» pour la liste «75».";2009-07-29 00:00:00;1;1
5683;1078;1;"Waipukurau";"NZ.96";"NULL";"Initialisation de la valeur «NZ.96» pour la liste «75».";2009-07-29 00:00:00;1;1
5684;1078;1;"Wairarapa South";"NZ.97";"NULL";"Initialisation de la valeur «NZ.97» pour la liste «75».";2009-07-29 00:00:00;1;1
5685;1078;1;"Wairewa";"NZ.98";"NULL";"Initialisation de la valeur «NZ.98» pour la liste «75».";2009-07-29 00:00:00;1;1
5686;1078;1;"Wairoa";"NZ.99";"NULL";"Initialisation de la valeur «NZ.99» pour la liste «75».";2009-07-29 00:00:00;1;1
5687;1078;1;"Whangarei";"NZ.A1";"NULL";"Initialisation de la valeur «NZ.A1» pour la liste «75».";2009-07-29 00:00:00;1;1
5688;1078;1;"Whangaroa";"NZ.A2";"NULL";"Initialisation de la valeur «NZ.A2» pour la liste «75».";2009-07-29 00:00:00;1;1
5689;1078;1;"Woodville";"NZ.A3";"NULL";"Initialisation de la valeur «NZ.A3» pour la liste «75».";2009-07-29 00:00:00;1;1
5690;1078;1;"Waitaki";"NZ.A4";"NULL";"Initialisation de la valeur «NZ.A4» pour la liste «75».";2009-07-29 00:00:00;1;1
5691;1078;1;"Waitomo";"NZ.A6";"NULL";"Initialisation de la valeur «NZ.A6» pour la liste «75».";2009-07-29 00:00:00;1;1
5692;1078;1;"Waitotara";"NZ.A8";"NULL";"Initialisation de la valeur «NZ.A8» pour la liste «75».";2009-07-29 00:00:00;1;1
5693;1078;1;"North Auckland";"NZ.AK";"NULL";"Initialisation de la valeur «NZ.AK» pour la liste «75».";2009-07-29 00:00:00;1;1
5694;1078;1;"Wanganui";"NZ.B2";"NULL";"Initialisation de la valeur «NZ.B2» pour la liste «75».";2009-07-29 00:00:00;1;1
5695;1078;1;"Westland";"NZ.B3";"NULL";"Initialisation de la valeur «NZ.B3» pour la liste «75».";2009-07-29 00:00:00;1;1
5696;1078;1;"Whakatane";"NZ.B4";"NULL";"Initialisation de la valeur «NZ.B4» pour la liste «75».";2009-07-29 00:00:00;1;1
5697;1078;1;"Marlborough";"NZ.BM";"NULL";"Initialisation de la valeur «NZ.BM» pour la liste «75».";2009-07-29 00:00:00;1;1
5698;1078;1;"Canterbury";"NZ.CH";"NULL";"Initialisation de la valeur «NZ.CH» pour la liste «75».";2009-07-29 00:00:00;1;1
5699;1078;1;"Hurunui";"NZ.D4";"NULL";"Initialisation de la valeur «NZ.D4» pour la liste «75».";2009-07-29 00:00:00;1;1
5700;1078;1;"Silverpeaks";"NZ.D5";"NULL";"Initialisation de la valeur «NZ.D5» pour la liste «75».";2009-07-29 00:00:00;1;1
5701;1078;1;"Strathallan";"NZ.D6";"NULL";"Initialisation de la valeur «NZ.D6» pour la liste «75».";2009-07-29 00:00:00;1;1
5702;1078;1;"Waiheke";"NZ.D8";"NULL";"Initialisation de la valeur «NZ.D8» pour la liste «75».";2009-07-29 00:00:00;1;1
5703;1078;1;"Hikurangi";"NZ.D9";"NULL";"Initialisation de la valeur «NZ.D9» pour la liste «75».";2009-07-29 00:00:00;1;1
5704;1078;1;"Otago";"NZ.DN";"NULL";"Initialisation de la valeur «NZ.DN» pour la liste «75».";2009-07-29 00:00:00;1;1
5705;1078;1;"Manaia";"NZ.E1";"NULL";"Initialisation de la valeur «NZ.E1» pour la liste «75».";2009-07-29 00:00:00;1;1
5706;1078;1;"Runanga";"NZ.E2";"NULL";"Initialisation de la valeur «NZ.E2» pour la liste «75».";2009-07-29 00:00:00;1;1
5707;1078;1;"Saint Kilda";"NZ.E3";"NULL";"Initialisation de la valeur «NZ.E3» pour la liste «75».";2009-07-29 00:00:00;1;1
5708;1078;1;"Thames-Coromandel";"NZ.E4";"NULL";"Initialisation de la valeur «NZ.E4» pour la liste «75».";2009-07-29 00:00:00;1;1
5709;1078;1;"Waverley";"NZ.E5";"NULL";"Initialisation de la valeur «NZ.E5» pour la liste «75».";2009-07-29 00:00:00;1;1
5710;1078;1;"Wallace";"NZ.E6";"NULL";"Initialisation de la valeur «NZ.E6» pour la liste «75».";2009-07-29 00:00:00;1;1
5711;1078;1;"Auckland";"NZ.E7";"NULL";"Initialisation de la valeur «NZ.E7» pour la liste «75».";2009-07-29 00:00:00;1;1
5712;1078;1;"Bay of Plenty";"NZ.E8";"NULL";"Initialisation de la valeur «NZ.E8» pour la liste «75».";2009-07-29 00:00:00;1;1
5713;1078;1;"Canterbury";"NZ.E9";"NULL";"Initialisation de la valeur «NZ.E9» pour la liste «75».";2009-07-29 00:00:00;1;1
5714;1078;1;"Gisborne";"NZ.F1";"NULL";"Initialisation de la valeur «NZ.F1» pour la liste «75».";2009-07-29 00:00:00;1;1
5715;1078;1;"Hawke's Bay";"NZ.F2";"NULL";"Initialisation de la valeur «NZ.F2» pour la liste «75».";2009-07-29 00:00:00;1;1
5716;1078;1;"Manawatu-Wanganui";"NZ.F3";"NULL";"Initialisation de la valeur «NZ.F3» pour la liste «75».";2009-07-29 00:00:00;1;1
5717;1078;1;"Marlborough";"NZ.F4";"NULL";"Initialisation de la valeur «NZ.F4» pour la liste «75».";2009-07-29 00:00:00;1;1
5718;1078;1;"Nelson";"NZ.F5";"NULL";"Initialisation de la valeur «NZ.F5» pour la liste «75».";2009-07-29 00:00:00;1;1
5719;1078;1;"Northland";"NZ.F6";"NULL";"Initialisation de la valeur «NZ.F6» pour la liste «75».";2009-07-29 00:00:00;1;1
5720;1078;1;"Otago";"NZ.F7";"NULL";"Initialisation de la valeur «NZ.F7» pour la liste «75».";2009-07-29 00:00:00;1;1
5721;1078;1;"Southland";"NZ.F8";"NULL";"Initialisation de la valeur «NZ.F8» pour la liste «75».";2009-07-29 00:00:00;1;1
5722;1078;1;"Taranaki";"NZ.F9";"NULL";"Initialisation de la valeur «NZ.F9» pour la liste «75».";2009-07-29 00:00:00;1;1
5723;1078;1;"Waikato";"NZ.G1";"NULL";"Initialisation de la valeur «NZ.G1» pour la liste «75».";2009-07-29 00:00:00;1;1
5724;1078;1;"Wellington";"NZ.G2";"NULL";"Initialisation de la valeur «NZ.G2» pour la liste «75».";2009-07-29 00:00:00;1;1
5725;1078;1;"West Coast";"NZ.G3";"NULL";"Initialisation de la valeur «NZ.G3» pour la liste «75».";2009-07-29 00:00:00;1;1
5726;1078;1;"Gisborne";"NZ.GS";"NULL";"Initialisation de la valeur «NZ.GS» pour la liste «75».";2009-07-29 00:00:00;1;1
5727;1078;1;"Westland";"NZ.HK";"NULL";"Initialisation de la valeur «NZ.HK» pour la liste «75».";2009-07-29 00:00:00;1;1
5728;1078;1;"South Auckland";"NZ.HN";"NULL";"Initialisation de la valeur «NZ.HN» pour la liste «75».";2009-07-29 00:00:00;1;1
5729;1078;1;"Southland";"NZ.IN";"NULL";"Initialisation de la valeur «NZ.IN» pour la liste «75».";2009-07-29 00:00:00;1;1
5730;1078;1;"Hawke's Bay";"NZ.NA";"NULL";"Initialisation de la valeur «NZ.NA» pour la liste «75».";2009-07-29 00:00:00;1;1
5731;1078;1;"Nelson";"NZ.NN";"NULL";"Initialisation de la valeur «NZ.NN» pour la liste «75».";2009-07-29 00:00:00;1;1
5732;1078;1;"Taranaki";"NZ.NP";"NULL";"Initialisation de la valeur «NZ.NP» pour la liste «75».";2009-07-29 00:00:00;1;1
5733;1078;1;"Wellington";"NZ.WN";"NULL";"Initialisation de la valeur «NZ.WN» pour la liste «75».";2009-07-29 00:00:00;1;1
5734;1078;1;"Oman (general)";"OM.00";"NULL";"Initialisation de la valeur «OM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5735;1078;1;"Ad Dākhilīyah";"OM.01";"NULL";"Initialisation de la valeur «OM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5736;1078;1;"Al Bāţinah";"OM.02";"NULL";"Initialisation de la valeur «OM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5737;1078;1;"Al Wusţá";"OM.03";"NULL";"Initialisation de la valeur «OM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5738;1078;1;"Ash Sharqīyah";"OM.04";"NULL";"Initialisation de la valeur «OM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5739;1078;1;"Az̧ Z̧āhirah";"OM.05";"NULL";"Initialisation de la valeur «OM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5740;1078;1;"Masqaţ";"OM.06";"NULL";"Initialisation de la valeur «OM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5741;1078;1;"Musandam";"OM.07";"NULL";"Initialisation de la valeur «OM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5742;1078;1;"Z̧ufār";"OM.08";"NULL";"Initialisation de la valeur «OM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5743;1078;1;"Panama (general)";"PA.00";"NULL";"Initialisation de la valeur «PA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5744;1078;1;"Bocas del Toro";"PA.01";"NULL";"Initialisation de la valeur «PA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5745;1078;1;"Chiriquí";"PA.02";"NULL";"Initialisation de la valeur «PA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5746;1078;1;"Coclé";"PA.03";"NULL";"Initialisation de la valeur «PA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5747;1078;1;"Colón";"PA.04";"NULL";"Initialisation de la valeur «PA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5748;1078;1;"Darién";"PA.05";"NULL";"Initialisation de la valeur «PA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5749;1078;1;"Herrera";"PA.06";"NULL";"Initialisation de la valeur «PA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5750;1078;1;"Los Santos";"PA.07";"NULL";"Initialisation de la valeur «PA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5751;1078;1;"Panamá";"PA.08";"NULL";"Initialisation de la valeur «PA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5752;1078;1;"San Blas";"PA.09";"NULL";"Initialisation de la valeur «PA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5753;1078;1;"Veraguas";"PA.10";"NULL";"Initialisation de la valeur «PA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5754;1078;1;"Peru (general)";"PE.00";"NULL";"Initialisation de la valeur «PE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5755;1078;1;"Amazonas";"PE.01";"NULL";"Initialisation de la valeur «PE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5756;1078;1;"Ancash";"PE.02";"NULL";"Initialisation de la valeur «PE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5757;1078;1;"Apurímac";"PE.03";"NULL";"Initialisation de la valeur «PE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5758;1078;1;"Arequipa";"PE.04";"NULL";"Initialisation de la valeur «PE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5759;1078;1;"Ayacucho";"PE.05";"NULL";"Initialisation de la valeur «PE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5760;1078;1;"Cajamarca";"PE.06";"NULL";"Initialisation de la valeur «PE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5761;1078;1;"Callao";"PE.07";"NULL";"Initialisation de la valeur «PE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5762;1078;1;"Cusco";"PE.08";"NULL";"Initialisation de la valeur «PE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5763;1078;1;"Huancavelica";"PE.09";"NULL";"Initialisation de la valeur «PE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5764;1078;1;"Huanuco";"PE.10";"NULL";"Initialisation de la valeur «PE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5765;1078;1;"Ica";"PE.11";"NULL";"Initialisation de la valeur «PE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5766;1078;1;"Junín";"PE.12";"NULL";"Initialisation de la valeur «PE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5767;1078;1;"La Libertad";"PE.13";"NULL";"Initialisation de la valeur «PE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5768;1078;1;"Lambayeque";"PE.14";"NULL";"Initialisation de la valeur «PE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5769;1078;1;"Lima";"PE.15";"NULL";"Initialisation de la valeur «PE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5770;1078;1;"Loreto";"PE.16";"NULL";"Initialisation de la valeur «PE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5771;1078;1;"Madre de Dios";"PE.17";"NULL";"Initialisation de la valeur «PE.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5772;1078;1;"Moquegua";"PE.18";"NULL";"Initialisation de la valeur «PE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5773;1078;1;"Pasco";"PE.19";"NULL";"Initialisation de la valeur «PE.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5774;1078;1;"Piura";"PE.20";"NULL";"Initialisation de la valeur «PE.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5775;1078;1;"Puno";"PE.21";"NULL";"Initialisation de la valeur «PE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5776;1078;1;"San Martín";"PE.22";"NULL";"Initialisation de la valeur «PE.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5777;1078;1;"Tacna";"PE.23";"NULL";"Initialisation de la valeur «PE.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5778;1078;1;"Tumbes";"PE.24";"NULL";"Initialisation de la valeur «PE.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5779;1078;1;"Ucayali";"PE.25";"NULL";"Initialisation de la valeur «PE.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5780;1078;1;"Papua New Guinea (general)";"PG.00";"NULL";"Initialisation de la valeur «PG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5781;1078;1;"Central";"PG.01";"NULL";"Initialisation de la valeur «PG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5782;1078;1;"Gulf";"PG.02";"NULL";"Initialisation de la valeur «PG.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5783;1078;1;"Milne Bay";"PG.03";"NULL";"Initialisation de la valeur «PG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5784;1078;1;"Northern";"PG.04";"NULL";"Initialisation de la valeur «PG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5785;1078;1;"Southern Highlands";"PG.05";"NULL";"Initialisation de la valeur «PG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5786;1078;1;"Western";"PG.06";"NULL";"Initialisation de la valeur «PG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5787;1078;1;"Bougainville";"PG.07";"NULL";"Initialisation de la valeur «PG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5788;1078;1;"Chimbu";"PG.08";"NULL";"Initialisation de la valeur «PG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5789;1078;1;"Eastern Highlands";"PG.09";"NULL";"Initialisation de la valeur «PG.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5790;1078;1;"East New Britain";"PG.10";"NULL";"Initialisation de la valeur «PG.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5791;1078;1;"East Sepik";"PG.11";"NULL";"Initialisation de la valeur «PG.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5792;1078;1;"Madang";"PG.12";"NULL";"Initialisation de la valeur «PG.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5793;1078;1;"Manus";"PG.13";"NULL";"Initialisation de la valeur «PG.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5794;1078;1;"Morobe";"PG.14";"NULL";"Initialisation de la valeur «PG.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5795;1078;1;"New Ireland";"PG.15";"NULL";"Initialisation de la valeur «PG.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5796;1078;1;"Western Highlands";"PG.16";"NULL";"Initialisation de la valeur «PG.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5797;1078;1;"West New Britain";"PG.17";"NULL";"Initialisation de la valeur «PG.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5798;1078;1;"Sandaun";"PG.18";"NULL";"Initialisation de la valeur «PG.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5799;1078;1;"Enga";"PG.19";"NULL";"Initialisation de la valeur «PG.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5800;1078;1;"National Capital";"PG.20";"NULL";"Initialisation de la valeur «PG.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5801;1078;1;"Philippines (general)";"PH.00";"NULL";"Initialisation de la valeur «PH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5802;1078;1;"Abra";"PH.01";"NULL";"Initialisation de la valeur «PH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5803;1078;1;"Agusan del Norte";"PH.02";"NULL";"Initialisation de la valeur «PH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5804;1078;1;"Agusan del Sur";"PH.03";"NULL";"Initialisation de la valeur «PH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5805;1078;1;"Aklan";"PH.04";"NULL";"Initialisation de la valeur «PH.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5806;1078;1;"Albay";"PH.05";"NULL";"Initialisation de la valeur «PH.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5807;1078;1;"Antique";"PH.06";"NULL";"Initialisation de la valeur «PH.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5808;1078;1;"Bataan";"PH.07";"NULL";"Initialisation de la valeur «PH.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5809;1078;1;"Batanes";"PH.08";"NULL";"Initialisation de la valeur «PH.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5810;1078;1;"Batangas";"PH.09";"NULL";"Initialisation de la valeur «PH.09» pour la liste «75».";2009-07-29 00:00:00;1;1
5811;1078;1;"Benguet";"PH.10";"NULL";"Initialisation de la valeur «PH.10» pour la liste «75».";2009-07-29 00:00:00;1;1
5812;1078;1;"Bohol";"PH.11";"NULL";"Initialisation de la valeur «PH.11» pour la liste «75».";2009-07-29 00:00:00;1;1
5813;1078;1;"Bukidnon";"PH.12";"NULL";"Initialisation de la valeur «PH.12» pour la liste «75».";2009-07-29 00:00:00;1;1
5814;1078;1;"Bulacan";"PH.13";"NULL";"Initialisation de la valeur «PH.13» pour la liste «75».";2009-07-29 00:00:00;1;1
5815;1078;1;"Cagayan";"PH.14";"NULL";"Initialisation de la valeur «PH.14» pour la liste «75».";2009-07-29 00:00:00;1;1
5816;1078;1;"Camarines Norte";"PH.15";"NULL";"Initialisation de la valeur «PH.15» pour la liste «75».";2009-07-29 00:00:00;1;1
5817;1078;1;"Camarines Sur";"PH.16";"NULL";"Initialisation de la valeur «PH.16» pour la liste «75».";2009-07-29 00:00:00;1;1
5818;1078;1;"Camiguin";"PH.17";"NULL";"Initialisation de la valeur «PH.17» pour la liste «75».";2009-07-29 00:00:00;1;1
5819;1078;1;"Capiz";"PH.18";"NULL";"Initialisation de la valeur «PH.18» pour la liste «75».";2009-07-29 00:00:00;1;1
5820;1078;1;"Catanduanes";"PH.19";"NULL";"Initialisation de la valeur «PH.19» pour la liste «75».";2009-07-29 00:00:00;1;1
5821;1078;1;"Cavite";"PH.20";"NULL";"Initialisation de la valeur «PH.20» pour la liste «75».";2009-07-29 00:00:00;1;1
5822;1078;1;"Cebu";"PH.21";"NULL";"Initialisation de la valeur «PH.21» pour la liste «75».";2009-07-29 00:00:00;1;1
5823;1078;1;"Basilan";"PH.22";"NULL";"Initialisation de la valeur «PH.22» pour la liste «75».";2009-07-29 00:00:00;1;1
5824;1078;1;"Eastern Samar";"PH.23";"NULL";"Initialisation de la valeur «PH.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5825;1078;1;"Davao";"PH.24";"NULL";"Initialisation de la valeur «PH.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5826;1078;1;"Davao del Sur";"PH.25";"NULL";"Initialisation de la valeur «PH.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5827;1078;1;"Davao Oriental";"PH.26";"NULL";"Initialisation de la valeur «PH.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5828;1078;1;"Ifugao";"PH.27";"NULL";"Initialisation de la valeur «PH.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5829;1078;1;"Ilocos Norte";"PH.28";"NULL";"Initialisation de la valeur «PH.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5830;1078;1;"Ilocos Sur";"PH.29";"NULL";"Initialisation de la valeur «PH.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5831;1078;1;"Iloilo";"PH.30";"NULL";"Initialisation de la valeur «PH.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5832;1078;1;"Isabela";"PH.31";"NULL";"Initialisation de la valeur «PH.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5833;1078;1;"Kalinga-Apayao";"PH.32";"NULL";"Initialisation de la valeur «PH.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5834;1078;1;"Laguna";"PH.33";"NULL";"Initialisation de la valeur «PH.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5835;1078;1;"Lanao del Norte";"PH.34";"NULL";"Initialisation de la valeur «PH.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5836;1078;1;"Lanao del Sur";"PH.35";"NULL";"Initialisation de la valeur «PH.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5837;1078;1;"La Union";"PH.36";"NULL";"Initialisation de la valeur «PH.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5838;1078;1;"Leyte";"PH.37";"NULL";"Initialisation de la valeur «PH.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5839;1078;1;"Marinduque";"PH.38";"NULL";"Initialisation de la valeur «PH.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5840;1078;1;"Masbate";"PH.39";"NULL";"Initialisation de la valeur «PH.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5841;1078;1;"Mindoro Occidental";"PH.40";"NULL";"Initialisation de la valeur «PH.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5842;1078;1;"Mindoro Oriental";"PH.41";"NULL";"Initialisation de la valeur «PH.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5843;1078;1;"Misamis Occidental";"PH.42";"NULL";"Initialisation de la valeur «PH.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5844;1078;1;"Misamis Oriental";"PH.43";"NULL";"Initialisation de la valeur «PH.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5845;1078;1;"Mountain Province";"PH.44";"NULL";"Initialisation de la valeur «PH.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5846;1078;1;"(RP45)";"PH.45";"NULL";"Initialisation de la valeur «PH.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5847;1078;1;"Negros Oriental";"PH.46";"NULL";"Initialisation de la valeur «PH.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5848;1078;1;"Nueva Ecija";"PH.47";"NULL";"Initialisation de la valeur «PH.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5849;1078;1;"Nueva Vizcaya";"PH.48";"NULL";"Initialisation de la valeur «PH.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5850;1078;1;"Palawan";"PH.49";"NULL";"Initialisation de la valeur «PH.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5851;1078;1;"Pampanga";"PH.50";"NULL";"Initialisation de la valeur «PH.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5852;1078;1;"Pangasinan";"PH.51";"NULL";"Initialisation de la valeur «PH.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5853;1078;1;"Rizal";"PH.53";"NULL";"Initialisation de la valeur «PH.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5854;1078;1;"Romblon";"PH.54";"NULL";"Initialisation de la valeur «PH.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5855;1078;1;"Samar";"PH.55";"NULL";"Initialisation de la valeur «PH.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5856;1078;1;"Maguindanao";"PH.56";"NULL";"Initialisation de la valeur «PH.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5857;1078;1;"North Cotabato";"PH.57";"NULL";"Initialisation de la valeur «PH.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5858;1078;1;"Sorsogon";"PH.58";"NULL";"Initialisation de la valeur «PH.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5859;1078;1;"Southern Leyte";"PH.59";"NULL";"Initialisation de la valeur «PH.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5860;1078;1;"Sulu";"PH.60";"NULL";"Initialisation de la valeur «PH.60» pour la liste «75».";2009-07-29 00:00:00;1;1
5861;1078;1;"Surigao del Norte";"PH.61";"NULL";"Initialisation de la valeur «PH.61» pour la liste «75».";2009-07-29 00:00:00;1;1
5862;1078;1;"Surigao del Sur";"PH.62";"NULL";"Initialisation de la valeur «PH.62» pour la liste «75».";2009-07-29 00:00:00;1;1
5863;1078;1;"Tarlac";"PH.63";"NULL";"Initialisation de la valeur «PH.63» pour la liste «75».";2009-07-29 00:00:00;1;1
5864;1078;1;"Zambales";"PH.64";"NULL";"Initialisation de la valeur «PH.64» pour la liste «75».";2009-07-29 00:00:00;1;1
5865;1078;1;"Zamboanga del Norte";"PH.65";"NULL";"Initialisation de la valeur «PH.65» pour la liste «75».";2009-07-29 00:00:00;1;1
5866;1078;1;"Zamboanga del Sur";"PH.66";"NULL";"Initialisation de la valeur «PH.66» pour la liste «75».";2009-07-29 00:00:00;1;1
5867;1078;1;"Northern Samar";"PH.67";"NULL";"Initialisation de la valeur «PH.67» pour la liste «75».";2009-07-29 00:00:00;1;1
5868;1078;1;"Quirino";"PH.68";"NULL";"Initialisation de la valeur «PH.68» pour la liste «75».";2009-07-29 00:00:00;1;1
5869;1078;1;"Siquijor";"PH.69";"NULL";"Initialisation de la valeur «PH.69» pour la liste «75».";2009-07-29 00:00:00;1;1
5870;1078;1;"South Cotabato";"PH.70";"NULL";"Initialisation de la valeur «PH.70» pour la liste «75».";2009-07-29 00:00:00;1;1
5871;1078;1;"Sultan Kudarat";"PH.71";"NULL";"Initialisation de la valeur «PH.71» pour la liste «75».";2009-07-29 00:00:00;1;1
5872;1078;1;"Tawi-Tawi";"PH.72";"NULL";"Initialisation de la valeur «PH.72» pour la liste «75».";2009-07-29 00:00:00;1;1
5873;1078;1;"Angeles";"PH.A1";"NULL";"Initialisation de la valeur «PH.A1» pour la liste «75».";2009-07-29 00:00:00;1;1
5874;1078;1;"Bacolod City";"PH.A2";"NULL";"Initialisation de la valeur «PH.A2» pour la liste «75».";2009-07-29 00:00:00;1;1
5875;1078;1;"Bago";"PH.A3";"NULL";"Initialisation de la valeur «PH.A3» pour la liste «75».";2009-07-29 00:00:00;1;1
5876;1078;1;"Baguio";"PH.A4";"NULL";"Initialisation de la valeur «PH.A4» pour la liste «75».";2009-07-29 00:00:00;1;1
5877;1078;1;"Bais";"PH.A5";"NULL";"Initialisation de la valeur «PH.A5» pour la liste «75».";2009-07-29 00:00:00;1;1
5878;1078;1;"Basilan";"PH.A6";"NULL";"Initialisation de la valeur «PH.A6» pour la liste «75».";2009-07-29 00:00:00;1;1
5879;1078;1;"Batangas";"PH.A7";"NULL";"Initialisation de la valeur «PH.A7» pour la liste «75».";2009-07-29 00:00:00;1;1
5880;1078;1;"Butuan";"PH.A8";"NULL";"Initialisation de la valeur «PH.A8» pour la liste «75».";2009-07-29 00:00:00;1;1
5881;1078;1;"Cabanatuan";"PH.A9";"NULL";"Initialisation de la valeur «PH.A9» pour la liste «75».";2009-07-29 00:00:00;1;1
5882;1078;1;"Cadiz";"PH.B1";"NULL";"Initialisation de la valeur «PH.B1» pour la liste «75».";2009-07-29 00:00:00;1;1
5883;1078;1;"Calbayog";"PH.B3";"NULL";"Initialisation de la valeur «PH.B3» pour la liste «75».";2009-07-29 00:00:00;1;1
5884;1078;1;"Caloocan";"PH.B4";"NULL";"Initialisation de la valeur «PH.B4» pour la liste «75».";2009-07-29 00:00:00;1;1
5885;1078;1;"Canlaon";"PH.B5";"NULL";"Initialisation de la valeur «PH.B5» pour la liste «75».";2009-07-29 00:00:00;1;1
5886;1078;1;"Cavite";"PH.B6";"NULL";"Initialisation de la valeur «PH.B6» pour la liste «75».";2009-07-29 00:00:00;1;1
5887;1078;1;"Cebu City";"PH.B7";"NULL";"Initialisation de la valeur «PH.B7» pour la liste «75».";2009-07-29 00:00:00;1;1
5888;1078;1;"Cotabato";"PH.B8";"NULL";"Initialisation de la valeur «PH.B8» pour la liste «75».";2009-07-29 00:00:00;1;1
5889;1078;1;"Dagupan";"PH.B9";"NULL";"Initialisation de la valeur «PH.B9» pour la liste «75».";2009-07-29 00:00:00;1;1
5890;1078;1;"Danao";"PH.C1";"NULL";"Initialisation de la valeur «PH.C1» pour la liste «75».";2009-07-29 00:00:00;1;1
5891;1078;1;"Dapitan";"PH.C2";"NULL";"Initialisation de la valeur «PH.C2» pour la liste «75».";2009-07-29 00:00:00;1;1
5892;1078;1;"Davao";"PH.C3";"NULL";"Initialisation de la valeur «PH.C3» pour la liste «75».";2009-07-29 00:00:00;1;1
5893;1078;1;"Dipolog";"PH.C4";"NULL";"Initialisation de la valeur «PH.C4» pour la liste «75».";2009-07-29 00:00:00;1;1
5894;1078;1;"Dumaguete";"PH.C5";"NULL";"Initialisation de la valeur «PH.C5» pour la liste «75».";2009-07-29 00:00:00;1;1
5895;1078;1;"General Santos";"PH.C6";"NULL";"Initialisation de la valeur «PH.C6» pour la liste «75».";2009-07-29 00:00:00;1;1
5896;1078;1;"Gingoog";"PH.C7";"NULL";"Initialisation de la valeur «PH.C7» pour la liste «75».";2009-07-29 00:00:00;1;1
5897;1078;1;"Iloilo";"PH.C9";"NULL";"Initialisation de la valeur «PH.C9» pour la liste «75».";2009-07-29 00:00:00;1;1
5898;1078;1;"Iriga";"PH.D1";"NULL";"Initialisation de la valeur «PH.D1» pour la liste «75».";2009-07-29 00:00:00;1;1
5899;1078;1;"La Carlota";"PH.D2";"NULL";"Initialisation de la valeur «PH.D2» pour la liste «75».";2009-07-29 00:00:00;1;1
5900;1078;1;"Laoag";"PH.D3";"NULL";"Initialisation de la valeur «PH.D3» pour la liste «75».";2009-07-29 00:00:00;1;1
5901;1078;1;"Lapu-Lapu";"PH.D4";"NULL";"Initialisation de la valeur «PH.D4» pour la liste «75».";2009-07-29 00:00:00;1;1
5902;1078;1;"Legaspi";"PH.D5";"NULL";"Initialisation de la valeur «PH.D5» pour la liste «75».";2009-07-29 00:00:00;1;1
5903;1078;1;"Lipa";"PH.D6";"NULL";"Initialisation de la valeur «PH.D6» pour la liste «75».";2009-07-29 00:00:00;1;1
5904;1078;1;"Lucena";"PH.D7";"NULL";"Initialisation de la valeur «PH.D7» pour la liste «75».";2009-07-29 00:00:00;1;1
5905;1078;1;"Mandaue";"PH.D8";"NULL";"Initialisation de la valeur «PH.D8» pour la liste «75».";2009-07-29 00:00:00;1;1
5906;1078;1;"Manila";"PH.D9";"NULL";"Initialisation de la valeur «PH.D9» pour la liste «75».";2009-07-29 00:00:00;1;1
5907;1078;1;"Naga";"PH.E2";"NULL";"Initialisation de la valeur «PH.E2» pour la liste «75».";2009-07-29 00:00:00;1;1
5908;1078;1;"Olongapo";"PH.E3";"NULL";"Initialisation de la valeur «PH.E3» pour la liste «75».";2009-07-29 00:00:00;1;1
5909;1078;1;"Ormoc";"PH.E4";"NULL";"Initialisation de la valeur «PH.E4» pour la liste «75».";2009-07-29 00:00:00;1;1
5910;1078;1;"Oroquieta";"PH.E5";"NULL";"Initialisation de la valeur «PH.E5» pour la liste «75».";2009-07-29 00:00:00;1;1
5911;1078;1;"Ozamis";"PH.E6";"NULL";"Initialisation de la valeur «PH.E6» pour la liste «75».";2009-07-29 00:00:00;1;1
5912;1078;1;"Pagadian";"PH.E7";"NULL";"Initialisation de la valeur «PH.E7» pour la liste «75».";2009-07-29 00:00:00;1;1
5913;1078;1;"Palayan";"PH.E8";"NULL";"Initialisation de la valeur «PH.E8» pour la liste «75».";2009-07-29 00:00:00;1;1
5914;1078;1;"Pasay";"PH.E9";"NULL";"Initialisation de la valeur «PH.E9» pour la liste «75».";2009-07-29 00:00:00;1;1
5915;1078;1;"Puerto Princesa";"PH.F1";"NULL";"Initialisation de la valeur «PH.F1» pour la liste «75».";2009-07-29 00:00:00;1;1
5916;1078;1;"Quezon";"PH.F2";"NULL";"Initialisation de la valeur «PH.F2» pour la liste «75».";2009-07-29 00:00:00;1;1
5917;1078;1;"Roxas";"PH.F3";"NULL";"Initialisation de la valeur «PH.F3» pour la liste «75».";2009-07-29 00:00:00;1;1
5918;1078;1;"San Carlos, Negros Occidental";"PH.F4";"NULL";"Initialisation de la valeur «PH.F4» pour la liste «75».";2009-07-29 00:00:00;1;1
5919;1078;1;"San Carlos, Pangasinan";"PH.F5";"NULL";"Initialisation de la valeur «PH.F5» pour la liste «75».";2009-07-29 00:00:00;1;1
5920;1078;1;"San Jose";"PH.F6";"NULL";"Initialisation de la valeur «PH.F6» pour la liste «75».";2009-07-29 00:00:00;1;1
5921;1078;1;"San Pablo";"PH.F7";"NULL";"Initialisation de la valeur «PH.F7» pour la liste «75».";2009-07-29 00:00:00;1;1
5922;1078;1;"Silay";"PH.F8";"NULL";"Initialisation de la valeur «PH.F8» pour la liste «75».";2009-07-29 00:00:00;1;1
5923;1078;1;"Surigao";"PH.F9";"NULL";"Initialisation de la valeur «PH.F9» pour la liste «75».";2009-07-29 00:00:00;1;1
5924;1078;1;"Tacloban";"PH.G1";"NULL";"Initialisation de la valeur «PH.G1» pour la liste «75».";2009-07-29 00:00:00;1;1
5925;1078;1;"Tagaytay";"PH.G2";"NULL";"Initialisation de la valeur «PH.G2» pour la liste «75».";2009-07-29 00:00:00;1;1
5926;1078;1;"Tagbilaran";"PH.G3";"NULL";"Initialisation de la valeur «PH.G3» pour la liste «75».";2009-07-29 00:00:00;1;1
5927;1078;1;"Tangub";"PH.G4";"NULL";"Initialisation de la valeur «PH.G4» pour la liste «75».";2009-07-29 00:00:00;1;1
5928;1078;1;"Toledo";"PH.G5";"NULL";"Initialisation de la valeur «PH.G5» pour la liste «75».";2009-07-29 00:00:00;1;1
5929;1078;1;"Trece Martires";"PH.G6";"NULL";"Initialisation de la valeur «PH.G6» pour la liste «75».";2009-07-29 00:00:00;1;1
5930;1078;1;"Zamboanga City";"PH.G7";"NULL";"Initialisation de la valeur «PH.G7» pour la liste «75».";2009-07-29 00:00:00;1;1
5931;1078;1;"Aurora";"PH.G8";"NULL";"Initialisation de la valeur «PH.G8» pour la liste «75».";2009-07-29 00:00:00;1;1
5932;1078;1;"Quezon";"PH.H2";"NULL";"Initialisation de la valeur «PH.H2» pour la liste «75».";2009-07-29 00:00:00;1;1
5933;1078;1;"Negros Occidental";"PH.H3";"NULL";"Initialisation de la valeur «PH.H3» pour la liste «75».";2009-07-29 00:00:00;1;1
5934;1078;1;"Pakistan (general)";"PK.00";"NULL";"Initialisation de la valeur «PK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
5935;1078;1;"Federally Administered Tribal Areas";"PK.01";"NULL";"Initialisation de la valeur «PK.01» pour la liste «75».";2009-07-29 00:00:00;1;1
5936;1078;1;"Balochistān";"PK.02";"NULL";"Initialisation de la valeur «PK.02» pour la liste «75».";2009-07-29 00:00:00;1;1
5937;1078;1;"North-West Frontier";"PK.03";"NULL";"Initialisation de la valeur «PK.03» pour la liste «75».";2009-07-29 00:00:00;1;1
5938;1078;1;"Punjab";"PK.04";"NULL";"Initialisation de la valeur «PK.04» pour la liste «75».";2009-07-29 00:00:00;1;1
5939;1078;1;"Sindh";"PK.05";"NULL";"Initialisation de la valeur «PK.05» pour la liste «75».";2009-07-29 00:00:00;1;1
5940;1078;1;"Azad Kashmir";"PK.06";"NULL";"Initialisation de la valeur «PK.06» pour la liste «75».";2009-07-29 00:00:00;1;1
5941;1078;1;"Northern Areas";"PK.07";"NULL";"Initialisation de la valeur «PK.07» pour la liste «75».";2009-07-29 00:00:00;1;1
5942;1078;1;"Islāmābād";"PK.08";"NULL";"Initialisation de la valeur «PK.08» pour la liste «75».";2009-07-29 00:00:00;1;1
5943;1078;1;"Biala Podlaska";"PL.23";"NULL";"Initialisation de la valeur «PL.23» pour la liste «75».";2009-07-29 00:00:00;1;1
5944;1078;1;"Bialystok";"PL.24";"NULL";"Initialisation de la valeur «PL.24» pour la liste «75».";2009-07-29 00:00:00;1;1
5945;1078;1;"Bielsko";"PL.25";"NULL";"Initialisation de la valeur «PL.25» pour la liste «75».";2009-07-29 00:00:00;1;1
5946;1078;1;"Bydgoszcz";"PL.26";"NULL";"Initialisation de la valeur «PL.26» pour la liste «75».";2009-07-29 00:00:00;1;1
5947;1078;1;"Chelm";"PL.27";"NULL";"Initialisation de la valeur «PL.27» pour la liste «75».";2009-07-29 00:00:00;1;1
5948;1078;1;"Ciechanow";"PL.28";"NULL";"Initialisation de la valeur «PL.28» pour la liste «75».";2009-07-29 00:00:00;1;1
5949;1078;1;"Czestochowa";"PL.29";"NULL";"Initialisation de la valeur «PL.29» pour la liste «75».";2009-07-29 00:00:00;1;1
5950;1078;1;"Elblag";"PL.30";"NULL";"Initialisation de la valeur «PL.30» pour la liste «75».";2009-07-29 00:00:00;1;1
5951;1078;1;"Gdansk";"PL.31";"NULL";"Initialisation de la valeur «PL.31» pour la liste «75».";2009-07-29 00:00:00;1;1
5952;1078;1;"Gorzow";"PL.32";"NULL";"Initialisation de la valeur «PL.32» pour la liste «75».";2009-07-29 00:00:00;1;1
5953;1078;1;"Jelenia Gora";"PL.33";"NULL";"Initialisation de la valeur «PL.33» pour la liste «75».";2009-07-29 00:00:00;1;1
5954;1078;1;"Kalisz";"PL.34";"NULL";"Initialisation de la valeur «PL.34» pour la liste «75».";2009-07-29 00:00:00;1;1
5955;1078;1;"Katowice";"PL.35";"NULL";"Initialisation de la valeur «PL.35» pour la liste «75».";2009-07-29 00:00:00;1;1
5956;1078;1;"Kielce";"PL.36";"NULL";"Initialisation de la valeur «PL.36» pour la liste «75».";2009-07-29 00:00:00;1;1
5957;1078;1;"Konin";"PL.37";"NULL";"Initialisation de la valeur «PL.37» pour la liste «75».";2009-07-29 00:00:00;1;1
5958;1078;1;"Koszalin";"PL.38";"NULL";"Initialisation de la valeur «PL.38» pour la liste «75».";2009-07-29 00:00:00;1;1
5959;1078;1;"Krakow";"PL.39";"NULL";"Initialisation de la valeur «PL.39» pour la liste «75».";2009-07-29 00:00:00;1;1
5960;1078;1;"Krosno";"PL.40";"NULL";"Initialisation de la valeur «PL.40» pour la liste «75».";2009-07-29 00:00:00;1;1
5961;1078;1;"Legnica";"PL.41";"NULL";"Initialisation de la valeur «PL.41» pour la liste «75».";2009-07-29 00:00:00;1;1
5962;1078;1;"Leszno";"PL.42";"NULL";"Initialisation de la valeur «PL.42» pour la liste «75».";2009-07-29 00:00:00;1;1
5963;1078;1;"Lodz";"PL.43";"NULL";"Initialisation de la valeur «PL.43» pour la liste «75».";2009-07-29 00:00:00;1;1
5964;1078;1;"Lomza";"PL.44";"NULL";"Initialisation de la valeur «PL.44» pour la liste «75».";2009-07-29 00:00:00;1;1
5965;1078;1;"Lublin";"PL.45";"NULL";"Initialisation de la valeur «PL.45» pour la liste «75».";2009-07-29 00:00:00;1;1
5966;1078;1;"Nowy Sacz";"PL.46";"NULL";"Initialisation de la valeur «PL.46» pour la liste «75».";2009-07-29 00:00:00;1;1
5967;1078;1;"Olsztyn";"PL.47";"NULL";"Initialisation de la valeur «PL.47» pour la liste «75».";2009-07-29 00:00:00;1;1
5968;1078;1;"Opole";"PL.48";"NULL";"Initialisation de la valeur «PL.48» pour la liste «75».";2009-07-29 00:00:00;1;1
5969;1078;1;"Ostroleka";"PL.49";"NULL";"Initialisation de la valeur «PL.49» pour la liste «75».";2009-07-29 00:00:00;1;1
5970;1078;1;"Pita";"PL.50";"NULL";"Initialisation de la valeur «PL.50» pour la liste «75».";2009-07-29 00:00:00;1;1
5971;1078;1;"Piotrkow";"PL.51";"NULL";"Initialisation de la valeur «PL.51» pour la liste «75».";2009-07-29 00:00:00;1;1
5972;1078;1;"Plock";"PL.52";"NULL";"Initialisation de la valeur «PL.52» pour la liste «75».";2009-07-29 00:00:00;1;1
5973;1078;1;"Poznan";"PL.53";"NULL";"Initialisation de la valeur «PL.53» pour la liste «75».";2009-07-29 00:00:00;1;1
5974;1078;1;"Przemysl";"PL.54";"NULL";"Initialisation de la valeur «PL.54» pour la liste «75».";2009-07-29 00:00:00;1;1
5975;1078;1;"Radom";"PL.55";"NULL";"Initialisation de la valeur «PL.55» pour la liste «75».";2009-07-29 00:00:00;1;1
5976;1078;1;"Rzeszow";"PL.56";"NULL";"Initialisation de la valeur «PL.56» pour la liste «75».";2009-07-29 00:00:00;1;1
5977;1078;1;"Siedlce";"PL.57";"NULL";"Initialisation de la valeur «PL.57» pour la liste «75».";2009-07-29 00:00:00;1;1
5978;1078;1;"Sieradz";"PL.58";"NULL";"Initialisation de la valeur «PL.58» pour la liste «75».";2009-07-29 00:00:00;1;1
5979;1078;1;"Skierniewice";"PL.59";"NULL";"Initialisation de la valeur «PL.59» pour la liste «75».";2009-07-29 00:00:00;1;1
5980;1078;1;"Slupsk";"PL.60";"NULL";"Initialisation de la valeur «PL.60» pour la liste «75».";2009-07-29 00:00:00;1;1
5981;1078;1;"Suwalki";"PL.61";"NULL";"Initialisation de la valeur «PL.61» pour la liste «75».";2009-07-29 00:00:00;1;1
5982;1078;1;"Szczecin";"PL.62";"NULL";"Initialisation de la valeur «PL.62» pour la liste «75».";2009-07-29 00:00:00;1;1
5983;1078;1;"Tarnobrzeg";"PL.63";"NULL";"Initialisation de la valeur «PL.63» pour la liste «75».";2009-07-29 00:00:00;1;1
5984;1078;1;"Tarnow";"PL.64";"NULL";"Initialisation de la valeur «PL.64» pour la liste «75».";2009-07-29 00:00:00;1;1
5985;1078;1;"Torufi";"PL.65";"NULL";"Initialisation de la valeur «PL.65» pour la liste «75».";2009-07-29 00:00:00;1;1
5986;1078;1;"Walbrzych";"PL.66";"NULL";"Initialisation de la valeur «PL.66» pour la liste «75».";2009-07-29 00:00:00;1;1
5987;1078;1;"Warszawa";"PL.67";"NULL";"Initialisation de la valeur «PL.67» pour la liste «75».";2009-07-29 00:00:00;1;1
5988;1078;1;"Wloclawek";"PL.68";"NULL";"Initialisation de la valeur «PL.68» pour la liste «75».";2009-07-29 00:00:00;1;1
5989;1078;1;"Wroclaw";"PL.69";"NULL";"Initialisation de la valeur «PL.69» pour la liste «75».";2009-07-29 00:00:00;1;1
5990;1078;1;"Zamosc";"PL.70";"NULL";"Initialisation de la valeur «PL.70» pour la liste «75».";2009-07-29 00:00:00;1;1
5991;1078;1;"Zielona Gora";"PL.71";"NULL";"Initialisation de la valeur «PL.71» pour la liste «75».";2009-07-29 00:00:00;1;1
5992;1078;1;"Lower Silesian Voivodeship";"PL.72";"NULL";"Initialisation de la valeur «PL.72» pour la liste «75».";2009-07-29 00:00:00;1;1
5993;1078;1;"Kujawsko-Pomorskie Voivodship";"PL.73";"NULL";"Initialisation de la valeur «PL.73» pour la liste «75».";2009-07-29 00:00:00;1;1
5994;1078;1;"Łódź Voivodeship";"PL.74";"NULL";"Initialisation de la valeur «PL.74» pour la liste «75».";2009-07-29 00:00:00;1;1
5995;1078;1;"Lublin Voivodeship";"PL.75";"NULL";"Initialisation de la valeur «PL.75» pour la liste «75».";2009-07-29 00:00:00;1;1
5996;1078;1;"Lubusz Voivodship";"PL.76";"NULL";"Initialisation de la valeur «PL.76» pour la liste «75».";2009-07-29 00:00:00;1;1
5997;1078;1;"Lesser Poland Voivodeship";"PL.77";"NULL";"Initialisation de la valeur «PL.77» pour la liste «75».";2009-07-29 00:00:00;1;1
5998;1078;1;"Masovian Voivodeship";"PL.78";"NULL";"Initialisation de la valeur «PL.78» pour la liste «75».";2009-07-29 00:00:00;1;1
5999;1078;1;"Opole Voivodeship";"PL.79";"NULL";"Initialisation de la valeur «PL.79» pour la liste «75».";2009-07-29 00:00:00;1;1
6000;1078;1;"Subcarpathian Voivodeship";"PL.80";"NULL";"Initialisation de la valeur «PL.80» pour la liste «75».";2009-07-29 00:00:00;1;1
6001;1078;1;"Podlasie Voivodship";"PL.81";"NULL";"Initialisation de la valeur «PL.81» pour la liste «75».";2009-07-29 00:00:00;1;1
6002;1078;1;"Pomeranian Voivodeship";"PL.82";"NULL";"Initialisation de la valeur «PL.82» pour la liste «75».";2009-07-29 00:00:00;1;1
6003;1078;1;"Silesian Voivodeship";"PL.83";"NULL";"Initialisation de la valeur «PL.83» pour la liste «75».";2009-07-29 00:00:00;1;1
6004;1078;1;"Świętokrzyskie Voivodship";"PL.84";"NULL";"Initialisation de la valeur «PL.84» pour la liste «75».";2009-07-29 00:00:00;1;1
6005;1078;1;"Warmian-Masurian Voivodeship";"PL.85";"NULL";"Initialisation de la valeur «PL.85» pour la liste «75».";2009-07-29 00:00:00;1;1
6006;1078;1;"Greater Poland Voivodeship";"PL.86";"NULL";"Initialisation de la valeur «PL.86» pour la liste «75».";2009-07-29 00:00:00;1;1
6007;1078;1;"West Pomeranian Voivodeship";"PL.87";"NULL";"Initialisation de la valeur «PL.87» pour la liste «75».";2009-07-29 00:00:00;1;1
6008;1078;1;"Collectivité territoriale de Saint-Pierre-et-Miquelon";"PM.975";"NULL";"Initialisation de la valeur «PM.975» pour la liste «75».";2009-07-29 00:00:00;1;1
6009;1078;1;"Pitcairn Islands (general)";"PN.00";"NULL";"Initialisation de la valeur «PN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6010;1078;1;"San Juan";"PR.00";"NULL";"Initialisation de la valeur «PR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6011;1078;1;"Palestine (general)";"PS.00";"NULL";"Initialisation de la valeur «PS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6012;1078;1;"Gaza Strip";"PS.GZ";"NULL";"Initialisation de la valeur «PS.GZ» pour la liste «75».";2009-07-29 00:00:00;1;1
6013;1078;1;"West Bank";"PS.WE";"NULL";"Initialisation de la valeur «PS.WE» pour la liste «75».";2009-07-29 00:00:00;1;1
6014;1078;1;"Portugal (general)";"PT.00";"NULL";"Initialisation de la valeur «PT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6015;1078;1;"Aveiro";"PT.02";"NULL";"Initialisation de la valeur «PT.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6016;1078;1;"Beja";"PT.03";"NULL";"Initialisation de la valeur «PT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6017;1078;1;"Braga";"PT.04";"NULL";"Initialisation de la valeur «PT.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6018;1078;1;"Bragança";"PT.05";"NULL";"Initialisation de la valeur «PT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6019;1078;1;"Castelo Branco";"PT.06";"NULL";"Initialisation de la valeur «PT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6020;1078;1;"Coimbra";"PT.07";"NULL";"Initialisation de la valeur «PT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6021;1078;1;"Évora";"PT.08";"NULL";"Initialisation de la valeur «PT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6022;1078;1;"Faro";"PT.09";"NULL";"Initialisation de la valeur «PT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6023;1078;1;"Madeira";"PT.10";"NULL";"Initialisation de la valeur «PT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6024;1078;1;"Guarda";"PT.11";"NULL";"Initialisation de la valeur «PT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6025;1078;1;"Leiria";"PT.13";"NULL";"Initialisation de la valeur «PT.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6026;1078;1;"Lisbon";"PT.14";"NULL";"Initialisation de la valeur «PT.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6027;1078;1;"Portalegre";"PT.16";"NULL";"Initialisation de la valeur «PT.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6028;1078;1;"Porto";"PT.17";"NULL";"Initialisation de la valeur «PT.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6029;1078;1;"Santarém";"PT.18";"NULL";"Initialisation de la valeur «PT.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6030;1078;1;"Setúbal";"PT.19";"NULL";"Initialisation de la valeur «PT.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6031;1078;1;"Viana do Castelo";"PT.20";"NULL";"Initialisation de la valeur «PT.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6032;1078;1;"Vila Real";"PT.21";"NULL";"Initialisation de la valeur «PT.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6033;1078;1;"Viseu";"PT.22";"NULL";"Initialisation de la valeur «PT.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6034;1078;1;"Azores";"PT.23";"NULL";"Initialisation de la valeur «PT.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6035;1078;1;"State of Ngeremlengui";"PW.00";"NULL";"Initialisation de la valeur «PW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6036;1078;1;"Paraguay (general)";"PY.00";"NULL";"Initialisation de la valeur «PY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6037;1078;1;"Alto Paraná";"PY.01";"NULL";"Initialisation de la valeur «PY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6038;1078;1;"Amambay";"PY.02";"NULL";"Initialisation de la valeur «PY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6039;1078;1;"Departamento de Alto Paraguay";"PY.03";"NULL";"Initialisation de la valeur «PY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6040;1078;1;"Caaguazú";"PY.04";"NULL";"Initialisation de la valeur «PY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6041;1078;1;"Caazapá";"PY.05";"NULL";"Initialisation de la valeur «PY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6042;1078;1;"Central";"PY.06";"NULL";"Initialisation de la valeur «PY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6043;1078;1;"Concepción";"PY.07";"NULL";"Initialisation de la valeur «PY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6044;1078;1;"Cordillera";"PY.08";"NULL";"Initialisation de la valeur «PY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6045;1078;1;"Guairá";"PY.10";"NULL";"Initialisation de la valeur «PY.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6046;1078;1;"Itapúa";"PY.11";"NULL";"Initialisation de la valeur «PY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6047;1078;1;"Misiones";"PY.12";"NULL";"Initialisation de la valeur «PY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6048;1078;1;"Ñeembucú";"PY.13";"NULL";"Initialisation de la valeur «PY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6049;1078;1;"Paraguarí";"PY.15";"NULL";"Initialisation de la valeur «PY.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6050;1078;1;"Presidente Hayes";"PY.16";"NULL";"Initialisation de la valeur «PY.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6051;1078;1;"San Pedro";"PY.17";"NULL";"Initialisation de la valeur «PY.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6052;1078;1;"Canindeyú";"PY.19";"NULL";"Initialisation de la valeur «PY.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6053;1078;1;"Asunción";"PY.22";"NULL";"Initialisation de la valeur «PY.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6054;1078;1;"Asunción";"PY.23";"NULL";"Initialisation de la valeur «PY.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6055;1078;1;"Boquerón";"PY.24";"NULL";"Initialisation de la valeur «PY.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6056;1078;1;"Qatar (general)";"QA.00";"NULL";"Initialisation de la valeur «QA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6057;1078;1;"Ad Dawḩah";"QA.01";"NULL";"Initialisation de la valeur «QA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6058;1078;1;"Al Ghuwayrīyah";"QA.02";"NULL";"Initialisation de la valeur «QA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6059;1078;1;"Al Jumaylīyah";"QA.03";"NULL";"Initialisation de la valeur «QA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6060;1078;1;"Al Khawr";"QA.04";"NULL";"Initialisation de la valeur «QA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6061;1078;1;"Al Wakrah Municipality";"QA.05";"NULL";"Initialisation de la valeur «QA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6062;1078;1;"Ar Rayyān";"QA.06";"NULL";"Initialisation de la valeur «QA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6063;1078;1;"Jarayan al Batinah";"QA.07";"NULL";"Initialisation de la valeur «QA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6064;1078;1;"Madīnat ash Shamāl";"QA.08";"NULL";"Initialisation de la valeur «QA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6065;1078;1;"Umm Şalāl";"QA.09";"NULL";"Initialisation de la valeur «QA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6066;1078;1;"Al Wakrah";"QA.10";"NULL";"Initialisation de la valeur «QA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6067;1078;1;"Jarayān al Bāţinah";"QA.11";"NULL";"Initialisation de la valeur «QA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6068;1078;1;"Umm Sa‘īd";"QA.12";"NULL";"Initialisation de la valeur «QA.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6069;1078;1;"Région Réunion";"RE.RE";"NULL";"Initialisation de la valeur «RE.RE» pour la liste «75».";2009-07-29 00:00:00;1;1
6070;1078;1;"Alba";"RO.01";"NULL";"Initialisation de la valeur «RO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6071;1078;1;"Arad";"RO.02";"NULL";"Initialisation de la valeur «RO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6072;1078;1;"Argeş";"RO.03";"NULL";"Initialisation de la valeur «RO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6073;1078;1;"Bacău";"RO.04";"NULL";"Initialisation de la valeur «RO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6074;1078;1;"Bihor";"RO.05";"NULL";"Initialisation de la valeur «RO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6075;1078;1;"Bistriţa-Năsăud";"RO.06";"NULL";"Initialisation de la valeur «RO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6076;1078;1;"Botoşani";"RO.07";"NULL";"Initialisation de la valeur «RO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6077;1078;1;"Brăila";"RO.08";"NULL";"Initialisation de la valeur «RO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6078;1078;1;"Braşov";"RO.09";"NULL";"Initialisation de la valeur «RO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6079;1078;1;"Bucureşti";"RO.10";"NULL";"Initialisation de la valeur «RO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6080;1078;1;"Buzău";"RO.11";"NULL";"Initialisation de la valeur «RO.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6081;1078;1;"Caraş-Severin";"RO.12";"NULL";"Initialisation de la valeur «RO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6082;1078;1;"Cluj";"RO.13";"NULL";"Initialisation de la valeur «RO.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6083;1078;1;"Constanţa";"RO.14";"NULL";"Initialisation de la valeur «RO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6084;1078;1;"Covasna";"RO.15";"NULL";"Initialisation de la valeur «RO.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6085;1078;1;"Dâmboviţa";"RO.16";"NULL";"Initialisation de la valeur «RO.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6086;1078;1;"Dolj";"RO.17";"NULL";"Initialisation de la valeur «RO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6087;1078;1;"Galaţi";"RO.18";"NULL";"Initialisation de la valeur «RO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6088;1078;1;"Gorj";"RO.19";"NULL";"Initialisation de la valeur «RO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6089;1078;1;"Harghita";"RO.20";"NULL";"Initialisation de la valeur «RO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6090;1078;1;"Hunedoara";"RO.21";"NULL";"Initialisation de la valeur «RO.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6091;1078;1;"Ialomiţa";"RO.22";"NULL";"Initialisation de la valeur «RO.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6092;1078;1;"Iaşi";"RO.23";"NULL";"Initialisation de la valeur «RO.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6093;1078;1;"Maramureş";"RO.25";"NULL";"Initialisation de la valeur «RO.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6094;1078;1;"Mehedinţi";"RO.26";"NULL";"Initialisation de la valeur «RO.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6095;1078;1;"Mureş";"RO.27";"NULL";"Initialisation de la valeur «RO.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6096;1078;1;"Neamţ";"RO.28";"NULL";"Initialisation de la valeur «RO.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6097;1078;1;"Olt";"RO.29";"NULL";"Initialisation de la valeur «RO.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6098;1078;1;"Prahova";"RO.30";"NULL";"Initialisation de la valeur «RO.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6099;1078;1;"Sălaj";"RO.31";"NULL";"Initialisation de la valeur «RO.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6100;1078;1;"Satu Mare";"RO.32";"NULL";"Initialisation de la valeur «RO.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6101;1078;1;"Sibiu";"RO.33";"NULL";"Initialisation de la valeur «RO.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6102;1078;1;"Suceava";"RO.34";"NULL";"Initialisation de la valeur «RO.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6103;1078;1;"Teleorman";"RO.35";"NULL";"Initialisation de la valeur «RO.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6104;1078;1;"Timiş";"RO.36";"NULL";"Initialisation de la valeur «RO.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6105;1078;1;"Tulcea";"RO.37";"NULL";"Initialisation de la valeur «RO.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6106;1078;1;"Vaslui";"RO.38";"NULL";"Initialisation de la valeur «RO.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6107;1078;1;"Vâlcea";"RO.39";"NULL";"Initialisation de la valeur «RO.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6108;1078;1;"Judeţul Vrancea";"RO.40";"NULL";"Initialisation de la valeur «RO.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6109;1078;1;"Călăraşi";"RO.41";"NULL";"Initialisation de la valeur «RO.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6110;1078;1;"Giurgiu";"RO.42";"NULL";"Initialisation de la valeur «RO.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6111;1078;1;"Ilfov";"RO.43";"NULL";"Initialisation de la valeur «RO.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6112;1078;1;"Serbia (general)";"RS.00";"NULL";"Initialisation de la valeur «RS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6113;1078;1;"Kosovo";"RS.01";"NULL";"Initialisation de la valeur «RS.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6114;1078;1;"Autonomna Pokrajina Vojvodina";"RS.02";"NULL";"Initialisation de la valeur «RS.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6115;1078;1;"Russia (general)";"RU.00";"NULL";"Initialisation de la valeur «RU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6116;1078;1;"Adygeya";"RU.01";"NULL";"Initialisation de la valeur «RU.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6117;1078;1;"Aginskiy Buryatskiy Avtonomnyy Okrug";"RU.02";"NULL";"Initialisation de la valeur «RU.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6118;1078;1;"Altay";"RU.03";"NULL";"Initialisation de la valeur «RU.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6119;1078;1;"Altayskiy Kray";"RU.04";"NULL";"Initialisation de la valeur «RU.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6120;1078;1;"Amur";"RU.05";"NULL";"Initialisation de la valeur «RU.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6121;1078;1;"Arkhangelskaya oblast";"RU.06";"NULL";"Initialisation de la valeur «RU.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6122;1078;1;"Astrakhan";"RU.07";"NULL";"Initialisation de la valeur «RU.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6123;1078;1;"Bashkortostan";"RU.08";"NULL";"Initialisation de la valeur «RU.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6124;1078;1;"Belgorod";"RU.09";"NULL";"Initialisation de la valeur «RU.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6125;1078;1;"Brjansk";"RU.10";"NULL";"Initialisation de la valeur «RU.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6126;1078;1;"Buryatiya";"RU.11";"NULL";"Initialisation de la valeur «RU.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6127;1078;1;"Chechnya";"RU.12";"NULL";"Initialisation de la valeur «RU.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6128;1078;1;"Tsjeljabinsk";"RU.13";"NULL";"Initialisation de la valeur «RU.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6129;1078;1;"Tsjita";"RU.14";"NULL";"Initialisation de la valeur «RU.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6130;1078;1;"Chukotskiy Avtonomnyy Okrug";"RU.15";"NULL";"Initialisation de la valeur «RU.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6131;1078;1;"Chuvashia";"RU.16";"NULL";"Initialisation de la valeur «RU.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6132;1078;1;"Dagestan";"RU.17";"NULL";"Initialisation de la valeur «RU.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6133;1078;1;"Evenkiyskiy Avtonomnyy Okrug";"RU.18";"NULL";"Initialisation de la valeur «RU.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6134;1078;1;"Ingushetiya";"RU.19";"NULL";"Initialisation de la valeur «RU.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6135;1078;1;"Irkutsk";"RU.20";"NULL";"Initialisation de la valeur «RU.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6136;1078;1;"Ivanovo";"RU.21";"NULL";"Initialisation de la valeur «RU.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6137;1078;1;"Kabardino-Balkariya";"RU.22";"NULL";"Initialisation de la valeur «RU.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6138;1078;1;"Kaliningrad";"RU.23";"NULL";"Initialisation de la valeur «RU.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6139;1078;1;"Kalmykiya";"RU.24";"NULL";"Initialisation de la valeur «RU.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6140;1078;1;"Kaluga";"RU.25";"NULL";"Initialisation de la valeur «RU.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6141;1078;1;"Kamtsjatka";"RU.26";"NULL";"Initialisation de la valeur «RU.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6142;1078;1;"Karachayevo-Cherkesiya";"RU.27";"NULL";"Initialisation de la valeur «RU.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6143;1078;1;"Kareliya";"RU.28";"NULL";"Initialisation de la valeur «RU.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6144;1078;1;"Kemerovo";"RU.29";"NULL";"Initialisation de la valeur «RU.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6145;1078;1;"Khabarovsk Krai";"RU.30";"NULL";"Initialisation de la valeur «RU.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6146;1078;1;"Khakasiya";"RU.31";"NULL";"Initialisation de la valeur «RU.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6147;1078;1;"Khanty-Mansiyskiy Avtonomnyy Okrug";"RU.32";"NULL";"Initialisation de la valeur «RU.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6148;1078;1;"Kirov";"RU.33";"NULL";"Initialisation de la valeur «RU.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6149;1078;1;"Komi";"RU.34";"NULL";"Initialisation de la valeur «RU.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6150;1078;1;"Koryakskiy Avtonomnyy Okrug";"RU.36";"NULL";"Initialisation de la valeur «RU.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6151;1078;1;"Kostroma";"RU.37";"NULL";"Initialisation de la valeur «RU.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6152;1078;1;"Krasnodarskiy Kray";"RU.38";"NULL";"Initialisation de la valeur «RU.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6153;1078;1;"Krasnoyarskiy Kray";"RU.39";"NULL";"Initialisation de la valeur «RU.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6154;1078;1;"Kurgan";"RU.40";"NULL";"Initialisation de la valeur «RU.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6155;1078;1;"Kursk";"RU.41";"NULL";"Initialisation de la valeur «RU.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6156;1078;1;"Leningradskaya Oblast'";"RU.42";"NULL";"Initialisation de la valeur «RU.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6157;1078;1;"Lipetsk";"RU.43";"NULL";"Initialisation de la valeur «RU.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6158;1078;1;"Magadan";"RU.44";"NULL";"Initialisation de la valeur «RU.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6159;1078;1;"Mariy-El";"RU.45";"NULL";"Initialisation de la valeur «RU.45» pour la liste «75».";2009-07-29 00:00:00;1;1
6160;1078;1;"Mordoviya";"RU.46";"NULL";"Initialisation de la valeur «RU.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6161;1078;1;"Moskovskaya Oblast'";"RU.47";"NULL";"Initialisation de la valeur «RU.47» pour la liste «75».";2009-07-29 00:00:00;1;1
6162;1078;1;"Moscow";"RU.48";"NULL";"Initialisation de la valeur «RU.48» pour la liste «75».";2009-07-29 00:00:00;1;1
6163;1078;1;"Murmansk Oblast";"RU.49";"NULL";"Initialisation de la valeur «RU.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6164;1078;1;"Nenetskiy Avtonomnyy Okrug";"RU.50";"NULL";"Initialisation de la valeur «RU.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6165;1078;1;"Nizjnij Novgorod";"RU.51";"NULL";"Initialisation de la valeur «RU.51» pour la liste «75».";2009-07-29 00:00:00;1;1
6166;1078;1;"Novgorod";"RU.52";"NULL";"Initialisation de la valeur «RU.52» pour la liste «75».";2009-07-29 00:00:00;1;1
6167;1078;1;"Novosibirsk";"RU.53";"NULL";"Initialisation de la valeur «RU.53» pour la liste «75».";2009-07-29 00:00:00;1;1
6168;1078;1;"Omsk";"RU.54";"NULL";"Initialisation de la valeur «RU.54» pour la liste «75».";2009-07-29 00:00:00;1;1
6169;1078;1;"Orenburg";"RU.55";"NULL";"Initialisation de la valeur «RU.55» pour la liste «75».";2009-07-29 00:00:00;1;1
6170;1078;1;"Orjol";"RU.56";"NULL";"Initialisation de la valeur «RU.56» pour la liste «75».";2009-07-29 00:00:00;1;1
6171;1078;1;"Penza";"RU.57";"NULL";"Initialisation de la valeur «RU.57» pour la liste «75».";2009-07-29 00:00:00;1;1
6172;1078;1;"Primorskiy Kray";"RU.59";"NULL";"Initialisation de la valeur «RU.59» pour la liste «75».";2009-07-29 00:00:00;1;1
6173;1078;1;"Pskov";"RU.60";"NULL";"Initialisation de la valeur «RU.60» pour la liste «75».";2009-07-29 00:00:00;1;1
6174;1078;1;"Rostov";"RU.61";"NULL";"Initialisation de la valeur «RU.61» pour la liste «75».";2009-07-29 00:00:00;1;1
6175;1078;1;"Rjazan";"RU.62";"NULL";"Initialisation de la valeur «RU.62» pour la liste «75».";2009-07-29 00:00:00;1;1
6176;1078;1;"Sakha";"RU.63";"NULL";"Initialisation de la valeur «RU.63» pour la liste «75».";2009-07-29 00:00:00;1;1
6177;1078;1;"Sakhalin";"RU.64";"NULL";"Initialisation de la valeur «RU.64» pour la liste «75».";2009-07-29 00:00:00;1;1
6178;1078;1;"Samara";"RU.65";"NULL";"Initialisation de la valeur «RU.65» pour la liste «75».";2009-07-29 00:00:00;1;1
6179;1078;1;"Sankt-Peterburg";"RU.66";"NULL";"Initialisation de la valeur «RU.66» pour la liste «75».";2009-07-29 00:00:00;1;1
6180;1078;1;"Saratov";"RU.67";"NULL";"Initialisation de la valeur «RU.67» pour la liste «75».";2009-07-29 00:00:00;1;1
6181;1078;1;"Severnaya Osetiya-Alaniya";"RU.68";"NULL";"Initialisation de la valeur «RU.68» pour la liste «75».";2009-07-29 00:00:00;1;1
6182;1078;1;"Smolensk";"RU.69";"NULL";"Initialisation de la valeur «RU.69» pour la liste «75».";2009-07-29 00:00:00;1;1
6183;1078;1;"Stavropol'skiy Kray";"RU.70";"NULL";"Initialisation de la valeur «RU.70» pour la liste «75».";2009-07-29 00:00:00;1;1
6184;1078;1;"Sverdlovsk";"RU.71";"NULL";"Initialisation de la valeur «RU.71» pour la liste «75».";2009-07-29 00:00:00;1;1
6185;1078;1;"Tambov";"RU.72";"NULL";"Initialisation de la valeur «RU.72» pour la liste «75».";2009-07-29 00:00:00;1;1
6186;1078;1;"Tatarstan";"RU.73";"NULL";"Initialisation de la valeur «RU.73» pour la liste «75».";2009-07-29 00:00:00;1;1
6187;1078;1;"Taymyrskiy (Dolgano-Nenetskiy) Avtonomnyy Okrug";"RU.74";"NULL";"Initialisation de la valeur «RU.74» pour la liste «75».";2009-07-29 00:00:00;1;1
6188;1078;1;"Tomsk";"RU.75";"NULL";"Initialisation de la valeur «RU.75» pour la liste «75».";2009-07-29 00:00:00;1;1
6189;1078;1;"Tula";"RU.76";"NULL";"Initialisation de la valeur «RU.76» pour la liste «75».";2009-07-29 00:00:00;1;1
6190;1078;1;"Tverskaya Oblast’";"RU.77";"NULL";"Initialisation de la valeur «RU.77» pour la liste «75».";2009-07-29 00:00:00;1;1
6191;1078;1;"Tjumen";"RU.78";"NULL";"Initialisation de la valeur «RU.78» pour la liste «75».";2009-07-29 00:00:00;1;1
6192;1078;1;"Tyva";"RU.79";"NULL";"Initialisation de la valeur «RU.79» pour la liste «75».";2009-07-29 00:00:00;1;1
6193;1078;1;"Udmurtiya";"RU.80";"NULL";"Initialisation de la valeur «RU.80» pour la liste «75».";2009-07-29 00:00:00;1;1
6194;1078;1;"Uljanovsk";"RU.81";"NULL";"Initialisation de la valeur «RU.81» pour la liste «75».";2009-07-29 00:00:00;1;1
6195;1078;1;"Ust'-Ordynskiy Buryatskiy Avtonomnyy Okrug";"RU.82";"NULL";"Initialisation de la valeur «RU.82» pour la liste «75».";2009-07-29 00:00:00;1;1
6196;1078;1;"Vladimir";"RU.83";"NULL";"Initialisation de la valeur «RU.83» pour la liste «75».";2009-07-29 00:00:00;1;1
6197;1078;1;"Volgograd";"RU.84";"NULL";"Initialisation de la valeur «RU.84» pour la liste «75».";2009-07-29 00:00:00;1;1
6198;1078;1;"Vologda";"RU.85";"NULL";"Initialisation de la valeur «RU.85» pour la liste «75».";2009-07-29 00:00:00;1;1
6199;1078;1;"Voronezj";"RU.86";"NULL";"Initialisation de la valeur «RU.86» pour la liste «75».";2009-07-29 00:00:00;1;1
6200;1078;1;"Yamalo-Nenetskiy Avtonomnyy Okrug";"RU.87";"NULL";"Initialisation de la valeur «RU.87» pour la liste «75».";2009-07-29 00:00:00;1;1
6201;1078;1;"Jaroslavl";"RU.88";"NULL";"Initialisation de la valeur «RU.88» pour la liste «75».";2009-07-29 00:00:00;1;1
6202;1078;1;"Jewish Autonomous Oblast";"RU.89";"NULL";"Initialisation de la valeur «RU.89» pour la liste «75».";2009-07-29 00:00:00;1;1
6203;1078;1;"Perm";"RU.90";"NULL";"Initialisation de la valeur «RU.90» pour la liste «75».";2009-07-29 00:00:00;1;1
6204;1078;1;"RSJA";"RU.JA";"NULL";"Initialisation de la valeur «RU.JA» pour la liste «75».";2009-07-29 00:00:00;1;1
6205;1078;1;"Rwanda (general)";"RW.00";"NULL";"Initialisation de la valeur «RW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6206;1078;1;"Butare";"RW.01";"NULL";"Initialisation de la valeur «RW.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6207;1078;1;"Byumba";"RW.02";"NULL";"Initialisation de la valeur «RW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6208;1078;1;"Cyangugu";"RW.03";"NULL";"Initialisation de la valeur «RW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6209;1078;1;"Gikongoro";"RW.04";"NULL";"Initialisation de la valeur «RW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6210;1078;1;"Gisenyi";"RW.05";"NULL";"Initialisation de la valeur «RW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6211;1078;1;"Gitarama";"RW.06";"NULL";"Initialisation de la valeur «RW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6212;1078;1;"Kibungo";"RW.07";"NULL";"Initialisation de la valeur «RW.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6213;1078;1;"Kibuye";"RW.08";"NULL";"Initialisation de la valeur «RW.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6214;1078;1;"Kigali";"RW.09";"NULL";"Initialisation de la valeur «RW.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6215;1078;1;"Ruhengeri";"RW.10";"NULL";"Initialisation de la valeur «RW.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6216;1078;1;"Eastern Province";"RW.11";"NULL";"Initialisation de la valeur «RW.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6217;1078;1;"Kigali City";"RW.12";"NULL";"Initialisation de la valeur «RW.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6218;1078;1;"Northern Province";"RW.13";"NULL";"Initialisation de la valeur «RW.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6219;1078;1;"Western Province";"RW.14";"NULL";"Initialisation de la valeur «RW.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6220;1078;1;"Southern Province";"RW.15";"NULL";"Initialisation de la valeur «RW.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6221;1078;1;"Saudi Arabia (general)";"SA.00";"NULL";"Initialisation de la valeur «SA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6222;1078;1;"Al Bāḩah";"SA.02";"NULL";"Initialisation de la valeur «SA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6223;1078;1;"Al Madīnah";"SA.05";"NULL";"Initialisation de la valeur «SA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6224;1078;1;"Ash Sharqīyah";"SA.06";"NULL";"Initialisation de la valeur «SA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6225;1078;1;"Al Qaşīm";"SA.08";"NULL";"Initialisation de la valeur «SA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6226;1078;1;"Ar Riyāḑ";"SA.10";"NULL";"Initialisation de la valeur «SA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6227;1078;1;"‘Asīr";"SA.11";"NULL";"Initialisation de la valeur «SA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6228;1078;1;"Ḩāʼil";"SA.13";"NULL";"Initialisation de la valeur «SA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6229;1078;1;"Makkah";"SA.14";"NULL";"Initialisation de la valeur «SA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6230;1078;1;"Northern Borders Region";"SA.15";"NULL";"Initialisation de la valeur «SA.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6231;1078;1;"Najrān";"SA.16";"NULL";"Initialisation de la valeur «SA.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6232;1078;1;"Jīzān";"SA.17";"NULL";"Initialisation de la valeur «SA.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6233;1078;1;"Tabūk";"SA.19";"NULL";"Initialisation de la valeur «SA.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6234;1078;1;"Al Jawf";"SA.20";"NULL";"Initialisation de la valeur «SA.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6235;1078;1;"Makira Province";"SB.00";"NULL";"Initialisation de la valeur «SB.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6236;1078;1;"Malaita";"SB.03";"NULL";"Initialisation de la valeur «SB.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6237;1078;1;"Western";"SB.04";"NULL";"Initialisation de la valeur «SB.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6238;1078;1;"Central";"SB.05";"NULL";"Initialisation de la valeur «SB.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6239;1078;1;"Guadalcanal";"SB.06";"NULL";"Initialisation de la valeur «SB.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6240;1078;1;"Isabel";"SB.07";"NULL";"Initialisation de la valeur «SB.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6241;1078;1;"Makira";"SB.08";"NULL";"Initialisation de la valeur «SB.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6242;1078;1;"Temotu";"SB.09";"NULL";"Initialisation de la valeur «SB.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6243;1078;1;"Choiseul";"SB.11";"NULL";"Initialisation de la valeur «SB.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6244;1078;1;"Rennell and Bellona";"SB.12";"NULL";"Initialisation de la valeur «SB.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6245;1078;1;"Seychelles (general)";"SC.00";"NULL";"Initialisation de la valeur «SC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6246;1078;1;"Anse aux Pins";"SC.01";"NULL";"Initialisation de la valeur «SC.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6247;1078;1;"Anse Boileau";"SC.02";"NULL";"Initialisation de la valeur «SC.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6248;1078;1;"Anse Etoile";"SC.03";"NULL";"Initialisation de la valeur «SC.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6249;1078;1;"Anse Louis";"SC.04";"NULL";"Initialisation de la valeur «SC.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6250;1078;1;"Anse Royale";"SC.05";"NULL";"Initialisation de la valeur «SC.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6251;1078;1;"Baie Lazare";"SC.06";"NULL";"Initialisation de la valeur «SC.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6252;1078;1;"Baie Sainte Anne";"SC.07";"NULL";"Initialisation de la valeur «SC.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6253;1078;1;"Beau Vallon";"SC.08";"NULL";"Initialisation de la valeur «SC.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6254;1078;1;"Bel Air";"SC.09";"NULL";"Initialisation de la valeur «SC.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6255;1078;1;"Bel Ombre";"SC.10";"NULL";"Initialisation de la valeur «SC.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6256;1078;1;"Cascade";"SC.11";"NULL";"Initialisation de la valeur «SC.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6257;1078;1;"Glacis";"SC.12";"NULL";"Initialisation de la valeur «SC.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6258;1078;1;"Saint Thomas Middle Island Parish";"SC.13";"NULL";"Initialisation de la valeur «SC.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6259;1078;1;"Grand Anse Praslin";"SC.14";"NULL";"Initialisation de la valeur «SC.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6260;1078;1;"Trinity Palmetto Point Parish";"SC.15";"NULL";"Initialisation de la valeur «SC.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6261;1078;1;"La Riviere Anglaise";"SC.16";"NULL";"Initialisation de la valeur «SC.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6262;1078;1;"Mont Buxton";"SC.17";"NULL";"Initialisation de la valeur «SC.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6263;1078;1;"Mont Fleuri";"SC.18";"NULL";"Initialisation de la valeur «SC.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6264;1078;1;"Plaisance";"SC.19";"NULL";"Initialisation de la valeur «SC.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6265;1078;1;"Pointe Larue";"SC.20";"NULL";"Initialisation de la valeur «SC.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6266;1078;1;"Port Glaud";"SC.21";"NULL";"Initialisation de la valeur «SC.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6267;1078;1;"Saint Louis";"SC.22";"NULL";"Initialisation de la valeur «SC.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6268;1078;1;"Takamaka";"SC.23";"NULL";"Initialisation de la valeur «SC.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6269;1078;1;"Anse aux Pins";"SC.24";"NULL";"Initialisation de la valeur «SC.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6270;1078;1;"Inner Islands";"SC.25";"NULL";"Initialisation de la valeur «SC.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6271;1078;1;"English River";"SC.26";"NULL";"Initialisation de la valeur «SC.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6272;1078;1;"Port Glaud";"SC.27";"NULL";"Initialisation de la valeur «SC.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6273;1078;1;"Baie Lazare";"SC.28";"NULL";"Initialisation de la valeur «SC.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6274;1078;1;"Beau Vallon";"SC.29";"NULL";"Initialisation de la valeur «SC.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6275;1078;1;"Bel Ombre";"SC.30";"NULL";"Initialisation de la valeur «SC.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6276;1078;1;"Glacis";"SC.31";"NULL";"Initialisation de la valeur «SC.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6277;1078;1;"Grand Anse Mahe";"SC.32";"NULL";"Initialisation de la valeur «SC.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6278;1078;1;"Grand Anse Praslin";"SC.33";"NULL";"Initialisation de la valeur «SC.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6279;1078;1;"Inner Islands";"SC.34";"NULL";"Initialisation de la valeur «SC.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6280;1078;1;"English River";"SC.35";"NULL";"Initialisation de la valeur «SC.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6281;1078;1;"Mont Fleuri";"SC.36";"NULL";"Initialisation de la valeur «SC.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6282;1078;1;"Plaisance";"SC.37";"NULL";"Initialisation de la valeur «SC.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6283;1078;1;"Pointe Larue";"SC.38";"NULL";"Initialisation de la valeur «SC.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6284;1078;1;"Port Glaud";"SC.39";"NULL";"Initialisation de la valeur «SC.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6285;1078;1;"Takamaka";"SC.40";"NULL";"Initialisation de la valeur «SC.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6286;1078;1;"Au Cap";"SC.41";"NULL";"Initialisation de la valeur «SC.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6287;1078;1;"Les Mamelles";"SC.42";"NULL";"Initialisation de la valeur «SC.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6288;1078;1;"Roche Caiman";"SC.43";"NULL";"Initialisation de la valeur «SC.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6289;1078;1;"Sudan (general)";"SD.00";"NULL";"Initialisation de la valeur «SD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6290;1078;1;"(SU26)";"SD.26";"NULL";"Initialisation de la valeur «SD.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6291;1078;1;"Al Wilāyah al Wusţá";"SD.27";"NULL";"Initialisation de la valeur «SD.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6292;1078;1;"Al Wilāyah al Istiwā'īyah";"SD.28";"NULL";"Initialisation de la valeur «SD.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6293;1078;1;"Khartoum";"SD.29";"NULL";"Initialisation de la valeur «SD.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6294;1078;1;"Ash Shamaliyah";"SD.30";"NULL";"Initialisation de la valeur «SD.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6295;1078;1;"Al Wilāyah ash Sharqīyah";"SD.31";"NULL";"Initialisation de la valeur «SD.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6296;1078;1;"Ba?r al Ghazal Wilayat";"SD.32";"NULL";"Initialisation de la valeur «SD.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6297;1078;1;"Darfur Wilayat";"SD.33";"NULL";"Initialisation de la valeur «SD.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6298;1078;1;"Kurdufan Wilayat";"SD.34";"NULL";"Initialisation de la valeur «SD.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6299;1078;1;"Upper Nile";"SD.35";"NULL";"Initialisation de la valeur «SD.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6300;1078;1;"Red Sea";"SD.36";"NULL";"Initialisation de la valeur «SD.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6301;1078;1;"Lakes";"SD.37";"NULL";"Initialisation de la valeur «SD.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6302;1078;1;"Al Jazirah";"SD.38";"NULL";"Initialisation de la valeur «SD.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6303;1078;1;"Al Qadarif";"SD.39";"NULL";"Initialisation de la valeur «SD.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6304;1078;1;"Unity";"SD.40";"NULL";"Initialisation de la valeur «SD.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6305;1078;1;"White Nile";"SD.41";"NULL";"Initialisation de la valeur «SD.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6306;1078;1;"Blue Nile";"SD.42";"NULL";"Initialisation de la valeur «SD.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6307;1078;1;"Northern";"SD.43";"NULL";"Initialisation de la valeur «SD.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6308;1078;1;"Central Equatoria";"SD.44";"NULL";"Initialisation de la valeur «SD.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6309;1078;1;"Gharb al Istiwāʼīyah";"SD.45";"NULL";"Initialisation de la valeur «SD.45» pour la liste «75».";2009-07-29 00:00:00;1;1
6310;1078;1;"Western Bahr al Ghazal";"SD.46";"NULL";"Initialisation de la valeur «SD.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6311;1078;1;"Gharb Dārfūr";"SD.47";"NULL";"Initialisation de la valeur «SD.47» pour la liste «75».";2009-07-29 00:00:00;1;1
6312;1078;1;"Gharb Kurdufān";"SD.48";"NULL";"Initialisation de la valeur «SD.48» pour la liste «75».";2009-07-29 00:00:00;1;1
6313;1078;1;"Janūb Dārfūr";"SD.49";"NULL";"Initialisation de la valeur «SD.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6314;1078;1;"Janūb Kurdufān";"SD.50";"NULL";"Initialisation de la valeur «SD.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6315;1078;1;"Junqalī";"SD.51";"NULL";"Initialisation de la valeur «SD.51» pour la liste «75».";2009-07-29 00:00:00;1;1
6316;1078;1;"Kassalā";"SD.52";"NULL";"Initialisation de la valeur «SD.52» pour la liste «75».";2009-07-29 00:00:00;1;1
6317;1078;1;"Nahr an Nīl";"SD.53";"NULL";"Initialisation de la valeur «SD.53» pour la liste «75».";2009-07-29 00:00:00;1;1
6318;1078;1;"Shamāl Baḩr al Ghazāl";"SD.54";"NULL";"Initialisation de la valeur «SD.54» pour la liste «75».";2009-07-29 00:00:00;1;1
6319;1078;1;"Shamāl Dārfūr";"SD.55";"NULL";"Initialisation de la valeur «SD.55» pour la liste «75».";2009-07-29 00:00:00;1;1
6320;1078;1;"Shamāl Kurdufān";"SD.56";"NULL";"Initialisation de la valeur «SD.56» pour la liste «75».";2009-07-29 00:00:00;1;1
6321;1078;1;"Eastern Equatoria";"SD.57";"NULL";"Initialisation de la valeur «SD.57» pour la liste «75».";2009-07-29 00:00:00;1;1
6322;1078;1;"Sinnār";"SD.58";"NULL";"Initialisation de la valeur «SD.58» pour la liste «75».";2009-07-29 00:00:00;1;1
6323;1078;1;"Warab";"SD.59";"NULL";"Initialisation de la valeur «SD.59» pour la liste «75».";2009-07-29 00:00:00;1;1
6324;1078;1;"Sweden (general)";"SE.00";"NULL";"Initialisation de la valeur «SE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6325;1078;1;"Alvsborg ";"SE.01";"NULL";"Initialisation de la valeur «SE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6326;1078;1;"Blekinge County";"SE.02";"NULL";"Initialisation de la valeur «SE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6327;1078;1;"Gävleborg County";"SE.03";"NULL";"Initialisation de la valeur «SE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6328;1078;1;"Goteborgs Och Bohus";"SE.04";"NULL";"Initialisation de la valeur «SE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6329;1078;1;"Gotland County";"SE.05";"NULL";"Initialisation de la valeur «SE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6330;1078;1;"Halland County";"SE.06";"NULL";"Initialisation de la valeur «SE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6331;1078;1;"Jämtland County";"SE.07";"NULL";"Initialisation de la valeur «SE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6332;1078;1;"Jönköping County";"SE.08";"NULL";"Initialisation de la valeur «SE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6333;1078;1;"Kalmar County";"SE.09";"NULL";"Initialisation de la valeur «SE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6334;1078;1;"Dalarna County";"SE.10";"NULL";"Initialisation de la valeur «SE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6335;1078;1;"Kristianstad";"SE.11";"NULL";"Initialisation de la valeur «SE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6336;1078;1;"Kronoberg County";"SE.12";"NULL";"Initialisation de la valeur «SE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6337;1078;1;"Malmohus";"SE.13";"NULL";"Initialisation de la valeur «SE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6338;1078;1;"Norrbotten County";"SE.14";"NULL";"Initialisation de la valeur «SE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6339;1078;1;"Örebro County";"SE.15";"NULL";"Initialisation de la valeur «SE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6340;1078;1;"Östergötland County";"SE.16";"NULL";"Initialisation de la valeur «SE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6341;1078;1;"Skaraborg";"SE.17";"NULL";"Initialisation de la valeur «SE.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6342;1078;1;"Södermanland County";"SE.18";"NULL";"Initialisation de la valeur «SE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6343;1078;1;"Uppsala County";"SE.21";"NULL";"Initialisation de la valeur «SE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6344;1078;1;"Värmland County";"SE.22";"NULL";"Initialisation de la valeur «SE.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6345;1078;1;"Västerbotten County";"SE.23";"NULL";"Initialisation de la valeur «SE.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6346;1078;1;"Västernorrland County";"SE.24";"NULL";"Initialisation de la valeur «SE.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6347;1078;1;"Västmanland County";"SE.25";"NULL";"Initialisation de la valeur «SE.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6348;1078;1;"Stockholm County";"SE.26";"NULL";"Initialisation de la valeur «SE.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6349;1078;1;"Skåne County";"SE.27";"NULL";"Initialisation de la valeur «SE.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6350;1078;1;"Västra Götaland County";"SE.28";"NULL";"Initialisation de la valeur «SE.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6351;1078;1;"Singapore (general)";"SG.00";"NULL";"Initialisation de la valeur «SG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6352;1078;1;"Saint Helena (general)";"SH.00";"NULL";"Initialisation de la valeur «SH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6353;1078;1;"Ascension";"SH.01";"NULL";"Initialisation de la valeur «SH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6354;1078;1;"Saint Helena";"SH.02";"NULL";"Initialisation de la valeur «SH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6355;1078;1;"Tristan da Cunha";"SH.03";"NULL";"Initialisation de la valeur «SH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6356;1078;1;"Bled";"SI.03";"NULL";"Initialisation de la valeur «SI.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6357;1078;1;"Bohinj";"SI.04";"NULL";"Initialisation de la valeur «SI.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6358;1078;1;"Borovnica";"SI.05";"NULL";"Initialisation de la valeur «SI.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6359;1078;1;"Bovec";"SI.06";"NULL";"Initialisation de la valeur «SI.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6360;1078;1;"Brda";"SI.07";"NULL";"Initialisation de la valeur «SI.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6361;1078;1;"Brežice";"SI.08";"NULL";"Initialisation de la valeur «SI.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6362;1078;1;"Brezovica";"SI.09";"NULL";"Initialisation de la valeur «SI.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6363;1078;1;"Celje";"SI.11";"NULL";"Initialisation de la valeur «SI.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6364;1078;1;"Občina Cerklje na Gorenjskem";"SI.12";"NULL";"Initialisation de la valeur «SI.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6365;1078;1;"Cerknica";"SI.13";"NULL";"Initialisation de la valeur «SI.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6366;1078;1;"Cerkno";"SI.14";"NULL";"Initialisation de la valeur «SI.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6367;1078;1;"Črenšovci";"SI.15";"NULL";"Initialisation de la valeur «SI.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6368;1078;1;"Črna na Koroškem";"SI.16";"NULL";"Initialisation de la valeur «SI.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6369;1078;1;"Črnomelj";"SI.17";"NULL";"Initialisation de la valeur «SI.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6370;1078;1;"Divača";"SI.19";"NULL";"Initialisation de la valeur «SI.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6371;1078;1;"Dobrepolje";"SI.20";"NULL";"Initialisation de la valeur «SI.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6372;1078;1;"Občina Dol pri Ljubljani";"SI.22";"NULL";"Initialisation de la valeur «SI.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6373;1078;1;"Dornava";"SI.24";"NULL";"Initialisation de la valeur «SI.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6374;1078;1;"Dravograd";"SI.25";"NULL";"Initialisation de la valeur «SI.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6375;1078;1;"Duplek";"SI.26";"NULL";"Initialisation de la valeur «SI.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6376;1078;1;"Gorenja Vas-Poljane";"SI.27";"NULL";"Initialisation de la valeur «SI.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6377;1078;1;"Gorišnica";"SI.28";"NULL";"Initialisation de la valeur «SI.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6378;1078;1;"Gornja Radgona";"SI.29";"NULL";"Initialisation de la valeur «SI.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6379;1078;1;"Gornji Grad";"SI.30";"NULL";"Initialisation de la valeur «SI.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6380;1078;1;"Gornji Petrovci";"SI.31";"NULL";"Initialisation de la valeur «SI.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6381;1078;1;"Grosuplje";"SI.32";"NULL";"Initialisation de la valeur «SI.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6382;1078;1;"Hrastnik";"SI.34";"NULL";"Initialisation de la valeur «SI.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6383;1078;1;"Hrpelje-Kozina";"SI.35";"NULL";"Initialisation de la valeur «SI.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6384;1078;1;"Idrija";"SI.36";"NULL";"Initialisation de la valeur «SI.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6385;1078;1;"Ig";"SI.37";"NULL";"Initialisation de la valeur «SI.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6386;1078;1;"Ilirska Bistrica";"SI.38";"NULL";"Initialisation de la valeur «SI.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6387;1078;1;"Ivančna Gorica";"SI.39";"NULL";"Initialisation de la valeur «SI.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6388;1078;1;"Izola-Isola";"SI.40";"NULL";"Initialisation de la valeur «SI.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6389;1078;1;"Juršinci";"SI.42";"NULL";"Initialisation de la valeur «SI.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6390;1078;1;"Kanal";"SI.44";"NULL";"Initialisation de la valeur «SI.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6391;1078;1;"Kidričevo";"SI.45";"NULL";"Initialisation de la valeur «SI.45» pour la liste «75».";2009-07-29 00:00:00;1;1
6392;1078;1;"Kobarid";"SI.46";"NULL";"Initialisation de la valeur «SI.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6393;1078;1;"Kobilje";"SI.47";"NULL";"Initialisation de la valeur «SI.47» pour la liste «75».";2009-07-29 00:00:00;1;1
6394;1078;1;"Komen";"SI.49";"NULL";"Initialisation de la valeur «SI.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6395;1078;1;"Koper-Capodistria";"SI.50";"NULL";"Initialisation de la valeur «SI.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6396;1078;1;"Kozje";"SI.51";"NULL";"Initialisation de la valeur «SI.51» pour la liste «75».";2009-07-29 00:00:00;1;1
6397;1078;1;"Kranj";"SI.52";"NULL";"Initialisation de la valeur «SI.52» pour la liste «75».";2009-07-29 00:00:00;1;1
6398;1078;1;"Kranjska Gora";"SI.53";"NULL";"Initialisation de la valeur «SI.53» pour la liste «75».";2009-07-29 00:00:00;1;1
6399;1078;1;"Krško";"SI.54";"NULL";"Initialisation de la valeur «SI.54» pour la liste «75».";2009-07-29 00:00:00;1;1
6400;1078;1;"Kungota";"SI.55";"NULL";"Initialisation de la valeur «SI.55» pour la liste «75».";2009-07-29 00:00:00;1;1
6401;1078;1;"Laško";"SI.57";"NULL";"Initialisation de la valeur «SI.57» pour la liste «75».";2009-07-29 00:00:00;1;1
6402;1078;1;"Ljubljana";"SI.61";"NULL";"Initialisation de la valeur «SI.61» pour la liste «75».";2009-07-29 00:00:00;1;1
6403;1078;1;"Ljubno";"SI.62";"NULL";"Initialisation de la valeur «SI.62» pour la liste «75».";2009-07-29 00:00:00;1;1
6404;1078;1;"Logatec";"SI.64";"NULL";"Initialisation de la valeur «SI.64» pour la liste «75».";2009-07-29 00:00:00;1;1
6405;1078;1;"Loški Potok";"SI.66";"NULL";"Initialisation de la valeur «SI.66» pour la liste «75».";2009-07-29 00:00:00;1;1
6406;1078;1;"Lukovica";"SI.68";"NULL";"Initialisation de la valeur «SI.68» pour la liste «75».";2009-07-29 00:00:00;1;1
6407;1078;1;"Medvode";"SI.71";"NULL";"Initialisation de la valeur «SI.71» pour la liste «75».";2009-07-29 00:00:00;1;1
6408;1078;1;"Mengeš";"SI.72";"NULL";"Initialisation de la valeur «SI.72» pour la liste «75».";2009-07-29 00:00:00;1;1
6409;1078;1;"Metlika";"SI.73";"NULL";"Initialisation de la valeur «SI.73» pour la liste «75».";2009-07-29 00:00:00;1;1
6410;1078;1;"Mežica";"SI.74";"NULL";"Initialisation de la valeur «SI.74» pour la liste «75».";2009-07-29 00:00:00;1;1
6411;1078;1;"Mislinja";"SI.76";"NULL";"Initialisation de la valeur «SI.76» pour la liste «75».";2009-07-29 00:00:00;1;1
6412;1078;1;"Moravče";"SI.77";"NULL";"Initialisation de la valeur «SI.77» pour la liste «75».";2009-07-29 00:00:00;1;1
6413;1078;1;"Moravske Toplice";"SI.78";"NULL";"Initialisation de la valeur «SI.78» pour la liste «75».";2009-07-29 00:00:00;1;1
6414;1078;1;"Mozirje";"SI.79";"NULL";"Initialisation de la valeur «SI.79» pour la liste «75».";2009-07-29 00:00:00;1;1
6415;1078;1;"Murska Sobota";"SI.80";"NULL";"Initialisation de la valeur «SI.80» pour la liste «75».";2009-07-29 00:00:00;1;1
6416;1078;1;"Muta";"SI.81";"NULL";"Initialisation de la valeur «SI.81» pour la liste «75».";2009-07-29 00:00:00;1;1
6417;1078;1;"Naklo";"SI.82";"NULL";"Initialisation de la valeur «SI.82» pour la liste «75».";2009-07-29 00:00:00;1;1
6418;1078;1;"Nazarje";"SI.83";"NULL";"Initialisation de la valeur «SI.83» pour la liste «75».";2009-07-29 00:00:00;1;1
6419;1078;1;"Nova Gorica";"SI.84";"NULL";"Initialisation de la valeur «SI.84» pour la liste «75».";2009-07-29 00:00:00;1;1
6420;1078;1;"Odranci";"SI.86";"NULL";"Initialisation de la valeur «SI.86» pour la liste «75».";2009-07-29 00:00:00;1;1
6421;1078;1;"Ormož";"SI.87";"NULL";"Initialisation de la valeur «SI.87» pour la liste «75».";2009-07-29 00:00:00;1;1
6422;1078;1;"Osilnica";"SI.88";"NULL";"Initialisation de la valeur «SI.88» pour la liste «75».";2009-07-29 00:00:00;1;1
6423;1078;1;"Pesnica";"SI.89";"NULL";"Initialisation de la valeur «SI.89» pour la liste «75».";2009-07-29 00:00:00;1;1
6424;1078;1;"Pivka";"SI.91";"NULL";"Initialisation de la valeur «SI.91» pour la liste «75».";2009-07-29 00:00:00;1;1
6425;1078;1;"Podčetrtek";"SI.92";"NULL";"Initialisation de la valeur «SI.92» pour la liste «75».";2009-07-29 00:00:00;1;1
6426;1078;1;"Postojna";"SI.94";"NULL";"Initialisation de la valeur «SI.94» pour la liste «75».";2009-07-29 00:00:00;1;1
6427;1078;1;"Puconci";"SI.97";"NULL";"Initialisation de la valeur «SI.97» pour la liste «75».";2009-07-29 00:00:00;1;1
6428;1078;1;"Rače-Fram";"SI.98";"NULL";"Initialisation de la valeur «SI.98» pour la liste «75».";2009-07-29 00:00:00;1;1
6429;1078;1;"Radeče";"SI.99";"NULL";"Initialisation de la valeur «SI.99» pour la liste «75».";2009-07-29 00:00:00;1;1
6430;1078;1;"Radenci";"SI.A1";"NULL";"Initialisation de la valeur «SI.A1» pour la liste «75».";2009-07-29 00:00:00;1;1
6431;1078;1;"Radlje ob Dravi";"SI.A2";"NULL";"Initialisation de la valeur «SI.A2» pour la liste «75».";2009-07-29 00:00:00;1;1
6432;1078;1;"Radovljica";"SI.A3";"NULL";"Initialisation de la valeur «SI.A3» pour la liste «75».";2009-07-29 00:00:00;1;1
6433;1078;1;"Rogašovci";"SI.A6";"NULL";"Initialisation de la valeur «SI.A6» pour la liste «75».";2009-07-29 00:00:00;1;1
6434;1078;1;"Rogaška Slatina";"SI.A7";"NULL";"Initialisation de la valeur «SI.A7» pour la liste «75».";2009-07-29 00:00:00;1;1
6435;1078;1;"Rogatec";"SI.A8";"NULL";"Initialisation de la valeur «SI.A8» pour la liste «75».";2009-07-29 00:00:00;1;1
6436;1078;1;"Semič";"SI.B1";"NULL";"Initialisation de la valeur «SI.B1» pour la liste «75».";2009-07-29 00:00:00;1;1
6437;1078;1;"Šenčur";"SI.B2";"NULL";"Initialisation de la valeur «SI.B2» pour la liste «75».";2009-07-29 00:00:00;1;1
6438;1078;1;"Šentilj";"SI.B3";"NULL";"Initialisation de la valeur «SI.B3» pour la liste «75».";2009-07-29 00:00:00;1;1
6439;1078;1;"Šentjernej";"SI.B4";"NULL";"Initialisation de la valeur «SI.B4» pour la liste «75».";2009-07-29 00:00:00;1;1
6440;1078;1;"Sevnica";"SI.B6";"NULL";"Initialisation de la valeur «SI.B6» pour la liste «75».";2009-07-29 00:00:00;1;1
6441;1078;1;"Sežana";"SI.B7";"NULL";"Initialisation de la valeur «SI.B7» pour la liste «75».";2009-07-29 00:00:00;1;1
6442;1078;1;"Škocjan";"SI.B8";"NULL";"Initialisation de la valeur «SI.B8» pour la liste «75».";2009-07-29 00:00:00;1;1
6443;1078;1;"Škofja Loka";"SI.B9";"NULL";"Initialisation de la valeur «SI.B9» pour la liste «75».";2009-07-29 00:00:00;1;1
6444;1078;1;"Škofljica";"SI.C1";"NULL";"Initialisation de la valeur «SI.C1» pour la liste «75».";2009-07-29 00:00:00;1;1
6445;1078;1;"Slovenj Gradec";"SI.C2";"NULL";"Initialisation de la valeur «SI.C2» pour la liste «75».";2009-07-29 00:00:00;1;1
6446;1078;1;"Slovenska Konjice";"SI.C4";"NULL";"Initialisation de la valeur «SI.C4» pour la liste «75».";2009-07-29 00:00:00;1;1
6447;1078;1;"Šmarje pri Jelšah";"SI.C5";"NULL";"Initialisation de la valeur «SI.C5» pour la liste «75».";2009-07-29 00:00:00;1;1
6448;1078;1;"Šmartno ob Paki";"SI.C6";"NULL";"Initialisation de la valeur «SI.C6» pour la liste «75».";2009-07-29 00:00:00;1;1
6449;1078;1;"Šoštanj";"SI.C7";"NULL";"Initialisation de la valeur «SI.C7» pour la liste «75».";2009-07-29 00:00:00;1;1
6450;1078;1;"Starše";"SI.C8";"NULL";"Initialisation de la valeur «SI.C8» pour la liste «75».";2009-07-29 00:00:00;1;1
6451;1078;1;"Štore";"SI.C9";"NULL";"Initialisation de la valeur «SI.C9» pour la liste «75».";2009-07-29 00:00:00;1;1
6452;1078;1;"Sveti Jurij";"SI.D1";"NULL";"Initialisation de la valeur «SI.D1» pour la liste «75».";2009-07-29 00:00:00;1;1
6453;1078;1;"Tolmin";"SI.D2";"NULL";"Initialisation de la valeur «SI.D2» pour la liste «75».";2009-07-29 00:00:00;1;1
6454;1078;1;"Trbovlje";"SI.D3";"NULL";"Initialisation de la valeur «SI.D3» pour la liste «75».";2009-07-29 00:00:00;1;1
6455;1078;1;"Trebnje";"SI.D4";"NULL";"Initialisation de la valeur «SI.D4» pour la liste «75».";2009-07-29 00:00:00;1;1
6456;1078;1;"Tržič";"SI.D5";"NULL";"Initialisation de la valeur «SI.D5» pour la liste «75».";2009-07-29 00:00:00;1;1
6457;1078;1;"Turnišče";"SI.D6";"NULL";"Initialisation de la valeur «SI.D6» pour la liste «75».";2009-07-29 00:00:00;1;1
6458;1078;1;"Velenje";"SI.D7";"NULL";"Initialisation de la valeur «SI.D7» pour la liste «75».";2009-07-29 00:00:00;1;1
6459;1078;1;"Velike Lašče";"SI.D8";"NULL";"Initialisation de la valeur «SI.D8» pour la liste «75».";2009-07-29 00:00:00;1;1
6460;1078;1;"Vipava";"SI.E1";"NULL";"Initialisation de la valeur «SI.E1» pour la liste «75».";2009-07-29 00:00:00;1;1
6461;1078;1;"Vitanje";"SI.E2";"NULL";"Initialisation de la valeur «SI.E2» pour la liste «75».";2009-07-29 00:00:00;1;1
6462;1078;1;"Vodice";"SI.E3";"NULL";"Initialisation de la valeur «SI.E3» pour la liste «75».";2009-07-29 00:00:00;1;1
6463;1078;1;"Vrhnika";"SI.E5";"NULL";"Initialisation de la valeur «SI.E5» pour la liste «75».";2009-07-29 00:00:00;1;1
6464;1078;1;"Vuzenica";"SI.E6";"NULL";"Initialisation de la valeur «SI.E6» pour la liste «75».";2009-07-29 00:00:00;1;1
6465;1078;1;"Zagorje ob Savi";"SI.E7";"NULL";"Initialisation de la valeur «SI.E7» pour la liste «75».";2009-07-29 00:00:00;1;1
6466;1078;1;"Zavrč";"SI.E9";"NULL";"Initialisation de la valeur «SI.E9» pour la liste «75».";2009-07-29 00:00:00;1;1
6467;1078;1;"Železniki";"SI.F1";"NULL";"Initialisation de la valeur «SI.F1» pour la liste «75».";2009-07-29 00:00:00;1;1
6468;1078;1;"Žiri";"SI.F2";"NULL";"Initialisation de la valeur «SI.F2» pour la liste «75».";2009-07-29 00:00:00;1;1
6469;1078;1;"Zreče";"SI.F3";"NULL";"Initialisation de la valeur «SI.F3» pour la liste «75».";2009-07-29 00:00:00;1;1
6470;1078;1;"Benedikt";"SI.F4";"NULL";"Initialisation de la valeur «SI.F4» pour la liste «75».";2009-07-29 00:00:00;1;1
6471;1078;1;"Bistrica ob Sotli";"SI.F5";"NULL";"Initialisation de la valeur «SI.F5» pour la liste «75».";2009-07-29 00:00:00;1;1
6472;1078;1;"Bloke";"SI.F6";"NULL";"Initialisation de la valeur «SI.F6» pour la liste «75».";2009-07-29 00:00:00;1;1
6473;1078;1;"Braslovče";"SI.F7";"NULL";"Initialisation de la valeur «SI.F7» pour la liste «75».";2009-07-29 00:00:00;1;1
6474;1078;1;"Cankova";"SI.F8";"NULL";"Initialisation de la valeur «SI.F8» pour la liste «75».";2009-07-29 00:00:00;1;1
6475;1078;1;"Cerkvenjak";"SI.F9";"NULL";"Initialisation de la valeur «SI.F9» pour la liste «75».";2009-07-29 00:00:00;1;1
6476;1078;1;"Destrnik";"SI.G1";"NULL";"Initialisation de la valeur «SI.G1» pour la liste «75».";2009-07-29 00:00:00;1;1
6477;1078;1;"Dobje";"SI.G2";"NULL";"Initialisation de la valeur «SI.G2» pour la liste «75».";2009-07-29 00:00:00;1;1
6478;1078;1;"Dobrna";"SI.G3";"NULL";"Initialisation de la valeur «SI.G3» pour la liste «75».";2009-07-29 00:00:00;1;1
6479;1078;1;"Dobrova-Horjul-Polhov Gradec";"SI.G4";"NULL";"Initialisation de la valeur «SI.G4» pour la liste «75».";2009-07-29 00:00:00;1;1
6480;1078;1;"Dobrovnik-Dobronak";"SI.G5";"NULL";"Initialisation de la valeur «SI.G5» pour la liste «75».";2009-07-29 00:00:00;1;1
6481;1078;1;"Dolenjske Toplice";"SI.G6";"NULL";"Initialisation de la valeur «SI.G6» pour la liste «75».";2009-07-29 00:00:00;1;1
6482;1078;1;"Domžale";"SI.G7";"NULL";"Initialisation de la valeur «SI.G7» pour la liste «75».";2009-07-29 00:00:00;1;1
6483;1078;1;"Grad";"SI.G8";"NULL";"Initialisation de la valeur «SI.G8» pour la liste «75».";2009-07-29 00:00:00;1;1
6484;1078;1;"Hajdina";"SI.G9";"NULL";"Initialisation de la valeur «SI.G9» pour la liste «75».";2009-07-29 00:00:00;1;1
6485;1078;1;"Hoče-Slivnica";"SI.H1";"NULL";"Initialisation de la valeur «SI.H1» pour la liste «75».";2009-07-29 00:00:00;1;1
6486;1078;1;"Hodoš-Hodos";"SI.H2";"NULL";"Initialisation de la valeur «SI.H2» pour la liste «75».";2009-07-29 00:00:00;1;1
6487;1078;1;"Horjul";"SI.H3";"NULL";"Initialisation de la valeur «SI.H3» pour la liste «75».";2009-07-29 00:00:00;1;1
6488;1078;1;"Jesenice";"SI.H4";"NULL";"Initialisation de la valeur «SI.H4» pour la liste «75».";2009-07-29 00:00:00;1;1
6489;1078;1;"Jezersko";"SI.H5";"NULL";"Initialisation de la valeur «SI.H5» pour la liste «75».";2009-07-29 00:00:00;1;1
6490;1078;1;"Kamnik";"SI.H6";"NULL";"Initialisation de la valeur «SI.H6» pour la liste «75».";2009-07-29 00:00:00;1;1
6491;1078;1;"Kočevje";"SI.H7";"NULL";"Initialisation de la valeur «SI.H7» pour la liste «75».";2009-07-29 00:00:00;1;1
6492;1078;1;"Komenda";"SI.H8";"NULL";"Initialisation de la valeur «SI.H8» pour la liste «75».";2009-07-29 00:00:00;1;1
6493;1078;1;"Kostel";"SI.H9";"NULL";"Initialisation de la valeur «SI.H9» pour la liste «75».";2009-07-29 00:00:00;1;1
6494;1078;1;"Križevci";"SI.I1";"NULL";"Initialisation de la valeur «SI.I1» pour la liste «75».";2009-07-29 00:00:00;1;1
6495;1078;1;"Kuzma";"SI.I2";"NULL";"Initialisation de la valeur «SI.I2» pour la liste «75».";2009-07-29 00:00:00;1;1
6496;1078;1;"Lenart";"SI.I3";"NULL";"Initialisation de la valeur «SI.I3» pour la liste «75».";2009-07-29 00:00:00;1;1
6497;1078;1;"Litija";"SI.I5";"NULL";"Initialisation de la valeur «SI.I5» pour la liste «75».";2009-07-29 00:00:00;1;1
6498;1078;1;"Ljutomer";"SI.I6";"NULL";"Initialisation de la valeur «SI.I6» pour la liste «75».";2009-07-29 00:00:00;1;1
6499;1078;1;"Loška Dolina";"SI.I7";"NULL";"Initialisation de la valeur «SI.I7» pour la liste «75».";2009-07-29 00:00:00;1;1
6500;1078;1;"Lovrenc na Pohorju";"SI.I8";"NULL";"Initialisation de la valeur «SI.I8» pour la liste «75».";2009-07-29 00:00:00;1;1
6501;1078;1;"Luče";"SI.I9";"NULL";"Initialisation de la valeur «SI.I9» pour la liste «75».";2009-07-29 00:00:00;1;1
6502;1078;1;"Majšperk";"SI.J1";"NULL";"Initialisation de la valeur «SI.J1» pour la liste «75».";2009-07-29 00:00:00;1;1
6503;1078;1;"Maribor";"SI.J2";"NULL";"Initialisation de la valeur «SI.J2» pour la liste «75».";2009-07-29 00:00:00;1;1
6504;1078;1;"Markovci";"SI.J3";"NULL";"Initialisation de la valeur «SI.J3» pour la liste «75».";2009-07-29 00:00:00;1;1
6505;1078;1;"Miklavž na Dravskem Polju";"SI.J4";"NULL";"Initialisation de la valeur «SI.J4» pour la liste «75».";2009-07-29 00:00:00;1;1
6506;1078;1;"Miren-Kostanjevica";"SI.J5";"NULL";"Initialisation de la valeur «SI.J5» pour la liste «75».";2009-07-29 00:00:00;1;1
6507;1078;1;"Mirna Peč";"SI.J6";"NULL";"Initialisation de la valeur «SI.J6» pour la liste «75».";2009-07-29 00:00:00;1;1
6508;1078;1;"Novo Mesto";"SI.J7";"NULL";"Initialisation de la valeur «SI.J7» pour la liste «75».";2009-07-29 00:00:00;1;1
6509;1078;1;"Oplotnica";"SI.J8";"NULL";"Initialisation de la valeur «SI.J8» pour la liste «75».";2009-07-29 00:00:00;1;1
6510;1078;1;"Piran-Pirano";"SI.J9";"NULL";"Initialisation de la valeur «SI.J9» pour la liste «75».";2009-07-29 00:00:00;1;1
6511;1078;1;"Podlehnik";"SI.K1";"NULL";"Initialisation de la valeur «SI.K1» pour la liste «75».";2009-07-29 00:00:00;1;1
6512;1078;1;"Polzela";"SI.K3";"NULL";"Initialisation de la valeur «SI.K3» pour la liste «75».";2009-07-29 00:00:00;1;1
6513;1078;1;"Prebold";"SI.K4";"NULL";"Initialisation de la valeur «SI.K4» pour la liste «75».";2009-07-29 00:00:00;1;1
6514;1078;1;"Preddvor";"SI.K5";"NULL";"Initialisation de la valeur «SI.K5» pour la liste «75».";2009-07-29 00:00:00;1;1
6515;1078;1;"Prevalje";"SI.K6";"NULL";"Initialisation de la valeur «SI.K6» pour la liste «75».";2009-07-29 00:00:00;1;1
6516;1078;1;"Ptuj";"SI.K7";"NULL";"Initialisation de la valeur «SI.K7» pour la liste «75».";2009-07-29 00:00:00;1;1
6517;1078;1;"Ravne na Koroškem";"SI.K8";"NULL";"Initialisation de la valeur «SI.K8» pour la liste «75».";2009-07-29 00:00:00;1;1
6518;1078;1;"Razkrižje";"SI.K9";"NULL";"Initialisation de la valeur «SI.K9» pour la liste «75».";2009-07-29 00:00:00;1;1
6519;1078;1;"Ribnica";"SI.L1";"NULL";"Initialisation de la valeur «SI.L1» pour la liste «75».";2009-07-29 00:00:00;1;1
6520;1078;1;"Ribnica na Pohorju";"SI.L2";"NULL";"Initialisation de la valeur «SI.L2» pour la liste «75».";2009-07-29 00:00:00;1;1
6521;1078;1;"Ruše";"SI.L3";"NULL";"Initialisation de la valeur «SI.L3» pour la liste «75».";2009-07-29 00:00:00;1;1
6522;1078;1;"Selnica ob Dravi";"SI.L5";"NULL";"Initialisation de la valeur «SI.L5» pour la liste «75».";2009-07-29 00:00:00;1;1
6523;1078;1;"Šempeter-Vrtojba";"SI.L6";"NULL";"Initialisation de la valeur «SI.L6» pour la liste «75».";2009-07-29 00:00:00;1;1
6524;1078;1;"Šentjur pri Celju";"SI.L7";"NULL";"Initialisation de la valeur «SI.L7» pour la liste «75».";2009-07-29 00:00:00;1;1
6525;1078;1;"Slovenska Bistrica";"SI.L8";"NULL";"Initialisation de la valeur «SI.L8» pour la liste «75».";2009-07-29 00:00:00;1;1
6526;1078;1;"Šmartno pri Litiji";"SI.L9";"NULL";"Initialisation de la valeur «SI.L9» pour la liste «75».";2009-07-29 00:00:00;1;1
6527;1078;1;"Sodražica";"SI.M1";"NULL";"Initialisation de la valeur «SI.M1» pour la liste «75».";2009-07-29 00:00:00;1;1
6528;1078;1;"Solčava";"SI.M2";"NULL";"Initialisation de la valeur «SI.M2» pour la liste «75».";2009-07-29 00:00:00;1;1
6529;1078;1;"Sveta Ana";"SI.M3";"NULL";"Initialisation de la valeur «SI.M3» pour la liste «75».";2009-07-29 00:00:00;1;1
6530;1078;1;"Sveti Andraž v Slovenskih Goricah";"SI.M4";"NULL";"Initialisation de la valeur «SI.M4» pour la liste «75».";2009-07-29 00:00:00;1;1
6531;1078;1;"Tabor";"SI.M5";"NULL";"Initialisation de la valeur «SI.M5» pour la liste «75».";2009-07-29 00:00:00;1;1
6532;1078;1;"Trzin";"SI.M8";"NULL";"Initialisation de la valeur «SI.M8» pour la liste «75».";2009-07-29 00:00:00;1;1
6533;1078;1;"Velika Polana";"SI.M9";"NULL";"Initialisation de la valeur «SI.M9» pour la liste «75».";2009-07-29 00:00:00;1;1
6534;1078;1;"Veržej";"SI.N1";"NULL";"Initialisation de la valeur «SI.N1» pour la liste «75».";2009-07-29 00:00:00;1;1
6535;1078;1;"Videm";"SI.N2";"NULL";"Initialisation de la valeur «SI.N2» pour la liste «75».";2009-07-29 00:00:00;1;1
6536;1078;1;"Vojnik";"SI.N3";"NULL";"Initialisation de la valeur «SI.N3» pour la liste «75».";2009-07-29 00:00:00;1;1
6537;1078;1;"Vransko";"SI.N4";"NULL";"Initialisation de la valeur «SI.N4» pour la liste «75».";2009-07-29 00:00:00;1;1
6538;1078;1;"Žalec";"SI.N5";"NULL";"Initialisation de la valeur «SI.N5» pour la liste «75».";2009-07-29 00:00:00;1;1
6539;1078;1;"Žetale";"SI.N6";"NULL";"Initialisation de la valeur «SI.N6» pour la liste «75».";2009-07-29 00:00:00;1;1
6540;1078;1;"Žirovnica";"SI.N7";"NULL";"Initialisation de la valeur «SI.N7» pour la liste «75».";2009-07-29 00:00:00;1;1
6541;1078;1;"Žužemberk";"SI.N8";"NULL";"Initialisation de la valeur «SI.N8» pour la liste «75».";2009-07-29 00:00:00;1;1
6542;1078;1;"Slovakia (general)";"SK.00";"NULL";"Initialisation de la valeur «SK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6543;1078;1;"Banskobystrický";"SK.01";"NULL";"Initialisation de la valeur «SK.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6544;1078;1;"Bratislavský";"SK.02";"NULL";"Initialisation de la valeur «SK.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6545;1078;1;"Košický";"SK.03";"NULL";"Initialisation de la valeur «SK.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6546;1078;1;"Nitriansky";"SK.04";"NULL";"Initialisation de la valeur «SK.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6547;1078;1;"Prešovský";"SK.05";"NULL";"Initialisation de la valeur «SK.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6548;1078;1;"Trenčiansky";"SK.06";"NULL";"Initialisation de la valeur «SK.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6549;1078;1;"Trnavský";"SK.07";"NULL";"Initialisation de la valeur «SK.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6550;1078;1;"Žilinský";"SK.08";"NULL";"Initialisation de la valeur «SK.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6551;1078;1;"Sierra Leone (general)";"SL.00";"NULL";"Initialisation de la valeur «SL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6552;1078;1;"Eastern Province";"SL.01";"NULL";"Initialisation de la valeur «SL.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6553;1078;1;"Northern Province";"SL.02";"NULL";"Initialisation de la valeur «SL.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6554;1078;1;"Southern Province";"SL.03";"NULL";"Initialisation de la valeur «SL.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6555;1078;1;"Western Area";"SL.04";"NULL";"Initialisation de la valeur «SL.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6556;1078;1;"San Marino (general)";"SM.00";"NULL";"Initialisation de la valeur «SM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6557;1078;1;"Acquaviva";"SM.01";"NULL";"Initialisation de la valeur «SM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6558;1078;1;"Chiesanuova";"SM.02";"NULL";"Initialisation de la valeur «SM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6559;1078;1;"Domagnano";"SM.03";"NULL";"Initialisation de la valeur «SM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6560;1078;1;"Faetano";"SM.04";"NULL";"Initialisation de la valeur «SM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6561;1078;1;"Fiorentino";"SM.05";"NULL";"Initialisation de la valeur «SM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6562;1078;1;"Borgo Maggiore";"SM.06";"NULL";"Initialisation de la valeur «SM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6563;1078;1;"San Marino";"SM.07";"NULL";"Initialisation de la valeur «SM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6564;1078;1;"Montegiardino";"SM.08";"NULL";"Initialisation de la valeur «SM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6565;1078;1;"Serravalle";"SM.09";"NULL";"Initialisation de la valeur «SM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6566;1078;1;"Senegal (general)";"SN.00";"NULL";"Initialisation de la valeur «SN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6567;1078;1;"Dakar";"SN.01";"NULL";"Initialisation de la valeur «SN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6568;1078;1;"Diourbel";"SN.03";"NULL";"Initialisation de la valeur «SN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6569;1078;1;"Saint-Louis";"SN.04";"NULL";"Initialisation de la valeur «SN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6570;1078;1;"Tambacounda";"SN.05";"NULL";"Initialisation de la valeur «SN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6571;1078;1;"Thiès";"SN.07";"NULL";"Initialisation de la valeur «SN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6572;1078;1;"Louga";"SN.08";"NULL";"Initialisation de la valeur «SN.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6573;1078;1;"Fatick";"SN.09";"NULL";"Initialisation de la valeur «SN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6574;1078;1;"Kaolack";"SN.10";"NULL";"Initialisation de la valeur «SN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6575;1078;1;"Kolda Region";"SN.11";"NULL";"Initialisation de la valeur «SN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6576;1078;1;"Ziguinchor";"SN.12";"NULL";"Initialisation de la valeur «SN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6577;1078;1;"Louga";"SN.13";"NULL";"Initialisation de la valeur «SN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6578;1078;1;"Saint-Louis";"SN.14";"NULL";"Initialisation de la valeur «SN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6579;1078;1;"Matam";"SN.15";"NULL";"Initialisation de la valeur «SN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6580;1078;1;"Somalia (general)";"SO.00";"NULL";"Initialisation de la valeur «SO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6581;1078;1;"Bakool";"SO.01";"NULL";"Initialisation de la valeur «SO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6582;1078;1;"Banaadir";"SO.02";"NULL";"Initialisation de la valeur «SO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6583;1078;1;"Bari";"SO.03";"NULL";"Initialisation de la valeur «SO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6584;1078;1;"Bay";"SO.04";"NULL";"Initialisation de la valeur «SO.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6585;1078;1;"Galguduud";"SO.05";"NULL";"Initialisation de la valeur «SO.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6586;1078;1;"Gedo";"SO.06";"NULL";"Initialisation de la valeur «SO.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6587;1078;1;"Hiiraan";"SO.07";"NULL";"Initialisation de la valeur «SO.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6588;1078;1;"Middle Juba";"SO.08";"NULL";"Initialisation de la valeur «SO.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6589;1078;1;"Lower Juba";"SO.09";"NULL";"Initialisation de la valeur «SO.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6590;1078;1;"Mudug";"SO.10";"NULL";"Initialisation de la valeur «SO.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6591;1078;1;"Sanaag";"SO.12";"NULL";"Initialisation de la valeur «SO.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6592;1078;1;"Middle Shabele";"SO.13";"NULL";"Initialisation de la valeur «SO.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6593;1078;1;"Shabeellaha Hoose";"SO.14";"NULL";"Initialisation de la valeur «SO.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6594;1078;1;"(SO17)";"SO.17";"NULL";"Initialisation de la valeur «SO.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6595;1078;1;"Nugaal";"SO.18";"NULL";"Initialisation de la valeur «SO.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6596;1078;1;"Togdheer";"SO.19";"NULL";"Initialisation de la valeur «SO.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6597;1078;1;"Woqooyi Galbeed";"SO.20";"NULL";"Initialisation de la valeur «SO.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6598;1078;1;"Awdal";"SO.21";"NULL";"Initialisation de la valeur «SO.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6599;1078;1;"Sool";"SO.22";"NULL";"Initialisation de la valeur «SO.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6600;1078;1;"Suriname (general)";"SR.00";"NULL";"Initialisation de la valeur «SR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6601;1078;1;"Brokopondo";"SR.10";"NULL";"Initialisation de la valeur «SR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6602;1078;1;"Commewijne";"SR.11";"NULL";"Initialisation de la valeur «SR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6603;1078;1;"Coronie";"SR.12";"NULL";"Initialisation de la valeur «SR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6604;1078;1;"Marowijne";"SR.13";"NULL";"Initialisation de la valeur «SR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6605;1078;1;"Nickerie";"SR.14";"NULL";"Initialisation de la valeur «SR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6606;1078;1;"Para";"SR.15";"NULL";"Initialisation de la valeur «SR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6607;1078;1;"Paramaribo";"SR.16";"NULL";"Initialisation de la valeur «SR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6608;1078;1;"Saramacca";"SR.17";"NULL";"Initialisation de la valeur «SR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6609;1078;1;"Sipaliwini";"SR.18";"NULL";"Initialisation de la valeur «SR.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6610;1078;1;"Wanica";"SR.19";"NULL";"Initialisation de la valeur «SR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6611;1078;1;"Príncipe";"ST.00";"NULL";"Initialisation de la valeur «ST.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6612;1078;1;"Príncipe";"ST.01";"NULL";"Initialisation de la valeur «ST.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6613;1078;1;"São Tomé";"ST.02";"NULL";"Initialisation de la valeur «ST.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6614;1078;1;"El Salvador (general)";"SV.00";"NULL";"Initialisation de la valeur «SV.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6615;1078;1;"Ahuachapán";"SV.01";"NULL";"Initialisation de la valeur «SV.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6616;1078;1;"Cabañas";"SV.02";"NULL";"Initialisation de la valeur «SV.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6617;1078;1;"Chalatenango";"SV.03";"NULL";"Initialisation de la valeur «SV.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6618;1078;1;"Cuscatlán";"SV.04";"NULL";"Initialisation de la valeur «SV.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6619;1078;1;"La Libertad";"SV.05";"NULL";"Initialisation de la valeur «SV.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6620;1078;1;"La Paz";"SV.06";"NULL";"Initialisation de la valeur «SV.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6621;1078;1;"La Unión";"SV.07";"NULL";"Initialisation de la valeur «SV.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6622;1078;1;"Morazán";"SV.08";"NULL";"Initialisation de la valeur «SV.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6623;1078;1;"San Miguel";"SV.09";"NULL";"Initialisation de la valeur «SV.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6624;1078;1;"San Salvador";"SV.10";"NULL";"Initialisation de la valeur «SV.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6625;1078;1;"Santa Ana";"SV.11";"NULL";"Initialisation de la valeur «SV.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6626;1078;1;"San Vicente";"SV.12";"NULL";"Initialisation de la valeur «SV.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6627;1078;1;"Sonsonate";"SV.13";"NULL";"Initialisation de la valeur «SV.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6628;1078;1;"Usulután";"SV.14";"NULL";"Initialisation de la valeur «SV.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6629;1078;1;"Syria (general)";"SY.00";"NULL";"Initialisation de la valeur «SY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6630;1078;1;"Al-Hasakah";"SY.01";"NULL";"Initialisation de la valeur «SY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6631;1078;1;"Latakia";"SY.02";"NULL";"Initialisation de la valeur «SY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6632;1078;1;"Quneitra";"SY.03";"NULL";"Initialisation de la valeur «SY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6633;1078;1;"Ar-Raqqah";"SY.04";"NULL";"Initialisation de la valeur «SY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6634;1078;1;"As-Suwayda";"SY.05";"NULL";"Initialisation de la valeur «SY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6635;1078;1;"Daraa";"SY.06";"NULL";"Initialisation de la valeur «SY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6636;1078;1;"Deir ez-Zor";"SY.07";"NULL";"Initialisation de la valeur «SY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6637;1078;1;"Rif-dimashq";"SY.08";"NULL";"Initialisation de la valeur «SY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6638;1078;1;"Aleppo";"SY.09";"NULL";"Initialisation de la valeur «SY.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6639;1078;1;"Hama Governorate";"SY.10";"NULL";"Initialisation de la valeur «SY.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6640;1078;1;"Homs";"SY.11";"NULL";"Initialisation de la valeur «SY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6641;1078;1;"Idlib";"SY.12";"NULL";"Initialisation de la valeur «SY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6642;1078;1;"Damascus City";"SY.13";"NULL";"Initialisation de la valeur «SY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6643;1078;1;"Tartus";"SY.14";"NULL";"Initialisation de la valeur «SY.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6644;1078;1;"Swaziland (general)";"SZ.00";"NULL";"Initialisation de la valeur «SZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6645;1078;1;"Hhohho";"SZ.01";"NULL";"Initialisation de la valeur «SZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6646;1078;1;"Lubombo";"SZ.02";"NULL";"Initialisation de la valeur «SZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6647;1078;1;"Manzini";"SZ.03";"NULL";"Initialisation de la valeur «SZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6648;1078;1;"Shiselweni";"SZ.04";"NULL";"Initialisation de la valeur «SZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6649;1078;1;"Turks and Caicos Islands (general)";"TC.00";"NULL";"Initialisation de la valeur «TC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6650;1078;1;"Chad (general)";"TD.00";"NULL";"Initialisation de la valeur «TD.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6651;1078;1;"Batha";"TD.01";"NULL";"Initialisation de la valeur «TD.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6652;1078;1;"Biltine";"TD.02";"NULL";"Initialisation de la valeur «TD.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6653;1078;1;"Borkou-Ennedi-Tibesti";"TD.03";"NULL";"Initialisation de la valeur «TD.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6654;1078;1;"Chari-Baguirmi";"TD.04";"NULL";"Initialisation de la valeur «TD.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6655;1078;1;"Guéra";"TD.05";"NULL";"Initialisation de la valeur «TD.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6656;1078;1;"Kanem";"TD.06";"NULL";"Initialisation de la valeur «TD.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6657;1078;1;"Lac";"TD.07";"NULL";"Initialisation de la valeur «TD.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6658;1078;1;"Logone Occidental";"TD.08";"NULL";"Initialisation de la valeur «TD.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6659;1078;1;"Logone Oriental";"TD.09";"NULL";"Initialisation de la valeur «TD.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6660;1078;1;"Mayo-Kébbi";"TD.10";"NULL";"Initialisation de la valeur «TD.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6661;1078;1;"Moyen-Chari";"TD.11";"NULL";"Initialisation de la valeur «TD.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6662;1078;1;"Ouaddaï";"TD.12";"NULL";"Initialisation de la valeur «TD.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6663;1078;1;"Salamat";"TD.13";"NULL";"Initialisation de la valeur «TD.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6664;1078;1;"Tandjilé";"TD.14";"NULL";"Initialisation de la valeur «TD.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6665;1078;1;"District de Saint-Paul-et-Amsterdam";"TF.01";"NULL";"Initialisation de la valeur «TF.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6666;1078;1;"District de Crozet";"TF.02";"NULL";"Initialisation de la valeur «TF.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6667;1078;1;"District de Kerguelen";"TF.03";"NULL";"Initialisation de la valeur «TF.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6668;1078;1;"District de Terre Adélie";"TF.04";"NULL";"Initialisation de la valeur «TF.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6669;1078;1;"District des Îles Éparses";"TF.05";"NULL";"Initialisation de la valeur «TF.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6670;1078;1;"Togo (general)";"TG.00";"NULL";"Initialisation de la valeur «TG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6671;1078;1;"Amlame";"TG.01";"NULL";"Initialisation de la valeur «TG.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6672;1078;1;"Aneho";"TG.02";"NULL";"Initialisation de la valeur «TG.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6673;1078;1;"Atakpame";"TG.03";"NULL";"Initialisation de la valeur «TG.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6674;1078;1;"Bafilo";"TG.04";"NULL";"Initialisation de la valeur «TG.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6675;1078;1;"Bassar";"TG.05";"NULL";"Initialisation de la valeur «TG.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6676;1078;1;"Dapaong";"TG.06";"NULL";"Initialisation de la valeur «TG.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6677;1078;1;"Kante";"TG.07";"NULL";"Initialisation de la valeur «TG.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6678;1078;1;"Klouto";"TG.08";"NULL";"Initialisation de la valeur «TG.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6679;1078;1;"Lama-Kara";"TG.09";"NULL";"Initialisation de la valeur «TG.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6680;1078;1;"Lome";"TG.10";"NULL";"Initialisation de la valeur «TG.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6681;1078;1;"Mango";"TG.11";"NULL";"Initialisation de la valeur «TG.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6682;1078;1;"Niamtougou";"TG.12";"NULL";"Initialisation de la valeur «TG.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6683;1078;1;"Notse";"TG.13";"NULL";"Initialisation de la valeur «TG.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6684;1078;1;"Kpagouda";"TG.14";"NULL";"Initialisation de la valeur «TG.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6685;1078;1;"Badou";"TG.15";"NULL";"Initialisation de la valeur «TG.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6686;1078;1;"Sotouboua";"TG.16";"NULL";"Initialisation de la valeur «TG.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6687;1078;1;"Tabligbo";"TG.17";"NULL";"Initialisation de la valeur «TG.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6688;1078;1;"Tsevie";"TG.18";"NULL";"Initialisation de la valeur «TG.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6689;1078;1;"Tchamba";"TG.19";"NULL";"Initialisation de la valeur «TG.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6690;1078;1;"Tchaoudjo";"TG.20";"NULL";"Initialisation de la valeur «TG.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6691;1078;1;"Vogan";"TG.21";"NULL";"Initialisation de la valeur «TG.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6692;1078;1;"Centrale";"TG.22";"NULL";"Initialisation de la valeur «TG.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6693;1078;1;"Kara";"TG.23";"NULL";"Initialisation de la valeur «TG.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6694;1078;1;"Maritime";"TG.24";"NULL";"Initialisation de la valeur «TG.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6695;1078;1;"Plateaux";"TG.25";"NULL";"Initialisation de la valeur «TG.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6696;1078;1;"Savanes";"TG.26";"NULL";"Initialisation de la valeur «TG.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6697;1078;1;"Thailand (general)";"TH.00";"NULL";"Initialisation de la valeur «TH.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6698;1078;1;"Mae Hong Son";"TH.01";"NULL";"Initialisation de la valeur «TH.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6699;1078;1;"Chiang Mai";"TH.02";"NULL";"Initialisation de la valeur «TH.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6700;1078;1;"Chiang Rai";"TH.03";"NULL";"Initialisation de la valeur «TH.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6701;1078;1;"Nan";"TH.04";"NULL";"Initialisation de la valeur «TH.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6702;1078;1;"Lamphun";"TH.05";"NULL";"Initialisation de la valeur «TH.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6703;1078;1;"Lampang";"TH.06";"NULL";"Initialisation de la valeur «TH.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6704;1078;1;"Phrae";"TH.07";"NULL";"Initialisation de la valeur «TH.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6705;1078;1;"Tak";"TH.08";"NULL";"Initialisation de la valeur «TH.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6706;1078;1;"Sukhothai";"TH.09";"NULL";"Initialisation de la valeur «TH.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6707;1078;1;"Uttaradit";"TH.10";"NULL";"Initialisation de la valeur «TH.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6708;1078;1;"Kamphaeng Phet";"TH.11";"NULL";"Initialisation de la valeur «TH.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6709;1078;1;"Phitsanulok";"TH.12";"NULL";"Initialisation de la valeur «TH.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6710;1078;1;"Phichit";"TH.13";"NULL";"Initialisation de la valeur «TH.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6711;1078;1;"Phetchabun";"TH.14";"NULL";"Initialisation de la valeur «TH.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6712;1078;1;"Uthai Thani";"TH.15";"NULL";"Initialisation de la valeur «TH.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6713;1078;1;"Nakhon Sawan";"TH.16";"NULL";"Initialisation de la valeur «TH.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6714;1078;1;"Nong Khai";"TH.17";"NULL";"Initialisation de la valeur «TH.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6715;1078;1;"Loei";"TH.18";"NULL";"Initialisation de la valeur «TH.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6716;1078;1;"Sakon Nakhon";"TH.20";"NULL";"Initialisation de la valeur «TH.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6717;1078;1;"Nakhon Phanom";"TH.21";"NULL";"Initialisation de la valeur «TH.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6718;1078;1;"Khon Kaen";"TH.22";"NULL";"Initialisation de la valeur «TH.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6719;1078;1;"Kalasin";"TH.23";"NULL";"Initialisation de la valeur «TH.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6720;1078;1;"Maha Sarakham";"TH.24";"NULL";"Initialisation de la valeur «TH.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6721;1078;1;"Roi Et";"TH.25";"NULL";"Initialisation de la valeur «TH.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6722;1078;1;"Chaiyaphum";"TH.26";"NULL";"Initialisation de la valeur «TH.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6723;1078;1;"Nakhon Ratchasima";"TH.27";"NULL";"Initialisation de la valeur «TH.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6724;1078;1;"Buriram";"TH.28";"NULL";"Initialisation de la valeur «TH.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6725;1078;1;"Surin";"TH.29";"NULL";"Initialisation de la valeur «TH.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6726;1078;1;"Sisaket";"TH.30";"NULL";"Initialisation de la valeur «TH.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6727;1078;1;"Narathiwat";"TH.31";"NULL";"Initialisation de la valeur «TH.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6728;1078;1;"Chai Nat";"TH.32";"NULL";"Initialisation de la valeur «TH.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6729;1078;1;"Sing Buri";"TH.33";"NULL";"Initialisation de la valeur «TH.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6730;1078;1;"Lop Buri";"TH.34";"NULL";"Initialisation de la valeur «TH.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6731;1078;1;"Ang Thong";"TH.35";"NULL";"Initialisation de la valeur «TH.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6732;1078;1;"Phra Nakhon Si Ayutthaya";"TH.36";"NULL";"Initialisation de la valeur «TH.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6733;1078;1;"Sara Buri";"TH.37";"NULL";"Initialisation de la valeur «TH.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6734;1078;1;"Nonthaburi";"TH.38";"NULL";"Initialisation de la valeur «TH.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6735;1078;1;"Pathum Thani";"TH.39";"NULL";"Initialisation de la valeur «TH.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6736;1078;1;"Phayao";"TH.41";"NULL";"Initialisation de la valeur «TH.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6737;1078;1;"Samut Prakan";"TH.42";"NULL";"Initialisation de la valeur «TH.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6738;1078;1;"Nakhon Nayok";"TH.43";"NULL";"Initialisation de la valeur «TH.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6739;1078;1;"Chachoengsao";"TH.44";"NULL";"Initialisation de la valeur «TH.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6740;1078;1;"Chon Buri";"TH.46";"NULL";"Initialisation de la valeur «TH.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6741;1078;1;"Rayong";"TH.47";"NULL";"Initialisation de la valeur «TH.47» pour la liste «75».";2009-07-29 00:00:00;1;1
6742;1078;1;"Chanthaburi";"TH.48";"NULL";"Initialisation de la valeur «TH.48» pour la liste «75».";2009-07-29 00:00:00;1;1
6743;1078;1;"Trat";"TH.49";"NULL";"Initialisation de la valeur «TH.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6744;1078;1;"Kanchanaburi";"TH.50";"NULL";"Initialisation de la valeur «TH.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6745;1078;1;"Suphan Buri";"TH.51";"NULL";"Initialisation de la valeur «TH.51» pour la liste «75».";2009-07-29 00:00:00;1;1
6746;1078;1;"Ratchaburi";"TH.52";"NULL";"Initialisation de la valeur «TH.52» pour la liste «75».";2009-07-29 00:00:00;1;1
6747;1078;1;"Nakhon Pathom";"TH.53";"NULL";"Initialisation de la valeur «TH.53» pour la liste «75».";2009-07-29 00:00:00;1;1
6748;1078;1;"Samut Songkhram";"TH.54";"NULL";"Initialisation de la valeur «TH.54» pour la liste «75».";2009-07-29 00:00:00;1;1
6749;1078;1;"Samut Sakhon";"TH.55";"NULL";"Initialisation de la valeur «TH.55» pour la liste «75».";2009-07-29 00:00:00;1;1
6750;1078;1;"Phetchaburi";"TH.56";"NULL";"Initialisation de la valeur «TH.56» pour la liste «75».";2009-07-29 00:00:00;1;1
6751;1078;1;"Prachuap Khiri Khan";"TH.57";"NULL";"Initialisation de la valeur «TH.57» pour la liste «75».";2009-07-29 00:00:00;1;1
6752;1078;1;"Chumphon";"TH.58";"NULL";"Initialisation de la valeur «TH.58» pour la liste «75».";2009-07-29 00:00:00;1;1
6753;1078;1;"Ranong";"TH.59";"NULL";"Initialisation de la valeur «TH.59» pour la liste «75».";2009-07-29 00:00:00;1;1
6754;1078;1;"Surat Thani";"TH.60";"NULL";"Initialisation de la valeur «TH.60» pour la liste «75».";2009-07-29 00:00:00;1;1
6755;1078;1;"Phangnga";"TH.61";"NULL";"Initialisation de la valeur «TH.61» pour la liste «75».";2009-07-29 00:00:00;1;1
6756;1078;1;"Phuket";"TH.62";"NULL";"Initialisation de la valeur «TH.62» pour la liste «75».";2009-07-29 00:00:00;1;1
6757;1078;1;"Krabi";"TH.63";"NULL";"Initialisation de la valeur «TH.63» pour la liste «75».";2009-07-29 00:00:00;1;1
6758;1078;1;"Nakhon Si Thammarat";"TH.64";"NULL";"Initialisation de la valeur «TH.64» pour la liste «75».";2009-07-29 00:00:00;1;1
6759;1078;1;"Trang";"TH.65";"NULL";"Initialisation de la valeur «TH.65» pour la liste «75».";2009-07-29 00:00:00;1;1
6760;1078;1;"Phatthalung";"TH.66";"NULL";"Initialisation de la valeur «TH.66» pour la liste «75».";2009-07-29 00:00:00;1;1
6761;1078;1;"Satun";"TH.67";"NULL";"Initialisation de la valeur «TH.67» pour la liste «75».";2009-07-29 00:00:00;1;1
6762;1078;1;"Songkhla";"TH.68";"NULL";"Initialisation de la valeur «TH.68» pour la liste «75».";2009-07-29 00:00:00;1;1
6763;1078;1;"Pattani";"TH.69";"NULL";"Initialisation de la valeur «TH.69» pour la liste «75».";2009-07-29 00:00:00;1;1
6764;1078;1;"Yala";"TH.70";"NULL";"Initialisation de la valeur «TH.70» pour la liste «75».";2009-07-29 00:00:00;1;1
6765;1078;1;"Yasothon";"TH.72";"NULL";"Initialisation de la valeur «TH.72» pour la liste «75».";2009-07-29 00:00:00;1;1
6766;1078;1;"Nakhon Phanom";"TH.73";"NULL";"Initialisation de la valeur «TH.73» pour la liste «75».";2009-07-29 00:00:00;1;1
6767;1078;1;"Prachin Buri";"TH.74";"NULL";"Initialisation de la valeur «TH.74» pour la liste «75».";2009-07-29 00:00:00;1;1
6768;1078;1;"Ubon Ratchathani";"TH.75";"NULL";"Initialisation de la valeur «TH.75» pour la liste «75».";2009-07-29 00:00:00;1;1
6769;1078;1;"Udon Thani";"TH.76";"NULL";"Initialisation de la valeur «TH.76» pour la liste «75».";2009-07-29 00:00:00;1;1
6770;1078;1;"Amnat Charoen";"TH.77";"NULL";"Initialisation de la valeur «TH.77» pour la liste «75».";2009-07-29 00:00:00;1;1
6771;1078;1;"Mukdahan";"TH.78";"NULL";"Initialisation de la valeur «TH.78» pour la liste «75».";2009-07-29 00:00:00;1;1
6772;1078;1;"Nong Bua Lamphu";"TH.79";"NULL";"Initialisation de la valeur «TH.79» pour la liste «75».";2009-07-29 00:00:00;1;1
6773;1078;1;"Sa Kaeo";"TH.80";"NULL";"Initialisation de la valeur «TH.80» pour la liste «75».";2009-07-29 00:00:00;1;1
6774;1078;1;"Kulyabskaya Oblast'";"TJ.00";"NULL";"Initialisation de la valeur «TJ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6775;1078;1;"Gorno-Badakhshan";"TJ.01";"NULL";"Initialisation de la valeur «TJ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6776;1078;1;"Khatlon";"TJ.02";"NULL";"Initialisation de la valeur «TJ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6777;1078;1;"Leninobod";"TJ.03";"NULL";"Initialisation de la valeur «TJ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6778;1078;1;"Region of Republican Subordination";"TJ.RR";"NULL";"Initialisation de la valeur «TJ.RR» pour la liste «75».";2009-07-29 00:00:00;1;1
6779;1078;1;"Tokelau (general)";"TK.00";"NULL";"Initialisation de la valeur «TK.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6780;1078;1;"Bobonaro";"TL.00";"NULL";"Initialisation de la valeur «TL.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6781;1078;1;"Turkmenistan (general)";"TM.00";"NULL";"Initialisation de la valeur «TM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6782;1078;1;"Ahal";"TM.01";"NULL";"Initialisation de la valeur «TM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6783;1078;1;"Balkan";"TM.02";"NULL";"Initialisation de la valeur «TM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6784;1078;1;"Daşoguz";"TM.03";"NULL";"Initialisation de la valeur «TM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6785;1078;1;"Lebap";"TM.04";"NULL";"Initialisation de la valeur «TM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6786;1078;1;"Mary";"TM.05";"NULL";"Initialisation de la valeur «TM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6787;1078;1;"Tunis al Janubiyah Wilayat";"TN.00";"NULL";"Initialisation de la valeur «TN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6788;1078;1;"Al Qaşrayn";"TN.02";"NULL";"Initialisation de la valeur «TN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6789;1078;1;"Al Qayrawān";"TN.03";"NULL";"Initialisation de la valeur «TN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6790;1078;1;"Jundūbah";"TN.06";"NULL";"Initialisation de la valeur «TN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6791;1078;1;"Kef";"TN.14";"NULL";"Initialisation de la valeur «TN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6792;1078;1;"Al Mahdīyah";"TN.15";"NULL";"Initialisation de la valeur «TN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6793;1078;1;"Al Munastīr";"TN.16";"NULL";"Initialisation de la valeur «TN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6794;1078;1;"Bājah";"TN.17";"NULL";"Initialisation de la valeur «TN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6795;1078;1;"Banzart";"TN.18";"NULL";"Initialisation de la valeur «TN.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6796;1078;1;"Nābul";"TN.19";"NULL";"Initialisation de la valeur «TN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6797;1078;1;"Silyānah";"TN.22";"NULL";"Initialisation de la valeur «TN.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6798;1078;1;"Sūsah";"TN.23";"NULL";"Initialisation de la valeur «TN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6799;1078;1;"(TS26)";"TN.26";"NULL";"Initialisation de la valeur «TN.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6800;1078;1;"Bin ‘Arūs";"TN.27";"NULL";"Initialisation de la valeur «TN.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6801;1078;1;"Madanīn";"TN.28";"NULL";"Initialisation de la valeur «TN.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6802;1078;1;"Qābis";"TN.29";"NULL";"Initialisation de la valeur «TN.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6803;1078;1;"Qafşah";"TN.30";"NULL";"Initialisation de la valeur «TN.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6804;1078;1;"Qibilī";"TN.31";"NULL";"Initialisation de la valeur «TN.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6805;1078;1;"Şafāqis";"TN.32";"NULL";"Initialisation de la valeur «TN.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6806;1078;1;"Sīdī Bū Zayd";"TN.33";"NULL";"Initialisation de la valeur «TN.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6807;1078;1;"Taţāwīn";"TN.34";"NULL";"Initialisation de la valeur «TN.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6808;1078;1;"Tawzar";"TN.35";"NULL";"Initialisation de la valeur «TN.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6809;1078;1;"Tūnis";"TN.36";"NULL";"Initialisation de la valeur «TN.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6810;1078;1;"Zaghwān";"TN.37";"NULL";"Initialisation de la valeur «TN.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6811;1078;1;"Ariana";"TN.38";"NULL";"Initialisation de la valeur «TN.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6812;1078;1;"Manouba";"TN.39";"NULL";"Initialisation de la valeur «TN.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6813;1078;1;"Tonga (general)";"TO.00";"NULL";"Initialisation de la valeur «TO.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6814;1078;1;"Ha‘apai";"TO.01";"NULL";"Initialisation de la valeur «TO.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6815;1078;1;"Tongatapu";"TO.02";"NULL";"Initialisation de la valeur «TO.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6816;1078;1;"Vava‘u";"TO.03";"NULL";"Initialisation de la valeur «TO.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6817;1078;1;"Turkey (general)";"TR.00";"NULL";"Initialisation de la valeur «TR.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6818;1078;1;"Adana Province";"TR.01";"NULL";"Initialisation de la valeur «TR.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6819;1078;1;"Adıyaman";"TR.02";"NULL";"Initialisation de la valeur «TR.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6820;1078;1;"Afyonkarahisar";"TR.03";"NULL";"Initialisation de la valeur «TR.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6821;1078;1;"Ağrı Province";"TR.04";"NULL";"Initialisation de la valeur «TR.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6822;1078;1;"Amasya Province";"TR.05";"NULL";"Initialisation de la valeur «TR.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6823;1078;1;"Antalya Province";"TR.07";"NULL";"Initialisation de la valeur «TR.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6824;1078;1;"Artvin Province";"TR.08";"NULL";"Initialisation de la valeur «TR.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6825;1078;1;"Aydın Province";"TR.09";"NULL";"Initialisation de la valeur «TR.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6826;1078;1;"Balıkesir Province";"TR.10";"NULL";"Initialisation de la valeur «TR.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6827;1078;1;"Bilecik Province";"TR.11";"NULL";"Initialisation de la valeur «TR.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6828;1078;1;"Bingöl Province";"TR.12";"NULL";"Initialisation de la valeur «TR.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6829;1078;1;"Bitlis Province";"TR.13";"NULL";"Initialisation de la valeur «TR.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6830;1078;1;"Bolu Province";"TR.14";"NULL";"Initialisation de la valeur «TR.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6831;1078;1;"Burdur Province";"TR.15";"NULL";"Initialisation de la valeur «TR.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6832;1078;1;"Bursa";"TR.16";"NULL";"Initialisation de la valeur «TR.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6833;1078;1;"Çanakkale Province";"TR.17";"NULL";"Initialisation de la valeur «TR.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6834;1078;1;"Çorum Province";"TR.19";"NULL";"Initialisation de la valeur «TR.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6835;1078;1;"Denizli Province";"TR.20";"NULL";"Initialisation de la valeur «TR.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6836;1078;1;"Diyarbakır";"TR.21";"NULL";"Initialisation de la valeur «TR.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6837;1078;1;"Edirne Province";"TR.22";"NULL";"Initialisation de la valeur «TR.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6838;1078;1;"Elazığ";"TR.23";"NULL";"Initialisation de la valeur «TR.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6839;1078;1;"Erzincan Province";"TR.24";"NULL";"Initialisation de la valeur «TR.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6840;1078;1;"Erzurum Province";"TR.25";"NULL";"Initialisation de la valeur «TR.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6841;1078;1;"Giresun Province";"TR.28";"NULL";"Initialisation de la valeur «TR.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6842;1078;1;"Hatay Province";"TR.31";"NULL";"Initialisation de la valeur «TR.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6843;1078;1;"Mersin Province";"TR.32";"NULL";"Initialisation de la valeur «TR.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6844;1078;1;"Isparta Province";"TR.33";"NULL";"Initialisation de la valeur «TR.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6845;1078;1;"Istanbul";"TR.34";"NULL";"Initialisation de la valeur «TR.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6846;1078;1;"İzmir";"TR.35";"NULL";"Initialisation de la valeur «TR.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6847;1078;1;"Kastamonu Province";"TR.37";"NULL";"Initialisation de la valeur «TR.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6848;1078;1;"Kayseri Province";"TR.38";"NULL";"Initialisation de la valeur «TR.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6849;1078;1;"Kırklareli Province";"TR.39";"NULL";"Initialisation de la valeur «TR.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6850;1078;1;"Kırşehir Province";"TR.40";"NULL";"Initialisation de la valeur «TR.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6851;1078;1;"Kocaeli Province";"TR.41";"NULL";"Initialisation de la valeur «TR.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6852;1078;1;"Kütahya Province";"TR.43";"NULL";"Initialisation de la valeur «TR.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6853;1078;1;"Malatya Province";"TR.44";"NULL";"Initialisation de la valeur «TR.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6854;1078;1;"Manisa Province";"TR.45";"NULL";"Initialisation de la valeur «TR.45» pour la liste «75».";2009-07-29 00:00:00;1;1
6855;1078;1;"Kahramanmaraş Province";"TR.46";"NULL";"Initialisation de la valeur «TR.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6856;1078;1;"Muğla Province";"TR.48";"NULL";"Initialisation de la valeur «TR.48» pour la liste «75».";2009-07-29 00:00:00;1;1
6857;1078;1;"Muş Province";"TR.49";"NULL";"Initialisation de la valeur «TR.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6858;1078;1;"Nevşehir";"TR.50";"NULL";"Initialisation de la valeur «TR.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6859;1078;1;"Ordu";"TR.52";"NULL";"Initialisation de la valeur «TR.52» pour la liste «75».";2009-07-29 00:00:00;1;1
6860;1078;1;"Rize";"TR.53";"NULL";"Initialisation de la valeur «TR.53» pour la liste «75».";2009-07-29 00:00:00;1;1
6861;1078;1;"Sakarya Province";"TR.54";"NULL";"Initialisation de la valeur «TR.54» pour la liste «75».";2009-07-29 00:00:00;1;1
6862;1078;1;"Samsun Province";"TR.55";"NULL";"Initialisation de la valeur «TR.55» pour la liste «75».";2009-07-29 00:00:00;1;1
6863;1078;1;"Sinop Province";"TR.57";"NULL";"Initialisation de la valeur «TR.57» pour la liste «75».";2009-07-29 00:00:00;1;1
6864;1078;1;"Sivas Province";"TR.58";"NULL";"Initialisation de la valeur «TR.58» pour la liste «75».";2009-07-29 00:00:00;1;1
6865;1078;1;"Tekirdağ Province";"TR.59";"NULL";"Initialisation de la valeur «TR.59» pour la liste «75».";2009-07-29 00:00:00;1;1
6866;1078;1;"Tokat";"TR.60";"NULL";"Initialisation de la valeur «TR.60» pour la liste «75».";2009-07-29 00:00:00;1;1
6867;1078;1;"Trabzon Province";"TR.61";"NULL";"Initialisation de la valeur «TR.61» pour la liste «75».";2009-07-29 00:00:00;1;1
6868;1078;1;"Tunceli Province";"TR.62";"NULL";"Initialisation de la valeur «TR.62» pour la liste «75».";2009-07-29 00:00:00;1;1
6869;1078;1;"Şanlıurfa Province";"TR.63";"NULL";"Initialisation de la valeur «TR.63» pour la liste «75».";2009-07-29 00:00:00;1;1
6870;1078;1;"Uşak Province";"TR.64";"NULL";"Initialisation de la valeur «TR.64» pour la liste «75».";2009-07-29 00:00:00;1;1
6871;1078;1;"Van Province";"TR.65";"NULL";"Initialisation de la valeur «TR.65» pour la liste «75».";2009-07-29 00:00:00;1;1
6872;1078;1;"Yozgat Province";"TR.66";"NULL";"Initialisation de la valeur «TR.66» pour la liste «75».";2009-07-29 00:00:00;1;1
6873;1078;1;"Ankara Province";"TR.68";"NULL";"Initialisation de la valeur «TR.68» pour la liste «75».";2009-07-29 00:00:00;1;1
6874;1078;1;"Gümüşhane";"TR.69";"NULL";"Initialisation de la valeur «TR.69» pour la liste «75».";2009-07-29 00:00:00;1;1
6875;1078;1;"Hakkâri Province";"TR.70";"NULL";"Initialisation de la valeur «TR.70» pour la liste «75».";2009-07-29 00:00:00;1;1
6876;1078;1;"Konya Province";"TR.71";"NULL";"Initialisation de la valeur «TR.71» pour la liste «75».";2009-07-29 00:00:00;1;1
6877;1078;1;"Mardin Province";"TR.72";"NULL";"Initialisation de la valeur «TR.72» pour la liste «75».";2009-07-29 00:00:00;1;1
6878;1078;1;"Niğde";"TR.73";"NULL";"Initialisation de la valeur «TR.73» pour la liste «75».";2009-07-29 00:00:00;1;1
6879;1078;1;"Siirt Province";"TR.74";"NULL";"Initialisation de la valeur «TR.74» pour la liste «75».";2009-07-29 00:00:00;1;1
6880;1078;1;"Aksaray Province";"TR.75";"NULL";"Initialisation de la valeur «TR.75» pour la liste «75».";2009-07-29 00:00:00;1;1
6881;1078;1;"Batman Province";"TR.76";"NULL";"Initialisation de la valeur «TR.76» pour la liste «75».";2009-07-29 00:00:00;1;1
6882;1078;1;"Bayburt";"TR.77";"NULL";"Initialisation de la valeur «TR.77» pour la liste «75».";2009-07-29 00:00:00;1;1
6883;1078;1;"Karaman Province";"TR.78";"NULL";"Initialisation de la valeur «TR.78» pour la liste «75».";2009-07-29 00:00:00;1;1
6884;1078;1;"Kırıkkale Province";"TR.79";"NULL";"Initialisation de la valeur «TR.79» pour la liste «75».";2009-07-29 00:00:00;1;1
6885;1078;1;"Şırnak Province";"TR.80";"NULL";"Initialisation de la valeur «TR.80» pour la liste «75».";2009-07-29 00:00:00;1;1
6886;1078;1;"Çankırı Province";"TR.82";"NULL";"Initialisation de la valeur «TR.82» pour la liste «75».";2009-07-29 00:00:00;1;1
6887;1078;1;"Gaziantep Province";"TR.83";"NULL";"Initialisation de la valeur «TR.83» pour la liste «75».";2009-07-29 00:00:00;1;1
6888;1078;1;"Kars";"TR.84";"NULL";"Initialisation de la valeur «TR.84» pour la liste «75».";2009-07-29 00:00:00;1;1
6889;1078;1;"Zonguldak";"TR.85";"NULL";"Initialisation de la valeur «TR.85» pour la liste «75».";2009-07-29 00:00:00;1;1
6890;1078;1;"Ardahan Province";"TR.86";"NULL";"Initialisation de la valeur «TR.86» pour la liste «75».";2009-07-29 00:00:00;1;1
6891;1078;1;"Bartın Province";"TR.87";"NULL";"Initialisation de la valeur «TR.87» pour la liste «75».";2009-07-29 00:00:00;1;1
6892;1078;1;"Iğdır Province";"TR.88";"NULL";"Initialisation de la valeur «TR.88» pour la liste «75».";2009-07-29 00:00:00;1;1
6893;1078;1;"Karabük";"TR.89";"NULL";"Initialisation de la valeur «TR.89» pour la liste «75».";2009-07-29 00:00:00;1;1
6894;1078;1;"Kilis Province";"TR.90";"NULL";"Initialisation de la valeur «TR.90» pour la liste «75».";2009-07-29 00:00:00;1;1
6895;1078;1;"Osmaniye Province";"TR.91";"NULL";"Initialisation de la valeur «TR.91» pour la liste «75».";2009-07-29 00:00:00;1;1
6896;1078;1;"Yalova Province";"TR.92";"NULL";"Initialisation de la valeur «TR.92» pour la liste «75».";2009-07-29 00:00:00;1;1
6897;1078;1;"Düzce";"TR.93";"NULL";"Initialisation de la valeur «TR.93» pour la liste «75».";2009-07-29 00:00:00;1;1
6898;1078;1;"Trinidad and Tobago (general)";"TT.00";"NULL";"Initialisation de la valeur «TT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6899;1078;1;"Arima";"TT.01";"NULL";"Initialisation de la valeur «TT.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6900;1078;1;"Caroni";"TT.02";"NULL";"Initialisation de la valeur «TT.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6901;1078;1;"Mayaro";"TT.03";"NULL";"Initialisation de la valeur «TT.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6902;1078;1;"Nariva";"TT.04";"NULL";"Initialisation de la valeur «TT.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6903;1078;1;"Port-of-Spain";"TT.05";"NULL";"Initialisation de la valeur «TT.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6904;1078;1;"Saint Andrew";"TT.06";"NULL";"Initialisation de la valeur «TT.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6905;1078;1;"Saint David";"TT.07";"NULL";"Initialisation de la valeur «TT.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6906;1078;1;"Saint George";"TT.08";"NULL";"Initialisation de la valeur «TT.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6907;1078;1;"Saint Patrick";"TT.09";"NULL";"Initialisation de la valeur «TT.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6908;1078;1;"San Fernando";"TT.10";"NULL";"Initialisation de la valeur «TT.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6909;1078;1;"Tobago";"TT.11";"NULL";"Initialisation de la valeur «TT.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6910;1078;1;"Victoria";"TT.12";"NULL";"Initialisation de la valeur «TT.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6911;1078;1;"Tuvalu (general)";"TV.00";"NULL";"Initialisation de la valeur «TV.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6912;1078;1;"Taiwan (general)";"TW.00";"NULL";"Initialisation de la valeur «TW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6913;1078;1;"Fu-chien";"TW.01";"NULL";"Initialisation de la valeur «TW.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6914;1078;1;"T'ai-pei";"TW.03";"NULL";"Initialisation de la valeur «TW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6915;1078;1;"Tanzania (general)";"TZ.00";"NULL";"Initialisation de la valeur «TZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6916;1078;1;"Arusha";"TZ.01";"NULL";"Initialisation de la valeur «TZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6917;1078;1;"Pwani";"TZ.02";"NULL";"Initialisation de la valeur «TZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6918;1078;1;"Dodoma";"TZ.03";"NULL";"Initialisation de la valeur «TZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6919;1078;1;"Iringa";"TZ.04";"NULL";"Initialisation de la valeur «TZ.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6920;1078;1;"Kigoma";"TZ.05";"NULL";"Initialisation de la valeur «TZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6921;1078;1;"Kilimanjaro";"TZ.06";"NULL";"Initialisation de la valeur «TZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6922;1078;1;"Lindi";"TZ.07";"NULL";"Initialisation de la valeur «TZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6923;1078;1;"Mara";"TZ.08";"NULL";"Initialisation de la valeur «TZ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6924;1078;1;"Mbeya";"TZ.09";"NULL";"Initialisation de la valeur «TZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6925;1078;1;"Morogoro";"TZ.10";"NULL";"Initialisation de la valeur «TZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6926;1078;1;"Mtwara";"TZ.11";"NULL";"Initialisation de la valeur «TZ.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6927;1078;1;"Mwanza";"TZ.12";"NULL";"Initialisation de la valeur «TZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6928;1078;1;"Pemba North";"TZ.13";"NULL";"Initialisation de la valeur «TZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6929;1078;1;"Ruvuma";"TZ.14";"NULL";"Initialisation de la valeur «TZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6930;1078;1;"Shinyanga";"TZ.15";"NULL";"Initialisation de la valeur «TZ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6931;1078;1;"Singida";"TZ.16";"NULL";"Initialisation de la valeur «TZ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6932;1078;1;"Tabora";"TZ.17";"NULL";"Initialisation de la valeur «TZ.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6933;1078;1;"Tanga";"TZ.18";"NULL";"Initialisation de la valeur «TZ.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6934;1078;1;"Kagera";"TZ.19";"NULL";"Initialisation de la valeur «TZ.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6935;1078;1;"Pemba South";"TZ.20";"NULL";"Initialisation de la valeur «TZ.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6936;1078;1;"Zanzibar Central/South";"TZ.21";"NULL";"Initialisation de la valeur «TZ.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6937;1078;1;"Zanzibar North";"TZ.22";"NULL";"Initialisation de la valeur «TZ.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6938;1078;1;"Dar es Salaam";"TZ.23";"NULL";"Initialisation de la valeur «TZ.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6939;1078;1;"Rukwa";"TZ.24";"NULL";"Initialisation de la valeur «TZ.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6940;1078;1;"Zanzibar Urban/West";"TZ.25";"NULL";"Initialisation de la valeur «TZ.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6941;1078;1;"Arusha";"TZ.26";"NULL";"Initialisation de la valeur «TZ.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6942;1078;1;"Manyara";"TZ.27";"NULL";"Initialisation de la valeur «TZ.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6943;1078;1;"Ukraine (general)";"UA.00";"NULL";"Initialisation de la valeur «UA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6944;1078;1;"Cherkas'ka Oblast'";"UA.01";"NULL";"Initialisation de la valeur «UA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
6945;1078;1;"Chernihivs'ka Oblast'";"UA.02";"NULL";"Initialisation de la valeur «UA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
6946;1078;1;"Chernivets'ka Oblast'";"UA.03";"NULL";"Initialisation de la valeur «UA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
6947;1078;1;"Dnipropetrovs'ka Oblast'";"UA.04";"NULL";"Initialisation de la valeur «UA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
6948;1078;1;"Donets'ka Oblast'";"UA.05";"NULL";"Initialisation de la valeur «UA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
6949;1078;1;"Ivano-Frankivs'ka Oblast'";"UA.06";"NULL";"Initialisation de la valeur «UA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
6950;1078;1;"Kharkivs'ka Oblast'";"UA.07";"NULL";"Initialisation de la valeur «UA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
6951;1078;1;"Kherson Oblast";"UA.08";"NULL";"Initialisation de la valeur «UA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
6952;1078;1;"Khmel'nyts'ka Oblast'";"UA.09";"NULL";"Initialisation de la valeur «UA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
6953;1078;1;"Kirovohrads'ka Oblast'";"UA.10";"NULL";"Initialisation de la valeur «UA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
6954;1078;1;"Avtonomna Respublika Krym";"UA.11";"NULL";"Initialisation de la valeur «UA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
6955;1078;1;"Misto Kyyiv";"UA.12";"NULL";"Initialisation de la valeur «UA.12» pour la liste «75».";2009-07-29 00:00:00;1;1
6956;1078;1;"Kiev Oblast";"UA.13";"NULL";"Initialisation de la valeur «UA.13» pour la liste «75».";2009-07-29 00:00:00;1;1
6957;1078;1;"Luhans'ka Oblast'";"UA.14";"NULL";"Initialisation de la valeur «UA.14» pour la liste «75».";2009-07-29 00:00:00;1;1
6958;1078;1;"L'vivs'ka Oblast'";"UA.15";"NULL";"Initialisation de la valeur «UA.15» pour la liste «75».";2009-07-29 00:00:00;1;1
6959;1078;1;"Mykolayivs'ka Oblast'";"UA.16";"NULL";"Initialisation de la valeur «UA.16» pour la liste «75».";2009-07-29 00:00:00;1;1
6960;1078;1;"Odessa Oblast";"UA.17";"NULL";"Initialisation de la valeur «UA.17» pour la liste «75».";2009-07-29 00:00:00;1;1
6961;1078;1;"Poltava Oblast";"UA.18";"NULL";"Initialisation de la valeur «UA.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6962;1078;1;"Rivnens'ka Oblast'";"UA.19";"NULL";"Initialisation de la valeur «UA.19» pour la liste «75».";2009-07-29 00:00:00;1;1
6963;1078;1;"Misto Sevastopol";"UA.20";"NULL";"Initialisation de la valeur «UA.20» pour la liste «75».";2009-07-29 00:00:00;1;1
6964;1078;1;"Sumy Oblast";"UA.21";"NULL";"Initialisation de la valeur «UA.21» pour la liste «75».";2009-07-29 00:00:00;1;1
6965;1078;1;"Ternopil's'ka Oblast'";"UA.22";"NULL";"Initialisation de la valeur «UA.22» pour la liste «75».";2009-07-29 00:00:00;1;1
6966;1078;1;"Vinnyts'ka Oblast'";"UA.23";"NULL";"Initialisation de la valeur «UA.23» pour la liste «75».";2009-07-29 00:00:00;1;1
6967;1078;1;"Volyns'ka Oblast'";"UA.24";"NULL";"Initialisation de la valeur «UA.24» pour la liste «75».";2009-07-29 00:00:00;1;1
6968;1078;1;"Zakarpats'ka Oblast'";"UA.25";"NULL";"Initialisation de la valeur «UA.25» pour la liste «75».";2009-07-29 00:00:00;1;1
6969;1078;1;"Zaporiz'ka Oblast'";"UA.26";"NULL";"Initialisation de la valeur «UA.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6970;1078;1;"Zhytomyrs'ka Oblast'";"UA.27";"NULL";"Initialisation de la valeur «UA.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6971;1078;1;"Busoga Province";"UG.00";"NULL";"Initialisation de la valeur «UG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
6972;1078;1;"Kampala District";"UG.18";"NULL";"Initialisation de la valeur «UG.18» pour la liste «75».";2009-07-29 00:00:00;1;1
6973;1078;1;"Apac";"UG.26";"NULL";"Initialisation de la valeur «UG.26» pour la liste «75».";2009-07-29 00:00:00;1;1
6974;1078;1;"Arua";"UG.27";"NULL";"Initialisation de la valeur «UG.27» pour la liste «75».";2009-07-29 00:00:00;1;1
6975;1078;1;"Bundibugyo";"UG.28";"NULL";"Initialisation de la valeur «UG.28» pour la liste «75».";2009-07-29 00:00:00;1;1
6976;1078;1;"Bushenyi";"UG.29";"NULL";"Initialisation de la valeur «UG.29» pour la liste «75».";2009-07-29 00:00:00;1;1
6977;1078;1;"Gulu";"UG.30";"NULL";"Initialisation de la valeur «UG.30» pour la liste «75».";2009-07-29 00:00:00;1;1
6978;1078;1;"Hoima";"UG.31";"NULL";"Initialisation de la valeur «UG.31» pour la liste «75».";2009-07-29 00:00:00;1;1
6979;1078;1;"Iganga";"UG.32";"NULL";"Initialisation de la valeur «UG.32» pour la liste «75».";2009-07-29 00:00:00;1;1
6980;1078;1;"Jinja";"UG.33";"NULL";"Initialisation de la valeur «UG.33» pour la liste «75».";2009-07-29 00:00:00;1;1
6981;1078;1;"Kabale";"UG.34";"NULL";"Initialisation de la valeur «UG.34» pour la liste «75».";2009-07-29 00:00:00;1;1
6982;1078;1;"Kabarole";"UG.35";"NULL";"Initialisation de la valeur «UG.35» pour la liste «75».";2009-07-29 00:00:00;1;1
6983;1078;1;"Kalangala";"UG.36";"NULL";"Initialisation de la valeur «UG.36» pour la liste «75».";2009-07-29 00:00:00;1;1
6984;1078;1;"Kampala";"UG.37";"NULL";"Initialisation de la valeur «UG.37» pour la liste «75».";2009-07-29 00:00:00;1;1
6985;1078;1;"Kamuli";"UG.38";"NULL";"Initialisation de la valeur «UG.38» pour la liste «75».";2009-07-29 00:00:00;1;1
6986;1078;1;"Kapchorwa";"UG.39";"NULL";"Initialisation de la valeur «UG.39» pour la liste «75».";2009-07-29 00:00:00;1;1
6987;1078;1;"Kasese";"UG.40";"NULL";"Initialisation de la valeur «UG.40» pour la liste «75».";2009-07-29 00:00:00;1;1
6988;1078;1;"Kibale";"UG.41";"NULL";"Initialisation de la valeur «UG.41» pour la liste «75».";2009-07-29 00:00:00;1;1
6989;1078;1;"Kiboga";"UG.42";"NULL";"Initialisation de la valeur «UG.42» pour la liste «75».";2009-07-29 00:00:00;1;1
6990;1078;1;"Kisoro";"UG.43";"NULL";"Initialisation de la valeur «UG.43» pour la liste «75».";2009-07-29 00:00:00;1;1
6991;1078;1;"Kitgum";"UG.44";"NULL";"Initialisation de la valeur «UG.44» pour la liste «75».";2009-07-29 00:00:00;1;1
6992;1078;1;"Kotido";"UG.45";"NULL";"Initialisation de la valeur «UG.45» pour la liste «75».";2009-07-29 00:00:00;1;1
6993;1078;1;"Kumi";"UG.46";"NULL";"Initialisation de la valeur «UG.46» pour la liste «75».";2009-07-29 00:00:00;1;1
6994;1078;1;"Lira";"UG.47";"NULL";"Initialisation de la valeur «UG.47» pour la liste «75».";2009-07-29 00:00:00;1;1
6995;1078;1;"Luwero";"UG.48";"NULL";"Initialisation de la valeur «UG.48» pour la liste «75».";2009-07-29 00:00:00;1;1
6996;1078;1;"Masaka";"UG.49";"NULL";"Initialisation de la valeur «UG.49» pour la liste «75».";2009-07-29 00:00:00;1;1
6997;1078;1;"Masindi";"UG.50";"NULL";"Initialisation de la valeur «UG.50» pour la liste «75».";2009-07-29 00:00:00;1;1
6998;1078;1;"Mbale";"UG.51";"NULL";"Initialisation de la valeur «UG.51» pour la liste «75».";2009-07-29 00:00:00;1;1
6999;1078;1;"Mbarara";"UG.52";"NULL";"Initialisation de la valeur «UG.52» pour la liste «75».";2009-07-29 00:00:00;1;1
7000;1078;1;"Moroto";"UG.53";"NULL";"Initialisation de la valeur «UG.53» pour la liste «75».";2009-07-29 00:00:00;1;1
7001;1078;1;"Moyo";"UG.54";"NULL";"Initialisation de la valeur «UG.54» pour la liste «75».";2009-07-29 00:00:00;1;1
7002;1078;1;"Mpigi";"UG.55";"NULL";"Initialisation de la valeur «UG.55» pour la liste «75».";2009-07-29 00:00:00;1;1
7003;1078;1;"Mubende";"UG.56";"NULL";"Initialisation de la valeur «UG.56» pour la liste «75».";2009-07-29 00:00:00;1;1
7004;1078;1;"Mukuno";"UG.57";"NULL";"Initialisation de la valeur «UG.57» pour la liste «75».";2009-07-29 00:00:00;1;1
7005;1078;1;"Nebbi";"UG.58";"NULL";"Initialisation de la valeur «UG.58» pour la liste «75».";2009-07-29 00:00:00;1;1
7006;1078;1;"Ntungamo";"UG.59";"NULL";"Initialisation de la valeur «UG.59» pour la liste «75».";2009-07-29 00:00:00;1;1
7007;1078;1;"Pallisa";"UG.60";"NULL";"Initialisation de la valeur «UG.60» pour la liste «75».";2009-07-29 00:00:00;1;1
7008;1078;1;"Rakai";"UG.61";"NULL";"Initialisation de la valeur «UG.61» pour la liste «75».";2009-07-29 00:00:00;1;1
7009;1078;1;"Rukungiri";"UG.62";"NULL";"Initialisation de la valeur «UG.62» pour la liste «75».";2009-07-29 00:00:00;1;1
7010;1078;1;"Soroti";"UG.63";"NULL";"Initialisation de la valeur «UG.63» pour la liste «75».";2009-07-29 00:00:00;1;1
7011;1078;1;"Tororo";"UG.64";"NULL";"Initialisation de la valeur «UG.64» pour la liste «75».";2009-07-29 00:00:00;1;1
7012;1078;1;"Adjumani";"UG.65";"NULL";"Initialisation de la valeur «UG.65» pour la liste «75».";2009-07-29 00:00:00;1;1
7013;1078;1;"Bugiri";"UG.66";"NULL";"Initialisation de la valeur «UG.66» pour la liste «75».";2009-07-29 00:00:00;1;1
7014;1078;1;"Busia";"UG.67";"NULL";"Initialisation de la valeur «UG.67» pour la liste «75».";2009-07-29 00:00:00;1;1
7015;1078;1;"Iganga";"UG.68";"NULL";"Initialisation de la valeur «UG.68» pour la liste «75».";2009-07-29 00:00:00;1;1
7016;1078;1;"Katakwi";"UG.69";"NULL";"Initialisation de la valeur «UG.69» pour la liste «75».";2009-07-29 00:00:00;1;1
7017;1078;1;"Luwero";"UG.70";"NULL";"Initialisation de la valeur «UG.70» pour la liste «75».";2009-07-29 00:00:00;1;1
7018;1078;1;"Masaka";"UG.71";"NULL";"Initialisation de la valeur «UG.71» pour la liste «75».";2009-07-29 00:00:00;1;1
7019;1078;1;"Moyo";"UG.72";"NULL";"Initialisation de la valeur «UG.72» pour la liste «75».";2009-07-29 00:00:00;1;1
7020;1078;1;"Nakasongola";"UG.73";"NULL";"Initialisation de la valeur «UG.73» pour la liste «75».";2009-07-29 00:00:00;1;1
7021;1078;1;"Sembabule";"UG.74";"NULL";"Initialisation de la valeur «UG.74» pour la liste «75».";2009-07-29 00:00:00;1;1
7022;1078;1;"Soroti";"UG.75";"NULL";"Initialisation de la valeur «UG.75» pour la liste «75».";2009-07-29 00:00:00;1;1
7023;1078;1;"Tororo";"UG.76";"NULL";"Initialisation de la valeur «UG.76» pour la liste «75».";2009-07-29 00:00:00;1;1
7024;1078;1;"Arua";"UG.77";"NULL";"Initialisation de la valeur «UG.77» pour la liste «75».";2009-07-29 00:00:00;1;1
7025;1078;1;"Iganga";"UG.78";"NULL";"Initialisation de la valeur «UG.78» pour la liste «75».";2009-07-29 00:00:00;1;1
7026;1078;1;"Kabarole";"UG.79";"NULL";"Initialisation de la valeur «UG.79» pour la liste «75».";2009-07-29 00:00:00;1;1
7027;1078;1;"Kaberamaido";"UG.80";"NULL";"Initialisation de la valeur «UG.80» pour la liste «75».";2009-07-29 00:00:00;1;1
7028;1078;1;"Kamwenge";"UG.81";"NULL";"Initialisation de la valeur «UG.81» pour la liste «75».";2009-07-29 00:00:00;1;1
7029;1078;1;"Kanungu";"UG.82";"NULL";"Initialisation de la valeur «UG.82» pour la liste «75».";2009-07-29 00:00:00;1;1
7030;1078;1;"Kayunga";"UG.83";"NULL";"Initialisation de la valeur «UG.83» pour la liste «75».";2009-07-29 00:00:00;1;1
7031;1078;1;"Kitgum";"UG.84";"NULL";"Initialisation de la valeur «UG.84» pour la liste «75».";2009-07-29 00:00:00;1;1
7032;1078;1;"Kyenjojo";"UG.85";"NULL";"Initialisation de la valeur «UG.85» pour la liste «75».";2009-07-29 00:00:00;1;1
7033;1078;1;"Mayuge";"UG.86";"NULL";"Initialisation de la valeur «UG.86» pour la liste «75».";2009-07-29 00:00:00;1;1
7034;1078;1;"Mbale";"UG.87";"NULL";"Initialisation de la valeur «UG.87» pour la liste «75».";2009-07-29 00:00:00;1;1
7035;1078;1;"Moroto";"UG.88";"NULL";"Initialisation de la valeur «UG.88» pour la liste «75».";2009-07-29 00:00:00;1;1
7036;1078;1;"Mpigi";"UG.89";"NULL";"Initialisation de la valeur «UG.89» pour la liste «75».";2009-07-29 00:00:00;1;1
7037;1078;1;"Mukono";"UG.90";"NULL";"Initialisation de la valeur «UG.90» pour la liste «75».";2009-07-29 00:00:00;1;1
7038;1078;1;"Nakapiripirit";"UG.91";"NULL";"Initialisation de la valeur «UG.91» pour la liste «75».";2009-07-29 00:00:00;1;1
7039;1078;1;"Pader";"UG.92";"NULL";"Initialisation de la valeur «UG.92» pour la liste «75».";2009-07-29 00:00:00;1;1
7040;1078;1;"Rukungiri";"UG.93";"NULL";"Initialisation de la valeur «UG.93» pour la liste «75».";2009-07-29 00:00:00;1;1
7041;1078;1;"Sironko";"UG.94";"NULL";"Initialisation de la valeur «UG.94» pour la liste «75».";2009-07-29 00:00:00;1;1
7042;1078;1;"Soroti";"UG.95";"NULL";"Initialisation de la valeur «UG.95» pour la liste «75».";2009-07-29 00:00:00;1;1
7043;1078;1;"Wakiso";"UG.96";"NULL";"Initialisation de la valeur «UG.96» pour la liste «75».";2009-07-29 00:00:00;1;1
7044;1078;1;"Yumbe";"UG.97";"NULL";"Initialisation de la valeur «UG.97» pour la liste «75».";2009-07-29 00:00:00;1;1
7045;1078;1;"United States (general)";"US.00";"NULL";"Initialisation de la valeur «US.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7046;1078;1;"Alaska";"US.AK";"NULL";"Initialisation de la valeur «US.AK» pour la liste «75».";2009-07-29 00:00:00;1;1
7047;1078;1;"Alabama";"US.AL";"NULL";"Initialisation de la valeur «US.AL» pour la liste «75».";2009-07-29 00:00:00;1;1
7048;1078;1;"Arkansas";"US.AR";"NULL";"Initialisation de la valeur «US.AR» pour la liste «75».";2009-07-29 00:00:00;1;1
7049;1078;1;"Arizona";"US.AZ";"NULL";"Initialisation de la valeur «US.AZ» pour la liste «75».";2009-07-29 00:00:00;1;1
7050;1078;1;"California";"US.CA";"NULL";"Initialisation de la valeur «US.CA» pour la liste «75».";2009-07-29 00:00:00;1;1
7051;1078;1;"Colorado";"US.CO";"NULL";"Initialisation de la valeur «US.CO» pour la liste «75».";2009-07-29 00:00:00;1;1
7052;1078;1;"Connecticut";"US.CT";"NULL";"Initialisation de la valeur «US.CT» pour la liste «75».";2009-07-29 00:00:00;1;1
7053;1078;1;"Washington, D.C.";"US.DC";"NULL";"Initialisation de la valeur «US.DC» pour la liste «75».";2009-07-29 00:00:00;1;1
7054;1078;1;"Delaware";"US.DE";"NULL";"Initialisation de la valeur «US.DE» pour la liste «75».";2009-07-29 00:00:00;1;1
7055;1078;1;"Florida";"US.FL";"NULL";"Initialisation de la valeur «US.FL» pour la liste «75».";2009-07-29 00:00:00;1;1
7056;1078;1;"Georgia";"US.GA";"NULL";"Initialisation de la valeur «US.GA» pour la liste «75».";2009-07-29 00:00:00;1;1
7057;1078;1;"Hawaii";"US.HI";"NULL";"Initialisation de la valeur «US.HI» pour la liste «75».";2009-07-29 00:00:00;1;1
7058;1078;1;"Iowa";"US.IA";"NULL";"Initialisation de la valeur «US.IA» pour la liste «75».";2009-07-29 00:00:00;1;1
7059;1078;1;"Idaho";"US.ID";"NULL";"Initialisation de la valeur «US.ID» pour la liste «75».";2009-07-29 00:00:00;1;1
7060;1078;1;"Illinois";"US.IL";"NULL";"Initialisation de la valeur «US.IL» pour la liste «75».";2009-07-29 00:00:00;1;1
7061;1078;1;"Indiana";"US.IN";"NULL";"Initialisation de la valeur «US.IN» pour la liste «75».";2009-07-29 00:00:00;1;1
7062;1078;1;"Kansas";"US.KS";"NULL";"Initialisation de la valeur «US.KS» pour la liste «75».";2009-07-29 00:00:00;1;1
7063;1078;1;"Kentucky";"US.KY";"NULL";"Initialisation de la valeur «US.KY» pour la liste «75».";2009-07-29 00:00:00;1;1
7064;1078;1;"Louisiana";"US.LA";"NULL";"Initialisation de la valeur «US.LA» pour la liste «75».";2009-07-29 00:00:00;1;1
7065;1078;1;"Massachusetts";"US.MA";"NULL";"Initialisation de la valeur «US.MA» pour la liste «75».";2009-07-29 00:00:00;1;1
7066;1078;1;"Maryland";"US.MD";"NULL";"Initialisation de la valeur «US.MD» pour la liste «75».";2009-07-29 00:00:00;1;1
7067;1078;1;"Maine";"US.ME";"NULL";"Initialisation de la valeur «US.ME» pour la liste «75».";2009-07-29 00:00:00;1;1
7068;1078;1;"Michigan";"US.MI";"NULL";"Initialisation de la valeur «US.MI» pour la liste «75».";2009-07-29 00:00:00;1;1
7069;1078;1;"Minnesota";"US.MN";"NULL";"Initialisation de la valeur «US.MN» pour la liste «75».";2009-07-29 00:00:00;1;1
7070;1078;1;"Missouri";"US.MO";"NULL";"Initialisation de la valeur «US.MO» pour la liste «75».";2009-07-29 00:00:00;1;1
7071;1078;1;"Mississippi";"US.MS";"NULL";"Initialisation de la valeur «US.MS» pour la liste «75».";2009-07-29 00:00:00;1;1
7072;1078;1;"Montana";"US.MT";"NULL";"Initialisation de la valeur «US.MT» pour la liste «75».";2009-07-29 00:00:00;1;1
7073;1078;1;"North Carolina";"US.NC";"NULL";"Initialisation de la valeur «US.NC» pour la liste «75».";2009-07-29 00:00:00;1;1
7074;1078;1;"North Dakota";"US.ND";"NULL";"Initialisation de la valeur «US.ND» pour la liste «75».";2009-07-29 00:00:00;1;1
7075;1078;1;"Nebraska";"US.NE";"NULL";"Initialisation de la valeur «US.NE» pour la liste «75».";2009-07-29 00:00:00;1;1
7076;1078;1;"New Hampshire";"US.NH";"NULL";"Initialisation de la valeur «US.NH» pour la liste «75».";2009-07-29 00:00:00;1;1
7077;1078;1;"New Jersey";"US.NJ";"NULL";"Initialisation de la valeur «US.NJ» pour la liste «75».";2009-07-29 00:00:00;1;1
7078;1078;1;"New Mexico";"US.NM";"NULL";"Initialisation de la valeur «US.NM» pour la liste «75».";2009-07-29 00:00:00;1;1
7079;1078;1;"Nevada";"US.NV";"NULL";"Initialisation de la valeur «US.NV» pour la liste «75».";2009-07-29 00:00:00;1;1
7080;1078;1;"New York";"US.NY";"NULL";"Initialisation de la valeur «US.NY» pour la liste «75».";2009-07-29 00:00:00;1;1
7081;1078;1;"Ohio";"US.OH";"NULL";"Initialisation de la valeur «US.OH» pour la liste «75».";2009-07-29 00:00:00;1;1
7082;1078;1;"Oklahoma";"US.OK";"NULL";"Initialisation de la valeur «US.OK» pour la liste «75».";2009-07-29 00:00:00;1;1
7083;1078;1;"Oregon";"US.OR";"NULL";"Initialisation de la valeur «US.OR» pour la liste «75».";2009-07-29 00:00:00;1;1
7084;1078;1;"Pennsylvania";"US.PA";"NULL";"Initialisation de la valeur «US.PA» pour la liste «75».";2009-07-29 00:00:00;1;1
7085;1078;1;"Rhode Island";"US.RI";"NULL";"Initialisation de la valeur «US.RI» pour la liste «75».";2009-07-29 00:00:00;1;1
7086;1078;1;"South Carolina";"US.SC";"NULL";"Initialisation de la valeur «US.SC» pour la liste «75».";2009-07-29 00:00:00;1;1
7087;1078;1;"South Dakota";"US.SD";"NULL";"Initialisation de la valeur «US.SD» pour la liste «75».";2009-07-29 00:00:00;1;1
7088;1078;1;"Tennessee";"US.TN";"NULL";"Initialisation de la valeur «US.TN» pour la liste «75».";2009-07-29 00:00:00;1;1
7089;1078;1;"Texas";"US.TX";"NULL";"Initialisation de la valeur «US.TX» pour la liste «75».";2009-07-29 00:00:00;1;1
7090;1078;1;"Utah";"US.UT";"NULL";"Initialisation de la valeur «US.UT» pour la liste «75».";2009-07-29 00:00:00;1;1
7091;1078;1;"Virginia";"US.VA";"NULL";"Initialisation de la valeur «US.VA» pour la liste «75».";2009-07-29 00:00:00;1;1
7092;1078;1;"Vermont";"US.VT";"NULL";"Initialisation de la valeur «US.VT» pour la liste «75».";2009-07-29 00:00:00;1;1
7093;1078;1;"Washington";"US.WA";"NULL";"Initialisation de la valeur «US.WA» pour la liste «75».";2009-07-29 00:00:00;1;1
7094;1078;1;"Wisconsin";"US.WI";"NULL";"Initialisation de la valeur «US.WI» pour la liste «75».";2009-07-29 00:00:00;1;1
7095;1078;1;"West Virginia";"US.WV";"NULL";"Initialisation de la valeur «US.WV» pour la liste «75».";2009-07-29 00:00:00;1;1
7096;1078;1;"Wyoming";"US.WY";"NULL";"Initialisation de la valeur «US.WY» pour la liste «75».";2009-07-29 00:00:00;1;1
7097;1078;1;"Uruguay (general)";"UY.00";"NULL";"Initialisation de la valeur «UY.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7098;1078;1;"Artigas Department";"UY.01";"NULL";"Initialisation de la valeur «UY.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7099;1078;1;"Canelones Department";"UY.02";"NULL";"Initialisation de la valeur «UY.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7100;1078;1;"Cerro Largo Department";"UY.03";"NULL";"Initialisation de la valeur «UY.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7101;1078;1;"Colonia Department";"UY.04";"NULL";"Initialisation de la valeur «UY.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7102;1078;1;"Durazno";"UY.05";"NULL";"Initialisation de la valeur «UY.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7103;1078;1;"Flores";"UY.06";"NULL";"Initialisation de la valeur «UY.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7104;1078;1;"Florida Department";"UY.07";"NULL";"Initialisation de la valeur «UY.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7105;1078;1;"Lavalleja Department";"UY.08";"NULL";"Initialisation de la valeur «UY.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7106;1078;1;"Maldonado Department";"UY.09";"NULL";"Initialisation de la valeur «UY.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7107;1078;1;"Montevideo";"UY.10";"NULL";"Initialisation de la valeur «UY.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7108;1078;1;"Paysandú";"UY.11";"NULL";"Initialisation de la valeur «UY.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7109;1078;1;"Río Negro";"UY.12";"NULL";"Initialisation de la valeur «UY.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7110;1078;1;"Rivera";"UY.13";"NULL";"Initialisation de la valeur «UY.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7111;1078;1;"Rocha";"UY.14";"NULL";"Initialisation de la valeur «UY.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7112;1078;1;"Salto";"UY.15";"NULL";"Initialisation de la valeur «UY.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7113;1078;1;"San José";"UY.16";"NULL";"Initialisation de la valeur «UY.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7114;1078;1;"Soriano Department";"UY.17";"NULL";"Initialisation de la valeur «UY.17» pour la liste «75».";2009-07-29 00:00:00;1;1
7115;1078;1;"Tacuarembó";"UY.18";"NULL";"Initialisation de la valeur «UY.18» pour la liste «75».";2009-07-29 00:00:00;1;1
7116;1078;1;"Treinta y Tres";"UY.19";"NULL";"Initialisation de la valeur «UY.19» pour la liste «75».";2009-07-29 00:00:00;1;1
7117;1078;1;"Uzbekistan (general)";"UZ.00";"NULL";"Initialisation de la valeur «UZ.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7118;1078;1;"Andijon";"UZ.01";"NULL";"Initialisation de la valeur «UZ.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7119;1078;1;"Buxoro";"UZ.02";"NULL";"Initialisation de la valeur «UZ.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7120;1078;1;"Farg ona";"UZ.03";"NULL";"Initialisation de la valeur «UZ.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7121;1078;1;"Xorazm";"UZ.05";"NULL";"Initialisation de la valeur «UZ.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7122;1078;1;"Namangan";"UZ.06";"NULL";"Initialisation de la valeur «UZ.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7123;1078;1;"Navoiy";"UZ.07";"NULL";"Initialisation de la valeur «UZ.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7124;1078;1;"Qashqadaryo";"UZ.08";"NULL";"Initialisation de la valeur «UZ.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7125;1078;1;"Karakalpakstan";"UZ.09";"NULL";"Initialisation de la valeur «UZ.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7126;1078;1;"Samarqand";"UZ.10";"NULL";"Initialisation de la valeur «UZ.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7127;1078;1;"Surxondaryo";"UZ.12";"NULL";"Initialisation de la valeur «UZ.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7128;1078;1;"Toshkent Shahri";"UZ.13";"NULL";"Initialisation de la valeur «UZ.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7129;1078;1;"Toshkent";"UZ.14";"NULL";"Initialisation de la valeur «UZ.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7130;1078;1;"Jizzax";"UZ.15";"NULL";"Initialisation de la valeur «UZ.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7131;1078;1;"Sirdaryo";"UZ.16";"NULL";"Initialisation de la valeur «UZ.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7132;1078;1;"Vatican City (general)";"VA.00";"NULL";"Initialisation de la valeur «VA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7133;1078;1;"Saint Vincent and The Grenadines (general)";"VC.00";"NULL";"Initialisation de la valeur «VC.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7134;1078;1;"Charlotte";"VC.01";"NULL";"Initialisation de la valeur «VC.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7135;1078;1;"Saint Andrew";"VC.02";"NULL";"Initialisation de la valeur «VC.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7136;1078;1;"Saint David";"VC.03";"NULL";"Initialisation de la valeur «VC.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7137;1078;1;"Saint George";"VC.04";"NULL";"Initialisation de la valeur «VC.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7138;1078;1;"Saint Patrick";"VC.05";"NULL";"Initialisation de la valeur «VC.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7139;1078;1;"Grenadines";"VC.06";"NULL";"Initialisation de la valeur «VC.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7140;1078;1;"Venezuela (general)";"VE.00";"NULL";"Initialisation de la valeur «VE.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7141;1078;1;"Amazonas";"VE.01";"NULL";"Initialisation de la valeur «VE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7142;1078;1;"Anzoátegui";"VE.02";"NULL";"Initialisation de la valeur «VE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7143;1078;1;"Apure";"VE.03";"NULL";"Initialisation de la valeur «VE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7144;1078;1;"Aragua";"VE.04";"NULL";"Initialisation de la valeur «VE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7145;1078;1;"Barinas";"VE.05";"NULL";"Initialisation de la valeur «VE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7146;1078;1;"Bolívar";"VE.06";"NULL";"Initialisation de la valeur «VE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7147;1078;1;"Carabobo";"VE.07";"NULL";"Initialisation de la valeur «VE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7148;1078;1;"Cojedes";"VE.08";"NULL";"Initialisation de la valeur «VE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7149;1078;1;"Delta Amacuro";"VE.09";"NULL";"Initialisation de la valeur «VE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7150;1078;1;"Distrito Federal";"VE.10";"NULL";"Initialisation de la valeur «VE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7151;1078;1;"Falcón";"VE.11";"NULL";"Initialisation de la valeur «VE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7152;1078;1;"Guárico";"VE.12";"NULL";"Initialisation de la valeur «VE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7153;1078;1;"Lara";"VE.13";"NULL";"Initialisation de la valeur «VE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7154;1078;1;"Mérida";"VE.14";"NULL";"Initialisation de la valeur «VE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7155;1078;1;"Miranda";"VE.15";"NULL";"Initialisation de la valeur «VE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7156;1078;1;"Monagas";"VE.16";"NULL";"Initialisation de la valeur «VE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7157;1078;1;"Isla Margarita";"VE.17";"NULL";"Initialisation de la valeur «VE.17» pour la liste «75».";2009-07-29 00:00:00;1;1
7158;1078;1;"Portuguesa";"VE.18";"NULL";"Initialisation de la valeur «VE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
7159;1078;1;"Sucre";"VE.19";"NULL";"Initialisation de la valeur «VE.19» pour la liste «75».";2009-07-29 00:00:00;1;1
7160;1078;1;"Táchira";"VE.20";"NULL";"Initialisation de la valeur «VE.20» pour la liste «75».";2009-07-29 00:00:00;1;1
7161;1078;1;"Trujillo";"VE.21";"NULL";"Initialisation de la valeur «VE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
7162;1078;1;"Yaracuy";"VE.22";"NULL";"Initialisation de la valeur «VE.22» pour la liste «75».";2009-07-29 00:00:00;1;1
7163;1078;1;"Zulia";"VE.23";"NULL";"Initialisation de la valeur «VE.23» pour la liste «75».";2009-07-29 00:00:00;1;1
7164;1078;1;"Dependencias Federales";"VE.24";"NULL";"Initialisation de la valeur «VE.24» pour la liste «75».";2009-07-29 00:00:00;1;1
7165;1078;1;"Distrito Federal";"VE.25";"NULL";"Initialisation de la valeur «VE.25» pour la liste «75».";2009-07-29 00:00:00;1;1
7166;1078;1;"Vargas";"VE.26";"NULL";"Initialisation de la valeur «VE.26» pour la liste «75».";2009-07-29 00:00:00;1;1
7167;1078;1;"(VE99)";"VE.99";"NULL";"Initialisation de la valeur «VE.99» pour la liste «75».";2009-07-29 00:00:00;1;1
7168;1078;1;"British Virgin Islands (general)";"VG.00";"NULL";"Initialisation de la valeur «VG.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7169;1078;1;"Virgin Islands (general)";"VI.00";"NULL";"Initialisation de la valeur «VI.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7170;1078;1;"Vietnam (general)";"VN.00";"NULL";"Initialisation de la valeur «VN.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7171;1078;1;"An Giang";"VN.01";"NULL";"Initialisation de la valeur «VN.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7172;1078;1;"B?c Thái T?nh";"VN.02";"NULL";"Initialisation de la valeur «VN.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7173;1078;1;"Bến Tre";"VN.03";"NULL";"Initialisation de la valeur «VN.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7174;1078;1;"Cao Bang";"VN.04";"NULL";"Initialisation de la valeur «VN.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7175;1078;1;"Cao Bằng";"VN.05";"NULL";"Initialisation de la valeur «VN.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7176;1078;1;"Ten Bai";"VN.06";"NULL";"Initialisation de la valeur «VN.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7177;1078;1;"Ðắc Lắk";"VN.07";"NULL";"Initialisation de la valeur «VN.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7178;1078;1;"Ðồng Tháp";"VN.09";"NULL";"Initialisation de la valeur «VN.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7179;1078;1;"(VM10)";"VN.10";"NULL";"Initialisation de la valeur «VN.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7180;1078;1;"Hà B?c T?nh";"VN.11";"NULL";"Initialisation de la valeur «VN.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7181;1078;1;"H?i Hung T?nh";"VN.12";"NULL";"Initialisation de la valeur «VN.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7182;1078;1;"Hải Phòng";"VN.13";"NULL";"Initialisation de la valeur «VN.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7183;1078;1;"Hoa Binh";"VN.14";"NULL";"Initialisation de la valeur «VN.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7184;1078;1;"Ha Tay";"VN.15";"NULL";"Initialisation de la valeur «VN.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7185;1078;1;"(VM16)";"VN.16";"NULL";"Initialisation de la valeur «VN.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7186;1078;1;"(VM17)";"VN.17";"NULL";"Initialisation de la valeur «VN.17» pour la liste «75».";2009-07-29 00:00:00;1;1
7187;1078;1;"(VM19)";"VN.19";"NULL";"Initialisation de la valeur «VN.19» pour la liste «75».";2009-07-29 00:00:00;1;1
7188;1078;1;"Hồ Chí Minh";"VN.20";"NULL";"Initialisation de la valeur «VN.20» pour la liste «75».";2009-07-29 00:00:00;1;1
7189;1078;1;"Kiến Giang";"VN.21";"NULL";"Initialisation de la valeur «VN.21» pour la liste «75».";2009-07-29 00:00:00;1;1
7190;1078;1;"Lai Châu";"VN.22";"NULL";"Initialisation de la valeur «VN.22» pour la liste «75».";2009-07-29 00:00:00;1;1
7191;1078;1;"Lâm Ðồng";"VN.23";"NULL";"Initialisation de la valeur «VN.23» pour la liste «75».";2009-07-29 00:00:00;1;1
7192;1078;1;"Long An";"VN.24";"NULL";"Initialisation de la valeur «VN.24» pour la liste «75».";2009-07-29 00:00:00;1;1
7193;1078;1;"Minh H?i T?nh";"VN.25";"NULL";"Initialisation de la valeur «VN.25» pour la liste «75».";2009-07-29 00:00:00;1;1
7194;1078;1;"Thua Thien-Hue";"VN.26";"NULL";"Initialisation de la valeur «VN.26» pour la liste «75».";2009-07-29 00:00:00;1;1
7195;1078;1;"Quang Nam";"VN.27";"NULL";"Initialisation de la valeur «VN.27» pour la liste «75».";2009-07-29 00:00:00;1;1
7196;1078;1;"Kon Tum";"VN.28";"NULL";"Initialisation de la valeur «VN.28» pour la liste «75».";2009-07-29 00:00:00;1;1
7197;1078;1;"Qu?ng Nam-Ðà N?ng T?nh";"VN.29";"NULL";"Initialisation de la valeur «VN.29» pour la liste «75».";2009-07-29 00:00:00;1;1
7198;1078;1;"Quảng Ninh";"VN.30";"NULL";"Initialisation de la valeur «VN.30» pour la liste «75».";2009-07-29 00:00:00;1;1
7199;1078;1;"Sông Bé T?nh";"VN.31";"NULL";"Initialisation de la valeur «VN.31» pour la liste «75».";2009-07-29 00:00:00;1;1
7200;1078;1;"Sơn La";"VN.32";"NULL";"Initialisation de la valeur «VN.32» pour la liste «75».";2009-07-29 00:00:00;1;1
7201;1078;1;"Tây Ninh";"VN.33";"NULL";"Initialisation de la valeur «VN.33» pour la liste «75».";2009-07-29 00:00:00;1;1
7202;1078;1;"Thanh Hóa";"VN.34";"NULL";"Initialisation de la valeur «VN.34» pour la liste «75».";2009-07-29 00:00:00;1;1
7203;1078;1;"Thái Bình";"VN.35";"NULL";"Initialisation de la valeur «VN.35» pour la liste «75».";2009-07-29 00:00:00;1;1
7204;1078;1;"Nin Thuan";"VN.36";"NULL";"Initialisation de la valeur «VN.36» pour la liste «75».";2009-07-29 00:00:00;1;1
7205;1078;1;"Tiền Giang";"VN.37";"NULL";"Initialisation de la valeur «VN.37» pour la liste «75».";2009-07-29 00:00:00;1;1
7206;1078;1;"Vinh Phú T?nh";"VN.38";"NULL";"Initialisation de la valeur «VN.38» pour la liste «75».";2009-07-29 00:00:00;1;1
7207;1078;1;"Lạng Sơn";"VN.39";"NULL";"Initialisation de la valeur «VN.39» pour la liste «75».";2009-07-29 00:00:00;1;1
7208;1078;1;"Binh Thuan";"VN.40";"NULL";"Initialisation de la valeur «VN.40» pour la liste «75».";2009-07-29 00:00:00;1;1
7209;1078;1;"Long An";"VN.41";"NULL";"Initialisation de la valeur «VN.41» pour la liste «75».";2009-07-29 00:00:00;1;1
7210;1078;1;"Ðồng Nai";"VN.43";"NULL";"Initialisation de la valeur «VN.43» pour la liste «75».";2009-07-29 00:00:00;1;1
7211;1078;1;"Ha Nội";"VN.44";"NULL";"Initialisation de la valeur «VN.44» pour la liste «75».";2009-07-29 00:00:00;1;1
7212;1078;1;"Bà Rịa-Vũng Tàu";"VN.45";"NULL";"Initialisation de la valeur «VN.45» pour la liste «75».";2009-07-29 00:00:00;1;1
7213;1078;1;"Bình Ðịnh";"VN.46";"NULL";"Initialisation de la valeur «VN.46» pour la liste «75».";2009-07-29 00:00:00;1;1
7214;1078;1;"Bình Thuận";"VN.47";"NULL";"Initialisation de la valeur «VN.47» pour la liste «75».";2009-07-29 00:00:00;1;1
7215;1078;1;"Cần Thơ";"VN.48";"NULL";"Initialisation de la valeur «VN.48» pour la liste «75».";2009-07-29 00:00:00;1;1
7216;1078;1;"Gia Lai";"VN.49";"NULL";"Initialisation de la valeur «VN.49» pour la liste «75».";2009-07-29 00:00:00;1;1
7217;1078;1;"Hà Giang";"VN.50";"NULL";"Initialisation de la valeur «VN.50» pour la liste «75».";2009-07-29 00:00:00;1;1
7218;1078;1;"Hà Tây";"VN.51";"NULL";"Initialisation de la valeur «VN.51» pour la liste «75».";2009-07-29 00:00:00;1;1
7219;1078;1;"Hà Tĩnh";"VN.52";"NULL";"Initialisation de la valeur «VN.52» pour la liste «75».";2009-07-29 00:00:00;1;1
7220;1078;1;"Hòa Bình";"VN.53";"NULL";"Initialisation de la valeur «VN.53» pour la liste «75».";2009-07-29 00:00:00;1;1
7221;1078;1;"Khánh Hòa";"VN.54";"NULL";"Initialisation de la valeur «VN.54» pour la liste «75».";2009-07-29 00:00:00;1;1
7222;1078;1;"Kon Tum";"VN.55";"NULL";"Initialisation de la valeur «VN.55» pour la liste «75».";2009-07-29 00:00:00;1;1
7223;1078;1;"Lào Cai";"VN.56";"NULL";"Initialisation de la valeur «VN.56» pour la liste «75».";2009-07-29 00:00:00;1;1
7224;1078;1;"Nam Hà T?nh";"VN.57";"NULL";"Initialisation de la valeur «VN.57» pour la liste «75».";2009-07-29 00:00:00;1;1
7225;1078;1;"Nghệ An";"VN.58";"NULL";"Initialisation de la valeur «VN.58» pour la liste «75».";2009-07-29 00:00:00;1;1
7226;1078;1;"Ninh Bình";"VN.59";"NULL";"Initialisation de la valeur «VN.59» pour la liste «75».";2009-07-29 00:00:00;1;1
7227;1078;1;"Ninh Thuận";"VN.60";"NULL";"Initialisation de la valeur «VN.60» pour la liste «75».";2009-07-29 00:00:00;1;1
7228;1078;1;"Phú Yên";"VN.61";"NULL";"Initialisation de la valeur «VN.61» pour la liste «75».";2009-07-29 00:00:00;1;1
7229;1078;1;"Quảng Bình";"VN.62";"NULL";"Initialisation de la valeur «VN.62» pour la liste «75».";2009-07-29 00:00:00;1;1
7230;1078;1;"Quảng Ngãi";"VN.63";"NULL";"Initialisation de la valeur «VN.63» pour la liste «75».";2009-07-29 00:00:00;1;1
7231;1078;1;"Quảng Trị";"VN.64";"NULL";"Initialisation de la valeur «VN.64» pour la liste «75».";2009-07-29 00:00:00;1;1
7232;1078;1;"Sóc Trăng";"VN.65";"NULL";"Initialisation de la valeur «VN.65» pour la liste «75».";2009-07-29 00:00:00;1;1
7233;1078;1;"Thừa Thiên-Huế";"VN.66";"NULL";"Initialisation de la valeur «VN.66» pour la liste «75».";2009-07-29 00:00:00;1;1
7234;1078;1;"Trà Vinh";"VN.67";"NULL";"Initialisation de la valeur «VN.67» pour la liste «75».";2009-07-29 00:00:00;1;1
7235;1078;1;"Tuyên Quang";"VN.68";"NULL";"Initialisation de la valeur «VN.68» pour la liste «75».";2009-07-29 00:00:00;1;1
7236;1078;1;"Vĩnh Long";"VN.69";"NULL";"Initialisation de la valeur «VN.69» pour la liste «75».";2009-07-29 00:00:00;1;1
7237;1078;1;"Yên Bái";"VN.70";"NULL";"Initialisation de la valeur «VN.70» pour la liste «75».";2009-07-29 00:00:00;1;1
7238;1078;1;"Bắc Giang";"VN.71";"NULL";"Initialisation de la valeur «VN.71» pour la liste «75».";2009-07-29 00:00:00;1;1
7239;1078;1;"Bắc Kạn";"VN.72";"NULL";"Initialisation de la valeur «VN.72» pour la liste «75».";2009-07-29 00:00:00;1;1
7240;1078;1;"Bạc Liêu";"VN.73";"NULL";"Initialisation de la valeur «VN.73» pour la liste «75».";2009-07-29 00:00:00;1;1
7241;1078;1;"Bắc Ninh";"VN.74";"NULL";"Initialisation de la valeur «VN.74» pour la liste «75».";2009-07-29 00:00:00;1;1
7242;1078;1;"Bình Dương";"VN.75";"NULL";"Initialisation de la valeur «VN.75» pour la liste «75».";2009-07-29 00:00:00;1;1
7243;1078;1;"Bình Phước";"VN.76";"NULL";"Initialisation de la valeur «VN.76» pour la liste «75».";2009-07-29 00:00:00;1;1
7244;1078;1;"Cà Mau";"VN.77";"NULL";"Initialisation de la valeur «VN.77» pour la liste «75».";2009-07-29 00:00:00;1;1
7245;1078;1;"Ðà Nẵng";"VN.78";"NULL";"Initialisation de la valeur «VN.78» pour la liste «75».";2009-07-29 00:00:00;1;1
7246;1078;1;"Hải Dương";"VN.79";"NULL";"Initialisation de la valeur «VN.79» pour la liste «75».";2009-07-29 00:00:00;1;1
7247;1078;1;"Hà Nam";"VN.80";"NULL";"Initialisation de la valeur «VN.80» pour la liste «75».";2009-07-29 00:00:00;1;1
7248;1078;1;"Hưng Yên";"VN.81";"NULL";"Initialisation de la valeur «VN.81» pour la liste «75».";2009-07-29 00:00:00;1;1
7249;1078;1;"Nam Ðịnh";"VN.82";"NULL";"Initialisation de la valeur «VN.82» pour la liste «75».";2009-07-29 00:00:00;1;1
7250;1078;1;"Phú Thọ";"VN.83";"NULL";"Initialisation de la valeur «VN.83» pour la liste «75».";2009-07-29 00:00:00;1;1
7251;1078;1;"Quảng Nam";"VN.84";"NULL";"Initialisation de la valeur «VN.84» pour la liste «75».";2009-07-29 00:00:00;1;1
7252;1078;1;"Thái Nguyên";"VN.85";"NULL";"Initialisation de la valeur «VN.85» pour la liste «75».";2009-07-29 00:00:00;1;1
7253;1078;1;"Vĩnh Phúc";"VN.86";"NULL";"Initialisation de la valeur «VN.86» pour la liste «75».";2009-07-29 00:00:00;1;1
7254;1078;1;"Vanuatu (general)";"VU.00";"NULL";"Initialisation de la valeur «VU.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7255;1078;1;"Ambrym";"VU.05";"NULL";"Initialisation de la valeur «VU.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7256;1078;1;"Aoba/Maéwo";"VU.06";"NULL";"Initialisation de la valeur «VU.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7257;1078;1;"Torba";"VU.07";"NULL";"Initialisation de la valeur «VU.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7258;1078;1;"Éfaté";"VU.08";"NULL";"Initialisation de la valeur «VU.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7259;1078;1;"Épi";"VU.09";"NULL";"Initialisation de la valeur «VU.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7260;1078;1;"Malakula";"VU.10";"NULL";"Initialisation de la valeur «VU.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7261;1078;1;"Paama";"VU.11";"NULL";"Initialisation de la valeur «VU.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7262;1078;1;"Pentecôte";"VU.12";"NULL";"Initialisation de la valeur «VU.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7263;1078;1;"Sanma";"VU.13";"NULL";"Initialisation de la valeur «VU.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7264;1078;1;"Shepherd";"VU.14";"NULL";"Initialisation de la valeur «VU.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7265;1078;1;"Tafea";"VU.15";"NULL";"Initialisation de la valeur «VU.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7266;1078;1;"Malampa";"VU.16";"NULL";"Initialisation de la valeur «VU.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7267;1078;1;"Penama";"VU.17";"NULL";"Initialisation de la valeur «VU.17» pour la liste «75».";2009-07-29 00:00:00;1;1
7268;1078;1;"Shefa";"VU.18";"NULL";"Initialisation de la valeur «VU.18» pour la liste «75».";2009-07-29 00:00:00;1;1
7269;1078;1;"Samoa (general)";"WS.00";"NULL";"Initialisation de la valeur «WS.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7270;1078;1;"A‘ana";"WS.01";"NULL";"Initialisation de la valeur «WS.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7271;1078;1;"Aiga-i-le-Tai";"WS.02";"NULL";"Initialisation de la valeur «WS.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7272;1078;1;"Atua";"WS.03";"NULL";"Initialisation de la valeur «WS.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7273;1078;1;"Fa‘asaleleaga";"WS.04";"NULL";"Initialisation de la valeur «WS.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7274;1078;1;"Gaga‘emauga";"WS.05";"NULL";"Initialisation de la valeur «WS.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7275;1078;1;"Va‘a-o-Fonoti";"WS.06";"NULL";"Initialisation de la valeur «WS.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7276;1078;1;"Gagaifomauga";"WS.07";"NULL";"Initialisation de la valeur «WS.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7277;1078;1;"Palauli";"WS.08";"NULL";"Initialisation de la valeur «WS.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7278;1078;1;"Satupa‘itea";"WS.09";"NULL";"Initialisation de la valeur «WS.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7279;1078;1;"Tuamasaga";"WS.10";"NULL";"Initialisation de la valeur «WS.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7280;1078;1;"Vaisigano";"WS.11";"NULL";"Initialisation de la valeur «WS.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7281;1078;1;"Abyan";"YE.01";"NULL";"Initialisation de la valeur «YE.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7282;1078;1;"‘Adan";"YE.02";"NULL";"Initialisation de la valeur «YE.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7283;1078;1;"Al Mahrah";"YE.03";"NULL";"Initialisation de la valeur «YE.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7284;1078;1;"Ḩaḑramawt";"YE.04";"NULL";"Initialisation de la valeur «YE.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7285;1078;1;"Shabwah";"YE.05";"NULL";"Initialisation de la valeur «YE.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7286;1078;1;"San’a’";"YE.06";"NULL";"Initialisation de la valeur «YE.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7287;1078;1;"Ta’izz";"YE.07";"NULL";"Initialisation de la valeur «YE.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7288;1078;1;"Al Ḩudaydah";"YE.08";"NULL";"Initialisation de la valeur «YE.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7289;1078;1;"Dhamar";"YE.09";"NULL";"Initialisation de la valeur «YE.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7290;1078;1;"Al Maḩwīt";"YE.10";"NULL";"Initialisation de la valeur «YE.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7291;1078;1;"Dhamār";"YE.11";"NULL";"Initialisation de la valeur «YE.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7292;1078;1;"(YM12)";"YE.12";"NULL";"Initialisation de la valeur «YE.12» pour la liste «75».";2009-07-29 00:00:00;1;1
7293;1078;1;"(YM13)";"YE.13";"NULL";"Initialisation de la valeur «YE.13» pour la liste «75».";2009-07-29 00:00:00;1;1
7294;1078;1;"Maʼrib";"YE.14";"NULL";"Initialisation de la valeur «YE.14» pour la liste «75».";2009-07-29 00:00:00;1;1
7295;1078;1;"Şa‘dah";"YE.15";"NULL";"Initialisation de la valeur «YE.15» pour la liste «75».";2009-07-29 00:00:00;1;1
7296;1078;1;"Şan‘āʼ";"YE.16";"NULL";"Initialisation de la valeur «YE.16» pour la liste «75».";2009-07-29 00:00:00;1;1
7297;1078;1;"(YM17)";"YE.17";"NULL";"Initialisation de la valeur «YE.17» pour la liste «75».";2009-07-29 00:00:00;1;1
7298;1078;1;"Aḑ Ḑāli‘";"YE.18";"NULL";"Initialisation de la valeur «YE.18» pour la liste «75».";2009-07-29 00:00:00;1;1
7299;1078;1;"Omran";"YE.19";"NULL";"Initialisation de la valeur «YE.19» pour la liste «75».";2009-07-29 00:00:00;1;1
7300;1078;1;"Al Bayḑāʼ";"YE.20";"NULL";"Initialisation de la valeur «YE.20» pour la liste «75».";2009-07-29 00:00:00;1;1
7301;1078;1;"Al Jawf";"YE.21";"NULL";"Initialisation de la valeur «YE.21» pour la liste «75».";2009-07-29 00:00:00;1;1
7302;1078;1;"Ḩajjah";"YE.22";"NULL";"Initialisation de la valeur «YE.22» pour la liste «75».";2009-07-29 00:00:00;1;1
7303;1078;1;"Ibb";"YE.23";"NULL";"Initialisation de la valeur «YE.23» pour la liste «75».";2009-07-29 00:00:00;1;1
7304;1078;1;"Laḩij";"YE.24";"NULL";"Initialisation de la valeur «YE.24» pour la liste «75».";2009-07-29 00:00:00;1;1
7305;1078;1;"Ta‘izz";"YE.25";"NULL";"Initialisation de la valeur «YE.25» pour la liste «75».";2009-07-29 00:00:00;1;1
7306;1078;1;"Amanat Al Asimah";"YE.26";"NULL";"Initialisation de la valeur «YE.26» pour la liste «75».";2009-07-29 00:00:00;1;1
7307;1078;1;"Muḩāfaz̧at Raymah";"YE.27";"NULL";"Initialisation de la valeur «YE.27» pour la liste «75».";2009-07-29 00:00:00;1;1
7308;1078;1;"Mayotte (general)";"YT.00";"NULL";"Initialisation de la valeur «YT.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7309;1078;1;"South Africa (general)";"ZA.00";"NULL";"Initialisation de la valeur «ZA.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7310;1078;1;"North-Western Province";"ZA.01";"NULL";"Initialisation de la valeur «ZA.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7311;1078;1;"KwaZulu-Natal";"ZA.02";"NULL";"Initialisation de la valeur «ZA.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7312;1078;1;"Free State";"ZA.03";"NULL";"Initialisation de la valeur «ZA.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7313;1078;1;"Southern Province";"ZA.04";"NULL";"Initialisation de la valeur «ZA.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7314;1078;1;"Eastern Cape";"ZA.05";"NULL";"Initialisation de la valeur «ZA.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7315;1078;1;"Gauteng";"ZA.06";"NULL";"Initialisation de la valeur «ZA.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7316;1078;1;"Mpumalanga";"ZA.07";"NULL";"Initialisation de la valeur «ZA.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7317;1078;1;"Northern Cape";"ZA.08";"NULL";"Initialisation de la valeur «ZA.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7318;1078;1;"Limpopo";"ZA.09";"NULL";"Initialisation de la valeur «ZA.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7319;1078;1;"North-West";"ZA.10";"NULL";"Initialisation de la valeur «ZA.10» pour la liste «75».";2009-07-29 00:00:00;1;1
7320;1078;1;"Western Cape";"ZA.11";"NULL";"Initialisation de la valeur «ZA.11» pour la liste «75».";2009-07-29 00:00:00;1;1
7321;1078;1;"Zambia (general)";"ZM.00";"NULL";"Initialisation de la valeur «ZM.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7322;1078;1;"North-Western";"ZM.01";"NULL";"Initialisation de la valeur «ZM.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7323;1078;1;"Copperbelt Province";"ZM.02";"NULL";"Initialisation de la valeur «ZM.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7324;1078;1;"Western";"ZM.03";"NULL";"Initialisation de la valeur «ZM.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7325;1078;1;"Southern";"ZM.04";"NULL";"Initialisation de la valeur «ZM.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7326;1078;1;"Central";"ZM.05";"NULL";"Initialisation de la valeur «ZM.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7327;1078;1;"Eastern";"ZM.06";"NULL";"Initialisation de la valeur «ZM.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7328;1078;1;"Northern";"ZM.07";"NULL";"Initialisation de la valeur «ZM.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7329;1078;1;"Luapula";"ZM.08";"NULL";"Initialisation de la valeur «ZM.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7330;1078;1;"Lusaka";"ZM.09";"NULL";"Initialisation de la valeur «ZM.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7331;1078;1;"Zimbabwe (general)";"ZW.00";"NULL";"Initialisation de la valeur «ZW.00» pour la liste «75».";2009-07-29 00:00:00;1;1
7332;1078;1;"Manicaland";"ZW.01";"NULL";"Initialisation de la valeur «ZW.01» pour la liste «75».";2009-07-29 00:00:00;1;1
7333;1078;1;"Midlands";"ZW.02";"NULL";"Initialisation de la valeur «ZW.02» pour la liste «75».";2009-07-29 00:00:00;1;1
7334;1078;1;"Mashonaland Central";"ZW.03";"NULL";"Initialisation de la valeur «ZW.03» pour la liste «75».";2009-07-29 00:00:00;1;1
7335;1078;1;"Mashonaland East";"ZW.04";"NULL";"Initialisation de la valeur «ZW.04» pour la liste «75».";2009-07-29 00:00:00;1;1
7336;1078;1;"Mashonaland West";"ZW.05";"NULL";"Initialisation de la valeur «ZW.05» pour la liste «75».";2009-07-29 00:00:00;1;1
7337;1078;1;"Matabeleland North";"ZW.06";"NULL";"Initialisation de la valeur «ZW.06» pour la liste «75».";2009-07-29 00:00:00;1;1
7338;1078;1;"Matabeleland South";"ZW.07";"NULL";"Initialisation de la valeur «ZW.07» pour la liste «75».";2009-07-29 00:00:00;1;1
7339;1078;1;"Masvingo";"ZW.08";"NULL";"Initialisation de la valeur «ZW.08» pour la liste «75».";2009-07-29 00:00:00;1;1
7340;1078;1;"Bulawayo";"ZW.09";"NULL";"Initialisation de la valeur «ZW.09» pour la liste «75».";2009-07-29 00:00:00;1;1
7341;1078;1;"Harare";"ZW.10";"NULL";"Initialisation de la valeur «ZW.10» pour la liste «75».";2009-07-29 00:00:00;1;1
30744;1080;1;"Indéterminé";"I";"NULL";"Initialisation de la valeur «I» pour la liste «77».";2009-08-02 13:45:00;1;1
30745;1080;1;"Oui";"O";"NULL";"Initialisation de la valeur «O» pour la liste «77».";2009-08-02 13:45:00;1;1
30746;1080;1;"Non";"N";"NULL";"Initialisation de la valeur «N» pour la liste «77».";2009-08-02 13:45:00;1;1
30748;1081;1;"Très important [1]";"1";"NULL";"Initialisation de la valeur «1» pour la liste «78».";2009-10-26 18:32:00;1;1
30749;1081;1;"Important [2]";"2";"NULL";"Initialisation de la valeur «2» pour la liste «78».";2009-10-26 18:32:00;1;1
30750;1081;1;"Moyen [3]";"3";"NULL";"Initialisation de la valeur «3» pour la liste «78».";2009-10-26 18:32:00;1;1
30751;1081;1;"Faible [4]";"4";"NULL";"Initialisation de la valeur «4» pour la liste «78».";2009-10-26 18:32:00;1;1
30752;1081;1;"Très faible [5]";"5";"NULL";"Initialisation de la valeur «5» pour la liste «78».";2009-10-26 18:32:00;1;1
30753;1082;1;"Exact";"E";"NULL";"Initialisation de la valeur «E» pour la liste «79».";2009-10-27 11:20:00;1;1
30754;1082;1;"Approximatif";"A";"NULL";"Initialisation de la valeur «A» pour la liste «79».";2009-10-27 11:20:00;1;1
30755;1083;1;"Herbier";"HE";"NULL";"Initialisation de la valeur «HE» pour la liste «80».";2009-09-29 14:05:00;1;1
30756;1083;1;"Centurie (conservée en dehors d'un herbier)";"CE";"Un mode de distribution ou d’échange d’échantillons d'herbiers souvent pratiqué au 19ème siècle. Le principe de l'envoi par centuries correspond à un ou x envois de paquets de n échantillons. Ces n échantillons peuvent avoir le même collecteur ou non, mais en général leur est attribuée une étiquette souvent imprimée ou ronéotypée comprenant un nom de centurie et le nom du distributeur (éditeur) de la centurie, ainsi parfois que des descriptions. La réalisation d’une centurie implique de faire des récoltes d'un nombre élevé d’échantillons du même taxon destiné à la distribution à plusieurs personnes ou institutions ayant souscrit à la centurie ou faisant partie d’une société d’échanges de plantes. ";"Initialisation de la valeur «CE» pour la liste «80».";2009-09-29 14:05:00;1;1
30757;1083;1;"Droguier";"DR";"Collection de fragments de végétaux ou de préparations (poudres...) dans des récipients adaptés (bocaux) utilisée pour l'enseignement ou la recherche dans le domaine de la matière médicale.";"Initialisation de la valeur «DR» pour la liste «80».";2009-09-29 14:05:00;1;1
30758;1083;1;"Carpothèque";"CA";"Collection de fruits et graines non vivants séchés et conservés à température ambiante dans des récipients adaptés (sachets, bocaux...). Elle permet de conserver en-dehors des herbiers les échantillons de fruits ou de graines trop volumineux, et sert de référence pour aider à l'identification.";"Initialisation de la valeur «CA» pour la liste «80».";2009-09-29 14:05:00;1;1
30759;1083;1;"Collection en alcool";"AL";"Certaines parties de plantes sont conservées en alcool car elles sont difficiles à sécher, pour conserver leur forme ou permettre des études particulières.";"Initialisation de la valeur «AL» pour la liste «80».";2009-09-29 14:05:00;1;1
30760;1083;1;"Xylothèque";"XY";"Collection d’échantillons de bois.";"Initialisation de la valeur «XY» pour la liste «80».";2009-09-29 14:05:00;1;1
30761;1083;1;"Collection de préparations microscopiques";"PM";"NULL";"Initialisation de la valeur «PM» pour la liste «80».";2009-09-29 14:05:00;1;1
/tags/v1.1-andromede/doc/bdd/.~lock.annuaire_vocabulaire.ods#
New file
0,0 → 1,0
,aurelien,ornithorynque,09.02.2010 10:52,file:///home/aurelien/.ooo3;
/tags/v1.1-andromede/doc/bdd/index.html
New file
0,0 → 1,104
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Accueil</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : Accueil</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Liste des modules </h1>
<p><a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">Pour revenir sur le Wikini, cliquer ici</a> ou sur le logo en haut à gauche.</p>
<h2> Tableau récapitulatif des modules </h2>
<!-- CONTENU_CORPS -->
<table class="eflore_table" border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> Numéro </th>
<th> Nom et liens vers la description du module </th>
<th> Abréviation </th>
<th> Etat du module </th>
<th> Etat de l'aide </th>
<th> Nbre tables </th>
<th> Révision </th>
<th> Commentaires </th>
</thead>
<tbody>
<tr>
<td> 1 </td>
<td> <a href="annuaire_module_Annuaire.html">Annuaire</a> </td>
<td> </td>
<td> </td>
<td> </td>
<td> 4 </td>
<td> 1.1 </td>
<td> </td>
</tr>
<tr>
<td> 2 </td>
<td> <a href="annuaire_module_Metadonnees.html">Metadonnées</a> </td>
<td> </td>
<td> </td>
<td> </td>
<td> 4 </td>
<td> 1.1 </td>
<td> </td>
</tr>
</tbody>
</table>
<p>Nombre total de tables : 8</p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant l'annuaire :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion">
discussion sur la liste des modules
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_module.html
New file
0,0 → 1,90
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><!-- PAGE_TITRE --></title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion" title="Retourner à la page d'accueil du wiki">
<img src="/wikini/eflore/bibliotheque/images/eflore.jpg" width="110" height="31" alt="Logo" /><br />
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1><!-- RAPPORT_NOM --></h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <!-- VOUS_ETES_ICI --></p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Module <!-- MODULE_NOM --></h1>
<p id="miniature" >
<a href="images/modules/<!-- MODULE_NOM_FICHIER -->.png" title="Voir cette image avec un zoom de 100%.">
<img src="images/miniatures/miniature_<!-- MODULE_NOM_FICHIER -->.png" alt="Miniature du modèle du module <!-- MODULE_NOM -->" />
</a>
</p>
<h2> Description générale </h2>
<p>
<!-- MODULE_COMMENTAIRE -->
<br />
<b>Révision : </b><!-- MODULE_REVISION -->
</p>
<h2> Liste des tables </h2>
<ol class="type_01">
<!-- TABLE_BOUCLE_DEBUT -->
<li><!-- TABLE_NOM --> : <!-- TABLE_COMMENTAIRE --></li>
<!-- TABLE_BOUCLE_FIN -->
</ol>
<h2> Dépot SVN </h2>
<p>
Voir la page concernant ce module sur le dépot SVN :
<a href="http://svn.tela-botanica.net/websvn/listing.php?repname=Applications.annuaire<!-- FICHIER_DBD -->">
<!-- FICHIER_DBD -->
</a>
</p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant ce module :
<a href="http://wiki.tela-botanica.org/eflore/wakka.php?wiki=EfloreV4AppliannuaireDiscussion_<!-- MODULE_NOM -->">
discussion sur le module <!-- MODULE_NOM -->
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le <!-- AUJOURD'HUI --></p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
/tags/v1.1-andromede/doc/bdd/annuaire_table_annuaire_inscrits.html
New file
0,0 → 1,248
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Annuaire Tela - annuaire_inscrits</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > <a href="annuaire_module_Annuaire_Tela.html">Annuaire Tela</a> > annuaire_inscrits</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table annuaire_inscrits</h1>
<h2> Description générale </h2>
<p>
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<tr id="ai_id" class="pair" >
<td> 1 </td>
<td> ai_id </td>
<td> ai_id_ </td>
<td> VARCHAR(45) </td>
<td> oui </td>
<td> </td>
<td> clé primaire </td>
<td> oui </td>
<td> </td>
</tr>
<tr id="ai_nom" class="pair" >
<td> 2 </td>
<td> ai_nom </td>
<td> ai_n </td>
<td> VARCHAR(45) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_prenom" class="pair" >
<td> 3 </td>
<td> ai_prenom </td>
<td> ai_p </td>
<td> VARCHAR(45) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_mail" class="pair" >
<td> 4 </td>
<td> ai_mail </td>
<td> ai_m </td>
<td> VARCHAR(255) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_mdp" class="pair" >
<td> 5 </td>
<td> ai_mdp </td>
<td> ai_m </td>
<td> VARCHAR(45) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_addr1" class="pair" >
<td> 6 </td>
<td> ai_addr1 </td>
<td> ai_a </td>
<td> VARCHAR(128) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_addr2" class="pair" >
<td> 7 </td>
<td> ai_addr2 </td>
<td> ai_a </td>
<td> VARCHAR(128) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_code_post" class="pair" >
<td> 8 </td>
<td> ai_code_post </td>
<td> ai_cp </td>
<td> VARCHAR(32) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_ville" class="pair" >
<td> 9 </td>
<td> ai_ville </td>
<td> ai_v </td>
<td> VARCHAR(128) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_pays" class="pair" >
<td> 10 </td>
<td> ai_pays </td>
<td> ai_p </td>
<td> VARCHAR(128) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_valide" class="pair" >
<td> 11 </td>
<td> ai_valide </td>
<td> ai_v </td>
<td> BOOL </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
<tr id="ai_date_inscription" class="pair" >
<td> 12 </td>
<td> ai_date_inscription </td>
<td> ai_di </td>
<td> DATETIME </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> </td>
</tr>
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_annuaire_inscrits">
discussion sur la table annuaire_inscrits
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 10:42:27</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_table.html
New file
0,0 → 1,127
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><!-- PAGE_TITRE --></title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="coel.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion" title="Retourner à la page d'accueil du wiki">
<img src="/wikini/eflore/bibliotheque/images/eflore.jpg" width="110" height="31" alt="Logo" /><br />
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1><!-- RAPPORT_NOM --></h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <!-- VOUS_ETES_ICI --></p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table <!-- TABLE_NOM --></h1>
<h2> Description générale </h2>
<p>
<!-- TABLE_COMMENTAIRE -->
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<!-- COLONNE_BOUCLE_DEBUT -->
<tr id="<!-- COLONNE_NOM -->" class="pair" >
<td> <!-- COLONNE_NUM --> </td>
<td> <!-- COLONNE_NOM --> </td>
<td> <!-- COLONNE_CODE --> </td>
<td> <!-- COLONNE_TYPE_DONNEE --> </td>
<td> <!-- COLONNE_NN --> </td>
<td> <!-- COLONNE_DEFAUT --> </td>
<td> <!-- COLONNE_TYPE_CHAMP --> </td>
<td> <!-- COLONNE_INDEX --> </td>
<td> <!-- COLONNE_DESCRIPTION --> </td>
</tr>
<!-- COLONNE_BOUCLE_FIN -->
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
<!-- RELATION_BOUCLE_DEBUT -->
<tr class="pair" >
<td> <!-- RELATION_NUM --> </td>
<td> <!-- RELATION_CODE --> </td>
<td> <!-- RELATION_COLONNE_COURANTE --> </td>
<td> <!-- RELATION_COLONNE_DISTANTE --> </td>
<td> <!-- RELATION_NOM_TABLE_LIEE --> </td>
</tr>
<!-- RELATION_BOUCLE_FIN -->
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_<!-- TABLE_NOM -->">
discussion sur la table <!-- TABLE_NOM -->
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le <!-- AUJOURD'HUI --></p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_table_annu_annuaire.html
New file
0,0 → 1,184
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Annuaire - annu_annuaire</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > <a href="annuaire_module_Annuaire.html">Annuaire</a> > annu_annuaire</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table annu_annuaire</h1>
<h2> Description générale </h2>
<p>
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<tr id="aa_id_annuaire" class="pair" >
<td> 1 </td>
<td> aa_id_annuaire </td>
<td> aa_id_a </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé primaire </td>
<td> oui </td>
<td> identifiant de cet annuaire </td>
</tr>
<tr id="aa_nom" class="pair" >
<td> 2 </td>
<td> aa_nom </td>
<td> aa_n </td>
<td> VARCHAR(128) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> nom de l'annuaire </td>
</tr>
<tr id="aa_description" class="pair" >
<td> 3 </td>
<td> aa_description </td>
<td> aa_d </td>
<td> VARCHAR(255) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> description </td>
</tr>
<tr id="aa_code" class="pair" >
<td> 4 </td>
<td> aa_code </td>
<td> aa_c </td>
<td> VARCHAR(20) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> code ou abréviation </td>
</tr>
<tr id="aa_table" class="pair" >
<td> 5 </td>
<td> aa_table </td>
<td> aa_t </td>
<td> VARCHAR(255) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> nom de la table annuaire à utiliser </td>
</tr>
<tr id="aa_bdd" class="pair" >
<td> 6 </td>
<td> aa_bdd </td>
<td> aa_b </td>
<td> VARCHAR(255) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> base de données dans laquelle est situé cet annuaire </td>
</tr>
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
<tr class="pair" >
<td> 1 </td>
<td> fk_aa_amlc </td>
<td> aa_id_annuaire </td>
<td> amc_ce_annuaire </td>
<td> <a href="annuaire_table_annu_meta_colonne.html">annu_meta_colonne</a> </td>
</tr>
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_annu_annuaire">
discussion sur la table annu_annuaire
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_table_annu_meta_colonne.html
New file
0,0 → 1,232
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Metadonnées - annu_meta_colonne</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > <a href="annuaire_module_Metadonnees.html">Metadonnées</a> > annu_meta_colonne</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table annu_meta_colonne</h1>
<h2> Description générale </h2>
<p>
Contient l'ensemble des champs des tables de la base de données.<br />INFO : cmc_nom
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<tr id="amc_id_champ" class="pair" >
<td> 1 </td>
<td> amc_id_champ </td>
<td> amc_id_c </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé primaire </td>
<td> oui </td>
<td> Identifiant du nom du champ dans la table. </td>
</tr>
<tr id="amc_ce_ontologie" class="pair" >
<td> 2 </td>
<td> amc_ce_ontologie </td>
<td> amc_ce_o </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé étrangère </td>
<td> non </td>
<td> </td>
</tr>
<tr id="amc_ce_annuaire" class="pair" >
<td> 3 </td>
<td> amc_ce_annuaire </td>
<td> amc_ce_a </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé étrangère </td>
<td> non </td>
<td> Annuaire lié à cette méta colonne </td>
</tr>
<tr id="amo_ce_type" class="pair" >
<td> 4 </td>
<td> amo_ce_type </td>
<td> amo_ce_t </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé étrangère </td>
<td> non </td>
<td> Type SQL du champ, est une valeur de la liste des types </td>
</tr>
<tr id="amc_nom" class="pair" >
<td> 5 </td>
<td> amc_nom </td>
<td> amc_n </td>
<td> VARCHAR(50) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Intitulé du champ. </td>
</tr>
<tr id="amc_abreviation" class="pair" >
<td> 6 </td>
<td> amc_abreviation </td>
<td> amc_a </td>
<td> VARCHAR(20) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Abréviation du champ. </td>
</tr>
<tr id="amc_description" class="pair" >
<td> 7 </td>
<td> amc_description </td>
<td> amc_d </td>
<td> VARCHAR(510) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Description du champ. </td>
</tr>
<tr id="amc_longueur" class="pair" >
<td> 8 </td>
<td> amc_longueur </td>
<td> amc_l </td>
<td> INTEGER </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Taille du format SQL du champ. </td>
</tr>
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
<tr class="pair" >
<td> 1 </td>
<td> fk_amc_amv </td>
<td> amc_id_champ </td>
<td> amv_ce_colonne </td>
<td> <a href="annuaire_table_annu_meta_valeurs.html">annu_meta_valeurs</a> </td>
</tr>
<tr class="pair" >
<td> 2 </td>
<td> fk_aa_amlc </td>
<td> amc_ce_annuaire </td>
<td> aa_id_annuaire </td>
<td> <a href="annuaire_table_annu_annuaire.html">annu_annuaire</a> </td>
</tr>
<tr class="pair" >
<td> 3 </td>
<td> fk_amo_amc </td>
<td> amc_ce_ontologie </td>
<td> amo_id_ontologie </td>
<td> <a href="annuaire_table_annu_meta_ontologie.html">annu_meta_ontologie</a> </td>
</tr>
<tr class="pair" >
<td> 4 </td>
<td> fk_amo_amc_type </td>
<td> amo_ce_type </td>
<td> amo_id_ontologie </td>
<td> <a href="annuaire_table_annu_meta_ontologie.html">annu_meta_ontologie</a> </td>
</tr>
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_annu_meta_colonne">
discussion sur la table annu_meta_colonne
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_table_annu_meta_ontologie.html
New file
0,0 → 1,188
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Metadonnées - annu_meta_ontologie</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > <a href="annuaire_module_Metadonnees.html">Metadonnées</a> > annu_meta_ontologie</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<!-- CONTENU_CORPS -->
<h1> Table annu_meta_ontologie</h1>
<h2> Description générale </h2>
<p>
Liste l'ensemble des valeurs des tables de type liste.<br />Un champ contient des valeurs dans cette table quand il est de type "LISTE".<br />INFO : cmlv_nom
</p>
<h2> Liste des colonnes </h2>
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Nom </th>
<th> Code </th>
<th> Type données </th>
<th> Obligatoire </th>
<th> Valeur défaut </th>
<th> Type champ </th>
<th> Index </th>
<th> Description </th>
</thead>
<tbody>
<tr id="amo_id_ontologie" class="pair" >
<td> 1 </td>
<td> amo_id_ontologie </td>
<td> amo_id_o </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé primaire </td>
<td> oui </td>
<td> Identifiant d'une valeur de liste. Notez que les listes sont des valeurs de la liste des listes. </td>
</tr>
<tr id="amo_ce_parent" class="pair" >
<td> 2 </td>
<td> amo_ce_parent </td>
<td> amo_ce_p </td>
<td> INTEGER </td>
<td> oui </td>
<td> </td>
<td> clé étrangère </td>
<td> non </td>
<td> </td>
</tr>
<tr id="amo_nom" class="pair" >
<td> 3 </td>
<td> amo_nom </td>
<td> amo_n </td>
<td> VARCHAR(100) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Nom de la valeur. </td>
</tr>
<tr id="amo_abreviation" class="pair" >
<td> 4 </td>
<td> amo_abreviation </td>
<td> amo_a </td>
<td> VARCHAR(50) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Abréviation, code ou identifiant de la valeur. </td>
</tr>
<tr id="amo_description" class="pair" >
<td> 5 </td>
<td> amo_description </td>
<td> amo_d </td>
<td> VARCHAR(255) </td>
<td> non </td>
<td> </td>
<td> standard </td>
<td> non </td>
<td> Description de cette valeur. </td>
</tr>
</tbody>
</table>
<h2> Liste des relations </h2>
<!-- RELATION_ZONE_DEBUT -->
<table border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> N° </th>
<th> Code </th>
<th> Colonne dans cette table </th>
<th> Colonne dans la table liée </th>
<th> Nom table liée </th>
</thead>
<tbody>
<tr class="pair" >
<td> 1 </td>
<td> fk_amo_amo </td>
<td> amo_id_ontologie </td>
<td> amo_ce_parent </td>
<td> <a href="annuaire_table_annu_meta_ontologie.html">annu_meta_ontologie</a> </td>
</tr>
<tr class="pair" >
<td> 2 </td>
<td> fk_amo_amc </td>
<td> amo_id_ontologie </td>
<td> amc_ce_ontologie </td>
<td> <a href="annuaire_table_annu_meta_colonne.html">annu_meta_colonne</a> </td>
</tr>
<tr class="pair" >
<td> 3 </td>
<td> fk_amo_amc_type </td>
<td> amo_id_ontologie </td>
<td> amo_ce_type </td>
<td> <a href="annuaire_table_annu_meta_colonne.html">annu_meta_colonne</a> </td>
</tr>
</tbody>
</table>
<!-- RELATION_ZONE_FIN -->
<!--
<h2> Régles </h2>
<h2> Domaine </h2>
-->
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant cette table :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_annu_meta_ontologie">
discussion sur la table annu_meta_ontologie
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/rapport_annuaire.sh
New file
0,0 → 1,71
#!/bin/bash
###############################################################################
# But : Créer un rapport de base de données et le transférer sur le serveur par ftp.
# Auteur : Jean-Pascal Milcent <jpm@tela-botanica.org> (translate bat file to shell script)
# License : GPL v3
# Création : 22 décembre 2008
# Version: 0.1
# $Id$
###############################################################################
# Constante
NBREPARAM=$#
 
# Aide
E_OPTERR=65
if [ "$1" = '--help' ]
then # Le script a besoin d'au moins un argument sur la ligne de commande
echo "Usage $0 -[parameters -u, -p , -mu, -mp]"
echo "Paramétres : "
echo " -h: indiquer l'hote ftp"
echo " -u: indiquer le nom de l'utilisateur ftp"
echo " -p: indiquer le mot de passe de l'utilisateur ftp"
echo " -mu: indiquer le nom de l'utilisateur mysql"
echo " -mp: indiquer le mot de passe de l'utilisateur mysql"
exit $E_OPTERR
fi
 
# Récupération des paramètres et des options de la ligne de commande
TEMP=`getopt -o u:p:h: -l help:,mu:,mp: -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"
while [ ! -z "$1" ] ; do
#echo $1" # "$2
case "$1" in
-h) HOST=$2;;
-u) FTP_USER=$2;;
-p) FTP_PASSWD=$2;;
--mu) MYSQL_USER=$2;;
--mp) MYSQL_PASSWD=$2;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
shift 2
done
 
# Nous devons être dans le dossier de ce script pour que tout fonctionne
echo "Vérifions que nous sommes bien dans le dossier du fichier rapport_annuaire.sh : ";
pwd
echo "Déplacement dans le dossier contenant les scripts Perl";
cd ../..;
 
echo "Création du rapport";
perl rapportdbd.pl -m r -e ~/web/annuaire/doc/bdd/annuaire.xml -c ./modules/dbd_analyse/configuration/annuaire.ini
 
echo "Création du fichier SQL";
/opt/lampp/bin/php script.php dbd_analyse -a sql -p annuaire -e ~/web/annuaire/doc/bdd/annuaire.xml
 
 
fi;
 
echo "Compression du fichier sql"
if [ -f ~/web/annuaire/doc/bdd/annuaire.sql.bz2 ]; then
rm -f ~/web/annuaire/doc/bdd/annuaire.sql.bz2;
fi;
bzip2 -q ~/web/annuaire/doc/bdd/annuaire.sql
 
echo "Transfert sur le serveur"
if [ $NBREPARAM -eq 0 ]; then
echo "Pas de transfert sur le serveur. Utiliser --help pour voir les options de transfert."
else
lftp ftp://$FTP_USER:$FTP_PASSWD@$HOST -e "set ftp:passive off; mirror -e -R -x .svn ~/web/annuaire/doc/bdd /www/devel/doc/bdd/annuaire/annuaire_bdd_v1.0 ; quit"
fi
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
Added: svn:executable
+*
\ No newline at end of property
/tags/v1.1-andromede/doc/bdd/annuaire.css
New file
0,0 → 1,221
/*--------------------------------------------------------------------------------------------------------------*/
/* Structure de la page */
 
#zone_bandeau {
position : absolute;
top: 0%;
left: 0%;
width: 98%;
height: 60px;
margin: 5px 5px 5px 5px;
padding: 5px 5px 5px 5px;
}
 
#logo {
float : left;
height: 20%;
width: 40%;
}
 
#rapport_nom {
float : left;
line-height: 5%;
width: 40%;
}
 
#accessibilite {
position : absolute;
bottom: 0px;
right: 0px;
width: 40%;
margin: 0%;
padding: 0%;
text-align: right;
display: none;
}
 
#accessibilite li {
display: inline;
line-height: 5%;
}
 
/*
#zone_menu {
position : absolute;
top: 60px;
left: 0%;
width: 20%;
margin: 5px 0px 50px 5px;
padding: 5px 0px 50px 5px;
}
 
#zone_menu li ul {
display: none;
}
 
#zone_menu li:hover > ul {
display: block;
}
 
#zone_menu #menus_niveau_1 {
margin: 0px 0px 0px 5px;
padding: 0px 0px 0px 0px;
text-align: left;
}
 
#zone_menu #menus_niveau_2 {
margin: 0px 0px 0px 10px;
padding: 0px 0px 0px 0px;
text-align: left;
}
 
#zone_menu #menus_niveau_3 {
margin: 0px 0px 0px 10px;
padding: 0px 0px 0px 0px;
text-align: left;
}
 
#zone_menu #identification {
width: 100%;
}
*/
 
#zone_contenu {
position : absolute;
top: 80px;
left: 0%;
width: 98%;
margin: 5px 5px 5px 5px;
padding: 5px 5px 5px 5px;
}
 
#zone_contenu #zone_contenu_corps {
padding: 5px 5px 5px 5px;
}
 
#zone_contenu #zone_contenu_pied p {
text-align: center;
}
 
#zone_contenu #zone_pied p {
text-align: center;
}
 
#miniature {
float : right;
}
/*--------------------------------------------------------------------------------------------------------------*/
/* Décoration */
#rapport_nom {
font-size: 2.5em;
font-family: arial, verdana, sans-serif;
}
 
body {
font-size: 90%;
font-family: arial, verdana, sans-serif;
color:black;
background-color: #D7F2D7;
margin: 0px 0px 0px 0px;
}
 
h1 {
font-size: 2.1em;
color:green;
background-color:transparent;
text-align:left;
}
 
h2 {
font-size: 1.5em;
color:black;
background-color:transparent;
text-align:left;
}
 
h3 {
font-size: 1.6em;
color:black;
background-color:transparent;
text-align:left;
}
 
p {
background-color:transparent;
text-align:left;
margin-left:0px;
margin-right:0px;
}
 
li {
background-color:transparent;
text-align:left;
margin-left:0px;
margin-right:0px;
}
 
a {
font-weight: bold;
color: black;
background-color:transparent;
text-decoration:none;
}
 
a:link {
color: blue;
}
 
a:visited {
color: #8b008b;
}
 
a:hover {
background-color: #ffd700;
}
 
table {
border: medium solid #6495ed;
border-collapse: collapse;
width: 100%;
}
 
th {
font-family: monospace;
border: thin solid #6495ed;
padding: 5px;
background-color: #D0E3FA;
}
 
td {
font-family: sans-serif;
border: thin solid #6495ed;
padding: 5px
text-align: center;
background-color: #ffffff;
}
 
caption {
font-family: sans-serif;
}
 
#zone_bandeau {
}
 
#zone_bandeau #logo h1 {
font-size: 1em;
}
/*
#zone_menu {
border: 1px dashed blue;
}
 
#zone_menu ul {
font-size: 100%;
list-style-type: none;
}
*/
#zone_contenu_corps {
border: 1px dashed green;
background-color: white;
}
/tags/v1.1-andromede/doc/bdd/annuaire_accueil.html
New file
0,0 → 1,95
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><!-- PAGE_TITRE --></title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
<img src="/wikini/eflore/bibliotheque/images/eflore.jpg" width="110" height="31" alt="Logo" /><br />
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1><!-- RAPPORT_NOM --></h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <!-- VOUS_ETES_ICI --></p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Liste des modules </h1>
<p><a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">Pour revenir sur le Wikini d'eFlore, cliquer ici</a> ou sur le logo d'eFlore en haut à gauche.</p>
<h2> Tableau récapitulatif des modules </h2>
<!-- CONTENU_CORPS -->
<table class="eflore_table" border="1" cellpadding="2" cellspacing="0" >
<thead>
<th> Numéro </th>
<th> Nom et liens vers la description du module </th>
<th> Abréviation </th>
<th> Etat du module </th>
<th> Etat de l'aide </th>
<th> Nbre tables </th>
<th> Révision </th>
<th> Commentaires </th>
</thead>
<tbody>
<!-- BOUCLE_MODULE_DEBUT -->
<tr>
<td> <!-- MODULE_NUM --> </td>
<td> <!-- MODULE_NOM --> </td>
<td> <!-- MODULE_ABREVIATION --> </td>
<td> <!-- MODULE_ETAT --> </td>
<td> <!-- MODULE_ETAT_AIDE --> </td>
<td> <!-- MODULE_NBRE_TABLE --> </td>
<td> <!-- MODULE_REVISION --> </td>
<td> <!-- MODULE_COMMENTAIRE --> </td>
</tr>
<!-- BOUCLE_MODULE_FIN -->
</tbody>
</table>
<p>Nombre total de tables : <!-- NBRE_TABLE --></p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant l'annuaire :
<a href="/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion">
discussion sur la liste des modules
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le <!-- AUJOURD'HUI --></p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
 
/tags/v1.1-andromede/doc/bdd/annuaire_vocabulaire.ini
New file
0,0 → 1,121
; Encoding UTF-8
; ------------------------------------------------------#
; Référentiel nomenclatural
[referentiel]
source = /home/aurelien/web/annuaire/doc/bdd/annuaire_vocabulaire.csv
 
; ------------------------------------------------------#
; TABLES
; Id des tables doivent démarrer à 101 (max = 899)
[tables]
annu_annuaire = 101
annu_meta_colonne = 102
annu_meta_valeurs = 103
annu_meta_ontologie = 104
 
 
; ------------------------------------------------------#
; REFERENTIELS
[referentiels]
pays = 1074
zones_administratives_niveau_01 = 1078
zones_administratives_niveau_02 = 1079
niveau_importance = 1081
 
; ------------------------------------------------------#
; CORRESPONDANCES CHAMP/LISTE
 
[champs]
; Module METADONNEES
; L'insertion de ces données se fera manuellement.
cmhl_ce_etat = 1001
cmc_ce_format_sql = 1002
cmc_ce_table = 1003
 
; Module PROJET
cpr_ce_langue = 1071
cpr_ce_indexation_duree = 1072
cpr_ce_indexation_freq = 1073
; Module PERSONNE
cp_ce_truk_prefix = 1004
cp_ce_truk_suffix = 1005
cp_truk_nom_autre = 1006
cp_ce_deces = 1080
cp_ce_sexe = 1067
cp_truk_telephone = 1007
cp_ce_truk_specialite = 1008
cp_ce_truk_role = 1009
cpar_id_role = 1010
; Module STRUCTURE
csap_id_role = 1011
csap_ce_truk_fonction = 1012
csap_ce_truk_statut = 1013
cs_ce_type = 1014
cs_ce_truk_type_prive = 1015
cs_ce_truk_type_public = 1016
cs_truk_identifiant_alternatif = 1017
cs_truk_url = 1066
csc_truk_local_stockage = 1018
csc_truk_local_meuble = 1019
csc_truk_stockage_parametre = 1020
csc_truk_collection_autre = 1021
csc_truk_restauration_operation = 1022
csc_ce_materiel_conservation = 1023
csc_truk_materiel_autre = 1024
csc_truk_traitement_insecte = 1025
csc_ce_truk_acquisition_traitement_poison = 1026
csc_truk_acquisition_traitement_insecte = 1025
csv_truk_action = 1027
csv_collection_autre = 1021
csv_truk_recherche_provenance = 1028
csv_truk_recherche_type = 1029
; Module COLLECTION
ccap_id_role = 1030
ccar_id_relation = 1031
cc_ce_type = 1032
cc_ce_type_depot = 1033
cc_truk_groupement_principe = 1034
cc_truk_groupement_but = 1035
cc_truk_conservation_statut = 1036
cc_truk_couverture_regne = 1037
cc_truk_preservation = 1038
cc_ce_developpement = 1039
cc_truk_periode_constitution = 1040
cc_ce_specimen_type = 1041
cc_ce_specimen_type_nbre_precision = 1082
cc_ce_specimen_type_classement = 1042
ccb_ce_truk_type = 1083
ccb_truk_nature = 1043
ccb_truk_unite_rangement = 1044
ccb_ce_unite_rangement_etat = 1045
ccb_truk_unite_base = 1046
ccb_truk_conservation_papier_type = 1047
ccb_truk_conservation_methode = 1048
ccb_truk_specimen_fixation_methode = 1049
ccb_truk_etiquette_fixation_support = 1049
ccb_truk_etiquette_fixation_specimen = 1050
ccb_truk_etiquette_ecriture = 1051
ccb_ce_traitement = 1041
ccb_truk_traitement_poison = 1026
ccb_truk_traitement_insecte = 1025
ccb_ce_etat_general = 1045
ccb_truk_degradation_specimen = 1052
ccb_truk_degradation_presentation = 1053
ccb_ce_determination = 1054
ccb_ce_recolte_date_debut_type = 1055
ccb_ce_recolte_date_fin_type = 1056
ccb_ce_classement_etat = 1057
ccb_truk_etiquette_renseignement = 1058
ccb_ce_precision_localite = 1059
ccb_ce_precision_date = 1059
ccb_ce_collection_integre = 1041
ccb_ce_collection_integre_info = 1060
ccb_ce_inventaire = 1041
ccb_ce_inventaire_auteur = 1041
ccb_ce_inventaire_forme = 1061
ccb_ce_truk_inventaire_digital = 1062
ccb_ce_inventaire_etat = 1063
ccac_truk_type = 1068
; Module PUBLICATION
cpuap_id_role = 1064
cpuap_ce_truk_type = 1065
/tags/v1.1-andromede/doc/bdd/annuaire.sql.bz2
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/tags/v1.1-andromede/doc/bdd/annuaire.sql.bz2
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/tags/v1.1-andromede/doc/bdd/annuaire_module_Annuaire.html
New file
0,0 → 1,88
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Annuaire</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > Annuaire</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Module Annuaire</h1>
<p id="miniature" >
<a href="images/modules/Annuaire.png" title="Voir cette image avec un zoom de 100%.">
<img src="images/miniatures/miniature_Annuaire.png" alt="Miniature du modèle du module Annuaire" />
</a>
</p>
<h2> Description générale </h2>
<p>
<br />
<b>Révision : </b>1.1
</p>
<h2> Liste des tables </h2>
<ol class="type_01">
<li><a href="annuaire_table_annu_annuaire.html">annu_annuaire</a> : </li>
</ol>
<h2> Dépot SVN </h2>
<p>
Voir la page concernant ce module sur le dépot SVN :
<a href="http://svn.tela-botanica.net/websvn/listing.php?repname=Applications.annuaireannuaire.xml">
annuaire.xml
</a>
</p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant ce module :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_Annuaire">
discussion sur le module Annuaire
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>
/tags/v1.1-andromede/doc/bdd/annuaire_module_Metadonnees.html
New file
0,0 → 1,92
<?xml version="1.0" encoding="iso-8859-15" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head lang="fr" >
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>annuaire v1.0 - Metadonnées</title>
<link rel="stylesheet" type="text/css" media="screen" title="Classique" href="annuaire.css">
</head>
<body xml:lang="fr" lang="fr" >
<div id="zone_bandeau" >
<div id="logo">
<h1>
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaire" title="Retourner à la page d'accueil du wiki">
Retourner à la page d'accueil du wiki
</a>
</h1>
</div>
<div id="rapport_nom">
<h1>annuaire v1.0</h1>
</div>
<ul id="accessibilite">
<li><a href="#zone_contenu_tete">Aller au texte</a></li>
<li class="dernier"><a href="#zone_menu">Aller au menu</a></li>
</ul>
</div>
</div>
<div id="zone_contenu">
<p>Vous êtes ici : <a href="index.html">Accueil</a> > Metadonnées</p>
<div id="zone_contenu_tete">
<!-- CONTENU_TETE -->
</div>
<div id="zone_contenu_corps">
<h1> Module Metadonnées</h1>
<p id="miniature" >
<a href="images/modules/Metadonnees.png" title="Voir cette image avec un zoom de 100%.">
<img src="images/miniatures/miniature_Metadonnees.png" alt="Miniature du modèle du module Metadonnées" />
</a>
</p>
<h2> Description générale </h2>
<p>
<br />
<b>Révision : </b>1.1
</p>
<h2> Liste des tables </h2>
<ol class="type_01">
<li><a href="annuaire_table_annu_meta_colonne.html">annu_meta_colonne</a> : Contient l'ensemble des champs des tables de la base de données.<br />INFO : cmc_nom</li>
<li><a href="annuaire_table_annu_meta_ontologie.html">annu_meta_ontologie</a> : Liste l'ensemble des valeurs des tables de type liste.<br />Un champ contient des valeurs dans cette table quand il est de type "LISTE".<br />INFO : cmlv_nom</li>
<li><a href="annuaire_table_annu_meta_valeurs.html">annu_meta_valeurs</a> : Contient les champs supplémentaires (non standard ou de spécialisation) de la base de données.</li>
</ol>
<h2> Dépot SVN </h2>
<p>
Voir la page concernant ce module sur le dépot SVN :
<a href="http://svn.tela-botanica.net/websvn/listing.php?repname=Applications.annuaireannuaire.xml">
annuaire.xml
</a>
</p>
<h2> Commentaires </h2>
<p>N'hésitez pas à  laisser sur le wiki vos suggestions, réactions... concernant ce module :
<a href="http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliAnnuaireDiscussion_Metadonnées">
discussion sur le module Metadonnées
</a>.
</p>
</div>
<div id="zone_contenu_pied">
<p>Documentation générée le 9 février 2010 11:55:43</p>
<!-- CONTENU_PIED -->
</div>
<div id="zone_pied">
<p> &copy;<a href="http://www.tela-botanica.org/">Tela Botanica</a> / 2000-2008 - Le réseau des Botanistes Francophones</p>
</div>
</div>
<div id="zone_menu">
<!-- MENU -->
</div>
</body>
</html>