var ECache = [];
var aocl = 0;
function disp(id, v) {
	if(document.getElementById && id) {
		var el = $(id);
		if(el) {
			if(v == "toggle") {
				v = el.style.display;
				if(v == "none") {
					v = "";
				}
				else {
					v = "none";
				}
			}
			el.style.display = v;
		}
	}
}

function show(id) {
	disp(id, "");
}

function hide(id) {
	disp(id, "none");
}

function toggle(id) {
	disp(id, "toggle");
}

function jump(w) {
	var s = location + "";
	var l = s.split("#");
	location.replace(l[0] + w);
}

function $(id) {
	return document.getElementById(id);
}

function cset(id, content) {
	var l = document.getElementsByName(id);
	if(l.length == 0) {
		l = new Array();
		l[0] = document.getElementById(id);
	}
	var max = l.length;
	for(var i = 0; i < max; i++) {
		if(l[i]) {
			l[i].innerHTML = content;
		}
	}
}

function ccall(url, id, text) {
	cset(id, text);
	geturl(url, function(content) {
		cset(id, content); }
	, alert);
}

function aoc(el, func, arg) {
	var f = function(e) {
		aocc(func, e, el, arg);
	};
	el.onmousedown = function() {
	};
	el.onmouseup = f;
	el.ondblclick = f;
	el.onclick = function() {
	};
}



function aocc(func, e, el, arg) {
	var d = new Date;
	var diff = d.valueOf() - aocl;
	if(diff < 50) {
		return;
	}
	aocl = d.valueOf();
	if(window.event)e = window.event;
	if(e.type == "dblclick" && diff < 250) {
		return;
	}
	func(e, el, arg);
	if(window.event) {
		window.event.returnValue = false;
	}
	return false;
}

function cl(func, a) {
	return function() {
		func(a);
		return false;
	};
}

function cle(func, a, b) {
	return function(e) {
		func(a, e, b);
		return false;
	};
}

function ne(el) {
	if(!ECache[el])ECache[el] = document.createElement(el);
	return ECache[el].cloneNode(true);
}

