
var plp_toolbar = null;
var plp_highlighted = null;
var plp_selected = null;
var plp_paneID = null;
var plp_paneName = null;
var plp_rowIndex = -1;
var plp_colIndex = -1;

var plp_editToolbar = null;
var plp_cutButton, plp_copyButton, plp_pasteButton;

var plp_row_cursor = "row-resize";
var plp_col_cursor = "col-resize";
var plp_no_cursor = "";

var plp_dragging = false;
var plp_draggingElement = null;
var plp_sizeTags;
var plp_originalSizeList;
var plp_beginPos, plp_curPos, plp_beginElemPos;
var plp_borderingCell;
var plp_highlightedOldBorder;
var plp_selectedOldBorder;

var COL_PANE=0, COL_FIXED=1, COL_PERCENT=2;

//Note: ruler_site must be set elsewhere where the ruler is to be attached

var msgwindows=new Array();

function debug_msg( msg, linenum ) {
	if( msgwindows.length <= linenum || !msgwindows[linenum] ) {
		var y = linenum*14;
		msgwindows[linenum] = document.createElement("<DIV style='position:absolute;left:0px;top:"+y+"px;background-color:white;'>");
		document.body.appendChild(msgwindows[linenum]);
	}
	msgwindows[linenum].innerText = msg;
}

function plp_pt( _x, _y ) {
	this.x = _x;
	this.y = _y;
	this.width = 0;
	this.height = 0;
	
	this.toString = function plp_ptToString() {
			return 'x:'+this.x+';y:'+this.y+';w:'+this.width+';h:'+this.height
		}
}

function plp_IsInside( p, x, y ) {
	return x >= p.x && y >= p.y && x < p.x+p.width && y < p.y+p.height;
}

function plp_GetPos( elem, pt ) {
	if( !elem ) return;
	
	pt.width = elem.offsetWidth;
	pt.height = elem.offsetHeight;
	
	while( elem && elem.tagName != "BODY")
	{
		pt.x += elem.offsetLeft-elem.scrollLeft;
		pt.y += elem.offsetTop-elem.scrollTop;
		
		elem = elem.offsetParent;
	}
}

function plp_PositionRelativeTo( pane, ctrlRelTo, offsetx, offsety )
	{
		var panept = new plp_pt(0,0), ctrlpt = new plp_pt(0,0);
		
		plp_GetPos( pane, panept );
		plp_GetPos( ctrlRelTo, ctrlpt );
		
		pane.style.pixelLeft -= (panept.x-ctrlpt.x)-offsetx;
		pane.style.pixelTop -= (panept.y-ctrlpt.y)-offsety;
	}

var PLP_SHOW = 1, PLP_HIDE = 0, PLP_TOGGLE = 2;

function plp_ShowPopup( popup_elem, ctrlRelTo, showhide )
{
	if( showhide != PLP_HIDE && popup_elem.style.visibility=='hidden' ) {
		popup_elem.style.visibility='visible';
		plp_PositionRelativeTo( popup_elem, ctrlRelTo, 
			ctrlRelTo.offsetWidth-popup_elem.offsetWidth, 
			ctrlRelTo.offsetHeight );
	} else if( showhide != PLP_SHOW && popup_elem.style.visibility=='visible' )
		popup_elem.style.visibility='hidden';
}

var plp_handles;
function plp_ShowHandles( elem ) {
	if( !plp_handles ) {
		plp_handles = document.createElement('<TABLE style="table-layout:fixed;position:absolute;z-index:10000;'+
				'filter:alpha(opacity=20);-moz-opacity:0.2;'+
				'border:solid 2px #0000ff;background-color:#c0c0ff;">');
		var tr, td;
		
		tr = plp_handles.insertRow();
			td = tr.insertCell(); td.style.width='4px'; td.style.height='4px'; td.innerHTML = '&nbsp;'; td.style.backgroundColor='black';
			td = tr.insertCell(); td.style.width='100%'; td.style.height='4px'; td.innerHTML = '&nbsp;';
			td = tr.insertCell(); td.style.width='4px'; td.style.height='4px'; td.innerHTML = '&nbsp;'; td.style.backgroundColor='black';
		tr = plp_handles.insertRow();
			td = tr.insertCell(); td.style.width='4px'; td.style.height='100%'; td.innerHTML = '&nbsp;';
			td = tr.insertCell(); td.style.width='100%'; td.style.height='100%'; td.innerHTML = '&nbsp;';
			td = tr.insertCell(); td.style.width='4px'; td.style.height='100%'; td.innerHTML = '&nbsp;'; 
		tr = plp_handles.insertRow();
			td = tr.insertCell(); td.style.width='4px'; td.style.height='4px'; td.innerHTML = '&nbsp;'; td.style.backgroundColor='black';
			td = tr.insertCell(); td.style.width='100%'; td.style.height='4px'; td.innerHTML = '&nbsp;';
			td = tr.insertCell(); td.style.width='4px'; td.style.height='4px'; td.innerHTML = '&nbsp;'; td.style.backgroundColor='black';
		document.body.appendChild( plp_handles );
	}

	var pos = new plp_pt(0,0);
	plp_GetPos(elem, pos );
	
	plp_handles.style.left = pos.x;
	plp_handles.style.top = pos.y;
	plp_handles.style.width = pos.width;
	plp_handles.style.height = pos.height;
	plp_handles.style.visibility = 'visible';
	plp_handles.disabled=true;
	
	plp_handles.myinfo=2;
	//debug_msg(''+plp_handles.myinfo,2);
	//debug_msg(pos.toString(),10);
}

function plp_HideHandles( ) {
	if( plp_handles ) {
		plp_handles.style.visibility = 'hidden';
	}
}

