<?php
# VERSION provencaux-290.php
# TODO
#  REQUETTE PRINCIPALE PRODUIT AUSSI DES RESULTATS AVEC exposants=0, CELA REQUIERT PLUSIEURS RATTRAPPAGES D'ERREURS. FAIRE PLUS PROPRE
#  RECHERCHER TOUS LES $voc UTILISES QUAND index.php MARCHE SUR LE NOUVEAU MODELLE ET LES MARQUER DANS LA BD DANS UNE COLONNE ADDITIONELLE, EFFACER TOUS LES AUTRES
#  EFFACER LES TABLES BD prov_markets et prov_marches
################################################################################################################
// INCLUDES
$sysFolder = '../sys/'; // AGIT CI-BAS ET DANS LE LIEN SUR CSS + JS EXTERNE
include_once('../../connect_vars_provence-guide_net.php');
include_once($sysFolder.'vocabulary.php');
include_once($sysFolder.'common.php');
include_once($sysFolder.'photos.php');
include_once($sysFolder.'comments.php'); // INCLUT mailer ET D'AUTRES INCLUDE
include_once($sysFolder.'header.php');
$category = 'marches'; // REQUIS POUR $voc ET MISE EN PAGE

// "NOW" N'EST MIS QUE PAR CES VARIABLES GLOBALES POUR POUVOIR TESTER TOUS TYPES DE MARCHÉS AVEC TOUTES TYPES DE DATES ET HEURES.
$nowHeute = date_create('now');
#$nowHeute = date_create('2021-07-05 19:00:00');
$nowMorgen = clone($nowHeute);
$nowMorgen->modify('+1 day');
$nowHeute00 = clone($nowHeute);
$nowHeute00 = date_create($nowHeute00->format('Y-m-d 00:00:00'));
$jdsHeute = $nowHeute->format('N');// JDS 1-7
$jdsEn = array('mon','tue','wed','thu','fri','sat','sun'); // POUR GENERATION DE LISTES, INTERVALES, PERIODES AVEC DATETIME
$jdsMonthCntEn = array(0,'first','second','third','fourth');
$pubSmall = '<script type="text/javascript" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6049981187637171" data-ad-slot="3879265300" data-ad-format="auto" data-full-width-responsive="true"></ins><script type="text/javascript"> (adsbygoogle = window.adsbygoogle || []).push({}); </script>';

////////////////////////////////////////////////////////////////
// PARAMETRES URL
////////////////////////////////////////////////////////////////

// N'ACCPTER QUE DES LANGUEES DEFINIES
$lang = "fr"; // DEFAULT
if(isset($_GET['lang'])&&($_GET['lang']=='de'||$_GET['lang']=='fr'||$_GET['lang']=='en')){
	$lang = $_GET['lang'];
}
$mid = null;
// SORTIE SANS ID DE MARCHE
if(!isset($_GET['id']) || !preg_match('/^[0-9]+$/', $_GET['id'])){
  redirectOnError($category,'midError');
} else {
  $mid = $_GET['id'];
}


########################################
# DEVELOPPEMENT
########################################

ini_set("display_errors",1);
#error_reporting(0); // FULL OFF
error_reporting(E_ALL); // FULL ON

/////////////////////////////////////////////////////
// FONCTIONS DE REQUETTE ET DE CONSTRUCTION DU NOM DE MARCHÉ POUR L'UTILSIATION DIRECTE SOUS provencaux.php ET POUR REMPLIR prov_marches.full_names[1-3] AVEC market_names_into_db.php
/////////////////////////////////////////////////////

// V288 20221124
// AJOUT dans DB de nom_fr,nom_de,nom_en ET REQUIS SOUS nomdirect AFFICHES DANS TITRE, PAGE TITRE ET TITES DES MARCHES ALTERNATIFS
// PAS ENCORE ENLEVÉ DE REQUETTES ET DE TRANSFORMATIONS NON NECESSAIRES
// AJOUT DANS DB DE type_marche[], C'EST UNE COPIE ÉLARGIE DE typeof[] MAIS AXÉ UNIQUEMENT SUR LE type, IL N'Y A PLUS D'INFO SUR LE NOM COMME été ETC. type_marche[2] EST COMME AVANt, MAIS UTILITÉ NON VERIFIÉE

////////////////////////////////////////
// FONCTIONS DE FORMATAGE
////////////////////////////////////////

// PREND UNE LISTE DE TEXTES À SEPARER PAR VIRGULES ET UN 'ET' EN DERNIER LIAISON. ACCEPTE ARRAY OU STRING À SEPARER PAR VIRGULES
// SPECIALITES: $also 'ET' LONG, $upperCase: MISE EN MAJUSCULE DES ELEMENTS DE LISTE POUR LES ADRESSES MAIS PAS POUR LE FRANCAIS
// ENTREE STRING OU ARRAY, SORTIE STRING
function niceImplode($lang,$arr,$also=null,$upperCase=null){ // $also : "Also"
  global $voc;
  if($arr===null){
    $arr='';
  }
  if(is_array($arr) == FALSE){
    $arr = explode(',',$arr);
  }
  foreach($arr as $key => $val){
    $val = trimDoubleSpace($val);
    if($upperCase != null && $lang != 'fr'){
      $val = mb_ucfirst($val);
    }
    $arr[$key] = $val;
  }
  if($also != null && $also != 'Also'){
    $also = '';
  }
  $arr = array_values(array_filter($arr)); // EFFACE ELEMENT VIDES ET REMET LES CLÉS À ZERO
  $lng = count($arr);
  $ret = "";
  for ($i = 0; $i < $lng; $i++) {
    $ret .= $arr[$i];
    if($i < $lng - 2){
      $ret .= ', ';
    } elseif($i < $lng - 1){
      $ret .= ' '.$voc['and'.$also].' ';
    }
  }
  return $ret;
}

// RETOURNE DES HEURES ET MINUTES PROPRES POUR TEMPS RESTANTS AVANT/DURANT LE MARCHÉ ACTUEL
// ENTRÉE DATEINTERVAL, SORTIE STRING
function niceTime($di){
  // IL N'EST PAS POSSIBLE DE CALCULER DIRECTEMENT AVEC UN DATEINTERVAL
  #printR($di);
  $i = round($di->format('%i')/10)*10; // ARRONDIR À DImtTheINES
  $h = $di->format('%h');
  if($i > 59){
    $h++;
    $i = null;
  }
  if(($h > 2 && $i > 0) || $i == 0){ // PLUS DE 3h
    $i = null;
  }
  if($h == 0){
    if($i == null){
      $i = 10;
    }
    $ret = $i.' min';
  } else {
    if($i == null){
      $ret = $h.' h';
    } else {
      $ret = $h.':'.$i.' h';
    }
  }
  return $ret;
}


// REND JOURS SI MOINS D'UN MOIS, MOIS AU-DELÀ. SI LES ANNÉES DIFFÈRENT DE 1: ANNÉE PROCHAINE.
// RREMET LES HEURES DU JOUR À ZERO
// PART DU PRINCIPE QUE LA DIFFERENCE NE DEPASSE PAS 1 AN CAR SINON UNIQUEMENT UN GRAND NOMBRE DE MOIS EST ISSU.
// RETURNE UNE LISTE AVEC LE NOMBRE DE JOURS ABSOUL ET L'INTERVALE DE TEMPS EN TEXTE, ACCPETE DES DATES EN STRING ET EN OBJETS DATE
// SPECIALITES: SANS UNE DES DEUX DATES, LA DATE MANQUANTE EST REMPLACEE PAR AUJOURD'HUI
// UTILISÉ POUR LES DATES SOURCE TROP VIEILLES
// UTILISÉ POUR L'INFO marché dans tant de temps
function niceDateInterval($startDate=null,$endDate=null,$nice=null){
  global $lang,$voc,$nowHeute00,$jdsHeute;
  $today = $nowHeute00;
  if($startDate == null){
    $startDate = $today;
  } else {
    if(is_string($startDate)){
      $startDate = date_create($startDate);
    }
  }
  if($endDate == null){
    $endDate = $today;
  } else {
    if(is_string($endDate)){
      $endDate = date_create($endDate);
    }
  }
  $startDate = date_create($startDate->format('Y-m-d 00:00:00'));
  $endDate = date_create($endDate->format('Y-m-d 00:00:00'));
  $daysdiff = $endDate->diff($startDate)->format('%a');
  if($daysdiff == 1){
    $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['demain']).' '.$voc['jdsNorm'.($endDate->format('N')-1)].$voc['nextMarcheDay2'];
  } elseif($daysdiff == 2){
    $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['apresdemain']).' '.$voc['jdsNorm'.($endDate->format('N')-1)].$voc['nextMarcheDay2'];
  } elseif($daysdiff < 8){
    if($lang == 'fr'){
      $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['jdsNorm'.($endDate->format('N')-1)].' '.$voc['nextJds']).$voc['nextMarcheDay2'];
    } else {
      $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['nextJds'].' '.$voc['jdsNorm'.($endDate->format('N')-1)]).$voc['nextMarcheDay2'];
    }
  } elseif($daysdiff < 30){
    $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['dansTemps'].' '.$daysdiff.' '.$voc['dansJoursPluriel']).$voc['nextMarcheDay2'];
  } else {
    $mois = round($daysdiff/30.4167);
    if($mois == 1){
      $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['dansTemps'].' 1 '.$voc['dansMoisSingulier']).$voc['nextMarcheDay2'];
    } else {
      $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['dansTemps'].' '.$mois.' '.$voc['dansMoisPluriel']).$voc['nextMarcheDay2'];
    }
  }
  if($endDate->format('Y') - $startDate->format('Y') == 1){
    $res = $voc['nextMarcheDay1'].wrapHTML('b',$voc['nextYear']).$voc['nextMarcheDay2'];
  }
  $retNice = '';
  if($nice != null){
    $sd = $startDate->format('d.m.Y');
    if($endDate->format('Y') - $startDate->format('Y') == 0){
      $sd = $startDate->format('d.m.');
      if($endDate->format('m') - $startDate->format('m') == 0){
        $sd = $startDate->format('d.');
      }
    }
    $retNice = $voc['jdsDuAu1'].' '.$sd.' '.$voc['jdsDuAu2'].' '.$endDate->format('d.m.Y');
    if($startDate == $endDate){
      $retNice = $endDate->format('d.m.Y');
    }
  }
  return array($res,$daysdiff,$retNice);
}

// ENTOURE UN TEXTE AVEC UNE BALISE HTML. LA DIFFERENCIATION EN $tag1 ET $tag2 PERMET D'AJOUTER DES ATTRIBUTS À $tag1
## À UTILISER PLUS TARD POUR TRANFORMER CELA EN BALISES DIV OU SPAN AVEC FORMATAGE CSS
function wrapHTML($tag,$val){
  if($tag == "small"){
    $tag1 = 'small';
    $tag2 = 'small';
  }
  if($tag == "b"){
    $tag1 = 'b';
    $tag2 = 'b';
  }
  if($tag == "p"){
    $tag1 = 'p';
    $tag2 = 'p';
  }
  if($tag == "t2"){ // ELEMENTS DE LA LIGNE 2 DU TABLEAU DES MARCHÉS
    $tag1 = 'div style="font-weight:bold"';
    $tag2 = 'div';
  }
  if($tag == "t2time"){ // ELEMENTS DE LA LIGNE 2 DU TABLEAU DES MARCHÉS
    $tag1 = 'div class="tabSemSpecInfo"';
    $tag2 = 'div';
  }
  if($tag == "t2addtext"){ // ELEMENTS DE LA LIGNE 2 DU TABLEAU DES MARCHÉS
    $tag1 = 'div class="tabSemSpecInfo"';
    $tag2 = 'div';
  }
  if($tag == "t2heute"){ // ELEMENTS DE LA LIGNE 2 DU TABLEAU DES MARCHÉS
    $tag1 = 'div style="padding-top:5px"';
    $tag2 = 'div';
  }
  if($tag == "t2prods"){ // PPRODUIS EN PLUS OU UNIQUEMENT DANS LA LIGNE 2 DU TABLEAU DES MARCHÉS
    $tag1 = 'div';
    $tag2 = 'div';
  }
  if($tag == "tm"){ // PARAGRAPHES DU TEXTE PRINCIPAL
    $tag1 = 'div';
    $tag2 = 'div';
  }
  return "<".$tag1.">".$val."</".$tag2.">";
}

// RETOURNE DES CATEGORIES DE TAILLE DE MARCHE POUR LES MARCHÉS TYPE 234, A UTILISER AINSI: $voc['exposantsNr1']
function literalExposantsNr($exposants){
  if($exposants < 6){
    return 1;
  } elseif($exposants < 11){
    return 2;
  } elseif($exposants < 21){
    return 3;
  } elseif($exposants < 51){
    return 4;
  } else{
    return 5;
  }
}

////////////////////////////////////////
// FONCTIONS D'ORTHOGRAPHIE
////////////////////////////////////////

// SEPARE LES LANGUES DE DELIMITES PAR LE SIGNE "|" SOUS adr_gps ET adresse_lieu_dit
// AJOUTE DES PREPOSITIONS ADAPTEES POUR ALLEMAND ET ANGLAIS
// AJOUTE UN FORMATAGE POUR L'AFFICHAGE EN GRAS DANS LE TEXTE
function sortAdresse($lang,$val,$deNoAdds=null,$onlyAdr=null){ // EXTRAIT LANGUE DE "|fr|de|en|texte"
  if($val===null){
    $val='';
  }
  if(preg_match('/^\|/',$val)){
    $val = explode("|", $val);
    if(isset($onlyAdr)){
      return $val[4];
    }
    // MISE EN MAJUSCULE SOUS niceImplode
    if($lang == "fr"){
      $val = $val[1].' '.wrapHTML('b',$val[4]);
    } elseif($lang == "de"){
      $val = $val[2].' '.wrapHTML('b',$val[4]);
    } elseif($lang == "en"){
      $val = $val[3].' '.wrapHTML('b',$val[4]);
    } 
  } else { // AUTRES FORMATAGES
    if(isset($onlyAdr)){
      return $val;
    }
    if($lang == "de" || $lang == "en"){
      if($deNoAdds != 1 && !preg_match('/,/',$val)){
        if(preg_match('/^(quai|place|grand\'place|cours|chemin|champ|espace|boulevard)/i',$val)){
          if($lang == 'de'){
            $val = 'am '.wrapHTML('b',mb_ucfirst($val));
          } elseif($lang == 'en'){
            $val = 'on the '.wrapHTML('b',mb_ucfirst($val));
          }
        } elseif(preg_match('/^(rue|avenue|grand rue|grande rue|allée|contre|impasse|montée|passage|traverse)/i',$val)){
          if($lang == 'de'){
            $val = 'in der '.wrapHTML('b',mb_ucfirst($val));
          } elseif($lang == 'en'){
            $val = 'in the '.wrapHTML('b',mb_ucfirst($val));
          }
        } elseif(preg_match('/^(corniche|promenade|rocade|route|esplanade|plage|porte)/i',$val)){
          if($lang == 'de'){
            $val = 'an der '.wrapHTML('b',mb_ucfirst($val));
          } elseif($lang == 'en'){
            $val = 'at the '.wrapHTML('b',mb_ucfirst($val)); ##EN
          }
        } else {
          $val = wrapHTML('b',mb_ucfirst($val));
         }
      } else {
        $val = wrapHTML('b',mb_ucfirst($val));
      }
    } else { // FRANCAIS
      $val = wrapHTML('b',$val);
    }
  }
  return $val;
}

