//BIBLIOTECAS EMPLEADAS
//Bibliotecas
#include<math.h>
#include<ctype.h>
#include<alloc.h>
#include<string.h>
#include<dos.h>
#include<stdio.h>
#include<bios.h>
#include<conio.h>

//VARIABLES GLOBALES
struct datos{   char nombre[20];
		char apodo[20];
		char numero[20];

	     }datos;

typedef struct nodo{    char nombre[20];
			char apodo[20];
			char numero[20];
			struct nodo *sig;
		    }INFO;

struct simbolo{   char letra;

	      }simbolo;

typedef struct nodo1{   char letra;
			struct nodo1 *sig;
			struct nodo1 *ant;

		    }LET;
int matriz1;
int opcion=1;
INFO *plista=NULL;
char matriz2[80];

//DECLARACION DE FUNCIONES
void graba();
void diario(int subopcion);
void captura(int tam,int elec,char nombre[80],int x,int y);
void telefonos(int subopcion);
void recupera();
void introducir();
void borrar();
void contenido();
void busca();
void visualizadag(void);
void visualizaag(void);
LET * introduceag(void);
void hora(void);
void creditos(void);
void dibujaeleccion();
void dibujasubmenu1();
void recuadro(int x,int y,int x1,int y1,int o);
void marco(int x,int y,int x1,int y1);
void menu(void);

//FUNCION PRINCIPAL
void main()
{
int a=0;
recupera();
clrscr();
textbackground(0);
_setcursortype(_NOCURSOR);
menu();
while(opcion!=4||a!=7181)
	{
	dibujaeleccion();
	while(!kbhit())
	 {
	 hora();
	 }
	a=bioskey(0);
	if(a==7181&&opcion!=4) dibujasubmenu1();
	if(a==19712) opcion++;
	if(a==19200) opcion--;
	if(opcion==0) opcion=4;
	if(opcion==5) opcion=1;
	}
graba();
_setcursortype(_NORMALCURSOR);
textbackground(0);
clrscr();
}

//DIBUJA EL INTERFAZ GENERAL
void menu()
{
clrscr();
textattr(LIGHTGRAY);
recuadro(2,2,79,24,1);
recuadro(2,1,79,1,0);
recuadro(2,25,79,25,0);
}

