/*   -*- coding: utf-8 -*-  */
/***************************************************************************************

   Module   : Explor   Fichier  : ExplorHtmlTools.c

   set of functions for generating code in html pages

   see also: ExplorPhpTools.c
************************************************************************************/

#include "Explor.h"
#include "Wicri.h"
#include "Except.h"
#include "CharSetBuffer.h"


void ExplorHtmlPrefix()
{
  char *toRoot;
  printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" ");
  printf("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
  printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
  printf("  <head>\n");
  printf("    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"  />\n");
  printf("    <link rel=\"stylesheet\" href=\"Common/styles/ExplorFrame.css\" />\n");
}

void ExplorHtmlBeginBody()
{
  printf("  </head>\n");
  printf("  <body>\n");
}

void ExplorHtmlEndBody()
{
  printf("  </body>\n");
  printf("</html>\n");
}

void ExplorHtmlBottomDilib(int level)
{
  printf("  <hr/>\n");
  printf("<table  width=\"95%c\"><tr><td>\n",'%');
  printf("<a href=\"http://ticri.inpl-nancy.fr/wicri.fr/index.php/Accueil\" title=\"Lien vers le réseau Wicri\" >\n");
  printf("    <img src=\"Common/icons/LogoWicriWicriFr.png\" alt=\"Wicri\" width=\"45px\"></a>\n");
  printf("</td><td style=\"text-align:center;\"><small>");
  ExplorHtmlPrintParam("Area/bottomDilibMessage");
  printf("</small></td><td>");
  printf("    <a href=\"http://ticri.inpl-nancy.fr/wicri-outils.fr/index.php/Plateforme_Dilib\" alt=\"aller sur le portail Dilib\">");
  printf("<img src=\"Common/icons/LogoDilib.gif\" width=\"100px\" style=\"float:right;\"></a>");
  printf("</td></tr></table>\n");
}

char *ExplorPrintHtmlWikiScript(SxmlNode *xmlParam)
{
  char *res;
  res=ExplorHtmlFromWikiScript(xmlParam);
  printf("%s",res );
  return res;
}

char *ExplorHtmlFromWikiScript(SxmlNode *script)
{
  SxmlNode *step;
  static Buffer* bScript=NULL;
  if(!bScript) bScript=BufferCreate(10,10);
  BufferReset(bScript);

  while ((step=SxmlNextNode(script)))
    {
      if (SxmlNodeHasName(step,"text"))
	{
	  BufferStrcat(bScript,SxmlLeafText(step));
	  continue;
	}
      if (SxmlNodeHasName(step,"tag"))
	{
	  BufferStrcat(bScript,"<");
	  BufferStrcat(bScript,SxmlLeafText(step));
	  BufferStrcat(bScript,">");
	  continue;
	}
      if (SxmlNodeHasName(step,"link"))
	{
	  if (SxmlIsLeaf(step))
	    {
	      WicriBufferCatWikiLink2A(bScript,ExplorGetFromDict("Area/interwikiLink"), SxmlLeafText(step));
	    }
	  else
	    {
	      static Buffer *bufLink=NULL;
	      if (!bufLink)bufLink=NewBuffer();
	      BufferReset(bufLink);
	      ExplorBufferCatWikiTextWithInclude(bufLink, step);
	      WicriBufferCatWikiLink2A(bScript,ExplorGetFromDict("Area/interwikiLink"), BufferString(bufLink));
	    }
	  continue;
	}
      if(SxmlNodeHasName(step,"include"))
	{
	  ExplorBufferCatInclude(bScript, step);
	  continue;
	}
    }
  return BufferString(bScript);
}

char *ExplorBufferCatWikiTextWithInclude(Buffer *bufLink, SxmlNode *wikiTextNode)
{
  SxmlNode *wikiTextElem;
  SxmlReset (wikiTextNode);
  while ((wikiTextElem=SxmlNextNode(wikiTextNode)))
    {
      if (SxmlNodeHasName(wikiTextElem, "include"))
	{
	  ExplorBufferCatInclude(bufLink, wikiTextElem);
	  continue;
	}
    }
  return (BufferString(bufLink));
}

char *ExplorBufferCatInclude(Buffer *bScript, SxmlNode *incNode)
{
  SxmlNode *paramNode;
  while ((paramNode=SxmlNextNode(incNode)))
    {
      char *key;
      if ((key=SxmlLeafText(paramNode)))
	{
	  char *value;
	  value=ExplorGetFromDict(key);
	  if (value) BufferStrcat(bScript, value);
	}
    }
  return BufferString(bScript);
}

char *ExplorHtmlPrintParamValue(char *strParam)
{
  if (strParam[0]=='<')
    {
      SxmlNode *xmlParam;
      if (strncmp(strParam,"<html>",6)==0)
	{
	  static Buffer *bLine=NULL;
	  if(!bLine)bLine=NewBuffer();
	  BufferStrcpy(bLine,strParam+6);
	  BufferTailCut(bLine,7);   
	  printf ("%s", BufferString(bLine));
	  return BufferString(bLine);
	}
      xmlParam=SxmlFromString(strParam);
      if (SxmlNodeHasName(xmlParam,"wiki"))return ExplorPrintHtmlWikiScript(xmlParam);
      else 
	{
	  printf("%s", strParam);
	  return strParam;
	}
    }
  else
    {
      printf("%s", strParam);
      return strParam;
    }
}

char *ExplorHtmlPrintParam(char *key)
{
  char *strParam;
  if((strParam=ExplorGetFromDict(key))) return ExplorHtmlPrintParamValue(strParam);
  else 
    { 
      fprintf(stderr, "\n*** Explor (key) parameter %s not founded\n", key);
    }

  return strParam;
}

char *ExplorHtmlPrintParam3(char *k1, char *k2, char *key)
{
  static Buffer *bufKey=NULL;
  char *strParam;
  if (!bufKey) bufKey=NewBuffer();
  if (!k2) 
    {
      BufferStrcpy(bufKey, k1);
      BufferStrcat(bufKey, "/");
      BufferStrcat(bufKey, key);
      return ExplorHtmlPrintParam(BufferString(bufKey));
    }
  if((strParam=ExplorGetFromDictK3(k1, k2, key)))
    {
      return ExplorHtmlPrintParamValue(strParam);
    }
  else
    {
      BufferStrcpy(bufKey, k1);
      BufferStrcat(bufKey, "/");
      BufferStrcat(bufKey, key);
      return ExplorHtmlPrintParam(BufferString(bufKey));
    } 
}

char *ExplorHtmlPrintParam4(char *k1, char *k2, char *k3, char *key)
{
  char *strParam;
  if (!k3) return ExplorHtmlPrintParam3 (k1, k2, key);
  if((strParam=ExplorGetFromDictK4(k1, k2, k3, key)))
    {
      return ExplorHtmlPrintParamValue(strParam);
    }
  else
    {
      return ExplorHtmlPrintParam3 (k1, k2, key);
    } 
}

char *ExplorHtmlPrintParam5(char *k1, char *k2, char *k3, char *k4, char *key)
{
  char *strParam;
  if (!k4) return ExplorHtmlPrintParam4 (k1, k2, k3, key);
  if((strParam=ExplorGetFromDictK5(k1, k2, k3, k4, key)))
    {
      return ExplorHtmlPrintParamValue(strParam);
    }
  else
    {
      return ExplorHtmlPrintParam4 (k1, k2, k3, key);
    } 
}

void ExplorSidebarIcons()
{
  char *link1;
  char *img1;
  printf("<div class=\"left-sidebar\">");
  if ((link1=ExplorGetFromDict("Area/sidebar/logo1/linkPage"))
      &&(img1=ExplorGetFromDict("Area/sidebar/logo1/linkImg")))
    {
      char *link2;
      char *img2;
      printf("<center><a href=\"%s\"><img src=\"%s\" width=\"75px\"/></a></center>\n", link1, img1);
      if ((link2=ExplorGetFromDict("Area/sidebar/logo2/linkPage"))
	  &&(img2=ExplorGetFromDict("Area/sidebar/logo2/linkImg")))
	{
	  char *link3;
	  char *img3;
	  if ((link3=ExplorGetFromDict("Area/sidebar/logo3/linkPage"))
	      &&(img3=ExplorGetFromDict("Area/sidebar/logo3/linkImg")))
	    {
	      char *link4;
	      char *img4;
	      if ((link4=ExplorGetFromDict("Area/sidebar/logo4/linkPage"))
		  &&(img4=ExplorGetFromDict("Area/sidebar/logo4/linkImg")))
		{
		  printf("<center><a href=\"%s\"><img src=\"%s\" width=\"30px\"/></a>\n", link2, img2);
		  printf("<a href=\"%s\"><img src=\"%s\" width=\"30px\"/></a>\n", link3, img3);
		  printf("<a href=\"%s\"><img src=\"%s\" width=\"30px\"/></a></center>\n", link4, img4);
		}
	      else
		{
		  printf("<center><a href=\"%s\"><img src=\"%s\" width=\"40px\"/></a>\n", link2, img2);
		  printf("<a href=\"%s\"><img src=\"%s\" width=\"40px\"/></a></center>\n", link3, img3);
		}
	    }
	  else printf("<center><a href=\"%s\"><img src=\"%s\" width=\"60px\"/></a></center>\n", link2, img2);
	}
    }
}

void  ExplorHeaderLogoLeft(char *stream, char *step)
{
  printf("<div class=\"header\">");
  printf("<table width=\"95%c\">\n",'%');
  printf("<tr><td>\n");
  printf("<img src=\"");
  if (stream)
    {
      ExplorHtmlPrintParam3("Area", stream, "headerLogoStream");
    }
  else 
    {
      ExplorHtmlPrintParam("Area/headerLogoRoot");
    }
  printf("\" width=\"65px\"/>");
  printf("</td><td>");
}

void  ExplorHeaderLogoRight(char *stream, char *step)
{
   printf("</td><td>");
   printf("<img src=\"");
   if (stream&&step)
     {
       static Buffer *bufImg=NULL;
       char *urlImg;
       if (!bufImg)bufImg=NewBuffer();
       BufferStrcpy(bufImg,"headerLogoStep");
       BufferStrcat(bufImg,step);
       urlImg=ExplorHtmlPrintParam4("Area", stream, step, BufferString(bufImg));
     }
   else if (stream)
     {
      ExplorHtmlPrintParam3("Area", stream, "headerLogoStream");
     }
   else
     {
       ExplorHtmlPrintParam("Area/headerLogoRoot");
     }
   printf("\" width=\"60px\"/>"); 
   printf("</td></tr>");
   printf("<tr><td>\n");
}

void ExplorHeaderWarning(char *stream, char *step, char *page)
{
   printf("<img src=\"Common/icons/Nuvola_apps_important.png\" width=\"30\" align=\"right\">");
   printf("</td><td>");
   printf("<center>");
   ExplorHtmlPrintParam5("Area", stream, step, page, "headerWarningAll");
   printf("<br/><small>");
   ExplorHtmlPrintParam5("Area", stream, step, page, "headerWarning");
   printf("</small></center>\n");
   printf("</td>");
   printf("<td>");
   printf("<img src=\"Common/icons/Nuvola_apps_important.png\" width=\"30\" align=\"left\">");
   printf("</td></tr></table></center>\n");
   printf("</div>");
}

void ExplorHeaderRoot(char *page)
{
  ExplorHeaderLogoLeft(NULL,NULL);
  printf("<center><h3>%s", ExplorGetFromDict("Area/areaTitle"));
  printf("</h4></center>");
  ExplorHeaderLogoRight(NULL,NULL);
  ExplorHeaderWarning(NULL, NULL, page);
}

void ExplorHeaderStream(SxmlNode * streamNode, char *page)
{
  char *streamCode;
  
  streamCode=SxmlGetAttribute(streamNode, "code");
  ExplorHeaderLogoLeft(streamCode,NULL);
  printf("<!-- This part is generated by ExplorHeaderStream, file ExplorHtmlTools -->\n");
  printf("<center><h5>%s", ExplorGetFromDict("Area/areaTitle"));
  printf("<br/><br/><big>%s</big></h5></center>", ExplorTreeNodeName(streamNode));
  ExplorHeaderLogoRight(streamCode,NULL);
  ExplorHeaderWarning(streamCode, NULL, page);
}

void ExplorHeaderStep(SxmlNode * stepNode, char *page)
{
  char *stepCode;
  char *streamCode;
  
  stepCode=SxmlGetAttribute(stepNode, "code");
  streamCode=SxmlGetAttribute(SxmlParent(stepNode), "code");
  ExplorHeaderLogoLeft(streamCode, stepCode);
  printf("<center><h5>%s", ExplorGetFromDict("Area/areaTitle"));
  printf("<br/><br/><big>%s (%s)</big></h5></center>", ExplorTreeNodeName(stepNode), ExplorTreeNodeShortName(SxmlParent(stepNode)));
  ExplorHeaderLogoRight(streamCode, stepCode);
  ExplorHeaderWarning(streamCode, stepCode, page);
}

void ExplorHeaderPhpBegin(SxmlNode * stepNode, char *page)
{
  char *stepCode;
  char *streamCode;
  
  stepCode=SxmlGetAttribute(stepNode, "code");
  streamCode=SxmlGetAttribute(SxmlParent(stepNode), "code");
  ExplorHeaderLogoLeft(streamCode, stepCode);
  printf("<center><h5>%s", ExplorGetFromDict("Area/areaTitle"));
  printf(" - %s (%s)", ExplorTreeNodeShortName(stepNode), ExplorTreeNodeShortName(SxmlParent(stepNode)));
  printf("<br/><br/><big><?php \n");
}

void ExplorHeaderPhpEnd(SxmlNode * stepNode, char *page)
{
  char *stepCode;
  char *streamCode;
  printf (" ?>\n");
  stepCode=SxmlGetAttribute(stepNode, "code");
  streamCode=SxmlGetAttribute(SxmlParent(stepNode), "code");
  printf("</big></h5></center>\n");
  ExplorHeaderLogoRight(streamCode, stepCode);
  ExplorHeaderWarning(streamCode, stepCode, page);
}


void ExplorHtmlHeader(char *stream, char *step, char *page, char *endLine1, char *line2)
 {
   ExplorHeaderLogoLeft(stream, step);
   printf("<center><h3>%s", ExplorGetFromDict("Area/areaTitle"));
   if(endLine1) printf("%s", endLine1);
   printf("</h3>\n");
   printf("<h4>");
   if(line2) printf("%s", line2);
   printf("</h4></center>");
   ExplorHeaderLogoRight(stream, step);
   ExplorHeaderWarning(stream, step, page);
 }

void ExplorHtmlListIndexes(char * stream, char *step, int format)
/*
      1 : short
      2 : medium
      3 : long with stat
      4 : long with stat and comment
 */
{
  SxmlNode *listIndexes;
  char *strListIndexes;
  SxmlNode *nodeIndex;
  SxmlNode *indexNode;
  SxmlNode *indexTypeNode;
  SxmlNode *stepTreeNode;

  static Buffer* bufKey=NULL;
  if (!bufKey) bufKey=NewBuffer();
  stepTreeNode=ExplorSiteTreeNode(stream, step, NULL);
  printf("<!-- ExplorHtmlListIndexes -->\n");
  /*
  strListIndexes=ExplorGetFromDictK4("Area", stream, step, "listIndexCode");
  listIndexes=SxmlFromString(strListIndexes);
  if (!listIndexes)return;
  SxmlReset(listIndexes);
  */
  printf("<ul>\n");
  SxmlReset(stepTreeNode);
  while ((indexNode=SxmlNextNode(stepTreeNode))&&SxmlNodeHasName(indexNode,"index"))
    {
      /*
  while ((nodeIndex=SxmlNextNode(listIndexes)))
    {
      */
      char *codeIndex;
      SxmlNode *treeIndexNode;
      char *nameIndex;
      /* codeIndex=SxmlLeafText(nodeIndex); */
      codeIndex=SxmlGetAttribute(indexNode, "code");
      /* treeIndexNode=ExplorSiteTreeNode(stream, step, codeIndex); */

      printf("<li><a href=\"indexHead.php?index=%s\">", codeIndex);
      /*
      if((treeIndexNode)&&(nameIndex=SxmlGetAttribute(treeIndexNode, "name")))
	printf("%s", nameIndex);
      */
      if ((nameIndex=SxmlGetAttribute(indexNode, "name")))printf("%s", nameIndex);
      else /* to be deprecated */
	{
	  BufferStrcpy(bufKey, "shortNameIndex");
	  BufferStrcat(bufKey, codeIndex);
	  ExplorHtmlPrintParam4("Area", stream, step, BufferString(bufKey));
	}
      printf ("</a>");
      if (format>2)
	{
	  printf (" (%s)", ExplorGetIndexSize (stream, step, codeIndex));
	}
      printf("</li>\n");
    }
  printf("</ul>\n");
}

void ExplorHtmlListOtherSteps(char * stream, char *step)
{
  SxmlNode *listSteps;
  SxmlNode *nodeStep;
  char *strListSteps;
  static Buffer *bufLongName=NULL;

  if (!bufLongName)bufLongName=NewBuffer();
  strListSteps=ExplorGetFromDictK3("Area", stream, "listSteps");
  printf("<!-- This part is generated by ExplorHtmlTools (ExplorHtmlListOtherSteps) -->\n");
  listSteps=SxmlFromString(strListSteps);
  SxmlReset(listSteps);
  printf("<ul>\n");
  while ((nodeStep=SxmlNextNode(listSteps)))
    {
      char *stepStr;
      char *longName;
      stepStr=SxmlLeafText(nodeStep);
      BufferStrcpy(bufLongName, "longNameStep/");
      BufferStrcat(bufLongName, stepStr);
      if (!(longName=ExplorCascadeFromDictK4("Area", stream, step, BufferString(bufLongName))))
	longName=stepStr;
      if ((strcmp(stepStr,step)!=0)) printf("<li><a href=\"%s/index.html\">%s</a></li>", stepStr, longName);
    }
  printf("</ul>\n");
}

void ExplorHtmlDictInitStream(char * stream)
{
  SxmlNode *streamTreeNode;
  streamTreeNode=ExplorSiteTreeNode(stream, NULL, NULL);
  ExplorSetDict("#stream", stream);
  ExplorSetDict("#streamName", ExplorTreeNodeName(streamTreeNode));
  ExplorSetDict("#streamShortName", ExplorTreeNodeShortName(streamTreeNode));
}

void ExplorHtmlDictInitStep(char * stream, char *step)
{
  SxmlNode *stepTreeNode;
  ExplorHtmlDictInitStream(stream);
  stepTreeNode=ExplorSiteTreeNode(stream, step, NULL);
  ExplorSetDict("#step", step);
  ExplorSetDict("#stepName", ExplorTreeNodeName(stepTreeNode));
  ExplorSetDict("#stepShortName", ExplorTreeNodeShortName(stepTreeNode));
}

int ExplorGenerStepMainPage(char * stream, char *step)
{
  SxmlNode *stepTreeNode;
  stepTreeNode=ExplorSiteTreeNode(stream, step, NULL);
  if (!stepTreeNode) return 0;

  ExplorSetDict("#stream", stream);
  ExplorSetDict("#step", step);

  printf("<?dilib file=\"%s/Site/%s/%s/%s/index.html\" ?>\n", ExplorAreaDir, ExplorSiteLang, stream, step );
  ExplorHtmlPrefix();
  printf("<title>%s - %s - %s %s Main Page</title>\n", ExplorAreaCode, ExplorSiteLang, stream, step );
  ExplorHtmlBeginBody();
  printf("<div class=\"main\">");
  ExplorSidebar(stream, step, 0, NULL);
  ExplorHeaderStep(stepTreeNode, NULL);
  ExplorHtmlPrintParam4("Area", stream, step, "stepIntroduction");
  ExplorHtmlIntroBiblio(stream, step);
  ExplorHtmlPrintParam4("Area", stream, step, "titleListIndex");
  ExplorHtmlListIndexes(stream, step, 4);
  ExplorHtmlBottomDilib(0);
  printf("</div>");
  ExplorHtmlEndBody();
  return 1;
}

void ExplorHtmlPrintParamFile()
{
  char *k;
  char *v;

  StrDictIteratorReset(ExplorTableParam);
  printf("<table>\n");
  while ((k=StrDictNext(ExplorTableParam)))
    {
      char *htmlValue;
      printf("<tr><td>%s</td>", k);
      htmlValue=CharSetStrToHtml(StrDictValue(ExplorTableParam));
      printf("<td><code>%s</code></td>\n", htmlValue);
      printf("</tr>\n");
    }
  printf("</table>\n");
}

void ExplorHtmlIntroBiblio(char *stream, char *step)
{
  char *biblioSize;
  ExplorHtmlPrintParam4("Area", stream, step, "introductionBiblio");
  biblioSize=ExplorGetBiblioSize (stream, step);
  printf ("<p>Cette étape donne accès à %s notices bibliographiques</p>\n", biblioSize); 
  printf ("<form action=\"bibRecord.php\" method=\"get\">\n<p>");
  ExplorHtmlPrintParam4("Area", stream, step, "messAccesBiblioById");
  printf ("<input type=\"text\" name=\"hk\" size=\"6\"/>");
  printf ("<input type=\"submit\" value=\"Envoyer\" /></p>");
  printf ("</form>\n");
}
