#include    <ctype.h>
#include    <io.h>
#include    <dir.h>
#include  <DIRECT.H>
#include    <dos.h>
#include  <alloc.h>
#include  <process.h>
#include  <string.h>
#include  <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include "..\libs\make_bot\make_bot.h"
//#include "cd_icons.h"
#include "cd_error.h"
#include "cd_file.h"
#include "CD_SND.H"

extern int /*far _cdecl*/ Fichero_cd_img(char Dinamicos_Estaticos);

#define DOS     1
#define WINDOWS 2


int make_dir(char *Target);

extern void Sonido(char Sonido);
extern void BEEP(void);
void Init_Install(int CurrIcon);
extern char *current_directory(char *path);
extern void Inicializa_Dibujo(int L_Imagen, char *N_Imagen2);
extern void Inicializa_Iconos(void);
extern void Coloca_Iconos_Dos_Windows(void);
extern char far *Icono; // 18
// extern unsigned char *P_Raton1, *P_Raton2, *P_Raton3, *P_Raton4;
// extern void *Pantalla;
extern void InicializaSVGA(void);
extern char  dac[256*3];
extern "C"  void  APAGA_PANTALLA(char *);
extern "C"  void  ENCIENDE_PANTALLA(char *);

extern void Inicializa_Apertura(void);
// extern void Menu_de_Edicion(void);
extern void Coloca_Iconos(int Start_Icon);

int file_exists(char *filename);
int Muestra_Mensaje(int Mensaje, char *file);

typedef struct {

    unsigned int Exit_after_EXE  : 1;
    unsigned int With_Out_Sound  : 1;
    unsigned int Auto_Install    : 1;
    unsigned int Check_Free_Size : 1;
    unsigned int Format_Always   : 1;
    unsigned int Without_Backgr  : 1;
    unsigned int Futura_Ampliac  : 4;

} Cd_CFG;

extern Cd_CFG CD_CFG1;

extern FILE *CD_in;
extern CD_FILE CD_in2;

int InputCadenaG_T4(char *s, int numalp, int lmax, int cc, int cf, int X0, int Y0, int X1, int Y1, int RoW);

