#!/usr/bin/perl -w
#
# Module: index.cgi
# Projet: SWaP
# Copyright (C) 2001-2007 Benoit PEUREUX - contact@informatique-utile.com
# Ce logiciel est un programme informatique servant a gerer un site Web.
#
#   Ce logiciel est regi par la licence CeCILL soumise au droit francais et
# respectant les principes de diffusion des logiciels libres. Vous pouvez
# utiliser, modifier et/ou redistribuer ce programme sous les conditions
# de la licence CeCILL telle que diffusee par le CEA, le CNRS et l'INRIA 
# sur le site "http://www.cecill.info".
#   En contrepartie de l'accessibilite au code source et des droits de copie,
# de modification et de redistribution accordes par cette licence, il n'est
# offert aux utilisateurs qu'une garantie limitee. Pour les memes raisons,
# seule une responsabilite restreinte pese sur l'auteur du programme, le
# titulaire des droits patrimoniaux et les concedants successifs.
#   A cet egard l'attention de l'utilisateur est attiree sur les risques
# associes au chargement, a l'utilisation, a la modification et/ou au
# developpement et a la reproduction du logiciel par l'utilisateur etant 
# donne sa specificite de logiciel libre, qui peut le rendre complexe a 
# manipuler et qui le reserve donc a des developpeurs et des professionnels
# avertis possedant des connaissances informatiques approfondies. Les
# utilisateurs sont donc invites a charger et tester l'adequation du
# logiciel a leurs besoins dans des conditions permettant d'assurer la
# securite de leurs systemes et/ou de leurs donnees et, plus generalement, 
# a l'utiliser et l'exploiter dans les memes conditions de securite. 
#   Le fait que vous puissiez acceder a cet en-tete signifie que vous avez 
# pris connaissance de la licence CeCILL, et que vous en avez accepte les
# termes.
#
# Version actuelle: 1.81 du 04 mai 2007
# Historique: voir fichier historique.txt
#
###############################################################################
use strict;
#use lib '/var/www/cgi-bin/';  # Ajuster le repertoire si besoin
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use iuGeneral;
use iuDataBase;
use iuLangues;
use iuGalerie;
use iuMail;

### Chargement dans ParamProg des variables globales du programme
  eval { require "iuSwap.pl"; } or die ("Erreur dans le fichier de configuration iuSwap.pl.\n$@");
  my $ParamProg = &GetConfig();

### Creation de la requete
  my $query = new CGI;

### Recuperation des parametres Rub et Art
  my $id_rubrique = &iuGeneral::LireParamQueryAvecDefaut( $query, 'Rub', -1, 1);
  my $id_article = &iuGeneral::LireParamQueryAvecDefaut( $query, 'Art', -1, 1);

### Gestion de la langue
  my ($motiflangues, $nblangues, $listelangues, $listedrapeaux) = &iuLangues::ExtraireParamLangues( $ParamProg );  
  my $Langue = 0;  # 0 = Francais par defaut, 1 = Anglais
  my $cookielg = $query->cookie(-name=> "Langue" );
  if (defined $cookielg) {  if ($cookielg == 1) { $Langue = 1; } }
  my $id_langue = &iuGeneral::LireParamQueryAvecDefaut( $query, 'Lang', -1, 1);
  if (($id_langue >= 0) and ($id_langue < $nblangues)) { 
    $Langue = $id_langue; 
    my @lastaction = split "=", &iuGeneral::LireParamQueryAvecDefaut( $query, 'LastAction', -1, 1);
    if ($lastaction[0] eq "Art") { $id_rubrique = -1; $id_article = $lastaction[1]; }
    if ($lastaction[0] eq "Rub") { $id_rubrique = $lastaction[1]; $id_article = -1; }
    }

### Ouverture de la base de donnees
  my $driver = "mysql"; 
  my $database = $ParamProg->{'NomDataBase'}; 
  my $hote = $ParamProg->{'HoteDataBase'}; 
  my $port = $ParamProg->{'PortDataBase'};
  my $utilisateur = $ParamProg->{'UtilisateurDataBase'}; 
  my $motdepasse = $ParamProg->{'MotPasseDataBase'};
  my $dbh = &iuDataBase::DBConnect( $driver, $database, $hote, $port, $utilisateur, $motdepasse);

