// xTable r1, Copyright 2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xTable(sTableId, sRoot, sCC, sFR, sFRI, sRCell, sFC, sFCI, sCCell, sTC, sCellT)
{
var i, ot, cc=null, fcw, frh, root, fr, fri, fc, fci, tc;
var e, t, tr, a, alen, tmr=null;
ot = xGetElementById(sTableId); // original table
if (!ot || !document.createElement || !document.appendChild || !ot.deleteCaption || !ot.deleteTHead) {
return null;
}
fcw = xWidth(ot.rows[1].cells[0]); // get first column width before altering ot
frh = xHeight(ot.rows[0]); // get first row height before altering ot
root = document.createElement('div'); // overall container
root.className = sRoot;
fr = document.createElement('div'); // frozen-row container
fr.className = sFR;
fri = document.createElement('div'); // frozen-row inner container, for column headings
fri.className = sFRI;
fr.appendChild(fri);
root.appendChild(fr);
fc = document.createElement('div'); // frozen-column container
fc.className = sFC;
fci = document.createElement('div'); // frozen-column inner container, for row headings
fci.className = sFCI;
fc.appendChild(fci);
root.appendChild(fc);
tc = document.createElement('div'); // table container, contains ot
tc.className = sTC;
root.appendChild(tc);
if (ot.caption) {
cc = document.createElement('div'); // caption container
cc.className = sCC;
cc.appendChild(ot.caption.firstChild); // only gets first child
root.appendChild(cc);
ot.deleteCaption();
}
// Create fr cells (column headings)
a = ot.rows[0].cells;
alen = a.length;
for (i = 1; i < alen; ++i) {
e = document.createElement('div');
e.className = sRCell;
t = document.createElement('table');
t.className = sCellT;
tr = t.insertRow(0);
tr.appendChild(a[1]);
e.appendChild(t);
fri.appendChild(e);
}
if (ot.tHead) {
ot.deleteTHead();
}
// Create fc cells (row headings)
a = ot.rows;
alen = a.length;
for (i = 0; i < alen; ++i) {
e = document.createElement('div');
e.className = sCCell;
t = document.createElement('table');
t.className = sCellT;
tr = t.insertRow(0);
tr.appendChild(a[i].cells[0]);
e.appendChild(t);
fci.appendChild(e);
}
ot = ot.parentNode.replaceChild(root, ot);
tc.appendChild(ot);
resize();
root.style.visibility = 'visible';
xAddEventListener(tc, 'scroll', onScroll, false);
xAddEventListener(window, 'resize', onResize, false);
function onScroll()
{
xLeft(fri, -tc.scrollLeft);
xTop(fci, -tc.scrollTop);
}
function onResize()
{
if (!tmr) {
tmr = setTimeout(
function() {
resize();
tmr=null;
}, 500);
}
}
function resize()
{
var sum = 0, cch = 0, w, h;
// caption container
if (cc) {
cch = xHeight(cc);
xMoveTo(cc, 0, 0);
xWidth(cc, xWidth(root));
}
// frozen row
xMoveTo(fr, fcw, cch);
xResizeTo(fr, xWidth(root) - fcw, frh);
xMoveTo(fri, 0, 0);
xResizeTo(fri, xWidth(ot), frh);
// frozen col
xMoveTo(fc, 0, cch + frh);
xResizeTo(fc, fcw, xHeight(root) - cch);
xMoveTo(fci, 0, 0);
xResizeTo(fci, fcw, xHeight(ot));
// table container
xMoveTo(tc, fcw, cch + frh);
xWidth(tc, xWidth(root) - fcw - 1);
xHeight(tc, xHeight(root) - cch - frh - 1);
// size and position fr cells
a = ot.rows[0].cells;
e = xFirstChild(fri, 'div');
for (i = 0; i < a.length; ++i) {
xMoveTo(e, sum, 0);
w = xWidth(e, xWidth(a[i]));
h = xHeight(e, frh);
sum += w;
xResizeTo(xFirstChild(e, 'table'), w, h);//////////
e = xNextSib(e, 'div');
}
// size and position fc cells
sum = 0;
a = ot.rows;
e = xFirstChild(fci, 'div');
for (i = 0; i < a.length; ++i) {
xMoveTo(e, 0, sum);
w = xWidth(e, fcw);
h = xHeight(e, xHeight(a[i]));
sum += h;
xResizeTo(xFirstChild(e, 'table'), w, h);//////////
e = xNextSib(e, 'div');
}
onScroll();
} // end resize
} // end xTable