//DIBUJA ELECCION
void dibujaeleccion()
{
textattr(LIGHTGRAY);
textattr(127);
gotoxy(3,1);
cprintf("     DIARIO          TELEFONOS          INFORMACION          FINALIZAR");
gotoxy(3,25);
cprintf("Copyrights() o derechos de copia()");
textattr(LIGHTGRAY);
switch(opcion)
	{
	case 1:gotoxy(8,1);cprintf("DIARIO");break;
	case 2:gotoxy(24,1);cprintf("TELEFONOS");break;
	case 3:gotoxy(43,1);cprintf("INFORMACION");break;
	case 4:gotoxy(64,1);cprintf("FINALIZAR");break;
	}
}
//DIBUJA SUBMENUS
void dibujasubmenu1()
{
//subopcion son CURSOS,subopcion1 son CLASES DE CURSOS
//subopcion son eleccion de submenus
int a=0,subopcion1=1,subopcion2=1,subopcion3=1;
while(a!=7181&&a!=283)
{
switch(opcion)
	{
	case 1: //DIARIO
		recuadro(5,2,20,6,2);
		marco(5,2,20,6);
		while(a!=7181&&a!=283&&a!=19712&&a!=19200)
		{
		textattr(127);
		gotoxy(7,3);cprintf(" INTRODUCIR ");
		gotoxy(7,4);cprintf("VER DIA  AG.");
		gotoxy(7,5);cprintf("VER TODA AG.");
		textattr(LIGHTGRAY);
		switch(subopcion1)
			{
			case 1:	gotoxy(7,3);cprintf(" INTRODUCIR ");break;
			case 2: gotoxy(7,4);cprintf("VER DIA  AG.");break;
			case 3: gotoxy(7,5);cprintf("VER TODA AG.");break;
			}
		while(!kbhit())
		 {
		 hora();
		 }
		a=bioskey(0);
		if(a==20480) subopcion1++;
		if(a==18432) subopcion1--;
		if(subopcion1==0) subopcion1=3;
		if(subopcion1==4) subopcion1=1;
		}
		if(a!=283&&a!=19712&&a!=19200) diario(subopcion1);
		textattr(LIGHTGRAY);recuadro(5,2,21,7,1);
		break;
	case 2: //TELEFONO
		recuadro(24,2,37,7,2);
		marco(24,2,37,7);
		while(a!=7181&&a!=283&&a!=19712&&a!=19200)
		{
		textattr(127);
		gotoxy(26,3);cprintf("INTRODUCIR");
		gotoxy(26,4);cprintf("VER LISTA");
		gotoxy(26,5);cprintf("BORRAR");
		gotoxy(26,6);cprintf("BUSCAR");
		textattr(LIGHTGRAY);
		switch(subopcion2)
			{
			case 1:	gotoxy(26,3);cprintf("INTRODUCIR");break;
			case 2:	gotoxy(26,4);cprintf("VER LISTA");break;
			case 3:	gotoxy(26,5);cprintf("BORRAR");break;
			case 4:	gotoxy(26,6);cprintf("BUSCAR");break;
			}
		while(!kbhit())
		 {
		 hora();
		 }
		a=bioskey(0);
		if(a==20480) subopcion2++;
		if(a==18432) subopcion2--;
		if(subopcion2==0) subopcion2=4;
		if(subopcion2==5) subopcion2=1;
		}
		if(a!=283&&a!=19712&&a!=19200)
		 {
		 telefonos(subopcion2);
		 }
		textattr(LIGHTGRAY);recuadro(24,2,38,8,1);
		break;
	case 3: //INFORMACION
		recuadro(42,2,55,5,2);
		marco(42,2,55,5);
		while(a!=7181&&a!=283&&a!=19712&&a!=19200)
		{
		textattr(127);
		gotoxy(46,3);cprintf("AYUDAS");
		gotoxy(45,4);cprintf("CREDITOS");
		textattr(LIGHTGRAY);
		switch(subopcion3)
			{
			case 1:	gotoxy(46,3);cprintf("AYUDAS");break;
			case 2:	gotoxy(45,4);cprintf("CREDITOS");break;
			}
		while(!kbhit())
		 {
		 hora();
		 }
		a=bioskey(0);
		if(a==20480) subopcion3++;
		if(a==18432) subopcion3--;
		if(subopcion3==0) subopcion3=2;
		if(subopcion3==3) subopcion3=1;
		}
		if(subopcion3==1&&a!=283) hora();
		else if(a!=283&&a!=19712&&a!=19200) creditos();
		textattr(LIGHTGRAY);recuadro(42,2,56,6,1);
		break;
	case 4: //FINALIZAR
		while(!kbhit())
		 {
		 hora();
		 }
		a=bioskey(0);
		break;
	}
if(a==19712) {a=0;opcion++;}
if(a==19200) {a=0;opcion--;}
if(opcion==0) opcion=4;
if(opcion==5) opcion=1;
dibujaeleccion();
}
}


//FUNCION PARA CREAR UN RECUADRO EN LAS COORDENADAS INDICADAS
void recuadro(int x,int y,int x1,int y1,int o)
{
int a,b;
textattr(LIGHTGRAY);
for(a=x;a!=x1+1;a++)
	for(b=y;b!=y1+1;b++)
	{
	gotoxy(a,b);
	if(o==0||o==2) cprintf("Û");
	else cprintf("²");
	}
if(o==2)
	{
	textattr(0);
	for(a=y+1;a<y1+2;a++)
		{
		gotoxy(x1+1,a);
		cprintf("Û");
		}
	for(a=x+1;a<x1+1;a++)
		{
		gotoxy(a,y1+1);
		cprintf("Û");
		}
	}
}