### Variable Date + Heure
  my @t = localtime;  $t[5] += 1900;

### Parametres Divers
  my %ParamDivers = &TousLesParametresDivers( $dbh );

### Construction de l'entete du site
  my @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'entetepage'} );
  my $Entete = $Listes[$Langue];

### Construction du menu
  my @rubriques = &LireLesRubriques($dbh);
  my @hierarchie = split ";", &ClasserMenuRubriques(\@rubriques);
  if (($#hierarchie >= 0) and ($id_rubrique < 0)) {$id_rubrique = $rubriques[$hierarchie[0]]->{id_rubrique}; }
  my $Menu = q{};
  if ($#rubriques >= 0) {
    $Menu = q|<ul class="menu">|;
    for (my $k = 0; $k <=$#rubriques; $k++) {
      my $i = $hierarchie[$k];
      my $description = &iuLangues::ExtraireChaine( $ParamProg, $rubriques[$i]->{description}, $Langue );
      my $titre = &iuLangues::ExtraireChaine( $ParamProg, $rubriques[$i]->{titre}, $Langue );
      my $style = "menu";
      for (my $j=1; $j<=$rubriques[$i]->{niveau}; $j++) { $style = "ssmenu"; }
      my $ref = $ParamProg->{'URLRacineSite'}.'index.cgi?Rub='.$rubriques[$i]->{id_rubrique};
      $Menu .= q|<li class="|.$style.q|"><a href="|.$ref.q|" class="menu" target="_top" title="|.
        $description."\">".$titre."</a></li>";
      }
    $Menu .= q|</ul>|;
    }

### Construction du contenu
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'textepagevide'} );
  my $Contenu = $Listes[$Langue];
  my $Nature = 0;
  my @articles;
  my $actionurl = "";
  if ($id_article > 0) {
    @articles = &LireUnArticle($dbh, $id_article);
    $actionurl = "Art=".$id_article;
    if ($#articles < 0) { 
      @articles = &LireArticlesParRubrique($dbh, $id_rubrique); 
      $actionurl = "Rub=".$id_rubrique;
      }
    }
  else { 
    @articles = &LireArticlesParRubrique($dbh, $id_rubrique); 
    if ($#articles >= 0) { $actionurl = "Rub=".$id_rubrique; }
    }
  if ($#articles >= 0) { 
    $Contenu = &iuLangues::ExtraireChaine( $ParamProg, $articles[0]->{texte}, $Langue ); 
    $Nature = $articles[0]->{nature}; 
    }
  $Contenu =~ s/\$HOMEURL/$ParamProg->{'AcceuilSitePublic'}/g;
  $Contenu =~ s/\$ADMINURL/$ParamProg->{'URLSite'}/g;
  $Contenu =~ s/\$IMGDIR/$ParamProg->{'RepertoireImages'}/g;
  $Contenu =~ s/\$IMGURL/$ParamProg->{'UrlImages'}/g;
  $Contenu =~ s/\$DOCDIR/$ParamProg->{'RepertoireDocuments'}/g;
  $Contenu =~ s/\$DOCURL/$ParamProg->{'UrlDocuments'}/g;
  if ($Nature == 1) { 
    eval $Contenu; 
    if ($@) { $Contenu .= "<p>".$@."</p>"; }
    }

### Assemblage du corps de la page
#   on commence par construire la chaine des drapeaux
  my @drapeaux = ();
  my $ChaineDrapeaux = q||;
  if ($nblangues > 1) {
    for (my $i=0; $i<$nblangues; $i++) {
      my $chaine = $query->img({src=>$listedrapeaux->[$i], alt=>$listelangues->[$i], -height=>"15", -width=>"30", 
       -onClick=>"{ window.document.forms['Saisies'].elements['Lang'].value='".$i."'; window.document.forms['Saisies'].submit(); }"});
      push @drapeaux, $chaine;
      }
    $ChaineDrapeaux = join q|&nbsp;&nbsp;|, @drapeaux;
    }

  my $CorpsDeLaPage = q|<table  width="100%" border="0" cellpadding="0" cellspacing="0">|.
    q|<tr><td rowspan="2" class="menu2">|.$Menu;
### Prise en compte du multilinguisme en fin de menu
  if ($nblangues > 1) {
    $CorpsDeLaPage .= $query->br.$query->br.$query->start_multipart_form(-name=>"Saisies", -method=>"post").$query->hidden("Lang",$Langue).
      $query->hidden("LastAction",$actionurl).$ChaineDrapeaux.q{</form>};
    }
  $CorpsDeLaPage .= q|</td><td class="texte">|;
### Prise en compte du multilinguisme en debut de contenu
#   if ($nblangues > 1) {
#     $CorpsDeLaPage .= $query->start_multipart_form(-name=>"Saisies", -method=>"post").$query->hidden("Lang",$Langue).
#       $query->hidden("LastAction",$actionurl).$ChaineDrapeaux.q{</form>};
#     }
  $CorpsDeLaPage .= $Contenu."</td></tr></table>";

### Construction du pied de page et assemblage du bas de page
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'piedpage'} );
  my $PiedDePage = $Listes[$Langue];