////////////////////////////////////////
// FONCTIONS TEMPORELLES GENERALLES
////////////////////////////////////////

// RETOURNE UNE DUREE POSITIVE SI $now EST DANS L'INTERVALE, UNE DUREE NEGATIVE SI $now EST AVANT L'INTERVALE, NULL QUAND L'INTERVALE EST PASSÉ
// ENTREE DATES EN STRING, SORTIE INTERVALES EN STRING
function checkInTimes($start,$end,$nice=null){
  global $nowHeute,$voc; 
  $actuel = 0;
  $start = date_create($nowHeute->format('Y-m-d ').$start);
  $end = date_create($nowHeute->format('Y-m-d ').$end);
  $intervalSN = date_diff($start,$nowHeute);
  $intervalEN = date_diff($nowHeute,$end);
  #printR(array($start,$nowHeute,$end),'cit');
  if($nowHeute >= $start && $nowHeute <= $end){ // DANS L'INTERVALE, RETOURNE TEMPS RESTANT POSITIF
    $actuel = 1;
    $rel = $intervalEN;//->format('%r%H:%I');
  } elseif($nowHeute < $start){ // AVANT L'INTERVALE, RETOURNE TEMPS AVANT LE COMMENCEMENT NEGATIF
    $rel = $intervalSN;//->format('%r%H:%I');
  } else { // APRÈS L'INTERVALE N'EST PAS INTERESSANT. RESTE NULL
    $rel = null;
  }
  $retNice = '';
  if($nice != null){
    $endNice = $end->format('H:i').'h';
    $startNice = $start->format('H:i');
    if($end->format('i') == 0){
      $endNice = $end->format('G').'h';
    }
    if($start->format('i') == 0){
      $startNice = $start->format('G');
    }
    $retNice = $startNice.' '.$voc['jdsA'].' '.$endNice;
  }
  return array($start,$end,$rel,$actuel,$retNice);
}

// RETOURNE LES ANNEES CORRIGEES A PARTIR DE prov_marches_spec, LA POSITION PARRAPORT A LA DATE ACTUELLE (-1 AVANT, +1 APRES, 0 DANS LA PERIODE)
// ET SI LES DEUX DATES SONT DANS LA MEME ANNEE
// HEUTE SEULEMENT SI > 0. CETTE INFORMATION NE PEUT PAS VENIR DES DEUX DATES BUTOIRS SEULES CAR HEUTE PEUT AUSSI ÊTRE UNE PERIODE DE PLUSIEURS JOURS
// ENTREE DATES EN STRING, SORTIE DATES EN DATETIME, PERIODES EN OBJETS
function checkInPeriod($start,$end,$heute=0,$now=1){
  global $nowHeute;
  $actuel = 0;
  $start = date_create($start);
  $end = date_create($end);
  if($now === 1){
    $now = $nowHeute;
  } elseif(!is_object($now)){
    $now = date_create($now);
  }
  $now = date_create($now->format('Y-m-d').' 00:00:00');// POUR COMPARAISONS PLUS BAS POUR NE PAS AVOIR LE DERNIER/PREMIER JOUR HORS DE LA PERIODE À CAUSE DES HEURES DE $nowHeute (09:00:00) ET LES HEURES DU JOUR BUTOIR (00:00;00)
  $startY = $start->format('Y');
  $endY = $end->format('Y');
  $nowY = $now->format('Y');
  // CORRECTION VERS L'ANNEE ACUELLE DANS TOUS LES CAS BASÉ SUR L'ANNEE start
  $start->modify('+'.($nowY-$startY).' years');
  $end->modify('+'.($nowY-$startY).' years');
  $rel = 0;
  $intervalSN = date_diff($start,$now);
  $intervalEN = date_diff($now,$end);
  if($now >= $start && $now <= $end){ // DANS L'INTERVALE
    $actuel = 1;
    if($heute > 0){
      $actuel = 2;
    }
    $rel = $intervalEN; // TEMPS RESTANT POSITIF
  } elseif($now < $start){ // AVANT L'INTERVALE
    $rel = $intervalSN; // RETOURNE TEMPS AVANT LE COMMENCEMENT NEGATIF
  } elseif($now > $end){
    $start->modify('+1 year');
    $end->modify('+1 year');
    $rel = null;
  }
  $short = 0;
  if($startY == $endY){ // CAS NORMAL, LAISSER DE CÔTÉ L'ANNÉE À start DANS L'AFFICHAGE ## PAS REALISÉ LORS DU SAUT VERS L'ANNÉE SUIVANTE ?
    $short = 1;
  }
  return array($start,$end,$rel,$actuel,$short);
}

////////////////////////////////////////////////////////////////
// OPERATIONS BD
////////////////////////////////////////////////////////////////

$my_pg_connect = pg_connect("host=$hostname dbname=$database user=$username password=$password") or dieNice("ERROR: FAILED TO CONNECT TO DATABASE IN marches/provencaux.php/main/connect");

// LANGUE
$voc = getVoc($lang,$category);
$markets = null;

// REQUETTE DIFFERENCIÉE POUR TOUTE UNE PAGE ($mid > 0) ET SEULEMENT LE NOM DE MARCHÉ. REMPLIT $markets INITIAL
// 40 MARCHES DE TYPE 1-4. TROUVE AUSSI DES TYPES 2,3,4 SI TYPE 1 A 0 EXPOSANTS 
$my_sql = "
SELECT DISTINCT
  prov_marches.nom_$lang as nomdirect, --NEW
  prov_marches.quartier,
  prov_marches.id AS mid,
  prov_marches.mar_sta_hal[1] AS typmarche,
  prov_communes.id AS cid,
  prov_communes.com_name,
  prov_communes.prefix,
  prov_communes.short_name,
  prov_communes.name_de AS com_name_de
  ";
  if($mid > 0){
    $my_sql .= "
      ,
      prov_marches.couvert,
      prov_marches.adr_lieudit,
      prov_marches.adr_gps,
      prov_marches_lang_adr.text AS adr_lang,
      prov_communes.code_postal,
      prov_communes.dept_ref,
      prov_marches.exposants,
      ST_AsText(prov_marches.the_geom) AS market_geom,
      prov_marches.id_ref,
      prov_marches.com_ref,
      prov_marches.jour0sem,prov_marches.jour1sem,prov_marches.jour2sem,prov_marches.jour3sem,prov_marches.jour4sem,prov_marches.jour5sem,prov_marches.jour6sem,
      prov_marches.prod_alimentaire,prov_marches.prod_producteur,prov_marches.prod_fromage,prov_marches.prod_bio,prov_marches.prod_poisson,prov_marches.prod_viande,prov_marches.prod_charcuterie,prov_marches.prod_fleurs,prov_marches.prod_truffes,prov_marches.prod_forain,
      prov_marches.source,
      prov_marches.source_date,
      prov_marches.add_text_block,
      ST_DistanceSphere(prov_marches.the_geom, (SELECT prov_marches.the_geom FROM prov_marches WHERE prov_marches.id = $mid)) AS dist,
      (CASE -- SELECTION TYPE DE MARCHE 1-4
        WHEN prov_marches.id = $mid THEN 1	
        WHEN (SELECT prov_marches.id_ref FROM prov_marches WHERE prov_marches.id = $mid) = prov_marches.id_ref THEN 2
        WHEN (SELECT prov_marches.com_ref FROM prov_marches WHERE prov_marches.id = $mid) = prov_marches.com_ref THEN 3
        ELSE 4
      END) AS typ,
      (CASE WHEN prov_photos.filename ISNULL THEN prov_photos_alt.filename ELSE prov_photos.filename END) AS thumbsfilename, -- DONNE UN THUMB
        prov_marches.sv_lat,prov_marches.sv_long,prov_marches.sv_long,prov_marches.sv_heading,prov_marches.sv_pitch, prov_marches.sv_zoom,prov_marches.sv_vis
    ";
  }
  $my_sql .= "
    FROM
      prov_marches
      -- COMMUNES
      INNER JOIN prov_communes ON prov_marches.com_ref = prov_communes.id
  ";
  if($mid > 0){
    $my_sql .= "
      -- THUMBS, LES PHOTOS DU MARCHE PRINCIPAL SONT DEMANDÉS PLUS TARD
      LEFT JOIN prov_photos ON prov_marches.id = prov_photos.category_id_ref[1] AND prov_photos.category[1] = 1
      LEFT JOIN prov_photos AS prov_photos_alt ON prov_marches.id = prov_photos_alt.market_alt[1] AND prov_photos_alt.market_alt[2] = 1 -- DOIT ETRE UNIQUE, SINON DUPLICATION DU MARCHE DANS LE RESULTAT
      -- ADRESSE
      INNER JOIN prov_marches_lang AS prov_marches_lang_adr ON prov_marches_lang_adr.hashkey = prov_marches.adr_desc AND prov_marches_lang_adr.lang = '$lang' -- DOIT ETRE UNIQUE, SINON DUPLICATION DU MARCHE DANS LE RESULTAT
      WHERE
      prov_marches.exposants > 0
      AND (
        prov_marches.id = $mid
      OR
       (SELECT prov_marches.id_ref FROM prov_marches where id = $mid) = prov_marches.id_ref -- LES MARCHES DE TYPE 2
      OR
       (SELECT prov_marches.com_ref FROM prov_marches where id = $mid) = prov_marches.com_ref -- LES MARCHES DE TYPE 3
      OR
        ST_DistanceSphere(prov_marches.the_geom, (SELECT prov_marches.the_geom FROM prov_marches WHERE id = $mid)) <= 50000 -- ## LES MARCHES DE TYPE 4
      )
      ORDER BY typ,dist -- ## typmarche ASC, mid ASC   --mid 
      LIMIT 40
      ";
  }
  $my_sql .= "
  ;
";
$my_result_set = pg_exec($my_pg_connect, $my_sql) or dieNice("ERROR: DATABASE CONNECTION PROBLEMS IN market/main",2,$my_sql);
$markets = pg_fetch_all($my_result_set);


##printR($markets[0]);
// TROUVE AUSSI DES TYPES 2,3,4 SI TYPE 1 A 0 EXPOSANTS, DONC IL Y SOUVENT UN RESULTAT, IL FAUT CHERCHER LA SORTIE PLUS BAS.
// PEUT AUSSi SE DECLANCHER EN CAS D'ERREUR DANS prov_marches_lang PAR EXEMPLE
if($markets == FALSE){ 
  redirectOnError($category,'noValidMid');
}


////////////////////////////////////////////////////////////////
// TRAVAIL SUR RESULTATS DE LA REQUETE PRINCIPALE DANS prov_marches
////////////////////////////////////////////////////////////////

