#include "complex.h"
#include "arh.h"
#include "screen.h"

extern short M_color[];

#define TAB    p_btab[nscr]
#define TDLB   TAB->mac->dlbl
#define TKBL   TAB->mac->kbl
#define TNAR   (p_par_tab+ii)->nomar
#define WINI   (p_win_tab+i)
#define STAB   TAB->tstab
#define APTAB  ((c_ptr+(p_par_tab+ii)->nomcontr)->a_ptr+(p_par_tab+ii)->nompar)

typedef struct
 {word_s      kod;
  m_kod       *buf_zn_i;
  word_s      delx;
  char        teks;
  str_tab     *tstab;
  word_s      hn_fl;
  long        t_time;
  resourceptr res;
  cpr         *mac;
  word_s      par[12][5];
 }btab;

btab *p_btab[4];
char *p_tab_b;

void st_tab(word_s x),di_tab(word_s nscr);


word_s sv_tab(word_s nscr)
{word_s lin=0,i,ii,i1,ii1,zn,nx;
 request_resource(ekran,0L);
 ramka();
 if(!k_str_tab) {eprintf(YELLOW_,"Нет cводной таблицы"); release_resource(ekran); return 0;}

 if((p_btab[nscr]=(btab *)calloc(1,sizeof(btab)))==NULL)
 {eprintf(RED_,"Нет памяти для СТ"); release_resource(ekran); return 0;}
 release_resource(ekran);

 STAB=p_str_tab;
 st_tab(nscr);

 change_timer(period_tm[nscr],into*HZ,1);                                   //@
 while(!endrun) {
#if (DEBUG)
view_text(2,73,8,"SVTAB");
#endif
   if((TAB->kod=read_wpipe(scr_chn[nscr],t_out_v*HZ))==Kadr)continue;
   if(list_func(TAB->kod)){ii=TAB->kod; free(p_btab[nscr]);return(ii);}
   var_obj(TAB->kod,nscr);

   if(k_str_tab>1&&(TAB->kod==PgDn||TAB->kod==PgUp))
    {if(TAB->kod==PgDn)if(++TAB->teks>=k_str_tab)TAB->teks=0;
     if(TAB->kod==PgUp)if(--TAB->teks<0)TAB->teks=k_str_tab-1;
     clear_flag(period_fl[nscr]);
     request_resource(ekran,0L);
     ramka();
     release_resource(ekran);
     STAB=p_str_tab+TAB->teks;
     lin=0;
     st_tab(nscr);
    }
   if(check_flag(period_fl[nscr]))
    {
     clear_flag(period_fl[nscr]);
     request_resource(ekran,0L);
     if(screen!=nscr)set_screen(nscr);

     if(lin==4)
      {lin=0;
       for(i=STAB->nomwin;i<(STAB->nomwin+STAB->kolwin);i++)
        {_setcolor(0);
         _rectangle(_GFILLINTERIOR,WINI->nx+45,WINI->ny+12,WINI->nx+STAB->gorwin-1,WINI->ny+STAB->verwin-1);
         _setcolor(8);
         for(ii=1;ii<5;ii++)li(WINI->nx+45,WINI->ny+12+(word_s)(STAB->dset*ii),WINI->nx+STAB->gorwin-1,WINI->ny+12+(word_s)(STAB->dset*ii));
        }
       di_tab(nscr);
      }
     else
      {nx=STAB->gorwin-5+lin;
       for(i=STAB->nomwin,i1=0;i<(STAB->nomwin+STAB->kolwin);i++,i1++)
        for(ii=WINI->nompar,ii1=0;ii<(WINI->nompar+WINI->kolpar);ii++,ii1++)
         {if(!APTAB->novalid)
           {zn=APTAB->var_cod;
            if(zn<0)zn=0;if(zn>ADC_SC)zn=ADC_SC;
            if(APTAB->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC));
            zn=(word_s)((float)zn*STAB->koef);
            if(TAB->par[i1][ii1]!=-1)
             {_setcolor(M_color[(p_par_tab+ii)->nomer]);
              li(WINI->nx+nx,WINI->ny+STAB->verwin-1-TAB->par[i1][ii1],WINI->nx+nx+1,WINI->ny+STAB->verwin-1-zn);
             }
            TAB->par[i1][ii1]=zn;
           }
          else TAB->par[i1][ii1]=-1;
         }
       lin++;
      }
     if(screen!=nscr)set_screen(screen);
     release_resource(ekran);
    }
  }
return 0;
}