window.T = function(a, c) {
	if(window == this ||!this.init)return new T(a, c);
	return this.init(a, c);
};
T.p = T.prototype;
T.p.T = 1;
T.func = function(fn) {
	if(typeof fn == "string")fn = eval("false||function(a,i){return " + fn + "}");
	return fn;
};
T.grep = function(l, fn, n) {
	fn = T.func(fn);
	var r = [];
	for(var i = 0, il = l.length; i < il; i++) {
		var t = fn.call(l[i], i);
		if(t &&!n ||!t && n)r.push(l[i]);
	}
	return r;
};
T.p.grep = function(f, n) {
	return T(T.grep(this.a, f, n));
};
T.p.id = function(id) {
	return this.grep("this.id='" + id + "'");
};
T.p.init = function(a, c) {
	if(!a) {
		this.a = [];
		return this;
	}
	if(typeof a == "string") {
		var m = a.match(/^#(.+)$/);
		if(m) {
			if(c) {
				return T('*', c).id(a);
			}
			else {
				var tmp = document.getElementById(m[1]);
				if(tmp) {
					if(tmp.id != m[1]) {
						return T('*').id(a);
					}
					else {
						a = [tmp];
					}
				}
				else {
					a = [];
				}
				this.a = a;
			}
		}
		else {
			c = c || document;
			this.a = c.getElementsByTagName(a);
		}
	}
	else {
		this.a = a.a ? a.a : a.length ? a : [a];
	}
	return this;
};
T.p.children = function(s) {
	var l = [];
	var a = this.a;
	if(s)s = s.toUpperCase();
	for(var i = 0, il = a.length; i < il; i++) {
		var c = a[i].childNodes;
		for(var j = 0, jlen = c.length; j < jlen; j++) {
			if(c[j].tagName && (!s || s == c[j].tagName.toUpperCase())) {
				l.push(c[j]);
			}
		}
	}
	return T(l);
};
T.p.eq = function(n) {
	if(this.a[n]) {
		return T([this.a[n]]);
	}
	else {
		return T();
	}
};
T.p.Remove = function() {
	this.each("this.parentNode.removeChild(this)");
	this.a = [];
	return this;
};
T.p.Css = function(s, v) {
	var a = this.a;
	for(var i = 0, il = a.length; i < il; i++) {
		a[i].style[s] = v;
	}
	return this;
};
T.p.each = function(fn) {
	T.each(this.a, fn);
	return this;
};
T.each = function(l, fn) {
	fn = T.func(fn);
	var il;
	if(il = l.length)for(var i = 0; i < il; i++)fn.call(l[i], i);
	else for(var i in l)fn.call(i);
	return l;
};
T.p.add = function(t) {
	if(t.a)t = t.a;
	var a = this.a;
	for(var i = 0, il = t.length; i < il; i++) {
		a.push(t[i]);
	}
	return this;
};
T.p.find = function(s) {
	s = s || '*';
	if(this.a.length == 1) {
		return T(this.a[0].getElementsByTagName(s));
	}
	else {
		var a = [];
		for(var i = 0, il = this.a.length; i < il; i++) {
			var l = this.a[i].getElementsByTagName(s);
			for(var j = 0, jlen = l.length; j < jlen; j++) {
				a.push(l[j]);
			}
		}
		return T(a);
	}
};
T.p.push = function(x) {
	this.a.push(x);
	return this;
};
T.p.Set = function(s, v) {
	var a = this.a;
	var m = s.split(/\./);
	if(m[1]) {
		var f = "";
		for(var i = 0; m[i]; i++) {
			f += "['" + m[i] + "']";
		}
		this.each("this" + f + "='" + v + "'");
	}
	else {
		for(var i = 0, il = a.length; i < il; i++) {
			a[i][s] = v;
		}
	}
	return this;
};




var Table = {

	isOdd: false,
	checkStatus: false,

	add : function(tabid, head, body) {
		Table.adding = true;
		var t = Table[tabid] = {body : body, head : head, tab : T("#" + tabid)};
		Table.init(tabid);
		if(body.length) {
			Table.page(tabid);
		}
		if(t.changed) {
			Table.write(tabid, 1);
		}
		Table.adding = false;
	},

	page : function(tabid) {
		var t = Table[tabid];
		var id = tabid + "-page";

		// This DIV tag is to create the "Show All" at the bottom
		var div = ne("div");
		div.id = id + "-div";
		div.className = "table-page";
		div.align = "center";

		// This DIV tag is to create the "Show All" at the top
		var div2 = ne("div");
		div2.id = id + "-div2";
		div2.className = "table-page";
		div2.align = "center";

		var l = [];
		for(var x in t.cat) {
			if(t.cat[x])l.push(x);
		}
		if(l.length) {
			var divcat = ne("div");
			divcat.id = id + "-cat";
			divcat.className = "table-page-cat";
			var x = Table.categorize(tabid, l.join(", "));
			if(l.length == 1) {
				divcat.innerHTML = "Category: " + x + " (<a href='javascript:;' class=x onclick=\"Table.catclick(this,'" + tabid + "','CLEAR')\">Clear</a>)";
			}
			else {
				divcat.innerHTML = "Categories: " + x + " (<a href='javascript:;' class=x onclick=\"Table.catclick(this,'" + tabid + "','CLEAR')\">Clear</a>)";
			}
			divcat.style.fontSize = '80%';
			div.appendChild(divcat);
		}

		var button = ne("input");
		button.type = "button";
		button.id = id;

		button.style.width = "55px";
		button.style.height = "25px";
		button.style.padding = "0px";
		button.style.textAlign = 'center';
		css.addClassToElement(button, 'greybutton');

		var space = ne("span");
		space.innerHTML = "&nbsp;";
		var c, d;
		if(t.collapsed) {

			d = button.cloneNode(true);
			d.onclick = Table.uncollapse;
			d.value = "Show";
			d.style.width = "500px";
			div2.appendChild(d);

			c = button.cloneNode(true);
			c.onclick = Table.uncollapse;
			c.value = "Show";
			c.style.width = "500px";
			div.appendChild(c);
		}
		else if(t.all) {

			d = button.cloneNode(true);
			d.onclick = Table.unall;
			d.value = " << \u2191 >> ";
			d.style.width = "100px";
			div2.appendChild(d);

			c = button.cloneNode(true);
			c.onclick = Table.unall;
			c.value = " << \u2191 >> ";
			c.style.width = "100px";
			div.appendChild(c);

		}
		else {
			if(t.pages > 1) {

				d = button.cloneNode(true);
				d.onclick = Table.all;
				var ar = "\u2193";
				var sp = " ";
				d.value = ar + sp + sp + sp + sp + "Show All" + sp + sp + sp + sp + ar;
				d.style.height = "25px";
				d.style.width = "500px";
				d.style.display = 'block';
				div2.appendChild(d);

				d = button.cloneNode(true);
				d.onclick = Table.first;
				d.value = "\u00AB First";
				div2.appendChild(d);

				d = button.cloneNode(true);
				d.onclick = Table.last;
				d.value = "Last \u00BB";
				div2.appendChild(d);
				div2.appendChild(space.cloneNode(true));

				t.canpage = 1;

				c = button.cloneNode(true);
				c.onclick = Table.all;
				var ar = "\u2193";
				var sp = " ";
				c.value = ar + sp + sp + sp + sp + "Show All" + sp + sp + sp + sp + ar;
				c.style.height = "25px";
				c.style.width = "500px";
				c.style.display = 'block';
				div.appendChild(c);

				c = button.cloneNode(true);
				c.onclick = Table.first;
				c.value = "\u00AB First";
				div.appendChild(c);

				c = button.cloneNode(true);
				c.onclick = Table.last;
				c.value = "Last \u00BB";
				div.appendChild(c);

				div.appendChild(space.cloneNode(true));

			}
			if((t.pagesize > t.origpagesize && t.rows.length > t.origpagesize) || t.pages > 1) {
				d = button.cloneNode(true);
				d.onclick = Table.shrink;
				d.value = "\u2191";
				d.style.width = "20px";
				div2.appendChild(d);

				c = button.cloneNode(true);
				c.onclick = Table.shrink;
				c.value = "\u2191";
				c.style.width = "20px";
				div.appendChild(c);
			}
			if(t.pages > 1) {

				var sel = document.createElement("select");
				sel.onclick = Table.select;
				sel.id = id + "-top-select";
				opt = document.createElement("option");
				for(var i = 1; i <= t.pages; i++) {
					var a = opt.cloneNode(false);
					a.innerHTML = "Page " + i + " of " + t.pages;
					a.value = i;
					sel.appendChild(a);
				}
				div2.appendChild(sel);

				d = button.cloneNode(true);
				d.onclick = Table.expand;
				d.value = "\u2193";
				d.style.width = "20px";
				div2.appendChild(d);

				div2.appendChild(space.cloneNode(true));
				d = button.cloneNode(true);

				aoc(d, Table.prev);
				d.value = "< Prev";
				div2.appendChild(d);

				d = button.cloneNode(true);
				aoc(d, Table.next);
				d.value = "Next >";
				div2.appendChild(d);


				sel = document.createElement("select");
				sel.onclick = Table.select;
				sel.id = id + "-bottom-select";
				var opt = document.createElement("option");
				for(var i = 1; i <= t.pages; i++) {
					var a = opt.cloneNode(false);
					a.innerHTML = "Page " + i + " of " + t.pages;
					a.value = i;
					sel.appendChild(a);
				}
				div.appendChild(sel);

				c = button.cloneNode(true);
				c.onclick = Table.expand;
				c.value = "\u2193";
				c.style.width = "20px";
				div.appendChild(c);

				div.appendChild(space.cloneNode(true));

				c = button.cloneNode(true);
				aoc(c, Table.prev);
				c.value = "< Prev";
				div.appendChild(c);

				c = button.cloneNode(true);
				aoc(c, Table.next);
				c.value = "Next >";
				div.appendChild(c);

			}
		}
		var tt = t.tab.a[0];
		if(tt.nextSibling) {
			tt.parentNode.insertBefore(div, tt.nextSibling);

			// Clear all child elements we inserted, this is to toggle between "Show All" or otherwise
			var insertHere = tt.previousSibling;
			var kids = insertHere.childNodes;
			for (j=0; j < kids.length; j++) {
				insertHere.removeChild(kids[j]);
			}
			insertHere.appendChild(div2);
		}
		else {
			tt.parentNode.appendChild(div);
		}
		//---var insertHere = document.getElementById('tabletop');
		//---insertHere.parentNode.insertBefore(div,insertHere);
	},

	etabid : function(el) {
		var tabid = el.id.replace("-page", "").replace("-select", "");
		var reg = new RegExp("-(top|bottom)");
		tabid = tabid.replace(reg, "");
		return tabid;
	},

	select : function(e) {
		var tabid = Table.etabid(this);
		Table[tabid].page = this.value;
		Table.write(tabid);
	},

	next : function(e, el) {
		var tabid = Table.etabid(el);
		if(Table[tabid].page < Table[tabid].pages) {
			Table[tabid].page++;
			Table.write(tabid);
		}
	},

	prev : function(e, el) {
		var tabid = Table.etabid(el);
		if(Table[tabid].page > 1) {
			Table[tabid].page--;
			Table.write(tabid);
		}
	},

	first : function(e) {
		var tabid = Table.etabid(this);
		Table[tabid].page = 1;
		Table.write(tabid);
	},

	last : function(e) {
		var tabid = Table.etabid(this);
		Table[tabid].page = Table[tabid].pages;
		Table.write(tabid);
	},

	current : function(e) {
		Table.checkStatus = true;
		var tabid = Table.etabid(this);
		Table.write(tabid);
		Table.checkStatus = false;
	},

	shrink : function(e) {
		Table.resize(Table.etabid(this), - 100);
	},

	expand : function(e) {
		Table.resize(Table.etabid(this), 100);
	},

	all : function(e) {
		var tabid = Table.etabid(this);
		Table.wait(this, function() {
			Table.allcb(tabid); }
		);
	},

	allcb : function(tabid) {
		var t = Table[tabid];
		t.all = 1;
		Table.newpage(tabid);
		Table.write(tabid, 1);
	},

	unall : function(e) {
		var tabid = Table.etabid(this);
		var t = Table[tabid];
		t.all = null;
		Table.newpage(tabid);
		Table.write(tabid, 1);
		Table.top(tabid);
	},

	top : function(tabid) {
		if(Table.adding)return;
		var t = Table[tabid];
		jump("#" + t.topid);
		Table.urlify();
	},

	resize : function(tabid, mult) {
		var t = Table[tabid];
		t.pagesize = Math.ceil(t.pagesize + mult);
		if(t.pagesize < 1) {
			t.pagesize = 1;
		}
		Table.newpage(tabid);
		Table.write(tabid, 1);
		Table.top(tabid);
	},

	newpage : function(tabid) {
		var t = Table[tabid];
		if(!t.init) {
			return;
		}
		if(t.pagesize) {
			t.pages = Math.ceil(t.rows.length / t.pagesize);
		}
		else {
			t.pages = 1;
		}
		t.page = 1;
		T("#" + tabid + "-page-div").Remove();
		Table.page(tabid);
	},

	init : function(tabid) {

		var t = Table[tabid];
		var rows = [];
		t.tab.children('tbody').eq(0).children('tr').each(function() {

			var cols = [];
			T([this]).children('td').each(function(i) {
				cols[i] = this.innerHTML; 
				if(t.head[i].c) {
					var x = Table.categorize(tabid, cols[i]); 
					if(x != cols[i]) {
						this.innerHTML = x; 
					}
				}
			}

			); rows.push( {cols : cols, tr : this});}
		);

		t.Trows = T(rows[0].tr);
		for(var i = 1; rows[i]; i++) {
			t.Trows.push(rows[i].tr);
		}
		for(var i = 0, len = t.head.length; i < len; i++) {
			if(t.head[i].h) {
				t.head[i].h = true;
			}
			t.head[i].origh = t.head[i].h;
		}
		t.tab.children('thead').find('a').each(function() {
			if(this.id) {
				t.head[parseInt(this.id.substr(2, 2))].el = this; }
		}
		);
		t.page = 1;
		t.pagesize = rows.length;
		if(t.pagesize <= 0)t.pagesize = 8;
		t.origpagesize = t.pagesize;
		for(var i = 0, tlen = t.body.length; i < tlen; i++) {
			rows.push( {cols : t.body[i]} );
		}


		t.rows = rows;
		t.allrows = rows;
		t.body = null;
		var do_hline = false;

		if(rows.length > 2) {
			do_hline = true;
		}
		else {
			for(var i = 0, len = t.head.length; i < len; i++) {
				if(t.head[i].h) {
					do_hline = true;
					break;
				}
			}
		}
		t.topid = tabid;

		if(do_hline) {

			var div = ne("div");

			var html = "<div><a href='javascript:;' onclick=\"Table.searchtoggle('" + tabid + "');\" class=\"menulink\">Search Table</a><span id='" + tabid + "-search' style='display:none'>: <input type='text' id='" + tabid + "-searchbox' size=20 onkeyup=\"Table.search('" + tabid + "');\"></span>";
			html += " | Click Column Headers to Sort";
			html += " | <a href='javascript:;' onclick=\"toggle('" + tabid + "-columns');\" class=\"menulink\">Columns</a>";
			html += "</div>";

			html += "<div id='" + tabid + "-columns' style='display:none' class='center'>";
			for(var i = 0, len = t.head.length; i < len; i++) {
				html += t.head[i].n + ":";
				var checked = "";
				if(!t.head[i].h) {
					checked = " checked";
				}
				var id = tabid + "-col" + i;
				html += "<input type='checkbox'" + checked + " onclick=\"Table.colclick('" + id + "');\" id='" + id + "' class=\"chex\">";
				html += " &nbsp; ";
			}
			html += "</div>";


			div.innerHTML = html;
			t.topid = div.id = tabid + '-top';
			var tt = t.tab.a[0];

			//alert(" [" + t + "] [" + t.tab + "] [" + tt + "] ");

			//--if(tt.nextSibling) {
			//	tt.parentNode.insertBefore(div, tt);
			//}
			//else {
			//	tt.parentNode.appendChild(div);
			//--}
			

			var div2 = ne("div");
			div2.id = tabid + '-top-show-all';
			tt.parentNode.insertBefore(div2, tt);


		}

		var s = location + "";
		var l = s.split("#");
		if(l[1]) {
			var m = l[1].split(";");
			for(var i = 0, len = m.length; i < len; i++) {
				m[i] += ":::::::";
				var mm = m[i].split(":");
				if(mm[0] && tabid == "tab" + mm[0]) {
					if(mm[2] != "") {
						if(mm[2] == "A") {
							t.all = 1;
						}
						else if(mm[2] == "C") {
							t.collapsed = 1;
						}
						else {
							t.pagesize = parseInt(mm[2]);
						}
					}
					if(mm[3] != "") {
						var col = parseInt(mm[3]);
						var reverse;
						if(mm[3].substr(0, 1) == "-") {
							col *=- 1;
							reverse = true;
						}
						var a = t.head[col].el;
						Table.sort(tabid, a.id, a, 1);
						if(reverse != t.lastsort.reverse) {
							Table.sort(tabid, a.id, a, 1);
						}
					}
					if(mm[4] != "") {
						var s = mm[4].replace("+", " ");
						Table.searchtoggle(tabid);
						$(tabid + "-searchbox").value = s;
						Table.search(tabid);
					}
					if(mm[5] != "") {
						var m = mm[5].split(",");
						for(var j = 0, jlen = m.length; j < jlen; j++) {
							var s = m[j].replace("+", " ");
							Table.cat(tabid, s);
						}
					}
					if(mm[6] != "") {
						var cols;
						if(t.head.length > 10) {
							cols = mm[6].split(",");
						}
						else {
							cols = mm[6].split("");
						}
						for(var c = 0, clen = cols.length; c < clen; c++) {
							Table.colclick(tabid + "-col" + cols[c], true);
						}
					}
					if(mm[1] != "") {
						t.page = parseInt(mm[1]);
					}
					t.changed = 1;
					break;
				}
			}
		}
		t.pages = Math.ceil(t.rows.length / t.pagesize);
		t.init = 1;
	},

	urlify : function() {
		if(Table.adding)return;
		var u = [];
		for(var tabid in Table) {
			var t = Table[tabid];
			if(t && typeof(t) == "object" && t.head) {
				var id = tabid.match(/tab(.+)/)[1];
				var v = [];
				if(t.page != 1) {
					v[0] = t.page;
				}
				if(t.all) {
					v[1] = "A";
				}
				else if(t.collapsed) {
					v[1] = "C";
				}
				else if(t.pagesize != t.origpagesize) {
					v[1] = t.pagesize;
				}
				if(t.lastsort) {
					if(t.lastsort.reverse) {
						v[2] = "-" + t.lastsort.h;
					}
					else {
						v[2] = t.lastsort.h;
					}
				}
				var sdiv = $(tabid + "-search");
				if(sdiv && sdiv.style.display == "") {
					var s = $(tabid + "-searchbox").value;
					if(s && s != "") {
						s = s.replace(" ", "+");
						v[3] = s;
					}
				}
				if(t.cat) {
					var sv = [];
					for(var c in t.cat) {
						if(t.cat[c]) {
							var s = c.replace(" ", "+");
							sv.push(s);
						}
					}
					if(sv.length > 0) {
						v[4] = sv.join(",");
					}
				}
				var h = [];
				for(var i = 0, len = t.head.length; i < len; i++) {
					if(t.head[i].h != t.head[i].origh) {
						h.push(i);
					}
				}
				if(h.length > 0) {
					if(t.head.length > 10) {
						v[5] = h.join(",");
					}
					else {
						v[5] = h.join("");
					}
				}
				var s = v.join(":");
				if(s != "") {
					u.push(id + ":" + s);
				}
			}
		}
		if(u.length > 0) {
			jump("#" + u.join(";"));
		}
		else {
			jump("#A:");
		}
	},

	colclick : function(id, toggle) {


		var el = $(id);

		var m = id.split("-col");
		var col = m[1];
		var tabid = m[0];
		var t = Table[tabid];
		var d;
		if(toggle) {
			el.checked =!el.checked;
		}
		if(!el.checked) {
			t.head[col].h = true;
			d = "none";
		}
		else {
			t.head[col].h = false;
			d = "";
		}


		//---alert("[" + id + "] [" + toggle + "] [" + el + "] [" + d + "] [" + col + "]");


		t.head[col].el.parentNode.style.display = d;
		t.Trows.each(function() {
			T(this).children().eq(col).Css("display", d); }
		);
		Table.urlify();
	},

	click : function(a) {
		var tab = a;
		while(tab.tagName.toLowerCase() != "table")tab = tab.parentNode;
		a.style.cursor = 'wait';
		document.body.style.cursor = 'wait';
		Table.wait(a, function() {
			Table.sort(tab.id, a.id, a); }
		);
	},

	wait : function(a, f) {
		a.style.cursor = 'wait';
		document.body.style.cursor = 'wait';
		setTimeout(function() {
			f(); document.body.style.cursor = 'auto'; a.style.cursor = 'auto'; }
		, 5);
	},

	inner : function(e, v) {
		e.innerHTML = v;
	},

	addtr : function(tabid, r) {
		var t = Table[tabid];
		var tr = ne('tr');

		for(var j = 0, hlen = r.cols.length; j < hlen; j++) {
			var td = ne('td');
			td.align = t.head[j].a;
			if(t.head[j].c) {
				td.innerHTML = Table.categorize(tabid, r.cols[j]);
			}
			else {
				td.innerHTML = r.cols[j];
			}
			if(t.head[j].h) {
				td.style.display = "none";
			}
			tr.appendChild(td);
		}
		r.tr = tr;
		t.Trows.push(tr);
		return tr;
	},


	categories : function(x) {
		return x.replace(/^\s+/,"").replace(/\s*$/,"").replace(/\s*,\s*/g,",").replace(/<[^>]*>/g,"").split(",");
	},


	categorize : function(tabid, x) {
		var c = Table.categories(x);
		for(var k = 0, klen = c.length; k < klen; k++) {
			var y = c[k].replace(/\x27/g,"\\'");
			x = x.replace(c[k], "<a href='javascript:;' class=x onclick=\"Table.catclick(this,'" + tabid + "','" + y + "')\">" + c[k] + "</a>");
		}
		return x;
	},

	catclick : function(a, tabid, cat) {
		Table.wait(a, function() {
			Table.cat(tabid, cat); }
		);
	},

	catset : function(tabid, cat) {
		var t = Table[tabid];
		if(!(t.cat && t.cat[cat])) {
			t.cat = {
			};
		}
		Table.cat(tabid, cat);
	},

	uncat : function(tabid) {
		var t = Table[tabid];
		if(t.catrows) {
			for(var i = 0, len = t.catrows.length; i < len; i++) {
				t.rows.push(t.catrows[i]);
			}
			t.catrows = false;
		}
	},

	cat : function(tabid, cat) {
		var t = Table[tabid];
		if(!t.categorized) {
			var r = t.allrows;
			var hcats = [];
			for(var i = 0, len = t.head.length; i < len; i++) {
				if(t.head[i].c) {
					hcats.push(i);
				}
			}
			var hlen = hcats.length;
			for(var i = 0, len = r.length; i < len; i++) {
				var cats = r[i].cats = {
				};
				for(var h = 0; h < hlen; h++) {
					var c = Table.categories(r[i].cols[hcats[h]]);
					for(var j = 0, jlen = c.length; j < jlen; j++) {
						cats[c[j]] = 1;
					}
				}
			}
			t.categorized = 1;
		}
		Table.uncat(tabid);
		if(!t.cat)t.cat = {
		};
		t.cat[cat] =!t.cat[cat];
		if(cat == "CLEAR") {
			t.cat = {
			};
		}
		Table.unsearch(tabid);
		Table.catfilter(tabid);
		Table.searchfilter(tabid);
		Table.newpage(tabid);
		if(t.lastsort) {
			Table.sort(tabid);
		}
		else {
			Table.write(tabid);
		}
		if(t.all)Table.top(tabid);
	},

	catfilter : function(tabid) {
		var t = Table[tabid];
		if(!t.categorized)return;
		if(t.cat) {
			var l = [];
			for(var x in t.cat) {
				if(t.cat[x])l.push(x);
			}
			if(!l.length) {
				return;
			}
		}
		t.catrows = [];
		var rows = [];
		var r = t.rows;
		for(var i = 0, len = r.length; i < len; i++) {
			var hit = 1;
			for(var c in t.cat) {
				if(t.cat[c] &&!r[i].cats[c]) {
					hit = 0;
					break;
				}
			}
			if(hit) {
				rows.push(r[i]);
			}
			else {
				if(r[i].tr) {
					r[i].tr.style.display = 'none';
				}
				t.catrows.push(r[i]);
			}
		}
		if(!t.catrows[0]) {
			t.catrows = false;
		}
		t.rows = rows;
	},

	searchtoggle : function(tabid) {
		var t = Table[tabid];
		var sdiv = t.sdiv ? t.sdiv : t.sdiv = $(tabid + "-search");
		if(sdiv.style.display == "none") {
			sdiv.style.display = "";
			$(tabid + "-searchbox").focus();
			if(!t.searchinit) {
				var r = t.allrows;
				var hlen = t.head.length;
				for(var i = 0, len = r.length; i < len; i++) {
					var search = "";
					for(var h = 0; h < hlen; h++) {
						search = search + " " + r[i].cols[h];
					}
					r[i].search = search.replace(/.*?<\/script>/g,"").replace(/<[^>]*>/g,"").replace(/ /g," ").replace(/\s+/g," ");
				}
				t.searchinit = 1;
			}
			if($(tabid + "-searchbox").value != "") {
				Table.search(tabid);
			}
		}
		else {
			sdiv.style.display = "none";
			if(t.searchrows) {
				for(var i = 0, len = t.searchrows.length; i < len; i++) {
					t.rows.push(t.searchrows[i]);
				}
				t.searchrows = null;
			}
			Table.newpage(tabid);
			Table.sort(tabid);
		}
	},

	unsearch : function(tabid) {
		var t = Table[tabid];
		if(t.searchrows) {
			for(var i = 0, len = t.searchrows.length; i < len; i++) {
				t.rows.push(t.searchrows[i]);
			}
			t.searchrows = null;
		}
	},

	search : function(tabid) {
		Table.unsearch(tabid);
		Table.searchfilter(tabid);
		Table.newpage(tabid);
		Table.sort(tabid);
	},

	searchfilter : function(tabid) {
		var t = Table[tabid];
		if(!t.searchinit) {
			return;
		}
		var searchbox = t.searchbox ? t.searchbox : t.searchbox = $(tabid + "-searchbox");
		if(!t.sdiv || t.sdiv.style.display == "none") {
			return;
		}
		var s = searchbox.value;
		if(s == "") {
			return;
		}
		t.searchrows = [];
		var rows = [];
		var r = t.rows;
		var re = new RegExp(s, "i");
		for(var i = 0, len = r.length; i < len; i++) {
			if(r[i].search.match(re)) {
				rows.push(r[i]);
			}
			else {
				if(r[i].tr) {
					r[i].tr.style.display = 'none';
				}
				t.searchrows.push(r[i]);
			}
		}
		t.rows = rows;
	},

	write : function(tabid, resize) {
		var t = Table[tabid];
		if(!t.init) {
			return;
		}
		var tbody = t.tab.children("tbody").a[0];
		var tab = t.tab.a[0];
		var r = t.rows;
		var hlen = t.head.length;
		var min = (t.page - 1) * t.pagesize;
		var max = min + t.pagesize;
		var div = T("#" + tabid + "-page-div").a[0];
		var startheight = tab.clientHeight;
		var startwidth = tab.clientWidth;
		tab.style.width = '';
		if(t.collapsed) {
			min = 0;
			max = 0;
		}
		else if(t.all) {
			min = 0;
			max = t.rows.length;
		}


		for(var i = 0, len = r.length; i < len; i++) {

			if(i >= min && i < max) {
				var tr = r[i].tr;
				if(!tr)tr = Table.addtr(tabid, r[i]);
				tr.style.display = '';
				tbody.appendChild(tr);
			}
			else {
				if(r[i].tr) {
					r[i].tr.style.display = 'none';
				}
			}
		}

		T("#" + tabid + "-page-bottom-select").Set("value", t.page);

		T("#" + tabid + "-page-top-select").Set("value", t.page);

		if(!resize && div) {
			var diff = startheight - tab.clientHeight;
			var base = Table.toNumber(div.style.marginTop) + 0;
			if(base + diff > 0) {
				div.style.marginTop = base + diff;
			}
			else {
				div.style.marginTop = 0;
			}
			diff = startwidth - tab.clientWidth;
			if(diff > 0) {
				tab.style.width = startwidth + 2;
			}
		}

		Table.urlify();

		Table.isOdd = false;
		var myTable = document.getElementById('tabA')
		var myTableRows = myTable.getElementsByTagName("tr")
		for (var i=0;i<myTableRows.length;i++) { 
				this.doStripe(myTableRows[i]);
		}

		return;
	},

	noarrow : function(tabid) {
		if(Table[tabid].arrow) {
			Table[tabid].arrow.parentNode.removeChild(Table[tabid].arrow);
		}
	},

	sort : function(tabid, hid, a, nowrite) {

		var t = Table[tabid];
		var type, h;
		var resort = 0;

		if(hid) {
			var m = hid.match(/^(..)(\d+)$/);
			type = m[1];
			h = m[2];
		}
		else if(t.lastsort) {
			type = t.lastsort.type;
			h = t.lastsort.h;
			a = t.lastsort.a;
			resort = 1;
		}
		else {
			Table.write(tabid);
			return;
		}


		//---alert("[" + hid + "] [" + a + "] [" + type + "] [" + h + "]");


		var reverse = false;
		Table.noarrow(tabid);
		t.arrow = ne('span');
		a.parentNode.appendChild(t.arrow);


		if(!resort && t.lastsort && t.lastsort.h == h && type != 'bb') {
			reverse =!t.lastsort.reverse;
			t.rows.reverse();
		}
		else {

			if(type == 'cs') { //==== CURRENCY SORT ====
				t.rows.sort(function(a, b) {
					var multi = 1;
					var am = a.cols[h].substring(0,1);
					var aa = a.cols[h].replace(/[^0-9.]/g,'');
					var ad = parseFloat(aa);

					if(am == "-"){
						multi = -1;
					}
					else {
						multi = 1;
					}
					ad = ad * multi;

					var bm = b.cols[h].substring(0,1);
					var bb = b.cols[h].replace(/[^0-9.]/g,'');
					var bd = parseFloat(bb);

					if(bm == "-"){
						multi = -1;
					}
					else {
						multi = 1;
					}
					bd = bd * multi;

					//---alert("[" + ad + "] [" + bd + "]");

					return ad - bd;
				});
			}
			else if(type == 'bb') { //==== BOOLEAN (Check Box) 

				t.rows.sort(function(a, b) {

					var aa = 0;
					var bb = 0;

					if(a.tr){ 
						for(var x=0, l=a.tr.childNodes.length; x<l; x++){
							Table.checkSortWalkNodes(a.tr.childNodes[x]);
						}
						if( Table.checkStatus ){ 
							aa = 1;
						}
						else {
							aa = 0;
						}
					}
					else {
						aa = 0;
					}
					if(b.tr){ 
						for(var x=0, l=b.tr.childNodes.length; x<l; x++){
							Table.checkSortWalkNodes(b.tr.childNodes[x]);
						}
						if( Table.checkStatus ){ 
							bb = 1;
						}
						else {
							bb = 0;
						}
					}
					else {
						bb = 0;
					}

					//---alert("A:[" + aa + "]\nB:[" + bb + "]");

					if (aa == bb) {
						return 0;
					} else if (bb < aa) {
						return -1;
					} else {
						return 1;
					}
				});
			}
			else if(type == 'ps') { //==== NUMBER WITH PERCENTAGE SIGN ====

				t.rows.sort(function(a, b) {
					var aa = a.cols[h].replace(/[^0-9.]/g,'');
					var ad = parseFloat(aa);
					var bb = b.cols[h].replace(/[^0-9.]/g,'');
					var bd = parseFloat(bb);
					return ad - bd;
				});
			}
			else if(type == 'ss') { //==== PURE STRING 

				t.rows.sort(function(a, b) {

					var aa = a.cols[h].toLowerCase();
					var bb = b.cols[h].toLowerCase();

					//---alert("[" + aa + "] [" + bb + "]");

					if (aa==bb) {
						 return 0;
					} else if (aa<bb) {
						return -1;
					} else {
						return 1;
					}
				});
			}
			else if(type == 'sl') { //==== STRING INSIDE A LINK

				t.rows.sort(function(a, b) {

					var aa = a.cols[h].replace(/<a[^href]+href=\"[^\"]*\"[^>]*>(.*?)<\/a>/ig,"$1").toLowerCase();
					var bb = b.cols[h].replace(/<a[^href]+href=\"[^\"]*\"[^>]*>(.*?)<\/a>/ig,"$1").toLowerCase();

					//---alert("[" + aa + "] [" + bb + "]");

					if (aa==bb) {
						 return 0;
					} else if (aa<bb) {
						return -1;
					} else {
						return 1;
					}
				});
			}
			else if(type == 'nc') { //==== NUMBER WITH COMMAS ====

				t.rows.sort(function(a, b) {
					var aa = a.cols[h].replace(/[^0-9.]/g,'');
					var ad = parseFloat(aa);
					var bb = b.cols[h].replace(/[^0-9.]/g,'');
					var bd = parseFloat(bb);
					return ad - bd;
				});

			}
			else if(type == 'nd') { //==== PLAIN DECIMAL NUMBER (FLOAT) ====

				t.rows.sort(function(a, b) {

					var aa = parseFloat(a.cols[h]);
					if (isNaN(aa)) { 
						aa = 0;
					}
					var bb = parseFloat(b.cols[h]); 
					if (isNaN(bb)) { 
						bb = 0;
					}
					return aa - bb;
				});
			}
			else if(type == 'ni') { //==== NUMBER INSIDE AN INPUT BOX ====

				t.rows.sort(function(a, b) {

					var aa = a.cols[h].match(/value=\"(.*?)\"/ig);
					var bb = b.cols[h].match(/value=\"(.*?)\"/ig);
					var ad = parseFloat(aa[0].replace(/[^0-9.]/g,''));
					var bd = parseFloat(bb[0].replace(/[^0-9.]/g,''));

					//---alert("[" + ad + "] [" + bd + "]");

					if (isNaN(ad)) { 
						ad = 0;
					}
					if (isNaN(bd)) { 
						bd = 0;
					}
					return ad - bd;
				});
			}
			else {
				t.rows.sort(function(a, b) {
					return(a.cols[h] == b.cols[h] ? 0 : a.cols[h] < b.cols[h] ?- 1 : 1); 
				});
			}

		}	

		if(resort && t.lastsort.reverse != reverse) {
			t.rows.reverse();
			reverse =!reverse;
		}
		t.arrow.innerHTML = reverse ? "&nbsp;\u2191" : "&nbsp;\u2193";
		t.page = 1;
		t.lastsort = {type : type, h : h, reverse : reverse, a : a};

		if(!nowrite) {
			Table.write(tabid);
		}
	},

	toNumber : function(x) {
		if(typeof x == "string") {
			m = x.match(/document.write\(([^\)]+)\)/); if(m) {
				return Table.toNumber(eval(m[1])); }
			m = x.match(/<\!--(.+?)-->/); if(m) {
				return Table.toNumber(m[1]); }
			x = x.replace(/onmouseover=\x22[^\x22]*\s22/g, ""); x = x.replace(/<[^\!][^>]*?>/g, ""); var m = x.match(/(?:\+|)((?:\-|)[0-9]+(?:\.[0-9]+|))/); if(m) {
				return parseFloat(m[1]); }
		}
		else if(typeof x == "number") {
			return x; 
		}
		return 0;
	},

	numeric : function(r, h) {
		if(r[0] && (!r[0].num || isNaN(r[0].num[h]))) {
			for(var i = 0, len = r.length;
			i < len;
			i++) {
				if(!r[i].num) {
					r[i].num = []; }
				r[i].num[h] = Table.toNumber(r[i].cols[h]); }
		}
	},

	doStripe : function(rowItem) {
		if (Table.isOdd) {
			css.addClassToElement(rowItem, 'odd');
		} 
		else {
			css.removeClassFromElement(rowItem, 'odd');
		}
		Table.isOdd = !Table.isOdd;
	},

	checkSelect : function(a,s) { 

		Table.checkStatus = s;
		var tab = a;
		while(tab.tagName.toLowerCase() != "table")tab = tab.parentNode;
		var tabid = tab.id;
		var t = Table[tabid];
		var r = t.rows;

		for(var i = 0, len = r.length; i < len; i++) {
			if( (!r[i].tr) || (r[i].tr.style.display == 'none') ){
				//--nothing to do
			}
			else {
				for(var x=0,l=r[i].tr.childNodes.length; x<l; x++){
					Table.checkSelectWalkNodes(r[i].tr.childNodes[x]);
				}
			}
		}
	},

	checkSelectWalkNodes : function(node) {

		if (node == null) {
			return;
		}
		if(node.id == 'checker'){
			node.checked=Table.checkStatus;
			return;
		}
		for (var i = 0; i < node.childNodes.length; i++) {
			Table.checkSelectWalkNodes(node.childNodes[i]);
		}
	},

	checkSortWalkNodes : function(node) {

		if (node == null) {
			return;
		}
		if(node.id == 'checker') {
			Table.checkStatus = node.checked;
		}
		for (var i = 0; i < node.childNodes.length; i++) {
			Table.checkSortWalkNodes(node.childNodes[i]);
		}
	},

	detailView : function() {


	}

}; 

	T.p.Hide = function() {
		return this.Css("display", "none"); }; T.p.Show = function() {
		return this.Css("display", ""); }; function map(id) {
		  toggle(id); toggle(id + 'm');
  }


