#include <stdio.h>
#include "error.h"
#include "tree.h"
#include "treeXtrn.h"
#include "gd.h"
#include "gdfontl.h"

#define BOX_WIDTH 100
#define BOX_HEIGHT 25

#Generiere GIF-Bilder fr jeden Node mit Children im Baum
displayBranch ( char *project, int nodeNum, NODE *top ) {
   char str[360];
   char serverRoot[360] = "myServer";
   gdImagePtr im;
   FILE *out;
   int black, white, red, green, blue;
   int imWidth, imHeight;
   NODE *node, *child;
   int i=0, numNodes = 0;
   int xStart, yStart, xEnd, yEnd;

      /* gib die Ende-Links nicht aus */
      if ( top->child == END_NODE ) return;

      /* nimm die Anzahl der Children fr diesen Parent */
      node = (treeShmPtr + top->offset);
      if ( node->child != END_NODE ) {
         numNodes +=1;
         node = (treeShmPtr + node->child);
         while ( node->sibling != END_NODE ) { 
            numNodes += 1; 
            node = (treeShmPtr+node->sibling);
         }
      }

      #setze Standard-Parameter zum Zeichnen einer Box.
      imWidth  = 500;
      imHeight = ( numNodes * (BOX_HEIGHT + 30) );

      /* ffne und lsche die Plan-Datei */
      openMapFile (project, nodeNum);

      /* erstelle Bild und weise die Farben zu */
            im    = gdImageCreate(imWidth,imHeight);
            black = gdImageColorAllocate(im, 0, 0, 0);
            white = gdImageColorAllocate(im, 255, 255, 255);
            red   = gdImageColorAllocate(im, 255, 0, 0);
            green = gdImageColorAllocate(im, 0, 255, 0);
            blue  = gdImageColorAllocate(im, 0, 0, 255);

      /* zeichne den Parent-Node */
      xStart = 50;
      yStart = imHeight/3;
      xEnd = 50+BOX_WIDTH;
      yEnd = (imHeight/3)+BOX_HEIGHT;
      gdImageFilledRectangle (im, xStart, yStart, xEnd, yEnd, blue);
      gdImageString ( im, gdFontLarge, xStart+10, yStart+5,top->name,white);

      /* den Plan-Eintrag fr diesen Node ausgeben */
      writeMapFile ( project, nodeNum, top->link, xStart, yStart, xEnd, yEnd );

      if ( nodeNum != 0 ) {
         xStart += BOX_WIDTH;
         xEnd = xStart + 30;
         yEnd = yStart + BOX_HEIGHT;
         gdImageFilledRectangle (im, xStart, yStart, xEnd, yEnd, green);

         /* den Plan-Eintrag fr den nchsten Link ausgeben */
         sprintf (str, "http://%s/cgi-bin/regenPage?%d+%d+%d+%s", serverRoot, 
                 top->parent, nNodes,     sizeof(NODE), project );
         writeMapFile ( project, nodeNum, str, xStart, yStart, xEnd, yEnd );
      }

/* zeichne die Child-Nodes */
      child = (treeShmPtr + top->child);
      xStart = yStart = xEnd = yEnd = 0;
      
      #fr jeden Child-Node
      while ( child->offset != END_NODE ) { 
         /* setze Koordinaten fr den Node und zeichne ihn */
         xStart = 250;
         yStart = i*50 + 10;
         xEnd = xStart + BOX_WIDTH; 
         yEnd = yStart + BOX_HEIGHT;

         /* den Plan-Eintrag fr diesen Node ausgeben */
         if ( child->protected ) {
            gdImageFilledRectangle (im, xStart, yStart, xEnd, yEnd, red);
            writeMapFile ( project, nodeNum,"http://instra.gsfc.nasa.gov/html/protected.html", xStart, yStart, xEnd, yEnd );
         } else {
            gdImageFilledRectangle (im, xStart, yStart, xEnd, yEnd, blue);
            writeMapFile ( project, nodeNum,
                child->link, xStart, yStart, xEnd, yEnd );
            }
         gdImageString ( im, gdFontLarge,xStart+10,yStart+5,child->name,white);

         /* den nchsten Link ausgeben */
         if ( child->child != END_NODE ) {
            xStart += BOX_WIDTH;
            xEnd = xStart + 30;
            yEnd = yStart + BOX_HEIGHT;
            gdImageFilledRectangle (im, xStart, yStart, xEnd, yEnd, green);

            /* den Plan-Eintrag fr den nchsten Link ausgeben */
            sprintf (str, 
                  "http://%s/cgi-bin/regenPage?%d+%d+%d+%s",
                   serverRoot, child->offset, nNodes, sizeof(NODE), project);
            writeMapFile ( project, nodeNum, 
                           str, xStart, yStart, xEnd, yEnd );
         }

         /* den nchsten Sibling im Baum ausgeben */
         if ( child->sibling == END_NODE ) break;

         i+=1;
         child = (treeShmPtr + child->sibling);
      }

      /* die Datei auf die Platte ausgeben */
      sprintf ( str, "%s%d.gif", project, nodeNum );
      out = fopen (str, "wb" );
      gdImageGif(im,out);

      /* bereinigen */
      fclose (out);
      gdImageDestroy(im);

}

