// SoftIdiom Thumbnail Viewer
// Version 1.5
  
// global variables all held in a single object.
var _SIthumbObj = new Object();
_SIthumbObj.canMove = true;
_SIthumbObj.isIE = (document.all) ? true: false;
_SIthumbObj.isShowing = false;
_SIthumbObj.loadedPics = new Object();
_SIthumbObj.mousemove = "disabled";
_SIthumbObj.mouseout_type = "undefined";
_SIthumbObj.mouseX = 0;
_SIthumbObj.mouseY = 0;
_SIthumbObj.panelHeight = 0;
_SIthumbObj.panelLeft = 0;
_SIthumbObj.panelObj;
_SIthumbObj.panelTop = 0;
_SIthumbObj.panelWidth = 0;
_SIthumbObj.pictureSrc;
_SIthumbObj.previousMouseX = 0;
_SIthumbObj.previousMouseY = 0;
_SIthumbObj.progressPanelObj;
_SIthumbObj.progressObj;
_SIthumbObj.thumbnailHeight = 0;
_SIthumbObj.thumbnailLeft = 0;
_SIthumbObj.thumbnailObj;
_SIthumbObj.thumbnailTop = 0;
_SIthumbObj.thumbnailWidth = 0;
_SIthumbObj.timer;
_SIthumbObj.timer_left = 0;
_SIthumbObj.timer_step = 2;
_SIthumbObj.width = 200;

if (!_SIthumbObj.isIE) document.captureEvents(Event.MOUSEMOVE)
document.onmousemove = _SIthumb_mousemove;

// mousemove event.
function _SIthumb_mousemove(e) {
  if (_SIthumbObj.isIE) {
    _SIthumbObj.mouseX = event.clientX + document.body.scrollLeft
    _SIthumbObj.mouseY = event.clientY + document.body.scrollTop
  } 
  else {
    _SIthumbObj.mouseX = e.pageX
    _SIthumbObj.mouseY = e.pageY
  }  
  if (_SIthumbObj.mouseX < 0) _SIthumbObj.mouseX = 0;
  if (_SIthumbObj.mouseY < 0) _SIthumbObj.mouseY = 0;
  if (_SIthumbObj.previousMouseX <= 0) _SIthumbObj.previousMouseX = _SIthumbObj.mouseX;
  if (_SIthumbObj.previousMouseY <= 0) _SIthumbObj.previousMouseY = _SIthumbObj.mouseY;
  
  if (_SIthumbObj.mouseout_type == "thumbnail") {
    // check for mouse out on thumbnail.
    if (_SIthumbObj.isShowing &&
      (_SIthumbObj.mouseX < _SIthumbObj.thumbnailLeft ||
      _SIthumbObj.mouseX > _SIthumbObj.thumbnailLeft + _SIthumbObj.thumbnailWidth ||
      _SIthumbObj.mouseY < _SIthumbObj.thumbnailTop ||
      _SIthumbObj.mouseY > _SIthumbObj.thumbnailTop + _SIthumbObj.thumbnailHeight)) {
      _SIthumb_hide("thumbnail");  
    }
    if (_SIthumbObj.mousemove == "enabled") {
      _SIthumb_move();
    }
  }
  else if (_SIthumbObj.mouseout_type == "picture") {
    // check for mouse out on picture panel.
    if (_SIthumbObj.isShowing &&
      (_SIthumbObj.mouseX < _SIthumbObj.panelLeft ||
      _SIthumbObj.mouseX > _SIthumbObj.panelLeft + _SIthumbObj.panelWidth ||
      _SIthumbObj.mouseY < _SIthumbObj.panelTop ||
      _SIthumbObj.mouseY > _SIthumbObj.panelTop + _SIthumbObj.panelHeight)) {
      _SIthumb_hide("picture");  
    }
    _SIthumbObj.previousMouseX = _SIthumbObj.mouseX;
    _SIthumbObj.previousMouseY = _SIthumbObj.mouseY;
  }
}

