var EPREVUE = {};

EPREVUE.Zoom = function () {
    var mainImgWrapper = function () {
        var swfPath = 'js/MicroDZoom/flash/ImageZoomControl.swf';
        var imgParentID = null;
        var imgWID = null;
        var img = null;
        var xy = [0,0];
        var isIEPre7 = false;
        
        function getSWF(movieName)
        {
          if (navigator.appName.indexOf("Microsoft") != -1)
          {
            return window[movieName];
          }
          else
          {
            return document[movieName];
          }
        }
        
        return {
            init: function (loadedCB, readyForJSCB, parentID, id, imgSrc, h, w) {
                imgParentID = parentID;
                imgWID = id;
                if (!swfobject.hasFlashPlayerVersion('7.0.0')) {
                    var flashInstallUrl = 'http://www.adobe.com/go/EN_US-H-GET-FLASH';
                    document.getElementById(parentID).innerHTML = '<div style="color:white">Flash required:</div>' + 
                                '<a id="' + id+'_flashinstalllink' + '" href="' + flashInstallUrl + '" target="_new"><img src="http://www.adobe.com/images/shared/download_buttons/get_adobe_flash_player.png" style="border: 0px solid black;"></a>';
                    YAHOO.util.Event.on(id+'_flashinstalllink', 'click', function (evt) {
                        var newwindow = window.open(flashInstallUrl, 'flashInstallWindow', 'height=500,width=780')
                        var closedCheckIntervalID = setInterval(function () {
                            if (newwindow && newwindow.closed) {
                                clearInterval(closedCheckIntervalID);
                                window.location.reload(true);
                            }
                        }, 250);
                        YAHOO.util.Event.stopEvent(evt);
                    });
                } else {
                  img = document.createElement("img");
                  img.id = id;
                  img.height = h;
                  img.width = w;
                  img.style.position = 'relative';
                  document.getElementById(parentID).appendChild(img);
                  swfobject.embedSWF(swfPath, id, w, h, '9.0.0', 'js/MicroDZoom/flash/expressInstall.swf', {}, {wmode: 'opaque'});
                  img = getSWF(id);
                  var waitOnFlashIntervalID = setInterval(function () {
                      img = getSWF(id);
                      var externalIFaceAvailable = false;
                      try {
                          if (img.loadImg) {
                              externalIFaceAvailable = true;
                          }
                      } catch (exc) {
                          alert("Unavailable due to: " + exc);
                          externalIFaceAvailable = false;
                      }
                      if (externalIFaceAvailable) {
                          img.loadImg(imgSrc, h, w);
                          clearInterval(waitOnFlashIntervalID);
                          loadedCB();
                          var waitForImgLoadedID = setInterval(function () {
                              if (img.isImageLoaded()) {
                                  readyForJSCB();
                                  clearInterval(waitForImgLoadedID);
                              }
                          }, 100);
                      }
                  }, 100);
                }
            },
            show: function () {
                if (img !== null) {
                    img.style.visibility = 'visible';
                }
            },
            hide: function () {
                if (img !== null) {
                  img.style.visibility = 'hidden';
                }
            },
            getContentEl: function () {
                return img;
            },
            getOrigHeight: function () {
                return img.getOriginalHeight();
            },
            getOrigWidth: function () {
                return img.getOriginalWidth();
            },
            getXY: function () {
                return xy;
            },
            getWidth: function () {
                //var w = parseInt(img.getWidth(),10);
                var w;
                try {
                  w = img.getWidth();
                } catch (ex) {
                    w = parseInt(img.width,10);
                }
                return w;
            },
            getHeight: function () {
                var h;
                try {
                  h = img.getHeight();
                } catch (ex) {
                    h = parseInt(img.height,10);
                }
                return h;
            },
            setHeight: function(h) {
                try {
                  img.setHeight(h);
                } catch (ex) {
                    //alert(ex);
                }
            },
            setWidth: function(w) {
                try {
                  img.setWidth(w);
                } catch (ex) {
                    //alert(ex);
                }
            },
            setRelativeXY: function(x,y) {
                if (!isNaN(x) && !isNaN(y)) {
                  try {
                      this.succIdx++;
                      img.setXY(x,y);
                      xy = [x,y];
                  } catch (ex) {
                      printDebug(this.failIdx+"Setpos failed due to: " + ex);
                      this.failIdx++;
                  }
                  //img.style.position = 'relative';
                  //img.style.top = y + "px";
                  //img.style.left = x + "px";
                } else {
                    printDebug(this.failIdx+" XisNAN?" + isNaN(x) + " YisNaN?" + isNaN(y) + " for: " + [x,y]);
                }
            }
        };
    }();
    
    
    var debugMode = false;

    var mainImgUrl = null;
    var newZoomPanelEl = null;
    var zoomPanelID = null;
    var zoomPanel = null;
    var dbgDiv = null;
    
    var mainImgOrigMinX = null;
    var mainImgMinX = 0;
    var mainImgMaxX = 0;
    var mainImgDiv = null;
    var mainImgOrigXY = null;
    var origHeight = null;
    var origWidth = null;

    var navboxImgDivXY = null;
    var navboxImgDiv = null;
    var navboxImgDivH = null;
    var navboxImgDivW = null;
    var navboxImg = null;
    
    var navboxAlphaImgTop;
    var navboxAlphaImgLeft;
    var navboxAlphaImgRight;
    var navboxAlphaImgBottom;
    var navboxBoundingArea;

    var viewportH = 0;
    var viewportW = 0;
    
    var imgX = 0;
    var imgY = 0;
    var scaleFactor = 1;
    
    var offsetX = 0;
    var offsetY = 0;
    
    var dbgKeyboardListener = null;
    
    function printDebug(dbgStr, append) {
      if (debugMode) {
        var dbgEl = document.getElementById(zoomPanelID+"_debug");
        if (append === true) {
            dbgEl.innerHTML += dbgStr;
        } else {
            dbgEl.innerHTML = dbgStr;
        }
      }
    }
    
    function setBoundingBoxes () {
        var navboxControlsTblXY = YAHOO.util.Dom.getXY(zoomPanelID+"_navboxControlsArea");
        navboxImgDivXY = navboxControlsTblXY;
        navboxImgDivXY[1] = navboxImgDivXY[1] + 12;
        navboxImgDivXY[0] = navboxImgDivXY[0]+viewportW - navboxImgDivW - 10;
        YAHOO.util.Dom.setXY(navboxImgDiv, navboxImgDivXY);
        var distXY = mainImgWrapper.getXY();
        //printDebug("MainImgXY: " + distXY);
        var viewPortXY = YAHOO.util.Dom.getXY(mainImgDiv);
        
        var scaleW = navboxImg.width/mainImgWrapper.getWidth();
        //alert(navboxImg.width);
        var distX = -distXY[0] + (mainImgOrigMinX*scaleFactor);
        
        var scaleH = navboxImg.height/mainImgWrapper.getHeight();
        //var distY = viewPortXY[1]-mainImgXY[1];
        var distY = -distXY[1];

        navboxBoundingArea = document.getElementById(zoomPanelID+'_navboxBoundingArea');
        navboxBoundingArea.style.visibility = 'visible';
        navboxBoundingArea.style.top = navboxImgDiv.style.top;
        navboxBoundingArea.style.left = navboxImgDiv.style.left;
        
        var navboxScaleFactor = 1/scaleFactor;
        var newH = Math.round(navboxImgDivH * navboxScaleFactor);
        var newW = Math.round(navboxImgDivW * navboxScaleFactor);
        
        var newDiffX = (distX*scaleW);
        var newX = Math.round(navboxImgDivXY[0] + newDiffX);
        //printDebug("DistX: " + Math.round(distX) + " newW: " + Math.round(newW) + " newX: " + Math.round(newDiffX) + " minX: " + Math.round(mainImgOrigMinX*scaleFactor));
        //printDebug("nvbxDivH: " + navboxImgDivH + " scale: " + [scaleFactor,navboxScaleFactor] + " newH: " + newH);
        var newY = Math.round(navboxImgDivXY[1] + (distY*scaleH) );
        
        YAHOO.util.Dom.setXY(navboxBoundingArea, [newX-2, newY-1]);
        
        // The IE6 box model is a little different from everyone else, so deal with that here
        var ieFudgeFactor = isIEPre7 ? 4 : 0;
        
        navboxBoundingArea.style.height = ((newH-1) + ieFudgeFactor) + 'px';
        navboxBoundingArea.style.minHeight = (1) + 'px';
        navboxBoundingArea.style.width = ((newW-1) + ieFudgeFactor) + 'px';
        
        navboxAlphaImgTop.style.visibility = 'visible';
        YAHOO.util.Dom.setXY(navboxAlphaImgTop, [newX,navboxImgDivXY[1]]);
        navboxAlphaImgTop.style.width = newW + 'px';
        navboxAlphaImgTop.style.height = newY-navboxImgDivXY[1] + 'px';
        
        navboxAlphaImgLeft.style.visibility = 'visible';
        YAHOO.util.Dom.setXY(navboxAlphaImgLeft, [navboxImgDivXY[0],navboxImgDivXY[1]]);
        navboxAlphaImgLeft.style.width = newX-navboxImgDivXY[0] + 'px';
        navboxAlphaImgLeft.style.height = navboxImgDiv.style.height;
        
        navboxAlphaImgRight.style.visibility = 'visible';
        YAHOO.util.Dom.setXY(navboxAlphaImgRight, [newX+newW, navboxImgDivXY[1]]);
        var newAlphaRightW = ((navboxImgDivXY[0]+navboxImgDivW)-(newW+newX));
        if (newAlphaRightW < 0) {
            newAlphaRightW = 0;
        }
        navboxAlphaImgRight.style.width = newAlphaRightW + 'px';
        navboxAlphaImgRight.style.height = navboxImgDiv.style.height;
        
        navboxAlphaImgBottom.style.visibility = 'visible';
        YAHOO.util.Dom.setXY(navboxAlphaImgBottom, [newX, newY+newH]);
        navboxAlphaImgBottom.style.width = newW + 'px';
        var newAlphaBottomH = ((navboxImgDivXY[1]+navboxImgDivH)-(newH+newY));
        if (newAlphaBottomH < 0) {
            newAlphaBottomH = 0;
        }
        navboxAlphaImgBottom.style.height = newAlphaBottomH + 'px';
    }
    
    function initImgInfo () {
        if (mainImgOrigXY == null) {
          // HACK FIXME HACK 
          //   This looks like a ridiculous thing to do... and you know what?
          //   It is... but safari on the mac doesn't report consistent xy coords
          //   across the boundary of having changed the position mode, and thus
          //   we pause for a moment after changing the mode, and then get the coords.
          setTimeout(function () {
            mainImgOrigXY = YAHOO.util.Dom.getXY(mainImgDiv);
            initImgInfo();
          }, 250);
          return;
        }
        if (mainImgWrapper != null) {
            if (origHeight === null) {
                origHeight = mainImgWrapper.getHeight();
                origWidth = mainImgWrapper.getWidth();
                
                zoomImgInternal(0);
                return;
            }
            
            var viewCenterH = (viewportH/2);
            var viewCenterW = (viewportW/2);
            
            var imgCenterH = mainImgWrapper.getHeight()/2.0;
            var imgCenterW = mainImgWrapper.getWidth()/2.0;
            
            imgY = viewCenterH - imgCenterH;
            imgX = viewCenterW - imgCenterW;
            
            if (imgX > 0) {
                mainImgMinX = imgX;
            } else {
                mainImgMinX = 0;
            }

            if (mainImgOrigMinX === null) {
                mainImgOrigMinX = mainImgMinX;
            }
            
            var imgRightNoOffset = imgX + mainImgWrapper.getWidth();
            if (imgRightNoOffset < viewportW) {
                mainImgMaxX = imgRightNoOffset;
            } else {
                mainImgMaxX = viewportW;
            }
            //printDebug("| offsetW: " + offsetW + "imgX: " + imgX + " scale: " + scaleFactor, true);
            
            var imgYPreOffset = imgY;
            var imgXPreOffset = imgX;
            
            imgY += offsetY*scaleFactor;
            imgX += offsetX*scaleFactor;
            
            //printDebug("x,y: " + imgXPreOffset + "," + imgYPreOffset + " cntW: " + containerW + " imgW: " + mainImgWrapper.getWidth() + " offsetW: " + offsetW);
            
            imgY = Math.round(imgY);
            if (imgY > 0) {
                imgY = 0;
            }
            imgX = Math.round(imgX);
            if (imgX > mainImgMinX) {
                imgX = mainImgMinX;
            }
            //printDebug("Orig: " + origWidth + "," + origHeight + " img: " + imgCenterW + "," + imgCenterH + ", ctr: " + viewCenterW + "," + viewCenterH);
            
            var imgRight = imgX + mainImgWrapper.getWidth();
            //printDebug("imgRight: " + imgRight + " mainImgMaxX: " + mainImgMaxX);
            if (imgRight < mainImgMaxX) {
                //imgX = imgX + (origWidth-imgRight) - 1;
                imgX = mainImgMaxX-mainImgWrapper.getWidth();
            }
            var imgBottom = imgY + mainImgWrapper.getHeight();
            if (imgBottom < origHeight) {
                imgY = imgY + (origHeight-imgBottom);
            }
            
            mainImgWrapper.setRelativeXY(imgX, imgY);
            
            setBoundingBoxes();
        }
    }
    
    function zoomImgInternalAbsolute(absZm) {
        if (absZm < 1) {
            scaleFactor = 1;
        } else {
            scaleFactor = absZm;
        }
        var newH = origHeight * scaleFactor;
        var newW = origWidth * scaleFactor;
        mainImgWrapper.setHeight(newH);
        mainImgWrapper.setWidth(newW);
        
        initImgInfo();
    }
    
    function zoomImgInternal (amt) {
        if (amt == 0) {
          scaleFactor = 1;
        } else if (amt > 10) {
          scaleFactor = scaleFactor + .24;
        } else if (amt > 1) {
          scaleFactor = scaleFactor + .14;
        } else if (amt > 0) {
          scaleFactor = scaleFactor + .03;
        } else if (amt < -10) {
          scaleFactor = scaleFactor - .24;
        } else if (amt < -1) {
          scaleFactor = scaleFactor - .14;
        } else {
          scaleFactor = scaleFactor - .03;    
        }
        zoomImgInternalAbsolute(scaleFactor);
    }
    
    function clearZoomWindowInternal(parentDivID) {
        if (newZoomPanelEl !== null) {
            document.getElementById(parentDivID).removeChild(newZoomPanelEl);
            zoomPanel.destroy();
            zoomPanel = null;
            mainImgOrigXY = null;
            origHeight = null;
            origWidth = null;
            mainImgOrigMinX = null;
            scaleFactor = 1;
            offsetX = 0;
            offsetY = 0;
        }
    }

    function showZoomWindowInternal(parentDivID, id, imgSrc, startH, startW, maxH, maxW)
    {
        if (mainImgUrl !== null && imgSrc != mainImgUrl) {
            clearZoomWindowInternal(parentDivID);
        }
        if (zoomPanel === null)
        {
            mainImgUrl = imgSrc;
            var templateData = {
                id: id,
                imgUrl: imgSrc
            };
            var html = new EJS({url: 'js/MicroDZoom/ep_zoom.ejs'}).render(templateData);
            newZoomPanelEl = document.createElement("div");
            newZoomPanelEl.innerHTML = html;
            document.getElementById(parentDivID).appendChild(newZoomPanelEl);
            
            dbgDiv = document.getElementById(id+'_debug');
            
            var imgMaxW = maxW-15;
            var imgMaxH = maxH-75;
            
            viewportH = imgMaxH;
            viewportW = imgMaxW;
            
            zoomPanelID = id;
            
            mainImgDiv = document.getElementById(zoomPanelID + '_mainImgDiv');
            mainImgDiv.style.overflow = 'hidden';
            mainImgDiv.style.width = imgMaxW + "px";
            mainImgDiv.style.height = imgMaxH + "px";

            var maxWinH = maxH;
            var maxWinW = maxW+2;
            zoomPanel = new YAHOO.widget.Panel(id, {
              width: maxWinW+3,
              // (jsight) - 2008/12/22 - Removed as this was causing height calc to be incorrect, and thus centering would fail
              //height: maxWinH,
              fixedcenter: false, 
              constraintoviewport: false, 
              underlay:"shadow", 
              close:true, 
              visible:true, 
              draggable:true,
              zIndex: 100,
              modal: true}
            );
            
            zoomPanel.render(document.body);

            var initFunction = function () {
              var imgPreventDefaultsFunc = function (alphaID) {
                  YAHOO.util.Event.on(alphaID, "dragstart", function (evt) {
                    YAHOO.util.Event.preventDefault(evt);
                  });
                  YAHOO.util.Event.on(alphaID, "mousedown", function (evt) {
                    YAHOO.util.Event.preventDefault(evt);
                  });
              };
                
              var changeNavboxVisiblity = function(newVisibility) {
                  if (navboxImg != null) {
                    navboxImg.style.visibility = newVisibility;
                    navboxBoundingArea.style.visibility = newVisibility;
                    navboxAlphaImgTop.style.visibility = newVisibility;
                    navboxAlphaImgRight.style.visibility = newVisibility;
                    navboxAlphaImgBottom.style.visibility = newVisibility;
                    navboxAlphaImgLeft.style.visibility = newVisibility;
                    if (newVisibility == 'hidden') {
                        mainImgWrapper.hide();
                    } else {
                        mainImgWrapper.show();
                    }
                  }
              };
              zoomPanel.hideEvent.subscribe(function () {
                  changeNavboxVisiblity('hidden');
              });
              zoomPanel.showEvent.subscribe(function () {
                  changeNavboxVisiblity('visible');
              });
              zoomPanel.moveEvent.subscribe(function () {
                  mainImgOrigXY = null;
                  navboxImgDivXY = null;
                  initImgInfo();
              });
              
              YAHOO.util.Event.on('changeQualBtn', 'click', function (evt) {
                  var qualTxt = document.getElementById('qualTxt');
                  var newQual = parseInt(qualTxt.value, 10);
                  var smoothCB = document.getElementById('smoothCB');
                  var newSmooth = smoothCB.checked;
                  mainImgWrapper.getContentEl().setParameters(newQual, newSmooth);
              });
              
              navboxAlphaImgTop = document.getElementById(id+'_navboxAlphaImgTop');
              navboxAlphaImgLeft = document.getElementById(id+'_navboxAlphaImgLeft');
              navboxAlphaImgRight = document.getElementById(id+'_navboxAlphaImgRight');
              navboxAlphaImgBottom = document.getElementById(id+'_navboxAlphaImgBottom');

              var arVersion = navigator.appVersion.split("MSIE")
              var version = parseFloat(arVersion[1])
              isIEPre7 = (version >= 5.5) && (version < 7) && (document.body.filters);
              if (isIEPre7) {
                  navboxAlphaImgTop.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/MicroDZoom/images/alphamask.png', sizingMethod='scale');";
                  navboxAlphaImgTop.src = "js/MicroDZoom/images/blank.gif";

                  navboxAlphaImgLeft.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/MicroDZoom/images/alphamask.png', sizingMethod='scale');";
                  navboxAlphaImgLeft.src = "js/MicroDZoom/images/blank.gif";

                  navboxAlphaImgRight.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/MicroDZoom/images/alphamask.png', sizingMethod='scale');";
                  navboxAlphaImgRight.src = "js/MicroDZoom/images/blank.gif";

                  navboxAlphaImgBottom.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/MicroDZoom/images/alphamask.png', sizingMethod='scale');";
                  navboxAlphaImgBottom.src = "js/MicroDZoom/images/blank.gif";
                  
                  YAHOO.util.Dom.getElementsByClassName('container-close', 'span', zoomPanel.element, function (el) {
                    var fullImgUrl = el.currentStyle.backgroundImage;
                    if (fullImgUrl.toLowerCase().indexOf(".png") != -1) {
                        var justUrl = fullImgUrl.substring(fullImgUrl.indexOf("\"")+1, fullImgUrl.lastIndexOf("\""));
                        el.style.background = "";
                        el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + justUrl + "', sizingMethod='scale');";
                    }
                  });
                  
              }
              var isIE7 = document.body.filters && version == 7;
              // force the silly ie png hacks to not run on these images in ie7, 
              // as they break numerous things
              if (isIE7) {
                navboxAlphaImgTop.setfilter = false;
                navboxAlphaImgTop.src = 'js/MicroDZoom/images/alphamask.png';
                navboxAlphaImgLeft.setfilter = false;
                navboxAlphaImgLeft.src = 'js/MicroDZoom/images/alphamask.png';
                navboxAlphaImgRight.setfilter = false;
                navboxAlphaImgRight.src = 'js/MicroDZoom/images/alphamask.png';
                navboxAlphaImgBottom.setfilter = false;
                navboxAlphaImgBottom.src = 'js/MicroDZoom/images/alphamask.png';
              }

              navboxImgDiv = document.getElementById(id+'_navboxImgDiv');
              navboxImg = document.getElementById(id+'_navboxImg');
              var navBoxScaleFactor = 93/viewportH;
              navboxImgDivH = 93;
              navboxImgDivW = Math.round(viewportW * navBoxScaleFactor);
              navboxImg.style.height = navboxImgDivH + 'px';
              navboxImgDiv.style.height = navboxImgDivH + 'px';
              navboxImgDiv.style.width = navboxImgDivW + "px";
              navboxImg.style.visibility = 'visible';

              var rulerButton = new YAHOO.widget.Button({ 
                      type: "checkbox", 
                      label: "Ruler", 
                      id: "rulerButton", 
                      name: "rulerButtonName", 
                      value: "1", 
                      container: "rulerButtonDiv", 
                      checked: false });

              YAHOO.util.Event.on(id + '_closeButton', 'click', function (evt) {
                  zoomPanel.hide();
              });
              imgPreventDefaultsFunc(id+"_closeButton");

              var zoomButtonIsDown = false;
              var zoomButtonDownTimer = null;
              YAHOO.util.Event.on(id + '_zoomUpButton', "mousedown", function (evt) {
                  zoomButtonIsDown = true;
                  zoomButtonDownTimer = setInterval(function () {
                      if (zoomButtonIsDown) {
                        zoomImgInternal(1);
                      } else {
                        clearInterval(zoomButtonDownTimer);
                      }
                  }, 5);
              });
              imgPreventDefaultsFunc(id+"_zoomUpButton");
              if (dbgKeyboardListener == null) {
                  // for debug purposes... reset to max zoom (with no quality loss) when ctrl-alt-shift-y is pressed
                  var dbgKeyboardListener = new YAHOO.util.KeyListener(document, { alt: true, ctrl:true, shift: true, keys:89 }, function (evt) {
                    var curH = imgMaxH;
                    var curScaledH = mainImgWrapper.getHeight();
                    var origH = mainImgWrapper.getOrigHeight();
                    var newScl = origH/curH;
                    alert("cur scl: " + scaleFactor + " new would be: " + newScl + " curH: " + curH + " cur scaled h: " + curScaledH + " origH: " + origH);
                    zoomImgInternalAbsolute(newScl);
                  } );
                  dbgKeyboardListener.enable();
              }
              
              YAHOO.util.Event.on(id+"_zoomUpButton", "keydown", function (evt) {
                var charCd = YAHOO.util.Event.getCharCode(evt);
                alert(charCd);
              });
              
              
              YAHOO.util.Event.on(id + '_zoomUpButton', "mouseout", function (evt) {
                  zoomButtonIsDown = false;
              });

              var mouseScrollFunction = function(event) {
                  var delta = 0;
                  if (!event) /* For IE. */
                      event = window.event;
                  if (event.wheelDelta) { /* IE/Opera. */
                      delta = event.wheelDelta/120;
                      /** In Opera 9, delta differs in sign as compared to IE.
                       */
                      if (window.opera)
                          delta = -delta;
                  } else if (event.detail) { /** Mozilla case. */
                      /** In Mozilla, sign of delta is different than in IE.
                       * Also, delta is multiple of 3.
                       */
                      delta = -event.detail/3;
                  }
                  
                  if (delta > 0) {
                      zoomImgInternal(delta);
                  } else if (delta < 0) {
                      zoomImgInternal(delta);
                  }
                  YAHOO.util.Event.stopEvent(event);
              };
              YAHOO.util.Event.on(mainImgDiv, "DOMMouseScroll", mouseScrollFunction);
              YAHOO.util.Event.on(mainImgWrapper.getContentEl(), "mousewheel", mouseScrollFunction);
              YAHOO.util.Event.on(mainImgDiv, "mousewheel", mouseScrollFunction);
              
              var zoomOutButtonIsDown = false;
              var zoomOutButtonDownTimer = null;
              YAHOO.util.Event.on(id + '_zoomDownButton', "mousedown", function (evt) {
                  zoomOutButtonIsDown = true;
                  zoomOutButtonDownTimer = setInterval(function () {
                      if (zoomOutButtonIsDown) {
                        zoomImgInternal(-1);
                      } else {
                        clearInterval(zoomOutButtonDownTimer);
                      }
                  }, 5);
              });
              YAHOO.util.Event.on(id + '_zoomDownButton', "mouseout", function (evt) {
                  zoomOutButtonIsDown = false;
              });
              imgPreventDefaultsFunc(id+"_zoomDownButton");

              var dragOrigin = null;
              var dragStarted = false;
              var navBoxDragStarted = false;

              var navboxMouseDownFunc = function (evt) {
                  if (evt.button == 0 || evt.button == 1) {
                    dragOrigin = null;
                    navBoxDragStarted = true;
                    YAHOO.util.Event.stopEvent(evt);
                  }
              };
              var navboxMouseOutFunc = function (evt) {
                  if (evt.button == 0 || evt.button == 1) {
                    var evXY = YAHOO.util.Event.getXY(evt);
                    // these checks are needed as IE sends us mouseout events
                    //  that are extremely misleading
                    if (evXY[0] < navboxImgDivXY[0] || evXY[1] < navboxImgDivXY[1] ||
                        evXY[0] > (navboxImgDivXY[0]+navboxImgDivW) ||
                        evXY[1] > (navboxImgDivXY[1]+navboxImgDivH)
                        ) 
                    {
                        navBoxDragStarted = false;
                    }
                  }
              }
              YAHOO.util.Event.on(id+"_navboxImg", "mousedown", navboxMouseDownFunc);
              YAHOO.util.Event.on(id+"_navboxImg", "mouseout", navboxMouseOutFunc);
              YAHOO.util.Event.on(id+"_navboxBoundingArea", "mousedown", navboxMouseDownFunc);

              YAHOO.util.Event.on(mainImgWrapper.getContentEl(), "mouseover", function (evt) {
                  YAHOO.util.Event.stopEvent(evt);
              });
              YAHOO.util.Event.on(mainImgWrapper.getContentEl(), "mousedown", function (evt) {
                if (evt.button == 0 || evt.button == 1) {
                    dragStarted = true;
                    dragOrigin = null;
                    YAHOO.util.Event.stopEvent(evt);
                }
              });
              YAHOO.util.Event.on(mainImgWrapper.getContentEl(), "mouseout", function (evt) {
                if (evt.button == 0 || evt.button == 1) {
                    dragStarted = false;
                }
              });
              var mouseUpFunc = function (evt) {
                navBoxDragStarted = false;
                dragStarted = false;
                zoomOutButtonIsDown = false;
                zoomButtonIsDown = false;
                dragOrigin = null;
                clearInterval(zoomButtonDownTimer);
                clearInterval(zoomOutButtonDownTimer);
              };
              YAHOO.util.Event.on(document.body, "mouseup", mouseUpFunc);
              YAHOO.util.Event.on(mainImgWrapper.getContentEl(), "mouseup", mouseUpFunc);
              var mouseMoveHandlerFunc = function (evt) {
                var elTarget = YAHOO.util.Event.getTarget(evt);
                var evXY = YAHOO.util.Event.getXY(evt);
                while (elTarget && elTarget.id != id) {
                    //alert(buttonIsDown + " and " + elTarget.id + " and id = " + id);
                    if (dragStarted && elTarget.id == id+"_mainImg") {
                        if (dragOrigin == null) {
                            dragOrigin = evXY;
                        } else {
                            diffX = dragOrigin[0]-evXY[0];
                            diffY = dragOrigin[1]-evXY[1];
                            dragOrigin = evXY;
                            mainImgXY = mainImgWrapper.getXY();
                            
                            newImgXY = [mainImgXY[0]-diffX,mainImgXY[1]-diffY];

                            mainImgWrapper.setRelativeXY(newImgXY[0], newImgXY[1]);

                            imgCenter = [newImgXY[0]+(mainImgWrapper.getWidth()/2),newImgXY[1]+(mainImgWrapper.getHeight()/2)];
                            //canvasCenter = [mainImgOrigXY[0]+(origWidth/2),mainImgOrigXY[1]+(origHeight/2)];
                            canvasCenter = [(viewportW/2),(viewportH/2)];

                            var offsetScaledX = imgCenter[0]-canvasCenter[0];
                            offsetX = offsetScaledX*(1/scaleFactor);

                            var offsetScaledY = imgCenter[1]-canvasCenter[1];
                            offsetY = offsetScaledY*(1/scaleFactor);
                            //printDebug("Offset: " + offsetX + "," + offsetY);
                            //printDebug("newImgXY: " + newImgXY + " and: " + [offsetX,offsetY]);

                            initImgInfo();
                            //alert("MainImg: " + mainImgXY + " diff: " + [diffX,diffY] + " new: " + newImgXY + " offsetScaledX: " + offsetScaledX);
                            //dbgDiv.innerHTML = "canv: " + mainImgOrigXY + " img: " + newImgXY + " ctr: " + imgCenter + " offset: " + [offsetX,offsetY];
                        }
                        YAHOO.util.Event.stopEvent(evt);
                        return;
                    } else if (navBoxDragStarted && 
                        (
                          elTarget.id == id+"_navboxImg" || 
                          elTarget.id == id+"_navboxBoundingArea" ||
                          elTarget.id == id+"_navboxAlphaImgTop" ||
                          elTarget.id == id+"_navboxAlphaImgRight" ||
                          elTarget.id == id+"_navboxAlphaImgBottom" ||
                          elTarget.id == id+"_navboxAlphaImgLeft"
                        )
                     )
                    {
                        if (dragOrigin == null) {
                            dragOrigin = evXY;
                        } else {
                            diffX = dragOrigin[0]-evXY[0];
                            diffY = dragOrigin[1]-evXY[1];

                            var navboxScaleFactorY = viewportH/navboxImgDivH;
                            var navboxScaleFactorX = viewportW/navboxImgDivW;
                            diffX = diffX * navboxScaleFactorX * scaleFactor;
                            diffY = diffY * navboxScaleFactorY * scaleFactor;

                            dragOrigin = evXY;
                            mainImgXY = mainImgWrapper.getXY();
                            newImgXY = [mainImgXY[0]+diffX,mainImgXY[1]+diffY];

                            mainImgWrapper.setRelativeXY(newImgXY[0], newImgXY[1]);

                            imgCenter = [newImgXY[0]+(mainImgWrapper.getWidth()/2),newImgXY[1]+(mainImgWrapper.getHeight()/2)];
                            //canvasCenter = [mainImgOrigXY[0]+(origWidth/2),mainImgOrigXY[1]+(origHeight/2)];
                            canvasCenter = [(viewportW/2),(viewportH/2)];

                            //printDebug("prevXY: " + mainImgXY + " newXY: " + newImgXY + ", imgCtr: " + imgCenter + " " + canvasCenter);

                            var offsetScaledX = imgCenter[0]-canvasCenter[0];
                            offsetX = offsetScaledX*(1/scaleFactor);

                            var offsetScaledY = imgCenter[1]-canvasCenter[1];
                            var previousOffsetY = offsetY;
                            offsetY = offsetScaledY*(1/scaleFactor);

                            //printDebug("OffsetY " + previousOffsetY + ", " + offsetScaledY + ", " + offsetY, true);

                            initImgInfo();
                        }
                        YAHOO.util.Event.stopEvent(evt);
                        return;
                    } else {
                        elTarget = elTarget.parentNode;
                    }
                }
              };

              YAHOO.util.Event.on(id, "mousemove", mouseMoveHandlerFunc);
              imgPreventDefaultsFunc(id+"_navboxAlphaImgTop");
              imgPreventDefaultsFunc(id+"_navboxAlphaImgRight");
              imgPreventDefaultsFunc(id+"_navboxAlphaImgBottom");
              imgPreventDefaultsFunc(id+"_navboxAlphaImgLeft");
              imgPreventDefaultsFunc(id+"_navboxImg");

              var navChangeMouseDown = false;
              var navChangeMouseInterval = null;
              var clearNavChangeMouseInterval = function () {
                navChangeMouseDown = false;
                if (navChangeMouseInterval != null) {
                  clearInterval(navChangeMouseInterval);
                  navChangeMouseInterval = null;
                }
              };
              YAHOO.util.Event.on(document.body, "mouseup", function (evt) {
                  clearNavChangeMouseInterval();
              });
              var setNavChangeMouseEvents = function (id, moveFunc) {
                  YAHOO.util.Event.on(id, "mousedown", function() {
                    clearNavChangeMouseInterval();
                    dragOrigin = null;
                    navChangeMouseDown = true;
                    navChangeMouseInterval = setInterval(function () {
                        if (navChangeMouseDown) {
                          moveFunc();
                          initImgInfo();
                        } else {
                            clearNavChangeMouseInterval();
                        }
                    }, 1);
                  });
                  YAHOO.util.Event.on(id, "mouseout", function () {
                    clearNavChangeMouseInterval();
                  });
              };

              var resetFunction = function () {
                var resetIntervalID = null;
                resetIntervalID = setInterval(function () {
                    zoomImgInternal(-11);
                    function moveTowardsZero(offset) {
                        if (offset == 0) { return offset; }
                        else if (offset < 0) { return offset+1; }
                        else if (offset > 0) { return offset-1; }
                    }
                    offsetX = moveTowardsZero(offsetX);
                    offsetY = moveTowardsZero(offsetY);
                    if (scaleFactor <= 1) {
                        offsetX = 0;
                        offsetY = 0;
                        clearInterval(resetIntervalID);
                    }
                }, 10);
              };

              YAHOO.util.Event.on(id+"_resetButton", "click", resetFunction);
              imgPreventDefaultsFunc(id+"_resetButton");
              
              zoomPanelDiv = document.getElementById(zoomPanelID);
          };
          var resizeAfterInitFunc = function () {
              var aspectRatio = mainImgWrapper.getOrigHeight()/mainImgWrapper.getOrigWidth();
              var newW = mainImgWrapper.getWidth();
              if (mainImgWrapper.getOrigWidth() > imgMaxW) {
                  newW = imgMaxW;
              }
              if (mainImgWrapper.getOrigWidth() < imgMaxW) {
                  newW = imgMaxW;
              }
              //alert("Should set Height to: " + mainImgWrapper.getWidth() + " * " + aspectRatio);
              //alert("aspect: " + aspectRatio + " width: " + mainImg.width + " result: " + (mainImg.width*aspectRatio));
              var newH = newW*aspectRatio;
              
              if (newH > imgMaxH) {
                  newH = imgMaxH;
                  newW = imgMaxH/aspectRatio;
              }
              
              var newNavboxImgH = (navboxImgDivH/newH) * newH;
              var newNavboxImgW = newNavboxImgH/aspectRatio;
              navboxImg.style.width = newNavboxImgW + 'px';
              navboxImg.style.height = (newNavboxImgH-2) + 'px';
              
              var navboxDivCtrX = navboxImgDivW/2;
              var navboxImgX = navboxDivCtrX - (newNavboxImgW/2);
              navboxImg.style.position = 'relative';
              navboxImg.style.left = navboxImgX + 'px';
              
              //alert("Setting wh to: " + newW + "," + newH + " new navbox ImgH: " + newNavboxImgH);
              mainImgWrapper.setWidth(newW);
              mainImgWrapper.setHeight(newH);
              
              initImgInfo();
          };
          mainImgWrapper.init(initFunction, resizeAfterInitFunc, zoomPanelID + '_mainImgDiv', zoomPanelID + '_mainImg', imgSrc, maxH, imgMaxW);
        } else {
            zoomPanel.show();
        }
        if (zoomPanel != null) {
          zoomPanel.center();
        }
    }

    return {
        zoomImg: function (amt) {
            zoomImgInternal(amt);
        },
        
        reinitZoomWindow: function(parentDivID, id, imgSrc, startH, startW, maxH, maxW)
        {
            clearZoomWindowInternal(parentDivID);
            showZoomWindowInternal(parentDivID, id, imgSrc, startH, startW, maxH, maxW);
        },
        
        showZoomWindow: function(parentDivID, id, imgSrc, startH, startW, maxH, maxW)
        {
            showZoomWindowInternal(parentDivID, id, imgSrc, startH, startW, maxH, maxW);
        }
    }
} ();
