    function SmartTable(table) {

        //initialise images used for faster load:
        var imageList = [
            "table_column_blue_bottom_center.png",
            "table_column_blue_bottom_left.png",
            "table_column_blue_bottom_right.png",
            "table_column_blue_middle_center.png",
            "table_column_blue_middle_left.png",
            "table_column_blue_middle_right.png",
            "table_column_blue_top_center.png",
            "table_column_blue_top_left.png",
            "table_column_blue_top_right.png",
            "table_column_green_bottom_center.png",
            "table_column_green_bottom_left.png",
            "table_column_green_bottom.png",
            "table_column_green_bottom_right.png",
            "table_column_green_middle_center.png",
            "table_column_green_middle_left.png",
            "table_column_green_middle.png",
            "table_column_green_middle_right.png",
            "table_column_green_top_center.png",
            "table_column_green_top_left.png",
            "table_column_green_top.png",
            "table_column_green_top_right.png",
            "table_column_orange_bottom_center.png",
            "table_column_orange_bottom_left.png",
            "table_column_orange_bottom.png",
            "table_column_orange_bottom_right.png",
            "table_column_orange_middle_center.png",
            "table_column_orange_middle_left.png",
            "table_column_orange_middle.png",
            "table_column_orange_middle_right.png",
            "table_column_orange_top_center.png",
            "table_column_orange_top_left.png",
            "table_column_orange_top.png",
            "table_column_orange_top_right.png",
            "table_column_red_bottom_center.png",
            "table_column_red_bottom_left.png",
            "table_column_red_bottom.png",
            "table_column_red_bottom_right.png",
            "table_column_red_middle_center.png",
            "table_column_red_middle_left.png",
            "table_column_red_middle.png",
            "table_column_red_middle_right.png",
            "table_column_red_top_center.png",
            "table_column_red_top_left.png",
            "table_column_red_top.png",
            "table_column_red_top_right.png",
            "table_error.png",
            "table_ok.png",
            "table_row_bottom_left.png",
            "table_row_middle_cell1.png",
            "table_row_middle_cell2.png",
            "table_row_middle_cellN.png",
            "table_row_middle_left.png",
            "table_row_top_left.png"
        ];

        this.img = {};

        //theme gfx path
        this.path = "/graphics/";

        for ( var c = 0; c < imageList.length; c++ ) {
            this.img[imageList[c]] = new Image();
            this.img[imageList[c]].src = this.path + imageList[c];
        }//for


        //check if table is undefined. If undefined, read all tables with className smarttable
        var tables = table === undefined ? document.getElementsByTagName("table") : [table];
        for ( var i = 0; i < tables.length; i++ ) {
            if ( tables[i].className == "smarttable" || table !== undefined ) {
                var columns = this.getColumns(tables[i]);
                var rows = this.getRows(tables[i]);
                var cellpadding = this.getCellPadding(tables[i]);
                var cellspacing = this.getCellSpacing(tables[i]);
		tables[i].style.position = "relative";

                //create header:
                for ( var c = 0; c < columns.length; c++ ) {
                    if ( columns[c].theme != "default" ) {
                        var height = tables[i].getElementsByTagName("thead")[0].getElementsByTagName("tr")[0].getElementsByTagName("th")[0].offsetHeight;
                        if ( height < 17 ) height = 17;
                        var outerdiv = document.createElement("div");
                            outerdiv.style.position = "relative";
                            outerdiv.style.width = columns[c].width + "px";
                            outerdiv.style.height = height + "px";
                            outerdiv.appendChild(this.image(1, 0, 0, 16, 16, "table_column_" + columns[c].theme + "_top_left.png"));
                            outerdiv.appendChild(this.image(1, 0, ( columns[c].width - 16 ) ,16 ,16 , "table_column_" + columns[c].theme + "_top_right.png"));
                            outerdiv.appendChild(this.image(1, 0, 16 ,( columns[c].width - 32 ) ,16 , "table_column_" + columns[c].theme + "_top_center.png"));

                            outerdiv.appendChild(this.image(1, 16, 0 ,16 ,( height - 16 ) , "table_column_" + columns[c].theme + "_middle_left.png"));
                            outerdiv.appendChild(this.image(1, 16, ( columns[c].width - 16 ) ,16 ,( height - 16 ) , "table_column_" + columns[c].theme + "_middle_right.png"));
                            outerdiv.appendChild(this.image(1, 16, 16 ,( columns[c].width - 32 ) ,( height - 16 )  , "table_column_" + columns[c].theme + "_middle_center.png"));

                        var innerdiv = document.createElement("div");
                            innerdiv.style.position = "relative";
                            innerdiv.style.zIndex = "3";
                            innerdiv.style.paddingLeft = ( cellpadding + columns[c].paddingLeft ) + "px";
                            innerdiv.style.paddingRight = ( cellpadding + columns[c].paddingRight ) + "px";
                            innerdiv.style.paddingBottom = cellpadding + "px";
                            innerdiv.innerHTML = tables[i].getElementsByTagName("thead")[0].rows[0].cells[c].innerHTML;

                        outerdiv.appendChild(innerdiv);
			
                        tables[i].getElementsByTagName("thead")[0].rows[0].cells[c].innerHTML = "";
                        tables[i].getElementsByTagName("thead")[0].rows[0].cells[c].appendChild(outerdiv);
                        innerdiv.style.paddingTop = parseInt( ( height - innerdiv.offsetHeight ) / 2 ) + "px";
                    }//if
                }//for

                //traverse through every table row in table body
                for ( var c = 0; c < rows.length; c++ ) {

                    //traverse through every table cell in current row
                    for ( var d = 0; d < columns.length; d++ ) {

                        var outerdiv = document.createElement("div");
                            outerdiv.style.position = "relative";
                            outerdiv.style.width = columns[d].width + "px";
                            outerdiv.style.height = rows[c].height + "px";

                        if ( columns[d].theme != "default" ) {
                            if ( c + 1 == rows.length ) {
                                height = tables[i].style.marginBottom ? rows[c].height + parseInt(tables[i].style.marginBottom) : rows[c].height; 

                                outerdiv.appendChild(this.image(1, 0 ,0 ,16 ,( height - 16 ) , "table_column_" + columns[d].theme + "_middle_left.png"));
                                outerdiv.appendChild(this.image(1, 0 ,( columns[d].width - 16 ) ,16 ,( height - 16 ) , "table_column_" + columns[d].theme + "_middle_right.png"));
                                outerdiv.appendChild(this.image(1, 0 ,16 ,( columns[d].width - 32 ) ,( height - 16 )  , "table_column_" + columns[d].theme + "_middle_center.png"));

                                outerdiv.appendChild(this.image(1,( height - 16 ) ,0 ,16 ,16 , "table_column_" + columns[d].theme + "_bottom_left.png"));
                                outerdiv.appendChild(this.image(1,( height - 16 ) ,( columns[d].width - 16 ) ,16 ,16 , "table_column_" + columns[d].theme + "_bottom_right.png"));
                                outerdiv.appendChild(this.image(1,( height - 16 ) ,16 ,( columns[d].width - 32 ) ,16 , "table_column_" + columns[d].theme + "_bottom_center.png"));
                            } else {
                                height = rows[c].height + cellspacing + columns[d].marginBottom;
                                outerdiv.appendChild(this.image(1, 0 ,0 ,16 ,height , "table_column_" + columns[d].theme + "_middle_left.png"));
                                outerdiv.appendChild(this.image(1, 0 ,( columns[d].width - 16) ,16 ,height , "table_column_" + columns[d].theme + "_middle_right.png"));
                                outerdiv.appendChild(this.image(1, 0 ,16 ,( columns[d].width - 32 ) ,height  , "table_column_" + columns[d].theme + "_middle_center.png"));
                            }//else
                        }//if

                        var width = ( ( d + 1 ) == columns.length ) ? columns[d].width : ( columns[d].width + cellspacing + columns[d].marginRight ); 

                        switch(d) {
                            case 0:
                                outerdiv.appendChild(this.image(2, 0 ,0 ,8 ,8 , "table_row_top_left.png"));
                                outerdiv.appendChild(this.image(2,( rows[c].height - 8 ) ,0 ,8 ,8 , "table_row_bottom_left.png"));
                                outerdiv.appendChild(this.image(2, 8 ,0 ,8 ,( rows[c].height - 16 ) , "table_row_middle_left.png"));
                                outerdiv.appendChild(this.image(2, 0 ,8 ,( width - 8 ) ,rows[c].height , "table_row_middle_cell1.png"));
                                break;
                            case 1: 
                                outerdiv.appendChild(this.image(2 ,0 ,0 ,width ,rows[c].height ,"table_row_middle_cell2.png"));
                                break;
                            default: 
                                outerdiv.appendChild(this.image(2 ,0 ,0 ,width ,rows[c].height ,"table_row_middle_cellN.png"));
                        }//switch

                        if ( ( d + 1 ) < columns.length ) outerdiv.style.marginRight = ( cellspacing + columns[d].marginRight ) + "px";
                        if ( ( c + 1 ) < rows.length ) outerdiv.style.marginBottom = ( cellspacing + columns[d].marginBottom ) + "px";
            
                        var innerdiv = document.createElement("div");
                            innerdiv.style.position = "relative";
                            innerdiv.style.zIndex = "3";
                            innerdiv.style.paddingLeft = ( cellpadding + columns[d].paddingLeft ) + "px";
                            innerdiv.style.paddingRight = ( cellpadding + columns[d].paddingRight ) + "px";
                            innerdiv.style.paddingTop = cellpadding + "px";
                            innerdiv.style.paddingBottom = cellpadding + "px";
                            innerdiv.innerHTML = tables[i].getElementsByTagName("tbody")[0].rows[c].cells[d].innerHTML;

                        outerdiv.appendChild(innerdiv);
                        tables[i].getElementsByTagName("tbody")[0].rows[c].cells[d].innerHTML = "";
                        tables[i].getElementsByTagName("tbody")[0].rows[c].cells[d].appendChild(outerdiv);
                    }//for
                }//for
            }//if
        }//for

    }//SmartTable

    SmartTable.prototype.getCellSpacing = function(table) {
        //NOTE Replace this block in favour of something that doesn't use exeption handling!
        try {
            var cellspacing = table.getAttribute("cellSpacing").toString().replace(/[^0-9]/g,"");
                cellspacing = cellspacing.length > 0 ? parseInt(cellspacing) : 0;
        } catch(e) {
            var cellspacing = 0;
        }
        table.setAttribute("cellSpacing","0");
        table.setAttribute("border","0"); 
        table.style.borderCollapse = "collapse";
        table.style.borderSpacing = "0px";
        table.style.border = "0px";
        return cellspacing;
    }//getCellSpacing

    SmartTable.prototype.getCellPadding = function(table) {
        //NOTE Replace this block in favour of something that doesn't use exeption handling!
        try {
            var cellpadding = table.getAttribute("cellPadding").toString().replace(/[^0-9]/g,"");
                cellpadding = cellpadding.length > 0 ? parseInt(cellpadding) : 0;
        } catch(e) {
            var cellpadding = 0;
        }
        table.setAttribute("cellPadding","0"); 
        return cellpadding;
    }//getCellPadding

    SmartTable.prototype.getColumns = function(table) {
        var cols = [];
        for ( var c = 0; c < table.getElementsByTagName("thead")[0].getElementsByTagName("th").length; c++ ) {
            cols[cols.length] = {
                width:table.getElementsByTagName("thead")[0].getElementsByTagName("th")[c].offsetWidth,
                theme:this.getColumnTheme(table.getElementsByTagName("thead")[0].getElementsByTagName("th")[c].className),
                align:this.getColumnAlign(table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[0].getElementsByTagName("td")[c]),
                marginRight:this.getColumnStyle("marginRight",table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[0].getElementsByTagName("td")[c]),
                marginBottom:this.getColumnStyle("marginBottom",table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[0].getElementsByTagName("td")[c]),
                paddingRight:this.getColumnStyle("paddingRight",table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[0].getElementsByTagName("td")[c]),
                paddingLeft:this.getColumnStyle("paddingLeft",table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[0].getElementsByTagName("td")[c])
            }
        }//for
        return cols;
    }//getColumns

    SmartTable.prototype.getColumnStyle = function(style, cell) {
        if ( cell.style[style] ) {
            var styleval = parseInt(cell.style[style]);
            cell.style[style] = "0px";
            return styleval;
        }//if
        return 0;
    }//getColumnMargin

    SmartTable.prototype.getRows = function(table) {
        var rows = [];
        for ( var c = 0; c < table.getElementsByTagName("tbody")[0].getElementsByTagName("tr").length; c++ ) {
            var rowHeight = table.getElementsByTagName("tbody")[0].getElementsByTagName("tr")[c].getElementsByTagName("td")[0].offsetHeight;
            if ( rowHeight < 17 ) rowHeight = 17;
            rows[rows.length] = {
                height:rowHeight
            }
        }//for
        return rows;
    }//getRows

    SmartTable.prototype.getColumnTheme = function(className) {
        var parms = className.toString().split(/ /);
        for ( var c = 0; c < parms.length; c++ ) if ( /^theme/.test(parms[c]) ) return parms[c].replace(/theme/,"");
        return "default";
    }//getColumnTheme

    SmartTable.prototype.getColumnAlign = function(cell) {

        if ( /tLeft/.test(cell.className) ) return "left";
        if ( /tCenter/.test(cell.className) ) return "center";
        if ( /tRight/.test(cell.className) ) return "right";
        else {
            var align = cell.getAttribute("align");
                return /^(left|center|right)$/.test(align) ? align : "left";
        }//if-else

    }//getColumnAlign

    SmartTable.prototype.image = function(zIndex, imgtop, imgleft, width, height, imgsrc) {
        var image = new Image();
	if ( /\.png$/i.test(this.img[imgsrc].src) && /MSIE/.test(navigator.userAgent) ) {
		image.src = '/graphics/1x1_transparent.gif';
		image.width = width;
		image.height = height;
		image.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.img[imgsrc].src+"', sizingMethod='scale');";
	} else {
            image.src = this.img[imgsrc].src;
	}
            image.style.position = "absolute";
            image.style.top = imgtop + "px";
            image.style.left = imgleft + "px";
            image.style.width = width + "px";
            image.style.height = height + "px";
            image.style.zIndex = zIndex;
        return image;
    }//image
