// ixf1.11 :: Image swap-fade 
// *****************************************************
// DOM scripting by brothercake -- http://www.brothercake.com/
//******************************************************
//global object
var ixf = {
	'opacity' :0,
	'clock' :null,
	'fade' :true,
	'count' :1
}
/*******************************************************************************
 * 
 * 
 * /*****************************************************************************
 * List the images that need to be cached
 ******************************************************************************/

ixf.imgs = Array();

function cacheImages() {
	ixf.imgs = pictures;

	/*****************************************************************************
	 *****************************************************************************/

	// cache the images
	ixf.imgsLen = ixf.imgs.length;
	ixf.cache = [];
	for ( var i = 0; i < ixf.imgsLen; i++) {
		ixf.cache[i] = new Image;
		ixf.cache[i].src = ixf.imgs[i];
	}
}

// swapfade setup function
function swapfade() {
	counter++;
	quot = (counter%(pictures.length));
	
	// if the timer is not already going
	if (ixf.clock == null) {
		// copy the image object
		ixf.obj = arguments[0];

		// copy the image src argument
		ixf.src = arguments[1];

		// store the supported form of opacity
		if (typeof ixf.obj.style.opacity != 'undefined') {
			ixf.type = 'w3c';
		} else if (typeof ixf.obj.style.MozOpacity != 'undefined') {
			ixf.type = 'moz';
		} else if (typeof ixf.obj.style.KhtmlOpacity != 'undefined') {
			ixf.type = 'khtml';
		} else if (typeof ixf.obj.filters == 'object') {
			// weed out win/ie5.0 by testing the length of the filters
			// collection (where filters is an object with no data)
			// then weed out mac/ie5 by testing first the existence of the alpha
			// object (to prevent errors in win/ie5.0)
			// then the returned value type, which should be a number, but in
			// mac/ie5 is an empty string
			ixf.type = (ixf.obj.filters.length > 0
					&& typeof ixf.obj.filters.alpha == 'object' && typeof ixf.obj.filters.alpha.opacity == 'number') ? 'ie'
					: 'none';
		} else {
			ixf.type = 'none';
		}

		// change the image alt text if defined
		if (typeof arguments[3] != 'undefined' && arguments[3] != '') {
			ixf.obj.alt = arguments[3];
		}

		// if any kind of opacity is supported
		if (ixf.type != 'none') {
			// copy and convert fade duration argument
			// the duration specifies the whole transition
			// but the swapfade is two distinct transitions
			ixf.length = parseInt(arguments[2], 10) * 500;

			// create fade resolution argument as 20 steps per transition
			// again, split for the two distrinct transitions
			ixf.resolution = parseInt(arguments[2], 10) * 10;

			// start the timer
			ixf.clock = setInterval('ixf.swapfade()', ixf.length
					/ ixf.resolution);
		}

		// otherwise if opacity is not supported
		else {
			// just do the image swap
			ixf.obj.src = ixf.src;
		}

	}
};

// swapfade timer function
ixf.swapfade = function() {
	// increase or reduce the counter on an exponential scale
	ixf.count = (ixf.fade) ? ixf.count * 0.9 : (ixf.count * (1 / 0.9));

	// if the counter has reached the bottom
	if (ixf.count < (1 / ixf.resolution)) {
		// clear the timer
		clearInterval(ixf.clock);
		ixf.clock = null;

		// do the image swap
		ixf.obj.src = ixf.src;

		// reverse the fade direction flag
		ixf.fade = false;

		// restart the timer
		ixf.clock = setInterval('ixf.swapfade()', ixf.length / ixf.resolution);

	}

	// if the counter has reached the top
	if (ixf.count > (1 - (1 / ixf.resolution))) {
		// clear the timer
		clearInterval(ixf.clock);
		ixf.clock = null;

		// reset the fade direction flag
		ixf.fade = true;

		// reset the counter
		ixf.count = 1;
	}

	// set new opacity value on element
	// using whatever method is supported
	switch (ixf.type) {
	case 'ie':
		ixf.obj.filters.alpha.opacity = ixf.count * 100;
		break;

	case 'khtml':
		ixf.obj.style.KhtmlOpacity = ixf.count;
		break;

	case 'moz':
		// restrict max opacity to prevent a visual popping effect in firefox
		ixf.obj.style.MozOpacity = (ixf.count == 1 ? 0.9999999 : ixf.count);
		break;

	default:
		// restrict max opacity to prevent a visual popping effect in firefox
		ixf.obj.style.opacity = (ixf.count == 1 ? 0.9999999 : ixf.count);
	}
};