void Init_Install(int CurrIcon){

 int ok = 0, inst = 0, key;
 char curdir[80], *Ptr, Origen[80];
 char Buffer[200], D_Target[80];
 D_Target[0] = '\0';
// ERROR_SALVA = 0;

 void *C_Texto, *C_Aceptar, *C_Cancelar;

  /// Comprobamos que estamos preparados para proceder con
  /// la instalaci�n pertinente...
	 strcpy( Buffer, CD_in2.Dir_P );     // Existe el directorio
	 Buffer[0] = getdisk() + 'A';        // origen...
	 if ( !file_exists(Buffer) ) { Muestra_Mensaje(113, "cd_out.img");
//					Sonido("CD_OUT71.WAV");
				       Sonido( Error_113 );
					 return; }


C_Texto    = malloc( JD_imagesize(200, 212, 440, 267) );
C_Aceptar  = malloc( JD_imagesize(200, 270, 280, 295) );
C_Cancelar = malloc( JD_imagesize(360, 270, 440, 295) );


if( C_Texto == NULL || C_Aceptar == NULL || C_Cancelar == NULL)  {
 closegraph();
 cprintf("\n\rSALIENDO");
 cprintf("\n\rImposible encontrar %ldKbytes en el Heap",
							( JD_imagesize(118, 160, 521, 335) +
							  JD_imagesize(118, 160, 521, 335) +
							  JD_imagesize(118, 160, 521, 335)
							)
	);
 exit(SIN_MEMORIA);
}

getimage(200, 212, 440, 267, C_Texto);
getimage(200, 270, 280, 295, C_Aceptar);
getimage(360, 270, 440, 295, C_Cancelar);


//  Imprime_Estaticos(20, "cd_out.img");     // Imprime botones estaticos 'Seccion 20'
  Fichero_cd_img(20);
Imprime_Secuencia(4);		          // Imprime secuencia 4.
//  Imprime_Estaticos(21, "cd_out.img");     // Imprime textos estaticos 'Seccion 5'
  Fichero_cd_img(21);

settextstyle( SMALL_FONT, HORIZ_DIR, 4);
if ( CD_in2.Alt_Install.Usar_Install_P == 1 ) {
 setcolor(241);
 outtextxy(215, 243, "   - USAR INSTALADOR PROPIO -");
}

while(!ok){				  // Bucle infinito

 switch( Comprueba_Secuencia( 4 ) ) {     // Iniciamos comprobacion de 2� sec

       case  0:				  // No se pulso ningun BOTON
					  // Pero el raton fue presionado en
					  // algun sitio...
//	       Sonido("CD_OUT02.WAV");
	       Sonido( Key_Press );
	       break;
       case -2:				  // Hay una tecla normal en BUFFER
	       switch( key = getch() ) {  // La utilizamos
		// Intro ( ACEPTAR )
//		case 13:
//			exe = 1;
//			ok  = 1;
//			break;
		// ESC   ( CANCELAR )
		case 14:
//			Sonido("CD_OUT0F.WAV");
		       Sonido( Cancel );
			inst = 0;
			ok   = 1;
			break;
		default:
		       if( ( isprint(key) || isspace(key) ) && CD_in2.Alt_Install.Usar_Install_P == 0 ) {
			   if(key!=13) ungetch(key);
			   if ( CD_in2.Alt_Install.Usar_VGA_COPY==0 )
				   InputCadenaG_T4(D_Target, 0, 35, 241, 240, 215, 243, 427, 254, 0);
			   else
				   InputCadenaG_T4(D_Target, 0,  1, 241, 240, 215, 243, 427, 254, 0);
		       }
			break;
	       }
	       break;
       case -1:				  // Hay una tecla especial en BUFFER
	       getch();			  // La eliminamos
	       break;
       // Boton Aceptar
       case  1:
//	       Sonido("CD_OUT0E.WAV");
	       Sonido( Ok );
	       inst = 1;
	       ok   = 1;
	       break;
       // Boton Cancelar
       case  2:
//	       Sonido("CD_OUT0F.WAV");
	       Sonido( Cancel );
	       inst = 0;
	       ok   = 1;
	       break;
       default:
//	       Sonido("CD_OUT01.WAV");
	       Sonido( Mouse_Press );
	       while( kbhit() ) getch();  // Limpiamos posibles teclas en BUFFER
	       break;
 }

}

putimage(200, 212, C_Texto, COPY_PUT);
putimage(200, 270, C_Aceptar, COPY_PUT);
putimage(360, 270, C_Cancelar, COPY_PUT);

if ( CD_in2.Alt_Install.Usar_Install_P == 0 && !file_exists(D_Target) )
  if ( make_dir(D_Target)!= 1 ) return;



if ( inst == 1 ) {

		 /// Liberamos la memoria asignada para al DRIVER gr�fico...
		 current_directory(curdir);
		 APAGA_PANTALLA(dac);
		 closegraph();
		 Libera_Memoria();
//		 Libera_Raton_Animado();
		 /*
		 free(P_Raton1);
		 free(P_Raton2);
		 free(P_Raton3);
		 free(P_Raton4);
		 free(Pantalla);
		 */
		 farfree(Icono);
		 fclose(CD_in);

     /*

       C O M I E N Z A   L A   I N S T A L A C I O N   D E L   P R O G R A M A

     */

		 cprintf("�������������Ŀ\n\r");
		 cprintf("� JD & CD_OUT �\n\r");
		 cprintf("���������������\n\r");
		 cprintf("INSTALANDO PROGRAMA: [%s]\n\r", CD_in2.Nombre);

		 strcpy( Buffer, CD_in2.Dir_P );     // Existe el directorio
		 Buffer[0] = getdisk() + 'A';        // origen...
		 chdir(Buffer);			     // Refresamos a nuestro directorio
		 strcpy( Origen, Buffer );
		 strcat( Origen, "\\*.*");

		 if ( CD_in2.Alt_Install.Usar_XCopy == 1 ) {

			  if ( ( Ptr = searchpath("xcopy.exe") ) != NULL ) {
			   strcpy( Buffer, Ptr );
			  } else {
			   strcpy( Buffer, "E:\\cd_out\\compress\\xcopy " );
			   Buffer[0] = getdisk() + 'A';        // origen...
			  }
			   strcat(D_Target, "\\*.*" );
			   if ( spawnl(P_WAIT, Buffer, "VOID", Origen, D_Target, "/s", "/e", "/y", NULL) == -1 ) {
				printf("Imposible instalar %s, XCOPY no acepta parametrizaje", Buffer);
				getch();
			 }
		 } else
		 if ( CD_in2.Alt_Install.Usar_Install_P == 1 ) {
			   strcpy( Origen, Buffer );
			   strcat( Origen, "\\");
			   strcat( Origen, CD_in2.N_Install);
			   if ( spawnl(P_WAIT, /*CD_in2.N_Install*/Origen, NULL) == -1 ) {
				printf("Imposible ejecutar %s, el archivo no esta disponible", Buffer);
				getch();
			   }
		 } else
		 if ( CD_in2.Alt_Install.Usar_ARJ == 1 ) {
			   strcpy( Origen, Buffer );
			   strcat( Origen, "\\*.arj");

			  if ( ( Ptr = searchpath("ARJ.EXE") ) != NULL ) {
			   strcpy( Buffer, Ptr );
			  } else {
			   strcpy( Buffer, "E:\\cd_out\\compress\\ARJ" );
			   Buffer[0] = getdisk() + 'A';        // origen...
			  }

			   if ( spawnl(P_WAIT, Buffer,  "VOID", "x", "-va", /*"*.arj"*/Origen, D_Target, NULL) == -1 ) {
				printf("Imposible instalar %s, ARJ no ejecutable.", CD_in2.Nombre);
				getch();
			 }
		 } else
		 if ( CD_in2.Alt_Install.Usar_ZIP == 1 ) {
			   strcpy( Origen, Buffer );
			   strcat( Origen, "\\*.zip");

			  if ( ( Ptr = searchpath("PKUNZIP.EXE") ) != NULL ) {
			   strcpy( Buffer, Ptr );
			  } else {
			   strcpy( Buffer, "E:\\cd_out\\compress\\PKUNZIP" );
			   Buffer[0] = getdisk() + 'A';        // origen...
			  }

			   if ( spawnl(P_WAIT, Buffer,  "VOID", "-$", "-d", /*"*.zip"*/Origen, D_Target, NULL) == -1 ) {
				printf("Imposible instalar %s, ZIP no ejecutable.", CD_in2.Nombre);
				getch();
			 }
		 }


//	  unsigned int Usar_VGA_COPY     : 1;



		 clrscr();
		 cprintf("�������������Ŀ\n\r");
		 cprintf("� JD & CD_OUT �\n\r");
		 cprintf("���������������\n\r");
		 cprintf("Regresando a CD_OUT...\n\r");

		 //// Recargamos el Programa...
		 chdir(curdir);			    // Refresamos a nuestro directorio
						    // de origen
		 InicializaSVGA();		    // Reinicializamos la SVGA
		 APAGA_PANTALLA(dac);		    // Apagamos la Pantalla
		 Inicializa_Dibujo( (-1), "NADA");  // Inicializamos un nuevo dibujo

//		if( carga_botones("cd_out.img")     // Recarga botones del fichero "CD_out.img"
		if ( Fichero_cd_img(0)

		      != OK ) {
//		      Imprime_Estaticos( 112, "cd_out.img");
		Fichero_cd_img(112);
			 Espera_Tecla_o_Raton();
			 closegraph();
			 cprintf("\n\rError en la CARGA DE BOTONES");
			 exit(112);
		}


//		Imprime_Estaticos( 1, "cd_out.img");     // Imprime botones estaticos 'Seccion 1'
  Fichero_cd_img(1);
		Imprime_Secuencia(1);		          // Imprime secuencia 1.

//		Imprime_Estaticos( 2, "cd_out.img");     // Imprime botones estaticos 'Seccion 2'
							 //	para los textos
  Fichero_cd_img(2);
/*�*/  PunteroRaton = 100;                                              /*�*/
/*�*/  inicializa_raton_grafico( 0, 0, 618, 460);                       /*�*/
/*�*/  if ( PunteroRaton != 100 ) {                                     /*�*/
/*�*/		      closegraph();                                     /*�*/
/*�*/                 cprintf("Memoria_Insuficiente para el RATON\n\r");/*�*/
/*�*/                 exit(1);                                           /*�*/
/*�*/  }                                                                /*�*/

		Inicializa_Iconos();
		Coloca_Iconos_Dos_Windows();
		Coloca_Iconos(CurrIcon);

		ENCIENDE_PANTALLA(dac);
		/*
		if ( (Pantalla = malloc( JD_imagesize(0, 0, 21, 21) )) == NULL ) {
		 Imprime_Estaticos( SIN_CVN, "cd_out.img");
		 Espera_Tecla_o_Raton();
		 closegraph();
		 cprintf("\n\rError en la asignaci�n de memoria para la mascara del raton");
		 exit(2);
		}
		*/
		Imprime_Bordes(1, 1, 251);
		settextstyle( SMALL_FONT, HORIZ_DIR, 4);
		Inicializa_Apertura();

		True_Push = ON;			   // Activa el TRUE PUSH ( PRESION REAL )

  }



}