function plp_RulerCommand( cmd, item ) {
	switch( cmd ) {
		case "admin":
			window.navigate('PortalSite.aspx?Site=Admin.SitesAdmin');
			break;
	    case "ruler_var":
			plp_SetWidthTypeVariable();
			break;
	    case "ruler_pane":
			plp_SetWidthTypePane();
			break;
	    case "ruler_fixed":
			plp_SetWidthTypeFixed();
			break;
		default:
			if( plp_paneName && plp_paneName != '') {
				if( item.commandArgs )
					__doPostBack(plp_paneName, item.group+','+cmd+','+item.commandArgs );
				else
					__doPostBack(plp_paneName, item.group+','+cmd );
				//debug_msg('__doPostBack('+plp_paneID+'; '+cmd+','+item.commandArgs+' )', 1);
			}
			break;
	}
}

var plp_ruler;
var plp_ruler_cols, plp_ruler_cols_tr;
var plp_rulerLastElem = null;
function plp_ShowRuler( elem ) {
	if( !plp_ruler ) {
		plp_ruler = document.createElement('<TABLE class="admin_ruler" cellspacing="0" cellpadding="0">');
		var tr, td;
		
		tr = plp_ruler.insertRow();
			td = tr.insertCell();
				td.className='admin_ruler';
				td.vAlign='bottom';
			
				plp_ruler_cols = document.createElement('<TABLE class="admin_ruler_cols" cellspacing="0" cellpadding="0">');
				td.appendChild(plp_ruler_cols);
				plp_ruler_cols_tr = plp_ruler_cols.insertRow();
				td = plp_ruler_cols_tr.insertCell(); td.innerHTML = '100%'; 
					td.className='admin_ruler_col';
		ruler_site.appendChild( plp_ruler );

	}

	if( plp_rulerLastElem )	{
		plp_handleEvent(plp_rulerLastElem,"onresize", plp_ResizeRuler, false );
		plp_handleEvent(plp_rulerLastElem,"onmove", plp_ResizeRuler, false );
	}
	
	plp_rulerLastElem = elem;
	
	var pos = new plp_pt(0,0);
	plp_GetPos(elem, pos );
	
	plp_ruler.runtimeStyle.pixelTop = 0; //Math.max(0,pos.y-plp_ruler.offsetHeight);
	plp_ruler.runtimeStyle.pixelLeft = pos.x;
	plp_ruler.style.width = elem.offsetWidth;
	plp_handleEvent(elem,"onresize", plp_ResizeRuler, true );
	plp_handleEvent(elem,"onmove", plp_ResizeRuler, true );
	plp_ruler.style.visibility = 'visible';
	
	plp_toolbar.Show();
	
	plp_UpdateRuler(elem, true);
	//debug_msg(pos.toString(),10);
}

function plp_ResizeRuler(e) {
	var pos = new plp_pt(0,0);
	plp_GetPos(plp_rulerLastElem, pos );
	plp_ruler.style.width = pos.width;
}

function plp_HideRuler( ) {
	if( plp_ruler ) {
		plp_ruler.style.visibility = 'hidden';
	}
	
	if( plp_toolbar ) {
		//plp_toolbar.Hide();
	}
}

function plp_UpdateRuler(elem, rebuild) {
	var tags;
	
	if( rebuild ) {
		tags = plp_GetColTags(elem, -1);

		while( plp_ruler_cols_tr.cells.length ) plp_ruler_cols_tr.deleteCell();
	} else {
		tags = plp_sizeTags;
	}
	
	for( var c=0; c < tags.length; c++ ) {
		var size = tags[c].getAttribute('width');
		var td;
		
		if( rebuild ) {
			td = plp_ruler_cols_tr.insertCell(); 
			plp_handleEvent( td, "onclick", plp_onRulerColumnClick, true );
		} else {
			td = plp_ruler_cols_tr.cells[c];
		}
		
		if( c == plp_colIndex ) {
			td.className='admin_ruler_col_sel';
		} else
			td.className='admin_ruler_col';
		
		td.style.width = size;
		td.innerHTML = size;
	}
}

function plp_setSelectedCol( index )
{
	plp_colIndex = index;
}

function plp_onRulerColumnClick( e ) {
	//debug_msg(''+e.srcElement.cellIndex,1);
	plp_setSelectedCol( e.srcElement.cellIndex );
	//debug_msg(''+plp_colIndex+','+plp_highlighted.tagName+','+plp_sizeTags.length,1);
	plp_UpdateRuler( plp_highlighted, true);
	plp_UpdateToolbar();
}

function plp_saveWidths(elem, sizes) {
	if( plp_isLayout(elem ) ) {
		elem.previousSibling.value = sizes.join(',');
		//debug_msg(elem.previousSibling.value);
	}
}

function plp_notifyChange(elem) {
	__doPostBack(elem.id, '');
}

function plp_isLayout(elem) {
	if( elem && elem.tagName == "TABLE" && elem.previousSibling &&
			elem.previousSibling.tagName == "INPUT" &&
			elem.previousSibling.getAttribute("TYPE") == "hidden") {
		return true;
	}
	return false;
}

function plp_SetPostBackSizes( pTable, sizes ) {
	elem.previousSibling.value = sizes.join(',');
}

function _plp_DoesColumnfit( colindex, colcounts, colspan ) {
	for( var c = 0; c < colspan; c++ )
		if( colcounts.length > colindex && colcounts[colindex] > 0 )
			return false;
	return true;
}