//FUNCION PARA ENMARCAR UN RECUADRO
void marco(int x,int y,int x1,int y1)
{
int a,b;
textattr(127);
gotoxy(x,y);
cprintf("É");
gotoxy(x,y1);
cprintf("È");
gotoxy(x1,y);
cprintf("»");
gotoxy(x1,y1);
cprintf("¼");

for(a=x+1;a!=x1;a++)
{
   gotoxy(a,y);
   cprintf("Í");
   gotoxy(a,y1);
   cprintf("Í");

}

for(b=y+1;b!=y1;b++)
{
   gotoxy(x,b);
   cprintf("º");
   gotoxy(x1,b);
   cprintf("º");

}
}

/////////////////////////////////INFORMACION////////////////////////////////
//HORA
void hora()
{
struct  time t;
_setcursortype(_NOCURSOR);
gettime(&t);
gotoxy(72,25);
textattr(47);
cprintf("%2d:%02d:%02d",t.ti_hour, t.ti_min, t.ti_sec);
textattr(127);
}

//CREDITOS
void creditos()
{
recuadro(23,10,60,14,0);
marco(23,10,60,14);
gotoxy(25,11);
cprintf("PROGRAMADOR:OSCAR GANDUL ALONSO");
gotoxy(25,12);
cprintf("RECUERDOS A:JD,DANIEL SANDE,NICO..");
gotoxy(25,13);
cprintf("EL PROGRAMA ES ABURRIDO,PERO PIJO");
while(!kbhit())
{
hora();
}
//fflush(stdin);
textattr(LIGHTGRAY);
recuadro(23,10,60,14,1);
}

