/*
* MojoMagnify 0.1.2 - JavaScript Image Magnifier
* Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
* MIT License [http://www.opensource.org/licenses/mit-license.php]
*/


var MojoMagnify = (function() {

var $ = function(id) {return document.getElementById(id);};
var dc = function(tag) {return document.createElement(tag);};

function addEvent(oElement, strEvent, fncHandler)
{
var fncEvent = function(e) {
return fncHandler(e||window.event);
}
if (oElement.addEventListener) {
oElement.addEventListener(strEvent, fncEvent, false);
} else if (oElement.attachEvent) {
oElement.attachEvent("on" + strEvent, fncEvent);
}
}

function getElementPos(oElement)
{
var x = oElement.offsetLeft;
var y = oElement.offsetTop;
var oParent = oElement.offsetParent;
while (oParent) {
x += oParent.offsetLeft;
y += oParent.offsetTop;
oParent = oParent.offsetParent;
}
return {
x : x,
y : y
}
}

function getEventMousePos(oElement, e) {
var iScrollX = document.body.scrollLeft || document.documentElement.scrollLeft;
var iScrollY = document.body.scrollTop || document.documentElement.scrollTop;

if (e.currentTarget) {
var oElPos = getElementPos(oElement);
return {
x : e.clientX - oElPos.x + iScrollX,
y : e.clientY - oElPos.y + iScrollY
}

}

return {
x : e.offsetX,
y : e.offsetY
}
}

function isIE() { // sorry
return !!document.all && !!window.attachEvent && !window.opera;
}

function makeMagnifiable(oImg, strZoomSrc) {

var iWidth = oImg.offsetWidth;
var iHeight = oImg.offsetHeight;

var oOldParent = oImg.parentNode;
if (oOldParent.nodeName != "A") {
var oLinkParent = dc("a");
//oLinkParent.setAttribute("href", strZoomSrc);    // LEVI's change for take out the pageload on zoom
oOldParent.replaceChild(oLinkParent, oImg);
oLinkParent.appendChild(oImg);
} else {
var oLinkParent = oOldParent;
}

oLinkParent.style.position = "relative";
oLinkParent.style.display = "block";
oLinkParent.style.width = iWidth+"px";
oLinkParent.style.height = iHeight+"px";

var oZoom = dc("div");
oZoom.className = "mojomagnify_zoom";

var oZoomImg = dc("img");
oZoomImg.className = "mojomagnify_img";
oZoomImg.style.position = "absolute";

var oParent = oImg.parentNode;
oZoom.appendChild(oZoomImg);

var oCtr = dc("div");
oCtr.style.position = "absolute";
oCtr.style.left = "0px";
oCtr.style.top = "0px";
oCtr.style.width = iWidth+"px";
oCtr.style.height = iHeight+"px";
oCtr.style.overflow = "hidden";
oCtr.style.display = "none";

oCtr.appendChild(oZoom);
oParent.appendChild(oCtr);

var oZoomBorder = dc("div");
oZoomBorder.className = "mojomagnify_border";
oZoom.appendChild(oZoomBorder);

var oZoomInput = oParent;

addEvent(oZoomImg, "load", function() {

var fncMouseOut =
function(e) {
var oTarget = e.target || e.srcElement;
if (!oTarget) return;
if (oTarget.nodeName != "DIV") return;
var oRelated = e.relatedTarget || e.toElement;
if (!oRelated) return;
while (oRelated != oTarget && oRelated.nodeName != "BODY" && oRelated.parentNode) {
oRelated = oRelated.parentNode;
}
if (oRelated != oTarget) {
oCtr.style.display = "none";
}
};

addEvent(oCtr, "mouseout", fncMouseOut);
addEvent(oCtr, "mouseleave", fncMouseOut);

addEvent(oZoomInput, "mousemove",
function(e) {
oCtr.style.display = "block";

var oPos = getEventMousePos(oZoomInput, e);

if (e.srcElement && isIE()) {
if (e.srcElement == oZoom) return;
if (e.srcElement != oZoomInput) {
var oZoomImgPos = getElementPos(e.srcElement);
var oImgPos = getElementPos(oImg);
oPos.x -= (oImgPos.x - oZoomImgPos.x);
oPos.y -= (oImgPos.y - oZoomImgPos.y);
}
}

var x = e.clientX - (getElementPos(oImg).x - (document.body.scrollLeft||document.documentElement.scrollLeft));
var y = e.clientY - (getElementPos(oImg).y - (document.body.scrollTop||document.documentElement.scrollTop));

var iMaskWidth = oZoom.offsetWidth;
var iMaskHeight = oZoom.offsetHeight;

var iLeft = oPos.x - iMaskWidth/2;
var iTop = oPos.y - iMaskHeight/2;

oZoom.style.left = iLeft + "px";
oZoom.style.top = iTop + "px";

var fZoomXRatio = oZoomImg.offsetWidth / iWidth;
var fZoomYRatio = oZoomImg.offsetHeight / iHeight;

var iZoomX = Math.round(x * fZoomXRatio);
var iZoomY = Math.round(y * fZoomYRatio);

oZoomImg.style.left = -iZoomX + iMaskWidth/2 + "px";
oZoomImg.style.top = -iZoomY + iMaskWidth/2 + "px";
}
);
});

oZoomImg.src = strZoomSrc;

}

function init() {
var aImages = document.getElementsByTagName("img");
var aImg = [];
for (var i=0;i<aImages.length;i++) {
aImg.push(aImages[i]);
}
for (var i=0;i<aImg.length;i++) {
var oImg = aImg[i];
var strZoomSrc = oImg.getAttribute("data-magnifysrc");

if (strZoomSrc) {
makeMagnifiable(oImg, strZoomSrc);
}
}
}


return {
addEvent : addEvent,
init : init,
makeMagnifiable : makeMagnifiable
};

})();

MojoMagnify.addEvent(window, "load", MojoMagnify.init);

