function aSuperTable(objectName){
	//THE SUPERTABLE CAN RESIZE COLUMNS AND SORT DATA BY COLUMN
	var newTable=aTable(objectName);
	newTable.handle=new Array();

	var numColumn=newTable.getNumColumn();
	var width=new Array();
	var sumOfColumnWidth=newTable.getWidth()-newTable.getBorderWidth()*2-(newTable.getCellPadding()*numColumn*2)-(newTable.getCellSpacing()*(numColumn+1));
	var noWidth=0;						//COUNT THE NUMBER OF COLUMNS WITHOUT WIDTH
	var tableWidth=sumOfColumnWidth;
	var seperatorWidth=newTable.getCellPadding()*2+newTable.getCellSpacing();

	//alert("sumOfColumnWidth="+sumOfColumnWidth+", numColumn="+numColumn);

	//FIRST SEE IF COLUMNS HAVE EXPLICIT WIDTH
	for(col=0;col<numColumn;col++){
		width[col]=newTable.getColumn(col).getWidth();
		if (width[col]>0){
			tableWidth-=width[col];
		}else{
			noWidth++;
		}//endif
	}//for

	//ANY ROW WITH NO EXPLICIT WIDTH IS GIVEN AN EQUAL PART OF THE tableWidth
	var altWidth=tableWidth/noWidth;
	var residual=0;

	//alert("altWidth="+altWidth);

	//NOW SET THE COLUMNS THAT HAVE NO EXPLICIT WIDTH
	for(col=0;col<numColumn;col++){
		if (width[col]<0){
			width[col]=Math.round(altWidth+residual);
			residual+=(altWidth-width[col]);
			newTable.getColumn(col).setWidth(width[col]);
		}//endif
	}//for

	//CHECK THAT THE WIDTHS NOW ADD UP
	tableWidth=sumOfColumnWidth;
	var errorReport="aSuperTable: TableWidth="+tableWidth+" does not equal ";
	for(col=0;col<numColumn;col++){
		tableWidth-=width[col];
		errorReport+=width[col]+"+";
	}//for
	if (Math.round(tableWidth)!=0) error(errorReport);

	//var output="";
	//for(col=0;col<numColumn;col++){
	//	output+="Col "+col+" has left="+newTable.getCell(0,col).getLeft()+"\n";
	//}//for
	//alert(output);

	tableWidth=sumOfColumnWidth;
	//MAKE COLUMN HANDLES
	for(col=numColumn-1;col>0;col--){
		var column=newTable.getColumn(col);
		var cell=newTable.getCell(0, col);
		//SET LEFT OF HANDLE TO ZERO RIGHT NOW
		//alert("aMouseHandle A");
		var handle=aMouseHandle(0, newTable.getTop(), seperatorWidth, newTable.getHeight());
		//alert("aMouseHandle B");
		handle.table=newTable;
		handle.column=col;
		handle.mouseDrag=function(x, y){
			this.left=x;
			//SHOW THE NEW PREFERED WIDTHS
			this.table.updateColumn();
			//BUT THE RENDERING ENGINE WILL PROVIDE SOME OTHER (ACTUAL) WIDTHS, SO REALIGN THE HANDLE
			if (x<handle.startX) goingLeft=true; else goingLeft=false;
			var seperatorWidth=this.table.getCellPadding()*2+this.table.getCellSpacing();
			this.left=this.table.getCell(0, this.column).getLeft()-seperatorWidth;
			//AND THAT PUTS THE PREFERED WIDTHS OUT OF SYNC WITH ACTUAL WIDTHS
			this.table.updateColumn();
		}//mouseDrag
		aMouse.register(handle);
		newTable.handle[col-1]=handle;
	}//for

	////////////////////////////////////////////////////////////
	//PRIVATE///////////////////////////////////////////////////
	////////////////////////////////////////////////////////////

	newTable.updateHandle=function(){
		//UPDATE THE HANDLES IN THE DIRECTION WITH TABLE COLUMN INFO
		//var output="";
		for(col=0;col<this.getNumColumn()-1;col++){
			var handle=this.handle[col];
			handle.left=this.getCell(0, col+1).getLeft()-seperatorWidth+3;
			//output+=handle.left+", ";
		}//for
		//alert(output);
	}//updateHandle
	newTable.updateHandle();

	newTable.updateColumn=function(){
		//UPDATE THE TABLE COLUMN WITH HANDLES
		var numColumn=this.getNumColumn();
		var pad=this.getCellPadding();
		var spc=this.getCellSpacing();
		var bor=this.getBorderWidth();
		var seperatorWidth=pad*2+spc;
		var outerWidth=bor+spc+pad;

		var newWidth=new Array();
		//SET FIRST COLUMN WIDTH
		var temp=this.handle[0].left-outerWidth-this.getLeft();
		if (temp<0) temp=0;
		newWidth.push(temp);
		//SET MIDDLE COLUMN WIDTHS
		for(col=1;col<numColumn-1;col++){
			temp=this.handle[col].left-this.handle[col-1].left-seperatorWidth;
			if (temp<0) temp=0;
			newWidth.push(temp);
		}//for
		//SET LAST COLUMN WIDTH
		temp=this.getLeft()+this.getWidth()-this.handle[numColumn-2].left-outerWidth-seperatorWidth;
		if (temp<0) temp=0;
		newWidth.push(temp);
		/*
		 var output="pad="+pad+" spc="+spc+" bor="+bor+"\n";
		 output+="left="+this.getLeft()+" width="+this.getWidth()+"\n";
		 for(col=0;col<numColumn;col++){
		 if (col!=numColumn-1) output+="Col "+col+" has handle.left="+this.handle[col].left+"\n";
		 output+="newWidth="+newWidth[col]+"\n";
		 }//for
		 alert(output);
		 */

		var output=""
		var total=0;
		for(col=0;col<numColumn;col++){
			output+="col "+col+"="+newWidth[col]+", ";
			total+=newWidth[col];
			this.getColumn(col).setWidth(newWidth[col]);
		}//for
		window.status=output+" total="+total;

	}//updateColumn

	return newTable;
}//aSuperTable