// load and display the picture panel.
function _SIthumb_load(thumbnailObj, positionTop, positionLeft, imageSrc, titleText, summaryText, contentText, href, disableMove) {
  if (thumbnailObj == null || imageSrc == null || imageSrc.length == 0) return;
  if (navigator.userAgent.indexOf("Firefox") != -1 || (navigator.userAgent.indexOf("Opera") == -1 && navigator.appVersion.indexOf("MSIE") != -1)) {
    _SIthumbObj.thumbnailObj = thumbnailObj;
    _SIthumbObj.pictureSrc = imageSrc;
    _SIthumbObj.panelObj = document.getElementById('SIthumb_displayPanel');
    _SIthumbObj.mouseout_type = "thumbnail";
    _SIthumbObj.mousemove = "disabled";
    _SIthumbObj.isShowing = false;
    _SIthumbObj.canMove = (disableMove != null && disableMove == "disableMove") ? false: true;
    _SIthumb_position(positionTop, positionLeft);
    var onload = '';
    if (_SIthumbObj.loadedPics[imageSrc] != 1) {
      onload = 'onload="javascript:_SIthumb_progressStop();_SIthumb_show()"';
    }
    var picHTML = '';
    if (titleText != null && titleText.length > 0) picHTML += '<span class="SIStyle-normal">'+titleText+'</span><br>';
    picHTML += '<img '+onload+' src="'+imageSrc+'" alt="" border="0">';
    if (href != null && href.length > 0) {
      picHTML = '<a href="'+href+'">'+picHTML+'</a>';
    }
    if (summaryText != null && summaryText.length > 0) picHTML += '<br><span class="SIStyle-normal">'+summaryText+'</span>';
    if (contentText != null && contentText.length > 0) picHTML += '<br><span class="SIStyle-normal">'+contentText+'</span>';
    _SIthumbObj.panelObj.innerHTML = picHTML;
    if (_SIthumbObj.loadedPics[imageSrc] == 1) {
      _SIthumb_show();
    }
    else {
      _SIthumb_progressStart(_SIthumbObj.panelTop, _SIthumbObj.panelLeft);
    }
    _SIthumbObj.thumbnailTop = _SIthumb_findTop(thumbnailObj);
    _SIthumbObj.thumbnailLeft = _SIthumb_findLeft(thumbnailObj);
    _SIthumbObj.thumbnailHeight = _SIthumb_findHeight(thumbnailObj);
    _SIthumbObj.thumbnailWidth = _SIthumb_findWidth(thumbnailObj);
  }
}
// work out the required position for the picture panel.
function _SIthumb_position(positionTop, positionLeft) {
  var topOffset = _SIThumb_offset(positionTop);
  if (positionTop.indexOf("page") > -1) {
    _SIthumbObj.panelTop = topOffset;
  }
  else if (positionTop.indexOf("thumbnail") > -1) {
    _SIthumbObj.panelTop = _SIthumb_findTop(_SIthumbObj.thumbnailObj) + _SIthumb_findHeight(_SIthumbObj.thumbnailObj) + topOffset;
  }
  var leftOffset = _SIThumb_offset(positionLeft);
  if (positionLeft.indexOf("page") > -1) {
    _SIthumbObj.panelLeft = leftOffset;
  }
  else if (positionLeft.indexOf("thumbnail") > -1) {
    _SIthumbObj.panelLeft = _SIthumb_findLeft(_SIthumbObj.thumbnailObj) + leftOffset;
  }
}
// move the picture panel position to track the mouse.
function _SIthumb_move() {
  _SIthumbObj.panelTop += _SIthumbObj.mouseY - _SIthumbObj.previousMouseY;
  _SIthumbObj.panelLeft += _SIthumbObj.mouseX - _SIthumbObj.previousMouseX;
  _SIthumbObj.previousMouseY = _SIthumbObj.mouseY;
  _SIthumbObj.previousMouseX = _SIthumbObj.mouseX;
  _SIthumbObj.panelObj.style.top = _SIthumbObj.panelTop;
  _SIthumbObj.panelObj.style.left = _SIthumbObj.panelLeft;
  _SIthumb_reposition(_SIthumbObj.panelObj);
}
// display the loading progress panel.
function _SIthumb_progressStart(positionTop, positionLeft) {
  this.clearInterval(_SIthumbObj.timer);
  _SIthumbObj.timer_step = 2;
  _SIthumbObj.progressPanelObj = document.getElementById('SIthumb_progressPanel');
  _SIthumbObj.progressObj = document.getElementById('SIthumb_progress');
  _SIthumbObj.progressObj.style.left = 10;
  _SIthumbObj.progressObj.style.width = 10;
  _SIthumbObj.progressPanelObj.style.width = _SIthumbObj.width;
  _SIthumbObj.progressPanelObj.style.top = positionTop;
  _SIthumbObj.progressPanelObj.style.left = positionLeft;
  _SIthumbObj.progressPanelObj.style.visibility = 'visible';
  _SIthumb_reposition(_SIthumbObj.progressPanelObj);
  _SIthumbObj.timer = setInterval(_SIthumb_progress, 20);
}
// move the progress indicator (called by timer).
function _SIthumb_progress(progressID) {
  _SIthumbObj.timer_left += _SIthumbObj.timer_step;
  if (_SIthumbObj.timer_left < 10) _SIthumbObj.timer_step = 2;
  if (_SIthumbObj.timer_left > _SIthumbObj.width - 20) _SIthumbObj.timer_step = -2;
  _SIthumbObj.progressObj.style.left = _SIthumbObj.timer_left;
}
// stop and hide the progress panel.
function _SIthumb_progressStop() {
  _SIthumbObj.progressPanelObj.style.display = 'none';
  _SIthumbObj.progressPanelObj.style.visibility = 'hidden';
  this.clearInterval(_SIthumbObj.timer);
}
// show the picture panel.
function _SIthumb_show() {
  _SIthumbObj.panelObj.style.top = _SIthumbObj.panelTop;
  _SIthumbObj.panelObj.style.left = _SIthumbObj.panelLeft;
  _SIthumbObj.panelObj.style.visibility = 'visible';
  _SIthumbObj.mousemove = (_SIthumbObj.canMove) ? "enabled": "disabled";
  _SIthumbObj.isShowing = true;
  _SIthumb_reposition(_SIthumbObj.panelObj);
  _SIThumb_checkCovering();
  _SIthumbObj.loadedPics[_SIthumbObj.pictureSrc] = 1;
}
// hide the picture panel.
function _SIthumb_hide(type) {
  if (type == null) return;
  if (type == _SIthumbObj.mouseout_type) {
    _SIthumbObj.panelObj.style.visibility = 'hidden';
    _SIthumbObj.mousemove = "disabled";
    _SIthumbObj.mouseout_type = "undefined";
    _SIthumbObj.isShowing = false;
  }
}
// check if the picture panel is covering the thumbnail.
function _SIThumb_checkCovering() {
  _SIthumbObj.mouseout_type = "thumbnail";
  if (_SIthumb_intersects(_SIthumbObj.panelObj, _SIthumbObj.thumbnailObj)) {
    _SIthumbObj.panelHeight = _SIthumb_findHeight(_SIthumbObj.panelObj);
    _SIthumbObj.panelWidth = _SIthumb_findWidth(_SIthumbObj.panelObj);
    if (
      _SIthumbObj.mouseX > _SIthumbObj.panelLeft &&
      _SIthumbObj.mouseX < _SIthumbObj.panelLeft + _SIthumbObj.panelWidth &&
      _SIthumbObj.mouseY > _SIthumbObj.panelTop &&
      _SIthumbObj.mouseY < _SIthumbObj.panelTop + _SIthumbObj.panelHeight) _SIthumbObj.mouseout_type = "picture";
  }
}
// check the position of the object and reposition it if necessary.
function _SIthumb_reposition(obj) {
  var hasMoved = false;
  var objHeight = _SIthumb_findHeight(obj);
  var objWidth = _SIthumb_findWidth(obj);
  var pageWidth = 0, pageHeight = 0;
  var scrollTop = (_SIthumbObj.isIE) ? document.body.scrollTop: window.pageYOffset; 
  var scrollLeft = (_SIthumbObj.isIE) ? document.body.scrollLeft: window.pageXOffset; 
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    pageWidth = window.innerWidth;
    pageHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    pageWidth = document.documentElement.clientWidth;
    pageHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    pageWidth = document.body.clientWidth;
    pageHeight = document.body.clientHeight;
  }
  
  if (_SIthumbObj.panelTop + objHeight > scrollTop + pageHeight) {
    // move up.
    if (objHeight < pageHeight)  _SIthumbObj.panelTop = scrollTop + pageHeight - objHeight - 20;
    else _SIthumbObj.panelTop = 0;
    hasMoved = true;
  }
  if (_SIthumbObj.panelTop < scrollTop) {
    // move down.
    _SIthumbObj.panelTop = scrollTop;
    hasMoved = true;
  }
  if (_SIthumbObj.panelLeft + objWidth > scrollLeft + pageWidth) {
    // move left.
    if (objWidth < pageWidth)  _SIthumbObj.panelLeft = scrollLeft + pageWidth - objWidth - 20;
    else _SIthumbObj.panelLeft = 0;
    hasMoved = true;
  }
  if (_SIthumbObj.panelLeft < scrollLeft) {
    // move right.
    _SIthumbObj.panelLeft = scrollLeft;
    hasMoved = true;
  }
  if (hasMoved) {
    obj.style.top = _SIthumbObj.panelTop;
    obj.style.left = _SIthumbObj.panelLeft;
  }
}
// return the offset from a position property.
function _SIThumb_offset(string) {
  var plusIndex = string.indexOf("+");
  if (plusIndex > -1) return string.substr(plusIndex+1) * 1;
  var minusIndex = string.indexOf("-");
  if (minusIndex > -1) return string.substr(minusIndex+1) * -1;
  return 0;
}
// return the left position of an object.
function _SIthumb_findLeft(obj) {
  var left = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      left += obj.offsetLeft;
      obj = obj.offsetParent;
    }
  }
  else if (obj.x) { left += obj.x; }
  return left;
}
// return the top position of an object.
function _SIthumb_findTop(obj) {
  var top = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      top += obj.offsetTop;
      obj = obj.offsetParent;
    }
  }
  else if (obj.y) { top += obj.y; }
  return top;
}
// return the height of an object.
function _SIthumb_findHeight(obj) {
  return obj.offsetHeight;
}
// return the width of an object.
function _SIthumb_findWidth(obj) {
  return obj.offsetWidth;
}
// return true if object 1 intersects object 2.
function _SIthumb_intersects(obj1, obj2) {
  var obj1Top = _SIthumb_findTop(obj1);
  var obj1Left = _SIthumb_findLeft(obj1);
  var obj1Width = _SIthumb_findWidth(obj1);
  var obj1Height = _SIthumb_findHeight(obj1);
  var obj2Top = _SIthumb_findTop(obj2);
  var obj2Left = _SIthumb_findLeft(obj2);
  var obj2Width = _SIthumb_findWidth(obj2);
  var obj2Height = _SIthumb_findHeight(obj2);
  if (
    obj2Left < obj1Left + obj1Width &&
    obj1Left < obj2Left + obj2Width &&
    obj2Top < obj1Top + obj1Height &&
    obj1Top < obj2Top + obj2Height) return true;
  return false;
}