function plp_GetColCount( pTable ) {
	var colcounts = new Array();
	
	for( var rindex = 0; rindex < pTable.rows.length; rindex++ ) {
		var row = pTable.rows[rindex];
		
		var colindex = 0;
		for( var cindex= 0; cindex < row.cells.length; cindex++ ) {
			var col = row.cells[cindex];
			
			var rowspan = col.getAttribute("rowspan"); if( !rowspan ) rowspan = 1;
			var colspan = col.getAttribute("colspan"); if( !colspan ) colspan = 1;
			
			while( !_plp_DoesColumnfit( colindex, colcounts, colspan ) ) {
				colindex++;
			}
			for( var c = 0; c < colspan; c++) {
				colcounts[colindex+c] = rowspan;
			} 
			colindex += colspan;
		}
		for( var c = 0; c < colcounts.length; c++ )
			if( colcounts[c] > 0 ) colcounts[c] -= 1;
	}

	return colcounts.length;
}

function plp_GetColIndex( pTable, cell )
{
	var colcounts = new Array();
	
	var rowindex = 0;
	for( var rindex = 0; rindex < pTable.rows.length; rindex++ ) {
		var row = pTable.rows[rindex];
		
		var colindex = 0;
		for( var cindex= 0; cindex < row.cells.length; cindex++ ) {
			var col = row.cells[cindex];
			
			var rowspan = col.getAttribute("rowspan"); if( !rowspan ) rowspan = 1;
			var colspan = col.getAttribute("colspan"); if( !colspan ) colspan = 1;
			
			if( col == cell ) { 
				return colindex+colspan-1; 
			}
						
			while( !_plp_DoesColumnfit( colindex, colcounts, colspan ) ) {
				colindex++;
			}
			for( var c = 0; c < colspan; c++) {
				colcounts[colindex+c] = rowspan;
			} 
			colindex += colspan;
		}
		for( var c = 0; c < colcounts.length; c++ )
			if( colcounts[c] > 0 ) colcounts[c] -= 1;
		rowindex += 1;
	}

	return -1;
}

function plp_GetColPixelSizes( pTable, resolvedSizes ) {
	var count = resolvedSizes.length
	var colsizes = new Array(count);
	
	var width = pTable.offsetWidth;	//TODO: must remove borders,cellspacing,cellpadding
	
	var varCols = new Array();
	
	for( var c=0; c<count; c++ ) {
		if( resolvedSizes[c].indexOf('%') > 0 ) {
			varCols.push(c);
		} else {
			colsizes[c] = parseInt(resolvedSizes[c],10);
			width -= colsizes[c];
		}
	}
	
	for( var c=0; c<varCols.length; c++) {
		colsizes[varCols[c]] = Math.round(parseInt(resolvedSizes[varCols[c]],10)*width/100);
	}
	
	return colsizes;
}

function plp_GetColTags( pTable, colCount )
{
	var colgroups = pTable.children.tags("colgroup");
	var colgroup;
	if( colgroups && colgroups.length > 0 )
	{
		colgroup = colgroups[0];
	} else {
		colgroup = dTable.document.createElement("<COLGROUP>");
		pTable.insertBefore(pTable.children[0]);
	}
	
	var coltags = colgroup.children.tags("col");
	if( !coltags ) {
		coltags = new Array();
	} 
	while( coltags.length < colCount )
	{
		var newcol = pTable.document.createElement("<COL>");
		coltags[coltags.length] = newcol;
		colgroup.appendChild(newcol);
	}
	return coltags;
}

function plp_SetSize( sizetaglist, sizeattr, index, size )
{
	sizetaglist[index].setAttribute(sizeattr, size);
	
	//debug_msg(plp_ResolveSizes( sizetaglist, sizeattr, index ).join(','));
}

function plp_GetSize( sizetaglist, sizeattr, index)
{
	return parseInt(sizetaglist[index].getAttribute(sizeattr));
}

function plp_handleEvent( obj, eventname, eventfn, onoff )
{
	if( obj.addEventListener ) {
		if( onoff )
			obj.addEventListener( eventname, eventfn, true );
		else
			obj.removeEventListener( eventname, eventfn, true );			
	} else {
		if( onoff )
			obj.attachEvent(eventname, eventfn);
		else
			obj.detachEvent(eventname, eventfn);
	}
}

function plp_handleDragEvents( obj, onoff ) {
	plp_handleEvent(obj, "onmousemove", plp_dragWidth_onmousemove, onoff );
	plp_handleEvent(obj, "onmouseup", plp_endDrag_onmouseup, onoff );
	plp_handleEvent(obj, "onkeydown", plp_endDrag_onkeydown, onoff );
}

function plp_beginDrag_onmousedown(e) {
	plp_dragging = true;	
	
	var mousep = new plp_pt(e.offsetX,e.offsetY);
	plp_GetPos(e.srcElement, mousep );
	plp_BeginDragWidth( plp_highlighted, mousep.x );

	plp_handleDragEvents(plp_highlighted, true );
	plp_highlighted.setCapture(true);
}

function plp_dragWidth_onmousemove(e) {
	var mousep = new plp_pt(e.offsetX,e.offsetY);
	plp_GetPos(e.srcElement, mousep );
	plp_DragWidth( mousep.x );
}

function plp_endDrag_onmouseup(e) {
	plp_handleDragEvents(plp_highlighted, false );
	
	plp_dragging = false;

	plp_notifyChange(plp_highlighted);
	plp_HideHandles();
	plp_highlighted.releaseCapture();
	//debug_msg(plp_ResolveSizes( plp_sizeTags, "width", -1 ).join(','));
}

function plp_endDrag_onkeydown(e) {
	switch( e.keyCode ) {
		case 27:
			plp_handleDragEvents(plp_highlighted, false );
			plp_HideHandles();
			plp_dragging = false;
			plp_highlighted.releaseCapture();
			e.cancelBubble = true;
			break;
	}
}

function plp_colSizeType( size ) {
	if( size == null || size == '' )
		return COL_PANE;

    var percentindex = size.indexOf('%');
	if( percentindex >= 0 )
		return COL_PERCENT;
	return COL_FIXED;
}

