/*
 *  photodesc.js - Javascript implementing mouseover image descriptions
 *
 *  This code is based on nicetitle.js by Stuart Langridge at
 *  kryogenix.org, and heavily modified by Sandro Fouche'
 *  
 *  All code is copyright the repsective author, and they should
 *  be consulted with regards to duplication, reuse, and publication
 *  of this source code, and any derivative works.
 *
 *  Copyright 2005 Sandro Fouche'
 */

addEvent(window, "load", makeDescs);

var XHTMLNS = "http://www.w3.org/1999/xhtml";
var CURRENT_DESC;

function makeDescs() {

  if (!document.createElement || !document.getElementsByTagName) return;
  // add namespace methods to HTML DOM; this makes the script work in both
  // HTML and XML contexts.
  if(!document.createElementNS) {
    document.createElementNS = function(ns,elt) {
      return document.createElement(elt);
    }
  }

  var images = document.getElementsByTagName("img");
  if (images) 
    for (var ti=0;ti<images.length;ti++) {
      var img = images[ti];
      if (img.getAttribute("id")) {
	var divs = document.getElementsByTagName("div");
	if (divs)
	  for( var i=0; i < divs.length; i++) {
	    var tg = divs[i];
	    if (tg.getAttribute("id") == img.getAttribute("id")) {

	      tg.style.width =  (img.offsetWidth) + 'px';    
	      tg.style.height =  (img.offsetHeight) + 'px';    
	      tg.style.left = (img.offsetLeft) + 'px';    
	      tg.style.top = (img.offsetTop) + 'px';    
	      tg.className = "photodesc";
	      tg.style.display = 'none';

	      img.setAttribute("desc", i);
	      img.title="";


	      addEvent(img, "mouseover", showDesc);
	      addEvent(img, "focus", showDesc);

	      /*
	       * Hack for Opera 7 - why does it work below though?
	       */
/*	
	      img.onmouseover=showDesc;  
	      tg.onmouseout=hideDesc;  
*/

	    }
	  }
      }
    }
}


function showDesc(e) {
  if (!document.getElementsByTagName) return;
  if (window.event && window.event.srcElement) {
    img = window.event.srcElement;
  } else if (e && e.target) {
    img = e.target;
  }

  if (!img) return;

  var divs = document.getElementsByTagName("div");
  var tg = divs[img.getAttribute("desc")];

  if (!tg) return;
  
  if (CURRENT_DESC) 	
    CURRENT_DESC.style.display = 'none';
    
  tg.style.left = (img.offsetLeft) + 'px';    
  tg.style.top =  (img.offsetTop) + 'px';    
  tg.style.display = 'block';

  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();

  addEvent(document.body, "mouseout", hideDesc);
  addEvent(document.body, "focus", hideDesc);

  CURRENT_DESC = tg;
}


function hideDesc(e) {
  if (CURRENT_DESC) {
    if (!document.getElementsByTagName) return;
    if (!e) var e = window.event;

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

    while (tg != CURRENT_DESC && tg != document.body)
      tg = tg.parentNode;
    if (tg == CURRENT_DESC) return;
    
    CURRENT_DESC.style.display = "none";
    CURRENT_DESC = null;

    removeEvent(document.body, "mouseout", hideDesc);
    removeEvent(document.body, "focus", hideDesc);

    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  }
}

// Add an eventListener to browsers that can do it somehow.
// Originally by the amazing Scott Andrew.
function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}


function removeEvent(obj, eventType, afunction) { 
  if (obj.removeEventListener) { 
    obj.removeEventListener(eventType, afunction, true); 
    return true; 
  } else if (obj.detachEvent) { 
    return obj.detachEvent("on"+eventType, afunction); 
  }
  else return false; 
}	
