function setCookie(name, value, days, path, domain, secure)
{
	var expires, date;
	if (typeof days == "number")
	{
		date = new Date();
		date.setTime( date.getTime() + (days * 24 * 60 * 60 * 1000));
		expires = date.toGMTString();
	}
	document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "");
}

function getCookie(name)
{
	var nameq = name + "=";
	var c_ar = document.cookie.split(';');
	for (var i=0; i<c_ar.length; i++)
	{
		var c = c_ar[i];
		while (c.charAt(0) == ' ') c = c.substring(1,c.length);
		if (c.indexOf(nameq) == 0) return unescape( c.substring(nameq.length, c.length) );
	}
	return null;
}

function deleteCookie(name, path, domain)
{
	if (getCookie(name))
		document.cookie = name + "=" + ((path)? "; path=" + path : "") + ((domain)? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

var dw_fontSizerDX = {
	sizeUnit: "px",
	defaultSize: 14,
	maxSize: 46,
	minSize: 10,
	adjustList: [],

	setDefaults: function(unit, dflt, mn, mx, sels)
	{
		this.sizeUnit = unit;
		this.defaultSize = dflt;
		this.maxSize = mx;
		this.minSize = mn;
		if (sels)
			this.set(dflt, mn, mx, sels);
	},

	set: function(dflt, mn, mx, sels)
	{
		var ln = this.adjustList.length;
		for (var i = 0; sels[i]; i++)
		{
			this.adjustList[ln+i] = [];
			this.adjustList[ln+i]["sel"] = sels[i];
			this.adjustList[ln+i]["dflt"] = dflt;
			this.adjustList[ln+i]["min"] = mn || this.minSize;
			this.adjustList[ln+i]["max"] = mx || this.maxSize;
			this.adjustList[ln+i]["ratio"] = this.adjustList[ln+i]["dflt"]/this.defaultSize;
		}
	},

	init: function()
	{
		if (!document.getElementById || !document.getElementsByTagName || !dw_fontSizerDX.ready)
			return;

		var size, sizerEl, i;

		size = window.location.search? window.location.search.slice(1): getCookie("fontSize");
		size = !isNaN(parseFloat(size))? parseFloat(size): this.defaultSize;

		if (size>this.maxSize || size<this.minSize)
			size = this.defaultSize;

		this.curSize = this.defaultSize;

		sizerEl = document.getElementById('sizer');

		if (sizerEl)
			sizerEl.style.display = "block";

		if (this.adjustList.length == 0)
			this.setDefaults(this.sizeUnit, this.defaultSize, this.minSize, this.maxSize, ['body', 'td']);

		if (size != this.defaultSize)
			this.adjust(size-this.defaultSize);
	},

	adjust: function(n)
	{
		if (!this.curSize || !dw_fontSizerDX.ready)
			return;

		var alist, size, list, i, j;

		if (n > 0)
		{
			if (this.curSize + n > this.maxSize)
				n = this.maxSize - this.curSize;
		}
		else if (n < 0)
		{
			if (this.curSize + n < this.minSize)
				n = this.minSize - this.curSize;
		}

		if (n == 0)
			return;

		this.curSize += n;
		alist = this.adjustList;

		for (i = 0;	alist[i];	i++)
		{
			size = this.curSize * alist[i]['ratio'];
			size = Math.max(alist[i]['min'], size);
			size = Math.min(alist[i]['max'], size);
			list = dw_getElementsBySelector(alist[i]['sel']);
			for (j = 0; list[j]; j++)
				list[j].style.fontSize = size+this.sizeUnit;
		}
		setCookie("fontSize", this.curSize, 180, "/");
	},

	reset: function()
	{
		if (!this.curSize || !dw_fontSizerDX.ready)
			return;

		var alist = this.adjustList, list, i, j;

		for (i = 0; alist[i]; i++)
		{
			list = dw_getElementsBySelector(alist[i]['sel']);

			for (j = 0; list[j]; j++)
				list[j].style.fontSize = '';
		}

		this.curSize = this.defaultSize;

		deleteCookie("fontSize", "/");
	}
}

function dw_getElementsBySelector(selector)
{
	if (!document.getElementsByTagName)
	return[];

	var nodeList = [document], tokens, bits, list, col, els, i, j, k;

	selector = selector.normalize();
	tokens = selector.split(' ');

	for (i = 0; tokens[i]; i++)
	{
		if (tokens[i].indexOf('#') != -1)
		{
			bits = tokens[i].split('#');
			var el = document.getElementById(bits[1]);

			if (!el)
				return[];

			if (bits[0])
				if (el.tagName.toLowerCase() != bits[0].toLowerCase())
					return[];

			for (j = 0; nodeList[j]; j++)
				if (nodeList[j] == document || dw_contained(el, nodeList[j]))
					nodeList = [el];
				else
					return[];
			continue;
		}
		else if (tokens[i].indexOf('.') != -1)
		{
			bits = tokens[i].split('.');
			col = [];

			for (j = 0; nodeList[j]; j++)
			{
				els = dw_getElementsByClassName(bits[1], bits[0], nodeList[j]);
				for (k = 0; els[k]; k++)
					col[col.length] = els[k];
			}
			nodeList = [];

			for (j = 0; col[j]; j++)
				nodeList.push(col[j]);

			continue;
		}
		else
		{
			els = [];

			for (j = 0; nodeList[j]; j++)
			{
				list = nodeList[j].getElementsByTagName(tokens[i]);
				for (k = 0; list[k]; k++)
				els.push(list[k]);
			}
			nodeList = els;
		}

	}
	return nodeList;
}

function dw_getElementsByClassName(sClass, sTag, oCont)
{
	var result = [], list, i;
	var re = new RegExp("\\b"+sClass+"\\b", "i");

	oCont = oCont? oCont: document;

	if (document.getElementsByTagName)
	{
		if (!sTag || sTag == "*")
			list = oCont.all? oCont.all: oCont.getElementsByTagName("*");
		else
			list = oCont.getElementsByTagName(sTag);
	}
	for (i = 0; list[i]; i++)
		if (re.test(list[i].className))
			result.push(list[i]);

	return result;
}

function dw_contained(oNode, oCont)
{
	if (!oNode)
		return;

	while(oNode = oNode.parentNode)
		if (oNode == oCont)
			return true;

	return false;
}

dw_fontSizerDX.ready = true;

if (!Array.prototype.push)
{
	Array.prototype.push = function()
	{
		for (var i = 0; arguments[i]; i++)
			this[this.length] = arguments[i];
		return this[this.length-1];
	}
}

String.prototype.normalize = function()
{
	var re = /\s\s+/g;
	return this.trim().replace(re, " ");
}

String.prototype.trim = function()
{
	var re = /^\s+|\s+$/;
	return this.replace(re, "");
}