function plp_tableSummary( sizes, curcol )
{
	this.leftfixed=0;
	this.leftvar=0;
	this.leftfixedindexes = new Array();
	this.leftvarindexes = new Array();
	this.leftvarlastindex = -1;
	
	this.rightfixed=0;
	this.rightvar=0;
	this.rightfixedindexes = new Array();
	this.rightvarindexes = new Array();
	this.rightvarlastindex = -1;
	
	this.curfixed=0;
	this.curvar=0;
	this.isvar=false;
	
	for(var c=0; c < sizes.length;c++) {
        var size = sizes[c];
        var sizeType = plp_colSizeType( size );
        
        if( sizeType != COL_PANE ) {
	        size = parseInt(size,10);
			
			if( c < plp_colIndex )
				if( sizeType == COL_PERCENT ) { this.leftvar += size; this.leftvarindexes.push(c); this.leftvarlastindex = c;} 
					else { this.leftfixed += size; this.leftfixedindexes.push(c); }
			else if( c > plp_colIndex )
				if( sizeType == COL_PERCENT ) { this.rightvar += size; this.rightvarindexes.push(c); this.rightvarlastindex = c;}
					else { this.rightfixed += size; this.rightfixedindexes.push(c); }
			else
				if( sizeType == COL_PERCENT ) { this.isvar=true; this.curvar += size; } 
					else this.curfixed += size;
		}
	}
	
	//debug_msg('(lv='+this.leftvar+',lf='+this.leftfixed+',lfi='+this.leftfixedindexes.length+
	//		  ';rv='+this.rightvar+',rf='+this.rightfixed+',rfi='+this.rightfixedindexes.length+')',1);
}

function plp_BeginDragWidth( pTable, posx )
{
	plp_sizeTags = plp_GetColTags(pTable, plp_GetColCount( pTable ) );
	plp_originalSizeList = plp_ResolveSizes( plp_sizeTags, "width", -1 )
	plp_beginPos = posx;

	plp_ShowHandles( plp_highlighted );
}

