//->Label


int label_handle;
int label_poshandle;
string label_path;
string label_name;
int label_number;


// read choices

void label_readchoices(void)
{
 int h;
 string s;

 h = fileopen(label_path + ".Choices", "rb");
 if(h)
 {
  label_number = filegetc(h);
  filereads(label_name, h);
  fileclose(h);
 }
 else
 {
  label_name = "";
  label_number = 1;
 }
}


// write choices

void label_writechoices(void)
{
 int h;

 h = fileopen(label_path + ".Choices", "wb");
 if(h)
 {
  fileputc(label_number, h);
  filewrites(label_name, h);
  fileclose(h);
 }
}


// write selected text into label_number of label_name

int label_fix(int subcode, int all)
{
 int bm1, bm2;
 int fh1, fh2;
 string s, a, b, d;
 int n, c, i;

 if(subcode >= 0)
  return(0);

 if(label_name == "")
 {
  s = "{LABEL_04}";
  translate(s);
  errorbox(s);
 }

 if(!zoneorder())
 {
  s = "{LABEL_06}";
  translate(s);
  errorbox(s);
 }

 bm1=bmcreate("labelbm1");
 bm2=bmcreate("labelbm2");
 setbmtozone(bm1, bm2);

 s="\"";
 while(bmcmp(bm1, bm2) < 0)
 {
  c = bmchar(bm1);
  if(c == 10)
   s += "\"" + "{newpara}" + "\"";
  else
   s += chars(c);
  if(!bmmove(bm1, 1, 0))
   break;
 }
 s += "\"";

 bmdelete(bm1);
 bmdelete(bm2);

 fh1=fileopen(label_path + ".Stationery." + label_name, "r");
 fh2=fileopen(label_path + ".Label", "w");
 if(fh1 && fh2)
 {
  c = 0;
  while(!fileeof(fh1))
  {
   if(filereads(a, fh1)) break;
   if((n = a / "{merge ") >= 0)
    c++;
  }
  if(label_number > c)
   label_number = c;

  fileseek(0, fh1);
  while(!fileeof(fh1))
  {
   if(filereads(a,fh1)) break;
   if((n = a / "{merge ") >= 0)
   {
    b = (a >> (slen(a) - n));
    n += slen("{merge ");
    i = (a << n) / "}";
    d = a << (n + i + 1);
    a = b + ((label_number == stoi(mids(a, n, i)) || all) ? s : "") + d;
   }
   filewrites(a,fh2);
  }
  fileclose(fh2);
  fileclose(fh1);
  osclis("settype " + label_path + ".Label b25");
  loadfile(label_path + ".Label");
  if(!all)
   if(++label_number > c)
    label_number = 1;
  label_writechoices();
 }
 return(0);
}


int label_mainentry(int entry, int subcode)
{
 label_fix(subcode, 0);
}


// read label_number from writeable and label_name from menu

int label_entry(int entry, int subcode)
{
 switch(entry)
 {
  case 0:
          label_fix(subcode, 0);
          break;
  case 1:
          label_fix(subcode, 1);
          break;
  default:
          label_name = string_menu(label_handle, entry);
          label_writechoices();
          break;
 }
 return(0);
}


// update label_number writeable and tick current label_name

int label_flags(int entry, string &text)
{
 string s;

 switch(entry)
 {
  case 0:
          s = "{LABEL_01}";
          translate(s);
          text = s + " #" + itos(label_number);
          break;
  case 1:
          return(DOTTED);
          break;
  default:
          menudefstring(label_handle, entry, 4, s);
          return(s == label_name);
          break;
 }
 return(0);
}


// build menu of label template files

int label_menu(int open)
{
 string s;

 if(label_handle)
 {
  delete_menu(label_handle);
  label_handle=create_menu("{LABEL_00}");
 }

 addentry_menu(label_handle,"label_entry","label_flags","label_posmenu","", "{LABEL_01} #" + itos(label_number));
 addentry_menu(label_handle,"label_entry","label_flags","","", "{LABEL_02}");
 startscan();
 while(nextobject(label_path + ".Stationery", "*", s))
  addentry_menu(label_handle,"label_entry","label_flags","","", s);
 return(label_handle);
}


int label_posentry(int entry, int subcode)
{
 label_number = stoi(string_menu(label_poshandle, entry));
 label_writechoices();
}


int label_posflags(int entry, string &text)
{
 text = itos(label_number);
 return((8<<24)|(8<<16) | WRITEABLE);
}


int label_posmenu(int open)
{
 return(label_poshandle);
}


// create 'Label' submenu and add it to the icon bar menu

void main(void)
{
 string help = "{LABEL_05}";

 script_menu_initialise();

 label_path = "OvationPro$AppletsDir";
 getenvs(label_path);
 label_path += ".!Label";

 label_handle = create_menu("{LABEL_00}");
 addentry_menu(script_handle,"label_mainentry","","label_menu","","{LABEL_00}");

 label_poshandle = create_menu("{LABEL_03}");
 addentry_menu(label_poshandle,"label_posentry","label_posflags","","","");
 label_readchoices();

 if(isdefmacro("label") == -1)
 {
  translate(help);
  defmacro2(0, "label" ,"{label_fix(-1, 0)}" ,"label", help);
 }
}
 
