function documentRegister(tag,effect,func,ev,exclusive)
{
	document.toRegister[document.toRegister.length] = {
		tag:tag,
		effect:effect,
		func:func,
		event:ev,
		exclusive:exclusive
	};
}

function doRegister(n)
{
	if(!n) n = document;
	var t, y;
	var r = document.toRegister;
	for(var x=0; x<r.length; x++)
	{
		t = n.getElementsByTagName(r[x].tag);
		if(r[x].tag=='*' && t.length==0) t = document.all;
		for(y=0; y<t.length; y++)
		{
			if(!r[x].effect || hasClassName(t[y],"Fsp."+r[x].effect) || hasClassName(t[y],r[x].effect) || t[y].className.indexOf("Fsp."+r[x].effect+":") > -1 || t[y].className.indexOf("Fsp."+r[x].effect+".") > -1)
			{
				if(r[x].event == 'load')
				{
					t[y].load = r[x].func;
					t[y].load({ currentTarget:t[y] });
				}
				else
				{
					addEventHandler(t[y],r[x].event,r[x].func,r[x].exclusive);
				}
			}
		}
	}
}

function addEventHandler(el,ev,func,exclusive)
{
	if(exclusive)
	{
		if(eval("el.on"+ev+" = func;")) return true;
		else return false;
	}
	else
	{
		if(el.addEventListener)
		{
			el.addEventListener(ev,func,false);
			return true;
		}
		else if(el.attachEvent)
		{
			return el.attachEvent("on"+ev, func);
		}
		else return false;
	}
}

function dumpProps(obj)
{
	var str, p, i, val;
	i = 0;
	str='';
	for(p in obj)
	{
		val = ''+eval('obj.'+p);
		val = val.substring(0,300);
		str += p+' = '+val+'\n';
		if(i++==15){ alert(str); str=''; i=0; }
	}
	alert(str);
}

function fspImageToolbarRemoval()
{
	this.setAttribute('galleryimg','false');
}

function addClassName(el,newClass)
{
	var ary = el.className.split(' ');
	var x=0;
	while(x<ary.length && ary[x]!=newClass) x++;
	if(x<ary.length) return false;
	else
	{
		ary[ary.length] = newClass;
		el.className = ary.join(' ');
		return true;
	}
}

function removeClassName(el,oldClass)
{
	var ary = el.className.split(' ');
	var className = new Array();
	for(var x=0; x<ary.length; x++) if(ary[x]!=oldClass) className[className.length] = ary[x];
	if(ary.length==className.length) return false;
	else
	{
		el.className = className.join(' ');
		return true;
	}
}

function replaceClassName(el,oldClass,newClass)
{
	var ary = el.className.split(' ');
	var x = 0;
	while(x<ary.length && ary[x]!=oldClass) x++;
	if(x<ary.length)
	{
		el.className = ary.join(' ');
		return true;
	}
	else return false;
}

function hasClassName(el,searchClass)
{
	var ary = el.className.split(' ');
	var x = 0;
	while(x<ary.length && ary[x]!=searchClass && ary[x].substr(0,ary[x].search(":"))!=searchClass) x++;
	return (x<ary.length);
}

document.toRegister = new Array();
document.register = documentRegister;
document.fspUpdate = doRegister;

addEventHandler(window,'load',function(){ doRegister(); },false);

document.register('img',null,fspImageToolbarRemoval,'load',false);

var gScrollers = new Array();
var gScrollerDefaultDelay = 25;
var gScrollerDefaultIncrement = 2;
var gScrollerTimeouts = new Array();

function scrollerLoad()
{
	var pos;
	if(window.getComputedStyle && (pos = window.getComputedStyle(this,null).position))
		if(pos!="absolute" && pos!="fixed") this.style.position = "relative";
	else if(this.currentStyle && (pos = this.currentStyle.position))
		if(pos!="absolute" && pos!="fixed") this.style.position = "relative";
	while(!this.id || gScrollers[this.id]) this.id="a"+Math.floor(10000 * Math.random());
	gScrollers[this.id] = this;
	this.scrollIncrement = this.className.match(/Scroller\.Increment:([0-9]+)/);
	if(this.scrollIncrement && this.scrollIncrement[1]) this.scrollIncrement = 1*this.scrollIncrement[1];
	else this.scrollIncrement = gScrollerDefaultIncrement;
	this.scrollDelay = this.className.match(/Scroller\.Delay:([0-9]+)/);
	if(this.scrollDelay && this.scrollDelay[1]) this.scrollDelay = 1*this.scrollDelay[1];
	else this.scrollDelay = gScrollerDefaultDelay;
	this.style.overflow = "hidden";
	this.scrollChild = this.getElementsByTagName("*").item(0);
	this.scrollChild.style.position = "absolute";
	this.scrollCurrent = Math.round(this.clientHeight * 0.9);
	this.pauseScroll = scrollerOver;
	this.resumeScroll = scrollerOut;
	this.scrollChild.style.top = this.scrollCurrent + "px";
	moveScroller(this.id);
}

