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

   Module   : Explor   Fichier  : ExplorSidebar.c

   set of functions for generating Sidebar for html or pages

   see also: ExplorPhpTools.c
************************************************************************************/
#include "Explor.h"
#include "Wicri.h"
#include "Except.h"
#include "CharSetBuffer.h"


void ExplorSidebarTop(int level)
{
  ExplorSidebarIcons();
  switch(level)
    {
    case 1:
      printf("<p><a href=\"fr/Main/index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName")); break;
    case 2:
      printf("<p><a href=\"Main/index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName")); break;
    case 3:
      printf("<p><a href=\"index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName"));
      printf("<br/><a href=\"../index.html\">%s</a>\n", ExplorGetFromDict("Area/mainPage/shortName"));
      break;
    case 31:
      printf("<p><a href=\"../Main/index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName"));
      printf("<br/><a href=\"../index.html\">%s</a>\n", ExplorGetFromDict("Area/mainPage/shortName"));
      break;
    case 4:
      printf("<p><a href=\"../index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName")); 
      break;
    case 41:
      printf("<p><a href=\"../../Main/index.html\">%s</a>\n", ExplorGetFromDict("Area/Main/mainPage/shortName")); 
      break;
    }
  printf("<hr/>\n");
}

void ExplorSidebarBottom()
 {
   printf("</p></div>");
 }

void ExplorSidebarUpPhp(char *stream, char *step, int typePhp, char *page)
{

  switch(typePhp)
    {
    case  EXPLOR_PHP_TYPE_BIBLIO:
      break;
    case  EXPLOR_PHP_TYPE_INDEX:
    case  EXPLOR_PHP_TYPE_CLUSTER_HEAD:
      printf ("<?php \n");
      printf (" echo \'<br/><a href=\"indexHead.php?index=\';");
      printf (" echo $ExplorParamIndex;\n");
      printf (" echo \'\">\'\n;");
      printf (" echo $ExplorParamIndexShortName;\n");
      printf (" echo \"</a>\"\n;");
      printf ("?>\n");
      break;
    case  EXPLOR_PHP_TYPE_INDEX_HEAD:
      printf ("<?php \n");
      printf (" echo \"<br/><b>\".$ExplorParamIndexShortName.\"</b>\";\n");
      printf ("?>\n");
      break;
    case  EXPLOR_PHP_TYPE_INDEX_ITEM:
    case  EXPLOR_PHP_TYPE_CLUSTER_ITEM:         /* to be improved */
      printf ("<?php \n");
      printf (" echo \'<br/><a href=\"indexHead.php?index=\';");
      printf (" echo $ExplorParamIndex;\n");
      printf (" echo \'\">\'\n;");
      printf (" echo $ExplorParamIndexShortName;\n");
      printf (" echo \"</a>\"\n;");
      printf ("?>\n");
      break;
    case  EXPLOR_PHP_TYPE_ASSOC:
    case  EXPLOR_PHP_TYPE_AND_NOT:
      printf ("<?php \n");
      printf (" echo \'<br/><a href=\"indexHead.php?index=\';");
      printf (" echo $ExplorParamI1;\n");
      printf (" echo \'\">\'\n;");
      printf (" echo $ExplorParamIndex1ShortName;\n");
      printf (" echo \"</a>\"\n;");
      printf (" echo \'<br/><a href=\"indexHead.php?index=\';");
      printf (" echo $ExplorParamI2;\n");
      printf (" echo \'\">\'\n;");
      printf (" echo $ExplorParamIndex2ShortName;\n");
      printf (" echo \"</a>\"\n;");
      printf ("?>\n");
    }
}

SxmlNode *ExplorTreeNodeGetStream (char *codeStream)
{
  SxmlNode *iterNode;
  iterNode=SxmlFirstChild(ExplorAreaSiteLang);
  while (iterNode)
    {
      if (SxmlHasAttribute(iterNode, "code", codeStream))return iterNode;
      iterNode=SxmlNextSibling(iterNode);
    }
  return NULL;
}

SxmlNode *ExplorTreeNodeGetStep (char *codeStream, char *codeStep)
{
  SxmlNode *streamNode;
  if ((streamNode=ExplorTreeNodeGetStream (codeStream)))
    {
      return SxmlGetFirstChildTagAtt(streamNode, "step", "code", codeStep);
    }
  return NULL;
}

