

int access_whandle;
int access_rhandle;
int access_mhandle;
int access_file;
int access_recurse;

int access_rof;
int access_wpw;
int access_rpw;
int access_rof2;
int access_wpw2;
int access_rpw2;


// open 'Access' dialogue box

int access_entry(int entry, int subcode)
{
 int bits, locked;

 bits = password("", "", 0, currentfile());

 access_rof = bits & (1 << 8);
 access_wpw = bits & (1 << 1);
 access_rpw = bits & (1 << 0);
 access_rof2 = access_rof;
 access_wpw2 = access_wpw;
 access_rpw2 = access_rpw;
 locked = (bits & (1 << 5)) == 0;

 select_icon(access_mhandle, 1, access_rof);
 select_icon(access_mhandle, 2, access_wpw);
 select_icon(access_mhandle, 3, access_rpw);

 access_file = currentfile();
 writeicon(access_mhandle, 4, "");
 writeicon(access_mhandle, 5, "");
 set_icon_state(access_mhandle, 2, (1 << 22) * locked, (1 << 22));
 set_icon_state(access_mhandle, 3, (1 << 22) * locked, (1 << 22));
 set_icon_state(access_mhandle, 4, (1 << 22) * locked, (1 << 22));
 set_icon_state(access_mhandle, 5, (1 << 22) * locked, (1 << 22));
 display_window(access_mhandle, 0, 1);
 if(!locked)
  insert_caret(access_mhandle, 4);

 return(0);
}


// deal with OK button on Read box

void access_readok(int handle)
{
 int b;
 string p;

 p = readicon(handle, 1);
 if(p != "")
  password(p, p, 1 | (1 << 3) | (1 << 4), access_file);
 b = password("", "", 0, access_file);
 if(b & (1 << 2))
 {
  close_window(handle);
  access_recurse = 0;
  setcurrentfile(access_file);
  newview(0);
 }
 else
  messagebox("Incorrect password");
}


// deal with Cancel button on Read box

void access_readcancel(int handle)
{
 filescrap(access_file);
 close_window(handle);
 access_recurse = 0;
}


// deal with OK button on Write box

void access_writeok(int handle)
{
 int b;
 string p;

 p = readicon(handle, 1);;
 password("", p, 1 | (1 << 4), access_file);
 b = password("", "", 0, access_file);
 if(b & (1 << 5))
 {
  close_window(handle);
  access_recurse = 0;
  messagebox("Write protect unlocked");
 }
 else
  messagebox("Incorrect password");
}


// deal with Cancel button on Write box

void access_writecancel(int handle)
{
 close_window(handle);
 access_recurse = 0;
}


// deal with OK button on main box

void access_mainok(int handle)
{
 string wpw, rpw;
 int rofb, wpwb, rpwb;

 wpw = readicon(handle, 4);
 rpw = readicon(handle, 5);

 access_rof = access_rof2;
 access_wpw = access_wpw2;
 access_rpw = access_rpw2;

 rofb = access_rof != 0;
 wpwb = (access_wpw && wpw != "") || !access_wpw;
 rpwb = (access_rpw && rpw != "") || !access_rpw;

 password(rpw, wpw, 2 | (rpwb << 3) | (wpwb << 4) | (1 << 5) | (rofb << 8), currentfile());
 close_window(access_mhandle);
}


// deal with clicks on buttons

void access_click(int handle, int icon, int bits, int mx, int my)
{
 string p;

 if(handle == access_rhandle)
 {
  if(icon == 2)
   access_readok(handle);
  if(icon == 3)
   access_readcancel(handle);
 }

 if(handle == access_whandle)
 {
  if(icon == 2)
   access_writeok(handle);
  if(icon == 3)
   access_writecancel(handle);
 }

 if(handle == access_mhandle)
 {
  if(icon == 1)
   select_icon(access_mhandle, 1, access_rof2 = !access_rof2);
  if(icon == 2)
   select_icon(access_mhandle, 2, access_wpw2 = !access_wpw2);
  if(icon == 3)
   select_icon(access_mhandle, 3, access_rpw2 = !access_rpw2);
  if(icon == 6)
   access_mainok(access_mhandle);
  if(icon == 7)
   close_window(access_mhandle);
 }
}


// deal with Return being pressed in dialogue boxes

int access_key(int handle, int icon, int key)
{
 if(handle == access_rhandle && icon == 1 && key == 13) access_readok(handle);
 else
 if(handle == access_whandle && icon == 1 && key == 13) access_writeok(handle);
 else
 if(handle == access_mhandle && icon == 5 && key == 13) access_mainok(handle);
 else return(key);

 return(-1);
}


// event handler for 'read password' protected documents

int access_filenoread(int user, int file, int claimed)
{
 if(access_recurse)
  return(claimed);

 access_recurse = 1;
 access_file = file;
 writeicon(access_rhandle, 1, "");
 display_window(access_rhandle, 0, 1);
 insert_caret(access_rhandle, 1);
 return(1);
}


// event handler for 'write password' protected documents

int access_filewritefail(int user, int file, int claimed)
{
 int b;

 if(access_recurse)
  return(claimed);

 b = password("", "", 0, file);
 if(!(b & (1 << 5)))
 {
  access_recurse = 1;
  access_file = file;
  writeicon(access_whandle, 1, "");
  display_window(access_whandle, 0, 1);
  insert_caret(access_whandle, 1);
 }
 return(1);
}


// close dialogue boxes when attached document is closed

int access_filescrap(int user, int file, int claimed)
{
 if(file == access_file)
 {
  access_writecancel(access_whandle);
  close_window(access_mhandle);
 }
 return(claimed);
}


// close dialogue boxes when there is a click in the attached document

int access_viewclick(int user, int view, int mousex, int mousey, int mousebuttons)
{
 if(filefromview(view) == access_file)
 {
  access_writecancel(access_whandle);
  close_window(access_mhandle);
 }
 return(mousebuttons);
}


// create 'Access' option and add it to 'Applets' menu

void main(void)
{
 script_menu_initialise();

 addentry_menu(script_handle,"access_entry","","","","{ACCESS_00}");

 access_rhandle = create_window("access_r");
 addwindowhandler(0, access_rhandle, "access_click");
 addwindowhandler(1, access_rhandle, "access_key");
 access_whandle = create_window("access_w");
 addwindowhandler(0, access_whandle, "access_click");
 addwindowhandler(1, access_whandle, "access_key");
 access_mhandle = create_window("access_m");
 addwindowhandler(0, access_mhandle, "access_click");
 addwindowhandler(1, access_mhandle, "access_key");

 addeventhandler(0x307, 0, "access_filenoread");
 addeventhandler(0x308, 0, "access_filewritefail");
 addeventhandler(0x309, 0, "access_filescrap");
 addeventhandler(0x213, 0, "access_viewclick");
}
