#include "H\General.H"
#include "H\Calc.H"
#include "H\Teclado.H"
#include "H\Disco.H"
#include "H\Inst.H"

typedef struct DInst {
	UInt8 		*col;	// Colores
	MOVIN       mov;    // Informacion de una institucion
    Int8        tpa;    // 1=Solo_editar  2=Seleccionar
   	UInt16      frm;	// De donde proviene y tipo de acceso
	Int16       nsel;	// numero de institucion seleccionada
	Char        tcc;
	Boolean     edt;	// Hay edición ?
	Boolean     cmb;    // Hay cambio
	ID          *rid;	// Regreso del id seleccionado
	Boolean     ayu;	// Ayuda abierta ?
	OCalc		oc;		// Para paso de calculadora y teclado
} INST;
INST 		*inst;
MemHandle 	min;

Int16 	TotIN		()	    										ES6;
Int16 	ItID_IN		(ID*)											ES6;
Boolean CGB_IN		(Int16,Int8)	            					ES6;
void 	FormaEditarIN (Boolean)										ES6;
void 	PntListaIN	(Int16,RectangleType*,char**,ListType*)			ES6;
void 	FormaListaIN (Boolean)										ES6;
void    PSEditarIN (Boolean)                                        ES6;


// **********************************************************************
//
// Disco
//
// **********************************************************************
// Inicio de los registros
void  IniciaRegIN () {
IN  *   ApI;
MOVIN * ApM;
UInt16  NReg;

        ApI = SacarApRM();
        ApI->TipoReg=4;
        InsReg((INF*)ApI);
        
        SacarNReg (4,0,&NReg);
        ApM = SacarApMM();
        StrCopy(ApM->Nom,"Mi banco");
        StrCopy(ApM->Con," ");
        StrCopy(ApM->Int," ");
        StrCopy(ApM->Cve," ");
        StrCopy(ApM->Dto," ");
        InsMov((MOV*)ApM,NReg);		
        StrCopy(ApM->Nom,"Otra");
        InsMov((MOV*)ApM,NReg);		
        
        return;
}

// Total de instituciones

Int16 TotIN() {
UInt16     NReg;
  	if(!SacarNReg (4,0,&NReg)) return 0;		
  	return SacarTotMov(NReg);
} 

// Leer(0), Guardar(1) o borrar(2) una institucion

Boolean CGB_IN(Int16 it, Int8 op) {
UInt16    NReg;
Boolean   IB;
    if(!SacarNReg (4,0,&NReg)) return false;
	switch(op) {
	case 0: // Cargar
            if(!LeerMov((void*)&inst->mov,NReg,it,&IB)) return false;
			return true;
	case 1: // Guardar (it==-1 -> nuevo)
	        if(it==-1) {
               if(!InsMov((void*)&inst->mov,NReg)) return false;
	           break;
	        } else {
               if(!ModMov((void*)&inst->mov,NReg,it)) return false;
	           break;
	        }
			return true;
	case 2: // Borrar
	        if(!BorMov(NReg,it,true)) return false;
			return true;
	}
	return false;
}

// Sacar *it* (Usado en CGB_IN) con ID

Int16    ItID_IN (ID * ApID) {
UInt16     NReg;
Int16      NMov;
    if(!SacarNRegNMov (ApID,&NReg,&NMov,false)) return 0;
    return NMov;
}


//
// **********************************************************************
//
// Inicio y termino
//
// **********************************************************************

Char IniciaInst(Char op, UInt16 f, ID *id, Boolean HSel,UInt8 *c) { 
	min=MemHandleNew(sizeof(INST));
	inst=(INST *)MemHandleLock(min);
	inst->col=c;	inst->frm=f;	inst->tpa=op; inst->rid=id;  
	inst->edt=false;	inst->cmb=false; inst->ayu=false;

	if (op==1 || !HSel) inst->nsel=noListSelection;
	else  inst->nsel=ItID_IN(id);
	if (op==1) FrmPopupForm(FInst);
	else       FrmPopupForm(FInstM);
	return 4; 
}

Boolean FinalizaIN() {
Boolean cmb;
	if (inst->ayu) FinAyuda();
	cmb=inst->cmb;
	MemHandleUnlock(min); MemHandleFree(min); inst=NULL;
	return cmb;
}
// **********************************************************************
//
// Instituciones
//
// **********************************************************************

// inicio forma para nueva institucion o editar una 

void FormaEditarIN(Boolean inicio) {
FormType 	*f;
Char  s[50];
    f=FrmGetActiveForm();
    if(inicio) {
  	  FrmDrawForm(f);
	  if (!inst->edt) { 
		StrCopy(inst->mov.Nom," ");	
    	StrCopy(inst->mov.Con," ");	
        StrCopy(inst->mov.Int," ");
        StrCopy(inst->mov.Cve," ");
    	StrCopy(inst->mov.Dto," ");	    	
		FrmHideObject(f,FrmGetObjectIndex(f,BBor));
		SacaTexto(s,2400,2,50); 
		FrmCopyTitle(f,s);
	  } else {
		CGB_IN(inst->nsel,0);
		FrmShowObject(f,FrmGetObjectIndex(f,BBor));
		SacaTexto(s,2400,1,50); 
		FrmCopyTitle(f,s);
      }
    }
    PSEditarIN(true);
}

//    Poner y sacar datos de editar una institucion

