diff forum/Themes/Vamp/scripts/fader.js @ 76:e3e11437ecea website

Add forum code
author Chris Cannam
date Sun, 07 Jul 2013 11:25:48 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/forum/Themes/Vamp/scripts/fader.js	Sun Jul 07 11:25:48 2013 +0200
@@ -0,0 +1,217 @@
+function smf_NewsFader(oOptions)
+{
+	this.opt = oOptions;
+
+	this.oFaderHandle = document.getElementById(this.opt.sFaderControlId);
+
+	// Fade from... what text color? Default to black.
+	this.oFadeFrom = 'oFadeFrom' in this.opt ? this.opt.oFadeFrom : {
+		r: 0,
+		g: 0,
+		b: 0
+	};
+
+	// To which background color? Default to white.
+	this.oFadeTo = 'oFadeTo' in this.opt ? this.opt.oFadeTo : {
+		r: 255,
+		g: 255,
+		b: 255
+	};
+
+	// Surround each item with... anything special?
+	this.sItemTemplate = 'sItemTemplate' in this.opt ? this.opt.sItemTemplate : '%1$s';
+
+	// Fade delay (in milliseconds).
+	this.iFadeDelay = 'iFadeDelay' in this.opt ? this.opt.iFadeDelay : 5000;
+
+	// The array that contains all the lines of the news for display.
+	this.aFaderItems = 'aFaderItems' in this.opt ? this.opt.aFaderItems : [];
+
+	// Should we look for fader data, still?
+	this.bReceivedItemsOnConstruction = 'aFaderItems' in this.opt;
+
+	// The current item in smfFadeContent.
+	this.iFadeIndex = -1;
+
+	// Percent of fade (-64 to 510).
+	this.iFadePercent = 510
+
+	// Direction (in or out).
+	this.bFadeSwitch = false;
+
+	// Just make sure the page is loaded before calling the init.
+	setTimeout(this.opt.sSelf + '.init();', 1);
+}
+
+smf_NewsFader.prototype.init = function init()
+{
+	var oForeEl, oForeColor, oBackEl, oBackColor;
+
+	// Try to find the fore- and background colors.
+	if ('currentStyle' in this.oFaderHandle)
+	{
+		oForeColor = this.oFaderHandle.currentStyle.color.match(/#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/);
+		this.oFadeFrom = {
+			r: parseInt(oForeColor[1]),
+			g: parseInt(oForeColor[2]),
+			b: parseInt(oForeColor[3])
+		};
+
+		oBackEl = this.oFaderHandle;
+		while (oBackEl.currentStyle.backgroundColor == 'transparent' && 'parentNode' in oBackEl)
+			oBackEl = oBackEl.parentNode;
+
+		oBackColor = oBackEl.currentStyle.backgroundColor.match(/#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/);
+		this.oFadeTo = {
+			r: eval('0x' + oBackColor[1]),
+			g: eval('0x' + oBackColor[2]),
+			b: eval('0x' + oBackColor[3])
+		};
+	}
+	else if (!('opera' in window) && 'defaultView' in document)
+	{
+		oForeEl = this.oFaderHandle;
+		while (document.defaultView.getComputedStyle(oForeEl, null).getPropertyCSSValue('color') == null && 'parentNode' in oForeEl && 'tagName' in oForeEl.parentNode)
+			oForeEl = oForeEl.parentNode;
+
+		oForeColor = document.defaultView.getComputedStyle(oForeEl, null).getPropertyValue('color').match(/rgb\((\d+), (\d+), (\d+)\)/);
+		this.oFadeFrom = {
+			r: parseInt(oForeColor[1]),
+			g: parseInt(oForeColor[2]),
+			b: parseInt(oForeColor[3])
+		};
+
+		oBackEl = this.oFaderHandle;
+		while (document.defaultView.getComputedStyle(oBackEl, null).getPropertyCSSValue('background-color') == null && 'parentNode' in oBackEl && 'tagName' in oBackEl.parentNode)
+			oBackEl = oBackEl.parentNode;
+
+		oBackColor = document.defaultView.getComputedStyle(oBackEl, null).getPropertyValue('background-color');
+		this.oFadeTo = {
+			r: parseInt(oBackColor[1]),
+			g: parseInt(oBackColor[2]),
+			b: parseInt(oBackColor[3])
+		};
+	}
+
+	// Did we get our fader items on construction, or should we be gathering them instead?
+	if (!this.bReceivedItemsOnConstruction)
+	{
+		// Get the news from the list in boardindex
+		var oNewsItems = this.oFaderHandle.getElementsByTagName('li');
+
+		// Fill the array that has previously been created
+		for (var i = 0, n = oNewsItems.length; i < n; i ++)
+			this.aFaderItems[i] = oNewsItems[i].innerHTML;
+	}
+
+	// The ranges to fade from for R, G, and B. (how far apart they are.)
+	this.oFadeRange = {
+		'r': this.oFadeFrom.r - this.oFadeTo.r,
+		'g': this.oFadeFrom.g - this.oFadeTo.g,
+		'b': this.oFadeFrom.b - this.oFadeTo.b
+	};
+
+	// Divide by 20 because we are doing it 20 times per one ms.
+	this.iFadeDelay /= 20;
+
+	// Start the fader!
+	window.setTimeout(this.opt.sSelf + '.fade();', 20);
+}
+
+// Main	fading function... called 50 times every second.
+smf_NewsFader.prototype.fade = function fade()
+{
+	if (this.aFaderItems.length <= 1)
+		return;
+
+	// A fix for Internet Explorer 4: wait until the document is loaded so we can use setInnerHTML().
+	if ('readyState' in document && document.readyState != 'complete')
+	{
+		window.setTimeout(this.opt.sSelf + '.fade();', 20);
+		return;
+	}
+
+	// Starting out?  Set up the first item.
+	if (this.iFadeIndex == -1)
+	{
+		setInnerHTML(this.oFaderHandle, this.sItemTemplate.replace('%1$s', this.aFaderItems[0]));
+		this.iFadeIndex = 1;
+
+		// In Mozilla, text jumps around from this when 1 or 0.5, etc...
+		if ('MozOpacity' in this.oFaderHandle.style)
+			this.oFaderHandle.style.MozOpacity = '0.90';
+		else if ('opacity' in this.oFaderHandle.style)
+			this.oFaderHandle.style.opacity = '0.90';
+		// In Internet Explorer, we have to define this to use it.
+		else if ('filter' in this.oFaderHandle.style)
+			this.oFaderHandle.style.filter = 'alpha(opacity=100)';
+	}
+
+	// Are we already done fading in?  If so, fade out.
+	if (this.iFadePercent >= 510)
+		this.bFadeSwitch = !this.bFadeSwitch;
+
+	// All the way faded out?
+	else if (this.iFadePercent <= -64)
+	{
+		this.bFadeSwitch = !this.bFadeSwitch;
+
+		// Go to the next item, or first if we're out of items.
+		setInnerHTML(this.oFaderHandle, this.sItemTemplate.replace('%1$s', this.aFaderItems[this.iFadeIndex ++]));
+		if (this.iFadeIndex >= this.aFaderItems.length)
+			this.iFadeIndex = 0;
+	}
+
+	// Increment or decrement the fade percentage.
+	if (this.bFadeSwitch)
+		this.iFadePercent -= 255 / this.iFadeDelay * 2;
+	else
+		this.iFadePercent += 255 / this.iFadeDelay * 2;
+
+	// If it's not outside 0 and 256... (otherwise it's just delay time.)
+	if (this.iFadePercent < 256 && this.iFadePercent > 0)
+	{
+		// Easier... also faster...
+		var tempPercent = this.iFadePercent / 255, rounded;
+
+		if ('MozOpacity' in this.oFaderHandle.style)
+		{
+			rounded = Math.round(tempPercent * 100) / 100;
+			this.oFaderHandle.style.MozOpacity = rounded == 1 ? '0.99' : rounded;
+		}
+		else if ('opacity' in this.oFaderHandle.style)
+		{
+			rounded = Math.round(tempPercent * 100) / 100;
+			this.oFaderHandle.style.opacity = rounded == 1 ? '0.99' : rounded;
+		}
+		else
+		{
+			var done = false;
+			if ('alpha' in this.oFaderHandle.filters)
+			{
+				try
+				{
+					this.oFaderHandle.filters.alpha.opacity = Math.round(tempPercent * 100);
+					done = true;
+				}
+				catch (err)
+				{
+				}
+			}
+
+			if (!done)
+			{
+				// Get the new R, G, and B. (it should be bottom + (range of color * percent)...)
+				var r = Math.ceil(this.oFadeTo.r + this.oFadeRange.r * tempPercent);
+				var g = Math.ceil(this.oFadeTo.g + this.oFadeRange.g * tempPercent);
+				var b = Math.ceil(this.oFadeTo.b + this.oFadeRange.b * tempPercent);
+
+				// Set the color in the style, thereby fading it.
+				this.oFaderHandle.style.color = 'rgb(' + r + ', ' + g + ', ' + b + ')';
+			}
+		}
+	}
+
+	// Keep going.
+	window.setTimeout(this.opt.sSelf + '.fade();', 20);
+}
\ No newline at end of file