/**
 * Midland Computers e-Commerce engine - ajax javascript
 * Written by Neil Williams neil.williams at midlandcomputers spam prevention co.uk
 *
 * 
 *
 */

// Browser specific XmlHttpRequest Object
function getXmlHttpRequestObject()
{
	if( window.XMLHttpRequest )
	{
		return new XMLHttpRequest(); // Not IE
	}
	else if( window.ActiveXObject )
	{
		return new ActiveXObject( "Microsoft.XMLHTTP" ); // IE
	}

	return false;
}

/* Simple and effective way to use AJAX - without the X.
 * Changes the contents of objID to that returned by fetching url.
 */
function ajaxBasic( objID, url )
{
	var obj = document.getElementById(objID);

	if( req = getXmlHttpRequestObject() )
	{
		req.open( "GET", url );
		req.onreadystatechange = function(){
			if (req.readyState == 4 && req.status == 200)
			{
				obj.innerHTML = req.responseText;
			}
		}

		req.send(null);
	}
}


/* The following is inspired by:

Image Cross Fade Redux
Version 1.0
Last revision: 02.15.2006
steve@slayeroffice.com

 */

function banner_animate()
{
	var bannercontainers = getElementsByClassName( document, 'div', 'bannercontainer');
	var bannercontainerimgs = new Array();

	for( var index = 0; index < bannercontainers.length; index++ )
	{
		var item = bannercontainers[index];
		a = item.id;

		var imgs = item.getElementsByTagName("img");
		if( imgs.length > 1 )
		{
			for( var imgindex = 1; imgindex < imgs.length; imgindex++ )
			{
				imgs[imgindex]._Opacity = 0;
				imgs[imgindex].style.display='none';
				imgs[imgindex].style.position='absolute';
				imgs[imgindex].style.top = imgs[0].style.top;
				imgs[imgindex].style.left = imgs[0].style.left;
			}

			imgs[0]._Opacity = 1;
			imgs[0].style.display='block';

			var current = 0;

			// Use this function to force a copy of the point to imgs to be made which
			// is then passed to the Closure function.
			banner_bootstrap( imgs, item );
		}
	}
}

function banner_bootstrap( imgs, container )
{
	setTimeout( function(){var newimgs = copyArray(imgs); banner_fade(newimgs,0,container);}, 2000 );	// time to hold the first image in ms.
}

function banner_fade(imgs, current, container)
{
	var currentImg = imgs[current];
	var nextIndex = (imgs[current+1]?current+1:0);
	var nextImg = (imgs[current+1]?imgs[current+1]:imgs[0]);

	if( currentImg._Opacity==undefined )
	{
		currentImg._Opacity = 1;
	}

	if( nextImg._Opacity==undefined )
	{
		nextImg._Opacity = 0;
	}
	currentImg._Opacity -= 0.05;
	nextImg._Opacity += 0.05;

	nextImg.style.display = "block";
	setOpacity( currentImg, currentImg._Opacity );
	setOpacity( nextImg, nextImg._Opacity );

	var banneranchors = container.getElementsByTagName( 'a' );
	if( banneranchors.length > 0 )
	{
		banneranchors[0].setAttribute('href', nextImg.getAttribute('mceelink'));
	}

	if( currentImg._Opacity <= 0 )
	{
		currentImg.style.display = "none";
		setTimeout( function(){banner_fade(imgs,nextIndex,container)}, 3000 + Math.floor(2000 * (Math.random() % 1)) );	// time to hold an image in ms.
	}
	else
	{
		setTimeout( function(){banner_fade(imgs,current,container)}, 50 );		// fade rate.
	}
}

function setOpacity( obj, opacity )
{
	obj.style.opacity = opacity;
	obj.style.MozOpacity = opacity;
	obj.style.filter = "alpha(opacity=" + (opacity*100) + ")";
}

/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Joe Homs | http://bitshaker.com/ */
function getElementsByClassName(oElm, strTagName, strClassName){
  var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	 var arrReturnElements = new Array();
	 strClassName = strClassName.replace(/\-/g, "\\-");
	 var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	 var oElement;
	 for(var i=0; i<arrElements.length; i++){
	   oElement = arrElements[i];
	   if(oRegExp.test(oElement.className)){
		 arrReturnElements.push(oElement);
	   }
	 }
	 return (arrReturnElements)
}

//
function copyArray(a)
{
	newarray = new Array();
	for( var i = 0; i < a.length; i++ )
	{
		newarray[i]=a[i];
	}
	return newarray;
}

/* */

// Item page image zoom. Inspired by MapBlaster.

var itemImageZoomLargeSmallRatio = 0;

