/**
* imagerollover.js - handle image rollovers when mouse hovers over element
*
* @version 1.00.00 2008-10-20
* @package imagerollover
* @author Ross McKay <rmckay@webaware.com.au>
* @link http://www.webaware.com.au/
* @copyright copyright © 2007-2008 WebAware Pty Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*
* Full license: {@link http://www.webaware.com.au/free/license.htm}
*/

/**
* hook into events for the rollover targets
*
* rollover_targets array must be of format [event_source, rollover_target, rollover_image]
*
* @constructor
* @param {String} self_name name of global object this instance is known by (so can hook JavaScript events for this object)
* @param {Array} rollover_targets array of rollover targets
*/
function ImageRollover(self_name, rollover_targets) {
	/**
	* name of global object this instance is known by
	* @type String
	*/
	this.self_name = self_name;

	/**
	* array of pre-loaded images
	* @type Array
	*/
	this.preloads = new Array();

	if (rollover_targets == undefined) {
		/**
		* array of rollover targets
		* @type Array
		*/
		this.rollover_targets = new Array();
	}
	else {
		this.rollover_targets = rollover_targets;

		// make sure that the Array object has an indexOf() method, but keep it simple
		if (Array.indexOf == undefined) {
			Array.prototype.indexOf = function(needle) {
				for (var i = this.length; --i >= 0; ) {
					if (this[i] == needle)
						return i;
				}
				return -1;
			}
		}

		// iterate over the list, pre-loading all rollover images
		var images = new Array();
		for (var i = rollover_targets.length; --i >= 0; ) {
			var imagesource = rollover_targets[i][2];
			if (images.indexOf(imagesource) == -1) {
				var image = new Image();
				image.src = imagesource;
				this.preloads.push(image);

				images.push(imagesource);
			}
		}
	}
}

/**
* create a new global object from an array of rollover targets
*
* @param {Array} rollover_targets array of rollover targets
*/
ImageRollover.createFromArray = function(rollover_targets) {
	var object_name = ImageRollover.getObjectName();
	var image_rollover = new ImageRollover(object_name, rollover_targets);
	eval ('document.' + object_name + ' = image_rollover;');

	var hook = new Function('document.' + object_name + '.onLoad();');
	if (window.addEventListener)
		window.addEventListener("load", hook, false);
	else if (window.attachEvent)
		window.attachEvent("onload", hook);

	return image_rollover;
}

/**
* generate a unique global variable name based on current time and a random number
*
* @return {String} a new variable name in the form v_digits_digits
*/
ImageRollover.getObjectName = function() {
	var now = new Date();
	return 'v_' + now.getTime().toString(36) + '_' + Math.floor(Math.random() * 1000000000).toString(36);
}

/**
* replace the image on an img element
*
* @param {String} element_id ID of image element to change
* @param {String} image_source path to new image
*/
ImageRollover.replaceImage = function(element_id, image_source) {
	var image = document.getElementById(element_id);
	if (image)
		image.src = image_source;
}

/**
* event hook for onload event, to iterate over the list of image rollover targets and hook their mouse events
*/
ImageRollover.prototype.onLoad = function() {
	if (this.rollover_targets) {
		for (var i = this.rollover_targets.length; --i >= 0; ) {
			var event_source = document.getElementById(this.rollover_targets[i][0]);
			var rollover_target = document.getElementById(this.rollover_targets[i][1]);
			var replacement_image = this.rollover_targets[i][2];

			if (event_source && rollover_target) {
				var hook = new Function('ImageRollover.replaceImage("' + rollover_target.id + '","' + replacement_image + '")');
				if (window.addEventListener)
					event_source.addEventListener("mouseover", hook, false);
				else if (window.attachEvent)
					event_source.attachEvent("onmouseover", hook);

				hook = new Function('ImageRollover.replaceImage("' + rollover_target.id + '","' + rollover_target.src + '")');
				if (window.addEventListener)
					event_source.addEventListener("mouseout", hook, false);
				else if (window.attachEvent)
					event_source.attachEvent("onmouseout", hook);
			}
		}
	}
}

