/**************************************************************************\
|*                                                                          *|
|*  Menus                                                                   *|
|*                                                                          *|
|*  Descripci¢n:                                                            *|
|*                M¢dulo encargado de generar menus, una vez se le pasa     *|
|*                el puntero a la estructura definida.                      *|
|*                                                                          *|
|*                                         Fecha:  21-07-96  14.34 / 18.00  *|
|*                                                           23.13 / 00.30  *|
 \**************************************************************************/

#include <dos.h>
#include <conio.h>
#include <alloc.h>
#include <graphics.h>
#include "..\libs\make_bot\make_bot.h"

#undef MB_TeclaPulsada()
#define MB_TeclaPulsada() kbhit()

#include <stdio.h>

#include "herm.h"
#include "..\libs\bdatos\bdatos.hh"


#define CONTRAIDO 0
#define EXPANDIDO 1

extern unsigned _stklen = 18432U;

extern BDatos BConfig;

extern int far Espera_TeclaRaton(void);
void ErrorOccurred(int errorcode);

int Topicos = 5;
int SubTopicos[] = { 3, 4, 4, 9, 3 };
void far *Fondo_Menu; int xST, yST;
char *email="Jose-David.Guillen@cs.us.es";

int MenuPrincipal(void);

void ContraeMenu(void);
void ExpandeMenu( int Menu );
void SeleccionaTopico(int Topico, char color);
void SeleccionaSubTopico( int Topico, int SubTopico, int color );
void CheckRaton_Topic(int *Topico, int *SubTopico, int *Menu);
int  GestionHermanos( char HnoHna, int Accion );
void LeeConfiguracion(void);
void OrdenaBase( char HnoHna );
void GestionInsignias(void);
void ListadosRapidos( int Tipo_de_Listado );
void ConfiguracionGlobal(void);
void Imprime_Dibujo(void);

 int handler(int errval,int ax,int bp,int si);


void main(void)
{
 int Item;
 struct date FechaActual;
 getdate( &FechaActual );


 if ( carga_botones( "Herm.img" ) != OK )
                                        return;
 LeeConfiguracion();

 Initialize( 9, 2 ); // Inicializa el Modo Gr fico

 harderr(handler);

 True_Push = ON;                        PunteroRaton = 1;
 inicializa_raton_grafico( 0, 0, 639, 479 );

 while(1){
  Item = MenuPrincipal();
  switch ( Item>>8 )
  {
   // Archivo
   case 1:
        switch( Item & 0x00FF )
        {
         // Configuracion
         case 1:
              ConfiguracionGlobal();
              break;
         // Mantenimiento
         case 2:
              GestionInsignias();
              break;
         case 3:
              BConfig.CerrarReg();
              closegraph();
              printf("\nJos‚ David Guill‚n      ||  _-ùFuTuRe ViSiOnù-_ ");
              printf("\n\ne-mail: %s\n", email);
              return;
        }
        break;
   // Hermanos / Hermanas
   case 2:
   case 3:
        switch( Item & 0x00FF )
        {
         // Altas
         case ALTAS:
               if ( ( Item >> 8 ) == 2 )
                            GestionHermanos( HERMANOS, ALTAS );
              else
                            GestionHermanos( HERMANAS, ALTAS );
              break;
         // Bajas
         case BAJAS:
              if ( ( Item >> 8 ) == 2 )
                            GestionHermanos( HERMANOS, BAJAS );
              else
                            GestionHermanos( HERMANAS, BAJAS );
              break;
         // Consultas / Modificaciones
         case CONSULTAS:
              if ( ( Item >> 8 ) == 2 )
                            GestionHermanos( HERMANOS, CONSULTAS );
              else
                            GestionHermanos( HERMANAS, CONSULTAS );
              break;
         case REORDENAR:
              if ( ( Item >> 8 ) == 2 )
                            OrdenaBase( HERMANOS );
              else
                            OrdenaBase( HERMANAS );
              break;
        }
        break;
   // Listados
   case 4:
         ListadosRapidos( ( Item & 0x00FF ) );
        break;
   // Ayuda
   case 5:
        Optar( 0, "Acerca de...", "Programa realizado por:", "Jos‚ David Guill‚n || 1996", "e-mail:", "Jose-David.Guillen@cs.us.es", NULL );
        break;
  }
 };

}

//þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
int MenuPrincipal(void)
{
  int Menu = CONTRAIDO;
  int Topico = 0, SubTopico = 0, ok=0;

  // Memoria para el cuadro mas grande que coja
  if ( ( Fondo_Menu = farmalloc( (long)(64000L/*+4*/) ) ) == NULL )
                                                  Error( "No hay suficiente memoria" );


  // Imprime men£ principal
  Imprime_Estaticos(10, "herm.img");
  Imprime_Dibujo();

  settextstyle( SMALL_FONT, HORIZ_DIR, 6 );

  SeleccionaTopico( Topico, EGA_RED );

  do
  {
   Espera_TeclaRaton();
   if ( !kbhit() )
    CheckRaton_Topic(&Topico, &SubTopico, &Menu);
   else
   switch( getch() )
   {
    // Intro
    case 13:
         if ( Menu == CONTRAIDO )
         {
          Menu = EXPANDIDO;           ExpandeMenu( Topico );
          SubTopico = 0;
          SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
         } else {
          ContraeMenu();
          ok = 1;
         }
         break;
    // Esc
    case 27:
         if ( Menu == EXPANDIDO )
         {
          Menu = CONTRAIDO;           ContraeMenu();
         }
         break;
    case  0:
      switch( getch() )
      {
       // Flecha Izquierda
       case  75:
       case  15:
            if ( Menu != CONTRAIDO )
                                   ContraeMenu();

             SeleccionaTopico( Topico, EGA_LIGHTGRAY );
             Topico--; if ( Topico<0 ) Topico = Topicos-1;
             SeleccionaTopico( Topico, EGA_RED       );
             SubTopico = 0;

            if ( Menu != CONTRAIDO )
            {
                                   ExpandeMenu( Topico );
                                   SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
            }
            break;
       // Flecha Derecha
       case  77:
       case   9:
            if ( Menu != CONTRAIDO )
                                   ContraeMenu();

             SeleccionaTopico( Topico, EGA_LIGHTGRAY );
             Topico++; if ( Topico>=Topicos ) Topico = 0;
             SeleccionaTopico( Topico, EGA_RED       );
             SubTopico = 0;

            if ( Menu != CONTRAIDO )
            {
                                   ExpandeMenu( Topico );
                                   SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
            }
            break;
       // Flecha Arriba
       case  72:
            if ( Menu == EXPANDIDO )
            {
             SeleccionaSubTopico( Topico, SubTopico, EGA_LIGHTGRAY );
             SubTopico--; if ( SubTopico < 0 ) SubTopico = SubTopicos[Topico]-1;
             SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
            }
            break;
       // Flecha Abajo
       case  80:
            if ( Menu == EXPANDIDO )
            {
             SeleccionaSubTopico( Topico, SubTopico, EGA_LIGHTGRAY );
             SubTopico++; if ( SubTopico >= SubTopicos[Topico] ) SubTopico = 0;
             SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
            } else {
             Menu = EXPANDIDO;           ExpandeMenu( Topico );
             SubTopico = 0;
             SeleccionaSubTopico( Topico, SubTopico,  EGA_RED );
            }
            break;
      }
      break;
   }
 }while(!ok);

 farfree( Fondo_Menu );
 return ( (Topico+1)<<8 )+(SubTopico+1);
}