# q|<div class="copyright"><p class="copyright">&copy; 2001-|.$t[5].
#     q|, <a class="copyright" href="http://www.informatique-utile.com ">Beno&icirc;t Peureux, L'informatique-utile.com</a>&nbsp;&nbsp;&nbsp;|.
#     q|Site r&eacute;alis&eacute; avec <a class="copyright" href="http://www.iuswap.com">SWaP</a>&nbsp;&nbsp;&nbsp;Consulter les |.
#     q|<a class="copyright" href="index.cgi?Art=10">mentions l&eacute;gales</a></p></div>|;

  my $BasDePage = q|<table  width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td>|.$PiedDePage.q|</td></tr></table>|;

### Liste des balises d'entete ( META, LINK, ...)
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'titresite'} );
  my $TitreSite = $Listes[$Langue];
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'auteursite'} );
  my $Auteur = $Listes[$Langue];
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'copyrightsite'} );
  my $Copyright = $Listes[$Langue];
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'descriptionsite'} );
  my $Description = $Listes[$Langue];
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'motsclefssite'} );
  my $MotsClefs = $Listes[$Langue];
  @Listes = &iuLangues::DecodeChaine( $ParamProg, $ParamDivers{'languesite'} );
  my $LangueSite = $Listes[$Langue];
  my $CharsetSite = q|UTF-8|;
  
  my $StartPage = q|<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">|.
    q|<html xmlns="http://www.w3.org/1999/xhtml" lang="|.$LangueSite.q|" xml:lang="|.$LangueSite.q|">|.
    q|<head>|.
    q|<title>|.$TitreSite.q|</title>|.
    q|<meta name="Author" content="|.$Auteur.q|" />|.
    q|<meta name="Generator" content="Projet SWaP: Site Web avec Perl, http://www.iuswap.com" />|.
    q|<meta name="Copyright" content="|.$Copyright.q|" />|.
    q|<meta name="Description" content="|.$Description.q|" />|.
    q|<meta name="Keywords" content="|.$MotsClefs.q|" />|.
    q|<meta name="Revisit-after" content="14 days" />|.
    q|<meta name="Robots" content="all" />|.
    q|<meta name="Email" content="|.$ParamProg->{'EmailWebmestre'}.q|" />|.
    q|<link type="text/css" media="all" rel="stylesheet" href="|.$ParamProg->{'UrlDocuments'}.q|styles.css" />|.
    q|<meta http-equiv="Content-Type" content="text/html; charset=|.$CharsetSite.q|" />|.
    q|<meta http-equiv="Content-Language" content="|.$LangueSite.q|" />|.
    q|</head><body>|;

### Affichage de la page
  my $cookie = $query->cookie( -name=> "Langue", -value=> $Langue );
  print $query->header( -type => "text/html", -charset => $CharsetSite, -cookie => $cookie ).
    $StartPage.$Entete.$CorpsDeLaPage.$BasDePage.$query->end_html;

### Fermeture de la base de donnees
  &iuDataBase::DBDisconnect($dbh);