function plp_DragWidth( posx )
{
	var sizeattr = "width";
	var sizetaglist = plp_sizeTags;
	var colIndex = plp_colIndex;
	
	var size;
	
	var delta = posx-plp_beginPos;
	
	var resolvedSizes = new Array()
	resolvedSizes = resolvedSizes.concat(plp_originalSizeList);
	
	{
		var summary = new plp_tableSummary(resolvedSizes, colIndex);
		
		if( !summary.isvar && summary.leftvarindexes.length==0 ) {
			size = parseInt(resolvedSizes[colIndex],10);
			size += delta;
			if( size < 0 ) size=0;
			resolvedSizes[colIndex] = size.toString();
			plp_SetSize( sizetaglist, sizeattr, colIndex, resolvedSizes[colIndex] );
		} else if( summary.rightvarindexes.length==0 && summary.rightfixedindexes.length > 0) {
			// change size of next non-% column
			
			for(var ci=0;ci < summary.rightfixedindexes.length;ci++)	{
				size = parseInt(resolvedSizes[summary.rightfixedindexes[ci]],10);

				if( size > delta ) {
					size -= delta;	delta = 0;
				} else {
					delta -= size;	size = 0;
				}
				size = size.toString();
				plp_SetSize( sizetaglist, sizeattr, summary.rightfixedindexes[ci], size );
				resolvedSizes[summary.rightfixedindexes[ci]] = size;
				if( delta <= 0 ) break;
			}
		} else if( summary.isvar && summary.rightvarindexes.length > 0 ) {
			// redistribute % values between current column and last % column
			
			var colsizes = plp_GetColPixelSizes( plp_highlighted, resolvedSizes );
			
			var combinedsize = colsizes[summary.rightvarlastindex]+colsizes[colIndex];
			var aper = parseInt(resolvedSizes[colIndex]);
			var bper = parseInt(resolvedSizes[summary.rightvarlastindex]);
			
			if( -delta > colsizes[colIndex] ) delta = -colsizes[colIndex];
			if( delta > colsizes[summary.rightvarlastindex] ) delta = colsizes[summary.rightvarlastindex];
			
			size = (colsizes[colIndex]+delta)/combinedsize;
			size = Math.round(size*(aper+bper));
		
			// debug_msg('Redist:'+colsizes.join(',')+':'+combinedsize+':'+aper+':'+bper+':'+size, 15);
			
			resolvedSizes[colIndex] = size.toString() + '%';
			plp_SetSize( sizetaglist, sizeattr, colIndex, resolvedSizes[colIndex] );
			
			resolvedSizes[summary.rightvarlastindex] = (aper+bper-size).toString() + '%';
			plp_SetSize( sizetaglist, sizeattr, summary.rightvarlastindex, resolvedSizes[summary.rightvarlastindex] );
		} else if( summary.leftvarindexes.length > 0 && summary.rightvarindexes.length > 0 ) {
			// current col is fixed ... need to change the apparent size of the variable field to the right
			// (will involve changing the size of all other var fields right and left)
			
			var colsizes = plp_GetColPixelSizes( plp_highlighted, resolvedSizes );
			
			var otherpersize=0;
			for( c=0; c < summary.leftvarindexes.length; c++ )
				otherpersize += colsizes[summary.leftvarindexes[c]];
			for( var c=0; c < summary.rightvarindexes.length-1; c++ ) // dont include the last
				otherpersize += colsizes[summary.rightvarindexes[c]];
			var per = parseInt(resolvedSizes[summary.rightvarlastindex]);
			var otherper = 100-per;
			var persize = colsizes[summary.rightvarlastindex];

			if( -delta > colsizes[colIndex] ) delta = -colsizes[colIndex];
			if( delta > persize ) delta = persize;

			var newpersize = persize-delta;
			var newper = Math.round(newpersize*100/(newpersize+otherpersize));
			var newotherper = 100-newper;
			
			size = (colsizes[colIndex]+delta);
		
			//debug_msg('Redist l-r:'+colsizes.join(',')+':'+delta+':'+otherpersize+':'+newpersize+':'+
			//				newper+':'+newotherper+':'+size, 15);
			
			resolvedSizes[colIndex] = size.toString();
			plp_SetSize( sizetaglist, sizeattr, colIndex, resolvedSizes[colIndex] );

			var perremaining = 100;
			for( c=0; c < summary.leftvarindexes.length; c++ ) {
				var i = summary.leftvarindexes[c];
				var oldper = parseInt(resolvedSizes[i],10);
				var newper = Math.min(perremaining,Math.round(oldper*newotherper/otherper));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( sizetaglist, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
			for( var c=0; c < summary.rightvarindexes.length-1; c++ ) { // dont include the last
				var i = summary.rightvarindexes[c];
				var oldper = parseInt(resolvedSizes[i],10);
				var newper = Math.min(perremaining,Math.round(oldper*newotherper/otherper));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( sizetaglist, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
				
			resolvedSizes[summary.rightvarlastindex] = perremaining.toString() + '%';
			plp_SetSize( sizetaglist, sizeattr, summary.rightvarlastindex, resolvedSizes[summary.rightvarlastindex] );
		}
	}
	//resolvedSizes = plp_ResolveSizes( sizetaglist, sizeattr, -1 );

	summary = null;
	
	plp_saveWidths(plp_highlighted, resolvedSizes );
	plp_UpdateRuler(plp_highlighted, false);
}

function plp_SetWidthTypeVariable() {
	if( plp_colIndex >= 0 && plp_highlighted ) {
		var elem = plp_highlighted;
		var colIndex = plp_colIndex;
		
		var tags = plp_GetColTags(elem, -1);
		var sizeattr = 'width';
		var resolvedSizes = plp_ResolveSizes( tags, sizeattr, -1 )
		var summary = new plp_tableSummary(resolvedSizes, colIndex);
		
		if( !summary.isvar ) {
			var colsizes = plp_GetColPixelSizes( plp_highlighted, resolvedSizes );
			
			var otherpersize=0;
			for( var c=0; c < summary.leftvarindexes.length; c++ )
				otherpersize += colsizes[summary.leftvarindexes[c]];
			for( c=0; c < summary.rightvarindexes.length; c++ )
				otherpersize += colsizes[summary.rightvarindexes[c]];
			
			var newotherpersize = otherpersize+colsizes[colIndex];
			
			var perremaining = 100;
			for( var c=0; c < summary.leftvarindexes.length; c++ ) {
				var i = summary.leftvarindexes[c];
				var oldper = parseInt(resolvedSizes[i],10);
				var newper = Math.min(perremaining,Math.round(oldper*otherpersize/newotherpersize));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( tags, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
			for( c=0; c < summary.rightvarindexes.length; c++ ) {
				var i = summary.rightvarindexes[c];
				var oldper = parseInt(resolvedSizes[i],10);
				var newper = Math.min(perremaining,Math.round(oldper*otherpersize/newotherpersize));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( tags, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
				
			resolvedSizes[colIndex] = perremaining.toString() + '%';
			plp_SetSize( tags, sizeattr, colIndex, resolvedSizes[colIndex] );

			//debug_msg(''+resolvedSizes.join(','),1);
			plp_saveWidths(elem, resolvedSizes );
			//plp_UpdateRuler(elem, true);
			plp_notifyChange(elem);
		}
	}
}

function plp_SetWidthTypePane() {
	if( plp_colIndex >= 0 ) {
	}
}

function plp_SetWidthTypeFixed() {
	if( plp_colIndex >= 0 && plp_highlighted ) {
		var elem = plp_highlighted;
		var colIndex = plp_colIndex;
		var tags = plp_GetColTags(elem, -1);
		var sizeattr = 'width';
		
		var resolvedSizes = plp_ResolveSizes( tags, sizeattr, -1 )
		var summary = new plp_tableSummary(resolvedSizes, colIndex);
		
		if( summary.isvar ) {
			var colsizes = plp_GetColPixelSizes( plp_highlighted, resolvedSizes );
			
			var otherpersize = 100-summary.curvar;
			var newotherpersize = 100;
			
			var perremaining = 100;
			var i = -1;
			var newper, oldper;
			for( var c=0; c < summary.leftvarindexes.length; c++ ) {
				i = summary.leftvarindexes[c];
				oldper = parseInt(resolvedSizes[i],10);
				newper = Math.min(perremaining,Math.round(oldper*newotherpersize/otherpersize));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( tags, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
			for( c=0; c < summary.rightvarindexes.length; c++ ) {
				i = summary.rightvarindexes[c];
				oldper = parseInt(resolvedSizes[i],10);
				newper = Math.min(perremaining,Math.round(oldper*newotherpersize/otherpersize));
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( tags, sizeattr, i, resolvedSizes[i] );
				perremaining -= newper;
			}
			
			if( i >= 0 && perremaining > 0 ) {
				newper += perremaining;
				resolvedSizes[i] = newper.toString() + '%';
				plp_SetSize( tags, sizeattr, i, resolvedSizes[i] );
			}
				
			resolvedSizes[colIndex] = colsizes[colIndex].toString();
			plp_SetSize( tags, sizeattr, colIndex, resolvedSizes[colIndex] );

			//debug_msg(''+resolvedSizes.join(','),1);
			plp_saveWidths(elem, resolvedSizes );
			//plp_UpdateRuler(elem, true);
			plp_notifyChange(elem);
		}
	}
}

function plp_ResolveSizes( sizetaglist, sizeattr, dontchangeindex )
{
	var resolvedSizes = new Array();
	var ErrorSize = '16';

    var percenttotal = 0;
    var sizeablecolumns = new Array();
    var emptycolumns = new Array();

	//var msg = '';
    for( var i = 0; i < sizetaglist.length; i++ ) {
        var size = sizetaglist[i].getAttribute(sizeattr);
        if( size != null && size != '' ) {
            var percentindex = size.indexOf('%');
            if( percentindex > 0 ) {
                var percentvalue = parseInt(size,10);
                if( percentvalue >= 0 ) {
                    if( percenttotal == 100 ) {
                        resolvedSizes[i] = ErrorSize;
                    } else if( percenttotal + percentvalue > 100 ) {
                        percentvalue = 100 - percenttotal;
                        percenttotal = 100;
                        resolvedSizes[i] = String(percentvalue) + '%';
						sizeablecolumns.push(i);
                    } else {
                        percenttotal += percentvalue;
                        resolvedSizes[i] = String(percentvalue) + '%';
						sizeablecolumns.push(i);
                    }
                }
            } else {
                var isize = parseInt(size, 10);
                if( isize >= 0 ) {
                    resolvedSizes[i] = isize.toString();
                } else {
                    resolvedSizes[i] = null;
                }
            }
        }
        if( resolvedSizes[i] == null ) {
			emptycolumns.push(i);
			sizeablecolumns.push(i);
        }
    }

	//msg += sizetaglist[sizetaglist.length-1].getAttribute(sizeattr)+'!'+resolvedSizes.join(':')+';'+percenttotal + ',' + sizeablecolumns.length + ';';
	
/*	if( sizeablecolumns.length == 0 ) {
		var makesizeable = sizetaglist.length-1;
		if( dontchangeindex >= 0 && dontchangeindex < sizetaglist.length-1 )
			makesizeable = dontchangeindex+1
		resolvedSizes[makesizeable] = "100%";
		sizeablecolumns.push(makesizeable);
		percenttotal = 100;
	}
*/

	//msg += percenttotal + ',' + sizeablecolumns.length + ';';
	
    if( emptycolumns.length > 0) {
        var iwidth = (100 - percenttotal) / emptycolumns.length;
        
        for( i = 0; i < emptycolumns.length; i++ ) {
            if( percenttotal < 100 ) {
                var w = iwidth;
                if( 100 - percenttotal < w ) 
					w = 100 - percenttotal;
                resolvedSizes[emptycolumns[i]] = String(w) + '%';
                percenttotal += w;
            } else {
                resolvedSizes[emptycolumns[i]] = ErrorSize;
            }
        }
    }
    
	//msg += percenttotal + ',' + sizeablecolumns.length + ',' + emptycolumns.length + ';';

    if( sizeablecolumns.length > 0 && percenttotal != 100) {
		var colIndex = sizeablecolumns[sizeablecolumns.length-1];
		if( colIndex == dontchangeindex && sizeablecolumns.length > 1)
			colIndex = sizeablecolumns[sizeablecolumns.length-2];
			
		resolvedSizes[colIndex] = (parseInt(resolvedSizes[colIndex],10)+(100-percenttotal)).toString() + '%';
    }

    for( var i = 0; i < sizetaglist.length; i++ ) {
        sizetaglist[i].setAttribute(sizeattr, resolvedSizes[i]);
	}
	
	//debug_msg(msg+resolvedSizes.join(':'),0);
	
    return resolvedSizes;
}

function plp_GetColTag( pTable, colIndex )
{
	return plp_GetColTags( pTable, colIndex+1 )[colIndex];
}

function plp_Layout(elem)
{
	var pTable;
	
	pTable = event.srcElement;
	while( pTable && !plp_isLayout(pTable) )
		pTable = pTable.parentElement;
		
	return pTable;
}

function plp_Highlight( paneid, layoutid )
{
	if( plp_selected ) {
		plp_selected.runtimeStyle.border = plp_selectedOldBorder;
		//plp_selected.runtimeStyle.borderLeft = '';
		plp_selected = null;
	}
	if( plp_highlighted ) {
		//plp_highlighted.style.border = plp_highlightedOldBorder;
		//plp_highlighted.runtimeStyle.border = '';
		//plp_highlighted.releaseCapture();
		if( plp_rowIndex >= 0 || plp_colIndex >= 0)
		{
			plp_rowIndex = -1;
			plp_colIndex = -1;
			plp_setCursor();
		}
		plp_setCursor();
		
		plp_handleEvent(plp_highlighted, "onmousedown", plp_beginDrag_onmousedown, false );
		plp_highlighted = null;
		plp_HideRuler();
	}
	
	plp_paneID = paneid;

	plp_selected = document.getElementById(paneid);
	if( plp_selected ) {
		plp_selectedOldBorder = plp_selected.currentStyle.borderWidth + ' ' + plp_selected.currentStyle.borderColor + ' ' + plp_selected.currentStyle.borderStyle;
		plp_selected.runtimeStyle.border = "dashed 2px orange";
	}
	
	if( layoutid && layoutid != '' )
	{
		var hidden = document.getElementById(layoutid);
		if( hidden ) plp_highlighted = hidden.nextSibling;
		
		//plp_highlightedOldBorder = plp_highlighted.style.border;
		//plp_highlighted.style.border = "dashed 1px orange";
		//plp_highlighted.runtimeStyle.border = "dashed 2px gray";
		plp_rowIndex = -1;
		plp_colIndex = -1;
		
		plp_ShowRuler(plp_highlighted);
		//plp_highlighted.setCapture(true);

		if( plp_highlighted ) {
			plp_sizeTags = plp_GetColTags(plp_highlighted, plp_GetColCount( plp_highlighted ) );
			plp_originalSizeList = plp_ResolveSizes( plp_sizeTags, "width", -1 )
		} else {
			plp_sizeTags = new Array();
			plp_originalSizeList = new Array();
		}
	}
	
	document.getElementById('plp_lastHighlight').value = paneid;
	plp_UpdateToolbar();
}

function plp_setCursor()
{
	if( plp_highlighted ) {
		if( plp_rowIndex >= 0 )	{
			plp_highlighted.style.cursor = plp_row_cursor;
		} else if( plp_colIndex >= 0 ){
			plp_highlighted.style.cursor = plp_col_cursor;
		} else {
			plp_highlighted.style.cursor = plp_no_cursor;
		}
	}
}

function plp_onmouseover()
{
	if( plp_dragging ) return;
	
	var pTable = plp_Layout(event.srcElement);
	
	if( pTable && pTable != plp_highlighted ) {
		//plp_Highlight(pTable);
	}
	
	event.cancelBubble = true;
}

function plp_onmousemove()
{
	if( plp_dragging ) return;
	
	var pTable = plp_Layout(event.srcElement);

	var mousep = new plp_pt(event.offsetX,event.offsetY);
	plp_GetPos(event.srcElement,mousep);
	
	if( pTable && pTable == plp_highlighted) {
		var p = new plp_pt(0,0);
		
		plp_GetPos(plp_highlighted,p);
		if( !plp_IsInside(p, mousep.x, mousep.y ) )	{
			//plp_Highlight(null);
		} else {
			var foundcolIndex = -1;
			var foundcol;
			
			p.x -= mousep.x; // p now contains offset and width of table
			p.y -= mousep.y;
			
			var sizes = new Array();
			var sizeTypes = new Array();
			var totalfixed = 0;

			for(var c=0; c < plp_originalSizeList.length;c++) {
				var size = plp_originalSizeList[c];
				var sizeType = plp_colSizeType( size );
		        
		        sizeTypes.push(sizeType);
				size = parseInt(size,10);
				sizes.push(size);
				
				if( sizeType != COL_PERCENT )
					totalfixed += size;
			}

			var x = p.x;
			for( c=0; c < sizes.length-1; c++) {
				if( sizeTypes[c] != COL_PERCENT )
					x += sizes[c];
				else
					x += sizes[c]*(p.width-totalfixed)/100;

				if( x >= -2 && x <= 2 ) {
					foundcolIndex = c;
					break;
				}
			}
			
			if( plp_colIndex != foundcolIndex ) {
				plp_colIndex = foundcolIndex;
				plp_setCursor();
				
				if( plp_colIndex >= 0 ) {
					//plp_borderingCell = foundcol;
					plp_handleEvent(pTable, "onmousedown", plp_beginDrag_onmousedown, true );
				} else {					
					plp_handleEvent(pTable, "onmousedown", plp_beginDrag_onmousedown, false );
				}
				return;
			}
			
			if( foundcolIndex >= 0 ) return;
			
/*			var foundrow = -1;
			for( var row=0; row < plp_highlighted.rows.length; row++) {
				p.x = p.y = 0;
				plp_GetPos(plp_highlighted.rows[row],p);
				
				if( mousep.y >= (p.y+p.height-2) && 
						mousep.y < (p.y+p.height+2+parseInt(plp_highlighted.cellSpacing)) )	{
					foundrow = row;
					break;
				} 
			}
			if( plp_rowIndex != foundrow ) {
				plp_rowIndex = foundrow;
				plp_setCursor();
				return;
			} */
		}					
	}
}

function plp_onmouseout()
{
	if( plp_dragging ) return;
	
	var pTable = plp_Layout(event.toElement);
	
	event.cancelBubble = true;
}

function plp_finishDragPane( newpos ) {
	// TODO: save pt in a hidden field
}

function plp_dragPane( pt ) {
	var newpos = new plp_pt((pt.x-plp_beginPos.x)+plp_beginElemPos.x,
							(pt.y-plp_beginPos.y)+plp_beginElemPos.y);
	plp_draggingElement.style.left = (newpos.x).toString()+'px';
	plp_draggingElement.style.top = (newpos.y).toString()+'px';
}

function plp_handleDragPaneEvents( obj, onoff ) {
	plp_handleEvent(obj, "onmousemove", plp_dragPane_onmousemove, onoff );
	plp_handleEvent(obj, "onmouseup", plp_endDragPane_onmouseup, onoff );
	plp_handleEvent(obj, "onkeydown", plp_endDragPane_onkeydown, onoff );
}

function plp_dragPane_onmousemove(e) {
	var mousep = new plp_pt(e.offsetX,e.offsetY);
	plp_GetPos(e.srcElement, mousep );
	plp_dragPane( mousep );
}

function plp_endDragPane_onmouseup(e) {
	plp_handleDragPaneEvents(plp_draggingElement, false );
	
	plp_dragging = false;
	plp_draggingElement.releaseCapture();
	plp_draggingElement = null;
}

function plp_endDragPane_onkeydown(e) {
	switch( e.keyCode ) {
		case 27:
			plp_handleDragPaneEvents(plp_draggingElement, false );
			plp_dragPane( plp_beginPos );
			plp_dragging = false;
			plp_draggingElement.releaseCapture();
			plp_draggingElement = null;
			e.cancelBubble = true;
			break;
	}
}

function plp_DragPane( paneid )
{
	if( plp_draggingElement ) return;

	plp_draggingElement = window.event.srcElement;
	
	while( plp_draggingElement != null && plp_draggingElement.style.position != 'absolute' ) {
		plp_draggingElement = plp_draggingElement.parentElement;
	}
	
	if( plp_draggingElement == null ) return;
	
	var mousep = new plp_pt(window.event.offsetX,window.event.offsetY);
	plp_GetPos(plp_draggingElement, mousep );
	plp_beginElemPos = new plp_pt(parseInt(plp_draggingElement.style.left,10),
					parseInt(plp_draggingElement.style.top,10));
	plp_beginPos = mousep;
	
	plp_draggingElement.setCapture(true);
	plp_handleDragPaneEvents(plp_draggingElement, true );
}

function plp_BuildToolbar( toolbar_site )
{
	if( !toolbar_site ) return;
	
	plp_toolbar = new INToolbar(toolbar_site.document, 'ruler_tb', 'admin_ruler');
			
	plp_toolbar.Add( new INToolbarStaticButton(plp_toolbar, 'Styles/Standard/Layout/Icons/server_preferences.gif', 'Administration', 'admin', '') );
	
	plp_toolbar.AddSeparator();
	var tracebtn = new INToolbarLinkPopupButton(plp_toolbar, 'Styles/Standard/Layout/Icons/oszillograph.gif', 'Trace', 'trace', 'trace', 'Trace.aspx' );
	tracebtn.href_selected = 'Styles/Standard/Layout/Icons/oszillograph_anim.gif'
	plp_toolbar.Add( tracebtn );

	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarShowPopupButton(plp_toolbar, 'Styles/Standard/Layout/Icons/documents.gif', 'Pages',document.all('PagesList')) );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( plp_cutButton = new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/cut.gif', null, 'edit_cut', '') );
	plp_toolbar.Add( plp_copyButton = new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/copy.gif', null, 'edit_copy', '') );
	plp_toolbar.Add( plp_pasteButton = new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/paste.gif', null, 'edit_paste', '') );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/button_var.gif', null, 'ruler_var', 'col_size') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/button_pane.gif', null, 'ruler_pane', 'col_size') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/button_fixed.gif', null, 'ruler_fixed', 'col_size') );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/arrow_left_green.gif', null, 'pane_left', '') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/arrow_up_green.gif', null, 'pane_up', '') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/arrow_down_green.gif', null, 'pane_down', '') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/arrow_right_green.gif', null, 'pane_right', '') );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_west.gif', null, 'align_h_left', 'align_h') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_center.gif', null, 'align_h_center', 'align_h') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_east.gif', null, 'align_h_right', 'align_h') );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_north.gif', null, 'align_v_top', 'align_v') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_center.gif', null, 'align_v_middle', 'align_v') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/layout_south.gif', null, 'align_v_bottom', 'align_v') );
	
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/window_new.gif', 'New&nbsp;Pane', 'pane_new', '') );
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/window_edit.gif', 'Properties', 'pane_admin', '') );
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 'Styles/Standard/Layout/Icons/window_delete.gif', null, 'pane_delete', '') );
	
	plp_toolbar.oncommand = function(cmd, item) { plp_RulerCommand( cmd, item ); }
	toolbar_site.appendChild( plp_toolbar.elem );
	
	return plp_toolbar;
}