void CheckRaton_Topic(int *Topico, int *SubTopico, int *Menu)
{
  // Men£ principal
  if ( y_raton > 9 && y_raton < 27 )
  {
    if ( x_raton > 8 && x_raton < 90 && *Topico != 0 )
    {
       ContraeMenu(); SeleccionaTopico( *Topico, EGA_LIGHTGRAY );
       *Topico = 0; *SubTopico = 0;
       *Menu = EXPANDIDO;           ExpandeMenu( *Topico );
       SeleccionaTopico( *Topico, EGA_RED );
       SeleccionaSubTopico( *Topico, *SubTopico, EGA_RED );
    } else
    if ( x_raton > 105 && x_raton < 197 && *Topico != 1 )
    {
       ContraeMenu(); SeleccionaTopico( *Topico, EGA_LIGHTGRAY );
       *Topico = 1; *SubTopico = 0;
       *Menu = EXPANDIDO;           ExpandeMenu( *Topico );
       SeleccionaTopico( *Topico, EGA_RED );
       SeleccionaSubTopico( *Topico,  *SubTopico, EGA_RED );
    } else
    if ( x_raton > 215 && x_raton < 307 && *Topico != 2 )
    {
       ContraeMenu(); SeleccionaTopico( *Topico, EGA_LIGHTGRAY );
       *Topico = 2; *SubTopico = 0;
       *Menu = EXPANDIDO;           ExpandeMenu( *Topico );
       SeleccionaTopico( *Topico, EGA_RED );
       SeleccionaSubTopico( *Topico,  *SubTopico, EGA_RED );
    } else
    if ( x_raton > 325 && x_raton < 412 && *Topico != 3 )
    {
       ContraeMenu(); SeleccionaTopico( *Topico, EGA_LIGHTGRAY );
       *Topico = 3; *SubTopico = 0;
       *Menu = EXPANDIDO;           ExpandeMenu( *Topico );
       SeleccionaTopico( *Topico, EGA_RED );
       SeleccionaSubTopico( *Topico,  *SubTopico, EGA_RED );
    } else
    if ( x_raton > 560 && x_raton < 630 && *Topico != 4 )
    {
       ContraeMenu(); SeleccionaTopico( *Topico, EGA_LIGHTGRAY );
       *Topico = 4; *SubTopico = 0;
       *Menu = EXPANDIDO;           ExpandeMenu( *Topico );
       SeleccionaTopico( *Topico, EGA_RED );
       SeleccionaSubTopico( *Topico,  *SubTopico, EGA_RED );
    }
  }

}

void SeleccionaTopico(int Topico, char color)
{
  setcolor( color );
  switch( Topico )
  {
   case 0:
        rectangle(   8, 9, 90, 27 );
        break;
   case 1:
        rectangle( 105, 9, 197, 27 );
        break;
   case 2:
        rectangle( 215, 9, 307, 27 );
        break;
   case 3:
        rectangle( 325, 9, 412, 27 );
        break;
   case 4:
        rectangle( 560, 9, 630, 27 );
        break;
  }
}

void SeleccionaSubTopico( int Topico, int SubTopico, int color )
{
 setcolor( color );
 switch( Topico )
 {
  case 0:
       if ( SubTopico == 2 )
         rectangle( 8, 40+20*3, 157, 40+20*4 );
       else
         rectangle( 8, 40+20*SubTopico, 157, 40+20*( SubTopico + 1 ) );
       break;
  case 1:
       if ( SubTopico == 3 )
         rectangle( 108, 40+20*4, 257, 40+20*5 );
       else
         rectangle( 108, 40+20*SubTopico, 257, 40+20*(SubTopico+1) );
       break;
  case 2:
       if ( SubTopico == 3 )
         rectangle( 218, 40+20*4, 367, 40+20*5 );
       else
         rectangle( 218, 40+20*SubTopico, 367, 40+20*( SubTopico + 1 ) );
       break;
  case 3:
         rectangle( 328, 40+20*SubTopico, 482, 40+20*( SubTopico + 1 ) );
       break;
  case 4:
         rectangle( 483, 40+20*SubTopico, 627, 40+20*( SubTopico + 1 ) );
       break;
 }


}
//þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ

void ExpandeMenu( int Menu )
{

 switch( Menu )
 {
  case 0:
       xST = 5; yST = 35;
       getimage( 5, 35, 160, 40+20*4+5, Fondo_Menu );
       setfillstyle(SOLID_FILL, EGA_LIGHTGRAY); bar( 5, 35, 160, 40+20*4+5 );
       setcolor( EGA_BLACK );                   rectangle( 5, 35, 160, 40+20*4+5 );
       setcolor( EGA_BLUE );
       outtextxy(   8, 40+20*0, " Configuracion" );
       outtextxy(   8, 40+20*1, " Insignias    " );
       outtextxy(   8, 40+20*2, " -------------" );
       outtextxy(   8, 40+20*3, "   ( Salir )  " );
       break;
  case 1:
       xST = 105; yST = 35;
       getimage( 105, 35, 260, 40+20*5+5, Fondo_Menu );
       setfillstyle(SOLID_FILL, EGA_LIGHTGRAY); bar( 105, 35, 260, 40+20*5+5 );
       setcolor( EGA_BLACK );                   rectangle( 105, 35, 260, 40+20*5+5 );
       setcolor( EGA_BLUE );
       outtextxy( 105, 40+20*0, " Altas de Hnos" );
       outtextxy( 105, 40+20*1, " Bajas de Hnos" );
       outtextxy( 105, 40+20*2, " Consul/Modif." );
       outtextxy( 105, 40+20*3, " -------------" );
       outtextxy( 105, 40+20*4, " Reordenar Hns" );
       break;
  case 2:
       xST = 215; yST = 35;
       getimage( 215, 35, 370, 40+20*5+5, Fondo_Menu );
       setfillstyle(SOLID_FILL, EGA_LIGHTGRAY); bar( 215, 35, 370, 40+20*5+5 );
       setcolor( EGA_BLACK );                   rectangle( 215, 35, 370, 40+20*5+5 );
       setcolor( EGA_BLUE );
       outtextxy( 215, 40+20*0, " Altas de Hnos" );
       outtextxy( 215, 40+20*1, " Bajas de Hnos" );
       outtextxy( 215, 40+20*2, " Consul/Modif." );
       outtextxy( 215, 40+20*3, " -------------" );
       outtextxy( 215, 40+20*4, " Reordenar Hns" );
       break;
  case 3:
       xST = 325; yST = 35;
       getimage( 325, 35, 485, 40+20*9+5, Fondo_Menu );
       setfillstyle(SOLID_FILL, EGA_LIGHTGRAY); bar( 325, 35, 485, 40+20*9+5 );
       setcolor( EGA_BLACK );                   rectangle( 325, 35, 485, 40+20*9+5 );
       setcolor( EGA_BLUE );
       outtextxy( 325, 40+20*0, " Votantes       " );
       outtextxy( 325, 40+20*1, " Acogido a Cuota" );
       outtextxy( 325, 40+20*2, " Rec. Notificac." );
       outtextxy( 325, 40+20*3, " Papeletas de S." );
       outtextxy( 325, 40+20*4, " Listado Hnos   " );
       outtextxy( 325, 40+20*5, " Fichas Hnos    " );
       outtextxy( 325, 40+20*6, " T£nicas Hdad.  " );
       outtextxy( 325, 40+20*7, " Facturas       " );
       outtextxy( 325, 40+20*8, " Etiquetas Dir. " );
       break;
  case 4:
       xST = 480; yST = 35;
       getimage( 480, 35, 630, 40+20*3+5, Fondo_Menu );
       setfillstyle(SOLID_FILL, EGA_LIGHTGRAY); bar( 480, 35, 630, 40+20*3+5 );
       setcolor( EGA_BLACK );                   rectangle( 480, 35, 630, 40+20*3+5 );
       setcolor( EGA_BLUE );
       outtextxy( 480, 40+20*0, " ------------" );
       outtextxy( 480, 40+20*1, " Creditos    " );
       outtextxy( 480, 40+20*2, " Acerca de..." );
       break;
 }
}

void ContraeMenu(void)
{
 if ( Fondo_Menu != NULL )
      putimage( xST, yST, Fondo_Menu, COPY_PUT );

}





void Imprime_Dibujo(void)
{
 FILE *fp;
 int alto, ancho; unsigned char byte;
 int contador;


 if ( ( fp = fopen ( "insignia.pcx", "rb" ) ) != NULL )
 {

  // Saltamos la cabecera
  fseek( fp, 128, SEEK_SET );

  for(alto=0; alto<128; alto++)
  {
    for(ancho=0; ancho<128; )
    {
      byte=getc(fp);
      if(byte<=0xC0)
      {
        if  ( byte != 255 )
                putpixel( ancho+256, alto+270, byte );
	ancho++;
      }
      else
      {
	contador=byte&0x3F; byte=getc(fp);
	for(; contador>0; contador--)
	{
          if  ( byte != 255 )
                putpixel( ancho+256, alto+270, byte );
          ancho++;
	}
      }
    }
  }



  fclose( fp );
 }

}