// PASSAGE DANS LES RESULTATS PRINCIPAUX: LIMITATION DE LA LISTE ET MAQUAGE DU SURPLUS PAR typ=99, PREPARATION DES DONNÉES JDS POUR UNE DEUXIÉME REQUETE.
$listeJdsRefs = array(); // LISTE DE MARCHES SPECIAUX DE TYPE 1234
$countMarches123Page = 0;
$countMarches1 = 0;
$countMarches4Page = 0;
$countMarches4Dist = 0;
$photoData = array();
$photoQualGen = array('actif'=>0,'lieusans'=>0,'lieugen'=>0);
foreach($markets as $mkey => $mval){
  // LISTE DE IDS DE market_ref DANS LES JDS
  if($mval['typ'] == 1){
    $countMarches1++;
  }
  if($mval['typ'] < 4){
    $countMarches123Page++;
  } else {
    $countMarches4Page++;
  }
  if($countMarches4Page < 11 && $countMarches123Page + $countMarches4Page < 41){ // LIMITE LE NOMBRE DE TYPES AFFICHÉS.
    $countMarches4Dist = $mval['dist']; // EN FIN D'ITERATION CONTIENT LA DISTANCE MAXIMALE
    // PREPARATION DE LA REQUETE POUR INFORMATION JDS
    if($mval['jour0sem'] > 1){$listeJdsRefs[$mval['jour0sem']]=1;} // NEW OK
    if($mval['jour1sem'] > 1){$listeJdsRefs[$mval['jour1sem']]=1;}
    if($mval['jour2sem'] > 1){$listeJdsRefs[$mval['jour2sem']]=1;}
    if($mval['jour3sem'] > 1){$listeJdsRefs[$mval['jour3sem']]=1;}
    if($mval['jour4sem'] > 1){$listeJdsRefs[$mval['jour4sem']]=1;}
    if($mval['jour5sem'] > 1){$listeJdsRefs[$mval['jour5sem']]=1;}
    if($mval['jour6sem'] > 1){$listeJdsRefs[$mval['jour6sem']]=1;}
    // TRANSFORMATIONS DE VALEURS SIMPLES
    $markets[$mkey]['market_geom'] = explode(',',preg_replace('/^POINT\((\d+.\d{1,4})\d+ (\d+.\d{1,4})\d+\)$/','$1,$2', $markets[$mkey]['market_geom'])); // TRANSFORMATION ET RACCOURCIS DES PLACES DECIMALES À 4
    // POUR LES MARCHES DE TYPE 2, 3 ET 4
    $markets[$mkey]['forTexte']['exposantsForType234'] = $voc['mtExposantsNr'.literalExposantsNr($mval['exposants'])]; // NEW OK
    // MARCHE PRINCIPAL
    if($mval['mid'] == $mid){
      // LISTE DES PRODUITS
      $prodArray = array();
      $markets[$mkey]['forTexte']['out_produits_icons'] = '';
      if($mval['prod_alimentaire'] != ""){
        $prodArray[] = $voc['prod_alimentaire'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_alimentaire'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-alimentaire"></use></svg></div>';
      }
      if($mval['prod_producteur'] != ""){
        $prodArray[] = $voc['prod_producteur'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_producteur'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-producteur-'.$mval['dept_ref'].'"></use></svg></div>';
      }
      if($mval['prod_fromage'] != ""){
        $prodArray[] = $voc['prod_fromage'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_fromage'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-fromage"></use></svg></div>';
      }
      if($mval['prod_bio'] != ""){
        $prodArray[] = $voc['prod_bio'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_bio'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-bio"></use></svg></div>';
      }

      if($mval['prod_poisson'] != ""){
        $prodArray[] = $voc['prod_poisson'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_poisson'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-poisson"></use></svg></div>';
      }
      if($mval['prod_viande'] != ""){
        $prodArray[] = $voc['prod_viande'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_viande'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-viande"></use></svg></div>';
      }
      if($mval['prod_charcuterie'] != ""){
        $prodArray[] = $voc['prod_charcuterie'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_charcuterie'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-charcuterie"></use></svg></div>';
      }
      if($mval['prod_fleurs'] != ""){
        $prodArray[] = $voc['prod_fleurs'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_fleurs'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-fleurs"></use></svg></div>';
      }
      if($mval['prod_truffes'] != ""){
        $prodArray[] = $voc['prod_truffes'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_truffes'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-truffes"></use></svg></div>';
      }
      if($mval['prod_forain'] != ""){
        $prodArray[] = $voc['prod_forain'];
        $markets[$mkey]['forTexte']['out_produits_icons'] .= '<div class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_forain'].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-forain"></use></svg></div>';
      }

      // DISCLAIMER, SOURCE, DATE
      // SOURCE ET DATE, SI UN DES DEUX MANQUE, TOUTE LA PHRASE EST IGNORÉE
      if($mval['source'] != '' || $mval['source_date'] != ''){
        $phraseVerif = $voc['mtDataVerif1']." ";
        if(isset($voc[$mval['source']])){
          $phraseVerif .= $voc[$mval['source']]." "; // KEY=VOC
        } else {
          $phraseVerif .= $voc['mtDataVerifBy']." ".$mval['source']." "; // NOM PROPRE
        }
        $daysdiff = niceDateInterval($mval['source_date'],null);
        if($daysdiff[1] < 1500){ // 4 ANS
          $phraseVerif .= $voc['mtDataVerif2']." ".niceDate($lang,$mval['source_date'],'text');
        } else {
          $phraseVerif .= $voc['mtTooLong'];
        }
        $phraseVerif .= $voc['mtDataVerif3'].".";
      }

      if(isset($mval['add_text_block'])){
        include_once('./'.$mval['add_text_block'].'.php'); // REND DISPONIBLE LA VARIANLE $addTextBlock[lang] À UTILISER TEL QUEL AILLEURS
      }
     
      // LA RECOMPOSITION DU TEXTE SE FAIT PLUS TARD POUR AJOUTER DES DONNEES DE MARCHES SPECIAUX ET PHOTOS
      // LES PHOTOS DU MARCHE PRINCIPAL
      $my_sql = "SELECT id,filename,licence_type,date_licence,author_name,author_link,orig_photo_link,desc_".$lang." AS desc,text_".$lang."[1] AS text,market_alt[1] AS market_alt, type_lieu, type_jdm, type_general FROM prov_photos WHERE (category_id_ref[1] = $mid AND category[1] > 0) OR market_alt[1] = $mid ORDER BY CASE WHEN category[1] = 0 THEN market_alt[2] WHEN category[1] > 0 THEN category[1] END ASC;";
      $my_result_set = pg_exec($my_pg_connect, $my_sql) or dieNice("ERROR: DATABASE CONNECTION PROBLEMS IN market/photos",2,$my_sql);
      $photos = pg_fetch_all($my_result_set);
      foreach($photos as $pkey => $pval){
        $photoData[] = $pval;
        if($pval['market_alt'] == null && $pval['type_lieu'] > 0 && $pval['type_jdm'] > 0){
          $photoQualGen['actif']++;
        }
        if($pval['market_alt'] == null && $pval['type_lieu'] > 0 &&  $pval['type_jdm'] == null){
          $photoQualGen['lieusans']++;
        }
         if($pval['market_alt'] == null && $pval['type_lieu'] > 0 && $pval['type_general'] > 0){
          $photoQualGen['lieugen']++;
        }
      }  
    } // FIN IF $mid
  } else {
     unset($markets[$mkey]); // EFFACER LES ENTRÉES EN TROP
  }
} // FIN FOREACH MARKET


// CE N'EST QU'APRÈS LA PREMIERE BOUCLE APRÈS LA REQUETTE QUE LA SORTIE EN CAS DE MARCHÉ SANS EXPOSANTS EST POSSIBLE
if($countMarches1 == 0){
  redirectOnError($category,'midNoExposants');
}

if($markets[0]['com_ref']==245 && $lang=='de'){ // POUR EVITER LES REQUETTES COMPLIQUÉES, C'EST LE SEUL CAS.
  $markets[0]['com_name'] = "Nizza";
}

if(count($listeJdsRefs)>0){
  // LES DONNÉES DES MARCHÉS SPÉCIAUX SE TROUVENT SOUS $listeJdsRefs[mid]=[colname=>value, ...]. SEULEMENT APRES UN LA PREMIERE REQUETTE DANS LA BD
  // LA VALEUR 1 POUR MARCHÉ NORMAL N'EST PAS INCLUSE, LA LISTE $listeJdsRefs PEUT DONC ETRE VIDE
  $my_sql = "
    SELECT DISTINCT prov_marches_spec.*, prov_marches_lang.text FROM prov_marches_spec
    LEFT OUTER JOIN prov_marches_lang ON prov_marches_lang.hashkey = COALESCE(prov_marches_spec.periode_ref,'noname$lang') AND prov_marches_lang.lang = '$lang'
    WHERE market_ref = ".implode(" OR market_ref = ", array_keys($listeJdsRefs)).";";
  $my_result_set = pg_exec($my_pg_connect, $my_sql) or dieNice("ERROR: DATABASE CONNECTION PROBLEMS IN market/markets_spec_data",2,$my_sql);
  $markets_spec = pg_fetch_all($my_result_set);

  $listeJdsRefs2d = array();
  foreach($markets_spec as $keyMarcheSpecData => $valMarcheSpecData){
    $listeJdsRefs2d[] = array(
      'market_spec_id' => $valMarcheSpecData['id'],
      'market_ref' => $valMarcheSpecData['market_ref'],
      'start_time' => $valMarcheSpecData['start_time'],
      'end_time' => $valMarcheSpecData['end_time'],
      'start_date' => $valMarcheSpecData['start_date'],
      'end_date' => $valMarcheSpecData['end_date'],
      'periode_ref' => $valMarcheSpecData['periode_ref'],
      'is_weekday_independent' => $valMarcheSpecData['is_weekday_independent'],
      'date_vague' => $valMarcheSpecData['date_vague'],
      'prod_alimentaire' => $valMarcheSpecData['prod_alimentaire'],
      'prod_producteur' => $valMarcheSpecData['prod_producteur'],
      'prod_forain' => $valMarcheSpecData['prod_forain'],
      'prod_fleurs' => $valMarcheSpecData['prod_fleurs'],
      'prod_poisson' => $valMarcheSpecData['prod_poisson'],
      'prod_viande' => $valMarcheSpecData['prod_viande'],
      'prod_bio' => $valMarcheSpecData['prod_bio'],
      'prod_truffes' => $valMarcheSpecData['prod_truffes'],
      'prod_fromage' => $valMarcheSpecData['prod_fromage'],
      'prod_charcuterie' => $valMarcheSpecData['prod_charcuterie'],
      'par_mois' => $valMarcheSpecData['par_mois'],
      'text' => $valMarcheSpecData['text']
    );
  }
  // LES VALEURS DE market_ref NE SONT PAS UNIFORMES ET SONT EN RELATION 1:n PAR RAPPORT À mid (PAR EX 1398 ET 1001398.
  // IL Y A AUSSI DES ENTREES MULTIPLES COMME MID 550 OU 2514 IL FAUT DONC RETOURNER SUR LA LISTE PRINCIPALE $markets

  // CREATION VIRUTELLE DE MARCHÉS x FOIS PAR MOIS À PARTIR D'UNE ENTRÉE UNIQUE DANS prov_marches_spec (par_mois)
  // CONDITIONS: L'ENTRÉE SOUS prov_marches_spec DOIT ETRE UNIQUE,
  ## LES JOURS QUI SE SUIVENT SONT RECONNUS GRAPHIQUEMENT MAIS PAS LOGIQUEMENT. LE JOURS SUIVANT VALABLE EST CEPENDANT CORRECTEMENT INDIQUÉ 
  // TOUTES LES AUTRES VARIANTES SONT ACCEPTÉS
  // A LIEU SOUS if(count($listeJdsRefs)>0) CAR IL Y A DES MARCHES DONT TOUS LES MARCHÉS VOISINS SONT NORMAUX (comme 598)
  foreach($listeJdsRefs2d as $skey => $sval){
    if($sval['market_ref']== $mid && $sval['start_date'] != "" && $sval['end_date'] != ""){
      $markets[0]['irregulierAnnee'] = TRUE; // POUR LE TEXTE SEULEMENT
    }
    if($sval['market_ref']== $mid && $sval['start_time'] != "" && $sval['end_time'] != ""){
      $markets[0]['irregulierJour'] = TRUE; // POUR LE TEXTE SEULEMENT
    }
    if(isset($sval['par_mois']) && $sval['par_mois'] < 5){ // PORT DE BOUX A par_mois = 9 QUI N'EXISTE PAS 
      $jdsHere = array();  
      foreach($markets as $mkey => $mval){
        if($mval['mid'] == $sval['market_ref']){
          for($j=0;$j<7;$j++){
            if($mval['jour'.$j.'sem'] == $sval['market_ref']){ // IL Y A DES MARCHÉS x PAR MOIS SANS LIMITE DE TEMPS
              if(isset($sval['start_date'])){
                $jdsCorr = checkInPeriod($sval['start_date'],$sval['end_date']); // PRE-CORRECTION DE L'ANNEE PUISQUE CES JOURS NE SONT ET NE PEUVENT PAS ETRE MODIFIÉS PAR LA SUITE
                $jdsHere[] = array('d'=>$j,'s'=>$jdsCorr[0],'e'=>$jdsCorr[1]);
              } else  {
                 $jdsHere[] = array('d'=>$j); // MARCHES x PAR MOIS SANS LIMITE
              }
            } 
          }
        }
      }
      if(isset($jdsHere[0]['s'])){ // UNE DATE DEBUT DISPO, ELLE DOIT ETRE LA MEME DANS TOUS LES $jdsHere (mid664)  
        $start = $jdsHere[0]['s']->modify('-1 day');
        $end = $jdsHere[0]['e'];
      } else { // CAS NORMAL TOUTE L'ANNÉE. PRENDRE $nowHeute ET RAJOUTER UN MOIS ET DEMI DES DEUX COTÉS MEME SI C'EST TROP DE MARGE
        $start = clone($nowHeute);
        $start->modify('-45  days');
        $end = clone($nowHeute);
        $end->modify('+45 days');
      }
      $times = array();
      foreach($jdsHere as $jds){
        $interval = DateInterval::createFromDateString($jdsMonthCntEn[$sval['par_mois']].' '.$jdsEn[$jds['d']].' of next month');
        $period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
        foreach($period as $time) {
          $times[] = $time;
        }
      }
      usort($times, function ($a,$b){ // TRIE POUR ARRANGER LES JOUR DE MANIERE CHRONOLOGIQUE, AINSI IL EST POSSIBLE DE RECONNAÎTRE CE QUI SE SUIVENT.
        return $a <=> $b;
      });
      for($t = 0; $t < count($times); $t++) { // DUPLICATION D'ENTRÉES SOUS $listeJdsRefs2d D'UNE JOURNÉE CHAQUNE 
        #printR($times[$t]->format('Y-m-d 00:00:00'));
        $listeJdsRefs2d[] = $sval;
        $lk = array_key_last($listeJdsRefs2d);
        $listeJdsRefs2d[$lk]['market_spec_id'] = $sval['market_ref']+(($t+1)*100000);
        $listeJdsRefs2d[$lk]['start_date'] = $times[$t]->format('Y-m-d 00:00:00');
        if(isset($times[$t+1]) && date_diff($times[$t],$times[$t+1])->format('%a') == 1){ // CHERCHE SI UN JOUR SUIVANT EST VALABLE AUSSI
          $listeJdsRefs2d[$lk]['end_date'] = $times[$t+1]->format('Y-m-d 00:00:00');
          $t++; // SAUTER L'ENTRÉE SUIVANTE
        } else {
          $listeJdsRefs2d[$lk]['end_date'] = $times[$t]->format('Y-m-d 00:00:00');
        }
        // L'ENTRÈE AYANT ETE DUPLIQUÉ N'EST PAS EFFACÉE CAR ELLE PEUT ENCORE CONTENIR DES INFORMATIONS DE PERIODE, ELLE EST RECONNUE PAR market_ref < 100000
      }
    } // FIN DE par_mois
    if($sval['market_ref'] == 2497 || $sval['market_ref'] == 2498){ // PORT DE BOUC
      $times = array();
      $start = clone($nowHeute);
      $start->modify('-4 days');
      $end = clone($nowHeute);
      $end->modify('+6 days');
      $interval = DateInterval::createFromDateString('+1 day');
      $period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
      foreach($period as $kt => $time){
        if($sval['market_ref'] == 2497 && $mid == 2497 && $time->format('d') % 2 == 1){ // IMPAIR
          $times[] = $time;
        } elseif($sval['market_ref'] == 2498 && $mid == 2498 && $time->format('d') % 2 != 1){ // PAIR
          $times[] = $time;
        }
      }
      for($t = 0; $t < count($times); $t++) { // DUPLICATION D'ENTRÉES SOUS $listeJdsRefs2d D'UNE JOURNÉE CHAQUNE 
        $listeJdsRefs2d[] = $sval;
        $lk = array_key_last($listeJdsRefs2d);
        $listeJdsRefs2d[$lk]['market_spec_id'] = $sval['market_ref']+(($t+1)*100000);
        $listeJdsRefs2d[$lk]['start_date'] = $times[$t]->format('Y-m-d 00:00:00');
        $listeJdsRefs2d[$lk]['end_date'] = $times[$t]->format('Y-m-d 00:00:00');
        if($t == 0){
          unset($listeJdsRefs2d[$skey]); // EFFACER L'ENTRÈE AYANT ETE DUPLIQUÉ
        }
      }
    } // FIN DE PORT DE BOUC
  } // FIN DE LA CREARTION DE LISTES VIRTUELLES POUR LES MARCHÉS x PAR MOIS ET PORT DE BOUC
} // FIN DES MARCHÉS SPECIAUX


//////////////////////////////////////////////////////////////
// FONCTIONS SPECIFIQUES À  $jdsCompact ET $listeJdsRefs2d
//////////////////////////////////////////////////////////////

// FONCTION SPECIFIQUE AU TRAITEMENT DES MARCHES SPECIAUX
// REDUIT $listeJdsRefs2d ISSU DE prov_market_spec AU MARCHÉ ACTUELLEMENT TRAITÉ POUR CES INFORMATION ADITIONNELES.
// EXISTE DANS LA BOUCLE FOREACHX PRINCIPALE ET CELLE DE RECHERCHE DANS checkActivity 
function searchListeJdsRefs2d($maid){
  global $listeJdsRefs2d;
  $ret = array();
  foreach($listeJdsRefs2d as $skey => $sval){
    if($sval['market_ref'] == $maid){
      $ret[] = $sval;
    }
  }
  // TRIE APRES LA DATE ET L'HEURE POUR AVOIR L'AFFICHAGE DANS LE BON SENS EN CAS D'ENTREES MULTIPLES COMME MID 550, 705 OU 2514. LE PREMIER VALABE EST DEVANT.
  $dates = array_column($ret, 'start_date');
  $times = array_column($ret, 'start_time');
  array_multisort($dates,SORT_ASC,$times,SORT_ASC,$ret);
  return $ret;
}

// FONCTION SPECIFIQUE AU TRAITEMENT DES MARCHÉS SPECIAUX
// VERIFIE L'ACTIVITÉ D'UN MARCHÉ À UNE DATE DONNÉE. NE VERIFIE QUE LE JOUR DANS UNE PERIODE. UTILSÉ POUR CHERCHER LES MARCHÉS SUIVANTS QUAND LE JDS EST PASSÉ
// IL S'AGIT D'UNE VERSION RÉDUITE DE LA BOUCLE foreach($jdsCompact) PRINCIPALE QUI COMPLETE $jdsCompact ET QUI CREE LE TABELAU
// $timestamp RESTE AVEC LES HEURES DU JOUR CAR PAS DE COMPARAISONS ICI, LA NORMALISATION À 00:00:00 SE PASSE SOUS checkInPeriod()
// ENTREE EN DATETIME OU STRING, SORTIE STRING
function checkActivity($timestamp){ ## // A BESOIN DE $jdsCompact COMPLETÉ
  global $jdsCompact,$listeJdsRefs2d;
  $trackActuel = 0;
  if(!is_object($timestamp)){
    $timestamp = date_create($timestamp);
  }
  foreach($jdsCompact as $bkey => $bval){
    if($bval['ref'] > 0){ // IGNORE LES JOURS SANS MARCHÉ
      $heute = 0;
      $jds17 = $timestamp->format('N');
      // IL EXISTE UNE ENTREE DE $jdsCompact TOMBANT SUR LE JDS, SOIT UN JOUR UNIQUE, SOIT UN DÉBUT D'UNE SERIE DE JOURS COMPACTÉES
      if($bkey + 1 <= $jds17 && $jds17 <= $bkey + $bval['daysCount']) { // LE JDS TOMBE DANS UNE SERIE DE JOURS COMPACTÉES
        $heute = 1;
      }
      // DONNEES SPEC EXISTANTES, INDEPENDAMMENT SI LE MARCHE PRINCIPAL EST SPECIAL
      // TEST NECESSAIRE CAR SINON FOREACH GENÈRE UNE ERREUR DANS searchListeJdsRefs2d() OÙ $listeJdsRefs2d EST DEFINI VARIALE GLOBALE 
      if(isset($listeJdsRefs2d)){
        $listeJdsRefsHere = searchListeJdsRefs2d($bval['ref']);
        // RETOURNE 0 (SI MARCHÉ NORMAL) OU 1 OU PLUSIEURS ENTRÉES DE prov_marches_spec.hashkey CAR IL PEUT Y EN AVOIR PLUSIEURS SOUS LE MEME HASHKEY (550 OU 2514)
        foreach($listeJdsRefsHere as $hkey => $hval){ // IL Y DES RARES CAS D'ENTREES DOUBLES COMME 550 ou 2514 POUR DEDOUBLER PERIODES OU INTERVALES
          // $jdsCompact CONTIENT TOUTES LES INFORMATIONS, PERIODE ET INTERVALES SONT JOINTS PAR id DE prov_market_spec
          // LES CAS OÙ SOIT PERIODE, SOIT INTERVALE OU LES DEUX MANQUENT (PAR 705 OÙ DEUX INTERVALLES TOMBENT SUR 1 PERIODE, ON AJOUTE DES PERIODES/INTERVALES STANDARD.
          // CE N'EST QUE POUR LE CALCUL ET PAS L'AFFICHAGE
          // IL Y DES CAS D'ENTRÉES COMPLETES DOUBLES COMME MID 705 EN ÉTÉ, DANS CE CAS, LE TRI DANS searchListeJdsRefs2d() ARRANGE LES LISTES DE MANIÈRE
          // A AVOIR LE RESULTAT LE PLUS RÉCENT DEVANT.
          // IL Y A DONC AUSSI DEUX RESULTATS DE JOUR ACTUEL ACTIF, IL FAUT PRENDRE LE PREMIER POUR LE CALCUL. CELA NE CHANGE RIEN POUR L'AFFICHAGE.
          // PERIODE: LIMITATION DANS LA SAISON. start OU end SEULS NE DOIVENT PAS EXISTER.
          if(isset($hval['par_mois']) && $hval['market_spec_id'] < 100000){
            continue;
          }
          $chkp = array();
          if(isset($hval['start_date'])){
            $chkp = checkInPeriod($hval['start_date'],$hval['end_date'],$heute,$timestamp);
          } else { // PAS DE LIMITE SAISONIERE, ACTIF TOUTE L'ANNÉE
            $chkp = checkInPeriod('2021-01-01 00:00:00','2021-12-31 23:59:59',$heute,$timestamp);
          }
          // INTERVALE: LIMITATION DANS L'HEURE. start OU end SEULS NE DOIVENT PAS EXISTER.
          if($chkp[3] == 2){
            $trackActuel = 3;
            break 2; // SORTIR DES DEUX BOUCLES FOREACH CAR LE PREMIER JOUR VALABLE EST NECESSAIRE, PAR LA SUITE D'AUTRES JOURS PEUVENT SUIVRE QUI ECRASENT LE RESULTAT PAR UNE VALEUR MOINDRE 
          } elseif($chkp[3] == 1){
            $trackActuel = 1;
          }
        } // FIN FOREACH VARIANTES D'UN HASHKEY
      } // FIN SI DONNÉES SPEC DISPONIBLES, INDEPENDAMMENT SI LE MARCHE PRINCIPAL EST SPECIAL
      if($bval['ref'] == 1){ // MARCHÉ NORMAL
        $chkp = checkInPeriod('2021-01-01 00:00:00','2021-12-31 23:59:59',$heute,$timestamp);
        if($chkp[3] == 2){
          $trackActuel = 3;
          break 1;  // SORTIR DE La BOUCLE FOREACH EXTERIEURE CAR LE PREMIER JOUR VALABLE EST NECESSAIRE, PAR LA SUITE D'AUTRES JOURS PEUVENT SUIVRE QUI ECRASENT LE RESULTAT PAR UNE VALEUR MOINDRE 
        } elseif($chkp[3] == 1){
          $trackActuel = 1;
        }
      }
    } // FIN SI JOUR ACTIF
  } // FIN FOREACH $jdsCompact
  return $trackActuel;
} // FIN DE checkActivity()

// NOUVELLE BOUCLE PAR LES MARCHÉS ISSUS DE LA BASE DE DONNÉES POUR RAJOUTER L'INFORMATION DES MARCHÉS SPECIAUX TOUT EN LA TRAITANT
// NE TRAITE QUE LES MARCHES DE TYPE 1 À 4 CAR $markets EST DEJA ECOURTÉ DANS LA BOUCLE PRECEDANTE
$memBKey = array(null,null); // POUR LE STYLE DIFFÉRENT DE LA CELLULE SI LE MARCHÉ EST ACTIF
$buildTabl = '';
$buildAutres = array(0,1,array('',''),array('',''),array('','',0));
$styleAdd = '';

foreach($markets as $mkey => $mval){
  // LISTE SIMPLE AVEC LES SEPT JOURS DE LA SEMAINE CONTENANT LES VALEURS DE prov_marches.jourXsem. $jdsSimple = array(0,0,1,0,0,0,0);
  $jdsSimple = array($mval['jour0sem'],$mval['jour1sem'],$mval['jour2sem'],$mval['jour3sem'],$mval['jour4sem'],$mval['jour5sem'],$mval['jour6sem']);
  // MARCHE PRINCIPAL AVEC TABLEAU ET TEXTE
  if($mid == $mval['mid']){
    // LISTE LOGIQUE COMPACTÉE $jdsCompact POUR RASSEMBLER LES JOURS DE MARCHÉS IDENTIQUES ET CONSECUTIFS DANS LA SEMAINE DE LUNDI À DIMANCHE 
    $jdsCompact = array(array('ref'=>$jdsSimple[0],'daysCount'=>1,'actuelJds'=>0)); // AJOUTER LE LUNDI POUR COMMENCER
    if($jdsHeute == 1){ // SI LUNDI EST LE JOUR ACTIF
      $jdsCompact[0]['actuelJds']++; // COMPTEUR PARCE QUE SUR PLUSIEURS JOURS D'AFFILÉS LES VALEURS POURRAIENT S'EFFACER
    }
    $lastCompact = 0; // MEMORISER LA DERNIERE CLÉ VALABLE
    for($i = 1; $i <count($jdsSimple); $i++){ // COMMENCER MARDI, LE LUNDI ETANT TOUJOURS SOIT UNIQUE SOIT UN DEBUT DE JOURS CONSECUTIFS IDENTIQUES
      if($jdsSimple[$i-1]-$jdsSimple[$i] != 0){ // JOURS CONSECUTIFS DIFFÉRENTS
        $lastCompact = $i;
        $jdsCompact[$i] = array('ref'=>$jdsSimple[$i],'daysCount'=>1,'actuelJds'=>0); // COMMENCER UN NOUVEAU BLOC
        if($jdsHeute-1 == $i){ // JOUR ACTIF DANS NOUVEAU BLOC
          $jdsCompact[$i]['actuelJds']++;
        }
      } else {
        $jdsCompact[$lastCompact]['daysCount']++; // JOURS IDENTIQUES, RAJOUTER AU BLOC PRÉCEDANT
        if($jdsHeute-1 == $i){ // JOUR ACTIF DANS BLOC CONTINU
          $jdsCompact[$lastCompact]['actuelJds']++;
        }
      }
    }
    // BOUCLE POUR EXTRAIRE LE TABLEAU ET DU TEXTE AVEC JOURS RASSEMBLÉS. FOREACH PERMET DE PASSER PAR DESSUS LES CLÉS MANQUANTES DANS $jdsCompact
    // VALEUR: bval['ref'], LARGEUR (COLSPAN): $bval['daysCount'], DEBUT DE PERIODE $bkey, FIN DE PERIODE $bkey+$bval['daysCount']-1.
    // LES DEUX DERNIERES VALEURS IDENTIQUES SI UNIQUEMENT UN JOUR
    // TABLE ET SON ENTÊTE À GAUCHE
    $buildTabl .= '<div id="tabSemContainer"><table id="tabSem">';

    // IL Y A UNE DOUBLE ITERATION DANS LA BOUCLE. LE TEXTE DOIT DONC ÊTRE MIS BOUT À BOUT.
    $markets[0]['forTexte']['out_jds'] = '';
    $trackActuel = array();
    $marcheNextWhen = array(array(),array(),array(),array(),array(),array(),array());// LISTE 0-6 DE CELLULES A CASER DANS UNE 3E LIGNE DU TABLEAU
    $trackNextPeriodeStart = date_create('2021-12-31 23:59:59'); // DATE DE DEBUT PERIODE À PARTIR DE OÙ CHERCHER, MODIFIÉ VERS L'AVANT DANS LA BOUCLE SI POSSIBLE.
    $countDaysWritten = 0; ## LES CELLULES MANQUANTES CAR LA TABLE EST CONSTRUITE AVEC $jdsCompact QUI IGNORE LES JOURS SANS MARCHÉ À LA FIN
    foreach($jdsCompact as $bkey => $bval){
      $countDaysWritten++;
      $buildTabl .= '<tr><td class="tabSemTrHead" id="r1celluleNr'.$bkey.'" title="'.$voc['jdsNorm'.$bkey].'">'.$voc['jdsCourt'.$bkey].'</td>';
      $buildTabl .= '<td id="r2celluleNr'.$bkey.'" rowspan="'.$bval['daysCount'].'"';
      if($bval['ref'] > 0){ // IGNORE LES JOURS SANS MARCHÉ MAIS UNE CELLULE DE LA TABLE EST CRÉE QUAND MÊME EN HAUT
        $buildTabl .= ' class="tabSemTdMarche">';
        // TITRE DANS LA CELLULE
        if($bkey == $bkey+$bval['daysCount']-1){ // JOUR SIMPLE
          $buildTabl .= wrapHTML('t2',$voc['jdsNorm'.$bkey]);
          $markets[0]['forTexte']['out_jds'] .= ','.$voc['jdsLes'];
          if($lang=='de'){ // ALLEMAND montagS
            $markets[0]['forTexte']['out_jds'] .= ' '.lcfirst($voc['jdsNorm'.$bkey]).'s';
          } else {
            $markets[0]['forTexte']['out_jds'] .= ' '.$voc['jdsNorm'.$bkey] .'s';
          }
        } else { // PLUSIEURS JOURS CONSECUTIFS
          $buildTabl .= wrapHTML('t2',$voc['jdsNorm'.$bkey].' '.$voc['jdsA'].' '.$voc['jdsNorm'.($bkey+$bval['daysCount']-1)]);
          $markets[0]['forTexte']['out_jds'] .= ','.$voc['jdsNorm'.$bkey].' '.$voc['jdsA'].' '.$voc['jdsNorm'.($bkey+$bval['daysCount']-1)];
        }
        // DONNEES SPEC EXISTANTES, INDEPENDAMMENT SI LE MARCHE PRINCIPAL EST SPECIAL
        // TEST NECESSAIRE CAR SINON FOREACH GENÈRE UNE ERREUR DANS searchListeJdsRefs2d() OÙ $listeJdsRefs2d EST DEFINI VARIALE GLOBALE
        $parMois = array(); // POUR CETTE SPECIALITÉ 
        if(isset($listeJdsRefs2d)){
          // RECHERCHE UNIQUEMENT POUR LE JOUR ACTUEL
          // RETOURNE 0 (SI MARCHÉ NORMAL) OU 1 OU PLUSIEURS ENTRÉES DE prov_marches_spec.hashkey CAR IL PEUT Y EN AVOIR PLUSIEURS SOUS LE MEME HASHKEY
          $listeJdsRefsHere = searchListeJdsRefs2d($bval['ref']);
          $addTextHere = '';
          foreach($listeJdsRefsHere as $hkey => $hval){ // IL Y DES RARES CAS D'ENTREES DOUBLES COMME 550 ou 2514 POUR DEDOUBLER PERIODES OU INTERVALES
            // $jdsCompact CONTIENT TOUTES LES INFORMATIONS, PERIODE ET INTERVALES SONT JOINTS PAR id DE prov_market_spec
            // LES CAS OÙ SOIT PERIODE, SOIT INTERVALE OU LES DEUX MANQUENT (PAR 705 OÙ DEUX INTERVALLES TOMBENT SUR 1 PERIODE, ON AJOUTE DES PERIODES/INTERVALES STANDARD. 
            // CE N'EST QUE POUR LE CALCUL ET PAS L'AFFICHAGE
            // IL Y DES CAS D'ENTRÉES COMPLETES DOUBLES COMME MID 705 EN ÉTÉ, DANS CE CAS, LE TRI DANS searchListeJdsRefs2d() ARRANGE LES LISTES DE MANIÈRE
            // A AVOIR LE RESULTAT LE PLUS RÉCENT DEVANT DANS L'AFFICHAGE.
            // IL Y A DONC AUSSI DEUX RESULTATS DE JOUR ACTUEL ACTIF, IL FAUT PRENDRE LE PREMIER POUR LE CALCUL. CELA NE CHANGE RIEN POUR L'AFFICHAGE.
            // LE $jdsCompact INITIAL CONTIENT SOUS actuelJds SOIT 0 (PAS LE BON JDS) SOIT 1+ (BON JDS). CETTE INFORMATION COUVRE AUSSI LES JOURS CONSECUTIFS COMPACTÉS.

            // INTERVALE: LIMITATION DANS L'HEURE. start OU end SEULS NE DOIVENT PAS EXISTER.
            $chki = array();
            if(isset($hval['start_time'])){
              $markets[0]['forTexte']['out_regulier'] = ''; // DANS LE CAS D'UN start_time, LE MARCHÉ N'EST PLUS RÉGULIER
              $chki = checkInTimes($hval['start_time'],$hval['end_time'],1);
              $jdsCompact[$bkey][$hval['market_spec_id']]['intervale'] = $chki;
              // AFFICHAGE DES HEURES DANS LE TABLEAU 
              if(!isset($hval['par_mois'])){
                $buildTabl .= wrapHTML('t2time',$chki[4]);
              } else {
                $parMois['heures'] = wrapHTML('t2',$chki[4]); // TOUJOURS LES MÊMES
              }
            } else { // DURÉE DEFAUT LE MATIN
              $chki = checkInTimes('08:00:00','12:30:00'); // DEFAULT NON MARQUÉ SPECIALEMENT
              $jdsCompact[$bkey][$hval['market_spec_id']]['intervale'] = $chki;
              // AFFICHAGE DES HEURES DANS LE TABLEAU
              if(!isset($hval['par_mois'])){
                $buildTabl .= wrapHTML('t2time',$voc['matin']);
              } else {
                $parMois['heures'] = $voc['matin']; // TOUJOURS LES MÊMES
              }
            }

            // PERIODE: LIMITATION DANS LA SAISON. start OU end SEULS NE DOIVENT PAS EXISTER.
            $chkp = array();
            if(isset($hval['start_date'])){
              $markets[0]['forTexte']['out_regulier'] = ''; // DANS LE CAS D'UNE start_date, LE MARCHÉ N'EST PLUS RÉGULIER
              $chkp = checkInPeriod($hval['start_date'],$hval['end_date'],$bval['actuelJds']);
              $chkp0hereM1Y = clone($chkp[0]);   
              $chkp0hereM1Y->modify('-1 year'); // checkInPeriod() AVANCE DÉJÀ D'UNE ANNÉE SI LA PERIODE EST PASSÉE
              $chkp0hereP1Y = clone($chkp[0]);
              $chkp0hereP1Y->modify('+1 year'); // IL FAUT PASSER À L'ANNÈE SUIVANTE QUAND LA PERIODE EST PASSÉE
              $chkp1hereP1Y = clone($chkp[1]);
              $chkp1hereP1Y->modify('+1 year');
              $chkp1herePrevDaysCnt = clone($chkp[1]);  // DERNIER JOUR ACTIF AVANT LA FIN DE LA PERIODE, INCLURE LA MARGE D'INTERVALES
              $chkp1herePrevDaysCnt->modify('previous '.$jdsEn[$bkey])->modify('+'.($bval['daysCount']-1).'days');
              // LE DEBUT DE LA PERIODE LA PLUS PROCHE, DOIT ETRE APRÈS LA DATE ACTUELLE ET AVANT LA DATE MEMORISÉE              
              if($chkp[0] > $nowHeute00){ // PERIODE PASSÉE
                // DANS LA MÊME ANNÉE OU SAUT D'UNE ANNÉE MAIS COMME LE JOUR ACTUEL N'EST PAS MODIFIÉ, ON REDUIT $chkp[0]
                // LE SAUT À L'ANNÈE SUIVANTE DÉJÀ FAIT SOUS checkInPeriod(), LE RESULTAT EST DONC BON ET LE MEME DANS LES DEUX CAS
                if(($trackNextPeriodeStart > $chkp[0]) || $chkp[2] === null && $trackNextPeriodeStart > $chkp0hereM1Y){ // 
                  $trackNextPeriodeStart = $chkp[0];
                }
                $jdsCompact[$bkey][$hval['market_spec_id']]['periode'] = $chkp;
              } elseif($chkp1herePrevDaysCnt <= $nowHeute00 && $nowHeute00 <= $chkp[1]){
                // JOURS ENTRE LE DERNIER MARCHÉ ET LA FIN DE LA PERIODE SANS QU'UN AUTE MARCHÉ PUISSE SUIVRE LA SEMAINE SUIVANTE ET AVANT LA DATE MEMORISÉE
                if($trackNextPeriodeStart > $chkp[0]){ // IL N'Y A PAS DE SAURT DE L'ANNÉE, IL FAUT LE FAIRE DANS RESULTAT.
                  $trackNextPeriodeStart = $chkp0hereP1Y;
              }
                $jdsCompact[$bkey][$hval['market_spec_id']]['periode'] = array($chkp0hereP1Y,$chkp1hereP1Y,$chkp[2],$chkp[2],$chkp[4]); // AVANCEMENT  D'UNE ANNÉE
              } else { // TOUT DANS LA PERIODE, ON INGNORE LA RECHERCHE DE LA PERIODE LA PLUS PROCHE PAR $trackNextPeriodeStart
                $trackNextPeriodeStart = $nowMorgen; // MEMORISER POUR COMMENCER LA RECHECHE DÈS LE LENDEMAIN
                $jdsCompact[$bkey][$hval['market_spec_id']]['periode'] = $chkp;
              }
              // AFFICHAGE DES PERIODES DANS LE TABLEAU

              $datesHere = niceDateInterval($jdsCompact[$bkey][$hval['market_spec_id']]['periode'][0],$jdsCompact[$bkey][$hval['market_spec_id']]['periode'][1],$nice=1)[2];
              if(!isset($hval['par_mois'])){
                $buildTabl .= wrapHTML('t2',$datesHere);
              } elseif($hval['par_mois'] < 5) { // PORT DE BOUX A par_mois = 9 QUI N'EXISTE PAS
                if($hval['market_spec_id'] < 100000){
                  $parMois['periode'] = $datesHere;
                }
                $parMois['jours'] = $voc['uniqChaque'].' '.$voc['count'.$hval['par_mois']].' '.$voc['jdsNorm'.$bkey].' '.$voc['duMois'].'!';
                if($mid == 532){
                  $parMois['jours'] = $voc['uniqChaque'].' '.$voc['count'.$hval['par_mois']].' '.$voc['jdsNorm'.$bkey].' '.$voc['duMois'].'!'; 
                }
                if($mid == 397){
                  $parMois['jours'] = $voc['uniqChaque'].' '.$voc['count1'].' '.$voc['et'].' '.$voc['count3'].' '.$voc['jdsNorm'.$bkey].' '.$voc['duMois'].'!'; 
                }
                if($mid == 485){
                  $parMois['jours'] = $voc['uniqChaque'].' '.$voc['count2'].' '.$voc['et'].' '.$voc['count4'].' '.$voc['jdsNorm'.$bkey].' '.$voc['duMois'].'!'; 
                }
              }
            } else { // PAS DE LIMITE SAISONIERE, ACTIF TOUTE L'ANNÉE. C'EST LE CAS PAR EXEMPLE POUR DES COMMENTAIRES OU  +/- DE PRODUITS
              $chkp = checkInPeriod('2021-01-01 00:00:00','2021-12-31 23:59:59',$bval['actuelJds']); // DEFAULT NON MARQUÉ SPECIALEMENT
              $trackNextPeriodeStart = $nowMorgen; // MEMORISER POUR COMMENCER LA RECHECHE DÈS LE LENDEMAIN
              $jdsCompact[$bkey][$hval['market_spec_id']]['periode'] = $chkp;
            }

            // TEXTES ADDITIONELS
            if(isset($hval['text'])){
              if(!isset($hval['par_mois'])){
                // VARIABLE RENVOYER LE TEXTE EN BAS DE LA CELLULE. EN CAS DE VARIANTES D'HEURES ET DE PERIODES, IL NE DOIT Y AVOIR QU'UN SEUL TEXTE
                $addTextHere = wrapHTML('t2addtext',$hval['text']);
                $markets[0]['forTexte']['out_regulier'] = ''; // LE TABELAU TIENT LUI SEUL LE TEXTE ADDITIONEL.
              } else {
                $parMois['text'] = $hval['text'];
              }
            }
            // PRODUITS EN PLUS (1) OU UNIQUEMENT (2). NE SONT PAS ADMISSINBLES POUR MARCHÉS X PAR MOIS
            $reta = array();
            $plusQue = array(null,'+',$voc['only']);
            $prods = array('alimentaire','producteur','forain','fleurs','poisson','viande','bio','truffes','fromage','charcuterie');
            foreach($prods as $key => $prod){
              if(isset($hval['prod_'.$prod])){
                $prodIcon = $prod;
                if($prodIcon == 'producteur'){
                  $prodIcon .= '-'.$mval['dept_ref'];
                }
                $reta[] = $plusQue[$hval['prod_'.$prod]].' <div style="vertical-align:middle" class="rndParamSvg svgMarcheInfoList" title="'.$voc['prod_'.$prod].'"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 66 66" class="marcheIconInfoList"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/pix/icon/marches.svg#pgn-prod-'.$prodIcon.'"></use></svg></div>';
              }
            }
            if(count($reta) > 0){
              $buildTabl .= wrapHTML('t2prods',$reta[0]);
              if(count($reta) > 1){
                $buildTabl .= wrapHTML('t2prods',$reta[1]);
                 if(count($reta) > 2){
                   $buildTabl .= wrapHTML('t2prods',$reta[2]);
                }
              }
            }
            // TEMPS RESTANT
            if($chkp[3] == 2 && $chki[3] == 1){
              $marcheNextWhen[$jdsHeute-1][] = $chki[2]; // MS-ACTUEL, TEMPS RESTANT
              $buildTabl .= wrapHTML('t2heute',$voc['heute']);
              $memBKey = array($bkey,$jdsHeute-1); // POUR LE STYLE DE LA CELLULE CONTENANT LE MARCHÉ ACTIF
              $trackActuel[] = 3;
            } elseif($chkp[3] == 2 && $chki[3] == 0){
              $trackActuel[] = 2;
              if(isset($chki[2]) && $chki[2]->invert == 1){ // TEMPS RESTANT NEGATIF, L'INTERVALE EST DONC DANS LE FUTUR.
                $marcheNextWhen[$jdsHeute-1][] = $chki[2]; // MS-DANS-TEMPS
                $buildTabl .= wrapHTML('t2heute',$voc['heute']);
                $memBKey = array($bkey,$jdsHeute-1); // POUR LE STYLE DE LA CELLULE CONTENANT LE MARCHÉ ACTIF
              } else { // TEMPS RESTANT POSITIF L'INTERVALE COMPTE POUR LE RESTE DU MARCHE
                $trackActuel[array_key_last($trackActuel)] = 1;
                $marcheNextWhen[$jdsHeute-1][] = 0;//  MS-PASSÉ-HEUTE
              }        
            } elseif($chkp[3] == 1){
               $trackActuel[] = 1;
            }
            $buildTabl .= '<div class="tabSemMarcheSpacer"></div>';
          } // FIN FOREACH VARIANTES D'UN HASHKEY
          $buildTabl .= $addTextHere;
        } // FIN SI DONNÉES SPEC DISPONIBLES, INDEPENDAMMENT SI LE MARCHE PRINCIPAL EST SPECIAL

        // IL FAUT LES TESTER UN À UN CAR 'jours' N'EST PAS MIS POUR PORT DE BOUC QUI PASSE AUSSI SOUS CE SCHÉMA
        if(isset($parMois['heures'])){
          $buildTabl .= wrapHTML('t2time',$parMois['heures']);
        }
        if(isset($parMois['periode'])){
          $buildTabl .= wrapHTML('t2',$parMois['periode']);
        }
        if(isset($parMois['text'])){
          $buildTabl .= wrapHTML('t2',$parMois['text']);
        }
        if(isset($parMois['jours'])){
          $buildTabl .= wrapHTML('t2',$parMois['jours']);
        }
        if($bval['ref'] == 1){ // MARCHÉ NORMAL
          $chkp = checkInPeriod('2021-01-01 00:00:00','2021-12-31 23:59:59',$bval['actuelJds']); // DEFAULT NON MARQUÉ SPECIALEMENT
          $trackNextPeriodeStart = $nowMorgen; // MEMORISER POUR COMMENCER LA RECHECHE DÈS LE LENDEMAIN
          $jdsCompact[$bkey][]['periode'] = $chkp;
          $chki = checkInTimes('08:00:00','12:30:00'); // DEFAULT NON MARQUÉ SPECIALEMENT
          // AFFICHAGE DES HEURES DANS LE TABLEAU
          $buildTabl .= wrapHTML('t2time',$voc['matin']);
          $jdsCompact[$bkey][]['intervale'] = $chki;
          if($chkp[3] == 2 && $chki[3] == 1){
            $marcheNextWhen[$jdsHeute-1][] = $chki[2];// MN-ACTUEL, TEMPS RESTANT
            $buildTabl .= wrapHTML('t2heute',$voc['heute']);
            $memBKey = array($bkey,$jdsHeute-1); // POUR LE STYLE DE LA CELLULE CONTENANT LE MARCHÉ ACTIF
            $trackActuel[] = 3;
          } elseif($chkp[3] == 2 && $chki[3] == 0){
            $trackActuel[] = 2;
            if(isset($chki[2]) && $chki[2]->invert == 1){ // TEMPS RESTANT NEGATIF, L'INTERVALE EST DONC DANS LE FUTUR
              $marcheNextWhen[$jdsHeute-1][] = $chki[2]; // MN-DANS-TEMPS ->format('%r%H:%I');
              $buildTabl .= wrapHTML('t2heute',$voc['heute']);
              $memBKey = array($bkey,$jdsHeute-1); // POUR LE STYLE DE LA CELLULE CONTENANT LE MARCHÉ ACTIF
            } else {
              $trackActuel[array_key_last($trackActuel)] = 1;
              $marcheNextWhen[$jdsHeute-1][] = 0;// MN-PASSÉ-HEUTE
            }
          } elseif($chkp[3] == 1){
            $trackActuel[] = 1;
          }
        }
        $buildTabl .= ''; // FIN SI JOUR ACTIF
      } else { 
         $buildTabl .= ' class="tabSemTdVide"> '; // CELLULE JOUR VIDE
      }
      $buildTabl .= "</td></tr>";
      // RAJOUT DE JOURS DANS LA PREMIERE COLONNE QUAND rowspan DANS LA DEUXIEME
      if($bval['daysCount']>1){
        for($c1=1;$c1<$bval['daysCount'];$c1++){
          $buildTabl .= '<tr><td class="tabSemTrHead" id="r1celluleNr'.($c1+$bkey).'" title="'.$voc['jdsNorm'.($c1+$bkey)].'">'.$voc['jdsCourt'.($c1+$bkey)].'</td></tr>';
        }
      }
    } // FIN FOREACH $jdsCompact

    // PREND LES JOURS CONSECUTIFS À LA DATE BUTOIR DONNÉE POUR TROUVER LE MARCHÉ SUIVANT ET RETOUNE CE JOUR
    // QUAND LE MARCHÉ EST PASSÉ (SOIT DANS LA JOURNÉE SOIT PAS CE JOUR ET DONC CHERCHER DANS LE FUTUR GRACE AUX DONNÉES DE $trackNextPeriodeStart
    $prochainMarcheLiteral = null;
    if(!in_array(2, $trackActuel) && !in_array(3, $trackActuel)){
      for($i = 1; $i < 15; $i++){ // NORMALEMENT <8, MAIS AVEC LES MARCHÉS x FOIS PAR MOIS, IL SE PEUT QU'IL FAUT SAUTER PLUS DE MOIS
        if(checkActivity($trackNextPeriodeStart) == 3){
          #printR($trackNextPeriodeStart,'JOUR ACTIF SUIVANT');
          $prochainMarcheLiteral = niceDateInterval($nowHeute00,$trackNextPeriodeStart);
          if(date_diff($nowHeute00,$trackNextPeriodeStart)->format('%a') > 10){ ## À DIFFÉRENCIER EN DEMAIN, APRÈS-DEMAIN, SEMAINE PROCHAINE, DANS X MOIS
            #printR('DATE LOINTAINE !');
          }
          break;
        }
        // L'INCREMENT DOIT AVOIR LIEU APRÈS LE PREMIER PASSAGE CAR $trackNextPeriodeStart PEUT CONTENIR LE PREMIER JOUR D'UNE PERIODE ET CE JOUR PEUT ETRE ACTIF
        $trackNextPeriodeStart = $trackNextPeriodeStart->modify('+1 day');
      }
    }

   // DERNIERE LIGNE DU TABLEAU
   $buildTabl .= '<tr class="tabSemTrDataMain"><td colspan="2" class="tabSemTdActive">';
   for($t3 = 0;$t3 < count($marcheNextWhen); $t3++){
      // DECIDER QUOI AFFICHER QUAND DEUX RESULTAT DANS UN JOUR, CONCERNE LES HEURES COMME SOUS MID 550
      // MAXIMUM DEUX CAS CONCURRENTS D'HEURES DE MARCHÉ. L'ORDRE N'EST PAS PREVISIBLE, IL FAUT TRIER LOGIQUEMENT
      // LOGIQUE: 0: PASSÉ, -1 PLUS TARD. 1: ENCORE
      // -1 & -1: SIGNIFIE LE DEBUT LE PLUS PRÈS
      // 1 & -1: SIGNIFIE 1 ET AUSSI -1
      // 0 & -1: SIGNIFIE -1
      // 0 & 1: SIGNIFIE 1
      // 0 & 0: SIGNIFIE QUE C'EST PASSÉ AUJOURD'HUI
      // NE DOIVENT PAS EXISTER: 1 & 1 (DEUX FOIS EN COURS)
      if(isset($marcheNextWhen[$t3][0]) && isset($marcheNextWhen[$t3][1])){
        if($marcheNextWhen[$t3][0] === 0 && $marcheNextWhen[$t3][1] === 0){ // 0 & 0
          // NE PLUS AFFICHER LES MARCHES PASSES heute
        } else { // DEUX FOIS 0 TESTÉ EN HAUT
          if($marcheNextWhen[$t3][0] === 0){ // 0 ET 1 OU -1
            $handle = $marcheNextWhen[$t3][1];
            if($handle->invert == 0){ // 0 & 1. PUISQUE 0 EST EmtCovered1LU, L'AUTRE DOIT ETRE UN INTERVALE
              $buildTabl .= $voc['heuteEncore'].' '.niceTime($handle);
            } else { // 0 & -1
              $buildTabl .= $voc['heuteDans'].' '.niceTime($handle);
            }
          } elseif($marcheNextWhen[$t3][1] === 0){ // 1 OU -1 ET 0
            $handle = $marcheNextWhen[$t3][0];
            if($handle->invert == 0){ // 0 & 1. PUISQUE 0 EST EmtCovered1LU, L'AUTRE DOIT ETRE UN INTERVALE
              $buildTabl .= $voc['heuteEncore'].' '.niceTime($handle);
            } else { // 0 & -1
              $buildTabl .= $voc['heuteDans'].' '.niceTime($handle);
            }
          } else { // DEUX INTERVALLES
            if($marcheNextWhen[$t3][0]->invert == 0){ // 1 & -1
              $buildTabl .= $voc['heuteEncore'].' '.niceTime($marcheNextWhen[$t3][0]);
              $buildTabl .= ' '.$voc['heuteDansAussi'].' '.niceTime($marcheNextWhen[$t3][1]);
            } elseif($marcheNextWhen[$t3][1]->invert == 0){ // -1 &-1
              $buildTabl .= $voc['heuteEncore'].' '.niceTime($marcheNextWhen[$t3][1]);
              $buildTabl .= ' '.$voc['heuteDansAussi'].' '.niceTime($marcheNextWhen[$t3][0]);
            } else { // -1 & -1
              //### PHP ERROR Cannot compare DateInterval objects ACTUELLEMENT BARRE VIDE. IL FAUDRAIT SOUSTRAIRE/ADDITIONNER LES INTERVALES À UNE DATE FIN POUR COMPARER, MAIS QUELLE DATE?
              //$buildTabl .= $voc['heuteDans'].' '.niceTime(max($marcheNextWhen[$t3][0],$marcheNextWhen[$t3][1]));
            }
          }
        } 
      } else {
      // CAS NORMAUX AVEC UNE ENTREE SOUS $marcheNextWhen[$jdsHeute - 1], ON CHERCHE QUAND MÊME LE MAXIMUM EN CAS D'ERREURS
      // DECISION GRACE À $trackActuel QUI CONTIENT DÉJA CES INFOS
        if($t3 == $jdsHeute - 1){
          if(in_array(3, $trackActuel)){
             $buildTabl .= $voc['heuteEncore'].' '.niceTime($marcheNextWhen[$jdsHeute - 1][array_search(max($marcheNextWhen[$jdsHeute - 1]), $marcheNextWhen[$jdsHeute - 1])]);
          } elseif(in_array(2, $trackActuel)){
             $buildTabl .= $voc['heuteDans'].' '.niceTime($marcheNextWhen[$jdsHeute - 1][array_search(max($marcheNextWhen[$jdsHeute - 1]), $marcheNextWhen[$jdsHeute - 1])]);
          } 
        }
      }
      // TEXTE VALABLE POUR LE PROCHAIN MARCHÉ
      // IL SE RAJOUTE AU JOUR CONCERNÉ, CELA PEUT ÊTRE LE MEME QUE LES REMARQUES PRÉCÉCENTES AFFICHÉES
      if($t3 == $trackNextPeriodeStart->format('N') - 1 && isset($prochainMarcheLiteral)){ 
        $buildTabl .= $prochainMarcheLiteral[0];
      }
    }
    $buildTabl .= '</td></tr></table></div>';
    // STYLE HIGHLIGHT SI MARCHÉ ACTIF. SI $memBKey NULL, LES STYLES SONT MIS SANS ID DE CELLULE, MAIS CETTE ID N'EXISTE PAS.
    $styleAdd =  '
    <style type="text/css">
     #r2celluleNr'.$memBKey[0].' {background-color:#64501d;}
     #r2celluleNr'.$memBKey[0].' div {color:#dccd5c}
     #r1celluleNr'.$memBKey[1].' {background-color:#64501d; color:#dccd5c}
    </style>';

    // FIN MARCHE PRINCIPAL
  } else {
    $buildAutres[$mval['typ']][0] = '<h3>'.$voc['mtAutresMarches'.$mval['typ']];
    if($mval['typ'] == 4){
      $buildAutres[4][2] = round(max($buildAutres[4][2],$mval['dist'])/1000);
      $buildAutres[4][0] .= $buildAutres[4][2].'km';
    }
    $buildAutres[$mval['typ']][0] .= ':</h3>';
    $buildAutres[$mval['typ']][1] .= '<div class="listDataDiv listDataDivLeft"><a href="?id='.$mval['mid'].'&amp;lang='.$lang.'"><img class="listThumb" src="/pix/150x100/'.$mval['thumbsfilename'].'" alt="thumbnail"/>';
    $buildAutres[$mval['typ']][1] .= '<div class="jds">';
    for($i = 0; $i <count($jdsSimple); $i++){ // MARQUAGE SIMPLE DES JDS DES MARCHES 234
      $buildAutres[$mval['typ']][1] .= '<span class="listDataKeys" style="';
      if($jdsSimple[$i] == 1){
        $buildAutres[$mval['typ']][1] .= 'background-color:lightgreen" title="'.$voc['jdsReg'].'">';
      } elseif($jdsSimple[$i] > 1) {
        $buildAutres[$mval['typ']][1] .= 'background-color:orange" title="'.$voc['jdsIrreg'].'">';
      } else {
        $buildAutres[$mval['typ']][1] .= 'background-color:#dccd5c" title="'.$voc['jdsNo'].'">';
      }
      $buildAutres[$mval['typ']][1] .= mb_strtoupper($voc['jdsCourt'.$i]).'</span> ';
    }
    $buildAutres[$mval['typ']][1] .= '</div>';
    $buildAutres[$mval['typ']][1] .= '<div class="listItemSimple listItemTitle">'.mb_ucfirst($markets[$mkey]['nomdirect']).'</div>';
    $buildAutres[$mval['typ']][1] .= '<div class="listItemSimple">'.sortAdresse($lang,$mval['adr_gps'],null,1).'</div>';
    $buildAutres[$mval['typ']][1] .= '<div class="listItemSimple">'.$markets[$mkey]['forTexte']['exposantsForType234'].'</div>';
    $buildAutres[$mval['typ']][1] .= '</a></div>';
  }
} // FIN DEUXIEME BOUCLE PAR $markets

// FEUILLETAGE DES MARCHÉS ##
$idsList = array();
$workData = '';
$my_sql = "SELECT prov_marches.id,prov_marches.nom_fr FROM prov_marches INNER JOIN prov_communes ON prov_marches.com_ref = prov_communes.id WHERE prov_marches.exposants > 0 ORDER BY prov_communes.id ASC,prov_marches.exposants DESC;";
$my_result_set = pg_exec($my_pg_connect, $my_sql) or dieNice("ERROR: DATABASE CONNECTION PROBLEMS IN market/ids",2,$my_sql);
$ids = pg_fetch_all($my_result_set);
foreach($ids as $pkey => $pval){
  $idsList[] = $pval['id'];
}
for($i = 0; $i < count($idsList); $i++){
  if($idsList[$i] == $mid && isset($idsList[$i-1]) && isset($idsList[$i+1])){
    $workData = array('?id='.$idsList[$i-1].'&amp;lang='.$lang, '?id='.$idsList[$i+1].'&amp;lang='.$lang);
  }
}

// CONSTRUCTION DES PARAGRAPHES DE TEXTE PAR 3 TYPES: MARCHÉS, STANDS ET HALLES, C'EST SURTOUT DÛ À DES RAISONS DE VOCABULAIRE
/*
mtThisMarket9	de	Der italienische Markt
mtThisMarket9	en	The Italian market
mtThisMarket9	fr	Le marché italien
mtThisMarket8	de	Der bäuerliche Grossgrünmarkt
mtThisMarket8	en	The agrarian bulk market
mtThisMarket8	fr	Le marché paysan au gros
mtThisMarket7	de	Der abendliche Erzeugermarkt
mtThisMarket7	en	The growers' evening market
mtThisMarket7	fr	Le marché de producteurs du soir
mtThisMarket63	de	Dieses Haus mit localen Produkten
mtThisMarket63	en	This house of local products
mtThisMarket63	fr	Cette maison de produits du terroir
mtThisMarket62	de	Diese Markthallen
mtThisMarket62	en	These market halls
mtThisMarket62	fr	Ces halles marchandes
mtThisMarket61	de	Die Fischhalle
mtThisMarket61	en	The fishermens' hall
mtThisMarket61	fr	La halle de pêcheurs
mtThisMarket60	de	Die Markthalle
mtThisMarket60	en	The market hall
mtThisMarket60	fr	La halle marchande
mtThisMarket6	de	Dieser Abendmarkt
mtThisMarket6	en	This evening market
mtThisMarket6	fr	Ce marché du soir
mtThisMarket5	de	Der Biomarkt
mtThisMarket5	en	The organic market
mtThisMarket5	fr	Le marché bio
mtThisMarket4	de	Dieser Trüffelmarkt
mtThisMarket4	en	This truffles market
mtThisMarket4	fr	Ce marché aux truffes
mtThisMarket33	de	Am Stand des Käsehandlers
mtThisMarket33	en	On the cheese vendor's booth
mtThisMarket33	fr	Sur le stand du fromager
mtThisMarket32	de	Am Stand des Fischhändlers
mtThisMarket32	en	On the fishmonges' booth
mtThisMarket32	fr	Sur le stand du poissonnier
mtThisMarket31	de	Am Stand des Muschelverkäufers
mtThisMarket31	en	On the sea shell vendor's booth
mtThisMarket31	fr	Sur le stand de coquillages
mtThisMarket30	de	Am Stand der Fischer
mtThisMarket30	en	On the fishermens' booth
mtThisMarket30	fr	Sur le stand de pêcheurs
mtThisMarket3	de	Dieser Markt der landwirtschaftlichen Kooperative
mtThisMarket3	en	This agrarian cooperative market 
mtThisMarket3	fr	Ce marché coopératif agricole
mtThisMarket2	de	Der biologische Erzeugermarkt
mtThisMarket2	en	The organic growers' market
mtThisMarket2	fr	Le marché bio de producteurs
mtThisMarket12	de	Dieser Erzeugermarkt
mtThisMarket12	en	This growers' market
mtThisMarket12	fr	Ce marché de producteurs
mtThisMarket11	de	Der Fischmarkt
mtThisMarket11	en	The fish market
mtThisMarket11	fr	Le marché aux poissons
mtThisMarket10	de	Der Grossgrünmarkt
mtThisMarket10	en	The bulk market
mtThisMarket10	fr	Le marché au gros
mtThisMarket1	de	Dieser Markt
mtThisMarket1	en	This market
mtThisMarket1	fr	Ce marché
*/


$para1 = $voc['mtThisMarket'.$markets[0]['typmarche']];  // DEBUT DE LA PHRASE PAREIL POUR TOUS
$para2 = "";
if($markets[0]['typmarche'] < 30){ // MARCHÉS  ############################################################################################################
  $para1 .= " ".$voc['mtInMunip']." ".$markets[0]['com_name'];
  $para1 = wrapHTML('b',$para1);
  if($markets[0]['quartier'] != ""){
    $para1 .= " ".$voc['mtInDistrict']." ".searchPrepArticle($lang,'de',NULL,'search',$markets[0]['quartier']); 
  }
  $para1 .= " ".$voc['mtTakesPlace1']; 
  if(!isset($markets[0]['irregulierAnnee'])){
    $para1 .= " ".$voc['mtRegularly'];
  }
  $para1 .= " ".niceImplode($lang,$markets[0]['forTexte']['out_jds']).$voc['mtTakesPlace2'].".";
  // ## IDEM 1+2 START
  if(!isset($markets[0]['irregulierJour']) && !isset($markets[0]['irregulierAnnee'])){
    $para1 .= " ".$voc['mtNormalTimes'];
  } else {
    $para1 .= " ".$voc['mtExtraTimes']; 
  }
  $para1 .= ".";
  if($lang != 'en'){
    if($lang=='de'){ // ENLEVE lE r DE L'ADJECTIF DEVANT LE NOM Markt
      $nomdir = preg_replace('/([a-z]*)r ([a-z])/i',"$1 $2",$markets[0]['nomdirect']);
    } else {
      $nomdir = $markets[0]['nomdirect'];
    }
    $para2 .= $voc['mtLe']." ".wrapHTML('b',$nomdir);
  } else {
    $para2 .= wrapHTML('b',mb_ucfirst($markets[0]['nomdirect'])); // POUR NE PAS AVOIR A TRAITER The Le/La/Les
  }
  $para2 .= " ".$voc['mtIsLocated1']." ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],NULL,1),NULL,NULL).$voc['mtIsLocated2'];
  if($markets[0]['adr_lieudit'] != ""){
    if(count(explode(",",$markets[0]['adr_lieudit']))>1){
      $para2 .= ", ".$voc['mtAlsoCalledPlur'];
    } else {
      $para2 .= ", ".$voc['mtAlsoCalledSing'];
    }
    $para2 .= " ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_lieudit'],NULL,1),NULL,1);
  }
  $para2 .= ". ".$voc['mtThisIs']." ".$markets[0]['adr_lang']." (<a href=\"javascript:showMap()\" id=\"showMainMapLink\">".$voc['mtMap']."</a>).";
  if($markets[0]['couvert'] > 0){
    $para2 .= " ".$voc['mtCovered1'];
      if($markets[0]['couvert'] == 2){
        $para2 .= " ".$voc['mtCovered2'];
      }
    $para2 .= " ".$voc['mtCovered3'].".";
  }
  // ## IDEM 1+2 END
  if($markets[0]['exposants'] == 1){
    $para2 .= " ".$voc['mt1bootOnly']." ".$voc['mtBoothsCa3'].".";
  } else {
    $para2 .= " ".$voc['mtBoothsCa1']." ".$markets[0]['exposants']." ".$voc['mtBoothsCa2'].$voc['mtBoothsCa3'].".";
  }
  $para2 .= " ".$voc['mtOffer']." ".niceImplode($lang,$prodArray,'Also',null).".";
} elseif($markets[0]['typmarche'] >= 30 && $markets[0]['typmarche'] < 60){ // STANDS ############################################################################################################
  $offerHere = ""; // VOCABULAIRE SPECIFIQUE
  $exposantsHere = "";
  $offerGenHere = "";
  if ($markets[0]['typmarche'] == 30) { // mid 778
    $offerHere = $voc['mtOfferFreshFish']; // FIN PREMIERE PHRASE
    if($markets[0]['exposants'] == 1){ // TEXTE SPECIFIQUE
      $exposantsHere .= " ".$voc['mt1fishBoothOnly']." ".$voc['mtFishBoothMore3'].".";
    } else {
      $exposantsHere .= " ".$voc['mtFishBoothMore1']." ".$markets[0]['exposants']." ".$voc['mtFishBoothMore2']." ".$voc['mtFishBoothMore3'].".";
    }
    $offerGenHere = " ".$voc['mtOffer']." ".niceImplode($lang,$prodArray,'Also',null)."."; // PRODUITS CAR IL N'Y EN A PAS POUR D'AUTRES
  } elseif($markets[0]['typmarche'] == 31) { // mid 2570
    $offerHere = $voc['mtOfferShell'];
    if($markets[0]['exposants'] == 1){
      $exposantsHere .= " ".$voc['mt1fishBoothOnly']." ".$voc['mtFishBoothMore3'].".";
    } else {
      $exposantsHere .= " ".$voc['mtFishBoothMore1']." ".$markets[0]['exposants']." ".$voc['mtFishBoothMore2']." ".$voc['mtFishBoothMore3']."."; // LE CAS MULTIPLE N'EXISTE PAS MAIS TOUT LE VOCABULAIRE EST DEFINI
    }
  } elseif($markets[0]['typmarche'] == 32) { // mid 1469
    $offerHere = $voc['mtOfferFish'];
    if($markets[0]['exposants'] == 1){
      $exposantsHere .= " ".$voc['mt1FishVendorOnly']." ".$voc['mtFishVendorMore3'].".";
    } else {
      $exposantsHere .= " ".$voc['mtFishVendorMore1']." ".$markets[0]['exposants']." ".$voc['mtFishVendorMore2']." ".$voc['mtFishVendorMore3'].".";
    }
    $offerGenHere = " ".$voc['mtOffer']." ".niceImplode($lang,$prodArray,'Also',null).".";
  } elseif($markets[0]['typmarche'] == 33) { // mid 1498
    $offerHere = $voc['mtOfferCheese'];
    if($markets[0]['exposants'] == 1){
      $exposantsHere .= " ".$voc['mt1CheeseVendorOnly']." ".$voc['mtCheeseVendorMore3'].".";
    } else {
      $exposantsHere .= " ".$voc['mtCheeseVendorMore1']." ".$markets[0]['exposants']." ".$voc['mtCheeseVendorMore2']." ".$voc['mtCheeseVendorMore3']."."; // LE CAS MULTIPLE N'EXISTE PAS MAIS TOUT LE VOCABULAIRE EST DEFINI
    }
  }
  $para1 .= " ";
  if($markets[0]['quartier'] != ""){ // ## IDEM
    $para1 .= $voc['mtInDistrict']." ".searchPrepArticle($lang,'de',NULL,'search',$markets[0]['quartier']);
  }
  $para1 .= " ".$voc['mtInMunip']." ".$markets[0]['com_name']." ".$voc['mtAreProposed'];
  if(!isset($markets[0]['irregulierAnnee'])){ ## IDEM
    $para1 .= " ".$voc['mtRegularly'];
  }
  $para1 .= " ".niceImplode($lang,$markets[0]['forTexte']['out_jds']);
  $para1 .= " ".$offerHere.". ";  
  // ## IDEM 1+2 START
  if(!isset($markets[0]['irregulierJour']) && !isset($markets[0]['irregulierAnnee'])){
    $para1 .= " ".$voc['mtNormalTimes'];
  } else {
    $para1 .= " ".$voc['mtExtraTimes']; 
  }
  $para1 .= ".";
  if($lang != 'en'){
    $para2 .= $voc['mtLe']." ".wrapHTML('b',$markets[0]['nomdirect']);
  } else {
    $para2 .= wrapHTML('b',mb_ucfirst($markets[0]['nomdirect'])); // POUR NE PAS AVOIR A TRAITER The Le/La/Les
  }
  $para2 .= " ".$voc['mtIsLocated1']." ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],NULL,1),NULL,NULL).$voc['mtIsLocated2'];

  if($markets[0]['adr_lieudit'] != ""){
    if(count(explode(",",$markets[0]['adr_lieudit']))>1){
      $para2 .= ", ".$voc['mtAlsoCalledPlur'];
    } else {
      $para2 .= ", ".$voc['mtAlsoCalledSing'];
    }
    $para2 .= " ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_lieudit'],NULL,1),NULL,1);
  }
  $para2 .= ". ".$voc['mtThisIs']." ".$markets[0]['adr_lang']." (<a href=\"javascript:showMap()\" id=\"showMainMapLink\">".$voc['mtMap']."</a>).";
  if($markets[0]['couvert'] > 0){
    $para2 .= " ".$voc['mtCovered1'];
      if($markets[0]['couvert'] == 2){
        $para2 .= " ".$voc['mtCovered2'];
      }
    $para2 .= " ".$voc['mtCovered3'].".";
  }
  // ## IDEM 1+2 END
  $para2 .= " ".$exposantsHere.$offerGenHere;
} elseif($markets[0]['typmarche'] > 59){ // HALLES ############################################################################################################
  if($markets[0]['quartier'] != ""){
    $para1 .= " ".$voc['mtInDistrict']." ".searchPrepArticle($lang,'de',NULL,'search',$markets[0]['quartier']); 
  }
  if($markets[0]['typmarche'] == 63) { // maisons de terroir
    $para1 .= " ".$voc['mtHallOpen1']; 
    if(!isset($markets[0]['irregulierAnnee'])){
      $para1 .= " ".$voc['mtRegularly'];
    }
    $para1 .= " ".niceImplode($lang,$markets[0]['forTexte']['out_jds']).$voc['mtHallOpen2'].".";
  } elseif($markets[0]['typmarche'] == 62) { // mid 1669
    $para1 .= " ".$voc['mtHallsOpen1']; 
    if(!isset($markets[0]['irregulierAnnee'])){
      $para1 .= " ".$voc['mtRegularly'];
    }
    $para1 .= " ".niceImplode($lang,$markets[0]['forTexte']['out_jds']).$voc['mtHallsOpen2'].".";
  } else { // 60/61
    $para1 .= " ".$voc['mtHallOpen1']; 
    if(!isset($markets[0]['irregulierAnnee'])){
      $para1 .= " ".$voc['mtRegularly'];
    }
    $para1 .= " ".niceImplode($lang,$markets[0]['forTexte']['out_jds']).$voc['mtHallOpen2'].".";
  } 
  // ## IDEM 1+2+3 START
  if(!isset($markets[0]['irregulierJour']) && !isset($markets[0]['irregulierAnnee'])){
    $para1 .= " ".$voc['mtNormalTimes'];
  } else {
    $para1 .= " ".$voc['mtExtraTimes']; 
  }
  $para1 .= ".";
  // ## IDEM 1+2+3 END
  if($markets[0]['typmarche'] == 63) { // mid 1669
    if($lang == 'en' || $lang == 'fr'){
      $para2 .= $voc['mtLa']." ".wrapHTML('b',$markets[0]['nomdirect']);
    } else {
      $para2 .= $voc['mtDas']." ".wrapHTML('b',$markets[0]['nomdirect']);
    }
    $para2 .= " ".$voc['mtIsLocatedSing']." ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],NULL,1),NULL,NULL);
  } elseif($markets[0]['typmarche'] == 62) { // mid 1669
    if($lang != 'en'){
      $para2 .= $voc['mtLes']." ".wrapHTML('b',$markets[0]['nomdirect']);
    } else {
      $para2 .= wrapHTML('b',mb_ucfirst($markets[0]['nomdirect'])); // POUR NE PAS AVOIR A TRAITER The Le/La/Les
    }
    $para2 .= " ".$voc['mtIsLocatedPlur']." ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],NULL,1),NULL,NULL);
  } else { // 60/61
    if($lang != 'en'){
      $para2 .= $voc['mtLes']." ".wrapHTML('b',$markets[0]['nomdirect']);
    } else {
      $para2 .= wrapHTML('b',mb_ucfirst($markets[0]['nomdirect'])); // POUR NE PAS AVOIR A TRAITER The Le/La/Les
    }
    $para2 .= " ".$voc['mtIsLocatedSing']." ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],NULL,1),NULL,NULL);
  }
  
 // ## IDEM 1+2+3 START
  if($markets[0]['adr_lieudit'] != ""){
    if(count(explode(",",$markets[0]['adr_lieudit']))>1){
      $para2 .= ", ".$voc['mtAlsoCalledPlur'];
    } else {
      $para2 .= ", ".$voc['mtAlsoCalledSing'];
    }
    $para2 .= " ".sortAdresse($lang,niceImplode($lang,$markets[0]['adr_lieudit'],NULL,1),NULL,1);
  }
  $para2 .= ". ".$voc['mtThisIs']." ".$markets[0]['adr_lang']." (<a href=\"javascript:showMap()\" id=\"showMainMapLink\">".$voc['mtMap']."</a>).";

  if($markets[0]['couvert'] > 0){
    $para2 .= " ".$voc['mtCovered1'];
      if($markets[0]['couvert'] == 2){
        $para2 .= " ".$voc['mtCovered2'];
      }
    $para2 .= " ".$voc['mtCovered3'].".";
  }
  // ## IDEM 1+2+3 END
  // ## IDEM 1+3 START
  if($markets[0]['exposants'] == 1){
    $para2 .= " ".$voc['mt1bootOnly']." ".$voc['mtBoothsCa3'].".";
  } else {
    $para2 .= " ".$voc['mtBoothsCa1']." ".$markets[0]['exposants']." ".$voc['mtBoothsCa2'].$voc['mtBoothsCa3'].".";
  }
  $para2 .= " ".$voc['mtOffer']." ".niceImplode($lang,$prodArray,'Also',null).".";
  // ## IDEM 1+3 END
}
// BANNER
$themmenu = headerMenuAndGraphic($category,$lang,array("id",$mid),$workData,$photoData[0]);


// LOGS
//echo "y".date('Y')."[".(1+date('z'))."] = y".date('Y')."[".(1+date('z'))."]+1";
//y2025[9] = y2025[9]+1
$my_pg_connect_log = pg_connect("host=$dbwrhost dbname=$dbwrdbna user=$dbwrname password=$dbwrpswd") or dieNice("ERROR: FAILED TO CONNECT TO DATABASE IN marches/log");
$my_sql_log = "
  INSERT INTO prov_logs(typ, tid, lang, y".date('Y').")
  SELECT 1,$mid,'$lang',ARRAY[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  WHERE
  NOT EXISTS (
    SELECT typ,tid,lang FROM prov_logs WHERE typ = 1 AND tid = $mid AND lang='$lang'
  );
  UPDATE prov_logs SET y".date('Y')."[".(1+date('z'))."] = y".date('Y')."[".(1+date('z'))."]+1 WHERE typ = 1 AND tid = $mid AND lang='$lang';
  SELECT (SELECT SUM(s) FROM UNNEST(".$logsSql.") AS s) AS som
  FROM public.prov_logs
  WHERE typ=1 AND tid=$mid AND lang = '$lang'
  LIMIT 1
";
$my_result_set_log = pg_exec($my_pg_connect_log, $my_sql_log) or dieNice("ERROR: DATABASE CONNECTION PROBLEMS IN marches/log($mid)",2,$my_sql_log);
pg_close($my_pg_connect_log);
$logCount = pg_fetch_all($my_result_set_log);
$logCount = $logCount[0]['som'];
if($logCount>9){
  $logCount = "<p>".$voc['pageVue1']." ".$logCount." ".$voc['pageVue2']."</p>";
} else {
  $logCount = "";
}
// FIN LOGS


?><!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang ?>" lang="<?php echo $lang ?>">
<head>
  <title><?php echo mb_ucfirst($markets[0]['nomdirect']) ?></title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta name="theme-color" content="#ffef95" />
  <link rel="shortcut icon" type="image/png" href="/pix/icon/favicon.png" />
  <link rel="stylesheet" type="text/css" href="<?php echo $sysFolder ?>style.css" />
  <link rel="stylesheet" type="text/css" href="<?php echo $sysFolder ?>marches.css" />
  <link rel="stylesheet" type="text/css" href="<?php echo $sysFolder ?>rando.css" />
  <?php echo cookiesConsentJs($lang);echo $themmenu[0]; ?>
  <script type="text/javascript">
    //<![CDATA[
    function sh(t){// OUVRE LA SOURCE DE TEXTES OU DE PHOTOS
      var tt=9;
      t=t.nextSibling;
      while(t) {
        if(t.nodeType==1 && t.tagName.toLowerCase()=='div') {
          tt=t;
          break;
        }
        t=t.nextSibling;
      }
      if(tt!=9){
        if(tt.style.display == 'none'){
          tt.style.display='block';
        } else {
          tt.style.display='none';
        }
      } 
    }
    //]]>
  </script>
  <link rel="stylesheet" href="<?php echo $sysFolder ?>OSMleaflet/leaflet.css"/>
  <script type="text/javascript" src="<?php echo $sysFolder ?>OSMleaflet/leaflet.js"></script>
  <script type="text/javascript" src="<?php echo $sysFolder ?>OSMleaflet/leaflet-plugins/layer/vector/KML.js"></script>
  <style type="text/css">
  /* NOUVEAUX STYLES GENERAUX */
  h3{
    padding-top:40px;
  }
  div.innerMenu{
    text-align:center;
    margin-top:15px;
  }
  div.innerMenu a {
    border-radius: 5px;
    padding: 2px 2px;
    margin: 5px auto;
    display: inline-block;
    overflow: hidden;
    position: relative;
    text-align: center;
  }
  /* NOUVEAUX STYLES POUR LA TABLE VERTICALE*/
  div#tabSemContainer{
    border: 1px solid #dccd5c;
    border-radius:5px;
  }
  table#tabSem{
    margin-left: auto;
    margin-right: auto;
  }
  td.tabSemTrHead, td.tabSemTdMarche, td.tabSemTdActive{
    border: 3px solid #ffef95;
    border-radius:8px;
    margin: 10px;
    text-align:center;
    padding:7px;
  }
  td.tabSemTrHead, td.tabSemTdMarche{
    background-color:#dccd5c;
  }
  td.tabSemTdActive{
    background-color:#64501d;
    color:#dccd5c;
  }
  div.tabSemMarcheSpacer{
    height:10px;
  }
  div.tabSemMarcheSpacer:nth-last-child(1), div.empty{
    height:0px;
  } 
  div.contentPub{
    margin-top: 15px;
    text-align: center;
    border: 1px solid #dccd5c;
    height:380px;
  }
  div.contentPub div{
    margin-left: auto;
    margin-right: auto;
    margin-top:20px;
    max-width:600px;
  }
  /* STYLES POUR LES POPUPS DE LA CARTE. CEUX QUI COMMENCENT PAR leaflet- SONT PREDEFINIS */
  .popupOtherMarkets .leaflet-popup-content-wrapper {
    background: white;
    color: #64501d;
    font-size: 12px;
    line-height: 24px;
    border-radius: 5px;
    max-width:200px;
    text-align:center
  }
  .popupOtherMarkets .leaflet-popup-content-wrapper img{
    height:52px;
    width:78px
  }
  .popupOtherMarkets .leaflet-popup-content-wrapper a { /* ## PAS CONFORME AU CSS DE LA PAGE */
    color: #64501d;
  }
  .popupOtherMarkets .leaflet-popup-tip-container { /* CONTIENT LE X POUR FERMER */
    width: 50px;
    height: 15px
  }
  .popupOtherMarkets .leaflet-popup-tip { /* CACHER LE LOSANGE GENANT */
    background: transparent;
    border: none;
    box-shadow: none
  }
  </style>

  <script type="text/javascript">  
    //<![CDATA[
    var osmLoaded = 0;
    function initMap(){
      // SOURCE PLUGIN https://github.com/shramov/leaflet-plugins
    	var map = new L.Map('mapDiv', {center: new L.LatLng(<?php echo $markets[0]['market_geom'][0].','.$markets[0]['market_geom'][1] ?>), zoom: 14});
    	map.addLayer(new L.TileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?req=provence-guide.net', {attribution: '<a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> | <a href="https://www.provence-guide.net/">Provence-Guide.Net</a>'}));
      mapType1 = L.divIcon({ // ICONE MARRON GRAND
        html: `<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="40" viewBox="272 63 360 531" version="1.1" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">
       <path filter="drop-shadow(30px 50px 20px rgb(0 0 0 / 0.4))" fill="#64501d" d="m452.08 63.785c-99.484 0-179.81 80.41-179.81 179.59 0 31.186 7.9688 60.528 21.938 86.094l157.88 264.31 157.88-264.31c13.969-25.566 21.938-54.908 21.938-86.094 0-99.184-80.328-179.59-179.81-179.59z"/>
       <circle cx="452" cy="246" r="78" fill="white"/></svg>`,
        className:'',iconSize: [24,40],iconAnchor:[12,40]
      });
      mapType34 = L.divIcon({ // ICONE ORANGE PETIT
        html: `<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="18" height="30" viewBox="272 63 360 531" version="1.1" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">
       <path filter="drop-shadow(30px 50px 20px rgb(0 0 0 / 0.4))" fill="orange" d="m452.08 63.785c-99.484 0-179.81 80.41-179.81 179.59 0 31.186 7.9688 60.528 21.938 86.094l157.88 264.31 157.88-264.31c13.969-25.566 21.938-54.908 21.938-86.094 0-99.184-80.328-179.59-179.81-179.59z"/>
       <circle cx="452" cy="246" r="78" fill="white"/></svg>`,
        className:'',iconSize:[18,30],iconAnchor:[9,30]
      });
      L.marker([<?php echo $markets[0]['market_geom'][0].','.$markets[0]['market_geom'][1] ?>], { icon: mapType1 }).bindTooltip("<?php echo $voc['marchesThisOne'] ?>").addTo(map);
      <?php
        foreach($markets as $mkey => $mval){
          if($mval['typ'] > 1){
            echo 'L.marker(['.$markets[$mkey]['market_geom'][0].','.$markets[$mkey]['market_geom'][1].'], { icon: mapType34 }).addTo(map).bindPopup("<b>'.$markets[$mkey]['nomdirect'].'</b><br/>'.$markets[$mkey]['forTexte']['exposantsForType234'].'<br/><img src=\"/pix/150x100/'.$markets[$mkey]['thumbsfilename'].'\" alt=\"thumbnail\"><br/><a href=\"?id='.$markets[$mkey]['mid'].'&amp;lang='.$lang.'\">'.$voc['linkFullDesc'].'</a>",{"maxWidth":"200","className":"popupOtherMarkets"});';
          }
        } 
      ?>
      osmLoaded = 1;
    }
    function showMap(type){ // type ['OSM','X','GM/','SV/']
      if(type == null){ // LIEN CARTE DANS LE TEXTE
        if(document.getElementById('mapDiv').style.height == '0px'){
          type = 'OSM';
        } else {
          type = 'X';
        }
      }
      if(type == 'X'){ // FERMER TOUT
        document.getElementById('mapTabTextOSM').style.color = "#dccd5c";
        document.getElementById('mapTabGMNewWin').style.display = "none";
        document.getElementById('mapTabSVNewWin').style.display = "none";
        document.getElementById('mapTabClose').style.display = "none";
        document.getElementById('mapDiv').style.height = '0px';
        document.getElementById('showMainMapLink').style.textDecoration = 'underline';
        document.getElementById('mapBottomHint').style.display = 'inline';
      } else if(type == 'GM'){ // FENETRE EXTERIEURE
         //window.open('https://maps.google.fr/maps?q=loc:<?php echo $markets[0]['market_geom'][0].','.$markets[0]['market_geom'][1] ?>&amp;t=h&amp;z=18','_blank');
         window.open('https://www.google.fr/maps/place/<?php echo $markets[0]['market_geom'][0].'+'.$markets[0]['market_geom'][1] ?>/@<?php echo $markets[0]['market_geom'][0].','.$markets[0]['market_geom'][1] ?>/data=!3m1!1e3!3d<?php echo $markets[0]['market_geom'][0].'!4d'.$markets[0]['market_geom'][1] ?>','_blank');
      } else if(type == 'SV'){ // FENETRE EXTERIEURE      
         window.open('https://maps.google.com/?cbll=<?php echo $markets[0]['sv_lat'].','.$markets[0]['sv_long'] ?>&cbp=12,<?php echo $markets[0]['sv_heading'].','.$markets[0]['sv_zoom'].',0,'.$markets[0]['sv_pitch'] ?>&layer=c','_blank');  
      } else if(type == 'OSM'){ // CARTE STANDARD
        document.getElementById('mapTabTextOSM').style.color = "#64501d";
        document.getElementById('mapTabClose').style.display = 'inline';
        document.getElementById('mapTabGMNewWin').style.display = 'inline';
        document.getElementById('mapDiv').style.height = '350px';
        document.getElementById('showMainMapLink').style.textDecoration = 'line-through';
        document.getElementById('mapBottomHint').style.display = 'none';
        if(<?php echo $markets[0]['sv_vis']?> != 99){
          document.getElementById('mapTabSVNewWin').style.display = 'inline';
        }
        if(osmLoaded == 0){ // ## OBJET map 
          initMap();
        }
      }
    }
    //]]>
  </script>
  <?php
     echo $styleAdd;
   ?>
</head>
<body>
  <div id="mainContentWrap" style="display:flow-root;">
    <?php echo $themmenu[1]; ?>
    <div class="rndBlockLeft">
<?php

echo '<div id="rndTitles"><h1 class="rndTitle">'.mb_ucfirst($markets[0]['nomdirect']).'</h1>';  
echo '<p>'.sortAdresse($lang,niceImplode($lang,$markets[0]['adr_gps'],null,1),null,1).'</p></div>';
echo '<div class="iconsProdList">'.$markets[0]['forTexte']['out_produits_icons'].'</div>'; // NEW OK
echo '<div style="clear:both"></div>';

echo $buildTabl;
echo '<div class="innerMenu"><a onclick="showMap(\'OSM\')" href="#mapTitle">'.$voc['mtMap'].' ⇓</a> <a href="#autresMarchesTitle">'.$voc['mtAutresMarches'].' ⇓</a> <a href="#commentsTitle">'.$voc['mtCommentaires'].' ⇓</a></div>';
echo '<div class="contentPub">'.$pubSmall.'</div><p id="para1market">';
echo trimDoubleSpace($para1);
echo '</p><p id="para2place">';
$para2 = trimDoubleSpace($para2);
echo $para2;
echo '</p>';
if(isset($addTextBlock[$lang])){ // N'AFFICHE RIEN SI UNE LANGUE MANQUE
  echo $addTextBlock[$lang];
}
echo  '<p id="para3verif">'.$phraseVerif.'</p>';

// CARTE
echo "\n". <<<EOT
    <h3 id="mapTitle">$voc[mapTitle]</h3>
    <p>$voc[mapDesc]</p>
    <div id="mapTabContainer">
      <div class="mapTab" id="mapTabOSM"><a href="javascript:showMap()" id="mapTabTextOSM" title="$voc[marchesMapShow]">$voc[mapTab]</a></div>
      <div class="mapTab" id="mapTabClose" style="display:none"><a href="javascript:showMap('X')" title="$voc[machesMapClose]">x</a></div>
      <div class="mapTab" id="mapTabSVNewWin" style="display:none"><a href="javascript:showMap('SV')" title="$voc[marchesMapNewWin]">street view &#8663;</a></div>
      <div class="mapTab" id="mapTabGMNewWin" style="display:none"><a href="javascript:showMap('GM')" title="$voc[marchesMapNewWin]">google maps &#8663;</a></div>
    </div>
    <div id="mapContainer">
      <div id="mapDiv" style="height:0px;"></div>
    </div>
    <div id="mapBottomHint">&#8662; $voc[marchesMapHint]</div>
EOT;
// AUTRES MARCHÉS
echo '<div id="autresMarchesTitle" class="empty"></div>'.$buildAutres[2][0].$buildAutres[2][1].$buildAutres[3][0].$buildAutres[3][1].$buildAutres[4][0].$buildAutres[4][1];
// COMMENTAIRES
echo commentSection('m',$mid,$lang);
// RAPPEL, APPEL
echo '<h3>'.$voc['rappelTitle'].'</h3><p>'.$voc['rappelText1a'].' '.$voc['rappelText1b1'].' '.$voc['mtInMunip'].' '.$markets[0]['com_name'].' '.$voc['rappelText1c'].$voc['rappelText1d'].'. '.$voc['rappelText2'].'<a href="mailto:andre.winter@provence-guide.net?subject='.$voc['emailText1-1'].'%20(m'.$mid.'/c'.$markets[0]['cid'].')&amp;body='.$voc['emailText2'].'">'.$voc['rappelText3'].'</a>';
if($lang=='fr'){
  if($markets[0]['prefix'] != ""){
    $markets[0]['prefix'] = '&nbsp;'.$markets[0]['prefix'];
  }
  echo $voc['rappelText5'].' F&#8209;'.$markets[0]['code_postal'].preg_replace('/\'&nbsp;/',"'",$markets[0]['prefix'].'&nbsp;'.$markets[0]['com_name']);
}
echo $voc['rappelText4'].'</p>'.$logCount;
echo '<div class="contentPub">'.$pubSmall.'</div>';
?></div><?php

// TOUTE LA COLLONE AVEC LES PHOTOS À DROITE
if($photoQualGen['actif'] / count($photoData) > 0.5 && $photoQualGen['actif'] > 2 && $photoQualGen['lieugen'] / count($photoData) < 0.5){
  // C'EST BON
} elseif($photoQualGen['actif'] <= 3 && $photoQualGen['actif'] >= 1){  // TROP PEU DE BONNES PHOTOS AVEC MARCHÉ DEPLOYÉ
  echo '<div class="rndImgRight rndImgRightMarcheStrict"><div class="rndImgDescTxt" style="text-align:center;"><p>'.$voc['picsNoGoodMarket12'].$voc['mtInMunip'].' '.$markets[0]['com_name'].$voc['picsNoGoodMarket2'].$mid.$voc['picsNoGoodMarket3'].'</p></div></div>';
} elseif($photoQualGen['actif'] == 0 && $photoQualGen['lieusans'] > 0){ // PAS DE MARCHÉ ACTIF
  echo '<div class="rndImgRight rndImgRightMarcheStrict"><div class="rndImgDescTxt" style="text-align:center;"><p>'.$voc['picsNoGoodMarket13'].$voc['mtInMunip'].' '.$markets[0]['com_name'].$voc['picsNoGoodMarket2'].$mid.$voc['picsNoGoodMarket3'].'</p></div></div>';
} elseif($photoQualGen['actif'] == 0 && $photoQualGen['lieusans'] == 0){ // PAS ACTIF ET PAS SUR LE LIEU
  echo '<div class="rndImgRight rndImgRightMarcheStrict"><div class="rndImgDescTxt" style="text-align:center;"><p>'.$voc['picsNoGoodMarket11'].$voc['mtInMunip'].' '.$markets[0]['com_name'].$voc['picsNoGoodMarket2'].$mid.$voc['picsNoGoodMarket3'].'</p></div></div>';
}
for($p=1;$p<count($photoData);$p++){ // 2E PHOTO JUSQU'A LA FIN
  // $addText = checkPhotoQuality($marketDataMainAndAround[$mid]['pics'][$i],null,$marketDataMainAndAround[$mid]['prefix'],$marketDataMainAndAround[$mid]['com_name']);
  $imgRes = insertPhoto($p,null,null,null);
  if(is_array($imgRes)){
    // echo insertPhoto($p,null,null,null); // REPETITION DE LA PHOTO EN HAUT
    echo $imgRes[0]; // REPETITION DE LA PHOTO EN HAUT
  }
}

$imgRes = insertPhoto(0,null,null,1);
if(is_array($imgRes)){
 echo $imgRes[0]; // REPETITION DE LA PHOTO EN HAUT
}
echo '<div class="rndImgRight rndImgRightMarcheStrict"><div class="contentPub">'.$pubSmall.'</div></div>';

?>
  </div>
</body>
</html>
