

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>


void  colorpalette(int numcolor,int  fistcolor,int secondcolor,int thirdcolor)
 {
int k;
 outp(0x3c8,numcolor);
for(k=0;k<100;k++);
 outp(0x3c9,fistcolor/4); /* 0..63  (color/4)*/
for(k=0;k<100;k++);
 outp(0x3c9,secondcolor/4);
 for(k=0;k<100;k++);
outp(0x3c9,thirdcolor/4);
 setcolor(numcolor);
 }


 void palette()
{
colorpalette(3,90,90,90);
colorpalette(5,215,215,215);
colorpalette(1,0,0,150);
}
 void linex(int x,int y,int x1,int y1,int color)
 {
 setcolor(color);
 line(x,y,x1,y1);
 }

void font(char *names,int size)
{
int userfont;
userfont=installuserfont(names);
settextstyle(userfont,HORIZ_DIR,size);
}
 void cur_down(int x,int y,int color)
{
int a=x,b=x+8;

setcolor(color);
/*
line(x+3,y+2,x+3,y+5);
line(x+4,y+2,x+4,y+5);
line(x+5,y+2,x+5,y+5);
line(x+6,y+2,x+6,y+5);
  */
	while(a<=b)
	{
	line(a,y+4,b,y+4);
	y++;a++;b--;
	}
}
/*void cur_right(int x,int y,int color)
{
 int a=y,b=y+9;
 setcolor(color);
 while(a<b)
 {
 line(x,a,x,b);
 x++;a++;b--;
 }
} */
void ten_textxy(int x,int y,char far *textstring ,int firstcolor,int secondcolor)
{

setcolor(secondcolor);
outtextxy(x+4,y+4,textstring);
setcolor(firstcolor);
outtextxy(x,y,textstring);
}
void rect(int x,int y,int x1,int y1,int color)
{
setcolor(color);
line(x,y,x1,y);
line(x,y,x,y1);
line(x,y1,x1,y1);
line(x1,y1,x1,y);
}
void rect_bar(int x,int y,int x1,int y1,int colorrect,int colorbar)
{
rect(x,y,x1,y1,colorrect);
setfillstyle(SOLID_FILL,colorbar);
bar(x+1,y+1,x1-1,y1-1);
}
 void button_rect(int x,int y,int x1,int y1,int lin,int rightcolor,int leftcolor)
{
int c;
 /*white bar*/
int n=y+1;
int i=x+1;
int p=y1-1;
int y2=x1-1;
/*gray bar */
int nn=y1-1;
int ii=x1-1;
int pp=y+1;
int yy=x+1;
/*white up right bar*/
for(c=1;c<=lin;c++)
 {
 setcolor(rightcolor);
line(x+1,n,y2,n);
line(i,y+1,i,p);
i++;
p--;
y2--;
n++;
/*grey down left bar*/
setcolor(leftcolor);
line(x1-1,nn,yy,nn);
line(ii,y1-1,ii,pp);
ii--;
pp++;
yy++;
nn--;
 }
}
  void button (int x,int y,int x1,int y1,int lin,int rectcolor,int knoprightcolor,int knopleftcolor ,int function)
  {
int n;
setcolor(7);
for(n=y+2;n<y1;n++)
   {
line(x+2,n,x1-1,n);
    }
button_rect(x,y,x1,y1,lin,knoprightcolor,knopleftcolor);
/*rect(x,y,x1,y1,rectcolor);*/
if(function==1)cur_down((x+x1)/2-5,(y+y1)/2-6,0);
rectcolor=0;
}
 void vnutr_rect(int x,int y,int x1,int y1, int right,int right1,int left)
{
setcolor(right1);
line(x,y,x1,y);
line(x,y,x,y1);
setcolor(right);
line(x+1,y+1,x1,y+1);
line(x+1,y+1,x+1,y1);

setcolor(left);
line(x1,y1,x+1,y1);
line(x1,y1,x1,y+1);
line(x1-1,y1-1,x+2,y1-1);
line(x1-1,y1-1,x1-1,y+2);

}
  void vnutr(int x,int y,int x1,int y1,int color,int right,int right1,int left)
{
int n;
vnutr_rect(x,y,x1,y1,right,right1,left);
setcolor(color);
setfillstyle(SOLID_FILL,color);
bar(x+2,y+2,x1-2,y1-2);
/*
for(n=y+2;n<=y1-2;n++)
  {
  line(x+2,n,x1-2,n);
  }*/
}
 void ready_button(int x,int y,int x1,int y1,int color)
{

rect(x,y,x1,y1,8);
setfillstyle(SOLID_FILL,color);
bar(x+1,y+1,x1-1,y1-1);
}



 void big_bar3d(int x,int y,int x1 ,int y1,int lin,int rectcolor,int right,int left)
{
/*black bar */
rect(x,y,x1,y1,rectcolor);
button_rect(x,y,x1,y1,lin,right,left);
}
void play_button(int x,int y,int x1,int y1,int lin,int rectcolor,int knoprightcolor,int knopleftcolor ,int function,int color)
{
int n;
int i;
char  c;
button(x,y,x1,y1,lin,rectcolor,knoprightcolor,knopleftcolor,function);
ready_button(x,y,x1,y1,color);
for(i=0;i<=4;i++)for(n=0;n<=30000;n++);
button(x,y,x1,y1,lin,rectcolor,knoprightcolor,knopleftcolor,function);
}
struct name
{
int i;
}a={0};
int i;
struct text_name
{
int x,y,y1;
char name[20];
int sub;
};
struct horiz_menu
 {
	int x,y;
	int color;
	int num_items;
	struct text_name text;
	struct text_name sub_menu[30];
 }al;