int InputCadenaG_T4(char *s, int numalp, int lmax, int cc, int cf, int X0, int Y0, int X1, int Y1, int RoW)
{

  int  ls;                                      // longitud cadena
  char *s1;                                     // puntero a cadena inicial
  int c, ok;

  s1 = s;                                       // inicio cadena

  setcolor(cf);                                 // pone color a 0 para borrar
  setfillstyle(SOLID_FILL, cf);
  bar( X0, Y0, X1, Y1 );
  setcolor(cc);                                 // devuelve el color a su estado

  outtextxy( X0, Y0+RoW*12, s );

  ls = strlen ( s );                            // Longitud de actual

  if ( ls < lmax ) {
		setcolor(250);
		outtextxy( X0+textwidth( s1 ), Y0+RoW*12, "�");
  }

  s += ls;                                      // se coloca en el final

  do{
	c = getch();                            // obtiene tecla

	ok = ( c == 13 || c == 0);              // 13 = INTRO || Especiales

	if ( c == 8  && ls > 0 && !ok ) {       //  8 = Back Space
		ls--;
		s--;

		*s = '\0';

		setcolor(cf);
		setfillstyle(SOLID_FILL, cf);
		bar( X0, Y0, X1, Y1 );

		setcolor(cc);
		outtextxy( X0, Y0+RoW*12, s1 );
		setcolor(4);
		outtextxy( X0+textwidth( s1 ), Y0+RoW*12, "�");
		setcolor(cc);

	} else {
		if ( !numalp && c >= 32 && c <= 254 && ls < lmax) {

			*s++ = c;
			ls++;

			*s = '\0';
			setcolor(cf);
			setfillstyle(SOLID_FILL, cf);
			bar( X0, Y0, X1, Y1 );

			setcolor(cc);
			outtextxy( X0, Y0+RoW*12, s1 );

			if ( ls < lmax ) {
				setcolor(4);
				outtextxy( X0+textwidth( s1 ), Y0+RoW*12, "�");
				setcolor(cc);
			}


		} else {
			if ( numalp && isdigit(c)  && ls < lmax) {
				*s++ = c;
				ls++;

				*s = '\0';                              // Cero final
				setcolor(cf);
				setfillstyle(SOLID_FILL, cf);
				bar( X0, Y0, X1, Y1 );

				setcolor(cc);

				outtextxy( X0, Y0+RoW*12, s1 );

				if ( ls < lmax ) {
					setcolor(4);
					outtextxy( X0+textwidth( s1 ), Y0+RoW*12, "�");
					setcolor(cc);
				}


		}
//		  ������������������������������������
		else if( c == 27 ) {*s='\0'; ok = 1; }
//		  ������������������������������������
		else BEEP();
	}
     }

  }while(!ok);

  ok = 1;
  *s = ' ';
  while( ok ) {
		if(*s==' ') { *s = '\0'; s--;
		} else { s++; ok = 0; }
  }

  *s = '\0';

  while(kbhit()) getch();              // Vacia Buffer impidiendo falsas
					//  pulsaciones...

			setcolor(cf);
			setfillstyle(SOLID_FILL, cf);
			bar( X0, Y0, X1, Y1 );

			setcolor(cc);
			outtextxy( X0, Y0+RoW*12, s1 );

  return ls;
}