int ExplorSideBarMainHierarchy (char *stream, char *step, SxmlNode *treeNode)
{
  SxmlNode *mainStream;
  SxmlNode *mainStep;
  char *codeStep;
  if ((stream)&&(strcmp(stream, "Main")==0))return 0;
  printf ("<!--  SideBarMainHierarchy -->\n");
  mainStream=SxmlGetFirstChildTagAtt(ExplorAreaSiteLang, "stream", "group", "main");
  mainStep=SxmlLastChild(mainStream);
  codeStep=SxmlGetAttribute(mainStep,"code");
  printf("<a href=\"%s\">%s</a>\n", ExplorTreeNodeLinkToStep(treeNode, "Main", codeStep, "index.html"), ExplorTreeNodeShortName(mainStep));
  printf("<br/><a href=\"%s\">%s</a>\n", ExplorTreeNodeLinkToStream(treeNode, "Main", "index.html"), ExplorTreeNodeShortName(mainStream));
  if (treeNode==ExplorAreaSiteLang)  printf ("<br/><b>%s</b>\n",  ExplorTreeNodeShortName(treeNode));
  else if (step) printf ("<br/><a href=\"../../index.html\">%s</a>\n",  ExplorTreeNodeShortName(ExplorAreaSiteLang));
  else if (stream) printf ("<br/><a href=\"../index.html\">%s</a>\n",  ExplorTreeNodeShortName(ExplorAreaSiteLang));
  printf("<hr/>");
  return 1;
}

void ExplorSideBarStreamHierarchy (char *stream, char *step, SxmlNode *treeNode)
{
  SxmlNode *streamNode;
  SxmlNode *lastStep;
  char *lastStepCode;
  if (!stream)return ;
  printf ("<!--  rSideBarStreamHierarchy -->\n");
  streamNode=ExplorTreeNodeGetStream (stream);
  lastStep=SxmlLastChild(streamNode);
  lastStepCode=SxmlGetAttribute(lastStep,"code");
  if (step)
    {
      SxmlNode *stepNode;
      stepNode=ExplorTreeNodeGetStep (stream, step);
      if (!(SxmlNextSibling(stepNode)))return ; /* stream hierrchy = step one */
      printf ("<a href=\"../%s/index.html\">%s</a>", lastStepCode, ExplorTreeNodeShortName(lastStep));
      printf ("<br/><a href=\"../index.html\">%s</a>", ExplorTreeNodeShortName(streamNode));
      printf ("<br/><a href=\"../../index.html\">%s</a>", ExplorTreeNodeShortName(ExplorAreaSiteLang));
    }
  else
    {
      printf ("<a href=\"%s/index.html\">%s</a>", lastStepCode, ExplorTreeNodeShortName(lastStep));
      printf ("<br/><b>%s</b>", ExplorTreeNodeShortName(streamNode));
      printf ("<br/><a href=\"../index.html\">%s</a>", ExplorTreeNodeShortName(ExplorAreaSiteLang));
    }
  printf("<hr/>\n");
}

void ExplorSideBarStepHierarchy (char *stream, char *step, int typePhp, SxmlNode *treeNode)
{
  SxmlNode *streamNode;
  if(!step)return;
  printf ("<!--  rSideBarStepHierarchy -->\n");
  if (typePhp) printf ("<br/><a href=\"index.html\">%s</a>\n",  ExplorTreeNodeShortName(treeNode));
  else printf ("<br/><b>%s</b>\n",  ExplorTreeNodeShortName(treeNode));
  printf ("<br/><a href=\"../index.html\">%s</a>\n",  ExplorTreeNodeShortName(streamNode=SxmlParent(treeNode)));
  printf ("<br/><a href=\"../../index.html\">%s</a>\n",  ExplorTreeNodeShortName(SxmlParent(streamNode)));
  printf ("<hr/>\n");
}

void ExplorSideBarListIndexes (char *stream, char *step,  int typePhp, SxmlNode *treeNode)
{
  SxmlNode *indexIterNode;
  SxmlNode *stepNode;
  if (!step)return;
  stepNode=ExplorTreeNodeGetStep (stream, step);
  printf ("<small>%s<ul>", ExplorTreeNodeShortName(stepNode));
  indexIterNode=SxmlGetFirstChildByTagName(stepNode,"index");
  while (indexIterNode)
    {
      printf("<li><a href=\"%s\">%s</a></li>\n", ExplorTreeIndexMainPage(indexIterNode), ExplorTreeNodeShortName(indexIterNode));
      indexIterNode=SxmlGetNextSiblingByTagName(indexIterNode,"index");
    }
  printf("</ul></small><hr/>\n");
}