struct horiz_pop_menu
{
 struct horiz_menu curs[30];
}struc={ {
{9,25,0,2,{12,25,35," FILE  ",0},{ {13,50,65," CLOSE ALL",0},{13,65,80,"   QUIT  ",0}}},
{70,25,0,3,{55,25,15,"JAM_DOC",0},{ {55,50,65," RCP_DOCS",0},{55,65,80," JAM_DOCS",0},{55,80,95,"DOC_EDITOR",0}}},
{135,25,0,3,{120,25,15,"JAM_FORK",0},{ {120,50,65,"AUDIO_CASSETSE",0},{120,65,80,"VIDEO_CASSETTE",0},{120,80,95," PAYFORFORK",0}}},
{210,25,0,4,{225,25,15,"INFORMATION!",0},{ {210,50,65,"PRISE PAGE",0},{210,65,80,"FORKERS OF JAM",0},{210,80,95,"AUDIO CATALOUGE",0},{210,95,110,"VIDEO CATOLOUGE",0}}},
{315,25,0,1,{325,25,15,"OPTIONS",0},{ {330,50,65,"  FONT",0} }},
{400,25,0,1,{410,25,15,"end",0},{{375,50,65,"end",0}}}
}};

 struct rectbar{
 int x,y,x1,y1;
 };
  struct bigrectbar{
  struct rectbar cursor[10];
 }cr={{ {12,46,94,85},{50,46,145,100},{115,46,231,100},{200,46,335,115},
 {320,46,397,70} }};
/*    struct coordbar
  {
  int x,y,x1,y1;
  };
  struct coord
  {
  struct coordbar cursor[100];
  }crod={{{cr.cursor[0].x,cr.cursor[0].y,cr.cursor[0].x1,cr.cursor[0].y1}}};*/

