// -------------------------------------------------------------------
// Image Thumbnail Viewer Script- By Dynamic Drive, available at: http://www.dynamicdrive.com
// Last updated: February 1st, 2009 - add iframe support
// -------------------------------------------------------------------
 
var thumbnailviewer = {
 enableTitle : true, //Should "title" attribute of link be used as description?
 enableAnimation : true, //Enable fading animation?
 definefooter : '<div class="footerbar">Close X</div>', //Define HTML for footer interface
 defineLoading : '<img src="loading.gif" /> Loading Image...', //Define HTML for "loading" div
 
///////////// No Need to Edit Beyond Here /////////////
 
 scrollbarwidth : 16,
 opacitystring : 'filter:progid:DXImageTransform.Microsoft.alpha(opacity=10); -moz-opacity: 0.1; opacity: 0.1',
 
 createthumbBox : function(){ // write out HTML for Image Thumbnail Viewer plus loading div
  document.write('<div id="thumbBox" onClick="thumbnailviewer.closeit()"><div id="thumbImage"></div>' + this.definefooter + '</div>')
  document.write('<div id="thumbLoading">' + this.defineLoading + '</div>')
  this.thumbBox = parent.document.getElementById('thumbBox');
  this.thumbImage = parent.document.getElementById('thumbImage'); //Reference div that holds the shown image
  this.thumbLoading = parent.document.getElementById('thumbLoading'); //Reference "loading" div that will be shown while image is fetched
  this.standardbody = (parent.document.compatMode == 'CSS1Compat')? parent.document.documentElement : parent.document.body; //create reference to common "body" across doctypes
 },
 
 centerDiv : function(divobj){ //Centers a div element on the page
  var ie = document.all && !window.opera, dom = document.getElementById,
  scroll_top = ie? this.standardbody.scrollTop : parent.window.pageYOffset,
  scroll_left = ie? this.standardbody.scrollLeft : parent.window.pageXOffset,
  docwidth = ie? this.standardbody.clientWidth : parent.window.innerWidth - this.scrollbarwidth,
  docheight = ie? this.standardbody.clientHeight: parent.window.innerHeight,
  docheightcomplete = this.standardbody.offsetHeight > this.standardbody.scrollHeight?
   this.standardbody.offsetHeight : this.standardbody.scrollHeight, //Full scroll height of document
  objwidth = divobj.offsetWidth, //width of div element
  objheight = divobj.offsetHeight, //height of div element
//Vertical position of div element: Either centered, or if element height larger than viewpoint height, 10px from top of viewpoint
  topposition = docheight>objheight? scroll_top + docheight / 2 - objheight / 2 + 'px' : scroll_top + 10 + 'px';
  divobj.style.left = docwidth / 2 - objwidth / 2 + 'px'; //Center div element horizontally
  divobj.style.top = Math.floor(parseInt(topposition)) + 'px';
  divobj.style.visibility = 'visible';
 },
 
 showthumbBox : function(){ //Show ThumbBox div
  thumbnailviewer.thumbLoading.style.visibility = 'hidden'; //Hide "loading" div
  this.centerDiv(this.thumbBox);
  if (this.enableAnimation){ //If fading animation enabled
   this.currentopacity = 0.1; //Starting opacity value
   this.opacitytimer = setInterval(function(){thumbnailviewer.opacityanimation();}, 20);
  }
 },
 
 loadimage : function(link){ //Load image function that gets attached to each link on the page with rel="thumbnail"
  if (this.thumbBox.style.visibility == 'visible') //if thumbox is visible on the page already
   this.closeit(); //Hide it first (not doing so causes triggers some positioning bug in Firefox
  var imageHTML = '<img src="' + link.getAttribute('href') + '" style="' + this.opacitystring + '" />'; //Construct HTML for shown image
  if (this.enableTitle && link.getAttribute('title')) //Use title attr of the link as description?
   imageHTML += '<br />' + link.getAttribute('title')
  this.centerDiv(this.thumbLoading) //Center and display "loading" div while we set up the image to be shown
  this.thumbImage.innerHTML = imageHTML //Populate thumbImage div with shown image's HTML (while still hidden)
  this.featureImage = this.thumbImage.getElementsByTagName('img')[0]; //Reference shown image itself
  if (this.featureImage.complete){
   this.thumbImage.style.width = this.featureImage.width + 'px';
   this.showthumbBox();
  }
  else
   this.featureImage.onload = function(){ //When target image has completely loaded
    thumbnailviewer.thumbImage.style.width = thumbnailviewer.featureImage.width + 'px';
    thumbnailviewer.showthumbBox(); //Display "thumbbox" div to the world!
   };
 if (document.all && !window.createPopup) //Target IE5.0 browsers only. Address IE image cache not firing onload bug: panoramio.com/blog/onload-event/
  this.featureImage.src = link.getAttribute('href');
 this.featureImage.onerror = function(){ //If an error has occurred while loading the image to show
  thumbnailviewer.thumbLoading.style.visibility = 'hidden'; //Hide "loading" div, game over
  };
 },
 
 setimgopacity : function(value){ //Sets the opacity of "thumbimage" div per the passed in value setting (0 to 1 and in between)
  var targetobject = this.featureImage;
  if (targetobject.filters && targetobject.filters[0]){ //IE syntax
   if (typeof targetobject.filters[0].opacity == 'number') //IE6
    targetobject.filters[0].opacity = value * 100;
   else //IE 5.5
    targetobject.style.filter = 'alpha(opacity=' + value * 100 + ')';
  }
  else if (typeof targetobject.style.MozOpacity != 'undefined') //Old Mozilla syntax
   targetobject.style.MozOpacity = value;
  else if (typeof targetobject.style.opacity != 'undefined') //Standard opacity syntax
   targetobject.style.opacity = value;
  else //Non of the above, stop opacity animation
   this.stopanimation();
 },
 
 opacityanimation : function(){ //Gradually increase opacity function
  this.setimgopacity(this.currentopacity);
  this.currentopacity += 0.1;
  if (this.currentopacity > 1)
   this.stopanimation();
 },
 
 stopanimation : function(){
  if (typeof this.opacitytimer != 'undefined')
   clearInterval(this.opacitytimer);
 },
 
 closeit : function(){ //Close "thumbbox" div function
  this.stopanimation();
  this.thumbBox.style.visibility = 'hidden';
  this.thumbImage.innerHTML = '';
  this.thumbBox.style.left = '-2000px';
  this.thumbBox.style.top = '-2000px';
 },
 
 dotask : function(target, functionref, tasktype){ //assign a function to execute to an event handler (ie: onunload)
  tasktype = window.addEventListener? tasktype : 'on' + tasktype;
  if (target.addEventListener)
   target.addEventListener(tasktype, functionref, false);
  else if (target.attachEvent)
   target.attachEvent(tasktype, functionref);
 },
 
 init : function(){ //Initialize thumbnail viewer script by listening to the page for clicks on links with rel="thumbnail"
  if (!this.enableAnimation)
   this.opacitystring = '';
  var pagelinks = function(e){
   var t; e = e || window.event; t = e.target || e.srcElement;
   while(t.parentNode && t.nodeName && t.nodeName.toLowerCase() != 'a')
    t = t.parentNode;
   if (t.nodeName && t.nodeName.toLowerCase() == 'a' && t.rel && t.rel == 'thumbnail'){ //Begin if statement
    if (e.preventDefault) e.preventDefault();
    thumbnailviewer.stopanimation(); //Stop any currently running fade animation on "thumbbox" div before proceeding
    thumbnailviewer.loadimage(t); //Load image
    return false;
   } //end if statement
  return undefined;
  };
  this.dotask(document, pagelinks, 'click');
 //Reposition "thumbbox" div when page is resized
  this.dotask(window, function(){
   if (thumbnailviewer.thumbBox.style.visibility=='visible')
    thumbnailviewer.centerDiv(thumbnailviewer.thumbBox);},
    'resize');
 } //END init() function
 
};
 
thumbnailviewer.init();
thumbnailviewer.createthumbBox(); //Output HTML for the image thumbnail viewer