/////////////////////////////////TELEFONOS//////////////////////////////////
//FUNCION PRINCIPAL
void telefonos(int subopcion)
{
switch(subopcion)
	{
	case 1:introducir();break;
	case 2:contenido();break;
	case 3:borrar();break;
	case 4:busca();break;
	}
}
//METE DATOS
void introducir()
{
INFO *lista;
lista=plista;
recuadro(25,10,52,14,2);
marco(25,10,52,14);
while(lista->sig!=NULL)
 {
 lista=lista->sig;
 }
lista->sig=(INFO *)malloc(sizeof(INFO));
gotoxy(27,11);
cprintf("Nombre:");
captura(10,0,lista->nombre,34,11);
gotoxy(27,12);
cprintf("Apodo:");
captura(11,0,lista->apodo,33,12);
gotoxy(27,13);
cprintf("Numero:");
captura(10,0,lista->numero,34,13);
lista=lista->sig;
lista->sig=NULL;
textattr(LIGHTGRAY);
recuadro(25,10,53,15,1);
}
//BORRA DE LA LISTA
void borrar()
{
int encontrado=0;
char nombre[20],apodo[20];
INFO *p,*pant;
recuadro(25,10,55,14,2);
marco(25,10,55,14);
gotoxy(27,11);
cprintf("Introduce nombre:");
captura(10,0,nombre,44,11);
gotoxy(27,12);
cprintf("Introduce apodo:");
captura(10,0,apodo,43,12);
p=plista;
pant=0;
while(strcmp(nombre,p->nombre)!=0&&strcmp(apodo,p->apodo)!=0&&(p!=NULL))
	{
	pant=p;
	p=p->sig;
	encontrado=0;
	}
if(strcmp(nombre,p->nombre)==0&&strcmp(apodo,p->apodo)==0)
	{
	if(pant==0) {plista=p->sig;free(p);}
	pant->sig=p->sig;
	free(p);
	encontrado=1;
	}
if(encontrado==0) {gotoxy(27,13);cprintf("no se encontro");}
else {gotoxy(27,13);cprintf("nombre borrado");}
while(!kbhit())
{
hora();
}
fflush(stdin);
textattr(7);
recuadro(25,10,56,15,1);
}
//MUESTRA EL CONTENIDO
void contenido()
{
int a,c=0;
INFO *lista;
recuadro(2,2,79,24,0);
marco(2,2,79,24);
lista=plista;
while(lista->sig!=NULL)
 {
 c++;
 gotoxy(5,c+2);
 cprintf("Nombre:%15s   Apodo:%15s   Numero:%15s",lista->nombre,lista->apodo,
							  lista->numero);
 if(c==20)
   {
   c=0;gotoxy(37,24);printf("[PULSE TECLA]");
   while(!kbhit())
	{
	hora();
	}
     while( kbhit() ) getch();
 // fflush(stdin);
   textattr(LIGHTGRAY);
   recuadro(3,3,78,23,0);textattr(127);}
 lista=lista->sig;
 }
while(!kbhit())
{
hora();
}
fflush(stdin);
textattr(LIGHTGRAY);
recuadro(2,2,79,24,1);
}
//BUSCA EL NOMBRE DE UNA PERSONA
void busca()
{
char cadena[20];
int a,b=0,c=0;
INFO *lista;
lista=plista;
recuadro(2,2,79,24,0);
marco(2,2,79,24);
gotoxy(4,3);
cprintf("Nombre a buscar:");
captura(10,0,cadena,20,3);
while(lista->sig!=NULL)
{
if(c==20)
	{c=0;gotoxy(37,24);cprintf("[PULSE UNA TECLA]");
	while(!kbhit())
	{
	hora();
	}
	fflush(stdin);recuadro(2,2,79,24,0);}
if(strcmp(cadena,lista->nombre)==0)
	{
	gotoxy(4,c+5);
	cprintf("\nApodo:%15s  Numero:%15s",lista->apodo,lista->numero);
	b=1;
	c++;
	}
lista=lista->sig;
}
if(b==0) {gotoxy(4,4);cprintf("Nombre no encontrado");}
while(!kbhit())
{
hora();
}
fflush(stdin);
textattr(7);
recuadro(2,2,79,24,1);
}
//RECUPERA
void recupera()
{
FILE *fp;
INFO *lista;
fp=fopen("tel.dat","rb");
fread(&datos,sizeof(datos),1,fp);
lista=(INFO *)malloc(sizeof(INFO));
plista=lista;
strcpy(lista->nombre,datos.nombre);
strcpy(lista->apodo,datos.apodo);
strcpy(lista->numero,datos.numero);
while(!feof(fp))
 {
 fread(&datos,sizeof(datos),1,fp);
 lista->sig=(INFO *)malloc(sizeof(INFO));
 lista=lista->sig;
 strcpy(lista->nombre,datos.nombre);
 strcpy(lista->apodo,datos.apodo);
 strcpy(lista->numero,datos.numero);
 }
lista->sig=NULL;
fclose(fp);
}
/////////////////////////////////DIARIO//////////////////////////////////////
void diario(int subopcion)
{
switch(subopcion)
	{
	case 1:introduceag();break;
	case 2:visualizadag();break;
        case 3:visualizaag();break;
	}
}
//INTRODUCE AGENDA
LET * introduceag(void)
{
long int indice;
struct date d;
int x=3,y=3;
char a;
FILE *fp,*fp1;
LET *letra,*letrant,*pletra;
recuadro(2,2,79,24,0);
marco(2,2,79,24);
letra=(LET *)malloc(sizeof(LET));
pletra=letra;
letra->ant=NULL;
while(a!='\x1B')
	{
	x++;
	if(x==79) {x=3;y=y+1;}
	if(x==3&&y>3&&letra->letra=='\b') {x=79;y=y-1;}
	if(y==20)
	 {
	 gotoxy(37,24);cprintf("[PULSE UNA TECLA]");
	 while(!kbhit())
	{
	hora();
	}
	 fflush(stdin);
	 textattr(7);recuadro(3,3,78,23,0);textattr(127);x=3;y=3;
	 }
	while(!kbhit())
	{
	hora();
	}
	a=getch();
	gotoxy(x,y);
	cprintf("%c",a);
	letra->letra=a;
	letrant=letra;
	letra->sig=(LET *)malloc(sizeof(LET));
	if(letra->letra=='\b'&&y>2&&x>3)
		{
		gotoxy(x-1,y);cprintf(" ");x=x-2;
		letra->sig=NULL;
		letra=letra->ant;
		}
	else if(letra->letra=='\b'&&y>2&&x==3) {x=2;}
	else {
		letra=letra->sig;
		letra->ant=letrant;
	     }
	}
letra->sig=NULL;
textattr(7);
recuadro(2,2,79,24,1);
fp=fopen("agenda.dat","a+b");
fp1=fopen("indiceag.dat","a+b");
letra=pletra;
getdate(&d);
indice=ftell(fp);
fwrite(&d,sizeof(d),1,fp1);
fwrite(&indice,sizeof(long int),1,fp1);
fwrite(&d,sizeof(d),1,fp);
while(letra->sig!=NULL)
	{
	simbolo.letra=letra->letra;
	fwrite(&simbolo.letra,sizeof(simbolo),1,fp);
	letra=letra->sig;
	}
fclose(fp);
fclose(fp1);
return pletra;
}
//VISUALIZA AGENDA DE UN DIA EN CONCRETO
void visualizadag(void)
{
char pegote[10];
struct date d;
long int indice;
int dia,mes,ano;
long int longitud;
int x=3,y=4,encontrado=0;
FILE *fp,*fp1;
LET *letra,*pletra,*letrant;
recuadro(2,2,79,24,0);
marco(2,2,79,24);
gotoxy(4,3);
cprintf("Dia:");
captura(2,1,pegote,8,3);
dia=matriz1;
gotoxy(14,3);
cprintf("Mes:");
captura(2,1,pegote,18,3);
mes=matriz1;
gotoxy(24,3);
cprintf("A¤o:");
captura(4,1,pegote,28,3);
ano=matriz1;
letra=(LET *)malloc(sizeof(LET));
fp=fopen("agenda.dat","rb");
fp1=fopen("indiceag.dat","rb");
while(!feof(fp1)&&encontrado==0)
	{
	fread(&d,sizeof(d),1,fp1);
	fread(&indice,sizeof(long int),1,fp1);
	if(dia==d.da_day&&mes==d.da_mon&&ano==d.da_year)
		{
		longitud=indice;
		encontrado=1;
		}
	}
if(longitud!=-1)
{
fseek(fp,longitud+4,SEEK_SET);
pletra=letra;
fread(&simbolo.letra,sizeof(simbolo),1,fp);
letra->letra=simbolo.letra;
letra->ant=NULL;
fread(&simbolo.letra,sizeof(simbolo),1,fp);
while(simbolo.letra!='\x1B')
	{
	letrant=letra;
	letra->sig=(LET *)malloc(sizeof(LET));
	letra=letra->sig;
	letra->letra=simbolo.letra;
	letra->ant=letrant;
	fread(&simbolo.letra,sizeof(simbolo),1,fp);
	}
letra->sig=NULL;
letra=pletra;
while(letra->sig!=NULL)
	{
	x++;
	if(x==79) {x=3;y=y+1;}
	if(y==20)
	{gotoxy(37,24);cprintf("[PULSE UNA TECLA]");
	while(!kbhit())
	{
	hora();
	}
	fflush(stdin);
	textattr(7);recuadro(3,3,78,23,0);textattr(127);x=3;y=3;}
	gotoxy(x,y);
	cprintf("%c",letra->letra);
	letra=letra->sig;
	}
x++;
if(x==79) {x=3;y=y+1;}
gotoxy(x,y);
cprintf("%c",letra->letra);
}
while(!kbhit())
{
hora();
}
fflush(stdin);
textattr(7);
recuadro(2,2,79,24,1);
fclose(fp);
fclose(fp1);
}
//VISUALIZA AGENDA DESDE EL PRINCIPIO [intento]
void visualizaag(void)
{
char pegote[10];
struct date d;
long int indice;
int dia,mes,ano;
long int longitud=0;
int x=3,y=4;
FILE *fp,*fp1;
LET *letra,*pletra,*letrant;
recuadro(2,2,79,24,0);
marco(2,2,79,24);
letra=(LET *)malloc(sizeof(LET));
fp=fopen("agenda.dat","rb");
fp1=fopen("indiceag.dat","rb");
//crea lista
while(!feof(fp1)) //if(longitud!=-1)
{
fread(&d,sizeof(d),1,fp1);
fread(&indice,sizeof(long int),1,fp1);
fseek(fp, indice/*longitud*/+4,SEEK_SET);
pletra=letra;
fread(&simbolo.letra,sizeof(simbolo),1,fp);
letra->letra=simbolo.letra;
letra->ant=NULL;
fread(&simbolo.letra,sizeof(simbolo),1,fp);
while(simbolo.letra!='\x1B')
	{
	letrant=letra;
	letra->sig=(LET *)malloc(sizeof(LET)) );
//       if ( letra->sig == NULL ) NO MEMORIA


	letra=letra->sig;
	letra->letra=simbolo.letra;
	letra->ant=letrant;
	fread(&simbolo.letra,sizeof(simbolo),1,fp);
	}
letra->sig=NULL;
letra=pletra;
gotoxy(3,3);
cprintf("dia:%i mes:%i a¤o:%i",d.da_day,d.da_mon,d.da_year);
//imprime contenido
while(letra->sig!=NULL)
	{
	x++;
	if(x==79) {x=3;y=y+1;}
	if(y==20)
	{gotoxy(37,24);cprintf("[PULSE UNA TECLA]");
	while(!kbhit())
	{
	hora();
	}
	fflush(stdin);
	textattr(7);recuadro(3,3,78,23,0);textattr(127);x=3;y=3;}
	gotoxy(x,y);
	cprintf("%c",letra->letra);
	letra=letra->sig;
	}
x++;
if(x==79) {x=3;y=y+1;}
gotoxy(x,y);
cprintf("%c",letra->letra);
x=3;
y=3;
getch();
recuadro(3,3,78,23,0);
textattr(7);
}
while(!kbhit())
{
hora();
}
fflush(stdin);
textattr(7);
recuadro(2,2,79,24,1);
fclose(fp);
fclose(fp1);
}
///////////////////////////////////CAPTURA///////////////////////////////////
void captura(int tam,int elec,char nombre[73],int x,int y)
{
 int i=0,c=0,c1=0;
 matriz1=0;
 if(elec==0)
 { do
	{
	 while(!kbhit())
	  {
	   hora();
	  }
	 matriz2[i]=getch();
	 matriz2[i]=toupper(matriz2[i]);
	 if(matriz2[i]=='\b')
	  {
	  c--;
	  if(c==-1) c=0;
	  i--;
	  if(i==-1) i=0;
	  gotoxy(x+i,y);
	  cprintf(" ");
	  }
	 else
	  {
	  if ((isalpha(matriz2[i])!=0||matriz2[i]==' '||matriz2[i]=='¤'||matriz2[i]=='¥')&&(c!=tam))
	   {
	   gotoxy(x+i,y);
	   cprintf("%c",matriz2[i]);
	   i++;
	   c++;
	   }
	}
	}while(matriz2[i]!='\r');
	matriz2[i]='\0';
	strcpy(nombre,matriz2);
	}
else { do
	{
	 while(!kbhit())
	  {
	   hora();
	  }
	 matriz2[i]=getch();
	 matriz2[i]=toupper(matriz2[i]);
	 if(matriz2[i]=='\b')
	  {
	  c--;
	  if(c==-1) c=0;
	  i--;
	  if(i==-1) i=0;
	  gotoxy(x+i,y);
	  cprintf(" ");
	  }
	 else
	  {
	  if (c!=tam&&matriz2[i]!='\r')
	   {
	   gotoxy(x+i,y);
	   cprintf("%c",matriz2[i]);
	   i++;
	   c++;
	   }
	}
	}while(matriz2[i]!='\r');
	matriz2[i]='\0';
	strcpy(nombre,matriz2);
	}
if (elec==1)
  {
  c1=i;
  while(c1!=0)
	{
	c1--;
	matriz1=matriz1+((matriz2[c1])-48)*(pow(10,i-c1-1));
	}
  }

}
////////////////////////////GRABANDO DATOS ANTES DE SALIR/////////////////////
void graba()
{
INFO *lista;
FILE *fp;
fp=fopen("tel.dat","wb");
lista=plista;
while(lista->sig!=NULL)
 {
 strcpy(datos.nombre,lista->nombre);
 strcpy(datos.apodo,lista->apodo);
 strcpy(datos.numero,lista->numero);
 strupr(datos.nombre);
 strupr(datos.apodo);
 fwrite(&datos,sizeof(datos),1,fp);
 lista=lista->sig;
 }
fclose(fp);
}