/*
	Available Arugments:
		targetTable - required
		targetColumnLabelsRow - required
		maxWidth
		maxHeight
		

	reDraw dynamic table:
		*objectName*.reAlign();
*/


VD_dataTable_ID=0;
function dynamicTable(params){
	try{
		this.params=params;
		this.param_default("targetTable",null);
		this.param_default("targetColumnLabelsRow",0);
		this.param_default("maxWidth",null);
		this.param_default("maxHeight",null);
		this.vdID=VD_dataTable_ID;


		eval('objectDataTable'+this.vdID+'=this');

		this.screenWidth = false;
		this.screenHeight = false;	
		this.detectWidthAndHeight();
		
		if(!this.targetTable){
			alert('Nothing to setup.\n Must pass the object element container');
		}else{
			this.targetTable.style.display='none';
			this.setup();
		}
		++VD_dataTable_ID;
	}catch(e){ alert('Error in basic variable parameters in dynamic table object\n'+dump(e)); }
}

dynamicTable.prototype.detectWidthAndHeight = function(){
	var sreenBuffer = 20;
	try{
		if(!this.maxWidth || this.screenWidth){
			if(document.body.clientWidth){
				this.maxWidth = document.body.clientWidth-sreenBuffer;
			}else{
				this.maxWidth = window.innerWidth-sreenBuffer;
			}
			this.screenWidth = true;
		}
		if(!this.maxHeight || this.screenHeight){
			if(document.body.clientHeight){
				this.maxHeight = document.body.clientHeight-sreenBuffer;
			}else{
				this.maxHeight = window.innerHeight-sreenBuffer;
			}

			this.screenHeight = true;
		}
	}catch(e){ alert('Error in detectWidthAndHeight function'+dump(e)); }
}

dynamicTable.prototype.param_default = function(pname, def){
	try{
		if(this.params[pname]){
			eval('this.'+pname+'=this.params[pname]');
		}
		if(eval('typeof this.'+pname+' == "undefined"')){
			eval('this.'+pname+' = def');
		}
	}catch(e){ alert('Error initialzing variables in dynamic table object\n'+dump(e)) }
} 

dynamicTable.prototype.setup=function(){
	if(this.targetTable.width == '100%'){ this.targetTable.width='98%' }
	if(this.targetTable.style.width == '100%'){ this.targetTable.style.width='98%' }
	this.targetTable.align='';
	this.tableContainer = document.createElement('DIV');
	if(this.maxHeight){
		this.tableContainer.style.height = this.maxHeight;
	}
	if(this.maxWidth){
		this.tableContainer.style.width = this.maxWidth;
	}
	this.targetTable.parentNode.insertBefore( this.tableContainer , this.targetTable );
	this.tableContainer.appendChild(this.targetTable);


	this.holdEverything=document.createElement('DIV');
	this.tableContainer.parentNode.insertBefore( this.holdEverything , this.tableContainer );
	this.holdEverything.appendChild(this.tableContainer);


	/* build outside div just before table */
		this.columnDIV = document.createElement('DIV');
		this.tableContainer.parentNode.insertBefore( this.columnDIV , this.tableContainer );
	/* end */
	
	/* now build table column labels within new div created above */
		this.columnTable = this.targetTable.cloneNode( true );
		var totalRows = this.columnTable.rows.length-1;
		for( i=totalRows; i > 0; --i ){
			this.columnTable.deleteRow(i);
		}
		for( i=0; i < this.columnTable.rows[this.targetColumnLabelsRow].cells.length; ++i ){
			this.columnTable.rows[0].cells[i].innerHTML = '<div style="margin:0px;padding:0px">'+this.columnTable.rows[this.targetColumnLabelsRow].cells[i].innerHTML+'</div>';
			this.targetTable.rows[this.targetColumnLabelsRow].cells[i].innerHTML = '<div style="height:1px;overflow-y:hidden;margin:0px;padding:0px">'+this.targetTable.rows[this.targetColumnLabelsRow].cells[i].innerHTML+'</div>';
			this.targetTable.rows[this.targetColumnLabelsRow].cells[i].style.paddingTop = '0px';
			this.targetTable.rows[this.targetColumnLabelsRow].cells[i].style.marginTop = '0px';
			this.targetTable.rows[this.targetColumnLabelsRow].cells[i].style.paddingBottom = '0px';
			this.targetTable.rows[this.targetColumnLabelsRow].cells[i].style.marginBottom = '0px';
		}
		this.targetTable.rows[this.targetColumnLabelsRow].style.visibility = 'hidden';
		var tempRow = this.targetTable.insertRow(this.targetTable.rows.length);
		swapNodes( tempRow , this.targetTable.rows[this.targetColumnLabelsRow] )
		tempRow.parentNode.removeChild( tempRow );
		this.columnDIV.appendChild( this.columnTable );
		//this.columnTable.style.position='relative';

		//this.columnTable.style.top=this.targetTable.rows[this.targetColumnLabelsRow].offsetHeight+4;
	/* end */
	
	this.maintainScroll();
	eval('this.tableContainer.onscroll=function(){ objectDataTable'+this.vdID+'.maintainScroll() }');
	
	this.columnDIV.style.overflow='hidden';
	this.columnDIV.style.whiteSpace='nowrap';

	if(this.maxHeight){
		this.maxHeight=parseFloat(this.maxHeight);
	}
	if(this.maxWidth){
		this.maxWidth=parseFloat(this.maxWidth);
	}
	this.reAlignFired = 0;
	this.targetTable.style.display='';
	this.columnTable.style.display='';
	this.reAlign();
	//this.repeatPositionCheck = setInterval( eval('"objectDataTable'+this.vdID+'.reAlignFired=1;objectDataTable'+this.vdID+'.reAlign()"') , 5000 );
	crossBrowserAttachEvent( window , 'onresize' , eval('"objectDataTable"+this.vdID+".reAlignFired=1;objectDataTable'+this.vdID+'.reAlign()"') );
	crossBrowserAttachEvent( window , 'onload' , eval('"objectDataTable"+this.vdID+".reAlignFired=1;objectDataTable'+this.vdID+'.reAlign()"') );
	//crossBrowserAttachEvent( window , 'onunload' , eval('"objectDataTable'+this.vdID+'.reAlign()"') );
	
}