function moveScroller(id)
{
	var s;
	if(gScrollers && (s = gScrollers[id]))
	{
		s.scrollCurrent = s.scrollCurrent-s.scrollIncrement;
		if(s.scrollCurrent < (-1 * s.scrollChild.clientHeight)) s.scrollCurrent = (s.clientHeight);
		s.scrollChild.style.top = s.scrollCurrent + "px";
		setScrollTimeout(id);
	}
}

function scrollerOver()
{
	if(this.id && gScrollerTimeouts && gScrollerTimeouts[this.id]) clearTimeout(gScrollerTimeouts[this.id]);
}

function scrollerOut()
{
	if(this.id && gScrollers && gScrollers[this.id])
		setScrollTimeout(this.id);
}

function setScrollTimeout(id)
{
	gScrollerTimeouts[id] = setTimeout("clearTimeout(gScrollerTimeouts['"+id+"']);moveScroller('"+id+"');",gScrollers[id].scrollDelay);
}

function pauseAllScrollers()
{
	for(var x=0; x<gScrollers.length; x++) gScrollers[x].onMouseOver();
}

function resumeAllScrollers()
{
	for(var x=0; x<gScrollers.length; x++) gScrollers[x].onMouseOut();
}

document.register('div','Scroller',scrollerLoad,'load',false);
document.register('div','Scroller',scrollerOver,'mouseover',true);
document.register('div','Scroller',scrollerOut,'mouseout',true);

function fspColumnsBlank(tag)
{
	d = document.createElement(tag);
	s = d.style;
	s.display = "block";
	s.clear = "both";
	s.visibility = "hidden";
	s.height = "1px";
	s.overflow = "hidden";
	s.lineHeight = "1px";
	s.fontSize = "1px";
	t = document.createTextNode('_');
	d.appendChild(t);
	return d;
}

function fspColumns()
{
	var regex, numCols, gutter, c, total, x, y, width, s, d, t, tag;
	regx = /Fsp\.Columns:([0-9]+)/;
	numCols = this.className.match(regx);
	if(numCols && numCols[1]) numCols = 1*numCols[1];
	else numCols = 2;
	regx = /Columns\.Gutter:([0-9]+)/;
	gutter = this.className.match(regx);
	if(gutter && gutter[1]) gutter = 1*gutter[1];
	else gutter = 3;
	c = this.childNodes;
	total = 0;
	for(x=0; x<c.length; x++) if(c[x].nodeType==1) ++total;
	x = 0;
	y = 0;
	width = "" + Math.floor((100-((numCols-1)*gutter))/numCols) + "%";
	gutter = "" + gutter + "%";
	if(this.tagName.toLowerCase() == 'ul')
	{
		this.style.paddingLeft = '0';
		this.style.marginLeft = '0';
	}
	while(x<c.length)
	{
		if(c[x].nodeType==1)
		{
			s = c[x].style;
			s.cssFloat = "left";
			s.styleFloat = "left";
			s.width = width;
			s.display = "block";
			if(y%numCols == 0)
			{
				if(y)
				{
					if(c[x].tagName.toLowerCase()=='li') tag = 'li';
					else tag = 'span';
					this.insertBefore(fspColumnsBlank(tag),c[x]);
					++x;
				}
				s.clear = "left";
				s.marginLeft = '0';
			}
			else
			{
				s.clear = "none";
				s.marginLeft = gutter;
			}
			if(this.tagName.toLowerCase() == 'ul')
			{
				s.listStylePosition = 'inside';
			}
			++y;
		}
		++x;
	}
	d = fspColumnsBlank('span');
	this.appendChild(d);
}

document.register('p','Columns',fspColumns,'load',false);
document.register('div','Columns',fspColumns,'load',false);
document.register('ul','Columns',fspColumns,'load',false);
document.register('td','Columns',fspColumns,'load',false); // Someone needed this.
