/**
 * Client side code for image fading
 *
 * Copyright (c) 2008 TOLRA Micro Systems Limited. All rights reserved.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/**
 * Core library functions
 */
var imagefade = new function() {
	var self = this;

	/**
	 * Events
	 */
	var handlers = [];

	this._findHandler = function(target, eventName, fnHandler) {
		for(i in handlers) {
			if(handlers[i].target == target && handlers[i].eventName == eventName && handlers[i].fnHandler == fnHandler)
				return i;
		}

		return -1;
	};

	// Attach to an event
	this.observe = function(target, eventName, fnHandler) {
		// if given a string look up the object
		if(typeof target == "string") target = document.getElementById(target);

		// Look for an existing handler
		if(self._findHandler(target, eventName, fnHandler) != -1) return;

		// create wrapper event function to fix browser differences
		var fn = function(evt) {
			evt = evt ? evt : (window.event ? window.event : null);
			if(evt) {
				// For IE convert srcElement to target
				if(!evt.target) evt.target = evt.srcElement;

				// if handler returns false don't run default
				if(!fnHandler(evt)) {
					if(evt.stopPropagation) {
						evt.stopPropagation();
						evt.preventDefault();
					}
					else if(evt.cancelBubble) {
						evt.cancelBubble = true;
						evt.returnValue = false;
					}
					return false;
				}
			}
		};

		// Remember handler
		handlers.push({target: target, eventName: eventName, fnHandler: fnHandler, fn: fn});

		// Attach event to object
		if(target.addEventListener)
			target.addEventListener(eventName, fn, false);
		else {
			target.attachEvent("on" + eventName, fn);

			// For IE add unloader to remove all handlers
			if(!window._fusionLibEventUnload) {
				window._fusionLibEventUnload = true;
				self._removeAllEvents = function() {
					for(i in handlers) {
						handlers[i].target.detachEvent("on" + handlers[i].eventName, handlers[i].fn);
					}
				}

				var _oldOnUnload = window.onunload;
				if(typeof window.onunload != 'function') window.onunload = self._removeAllEvents;
				else window.onunload = function() { self._removeAllEvents(); _oldOnUnload(); };
			}
		}
	};

	var liveimg;
	var opacity;
	var opacityd;
	var images;
	var delay;
	var i1name;
	var i2name;
	var txtname;

	this.animateFade = function() {
		var image2 = document.getElementById(self.i2name);
		image2.style.opacity = self.opacity / 100;
		image2.style.MozOpacity = self.opacity / 100;
		image2.style.filter = "alpha(opacity=" + self.opacity + ")";
		
		self.opacity += self.opacityd;
		if(self.opacity >= 0)
			setTimeout(self.animateFade, 100);
		else {
			// Faded so make old bg image fade image
			self.opacity = 100;
			image2.style.opacity = self.opacity / 100;
			image2.style.MozOpacity = self.opacity / 100;
			image2.style.filter = "alpha(opacity=" + self.opacity + ")";
			
			self.liveimg = (self.liveimg + 1) % self.images.length;
			image2.style.backgroundImage = 'url(' + self.images[self.liveimg][0] + ')';
			
			var e = document.getElementById(self.txtname);
			if(e)
				e.innerHTML = self.images[self.liveimg][2];
			
			// Set next as fade
			document.getElementById(self.i1name).style.backgroundImage = 'url(' + self.images[(self.liveimg+1) % self.images.length][0] + ')';
			
			// Wait and start animating
			setTimeout(self.animateFade, self.delay);
		}
	}
	
	this.onClickImage = function(e) {
		window.location = self.images[self.liveimg][1];
		return false;
	}

	this.fade = function(images, delay, i1name, i2name, txtname, withclick) {
		self.images = images;
		self.liveimg = 0;
		self.opacity = 100;
		self.opacityd = -10;
		self.delay = delay;
		self.i1name = i1name;
		self.i2name = i2name;
		self.txtname = txtname;
		
		if(withclick)
			self.observe(self.i2name, 'click', self.onClickImage);

		document.getElementById(self.i2name).style.backgroundImage = 'url(' + self.images[self.liveimg][0] + ')';
		document.getElementById(self.i1name).style.backgroundImage = 'url(' + self.images[self.liveimg+1][0] + ')';
		var e = document.getElementById(self.txtname);
		if(e)
			e.innerHTML = self.images[self.liveimg][2];
			
		setTimeout(self.animateFade, self.delay);
	}
}
