﻿// Fader class for opacity-ramping of objects
// 
// Copyright 2007-2008 René Lønstrup @ RLdesign.dk
// 
// May not be used commercially without permission from the author.
//
// Version: 1.0.0.0
//
//
// CHANGELOG:
//
// 22/03/2008
//     1.0.0.0
//           First public release
//

if (!RLdesign) {
	var RLdesign = function() { };
}
if (!RLdesign.Web) {
	RLdesign.Web = function() { };
}
if (!RLdesign.Web.UI) {
	RLdesign.Web.UI = function() { };
}
RLdesign.Web.UI.Fader = function() {
	return {
		Fade: function(obj, iEndOpacity, iTotalDuration, iResolution, sDisplayProp, fnWhenDone) {
			if (sDisplayProp == null) sDisplayProp = "block";
			if (iResolution == null || isNaN(iResolution) || iResolution < 1) iResolution = 6;
			var bSetNoneDisplay = false;
			switch (sDisplayProp.toString().toLowerCase()) {
				case "inline":
					sDisplayProp = "inline";
					break;
				case "inline-block":
					sDisplayProp = "inline-block";
					break;
				case "none":
					bSetNoneDisplay = true;
				case "block":
				default:
					sDisplayProp = "block";
					break;
			}
			
			obj = RLdesign.Utils.DefineObject(obj);
			if (obj == null) return false;
			
			fnWhenDone = (typeof(fnWhenDone) == "function") ? fnWhenDone : null;
			
			if (obj.tRLdesignFader) {
				clearTimeout(obj.tRLdesignFader);
			}
			var iCurrentOpacity = parseInt(RLdesign.Utils.GetOpacity(obj));
			if (iCurrentOpacity != iEndOpacity) {
				RLdesign.Utils.SetOpacity(obj, iCurrentOpacity);
				RLdesign.Utils.SetDisplay(obj,sDisplayProp);
				var iTotalSteps = (iTotalDuration / iResolution) / 2;
				var iTimeout = iTotalDuration / iTotalSteps;
				var iStep = (iEndOpacity - iCurrentOpacity) / iTotalSteps;
				obj.tRLdesignFader = window.setTimeout(function() {RLdesign.Web.UI.Fader._DoFade(obj, iCurrentOpacity, iStep, iTimeout, iEndOpacity, bSetNoneDisplay, fnWhenDone); }, iTimeout);
			}
			else {
				RLdesign.Utils.SetDisplay(obj,sDisplayProp);
				if (typeof(fnWhenDone) == "function") fnWhenDone(obj);
			}
		},
		
		_DoFade: function(obj, iOpacity, iStep, iTimeout, iEndOpacity, bSetNoneDisplay, fnWhenDone) {
			iOpacity += iStep;
			if (iOpacity < 0) iOpacity = 0;
			else if (iOpacity > 100) iOpacity = 100;
			else if (iStep > 0 && iOpacity > iEndOpacity) iOpacity = iEndOpacity;
			else if (iStep < 0 && iOpacity < iEndOpacity) iOpacity = iEndOpacity;
			RLdesign.Utils.SetOpacity(obj, iOpacity);
			if (bSetNoneDisplay && iOpacity == 0 && iOpacity == iEndOpacity) {
				RLdesign.Utils.SetDisplay(obj, "none");
			}
			if (((iStep > 0 && iOpacity < iEndOpacity) || (iStep < 0 && iOpacity > iEndOpacity)) && (iOpacity > 0 && iOpacity < 100)) {
				obj.tRLdesignFader = window.setTimeout(function() {RLdesign.Web.UI.Fader._DoFade(obj, iOpacity, iStep, iTimeout, iEndOpacity, bSetNoneDisplay, fnWhenDone); }, iTimeout);
			}
			else {
				if (typeof(fnWhenDone) == "function") fnWhenDone(obj);
			}
		}
	}
} ();