var aI = {

  // With thanks to http://kryogenix.org/code/browser/annimg/annimg.html

  init: function()
  {
    $$('div.pageHolder').each(function(el)
    {
      aI.prepPageHolder(el);
    });
  },
  
  prepPageHolder: function(ph)
  {
    
    var mapObj = null;
    
    var images = ph.select('img[usemap]');
    
    if (images.length > 0)
    {
      var mapName = images[0].readAttribute('usemap').sub(/^#/, '');
      mapObj = $(mapName);
    }
        
    if (mapObj == null)
    {
      return;
    }
    
    aI.__makeTrigger(ph,
                     ph);
    
    mapObj.select('area.linkZoom').each(function(area)
    {
      aI.__makeTrigger(area,
                       ph);
    });

    ph.select('img').each(function(img)
                          {
                            img.ph = ph;
                          });

    ph.areas = [];
    var scale = 1.0;
    var orig = images[0].origWidth;

    if ((orig != null) && (orig > 0))
    {
      scale = images[0].offsetWidth / orig;
    }
    
    mapObj.select('area.linkOut', 'area.linkIn').each(function(area)
    {
      
      var coo = area.readAttribute('coords').split(',');
      
      if (coo.length == 4)
      {
        
        if (area.className == 'linkOut')
        {
          area.target = "_blank";
        }

        var a = new Element('a', {'target':area.getAttribute('target'),
                                  'title':area.readAttribute('title'),
                                  'href':area.getAttribute('href')}).addClassName('annotation');

      
        var thisAreaPosition = aI.__getAreaPosition(ph, coo, scale);

        a.setStyle({
                    'left':thisAreaPosition[0] + 'px',
                    'top':thisAreaPosition[1] + 'px',
                    'width':(scale * (parseInt(coo[2]) - parseInt(coo[0]))) + 'px',
                    'height':(scale * (parseInt(coo[3]) - parseInt(coo[1]))) + 'px'
                   });

        var s = new Element('span').update('');
        a.update(s);

        // Tag the span and anchor so we can cross-reference on mouseouts later
        s.ph = ph;
        a.ph = ph;

        a.associatedCoords = coo;
      
        ph.areas.push(a);
        $$('body')[0].appendChild(a);
      }
    });    
  },
  
  __makeTrigger: function(elem,
                          ph)
  {
    elem.ph = ph;
    elem.observe("mouseover",aI.showAreas);
    elem.observe("mouseout",aI.hideAreas);
  },
  
  __getAreaPosition: function(ph,coo,scale)
  {
    var aleft = (ph.offsetLeft + parseInt(coo[0]) * scale);
    var atop = (ph.offsetTop + parseInt(coo[1]) * scale);
    var oo = ph;
    while (oo.offsetParent) {
      oo = oo.offsetParent;
      aleft += oo.offsetLeft;
      atop += oo.offsetTop;
    }
    return [aleft,atop];
  },
  
  __displayAreas: function(areas, bYesNo)
  {
    var display = bYesNo ? 'block' : 'none';
    areas.each(function(area)
               {
                 area.style.display = display;
               });
  },
  
  showAreas: function(e)
  {
    
    var ph = Event.element(e).ph;

    if ((ph == null)
        || (ph.areas == null))
    {
      return;
    }
    
    aI.__displayAreas(ph.areas,
                      true);
                      
  },
  
  hideAreas: function(e)
  {

    if (!e) var e = window.event;
    var tg = (window.event) ? e.srcElement : e.target;
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;

    if ((reltg == null) || (reltg.ph == tg.ph))
    {
      return;
    }
    
    if ((tg.ph == null)
        || (tg.ph.areas == null))
    {
      return;
    }
    
    aI.__displayAreas(tg.ph.areas,
                      false);
    
  },


  regenerate : function()
  {
    $$('a.annotation').each(function(e) {e.remove()});
    this.init();
  }
  
}

Event.observe(window, 'load', aI.init);
