/* Copyright 2007 Mark Ivey */

/*************** Sizes ***************/

function Pixelize(dims) {
  return {top:    dims['top']    +'px', 
          left:   dims['left']   +'px', 
          width:  dims['width']  +'px',
          height: dims['height'] +'px'
 };
}

function GetZoomedDimensions() {
  dims = GetDimensions($('periodic_table'));
  zoom_height = dims['height'];
  zoom_width  = dims['height'];
  return {top:    dims['top'] + (dims['height'] - zoom_height) / 2.0,
          left:   dims['left'] + (dims['width'] - zoom_width) / 2.0,
          width:  zoom_height,
          height: zoom_width};
}

function GetDimensions(element) {
  p = Position.cumulativeOffset(element);
  return {top: p[1], 
          left: p[0], 
          width: element.getWidth(), 
          height: element.getHeight()};
}

/*************** Zooming ***************/
function FinishZoomIn(effect) {
  effect.element.addClassName('fully_zoomed');
}

function ZoomIn(element, new_dimensions) {
  element.removeClassName('fully_zoomed');
  element.setStyle({fontSize: '100%'}); /* needs to be set before morph */
  element.orig_dims = GetDimensions(element); /* store data for zoom out */
  new_style = Pixelize(new_dimensions);
  new_style['fontSize'] = '400%';
  new Effect.Morph(element, {style: new_style, 
                             afterFinish: FinishZoomIn});
}

function FinishZoomOut(effect) {
  effect.element.hide();
}

function ZoomOut(element) {
  element.removeClassName('fully_zoomed');
  new_style = Pixelize(element.orig_dims);
  new_style['fontSize'] = '100%';
  new Effect.Morph(element, {style: new_style,
                             afterFinish: FinishZoomOut});
}

function ClearEffectsQueue() {
  queue = Effect.Queues.get('global');
  queue.each(function(e) { e.cancel() });
}

/*************** Event Handlers ****************/
function ToLargeZoom() {
  ClearEffectsQueue();
  medium = $('medium_zoom');
  large = $('large_zoom');
  large.show();
  large.update(medium.orig_element.down('.large').innerHTML);
  Position.clone(medium, large);
  ZoomIn(large, GetZoomedDimensions());
}

function CloseLargeZoom() {
  ClearEffectsQueue();
  ZoomOut($('large_zoom'));
}

function Highlight(element) {
  element = $(element);
  zoom = $('medium_zoom');
  zoom.orig_element = element;
  zoom.update(element.down('.medium').innerHTML);
  zoom.show();
  offsetLeft = -(zoom.getWidth() - element.getWidth())/2.0;
  offsetTop = -(zoom.getHeight() - element.getHeight())/2.0;
  Position.clone(element, zoom, {setWidth: false, setHeight: false, 
    offsetLeft: offsetLeft, offsetTop: offsetTop});
}

function PickCss(title) {
  $('medium_zoom').hide();
  e = $A(document.getElementsByTagName('link'));
  e.each(function(link) {
    link = $(link);
    if (link.readAttribute('rel').indexOf('style') != -1 &&
        link.readAttribute('title')) {
      title_matches = (link.readAttribute('title') == title);
      link.disabled = (!title_matches);
    }
  });
}