void ver_all_text(int num_items)
{
	int i;
	 for(i=0;i<=num_items;i++)
	   {
	   setcolor(0);
    outtextxy(struc.curs[i].x,struc.curs[i].y,struc.curs[i].text.name);
	   }
}
 void ver_all_left(int num_items,int n)
 {

			if(n<0)
			{
      setfillstyle(SOLID_FILL,7);
      bar(struc.curs[n+1].x-5,struc.curs[n+1].y,struc.curs[n+2].x-5,43);
      setcolor(0);
      outtextxy(struc.curs[n+1].x,struc.curs[n+1].y,struc.curs[n+1].text.name);
		n=num_items;
      setfillstyle(SOLID_FILL,1);
    vnutr(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,7,0,3,5);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
	     else
			{
      setfillstyle(SOLID_FILL,7);
    bar(struc.curs[n+1].x-5,struc.curs[n+1].y,struc.curs[n+2].x-5,43);
    setcolor(0);
    outtextxy(struc.curs[n+1].x,struc.curs[n+1].y,struc.curs[n+1].text.name);

    setfillstyle(SOLID_FILL,1);
    vnutr(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,7,0,3,5);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
 }
void ver_all_right(int num_items,int n)
{

		if(n>num_items)
			{
		setfillstyle(SOLID_FILL,7);
      bar(struc.curs[n-1].x-5,struc.curs[n-1].y,struc.curs[n].x-5,43);
      setcolor(0);
      outtextxy(struc.curs[n-1].x,struc.curs[n-1].y,struc.curs[n-1].text.name);
		n=0;
      setfillstyle(SOLID_FILL,1);
    vnutr(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,7,0,3,5);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
	     else
			{
      setfillstyle(SOLID_FILL,7);
    bar(struc.curs[n-1].x-5,struc.curs[n-1].y,struc.curs[n].x-5,43);
    setcolor(0);
    outtextxy(struc.curs[n-1].x,struc.curs[n-1].y,struc.curs[n-1].text.name);

    setfillstyle(SOLID_FILL,1);
   vnutr(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,7,0,3,5);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
}

int  ver_menu (int num_items)
{
int c,n=0;
setfillstyle(SOLID_FILL,1);
button(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,1,0,5,3,0);
ver_all_text(num_items);
  for(;;)
  {
    c=getch();

    if(c==13)
    {
    vnutr(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,7,0,3,5);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
    return(n);
    }
    if(c==27) return(-1);

      if(c==0)
	{
	 c=getch();

	     if(c==77)
		{
		n++;
		if(n>num_items)
			{
		setfillstyle(SOLID_FILL,7);
      bar(struc.curs[n-1].x-5,struc.curs[n-1].y,struc.curs[n].x-5,43);
      setcolor(0);
      outtextxy(struc.curs[n-1].x,struc.curs[n-1].y,struc.curs[n-1].text.name);
		n=0;
      setfillstyle(SOLID_FILL,1);
    button(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,1,0,5,3,0);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
	     else
			{
      setfillstyle(SOLID_FILL,7);
    bar(struc.curs[n-1].x-4,struc.curs[n-1].y,struc.curs[n].x-5,43);
    setcolor(0);
    outtextxy(struc.curs[n-1].x,struc.curs[n-1].y,struc.curs[n-1].text.name);

    setfillstyle(SOLID_FILL,1);
   button(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,1,0,5,3,0);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
		}
	  if(c==75)
		{
		n--;
		if(n<0)
			{
      setfillstyle(SOLID_FILL,7);
      bar(struc.curs[n+1].x-4,struc.curs[n+1].y,struc.curs[n+2].x-5,43);
      setcolor(0);
     outtextxy(struc.curs[n+1].x,struc.curs[n+1].y,struc.curs[n+1].text.name);
		n=num_items;
      setfillstyle(SOLID_FILL,1);
    button(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,1,0,5,3,0);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
	     else
			{
      setfillstyle(SOLID_FILL,7);
    bar(struc.curs[n+1].x-4,struc.curs[n+1].y,struc.curs[n+2].x-5,43);
    setcolor(0);
    outtextxy(struc.curs[n+1].x,struc.curs[n+1].y,struc.curs[n+1].text.name);

    setfillstyle(SOLID_FILL,1);
    button(struc.curs[n].x-5,struc.curs[n].y,struc.curs[n+1].x-5,43,1,0,5,3,0);
    setcolor(0);
    outtextxy(struc.curs[n].x,struc.curs[n].y,struc.curs[n].text.name);
			}
		}
	}



    }

}
int y[10]={50,65,80,95,105};

 void bar_all_text(int num_item,int cur)
{
int i;
for(i=0;i<=num_item;i++)
    {
    if(i==0)setcolor(5);
     else setcolor(0);
     outtextxy(struc.curs[cur].sub_menu[i].x,struc.curs[cur].sub_menu[i].y,struc.curs[cur].sub_menu[i].name);
    }
}
void imagesizes(int n)
{
int size;
char alex[100];
	 setfillstyle(SOLID_FILL,5);
	 bar(100,450,270,466);
	 size=imagesize(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1);
	 sprintf(alex,"IMAGESIZE: %d N: %d",size,n+1);
	 setcolor(0);
	 outtextxy(100,450,alex);
}
int  curs_menu(int num_items,int *linenum)
{
int n;
int i=0;
int c;

int bit[2000];
int bitmap[2500];
int itn[2000];
n=ver_menu(4);
if(n==-1)return(-1);
getimage(cr.cursor[num_items].x,cr.cursor[num_items].y,cr.cursor[num_items].x1,cr.cursor[num_items].y1,itn);
getimage(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,bitmap);
getimage(cr.cursor[0].x,cr.cursor[0].y,cr.cursor[0].x1,cr.cursor[0].y1,bit);
button(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,1,0,5,3,0);
setfillstyle(SOLID_FILL,1);
bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
bar_all_text(5,n);
imagesizes(n);
for(;;)
	{

	  c=getch();
	  if(c==13)
	  {
	  *linenum=i;
	  return(n);
	  }
	  if(c==27)return(-1);
	  if(c==0)
	       {
		c=getch();
		  if(c==80)
			{

			 i++;
			 *linenum=i;
			 if(i>struc.curs[n].num_items-1)
			 {
  setfillstyle(SOLID_FILL,7);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i-1].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i-1].y1);
 setcolor(0);
 outtextxy(struc.curs[n].sub_menu[i-1].x,struc.curs[n].sub_menu[i-1].y,struc.curs[n].sub_menu[i-1].name);
     i=0;
 setfillstyle(SOLID_FILL,1);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
 setcolor(5);
 outtextxy(struc.curs[n].sub_menu[i].x,struc.curs[n].sub_menu[i].y,struc.curs[n].sub_menu[i].name);

			 }
    else
				{
 setfillstyle(SOLID_FILL,7);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i-1].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i-1].y1);
 setcolor(0);
 outtextxy(struc.curs[n].sub_menu[i-1].x,struc.curs[n].sub_menu[i-1].y,struc.curs[n].sub_menu[i-1].name);

 setfillstyle(SOLID_FILL,1);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
 setcolor(5);
 outtextxy(struc.curs[n].sub_menu[i].x,struc.curs[n].sub_menu[i].y,struc.curs[n].sub_menu[i].name);
				}

			}

		if(c==72)
		{

			 i--;
			 *linenum=i;
			 if(i<0)
			 {
  setfillstyle(SOLID_FILL,7);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i+1].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i+1].y1);
 setcolor(0);
 outtextxy(struc.curs[n].sub_menu[i+1].x,struc.curs[n].sub_menu[i+1].y,struc.curs[n].sub_menu[i+1].name);
 i=struc.curs[n].num_items-1;
 setfillstyle(SOLID_FILL,1);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
 setcolor(5);
 outtextxy(struc.curs[n].sub_menu[i].x,struc.curs[n].sub_menu[i].y,struc.curs[n].sub_menu[i].name);

			 }
    else
				{
 setfillstyle(SOLID_FILL,7);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i+1].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i+1].y1);
 setcolor(0);
 outtextxy(struc.curs[n].sub_menu[i+1].x,struc.curs[n].sub_menu[i+1].y,struc.curs[n].sub_menu[i+1].name);

 setfillstyle(SOLID_FILL,1);
 bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
 setcolor(5);
 outtextxy(struc.curs[n].sub_menu[i].x,struc.curs[n].sub_menu[i].y,struc.curs[n].sub_menu[i].name);
				}

			}
		    if(c==77)
		    {
		     i=0;

		     n++;
		    imagesizes(n);
		     ver_all_right(num_items,n);
		    if(n>num_items)
		    {
		     putimage(cr.cursor[num_items].x,cr.cursor[num_items].y,itn,0);
		    n=0;
		    imagesizes(n);
		    getimage(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1+1,bitmap);

	button(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,1,0,5,3,0);
	setfillstyle(SOLID_FILL,1);
	bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
	bar_all_text(5,n);
		    }
 else
		    {

		    putimage(cr.cursor[n-1].x,cr.cursor[n-1].y,bitmap,0);
		    getimage(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1+1,bitmap);

		button(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,1,0,5,3,0);
		setfillstyle(SOLID_FILL,1);
		bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
		bar_all_text(5,n);
		    }
		}
		    if(c==75)
		    {
		     i=0;
		     n--;
		     imagesizes(n);
		     ver_all_left(num_items,n);
		    if(n<0)
		    {
		    putimage(cr.cursor[0].x,cr.cursor[0].y,bit,0);
		    n=num_items;
		     imagesizes(n);
		getimage(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1+1,bitmap );
		button(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,1,0,5,3,0);
		setfillstyle(SOLID_FILL,1);
		bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
		bar_all_text(5,n);
		    }

		else
		{
		putimage(cr.cursor[n+1].x,cr.cursor[n+1].y,bitmap,0);
		getimage(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1+1,bitmap);
		button(cr.cursor[n].x,cr.cursor[n].y,cr.cursor[n].x1,cr.cursor[n].y1,1,0,5,3,0);
		setfillstyle(SOLID_FILL,1);
		bar(cr.cursor[n].x+2,struc.curs[n].sub_menu[i].y,cr.cursor[n].x1-3,struc.curs[n].sub_menu[i].y1);
		bar_all_text(5,n);
		}
			 }
		    }

	       }

}