// Setup
function itemImageZoom( item, index, x, y )
{
	var imagesdiv = document.getElementById('item_image');
	var zoomdiv = document.getElementById('item_image_zoom');

	zoomdiv.innerHTML = "";
	zoomdiv.style.textAlign = "center";

	Effect.SlideUp(imagesdiv, { duration: 0.5, queue: 'end'});

	var clipwidth = 250;
	var clipheight = 200;
	var smallImgWidth = 250;
	var smallImgHeight = 200;

	wspacing = Math.floor((x-clipwidth)/2)
	hspacing = Math.floor((y-clipheight)/2)

	cliptop = 0 + hspacing;
	clipbottom = 0 + clipheight + hspacing;
	clipleft = 0 + wspacing;
	clipright = 0 + clipwidth + wspacing;
	clippoints = "rect("+cliptop+"px, "+clipright+"px, "+clipbottom+"px, "+clipleft+"px)";

	var whitediv = document.createElement('div');
	whitediv.style.width = "250px";
	whitediv.style.height = "200px";
	whitediv.style.backgroundColor = "#fff";
	whitediv.id = "itemZoomwhitediv";
	zoomdiv.appendChild( whitediv );

	var largediv = document.createElement('div');
	largediv.style.width = "250px";
	largediv.style.height = "200px";
	largediv.style.top = whitediv.style.top;
	largediv.style.position = "absolute";
	largediv.id = "itemZoomlargediv";
	zoomdiv.appendChild( largediv );

	var breakelement = document.createElement('br');
	zoomdiv.appendChild( breakelement );

	largediv.style.clip = clippoints;

	var largeimage = document.createElement('img');
	largeimage.src = "imageitem.php?i="+ item +"&x="+ index +"&w="+ x +"&h="+ y +"&q=80";
	largediv.appendChild( largeimage );

	var smallimage = document.createElement('img');
	smallimage.src = "imageitem.php?i="+ item +"&x="+ index +"&w="+ smallImgWidth +"&h="+ smallImgHeight +"&q=80";
	smallimage.id = "itemZoomSmall";
	zoomdiv.appendChild( smallimage );

	zoomdiv.style.visibility='hidden';
	zoomdiv.style.display='block';

	// Position view.
	whitedivpos = getObjCoords(whitediv);
	itemdivpos = getObjCoords(document.getElementById("item"));
	// No, I don't like this either. Safari, Mozilla, Opera disagree with IE.
	var iePosFix = 0;
	if((navigator.appName == "Microsoft Internet Explorer") )
	{
		iePosFix = 275;
	}
	largediv.style.left = (whitedivpos.x - itemdivpos.x - wspacing) + "px"; 
	largediv.style.top = (whitedivpos.y - itemdivpos.y - hspacing - iePosFix) + "px";

	// Close button
	var closecentre = document.createElement('center');

	var closelink = document.createElement('a');
	closelink.href = "javascript:itemImageZoomClose();";
	closelink.innerHTML = "close";
	closecentre.appendChild( closelink );
	zoomdiv.appendChild( closecentre );

	zoomdiv.style.display='none';
	zoomdiv.style.visibility = "visible";

	Effect.SlideDown(zoomdiv, { duration: 0.5, queue: 'end'});

	smallimage.onmousemove = itemImageZoomMove;

	itemImageZoomLargeSmallRatio = x/smallImgWidth;
	var itemImageZoomLargeSmallRatioY = y/smallImgHeight;
	if( itemImageZoomLargeSmallRatioY > itemImageZoomLargeSmallRatio )
	{
		itemImageZoomLargeSmallRatio = itemImageZoomLargeSmallRatioY;
	}
}

function itemImageZoomMove(e)
{
	// Opera provide both event details, only one will work.
	if( document.attachEvent && !(navigator.userAgent.indexOf('Opera') != -1) )
	{
		pointX = event.x;
		pointY = event.y;
	}
	else
	{	
		pointX = parseInt( e.pageX );
		pointY = parseInt( e.pageY );
	}

	var clipwidth = 250;
	var clipheight = 200;

	smallimagepos = getObjCoords(document.getElementById("itemZoomSmall"));
	itemdivpos = getObjCoords(document.getElementById("item"));
	whitedivpos = getObjCoords(document.getElementById("itemZoomwhitediv"));
	largediv = document.getElementById("itemZoomlargediv");

	// The final 0.85 is a movement damping factor to avoiding showing too
	// much white space to the right and bottom of the zoomed image.
	// Mozilla, Safari, Opera have a different way to work out position to IE.
	var offsetX = pointX-smallimagepos.x;
	var offsetY = pointY-smallimagepos.y;
	if((navigator.appName == "Microsoft Internet Explorer") )
	{
		offsetX += itemdivpos.x;
		offsetY += itemdivpos.y;
	}
	wspacing = (offsetX)*itemImageZoomLargeSmallRatio*0.85;
	hspacing = (offsetY)*itemImageZoomLargeSmallRatio*0.85;

	cliptop = hspacing;
	clipbottom = clipheight + hspacing;
	clipleft = wspacing;
	clipright = clipwidth + wspacing;
	clippoints = "rect("+cliptop+"px, "+clipright+"px, "+clipbottom+"px, "+clipleft+"px)";

	largediv.style.clip = clippoints;
	largediv.style.left = (whitedivpos.x - itemdivpos.x - wspacing) + "px"; 
	largediv.style.top = (whitedivpos.y - itemdivpos.y - hspacing) + "px";
}

function itemImageZoomClose()
{
	var imagesdiv = document.getElementById('item_image');
	var zoomdiv = document.getElementById('item_image_zoom');
	var smallimage = document.getElementById('item_image_zoom');

	smallimage.onmousemove = null;

	Effect.SlideUp(zoomdiv, { duration: 0.5, queue: 'end'});
	Effect.SlideDown(imagesdiv, { duration: 0.5, queue: 'end'});
}


// by Peter-Paul Koch, Alex Tingle and EA.
function Point(x, y)
{
	this.x = x;
	this.y = y;
}

function getObjCoords(o)
{
	var oX = 0;
	var oY = 0;
	if (o.offsetParent)
	{
		while(1)
		{
			oX+=o.offsetLeft;
			oY+=o.offsetTop;
			if (!o.offsetParent)
			{
				break;
			}
			o=o.offsetParent;
		}
	}
	else if(o.x)
	{
		oX+=o.x;
		oY+=o.y;
	}
	return new Point(oX, oY);
}

