

int unique_handle;
int unique_prefix_handle;
int unique_start_handle;
string unique_prefix, unique_number;
string unique_path;
int unique_save = 0;
int unique_tag;


string unique_getprefix(void)
{
 string s;

 if(unique_save)
  tagreads(currentfile(), unique_tag + 2, s);
 else
  s = unique_prefix;
 return(s);
}


void unique_putprefix(string s)
{
 if(unique_save)
  tagwrites(currentfile(), unique_tag + 2, s);
 else
  unique_prefix = s;
}


string unique_getnumber(void)
{
 string s;

 if(unique_save)
  tagreads(currentfile(), unique_tag + 3, s);
 else
  s = unique_number;
 return(s);
}


void unique_putnumber(string s)
{
 if(unique_save)
  tagwrites(currentfile(), unique_tag + 3, s);
 else
  unique_number = s;
}



// read prefix and unique number from file

void unique_read(void)
{
 int h;

 h = fileopen(unique_path, "rb");
 if(h)
 {
  filereads(unique_prefix, h);
  unique_prefix = mids(unique_prefix, 0, slen(unique_prefix) - 1);
  filereads(unique_number, h);
  fileclose(h);
 }
 else
 {
  unique_prefix = "";
  unique_number = "0";
 }
}


// write prefix and unique number to file

void unique_quit(int user)
{
 int h;

 h = fileopen(unique_path, "wb");
 if(h)
 { 
  filewrites(unique_prefix + "\n", h);
  filewrites(unique_number, h);
  fileclose(h);
 }
}


void unique_write(int v)
{
 tagwrite(currentfile(), unique_tag + 1, v, 0);

 if(v)
 {
  unique_putprefix(unique_prefix);
  unique_putnumber(unique_number);
 }
}


// deal with 'Unique' menu entry

int unique_entry(int entry, int subcode)
{
 if(subcode == -1)
 {
  if(tagexists(currentfile(), unique_tag + 1, 0))
  {
   if(tagread(currentfile(), unique_tag + 1, 0))
    unique_save = 1;
  }
  else
   unique_save = 0;

  type(unique_getprefix() + unique_getnumber());
  unique_putnumber(itos(stoi(unique_getnumber()) + 1));
 }

 return(0);
}


// shade or un-shade 'Unique number' menu entry

int unique_flags(int entry, string &text)
{
 if(tagexists(currentfile(), unique_tag + 1, 0))
 {
  if(tagread(currentfile(), unique_tag + 1, 0))
   unique_save = 1;
 }
 else
  unique_save = 0;

 return((activetype(TEXTFRAME) <= 1) ? SHADED : 0);
}


// deal with 'Unique' menu entry

int unique_subentry(int entry, int subcode)
{
 if(entry == 2)
 {
  unique_save = !unique_save;
  unique_write(unique_save);
 }  
}

// shade or un-shade 'Unique number' menu entry

int unique_subflags(int entry, string &text)
{
 if(entry == 2 && unique_save)
  return(TICKED);
 return(0);
}


// deal with 'Start' writeable menu entry

int unique_start_entry(int entry, int subcode)
{
 unique_putnumber(string_menu(unique_start_handle, entry));
 return(0);
}


// make 'Start' sub-menu, writeable

int unique_start_flags(int entry, string &text)
{
 text = unique_getnumber();
 return((8<<24)|(8<<16)|WRITEABLE);
}


// deal with 'Prefix' writeable menu entry

int unique_prefix_entry(int entry,int subcode)
{
 unique_putprefix(string_menu(unique_prefix_handle, entry));
 return(0);
}


// make 'Prefix' sub-menu, writeable

int unique_prefix_flags(int entry, string &text)
{
 text = unique_getprefix();
 return((8<<24)|(8<<16)|WRITEABLE);
}


int unique_menu(int open)
{
 return(unique_handle);
}


int unique_prefix_menu(int open)
{
 return(unique_prefix_handle);
}


int unique_start_menu(int open)
{
 return(unique_start_handle);
}


// create 'Unique' sub-menu and add it to Applets menu
// read start number and prefix

void main(void)
{
 int i;
 string help = "{UNIQUE_05}";

 script_menu_initialise();

 unique_path = "OvationPro$AppletsDir";
 getenvs(unique_path);
 unique_path += ".!Unique.uniquenumb";

 unique_handle = create_menu("{UNIQUE_01}");
 addentry_menu(unique_handle,"","","unique_start_menu","","{UNIQUE_02}");
 addentry_menu(unique_handle,"","","unique_prefix_menu","","{UNIQUE_03}");
 addentry_menu(unique_handle,"unique_subentry","unique_subflags","","","{UNIQUE_04}");

 unique_start_handle = create_menu("{UNIQUE_02}");
 addentry_menu(unique_start_handle,"unique_start_entry","unique_start_flags","","","");

 unique_prefix_handle = create_menu("{UNIQUE_03}");
 addentry_menu(unique_prefix_handle,"unique_prefix_entry","unique_prefix_flags","","","");

 addentry_menu(script_handle,"unique_entry","unique_flags","unique_menu","","{UNIQUE_00}");
 unique_read();

 addeventhandler(0x04, 0, "unique_quit");

 if(isdefmacro("unique") == -1)
 {
  translate(help);
  defmacro2(0, "unique" ,"{if(activetype(TEXTFRAME)>1) unique_entry(0, -1);else bbc_vdu(7)}" ,"unique", help);
 }

 for(i = 0; i < 3; ++i)
  unique_tag += schar("uni", i) << ((3 - i) * 8);
}