### Fin et sortie
  exit 0;
#
###############################################################################
sub TousLesParametresDivers {
  my $dbh = shift;
  my %ParamDivers;
  my $q = 'SELECT * FROM general ';
  my $sth = &iuDataBase::DBExecuteSQL( $q, $dbh);
  my $href;
  while ( $href = &iuDataBase::DBFetchRow( $sth ) ) {
    $ParamDivers{$href->{'nom'}} = $href->{'contenu'};
    }
  return %ParamDivers;
  }
###############################################################################
sub LireLesRubriques {
  my $dbh = shift;
  my @rubriques = ();
  my $q = 'SELECT * FROM menus ORDER BY numordre, id_rubrique ';
  my $sth = &iuDataBase::DBExecuteSQL( $q, $dbh);
  my $href;
  while ( $href = &iuDataBase::DBFetchRow( $sth ) ) { push @rubriques, $href; }
  return @rubriques;
  }
###############################################################################
sub ClasserEnfantsRubriques {
  my $indice = shift;
  my $listerubriques = shift;
  my @rubriques = @$listerubriques;
  my $ret = "";
  my @e = split ";", $rubriques[$indice]->{"enfants"};
  if ($#e >= 0) {
    for (my $i=0; $i<=$#e; $i++) { $ret .= $e[$i].";".&ClasserEnfantsRubriques( $e[$i], $listerubriques); }
    }
  return $ret;
  }
###############################################################################
sub ClasserMenuRubriques {
  my $listerubriques = shift;
  my $ret = "";
  my @rubriques = @$listerubriques;
  my @parents = ();
  my @enfants = ();
  my %indices = ();
  for (my $i=0; $i<=$#rubriques; $i++) {
    $rubriques[$i]->{"enfants"} = ""; $rubriques[$i]->{"niveau"} = 0;  $rubriques[$i]->{"indice"} = $i;
    if ($rubriques[$i]->{"id_parent"} == 0) { push @parents, $i; }
    $indices{$rubriques[$i]->{"id_rubrique"}} = $i;
    }
  for (my $i=0; $i<=$#rubriques; $i++) {
    my $id_k = $rubriques[$i]->{"id_parent"};
    if ($id_k != 0) {
      my @e = split ";", $rubriques[$indices{$id_k}]->{"enfants"};
      push @e, $indices{$rubriques[$i]->{"id_rubrique"}};
      $rubriques[$indices{$id_k}]->{"enfants"} = join ";",@e;
      }
    }
  for (my $i=0; $i<=$#parents; $i++) {
    $ret .= $parents[$i].";".
      &ClasserEnfantsRubriques( $rubriques[$parents[$i]]->{"indice"}, $listerubriques);
    }
  my @classement = split ";", $ret;
  my $niveau = 0;
  for (my $i=0; $i<=$#classement; $i++) {
    my $id_k = $rubriques[$i]->{"id_parent"};
    if ($id_k != 0) { $rubriques[$i]->{"niveau"} = $rubriques[$indices{$id_k}]->{"niveau"} + 1; }
    }
  return $ret;
  }
###############################################################################
sub LireArticlesParRubrique {
  my $dbh = shift;
  my $id_rubrique = shift;
  my @articles = ();
  my $q = 'SELECT * FROM articles WHERE id_rubrique = '.&iuDataBase::DBQuote( $dbh, $id_rubrique);
  my $sth = &iuDataBase::DBExecuteSQL( $q, $dbh);
  my $href;
  while ( $href = &iuDataBase::DBFetchRow( $sth ) ) { push @articles, $href; }
  return @articles;
  }
###############################################################################
sub LireUnArticle {
  my $dbh = shift;
  my $id_article = shift;
  my @articles = ();
  my $q = 'SELECT * FROM articles WHERE id_article = '.&iuDataBase::DBQuote( $dbh, $id_article);
  my $sth = &iuDataBase::DBExecuteSQL( $q, $dbh);
  my $href;
  while ( $href = &iuDataBase::DBFetchRow( $sth ) ) { push @articles, $href; }
  return @articles;
  }
###############################################################################
#
### Fin du script ###