int file_exists(char *filename)
{
  return (access(filename, 0) == 0);
}





int Muestra_Mensaje(int Mensaje, char *file) {
 void *Imagen;


 if ( (Imagen = malloc( JD_imagesize(200, 212, 440, 267) ) ) == NULL ) {
	Espera_Tecla_o_Raton();
	Anclar_Raton();
	return -1;
 } else {
	getimage( 200, 212, 440, 267, Imagen );
//	Imprime_Estaticos( Mensaje, file);
  Fichero_cd_img(Mensaje);
	Espera_Tecla_o_Raton();
	Anclar_Raton();
	putimage( 200, 212, Imagen, COPY_PUT);
	free(Imagen);
	return  1;
 }
}


int make_dir(char *Target){

  char CurrDriver, Buffer[80], Crear_Dir[14], ok = 0, Contador=0, Sub_Cnt;
  CurrDriver = getdisk();		  // Obtenemos el directorio origen


  strcpy( Buffer, Target );               // Realizamos una copia del Destino
  strupr( Buffer );			  // Lo transformamos a mayusculas
  if ( Buffer[strlen(Buffer)] == '\\' )   // Si acaba en '\' ERROR
    return 0;

					  // para que al restarle 65 = 'A'
  setdisk( ( Buffer[0] - 'A' ) );         // nos de el n�mero l�gico de unidad
if ( getdisk() != ( Buffer[0] - 'A' ))
  return 0;				  // Si no podemos cambiar. Return 0;

if ( chdir("\\") )                        // Nos vamos al ra�z
  return 0;				  // Si no podemos, ERROR !!!


  Contador = 3;
do {

Sub_Cnt = 0;
while( Buffer[Contador] != '\\' && Buffer[Contador] != '\0' ) {
 Crear_Dir[Sub_Cnt] = Buffer[Contador];
 Contador++;
 Sub_Cnt ++;
}
// Sub_Cnt++;
 Contador++;
 if ( Buffer[Contador-1] == NULL ) ok = 1;
  Crear_Dir[Sub_Cnt] = '\0';

 if ( !file_exists(Crear_Dir) ) {
  if ( mkdir( Crear_Dir ) != 0 ) ok = 2; else
   chdir( Crear_Dir );
 } else
 chdir( Crear_Dir );

}while(!ok);

if ( ok == 2 ) return 0;

if ( chdir("\\") ) return 0;

  setdisk(CurrDriver);
if ( getdisk() != CurrDriver)            // Volvemos hasta nuestra unidad
  return 0;


   return 1;
}