/*
	WAZoom v1.0
	Copyright (c) 2007 Wild Attire, Inc.
	
	Written by Adam Heller
	
	This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License
 	For more information, visit the License's site at http://creativecommons.org/licenses/by-nc-sa/3.0/
*/

/*
	Relies on prototype.js
	
		prototype dependency can be removed without too much of a headache by
		removing / replacing all Event.* calls with your own methods.
*/

function WAZoom_init()
{
	var wazs = getElementsByClassName( document, 'WAZoom' );
	for( var i = 0; i < wazs.length; i++ )
	{
		var waz = wazs[i];
		waz.moveLR = true;
		waz.moveUD = true;
		
		waz.innerDiv = getElementsByClassName( waz, 'innerContainer' )[0] || null;
		waz.bigImage = waz.innerDiv.getElementsByTagName( 'img' )[0] || null;
		
		waz.smallImage = waz.getElementsByTagName( 'img' )[0] || null;
		waz.smallImage = ( waz.smallImage == waz.bigImage ) ? null : waz.smallImage;
		
		// do not setup Zoom if structure is incorrect
		if(	( waz.smallImage == null ) ||
			( waz.innerDiv == null ) ||
			( waz.bigImage == null )	)
		{
			continue;
		}
		
		waz.borderTop = parseInt( getStyle( waz, "border-top-width" ) );
		waz.borderLeft = parseInt( getStyle( waz, "border-left-width" ) );

		// reset individual innerDiv size for smaller zoomed images
		//		if reset, do not move when moused over
		if( waz.bigImage.offsetWidth < waz.innerDiv.offsetWidth )
		{
			waz.innerDiv.style.width = waz.bigImage.offsetWidth + waz.borderLeft * 2 + "px";
			waz.moveLR = false;
		}
		if( waz.bigImage.offsetHeight < waz.innerDiv.offsetHeight )
		{
			waz.innerDiv.style.height = waz.bigImage.offsetHeight + waz.borderTop * 2 + "px";
			waz.moveUD = false;
		}
		
		waz.ratioX = waz.bigImage.offsetWidth / waz.smallImage.offsetWidth;
		waz.ratioY = waz.bigImage.offsetHeight / waz.smallImage.offsetHeight;
		waz.panBoxX = waz.innerDiv.offsetWidth / waz.ratioX;
		waz.panBoxY = waz.innerDiv.offsetHeight / waz.ratioY;
		
		waz.panBox = document.createElement( 'div' );
		waz.panBox.className = "panBox";
		waz.panBox.style.width = waz.panBoxX + "px";
		waz.panBox.style.height = waz.panBoxY + "px";
		
		waz.insertBefore( waz.panBox, waz.smallImage );

		var pos = findPos( waz.smallImage );
		waz.topmost = Math.ceil( ( waz.panBoxY / 2 ) + pos[1] );
		waz.leftmost = Math.ceil( ( waz.panBoxX / 2 ) + pos[0] );
		waz.bottommost = Math.floor( waz.smallImage.offsetHeight - ( waz.panBoxY / 2 ) + pos[1] );
		waz.rightmost = Math.floor( waz.smallImage.offsetWidth - ( waz.panBoxX / 2 ) + pos[0] );

		waz.smallImage.onmouseover = function() { zoom( this ) };
		waz.smallImage.onmouseout = function( event ) { if( !inWazObj( event ) ) unzoom( this ) }; // just in case 
		waz.panBox.onmouseout = function( event ) { if( !inWazObj( event ) ) unzoom( this ) };

		/*
			alert( 
			"waz.ratio: " + waz.ratio + "\n" + 
			"waz.panBoxX: " + waz.panBoxX + "\n" + 
			"waz.panBoxY: " + waz.panBoxY + "\n" + 
			"waz.topmost: " + waz.topmost + "\n" + 
			"waz.leftmost: " + waz.leftmost + "\n" + 
			"waz.bottommost: " + waz.bottommost + "\n" + 
			"waz.rightmost: " + waz.rightmost + "\n"
			);
		*/

		waz.ie6kludge = false;
		waz.ie7kludge = false;
		if( navigator.appVersion.indexOf( 'MSIE' ) != -1 )
		{
			if( parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) == 6 )
			{
				waz.ie6kludge = true;
				//alert( 'ie6kludge' );
			}
			else if( parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) == 7 )
			{
				waz.ie7kludge = true;
				//waz.paddingLeft = parseInt( getStyle( waz, 'paddingLeft' ) );
				//alert( 'ie7kludge' );
			}
		}

	}
}

