/*jslint white: true, onevar: true, browser: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, strict: true, newcap: true, immed: true, indent: 4 */
 
/*globals	window, attachEvent*/
 
/*members	addEventListener, alpha, attachEvent, className, filter,
			filters, getElementById, getElementsByTagName, getTime, join, length,
			max, min, opacity, replace, round, setTimeout, splice, split, style
*/

 "use strict";
(function ()
{
	//Private static definitions:
	var ejf, addEvent;

	addEvent = (function ()// addEvent(obj, action, fn)
	{
		if (typeof addEventListener !== 'undefined')
		{
			return function (obj, action, fn)
			{
				if (typeof obj === 'undefined' || obj === null)
				{
					return;
				}
				obj.addEventListener(action, fn, false);
			};
		}
		else if (typeof attachEvent !== 'undefined')
		{
			return function (obj, action, fn)
			{
				if (typeof obj === 'undefined' || obj === null)
				{
					return;
				}
				obj.attachEvent('on' + action, fn);
			};
		}
		else
		{
			return function ()
			{
				alert('Your browser is not supported.');
			};
		}
	}());
		
	function containsClassName(obj, name)
	{
		if (typeof obj === 'undefined' || obj === null || typeof obj.className === 'undefined' ||
			obj.className.length < 1 ||	typeof name === 'undefined' || name === null)
		{
			return false;
		}
		var i, classes = obj.className.split(' ');
		for (i = 0; i < classes.length; i++)
		{
			if (classes[i] === name)
			{
				return true;
			}
		}
		return false;
	}
	
	function addClassName(obj, name)
	{
		//NOTE: if a className is not defined in the HTML, it === '' in all browsers
		if (typeof obj === 'undefined' || obj === null || typeof obj.className === 'undefined' ||
			typeof name === 'undefined' || name === null)
		{
			return;
		}
		if (obj.className.length > 0)
		{
			if (containsClassName(obj, name))
			{
				return;
			}
			obj.className += ' ' + name;
		}
		else
		{
			obj.className = name;
		}
	}
	
	function removeClassName(obj, name)
	{
		if (typeof obj === 'undefined' || obj === null || typeof obj.className === 'undefined' ||
			typeof name === 'undefined' || name === null)
		{
			return;
		}
		var i, classes = obj.className.split(' ');
		for (i = 0; i < classes.length; i++)
		{
			if (classes[i] === name)
			{
				classes.splice(i, 1);
			}
		}
		obj.className = classes.join(' ');
	}
	
	function setOpacity(elm, opacity)
	{
		opacity = Math.round(opacity * 100);
		elm.style.opacity = opacity < 100 ? opacity / 100 : '';
		if (elm.filters && elm.filters.alpha)
		{
			elm.filters.alpha.opacity = opacity;
		}
		else
		{
			elm.style.filter += " alpha(opacity=" + opacity + ") ";
		}
		/* also removed try catch around the block above, with 'else' clause also in the catch */		
		/*if (opacity === 100) //although nice idea, this trickers a pixel movement in IE8.
		{
			filter = elm.style.filter || '';
			elm.style.filter = filter.replace(/alpha\(.*?\)/g, '');
			return;
		}*/
	}
	
	
	//'Constructor': (could all be made static?)
    ejf = function ()
    {
		var delay = 4000, fadeInLength = 750, fadeOutLength = 500, fadeBeginTime = null, imageItemList, currentItem, timer = null, fadeIn, initTime = new Date().getTime();
	
		function fadeOut()
		{
			if (fadeBeginTime === null)
			{
				fadeBeginTime = new Date().getTime();
			}
			var opacity = Math.max(0.0, Math.min(1.0, 1.0 - (new Date().getTime() - fadeBeginTime) / fadeOutLength));

			setOpacity(imageItemList[currentItem], opacity);
			if (opacity > 0)
			{
				timer = setTimeout(fadeOut, 20);
			}
			else
			{
				fadeBeginTime = null;
				addClassName(imageItemList[currentItem], 'hidden');
				currentItem = (currentItem + 1) % imageItemList.length;
				setOpacity(imageItemList[currentItem], 0.0);
				removeClassName(imageItemList[currentItem], 'hidden');
				fadeIn();
			}
        }
		
		fadeIn = function ()
		{
			if (fadeBeginTime === null)
			{
				fadeBeginTime = new Date().getTime();
			}
			var opacity = Math.max(0.0, Math.min(1.0, (new Date().getTime() - fadeBeginTime) / fadeInLength));

			setOpacity(imageItemList[currentItem], opacity);
			if (opacity < 1)
			{
				timer = setTimeout(fadeIn, 20);
			}
			else
			{
				fadeBeginTime = null;
				timer = setTimeout(fadeOut, delay);
			}
        };
		
		function loaded()
		{
			var i, photoslide;
			photoslide = document.getElementById('photoslide');
			if (photoslide !== null)
			{
				imageItemList = photoslide.getElementsByTagName('li');
				if (imageItemList !== null)
				{
					currentItem = 0;
					timer = setTimeout(fadeOut, Math.max(0, Math.min(delay, delay - (new Date().getTime() - initTime))));
				}
			}
		}
		
		function unLoaded()
		{
			clearTimeout(timer);
		}
		
		addEvent(window, 'load', loaded);
		addEvent(window, 'unload', unLoaded);
    };
    return ejf;
}())();
//EOF