void ExplorSideBarListSteps (char *stream, char *step, SxmlNode *treeNode, int typePhp)
{
  SxmlNode *streamNode;
  SxmlNode *stepNode;
  SxmlNode *stepIterNode;
  int      firstItem;
  if (!stream)return;
  printf ("<!--  SideBarListSteps -->\n");
  streamNode=ExplorTreeNodeGetStream (stream);
  printf ("<small>%s", ExplorTreeNodeShortName(streamNode));
  printf ("<ul>\n");
  if (step) stepNode=SxmlGetFirstChildTagAtt(streamNode, "step", "code", step);
  stepIterNode=SxmlGetFirstChildByTagName(streamNode,"step");
  firstItem=1;
  while (stepIterNode)
    {
      char *codeStep;
      if (firstItem)firstItem=0;
      /* else printf("<br/>"); */
      codeStep=SxmlGetAttribute(stepIterNode, "code");
      if (step && (stepIterNode==stepNode))
	{
	  if (stepIterNode==treeNode)	 
	    {
	      if (typePhp) printf("<li><a href=\"index.html\">%s</a></li>\n", ExplorTreeNodeShortName(stepIterNode));
	      else printf ("<li><b>%s</b></li>\n",  ExplorTreeNodeShortName(treeNode));
		/* if (SxmlNodeHasName(treeNode, "step")) printf ("<li><b>%s</b></li>\n",  ExplorTreeNodeShortName(treeNode));
	      else printf("<li><a href=\"../inde.html\">%s</a></li>\n", ExplorTreeNodeShortName(stepIterNode));
		*/
	    }
	  else
	    {
	      printf("<li><a href=\"%s\">%s</a></li>\n", ExplorTreeNodeLinkToCloserStep(treeNode, codeStep, "index.html"), ExplorTreeNodeShortName(stepIterNode));
	    }
	}
      else
	{
	  if (step) printf("<li><a href=\"%s\">%s</a></li>\n", ExplorTreeNodeLinkToCloserStep(treeNode, codeStep, "index.html"), ExplorTreeNodeShortName(stepIterNode));
	  else
	    {
	      printf("<li><a href=\"%s/index.html\">%s</a></li>\n", codeStep, ExplorTreeNodeShortName(stepIterNode));
	    }
	}
      stepIterNode=SxmlGetNextSiblingByTagName(stepIterNode,"step");
    }
  printf("</ul></small><hr/>\n");
}

void ExplorSideBarListStreams (char *stream, SxmlNode *treeNode)
{
  SxmlNode *streamIterNode;
  int      firstItem;

  if (SxmlLength(ExplorAreaSiteLang)<=1) return ;
  printf ("<small>%s<ul style=\"padding-left:25px;\">", ExplorTreeNodeShortName(ExplorAreaSiteLang));
  streamIterNode=SxmlFirstChild(ExplorAreaSiteLang);
  firstItem=1;
  while (streamIterNode)
    {
      char *codeIterStream;
      if (firstItem)firstItem=0;
      /* else printf("<br/>"); */
      codeIterStream=SxmlGetAttribute(streamIterNode, "code");
      if (SxmlHasAttribute(streamIterNode, "group", "up"))printf ("<li >");
      if (SxmlHasAttribute(streamIterNode, "group", "main"))printf ("<li>=");
      if (SxmlHasAttribute(streamIterNode, "group", "zoom"))printf ("<li style=\"padding-left: 5px\"> &gt;&nbsp;");
      /*
      if (SxmlNodeHasName(streamIterNode, "main"))printf ("<li>=");
      if (SxmlNodeHasName(streamIterNode, "zoom"))printf ("<li> > ");
      */
      if (treeNode==streamIterNode) printf ("<b>%s</b>\n",  ExplorTreeNodeShortName(treeNode));
      else
	{
	  printf ("<a href=\"%s\">%s</a>\n", ExplorTreeNodeLinkToStream(treeNode, codeIterStream, "index.html"), ExplorTreeNodeShortName(streamIterNode));
	}
      streamIterNode=SxmlNextSibling(streamIterNode);
    }
  printf("</ul></small><hr/>\n");
}

void ExplorSidebar(char *stream, char *step, int typePhp, char *page)
{
  static Buffer *bufKeyStep=NULL;
  SxmlNode *treeNode;

  printf("  <!-- generated by ExplorSidebar (ExplorHtmlTools.c)");
  if (stream) printf (" stream: %s; ", stream);
  if (step) printf (" stream: %s; ", step);
  if (typePhp) printf (" typePhp: %d; ", typePhp);
  if (page) printf (" page: %s; ", page);
  printf(" -->\n");
  treeNode = ExplorSiteTreeNode(stream, step, NULL);
  printf (" <!-- treeNode : %s -->\n", SxmlNodeName(treeNode));
  bufKeyStep=NewBuffer();
  ExplorSidebarIcons();
  if (typePhp) ExplorSidebarUpPhp(stream, step, typePhp, page);
  ExplorSideBarStepHierarchy (stream, step, typePhp ,treeNode);
  ExplorSideBarListIndexes (stream, step,  typePhp, treeNode);
  ExplorSideBarStreamHierarchy (stream, step, treeNode);
  ExplorSideBarListSteps (stream, step, treeNode, typePhp);
  ExplorSideBarMainHierarchy (stream, step, treeNode);
  ExplorSideBarListStreams (stream, treeNode);
  ExplorSidebarBottom();
}
