jQuery.fn.ytZoomify = function(settings)
{
    settings = jQuery.extend({
        magnifyWidth:  50,
        magnifyHeight: 50,
        magnifyGlass: true ,
        magnifyTV:    true,
        magnifyTVWidth: 150,
        magnifyTVHeight: 150,
        loading: "/lib/gallerydirectart/loading.gif" // this needs to be changed every time
    }, settings);

    function findPosX(obj) {
      var curLeft = 0;
      if (obj.offsetParent) {
        do {
          curLeft += obj.offsetLeft;
        } while (obj = obj.offsetParent);
      }
      else if (obj.x) {
        curLeft += obj.x;
      }
      return curLeft;
    }

    function findPosY(obj) {
      var curTop = 0;
      if (obj.offsetParent) {
        do {
          curTop += obj.offsetTop;
        } while (obj = obj.offsetParent);
      }
      else if (obj.y) {
        curTop += obj.y;
      }
      return curTop;
    }

    this.each( function() {
        //jQuery(this).addClass("ytZoomify");
        
        //this.carEnabled = true;
        //this.carWidth = settings["width"];
        if (this.nodeName == "A")
        {
            var img = jQuery(this).find("img");
            if (img)
            {
                // this is done so that positioning of the original image can be retained (left, right, center).
                if (jQuery("table._tWrap").length==0)
                {
                    jQuery(this).wrap("<table border=0 cellpadding=0 cellspacing=0 style='height: " + jQuery(img).attr("height") + "px" + "' class=_tWrap><tr><td></td></tr></table>");
                }
                
                // dimensions of the displayed image
                var h0 = img[0].height;
                var w0 = img[0].width;
                jQuery(this).css("position","relative")
                            .css("width", w0 + "px")
                            .css("height", h0 + "px")
                            .css("display", "block");

                var bgImageLoaded = false;
                                            
                // create the magnifying glass
                jQuery(this).find("div._m").remove();
                var magnifyGlass = jQuery("<div class=_m></div>");
                magnifyGlass.css("width", settings["magnifyWidth"] + "px")
                            .css("height", settings["magnifyHeight"] + "px")
                            .css("border","1px solid black")
                            .css("top","0px")
                            .css("left","0px")
                            .css("background","transparent")
                            .css("display", "none")
                            .css("position","absolute")
                            .css("background-image","url(" + settings["loading"] + ")")
                            .css("background-position", "50% 50%")
                            .css("background-color", "white")
                            .css("background-repeat", "no-repeat");
                jQuery(this).append(magnifyGlass);

                // find the large image
                var largeImg = new Image();
                largeImg.src = this.href;
                var H = largeImg.height;
                var W = largeImg.width;
                jQuery(largeImg).load( function() {
                    if (!bgImageLoaded)
                    {
                        H = largeImg.height;
                        W = largeImg.width;
                        bgImageLoaded = true;
                    }
                });
                
                jQuery(this).mousemove( function(e) {
                    jQuery(this).find("img").css("opacity",".70")
                                            .css("filter","alpha(opacity=70)")
                                            .css("-moz-opacity", ".70");
                    var isIE = !window.opera && navigator.userAgent.indexOf('MSIE') != -1;
                    
                    var mX, mY;
                    if (e.pageX && e.pageY) {
                        mX = e.pageX;
                        mY = e.pageY;
                    } else if (e.clientX && e.clientY) {
                    mX = e.clientX;
                        mY = e.clientY;
                        if (isIE) {
                          mX += document.body.scrollLeft;
                          mY += document.body.scrollTop;
                        }
                    }

                    // current cursor coordinates
                    var xPos = mX - findPosX(this);
                    var yPos = mY - findPosY(this);
                    
                    jQuery("#debugger").html( xPos + ", " + yPos);
                    // magnifying glass coordinates
                    var mPosX = xPos - settings["magnifyWidth"]/2;
                    var mPosY = yPos - settings["magnifyHeight"]/2;
                    if (mPosX < 0) mPosX = 0;
                    if (mPosY < 0) mPosY = 0;
                    if (mPosX > w0 - settings["magnifyWidth"]) mPosX = w0 - settings["magnifyWidth"];
                    if (mPosY > h0 - settings["magnifyHeight"]) mPosY = h0 - settings["magnifyHeight"];
                    
                    var magnifyingGlass = jQuery(this).find("div._m");
                    if (magnifyingGlass.length > 0)
                    {
                        if (settings["magnifyGlass"])
                        {
                            var mPosX1 = (W * xPos) / w0 - settings["magnifyWidth"]/2;
                            var mPosY1 = (H * yPos) / h0 - settings["magnifyHeight"]/2;
                            if (mPosX1 > W - settings["magnifyWidth"]) mPosX1 = W - settings["magnifyWidth"];
                            if (mPosY1 > H - settings["magnifyHeight"]) mPosY1 = H - settings["magnifyHeight"];
   
                            if (largeImg && (true || largeImg.complete))
                            {
                                magnifyingGlass.css("background-image","url(" + largeImg.src + ")")
                                               .css("background-position", (-1 * mPosX1 + "px") + " " + (-1 * mPosY1 + "px"));
                            }
                        }
                        else
                        {
                            var img = jQuery(this).find("img");
                            if (img.length > 0)
                            {
                                magnifyingGlass.css("background-image","url(" + img[0].src + ")")
                                               .css("background-position", (-1 * mPosX + "px") + " " + (-1 * mPosY + "px"));
                            }
                        }
                        magnifyingGlass.css("left", mPosX + "px")
                                       .css("top", mPosY + "px")
                                       .show();
                    }

                    if (settings["magnifyTV"])
                    {
                        var mPosX2 = (W * xPos) / w0 - settings["magnifyTVWidth"] / 2;
                        var mPosY2 = (H * yPos) / h0 - settings["magnifyTVHeight"] / 2;
                        if (mPosX2 < 0) mPosX2 = 0;
                        if (mPosY2 < 0) mPosY2 = 0;
                        if (mPosX2 > W - settings["magnifyTVWidth"]) mPosX2 = W - settings["magnifyTVWidth"];
                        if (mPosY2 > H - settings["magnifyTVHeight"]) mPosY2 = H - settings["magnifyTVHeight"];

                        
                        if (largeImg && largeImg.complete)
                        {
                            jQuery("#magnifyTV").css("background-image","url(" + largeImg.src + ")")
                                                .css("background-position", (-1 * mPosX2 + "px") + " " + (-1 * mPosY2 + "px"))
                                                .css("z-index",3000);
                        }
                    }
                });
                
                jQuery(this).mouseover( function() {
                    if (settings["magnifyTV"])
                    {
                        var TV = jQuery("<div id=magnifyTV></div");
                        TV.css("width", settings["magnifyTVWidth"] + "px")
                          .css("height", settings["magnifyTVHeight"] + "px")
                          .css("border", "1px solid silver");
                        jQuery(this).append(TV);
                    }
                });
                
                jQuery(this).mouseout( function() {
                    jQuery("#magnifyTV").remove();
                    jQuery(this).find("div._m").hide();
                    jQuery(this).find("img").css("opacity","1")
                                            .css("filter","alpha(opacity=100)")
                                            .css("-moz-opacity", "1");

                });
            }
        }
    });
}