void st_tab(word_s nscr)
{word_s i,j;
 TAB->delx=STAB->gorwin-45;
 request_resource(ekran,0L);
#if (FONT==2)
 setfont(1);
#endif
 for(i=STAB->nomwin;i<(STAB->nomwin+STAB->kolwin);i++)
  {_setcolor(15);
   _rectangle(_GBORDER,WINI->nx,WINI->ny,WINI->nx+STAB->gorwin,WINI->ny+STAB->verwin);
   _setcolor(7);
   li(WINI->nx+1,WINI->ny+11,WINI->nx+STAB->gorwin-1,WINI->ny+11);
   li(WINI->nx+44,WINI->ny+12,WINI->nx+44,WINI->ny+STAB->verwin-1);
   _setcolor(8);
   for(j=1;j<5;j++)li(WINI->nx+45,WINI->ny+12+(word_s)(STAB->dset*j),WINI->nx+STAB->gorwin-1,WINI->ny+12+(word_s)(STAB->dset*j));
   fgtext(15,WINI->nx+2,WINI->ny+2,"%s",WINI->naimwin);
   for(j=WINI->nompar;j<(WINI->nompar+WINI->kolpar);j++)
    fgtext(M_color[(p_par_tab+j)->nomer],WINI->nx+2,WINI->ny+14+(p_par_tab+j)->nomer*15,"%s",(p_par_tab+j)->naim);
  }
#if (FONT==2)
 setfont(0);
#endif
 release_resource(ekran);
 di_tab(nscr);
}

void di_tab(word_s nscr)
{word_s i,j,jj,jjj,jjjj,zn,ii,i1,ii1;
 long kk,kp,rf,gtbl,rf1,rb,rp,gkzap;
 TAB->mac=&mg;TAB->res=r_mgn;
 time(&TAB->t_time);

 if((gtbl=TAB->mac->tbl-TAB->delx+5)<0)gtbl+=TKBL;
 request_resource(TAB->res,0L);

 TAB->hn_fl=sopen(NameFile[34],O_RDONLY|O_BINARY,SH_DENYNO);
 release_resource(TAB->res);

 gkzap=(50000)/TDLB;
 rb=gkzap*TDLB;rf1=rf=TAB->delx-5;rf=rf1*TDLB;
 kp=rf1%gkzap;kk=rf/rb+1;rp=rf%rb;

 if((p_tab_b=(char *)calloc(1,rb))==NULL) {eprintf(RED_,"Нет памяти для св табл");return;}

 for(jj=0,j=0,jjjj=0;jj<kk;jj++)
  {if(jj==kk-1){rb=rp;gkzap=kp;}
   if((gtbl+gkzap-1)<TKBL) r_read(TAB->hn_fl,p_tab_b,(unsigned)rb,gtbl*TDLB,SEEK_SET,TAB->res);
   else
   {r_read(TAB->hn_fl,p_tab_b,(unsigned)((TKBL-gtbl)*TDLB),gtbl*TDLB,SEEK_SET,TAB->res);
    r_read(TAB->hn_fl,p_tab_b+(TKBL-gtbl)*TDLB,(unsigned)(rb-(TKBL-gtbl)*TDLB),(long)0,SEEK_SET,TAB->res);
   }
   for(jjj=0;jjj<gkzap;jjj++,gtbl++,j++)
    {if(gtbl==TKBL)gtbl=0;
      {if((TAB->t_time-*(long *)(p_tab_b+TDLB*jjj))<86400)
        {TAB->buf_zn_i=(m_kod *)((p_tab_b+TDLB*jjj)+sizeof(long));
         request_resource(ekran,0L);
         for(i=STAB->nomwin,i1=0;i<(STAB->nomwin+STAB->kolwin);i++,i1++)
          for(ii=WINI->nompar,ii1=0;ii<(WINI->nompar+WINI->kolpar);ii++,ii1++)
           {if((TAB->buf_zn_i+TNAR)->count==0)
             {zn=(TAB->buf_zn_i+TNAR)->zn;
              if(zn<0)zn=0;if(zn>ADC_SC)zn=ADC_SC;
              if(APTAB->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC));
              zn=(word_s)((float)zn*STAB->koef);
              if(jjjj)
               if(TAB->par[i1][ii1]!=-1)
                {_setcolor(M_color[(p_par_tab+ii)->nomer]);
        li(WINI->nx+44+jjjj,
           WINI->ny+STAB->verwin-1-TAB->par[i1][ii1],
           WINI->nx+45+jjjj,
           WINI->ny+STAB->verwin-1-zn);
                }
              TAB->par[i1][ii1]=zn;
             }
            else TAB->par[i1][ii1]=-1;
           }
         release_resource(ekran);
        }
       else
        for(i=STAB->nomwin,i1=0;i<(STAB->nomwin+STAB->kolwin);i++,i1++)
         for(ii=WINI->nompar,ii1=0;ii<(WINI->nompar+WINI->kolpar);ii++,ii1++)
          TAB->par[i1][ii1]=-1;
       jjjj++;
      }
    }
  }
 free(p_tab_b);close(TAB->hn_fl);
}