void  PSEditarIN (Boolean poner) {
FormType 	*f;		
      f=FrmGetActiveForm();
	  Texto(inst->mov.Nom,GetObjPtr(f,100),poner);
  	  Texto(inst->mov.Con,GetObjPtr(f,101),poner);
      Texto(inst->mov.Int,GetObjPtr(f,102),poner);
	  Texto(inst->mov.Cve,GetObjPtr(f,103),poner);
      Texto(inst->mov.Dto,GetObjPtr(f,104),poner);
}


//  Eventos de editar

Boolean EdtInst(EventType* pEvent) {
FormType 	*f;	

    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			  case 70: break;
  			  case 90: inst->ayu=false; break;	
			  default: return false;
			}
    	    FormaEditarIN(false);
			return true;
		case frmOpenEvent:
			FormaEditarIN(true);
			PonBotonCT(&(inst->oc),2,100,NULL,NULL,FrmGetActiveForm(),0,2400,0);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		    case BCal: PSEditarIN(false);
		               OpBotonCT(&(inst->oc)); 
		               return true;
		   	case BAce: PSEditarIN(false);
		   	           if(!HayInf(inst->mov.Nom,sizeof(inst->mov.Nom))){
		   	           	 if(FrmAlert(105)==0) {
		   	           	 	FrmReturnToForm(0);
		   	           	    return true;
		   	           	 }
		   	           }	
                       if(inst->edt)CGB_IN(inst->nsel,1);
                       else {inst->nsel=TotIN();CGB_IN(-1,1);}
	   				   FrmUpdateForm(FInst,99);FrmReturnToForm(0); 
		   	           return true;
		   	case BBor: if (FrmAlert(104)==1) {
		   	              CGB_IN(inst->nsel,2);
		   	              inst->nsel=noListSelection;
		   	              FrmUpdateForm(FInst,99); 
		   	              FrmReturnToForm(0);
		   	           }
		   	           return true;
			case BCan: FrmUpdateForm(FInst,99); 
			           FrmReturnToForm(0); 
			           return true;
		   	case BAyu: PSEditarIN(false);
		   	           inst->ayu=Ayuda(2404,1,inst->col,FEdtInst); 
		   	           return true;
		    }
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  100: PonBotonCT(&(inst->oc),2,100,NULL,inst->mov.Nom,FrmGetActiveForm(),sizeof(inst->mov.Nom),2400,3); return false;
   		    case  101: PonBotonCT(&(inst->oc),2,101,NULL,inst->mov.Con,FrmGetActiveForm(),sizeof(inst->mov.Con),2400,4); return false;
   		    case  102: PonBotonCT(&(inst->oc),2,102,NULL,inst->mov.Int,FrmGetActiveForm(),sizeof(inst->mov.Int),2400,5); return false;
   		    case  103: PonBotonCT(&(inst->oc),2,103,NULL,inst->mov.Cve,FrmGetActiveForm(),sizeof(inst->mov.Cve),2400,6); return false;
   		    case  104: PonBotonCT(&(inst->oc),2,104,NULL,inst->mov.Dto,FrmGetActiveForm(),sizeof(inst->mov.Dto),2400,7); return false;
           	default  : PonBotonCT(&(inst->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2400,0); return false;
            }
            break;
		default: break;
	}
	return false;
}

//  *******************************************************************

//  Lista instituciones

// Iniciar lista de instituciones

void FormaListaIN(Boolean inicio) {
FormType 	*f;

    f=FrmGetActiveForm();
	if(inicio)FrmDrawForm(f); 
	EliminaMarco(f,100,(ListDrawDataFuncPtr)PntListaIN,TotIN(),inicio,inst->nsel);
}

// Pintar lista instituciones (Se llama por  SO)

void PntListaIN(Int16 it, RectangleType *r,char **u, ListType *p) {
	Int8 a;
	CGB_IN(it,0);
	PonTexto (inst->mov.Nom,r->topLeft.x,r->topLeft.y,N,I,0,false,-1,-1,&a);
	return;
}

// Eventos de instituciones, forma principal

Boolean Inst(EventType* pEvent) {
UInt16 f;
Char   t;
Boolean hs;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
   			  case 90: inst->ayu=false; break;
   			  case 99: break;
			  default: return false;
			}
			FormaListaIN(false);
			return true;
		case frmOpenEvent:
    		FormaListaIN(true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
	    	case BAyu: inst->ayu=Ayuda((inst->tpa==1)?2402:2406,1,inst->col,(inst->tpa==1)?FInst:FInstM); return true;
		   	case BAce: f=inst->frm; t=inst->tpa; hs=(inst->nsel!=noListSelection);
		   			   if (t==2 && hs) {
		   			   	 CGB_IN(inst->nsel,0);
		   				 SacarID(inst->rid);
		   			   }
		   	           FinalizaIN(); 
		   	           if (t==2 && hs ) FrmUpdateForm(f,80);
		   	           else      FrmUpdateForm(f,81);
		   	           FrmReturnToForm(0); return true;
		   	case BNue: inst->edt=false; FrmPopupForm(FEdtInst); return true;
		   	case BEdi: if(inst->nsel==noListSelection) return true;
		   	           inst->edt=true; FrmPopupForm(FEdtInst); return true;
		   	case BCan: FinalizaIN(); 
		   	           FrmUpdateForm(f,81);
		   	           FrmReturnToForm(0); 
		   	           return true;
		    }
		    break;
        case lstSelectEvent:
            inst->nsel = pEvent->data.lstSelect.selection;
      		FormaListaIN(false);
            return true;
		default: break;
	}
	return false;
}
