//->pagepal

int pagepal_handle;
int pagepal_toolbox = 1;
int pagepal_views = 0;
int pagepal_centre = 1;
int pagepal_view;


// update icon if it has changed

void pagepal_updateicon(int f, int i, int v)
{
 if(itos(v) != readicon(pagepal_handle, i))
  writeicon(pagepal_handle, i, itos(v));
}

void pagepal_shadeicon(int icon, int state)
{
 set_icon_state(pagepal_handle, icon, (1 << 22) * state, (1 << 22));
}


// update icons in page palette

void pagepal_updatepal(int view)
{
 int f;
 int oldview=pagepal_view;

 pagepal_view = view;

 if((oldview==0)!=(view==0))
 {
  pagepal_shadeicon(1,view==0);
  pagepal_shadeicon(5,view==0);
  pagepal_shadeicon(9,view==0);
 }

 if(view)
 {
  f = filefromview(view);
  pagepal_updateicon(f, 1, chapterstart(f) + currentchapter(view));
  pagepal_updateicon(f, 5, pagestart(currentchapter(view), f) + currentpage(view));
  pagepal_updateicon(f, 9, documentchapters(f));
 }
}


// display page palette, centred first time

void pagepal_display(void)
{
 display_window(pagepal_handle, 0, pagepal_centre);
 pagepal_centre = 0;
} 


// deal with 'pagepal' menu entry

int pagepal_entry(int entry,int subcode)
{
 pagepal_toolbox = !pagepal_toolbox;
 if(pagepal_toolbox)
  pagepal_display();
 else
  close_window(pagepal_handle);

 return(0);
}


// Tick or un-tick 'pagepal' menu entry

int pagepal_flags(int entry, string &text)
{
 return(pagepal_toolbox);
}


// handler for click in palette

void pagepal_click(int handle, int icon, int bbits, int mx, int my)
{
 int f, c, p, c1, p1, c2, p2,ci,pi;

 if(pagepal_view)
 {

  if((icon == 2 || icon == 3 || icon == 6 || icon == 7) && (bbits == 1 || bbits == 4))
  {
   f = filefromview(pagepal_view);
   c1=c=currentchapter(pagepal_view);
   p1=p=currentpage(pagepal_view);

   while(1)
   {
    pi=p;
    ci=c;

    if(icon == 2 && bbits == 4 || icon == 3 && bbits == 1) 
    {
     if(c) 
     --c;
    }

    if(icon == 2 && bbits == 1 || icon == 3 && bbits == 4)
    { 
     if(c < documentchapters(f))
      ++c;
    }

    if(icon == 6 && bbits == 4 || icon == 7 && bbits == 1) 
    {
     if(p)
      --p;
     else
     if(c) 
     {
      --c;
      p = chapterpages(c, f) - 1;
     }
    }

    if(icon == 6 && bbits == 1 || icon == 7 && bbits == 4)
    {
     if(p < chapterpages(c, f) - 1)
      ++p;
     else
     if(c < documentchapters(f) - 1)
     {
      p = 0;
      ++c;
     }
    }

    if((p==pi) && (c==ci)) break;

    gotopage(p, c, pagepal_view);
    pagepal_updatepal(pagepal_view);

    p2=currentpage(pagepal_view);
    c2=currentchapter(pagepal_view);

    if((p2!=p1) || (c2!=c1)) break;
   }
  }
 }
}


// handler for Return key in writeable

int pagepal_keypress(int handle, int icon, int key)
{
 int f, c, p;

 if(key==13)
 {
  f = filefromview(pagepal_view);

  c = stoi(readicon(handle, 1)) - chapterstart(f);
  p = stoi(readicon(handle, 5)) - pagestart(c, f);
  gotopage(p, c, pagepal_view);
  pagepal_updatepal(pagepal_view);
  return(-1);
 }

 return(key);
}



// handler for pagepal window close icon

void pagepal_closetoolbox(int handle)
{
 close_window(handle);
 pagepal_toolbox = 0;
}


// count number of views opened and display pagepal

void pagepal_viewopen(int user, int view)
{
 ++pagepal_views;
}


// close pagepal when all views have been closed

void pagepal_viewclose(int user, int view)
{
 --pagepal_views;
 if(!pagepal_views) close_window(pagepal_handle);
 else
 if(pagepal_view && pagepal_view==view)  pagepal_updatepal(0);
}


// open page palette when first document gets input focus

void pagepal_gaincaret(int user, int view, int gain)
{

 if(gain && pagepal_toolbox && pagepal_views == 1)
  pagepal_display();

 if(gain)
  pagepal_updatepal(view);
}


// update page palette when current page changes

void pagepal_pagechange(int user, int view)
{
 pagepal_updatepal(view);
}


// add 'pagepal' option to 'Applets' menu
// create window and add window handlers

void main(void)
{
 script_menu_initialise();

 addentry_menu(script_handle, "pagepal_entry","pagepal_flags","","","{PAGEPAL_00}");

 pagepal_handle = create_window("pagepal_m");

 addwindowhandler(0,pagepal_handle,"pagepal_click");
 addwindowhandler(1,pagepal_handle,"pagepal_keypress");
 addwindowhandler(2,pagepal_handle,"pagepal_closetoolbox");

 addeventhandler(0x005, 0, "pagepal_viewopen");
 addeventhandler(0x006, 0, "pagepal_viewclose");
 addeventhandler(0x212, 0, "pagepal_gaincaret");
 addeventhandler(0x216, 0, "pagepal_pagechange");
}