function plp_UpdateToolbar()
{
	if( !plp_toolbar ) return;
	
	if( plp_colIndex >= 0 && plp_highlighted && plp_originalSizeList && 
			plp_originalSizeList.length > plp_colIndex ) {
		switch( plp_colSizeType(plp_originalSizeList[plp_colIndex]) ) {
			case COL_FIXED:
				plp_toolbar.setGroupCommandState('col_size', 'ruler_fixed', true );
				break;
			case COL_PERCENT:
				plp_toolbar.setGroupCommandState('col_size', 'ruler_var', true );
				break;
			case COL_PANE:
				plp_toolbar.setGroupCommandState('col_size', 'ruler_pane', true );
				break;
		}
	} else {
		plp_toolbar.setGroupCommandState( 'col_size', '', false );
	}
}

function plp_Select( paneid, panename, layoutid, cmds ) 
{
	plp_paneName = panename;
	
	plp_Highlight( paneid, layoutid );

	var toolbar = plp_toolbar;
	
	if( !toolbar ) return;
	
	var _cmds = cmds.split(';');
	for( var i=0; i < _cmds.length; i++ )
		_cmds[i] = _cmds[i].split(','); // cmdid, group, text, enabled

	for(var i=0; i<toolbar.items.length; i++) {
		if( toolbar.items[i].cmdid == null ) continue;
		
		var group = toolbar.items[i].group;
		var found = false;
		if( group != null &&  group != '' ) {
			for( j=0; j < _cmds.length; j++ ) {
				if( _cmds[j].length >= 4 && _cmds[j][1] == group ) {
					toolbar.items[i].setSelected(toolbar.items[i].command == _cmds[j][0]);
					toolbar.items[i].setEnabled(_cmds[j][3] == '1');
					if( _cmds[j].length > 4 )
						toolbar.items[i].setCommandArgs( _cmds[j][4] );
					toolbar.items[i].redraw();
					found = true;
					break;
				}
			}
		}
		else
		{
			for( j=0; j < _cmds.length; j++ ) {
				if( _cmds[j].length >= 4 && _cmds[j][0] == toolbar.items[i].command ) {
					toolbar.items[i].setEnabled(_cmds[j][3] == '1');
					if(_cmds[j][2] != '') toolbar.items[i].setText(_cmds[j][2]);
					if( _cmds[j].length > 4 )
						toolbar.items[i].setCommandArgs( _cmds[j][4] );
					toolbar.items[i].redraw();
					found = true;
					break;
				}
			}
		}
		if( !found && toolbar.items[i].getEnabled() ) 
		{ 
			toolbar.items[i].setEnabled(false); toolbar.items[i].redraw(); 
		}
	}
}

