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

   Module   : Explor
   Fichier  : ExplorPhpTools.c

   set of functions for generating code in Php pages

   see also: ExplorHtmlTools.c
************************************************************************************/

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

char *ExplorPrintPhpLineScript(char *line)
{
  char *posAmp;
  if (!line)return NULL;
  if (line[0]=='&')
    {
      if (strncmp(line, "&gt;", 4)==0) 
	{
	  putchar('>');
	  return ExplorPrintPhpLineScript(line+4);
	}
      if (strncmp(line, "&lt;", 4)==0) 
	{
	  putchar('<');
	  return ExplorPrintPhpLineScript(line+4);
	}
      if (strncmp(line, "&dquot;", 7)==0) 
	{
	  putchar('\"');
	  return ExplorPrintPhpLineScript(line+7);
	}
      putchar('&');
      return ExplorPrintPhpLineScript(line+1);
    }
  if ((posAmp=strchr(line,'&')))
    {
      static Buffer *bufStr=NULL;
      if (!bufStr)bufStr=NewBuffer();
      BufferStrncpy(bufStr, line, posAmp-line);
      printf ("%s", BufferString(bufStr));
      return ExplorPrintPhpLineScript(posAmp);
    }
  printf ("%s\n", line);
  return NULL;
}

char *ExplorPrintPhpScript(SxmlNode *xmlParam)
{
  SxmlNode *lineNode;
  char *ret;
  ret=NULL;
  while ((lineNode=SxmlNextNode(xmlParam)))
    {
      ExplorPrintPhpLineScript(ret=SxmlLeafText(lineNode));
    }
  return ret;
}

char *ExplorPhpPrintParamValue(char *strParam)
{
  if (strParam[0]=='<')
    {
      SxmlNode *xmlParam;
      
      xmlParam=SxmlFromString(strParam);
      if (SxmlNodeHasName(xmlParam,"php"))return ExplorPrintPhpScript(xmlParam);
      else 
	{
	  printf("echo \"%s\";\n", strParam);
	  return strParam;
	}
    }
  else
    {
      printf("echo \"%s\";\n", strParam);
      return strParam;
    }
}


char *ExplorPhpPrintParam(char *key)
{
  char *strParam;
  if((strParam=ExplorGetFromDict(key))) return ExplorPhpPrintParamValue(strParam);
  else ExceptSetError("Explor", "key", "paramètre ", key, "non trouvé",1);

  return strParam;
}


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

char *ExplorPhpPrintParam4(char *k1, char *k2, char *k3, char *key)
{
  char *strParam;
  if((strParam=ExplorGetFromDictK4(k1, k2, k3, key)))
    {
      return ExplorPhpPrintParamValue(strParam);
    }
  else
    {
      return ExplorPhpPrintParam3 (k1, k2, key);
    } 
}

char *ExplorPhpPrintParam5(char *k1, char *k2, char *k3, char *k4, char *key)
{
  char *strParam;
  if((strParam=ExplorGetFromDictK5(k1, k2, k3, k4, key)))
    {
      return ExplorPhpPrintParamValue(strParam);
    }
  else
    {
      return ExplorPhpPrintParam4 (k1, k2, k3, key);
    } 
}

void ExplorGenPhpHeadPage (char *lang, char *stream, char *step)
{
  SxmlNode *listNS;
  SxmlNode *NS;
  char *strListNS;
  static Buffer *bufData=NULL;
  if (!bufData) bufData=BufferCreate(10,10);

  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");
  printf("   <!-- this part is generated by ExplorPhpTools / ExplorGenPhpHeadPage -->\n");
  printf (" <?php\n");
  printf (" $ExplorStream=\"%s\";\n", stream);
  printf (" $ExplorStep=\"%s\";\n", step);
  printf (" require \'Common/php/SxmlNode.php\';\n" );
  printf (" require \'Common/php/Index.php\';\n" );
  printf (" require \'Common/php/Explor.php\';\n" );
  printf (" require \'Common/php/Hfd.php\';\n" );
  strListNS=ExplorGetFromDictK2("Area", "listNS");
  listNS=SxmlFromString(strListNS);
  while ((NS=SxmlNextNode(listNS)))
    {
      static Buffer* bufNS=NULL;
      char *requireStr;
      if (!bufNS)bufNS=NewBuffer();
      BufferStrcpy(bufNS,SxmlLeafText(NS));
      BufferStrcat(bufNS,":*");
      if ((requireStr=ExplorGetFromDictK2(BufferString(bufNS), "requirePhp")))
	{
	  SxmlNode *requireList;
	  SxmlNode *requireNode;
	  requireList=SxmlFromString(requireStr);
	  while ((requireNode=SxmlNextNode(requireList)))
	    {
	      printf (" require \'Common/php/%s\';\n", SxmlLeafText(requireNode));
	    }
	}
    }
  printf (" require \'Common/php/TeiExplor.php\';\n" );
  printf (" require \'Common/php/Wicri.php\';\n" );
  printf ("$ExplorParamTable=ExplorGetParamTable(\"Common/AreaParam.%s.tab\");\n", ExplorSiteLang); 
  printf ("$ExplorDomAreaTree=ExplorGetDomAreaTree($ExplorParamTable);\n"); 
  BufferStrcpy(bufData, "Data/");
  BufferStrcat(bufData, stream);
  BufferStrcat(bufData, "/");
  BufferStrcat(bufData, step);
  BufferStrcat(bufData, "/");
  printf ("$ExplorParamTable[\"#lang\"]=\"%s\";\n", lang);
  printf ("$ExplorParamTable[\"#stream\"]=\"%s\";\n", stream);
  printf ("$ExplorParamTable[\"#step\"]=\"%s\";\n", step);
  printf ("$ExplorStepDataPath=\"%s\";\n", BufferString(bufData));
  printf ("$ExplorParamTable[\"#dataPath\"]=\"%s\";\n", BufferString(bufData));
  printf ("?>\n");
}

void ExplorSitePhpIntro()
{
  printf (" <?php\n");
}

void  ExplorSitePhpEnd()
{
  printf ("     ?>");
}

void  ExplorSitePhpProcEnd()
{
  ExplorSitePhpEnd();
  ExplorHtmlBottomDilib(0);
  printf("</div>");
  ExplorHtmlEndBody();
}

int ExplorSiteGenerImplicitPhp (char *lang, char *stream, char *step, int level) 
{
  SxmlNode *stepTreeNode;
  stepTreeNode=ExplorSiteTreeNode(stream, step, NULL);
  if (!stepTreeNode) return 0;
  ExplorSiteGenerBibRecord (lang, stream, step, level);
  ExplorSiteGenerBibRecordById (lang, stream, step, level);
  ExplorSiteGenerIndexHead (lang, stream, step, level);
  ExplorSiteGenerIndexItem (lang, stream, step, level);
  ExplorSiteGenerIndexFacet (lang, stream, step, level);
  if ((ExplorGetFromDictK4 ("Area", stream, step, "listAssoc"))
      ||(ExplorGetFromDictK4 ("Area", stream, step, "listCross")))
    {
       ExplorSiteGenerAssoc(lang, stream, step, level);
       ExplorSiteGenerAssocHead(lang, stream, step, level);
       ExplorSiteGenerAndNot(lang, stream, step, level);
       if (ExplorGetFromDictK4 ("Area", stream, step, "listAssoc"))
	 {
	   ExplorSiteGenerClusterHead (lang, stream, step, level);
	   ExplorSiteGenerCluster(lang, stream, step, level);
	 }
    }
  return 1;
}