function zoom( obj )
{
	var waz = getWazObj( obj );
	
	waz.style.zIndex = 200;

	waz.innerDiv.style.visibility = 'visible';
	waz.panBox.style.visibility = 'visible';
	
	Event.observe( waz.smallImage, 'mousemove', panImageWindow );
	Event.observe( waz.panBox, 'mousemove', panImageWindow );
	
}

function unzoom( obj )
{
	var waz = getWazObj( obj );

	waz.style.zIndex = 100;

	waz.innerDiv.style.visibility = 'hidden';
	waz.panBox.style.visibility = 'hidden';

	Event.stopObserving( waz.smallImage, 'mousemove', panImageWindow );
	Event.stopObserving( waz.panBox, 'mousemove', panImageWindow );
		
}

function panImageWindow( event )
{

	var e = event || window.event;
	var waz = getWazObj( Event.element( event ) );

	var posx, posy;

	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}

	// left-right movement calculations
	if ( !waz.moveLR || posx <= waz.leftmost )
	{
		waz.bigImage.style.left = "0px";
		if( waz.ie6kludge || waz.ie7kludge )
			waz.panBox.style.left = "0px";
		//else if( waz.ie7kludge )
		//	waz.panBox.style.left = waz.smallImage.offsetLeft - waz.paddingLeft + "px";
		else
			waz.panBox.style.left = waz.smallImage.offsetLeft - waz.borderLeft + "px";
	}
	else if( posx > waz.leftmost && posx < waz.rightmost )
	{
		waz.bigImage.style.left = ( waz.leftmost - posx ) * waz.ratioX + "px";
		if( waz.ie6kludge || waz.ie7kludge )
			waz.panBox.style.left = posx - waz.leftmost + "px";
		//else if( waz.ie7kludge )
		//	waz.panBox.style.left = posx - waz.leftmost + waz.smallImage.offsetLeft - waz.paddingLeft + "px";
		else
			waz.panBox.style.left = posx - waz.leftmost + waz.smallImage.offsetLeft - waz.borderLeft + "px";
	}
	else
	{
		waz.bigImage.style.left = waz.innerDiv.offsetWidth - waz.bigImage.offsetWidth + "px";
		if( waz.ie6kludge || waz.ie7kludge )
			waz.panBox.style.left = waz.smallImage.offsetWidth - waz.panBoxX + "px";
		//else if( waz.ie7kludge )
		//	waz.panBox.style.left = waz.smallImage.offsetWidth - waz.panBoxX + waz.smallImage.offsetLeft - waz.paddingLeft + "px";
		else
			waz.panBox.style.left = waz.smallImage.offsetWidth - waz.panBoxX + waz.smallImage.offsetLeft - waz.borderLeft + "px";
	}
	
	// up-down movement calculations
	if( !waz.moveUD || posy <= waz.topmost )
	{
		waz.bigImage.style.top = "0px";
		waz.panBox.style.top = waz.smallImage.offsetTop - waz.borderTop + "px";
	}
	else if( posy > waz.topmost && posy < waz.bottommost )
	{
		waz.bigImage.style.top = ( waz.topmost - posy ) * waz.ratioY + "px";
		waz.panBox.style.top = posy - waz.topmost + waz.smallImage.offsetTop - waz.borderTop + "px";
	}
	else
	{
		waz.bigImage.style.top = ( waz.topmost - waz.bottommost ) * waz.ratioY + "px";
		waz.panBox.style.top = waz.bottommost - waz.topmost + waz.smallImage.offsetTop - waz.borderTop + "px";
	}

}

function getWazObj( obj )
{
	var re = new RegExp('\\bWAZoom\\b');
	
	while( obj.nodeName != 'HTML' )
	{
		if( re.test( obj.className ) )
			return obj;
		obj = obj.parentNode;
	}
	return null;
}

function inWazObj( event )
{
	var e = event || window.event;
	var rel = e.relatedTarget || e.toElement;
	
	if( rel.nodeName == 'HTML' )
		return false;
		
	var waz = getWazObj( rel.parentNode );
	
	if(	( waz != null ) &&
		( waz == getWazObj( Event.element( e ) ) ) 	)
		
		return true;
		
	return false;
}