void  menu()
{
      /*rect*/

rect(1,1,638,478,0);
rect(3,3,636,476,0);
	/*blue*/
setfillstyle(SOLID_FILL,1);
bar(5,6,634,24);
ten_textxy(15,8,"VEB_RECORDS COMPANY ",15,3);
	/*white*/
/*	rect(4,24,634,44,0);/*Black*/
setfillstyle(SOLID_FILL,7);
bar(5,25,633,43);
vnutr(10,45,628,468,5,0,3,5);
/*rect(11,50,628,80,8);*/
}
  int   scantextxy(int x,int y)
{
 char str[100];
 int i=0;
 while(i<=20)
 {
  str[i+1]=0;
  str[i]=getch();
  if(str[i]==13)return(1);
  outtextxy(x,y,str);
  i++;
 }
}
void  password(void)
{
int n;
big_bar3d(150,150,400,250,2,0,5,3);
button(325,160,390,178,2,0,5,3,1);
button(325,183,390,201,2,0,5,3,1);
vnutr(160,170,290,188,15,0,3,5);
setcolor(0);
font("litt.chr",5);
outtextxy(157,155,"Present password");
outtextxy(157,188," Name user       ");
n=scantextxy(165,170);
vnutr(160,204,290,222,15,0,3,5);
if(n==1)n=1;
}
int GetMouse(int *x,int *y)
{
int ax;
union REGS r,rout;
r.x.ax=33;
int86(0x33,&r,&rout);
*x=rout.x.cx;
*y=rout.x.dx;
return(rout.x.bx);
}

void mouse_show(void)
{
union REGS r;
r.x.ax=1;
int86(0x33,&r,&r);
}
void text_show(int x,int y)
{
setcolor(0);
button(x,y,100,200,0,0,0,0,0);
}
void pult_menu()
{
int t;
int i;
mouse_show();
t=curs_menu(4,&i);
}
void main(void)
{
int t;
int i;
int gr=VGA,gr1=VGAHI;/*graphs mode*/
initgraph(&gr,&gr1,"c:\\borlandc\\bgi\\");/*установка гpафики*/
palette();/* установка палитpы*/
setfillstyle(SOLID_FILL,7);
bar(0,0,getmaxx(),getmaxy());
setcolor(0);
/*password();*/
setfillstyle(SOLID_FILL,7);
bar(0,0,getmaxx(),getmaxy());
font("litt.chr",5);
menu();
  password();
pult_menu();
closegraph();
}