/* METHOD CALL TO SIZE EVERTHING UP CORRECTLY */
	dynamicTable.prototype.reAlign = function(params){
		try{
			if( this.reAlignFired == 1 && this.targetTable.offsetWidth > 0 ){
				if( this.screenHeight || this.screenWidth ){
					this.holdEverything.style.display = 'none';
					this.detectWidthAndHeight();

					this.holdEverything.style.display = '';
				}
				this.calculateColumnsPosition();
				this.columnDIV.style.overflow='hidden';
				try{
					if(this.maxWidth && this.targetTable.offsetWidth > this.maxWidth){
						/* IF width OF dataTable > maxWidth */
						this.tableContainer.style.width = this.maxWidth+'px';
						this.tableContainer.style.overflow = 'auto';
						/* Calculate Height */
							if(this.maxHeight && this.targetTable.offsetHeight > this.maxHeight){
								this.tableContainer.style.height = this.maxHeight+'px';
								/* IF width OF dataTable > maxWidth AND height OF dataTable > maxHeight */
								this.columnDIV.style.width = this.tableContainer.offsetWidth;
								this.columnDIV.style.paddingRight = '16px';
								this.columnDIV.style.overflow = 'hidden';
							}else{
								/* IF width OF dataTable > maxWidth AND height OF dataTable < maxHeight */
								this.tableContainer.style.height = (this.targetTable.offsetHeight+20)+'px';
								if(this.columnDIV){
									this.columnDIV.style.width = this.maxWidth+'px';
									this.columnDIV.style.paddingRight=0;
								}
							}
						/* end */
					}else{
						try{
							if(this.maxHeight && this.targetTable.offsetHeight > this.maxHeight){
								/* IF WIDTH IS LESS THEN MAXWIDTH & TABLE HEIGHT GREATER THAN MAXHEIGHT */
									try{
										/* IF width OF dataTable < maxWidth AND height OF dataTable > maxHeight */

										this.tableContainer.style.overflow = 'auto';
										//this.tableContainer.style.border = "1px #555555 solid";
										//this.columnDIV.style.border = "1px #555555 solid";
										this.tableContainer.style.height = this.maxHeight+'px';
			
										/* Extra special inherit table width */
										if( this.targetTable.style.width != '' ){
											this.tableContainer.style.width = this.targetTable.style.width;
										}else if( this.targetTable.width!='' ){
											this.tableContainer.style.width = this.targetTable.width;
										}else{
											this.tableContainer.style.width = this.targetTable.offsetWidth+20;
										}
										/* just incase width check point */
											if( this.maxWidth && this.targetTable.offsetWidth > this.maxWidth ){
												this.columnDIV.style.width = this.maxWidth;
											}else{
												this.columnDIV.style.width = this.tableContainer.offsetWidth-18;
											}
										/* end */
										this.columnTable.style.width = this.targetTable.offsetWidth;
										this.columnDIV.style.paddingRight = '16px';
										//this.columnDIV.style.overflow = 'visible';
									}catch(e){ alert('Error setting Dynamic table height part 1\n'+dump(e)); }
								/* END */
							}else{
								/* IF width AND height OF dataTable < maxWidth AND maxHeight */
									try{							
										if(this.targetTable.style.width!=''){
											newWidth=this.targetTable.style.width;
										}else if(this.targetTable.width!=''){
											newWidth=this.targetTable.width;
										}
										this.tableContainer.style.height='';
										//this.tableContainer.style.overflow="visible";
										this.columnDIV.style.overflow = 'visible';
										this.columnDIV.style.width = this.targetTable.offsetWidth;
										this.columnTable.style.width = this.targetTable.offsetWidth;
									}catch(e){ alert('Error setting Dynamic table height part 2\n'+dump(e)); }
								/* END */
							}
						}catch(e){ alert('Error calculating Dynamic table height settings\n'+dump(e)); }
					}
					this.calculateColumnsPosition();
				}catch(e){
					alert('Error in calculating Dynamic table\n'+dump(e));
				}
				this.reAlignFired=0;
			}else{
				setTimeout("objectDataTable"+this.vdID+".reAlignFired=1;objectDataTable"+this.vdID+".reAlign()",1000);
			}
		}catch(e){ alert('Error in basic position setup\n'+dump(e)); }
	}
/* END */
dynamicTable.prototype.maintainScroll = function(){
	try{
		this.columnDIV.scrollLeft = this.tableContainer.scrollLeft;
	}catch(e){ alert('Error maintaining horizontal scroll\n'+dump(e)); }
}
/* METHOD CALL TO SIZZE JUST COLUMN LABELS CORRECTLY */
dynamicTable.prototype.calculateColumnsPosition = function(){
	try{
		var lastRow = this.targetTable.rows.length-1;
		var totalCells = this.targetTable.rows[lastRow].cells.length;
		for(var i=0; i < totalCells; ++i){
			this.columnTable.rows[0].cells[i].getElementsByTagName('DIV')[0].style.width = (this.targetTable.rows[lastRow].cells[i].getElementsByTagName('DIV')[0].offsetWidth)+'px';
		}
	}catch(e){ alert('Error in calculating column lengths\n'+dump(e)); }


}

/* END */