/* Copyright (c) 2006 Inuvia Technologies - All rights reserved. */

var plp_toolbar = null;
var plp_toolbar2 = null;
var plp_themeComboItem = null;
var plp_styleComboItem = null;
var plp_flavourComboItem = null;
var plp_currentTheme = '';

var plp_highlighted = null;
var plp_eventtarget = null;
var plp_selected = null;
var plp_paneID = null;
var plp_paneName = null;
var plp_rowIndex = -1;
var plp_colHoverIndex = -1;
var plp_colSelectedIndex = -1;

var plp_editToolbar = null;
var plp_cutButton, plp_copyButton, plp_pasteButton, plp_undoButton, plp_redoButton;

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_draggingStorage = null;
var plp_draggingDoneCallback = null;
var plp_draggingMoved = false;
var plp_draggingMoveX = 0;
var plp_draggingMoveY = 0;
var plp_draggingSizeX = 0;
var plp_draggingSizeY = 0;
var plp_draggingElementSizeY = null;

var plp_sizeTags;
var plp_originalSizeList;
var plp_beginPos, plp_curPos, plp_beginElemPos;
var plp_borderingCell;
var plp_selectedOldBorder;
var plp_selectedOldBorderWidth;
var plp_selectedOldBorderColor;
var plp_selectedOldBorderStyle;

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');
		msgwindows[linenum].style.position = 'absolute';
		msgwindows[linenum].style.left = '0px';
		msgwindows[linenum].style.top = y.toString() + 'px';
		msgwindows[linenum].style.zIndex = 10000;
		msgwindows[linenum].style.backgroundColor = 'white';
		msgwindows[linenum].style.display = 'block';
		paj_getElementByID('PPH').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;
	
	try
	{
	    pt.width = elem.offsetWidth;
	    pt.height = elem.offsetHeight;
    	
	    while( elem && elem != null && elem.tagName != "BODY")
	    {
		    pt.x += elem.offsetLeft-elem.scrollLeft;
		    pt.y += elem.offsetTop-elem.scrollTop;
    		
		    elem = elem.offsetParent;
	    }
	} catch( ex ) {
	    return;
	}
}

var paneInfo = new Array();

function plp_GetPaneInfo( paneid, create )
{
    var info = paneInfo[paneid];
    
    if( info ) {
        return info
    } else if( create ) {
        info = new Object();
        paneInfo[paneid] = info;
    }
    return info;
}

function plp_RegisterPaneResize( paneid )
{
    //plp_GetPaneInfo( paneid, true ).Resize = 1;

    var pane = paj_getElementByID(paneid);
    if (pane) {
        pane.style.height = pane.parentNode.offsetHeight; //-pane.offsetTop;
        pane.style.display = 'block';
    }
}

function plp_UnRegisterPaneResize( paneid )
{
    plp_GetPaneInfo( paneid, true ).Resize = null;
}

function plp_CalcExtentOfPane( pane, relOffsetParent )
{
    if( pane.offsetHeight )
        return pane.offsetHeight+pane.offsetTop;
    else {
        var size = 0;
        pane = pane.firstChild;
        while( pane ) {
            var panesize = plp_CalcExtentOfPane( pane, relOffsetParent );
            
            if( panesize != NaN )
                if( size == NaN )
                    size = panesize;
                else
                    size = Math.max( size, panesize );
            pane = pane.nextSibling;
        }
        
        return size;
    }
}

function plp_CalcAvailableSpace( pane )
{
    var parentpane = pane.parentNode;
    var relOffsetParent = pane.offsetParent;
    var size = pane.offsetHeight;
    
    while( parentpane )
    {
        if( parentpane.offsetParent != undefined && pane.offsetParent != undefined ) {
            if( parentpane.offsetParent === pane.offsetParent ) {
                size += Math.max(parentpane.offsetHeight-(pane.offsetTop-parentpane.offsetTop)-pane.offsetHeight, 0);
            } else {
                size += Math.max(parentpane.offsetHeight-pane.offsetTop-pane.offsetHeight, 0);
            }
            
            var paneextent = pane.offsetHeight+pane.offsetTop;
            var siblingsize = 0;
            var sibling = pane.nextSibling;
            
            while( sibling ) {
                var siblingextent = plp_CalcExtentOfPane( sibling, pane.offsetParent );
                
                if( siblingextent != NaN && siblingextent > paneextent )
                    siblingsize = Math.max( siblingsize, siblingextent-paneextent );
                    
                sibling = sibling.nextSibling;
            }            
            size -= siblingsize;
        }
                
        if( parentpane.style != undefined && ((parentpane.style.height != '' && parentpane.style.height != '100%'  ) || parentpane.style.position == 'absolute'))
            break;
            
        pane = parentpane;
        parentpane = pane.parentNode;
    }
    
    return size;
}

function plp_ResizePanes()
{
    for( var paneid in paneInfo ) {
        info = paneInfo[ paneid ];
        if( info.Resize ) {
            var pane = paj_getElementByID( paneid );
            if (pane) {
                pane.style.height = 0;
            }
        }
    }
    for( var paneid in paneInfo ) {
        info = paneInfo[ paneid ];
        if( info.Resize ) {
            var pane = paj_getElementByID( paneid );

            if (pane) {
                pane.style.height = plp_CalcAvailableSpace(pane);
                pane.style.display = 'block';
            }
        }
    }
}

function plp_PositionRelativeTo( pane, ctrlRelTo, offsetx, offsety )
	{
		//var panept = new plp_pt(0,0)
		var ctrlpt = new plp_pt(0,0);
		
		//plp_GetPos( pane, panept );
		plp_GetPos( ctrlRelTo, ctrlpt );
		
		Sys.UI.DomElement.setLocation( pane, ctrlpt.x+offsetx, ctrlpt.y+offsety );
		//pane.style.pixelLeft = ctrlpt.x+offsetx;// -= (panept.x-ctrlpt.x)-offsetx;
		//pane.style.pixelTop = ctrlpt.y+offsety;//-= (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.display == 'none' ) {
		popup_elem.style.display='block';
		plp_PositionRelativeTo( popup_elem, ctrlRelTo, 0, ctrlRelTo.offsetHeight );
	    if( Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7 ) {
	        paj_addBacking(popup_elem);
	    }
	} else if( showhide != PLP_SHOW && popup_elem.style.display != 'none' ) {
	    if( Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7 ) {
	        paj_removeBacking(popup_elem);
	    }
		popup_elem.style.display='none';
	}
}

var plp_handles;
function plp_ShowHandles( elem ) {
    return;
}

function plp_HideHandles( ) {
	if( plp_handles ) {
		plp_handles.style.visibility = 'hidden';
	}
}

function plp_RulerCommand( cmd, item ) {
    switch (cmd) {
		case "admin":
		    site_launchSiteMgr(cmd, item);
			break;
	    case "ruler_var":
			plp_SetWidthTypeVariable();
			break;
	    case "ruler_pane":
			plp_SetWidthTypePane();
			break;
	    case "ruler_fixed":
	        plp_SetWidthTypeFixed();

	        break;
	    default:
	        var panename;
	        panename = item.panename != null ? item.panename : plp_paneName;
	        if (panename && panename != '') {
	            if (item.commandArgs)
	                __doPostBack(panename, item.group + ',' + cmd + ',' + item.commandArgs);
	            else
	                __doPostBack(panename, item.group + ',' + cmd);
	        }
	        break;
	}
}

function plp_DoCommand(target, cmd, arg1, arg2) {
    while (target) {
        if (target.id) {
            var pane = plp_registeredPanes[target.id];
            if (pane != undefined) {
                var _cmds = pane.cmds.split(';');
                for (var i = 0; i < _cmds.length; i++) {
                    _cmds[i] = _cmds[i].split(','); // cmdid, group, text, enabled
                    if (_cmds[i][0] == cmd) {
                        __doPostBack(pane.paneName, pane.group + ',' + cmd + ',' + arg1 + ',' + arg2);
                        return;
                    }
                }
            }
        }
        target = $(target).parent()[0];
    }
}

var plp_ruler;
var plp_ruler_cols, plp_ruler_cols_tr;
var plp_rulerLastElem = null;
function plp_ShowRuler( elem ) {
    if( !elem ) {
        plp_HideRuler();
        return;
    }
	if( !plp_ruler ) {
		plp_ruler = document.createElement('TABLE');
		plp_ruler.className = 'admin_ruler';
		plp_ruler.setAttribute('cellspacing', '0');
		plp_ruler.setAttribute('cellpadding', '0');
		var tr, td;
		
		tr = plp_ruler.insertRow(0);
			td = tr.insertCell(0);
				td.className='admin_ruler';
				td.vAlign='bottom';
			
				plp_ruler_cols  = document.createElement('TABLE');
		        plp_ruler_cols.className = 'admin_ruler_cols';
		        plp_ruler_cols.setAttribute('cellspacing', '0');
		        plp_ruler_cols.setAttribute('cellpadding', '0');
				td.appendChild(plp_ruler_cols);
				plp_ruler_cols_tr = plp_ruler_cols.insertRow(0);
				td = plp_ruler_cols_tr.insertCell(0); td.innerHTML = '100%'; 
				    td.className='admin_ruler_col';
		ruler_site.appendChild( plp_ruler );

    	paj_handleEvent(plp_ruler_cols, "onmousedown", plp_beginDrag_onmousedown, true );
    	paj_handleEvent(plp_ruler_cols, "onmousemove", plp_onmousemove, true );

    	try {
    	    paj_handleEvent(plp_eventtarget, "onmousedown", plp_beginDrag_onmousedown, false);
    	} catch (e) { }
	}

	if( plp_rulerLastElem )	{
		paj_handleEvent(plp_rulerLastElem,"onresize", plp_ResizeRuler, false );
		paj_handleEvent(plp_rulerLastElem,"onmove", plp_ResizeRuler, false );
	}
	
	plp_rulerLastElem = elem;
	
	var pos = new plp_pt(0,0);
	plp_GetPos(elem, pos );
	
	var rulerpos = new plp_pt(0,0);
	plp_GetPos(plp_ruler, rulerpos );
	
	plp_ruler.style.left = pos.x;
	plp_ruler.style.width = elem.offsetWidth;
	paj_handleEvent(elem,"onresize", plp_ResizeRuler, true );
	paj_handleEvent(elem,"onmove", plp_ResizeRuler, true );
	plp_ruler.style.visibility = 'visible';
	
	plp_toolbar.Show();
	plp_toolbar2.Show();
	plp_UpdateRuler(elem, true);
}

function plp_RuntimeStyle(e) {
    if( e.runtimeStyle )
        return e.runtimeStyle;
    return e.style;
}

function plp_CurrentStyle(e) {
    if( e.currentStyle )
        return e.currentStyle;
    return e.style;
}

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';
	}
}

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(0);
	} else {
		tags = plp_sizeTags;
	}

	var rulertags = plp_GetColTags(plp_ruler_cols, tags.length);
	var pixelwidths = plp_GetColPixelSizes(elem, plp_loadWidths(elem));
	
	for( var c=0; c < Math.min(tags.length,pixelwidths.length); c++ ) {
		var size = tags[c].getAttribute('width');
		var td;
	
	    //rulertags[c].setAttribute('width', size );
		rulertags[c].setAttribute('width', Math.max(pixelwidths[c],0).toString());
	    	
		if( rebuild ) {
			td = plp_ruler_cols_tr.insertCell(c); 
			paj_handleEvent( td, "onclick", plp_onRulerColumnClick, true );
		} else {
			td = plp_ruler_cols_tr.cells[c];
		}

		if (td) {
		    if (c == plp_colSelectedIndex) {
		        td.className = 'admin_ruler_col_sel';
		    } else
		        td.className = 'admin_ruler_col';

		    td.innerHTML = size;
		    td.style.width = Math.max(pixelwidths[c], 0).toString() + 'px';
		}
//		if( size[size.length-1] == '%' )
//		    td.style.width = size;
//		else
//		    td.style.width = size + 'px';
    }    
}

function plp_setSelectedCol( index )
{
	plp_colSelectedIndex = index;
}

function plp_onRulerColumnClick( e ) {
	plp_setSelectedCol( e.target.cellIndex );
	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_loadWidths(elem) {
    if (plp_isLayout(elem)) {
        return elem.previousSibling.value.split(',');
    }
}

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_DoesColumnfit( colindex, colcounts, colspan ) {
	for( var c = 0; c < colspan; c++ )
		if( colcounts.length > colindex+c && colcounts[colindex+c] > 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++] = rowspan;
			} 
		}
		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++] = rowspan;
			} 
		}
		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 colgroup;
	for( var i = 0; i < pTable.childNodes.length; i++ )
	    if( pTable.childNodes[i].tagName == "COLGROUP" ) {
	        colgroup = pTable.childNodes[i];
	        break;
	    }
	    
	if( !colgroup )
	{
		colgroup = document.createElement('COLGROUP');
		pTable.insertBefore(colgroup, pTable.firstChild);
	}
	
	var coltags = new Array();
	for( var i = 0; i < colgroup.childNodes.length; i++ )
	    if( colgroup.childNodes[i].tagName == "COL" )
	        coltags[coltags.length] = colgroup.childNodes[i];
	while( coltags.length < colCount )
	{
		var newcol = document.createElement('COL');
		coltags[coltags.length] = newcol;
		colgroup.appendChild(newcol);
	}
	
	return coltags;
}

function plp_SetSize( sizetaglist, sizeattr, index, size )
{
	sizetaglist[index].setAttribute(sizeattr, size);
}

function plp_GetSize( sizetaglist, sizeattr, index)
{
	return parseInt(sizetaglist[index].getAttribute(sizeattr));
}

function plp_handleDragEvents( obj, onoff ) {
    if( !obj.setCapture )
        obj = window; /* mozilla */
    
   	if (obj.setCapture && onoff)
	    obj.setCapture(true);  /* ie */
	
	paj_handleEvent(obj, "onmousemove", plp_dragWidth_onmousemove, onoff );
	paj_handleEvent(obj, "onmouseup", plp_endDrag_onmouseup, onoff );
	paj_handleEvent(obj, "onkeydown", plp_endDrag_onkeydown, onoff );
	
	if (obj.releaseCapture && !onoff)
	    obj.releaseCapture();  /* ie */
}

function plp_beginDrag_onmousedown(e) {
    if( plp_colHoverIndex > -1 )
    {
        // dragging column border
	    plp_dragging = true;	
    	
    	// use client coordinates because we are going to use mouse delta (client coord more stable)
	    // var mousep = new plp_pt(e.clientX,e.clientY);
	    //plp_GetPos(e.srcElement, mousep );
	    plp_BeginDragWidth( plp_highlighted, e.clientX );

	    plp_handleDragEvents(plp_highlighted, true);

	    e.preventDefault();
	    e.stopPropagation();
	    //e.cancelBubble = true;
	} else {
	    // clicked on column
    	e.stopPropagation();
	    //e.cancelBubble = true;
	}
}

function plp_dragWidth_onmousemove(e) {
	//var mousep = new plp_pt(e.offsetX,e.offsetY);
	//plp_GetPos(e.srcElement, mousep );

    plp_DragWidth(e.clientX);

    e.preventDefault();
    e.stopPropagation();
    //e.cancelBubble = true;
}

function plp_endDrag_onmouseup(e) {
	plp_handleDragEvents(plp_highlighted, false );
	
	plp_dragging = false;

	plp_notifyChange(plp_highlighted);
	plp_HideHandles();
}

function plp_endDrag_onkeydown(e) {
	switch( e.keyCode ) {
	    case 27:
	        plp_handleDragEvents(plp_highlighted, false);
	        plp_HideHandles();
	        plp_dragging = false;
	        e.preventDefault();
	        e.stopPropagation();
	        //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 < curcol )
				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 > curcol )
				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;
		}
	}
}

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_colHoverIndex;
	
	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));
		
			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);
		
			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_colSelectedIndex >= 0 && plp_highlighted ) {
		var elem = plp_highlighted;
		var colIndex = plp_colSelectedIndex;
		
		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] );

			plp_saveWidths(elem, resolvedSizes );
			plp_notifyChange(elem);
		}
	}
}

function plp_SetWidthTypePane() {
	if( plp_colSelectedIndex >= 0 ) {
	}
}

function plp_SetWidthTypeFixed() {
	if( plp_colSelectedIndex >= 0 && plp_highlighted ) {
		var elem = plp_highlighted;
		var colIndex = plp_colSelectedIndex;
		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] );

			plp_saveWidths(elem, resolvedSizes );
			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]);
	}
	
    return resolvedSizes;
}

function plp_GetColTag( pTable, colIndex )
{
	return plp_GetColTags( pTable, colIndex+1 )[colIndex];
}

function plp_Layout(elem)
{
	var pTable;
	
	pTable = elem;
	while( pTable && !plp_isLayout(pTable) )
	{
	    if( pTable == plp_ruler_cols ) {
	        return plp_highlighted;
	    } else
		    pTable = pTable.parentNode; 
    }
		
	return pTable;
}

function plp_Highlight( paneid, layoutid )
{
	if( plp_selected ) {
	    if (plp_RuntimeStyle(plp_selected).outline == undefined || Sys.Browser.agent == Sys.Browser.Safari || Sys.Browser.agent == Sys.Browser.InternetExplorer) {
		    plp_RuntimeStyle(plp_selected).borderWidth = plp_selectedOldBorderWidth;
		    plp_RuntimeStyle(plp_selected).borderStyle = plp_selectedOldBorderStyle;
		    plp_RuntimeStyle(plp_selected).borderColor = plp_selectedOldBorderColor;
		} else {
		    plp_RuntimeStyle(plp_selected).outlineWidth = plp_selectedOldBorderWidth;
		    plp_RuntimeStyle(plp_selected).outlineStyle = plp_selectedOldBorderStyle;
		    plp_RuntimeStyle(plp_selected).outlineColor = plp_selectedOldBorderColor;
        }

		plp_selected = null;
	}
	if( plp_highlighted ) {
		if( plp_rowIndex >= 0 || plp_colHoverIndex >= 0)
		{
			plp_rowIndex = -1;
			plp_colHoverIndex = -1;
			plp_setCursor();
		}
		plp_setCursor();

		try {
		paj_handleEvent(plp_eventtarget, "onmousedown", plp_beginDrag_onmousedown, false );
		} catch(e) {}

		plp_highlighted = null;
		plp_HideRuler();
	}

	plp_paneID = paneid;

	plp_selected = document.getElementById(paneid);
	if( plp_selected ) {
	    if (plp_RuntimeStyle(plp_selected).outline == undefined || Sys.Browser.agent == Sys.Browser.Safari || Sys.Browser.agent == Sys.Browser.InternetExplorer) {
	        plp_selectedOldBorderWidth = plp_CurrentStyle(plp_selected).borderWidth;
	        plp_selectedOldBorderStyle = plp_CurrentStyle(plp_selected).borderStyle;
		    plp_selectedOldBorderColor = plp_CurrentStyle(plp_selected).borderColor;
		    plp_RuntimeStyle(plp_selected).border = "2px dashed orange";
		} else {
		    plp_selectedOldBorderWidth = plp_CurrentStyle(plp_selected).outlineWidth;
		    plp_selectedOldBorderStyle = plp_CurrentStyle(plp_selected).outlineStyle;
		    plp_selectedOldBorderColor = plp_CurrentStyle(plp_selected).outlineColor;
            plp_RuntimeStyle(plp_selected).outline = "2px dotted orange";
        }
	}

	if( layoutid && layoutid != '' )
	{
		var hidden = document.getElementById(layoutid);
		if( hidden && hidden.tagName == 'INPUT' ) 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_colHoverIndex = -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();
		}
	}
	
	var saveIDTo = document.getElementById('plp_lastHighlight');
	if( saveIDTo ) saveIDTo.value = paneid;
	plp_UpdateToolbar();
}

function plp_setCursor()
{
	if( plp_eventtarget ) {
		if( plp_rowIndex >= 0 )	{
			plp_RuntimeStyle(plp_eventtarget).cursor = plp_row_cursor;
		} else if( plp_colHoverIndex >= 0 ){
			plp_RuntimeStyle(plp_eventtarget).cursor = plp_col_cursor;
		} else {
		    plp_RuntimeStyle(plp_eventtarget).cursor = plp_no_cursor;
		}
	}
}

function plp_mousemove_inhighlighted( p, mousep )
{
	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_colHoverIndex != foundcolIndex ) {
		plp_colHoverIndex = foundcolIndex;
		plp_setCursor();
		
    	if( plp_colHoverIndex >= 0 ) {
			//plp_borderingCell = foundcol;
			paj_handleEvent(plp_eventtarget, "onmousedown", plp_beginDrag_onmousedown, true );
		} else {
			paj_handleEvent(plp_eventtarget, "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_onmousemove( e )
{
	if( plp_dragging ) return;

    var target;
	if (e.target) target = e.target; else if (e.srcElement) target = e.srcElement; if (target.nodeType == 3) target = target.parentNode;

	if (e.preventDefault) e.preventDefault();
    
	var pTable = plp_Layout(target);

	var mousep = new plp_pt(e.offsetX,e.offsetY);
	plp_GetPos(target,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 ) )	{
    		var p2 = new plp_pt(0,0);
		
	    	plp_GetPos(plp_ruler_cols,p2);
	    	
	    	if( plp_IsInside(p2, mousep.x, mousep.y ) ) {
	    	    plp_eventtarget = plp_ruler_cols;
	    	    plp_mousemove_inhighlighted( p2, mousep );
    	    }
			//plp_Highlight(null);
		} else {
	        //debug_msg('plp_onmousemove-'+p.x.toString() +','+p.y.toString(), 0);
            plp_eventtarget = plp_highlighted;
		    plp_mousemove_inhighlighted( p, mousep );
		}					
	}
}

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)
	if( newpos.x < 0 ) newpos.x = 0;
	if( newpos.y < 0 ) newpos.y = 0;
	
	if( plp_draggingMoveX == 1 )
    	plp_draggingElement.style.left = (newpos.x).toString()+'px';
    if( plp_draggingMoveY == 1 )
	    plp_draggingElement.style.top = (newpos.y).toString()+'px';
	if( plp_draggingSizeX == 1 )
    	plp_draggingElement.style.width = (newpos.x).toString()+'px';
    if( plp_draggingSizeY == 1 )
	    plp_draggingElementSizeY.style.height = (newpos.y).toString()+'px';
	
	if( plp_draggingStorage != null ) {
        var storageelement = paj_getElementByID(plp_draggingStorage);
        if( storageelement != null ) {
            var posvalues = storageelement.value.split(',');
            
	        if( plp_draggingMoveX == 1 )
    	        posvalues[0] = (newpos.x).toString();
            if( plp_draggingMoveY == 1 )
    	        posvalues[1] = (newpos.y).toString();
	        if( plp_draggingSizeX == 1 )
    	        posvalues[2] = (newpos.x).toString();
            if( plp_draggingSizeY == 1 )
    	        posvalues[3] = (newpos.y).toString();
    	        
            storageelement.value = posvalues.join(',');
        }
    }
    paj_moveBacking( plp_draggingElement );
    plp_draggingMoved = true;
}

function plp_handleDragPaneEvents( obj, onoff ) {
    if( !plp_draggingElement.setCapture )
        obj = window; /* mozilla */
    
   	if (plp_draggingElement.setCapture && onoff)
	    plp_draggingElement.setCapture(true);  /* ie */

	paj_handleEvent(obj, "onmousemove", plp_dragPane_onmousemove, onoff );
	paj_handleEvent(obj, "onmouseup", plp_endDragPane_onmouseup, onoff );
	paj_handleEvent(obj, "onkeydown", plp_endDragPane_onkeydown, onoff );
	
	if (plp_draggingElement.releaseCapture && !onoff)
	    plp_draggingElement.releaseCapture();  /* ie */
}

function plp_dragPane_onmousemove(e) {
	var mousep = new plp_pt(e.clientX,e.clientY);
	plp_dragPane( mousep );
	
	e.stopPropagation();
	e.preventDefault();
	//e.cancelBubble = true;
}

function plp_DragPaneEnd() {
	plp_handleDragPaneEvents(plp_draggingElement, false );
	
	plp_dragging = false;
	plp_draggingElement = plp_draggingElementSizeY = null;
}

function plp_endDragPane_onmouseup(e) {
    var elem = plp_draggingElement;
    plp_DragPaneEnd();	
    if( plp_draggingDoneCallback != undefined && plp_draggingMoved )
        plp_draggingDoneCallback( elem );
}

function plp_endDragPane_onkeydown(e) {
	switch( e.keyCode ) {
		case 27:
			plp_dragPane( plp_beginPos );
            plp_DragPaneEnd();
            e.stopPropagation();
            //e.cancelBubble = true;
			break;
	}
}

function plp_DragPane( e, paneid, storageid, doneCallback )
{
	if( plp_draggingElement ) return;
	
    if (!e) e = window.event;
    var targ;
    if (e.target) targ = e.target; else if( e.srcElement ) targ = e.srcElement; if (targ.nodeType == 3 ) targ = targ.parentNode;
    if( e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true;
    
	plp_draggingElement = targ;
	
	while( plp_draggingElement != null && plp_CurrentStyle(plp_draggingElement).position != 'absolute' ) {
		plp_draggingElement = plp_draggingElement.parentNode;
	}
	
	plp_draggingElementSizeY = plp_draggingElement;
	
	if( plp_draggingElement == null ) { return;}
	
	var mousep = new plp_pt(e.clientX,e.clientY);

	plp_beginElemPos = new plp_pt(parseInt(plp_draggingElement.style.left,10),
					parseInt(plp_draggingElement.style.top,10));
	plp_beginPos = mousep;
	
	plp_handleDragPaneEvents(plp_draggingElement, true );
	
	plp_draggingStorage = storageid;
	plp_draggingDoneCallback = doneCallback;
	plp_draggingMoved = false;
    plp_draggingSizeX = 0;
    plp_draggingSizeY = 0;
    plp_draggingMoveX = 1;
    plp_draggingMoveY = 1;
}

function plp_DragPaneSize( e, paneid, storageid, sizeX, sizeY, doneCallback )
{
    plp_DragPane( e, paneid, storageid, doneCallback );
    
    plp_beginElemPos = new plp_pt(parseInt(plp_draggingElement.style.width,10), parseInt(plp_draggingElement.style.height,10));
	plp_draggingSizeX = sizeX;
    plp_draggingSizeY = sizeY;
    plp_draggingMoveX = 0;
    plp_draggingMoveY = 0;
}

var plp_editItem = null;
function plp_BuildToolbar( toolbar_site )
{
	if( !toolbar_site ) return;

	plp_toolbar = new INToolbar(document, 'ruler_tb', 'admin_ruler');

    plp_toolbar.Add( new INToolbarLabel(plp_toolbar, "Webfuser") );
    
	plp_toolbar.AddSeparator();
    plp_toolbar.Add( new INToolbarStaticButton(plp_toolbar, 
        'Styles/Standard/Layout/Icons/server_preferences.gif', 'Go to the Site Manager',
        'Site Manager', 'admin', '') );
	
	plp_toolbar.AddSeparator();
	var tracebtn = new INToolbarLinkPopupButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/oszillograph.gif', 'Show the Trace Window popup',
	    'Trace', 'trace', 'trace', 'Support/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', 'Show/Hide the List of Pages popup',
	    'Pages', paj_getElementByID('PL')));
	plp_toolbar.Add(new INToolbarShowPopupButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/data_table.gif', 'Show/Hide the list of Data Lists',
	    'Data', paj_getElementByID('LL')));
	plp_toolbar.Add(new INToolbarShowPopupButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/bookmark.gif', 'Show/Hide the List of Selectors popup',
	    'Selectors', paj_getElementByID('SD')) );

	plp_toolbar.AddSeparator();
	plp_toolbar.Add(plp_undoButton = new INToolbarButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/undo.gif', 'Undo',
	    null, 'undo', ''));
	plp_toolbar.Add(plp_redoButton = new INToolbarButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/redo.gif', 'Redo',
	    null, 'redo', ''));
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( plp_cutButton = new INToolbarButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/cut.gif', 'Cut',
	    null, 'edit_cut', '') );
	plp_toolbar.Add( plp_copyButton = new INToolbarButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/copy.gif', 'Copy',
	    null, 'edit_copy', '') );
	plp_toolbar.Add( plp_pasteButton = new INToolbarButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/paste.gif', 'Paste',
	    null, 'edit_paste', '') );
	
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/window_new.gif', 'Add a new item to the selected container',
	    'New&nbsp;Item', 'pane_new', '') );
	plp_editItem = new INToolbarButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/window_gear.gif', 'Show the Properties popup',
	    'Properties', 'pane_admin', '');
	plp_toolbar.Add(plp_editItem);
	plp_toolbar.AddSeparator();
	plp_toolbar.Add(new INToolbarButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/window_view.gif', 'Zoom-in to the selected item',
	    null, 'pane_zoomin', ''));
	plp_toolbar.Add(new INToolbarButton(plp_toolbar,
	    'Styles/Standard/Layout/Icons/window.gif', 'Zoom-out to the page',
	    null, 'pane_zoomout', ''));
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/window_delete.gif', 'Delete the selected item',
	    'Delete', 'pane_delete', '', 'Delete Item - Are you sure?') );
	plp_toolbar.AddSeparator();
	plp_toolbar.Add( new INToolbarLinkPopupButton(plp_toolbar, 
	    'Styles/Standard/Layout/Icons/help.gif', 'Help Contents', 
	    'Help', 'help', '', 'PortalSite.aspx?Site=Admin.Help') );
	
	plp_toolbar.oncommand = function(cmd, item) { plp_RulerCommand( cmd, item ); }
	toolbar_site.appendChild( plp_toolbar.elem );


	plp_toolbar2 = new INToolbar(document, 'ruler_tb', 'admin_ruler');

	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/button_var.gif', 'Relative Sizing',
	    null, 'ruler_var', 'col_size') );
	//plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, '','Styles/Standard/Layout/Icons/button_pane.gif', 'null, 'ruler_pane', 'col_size') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/button_fixed.gif', 'Absolute Sizing',
	    null, 'ruler_fixed', 'col_size') );
	
	plp_toolbar2.AddSeparator();
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/arrow_left_green.gif', 'Move Item Left',
	    null, 'pane_left', '') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/arrow_up_green.gif', 'Move Item Up',
	    null, 'pane_up', '') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/arrow_down_green.gif', 'Move Item Down',
	    null, 'pane_down', '') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/arrow_right_green.gif', 'Move Item Right',
	    null, 'pane_right', '') );
	
	plp_toolbar2.AddSeparator();
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/layout_west.gif', 'Align Contents Left',
	    null, 'align_h_left', 'align_h') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/layout_center.gif', 'Align Contents Center',
	    null, 'align_h_center', 'align_h') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2,
	    'Styles/Standard/Layout/Icons/layout_east.gif', 'Align Contents Right',
	    null, 'align_h_right', 'align_h') );
	
	plp_toolbar2.AddSeparator();
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/layout_north.gif', 'Align Contents Top',
	    null, 'align_v_top', 'align_v') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/layout_center.gif', 'Align Contents Middle',
	    null, 'align_v_middle', 'align_v') );
	plp_toolbar2.Add( new INToolbarButton(plp_toolbar2, 
	    'Styles/Standard/Layout/Icons/layout_south.gif', 'Align Contents Bottom',
	    null, 'align_v_bottom', 'align_v') );

    plp_toolbar2.AddSeparator();
	plp_themeComboItem = new INToolbarCombobox2(plp_toolbar2, null, 'Appearance Theme', 'Theme', '', 'theme');
	//plp_themeComboItem.lockEnabled = true; // make sure that it isnt disabled due to lack of cmdargs
	plp_toolbar2.Add( plp_themeComboItem );
	
    plp_toolbar2.AddSeparator();
	plp_styleComboItem = new INToolbarCombobox2(plp_toolbar2, null, 'Appearance Pane Style', 'Style', '', 'theme_panetype');
	//plp_styleComboItem.lockEnabled = true;
	plp_toolbar2.Add( plp_styleComboItem );
	
    plp_toolbar2.AddSeparator();
	plp_flavourComboItem = new INToolbarCombobox2(plp_toolbar2, null, 'Appearance Pane Flavour (Alternatives)', 'Flavour', '', 'theme_flavour');
	//plp_flavourComboItem.lockEnabled = true;
	plp_toolbar2.Add( plp_flavourComboItem );

	var dropdownfiller = function(item) {
	    var params = 'current=' + encodeURIComponent(plp_currentTheme + '.'
                                   + plp_styleComboItem.command + '.'
                                   + plp_flavourComboItem.command);

	    try {
	        var xh = paj_CreateXMLHTTP();
	        var url = 'Styles/PortalStyleChoices.aspx?level=' + item.group + '&' + params;
	        ////alert(url);
	        xh.open('GET', url, false);
	        xh.send(null);

	        var txt = xh.responseText;
	        xh = null;

	        item.clearOptions();
	        //item.addOption('<double click to edit>','');

	        var valfound = false;
	        var options = txt.split('|');
	        var selectedIndex = 0;
	        for (var i = 0; i < options.length; i++) {
	            var idtext = options[i].split(':');
	            if (idtext.length == 1) {
	                item.addOption(idtext[0], null);
	            } else {
	                item.addOption(idtext[1], idtext[0]);
	            }
	            if (idtext[0] == item.command) { valfound = true; selectedIndex = i; }
	        }
	        if (!valfound) {
	            item.setOption(0, item.command, null);
	        }
	        item.combo.set_selectedIndex(selectedIndex);
	    } catch (ex) {
	        alert(ex.toString());
	    }
	}

	plp_themeComboItem.onfill = dropdownfiller;
	plp_styleComboItem.onfill = dropdownfiller;
	plp_flavourComboItem.onfill = dropdownfiller;
	
	plp_toolbar2.oncommand = function(cmd, item) { plp_RulerCommand( cmd, item ); }
	toolbar_site.appendChild( plp_toolbar2.elem );

	return plp_toolbar;
}

function plp_UpdateToolbar()
{
	if( !plp_toolbar2 ) return;
	
	if( plp_colSelectedIndex >= 0 && plp_highlighted && plp_originalSizeList && 
			plp_originalSizeList.length > plp_colSelectedIndex ) {
		switch( plp_colSizeType(plp_originalSizeList[plp_colSelectedIndex]) ) {
			case COL_FIXED:
				plp_toolbar2.setGroupCommandState('col_size', 'ruler_fixed', true );
				break;
			case COL_PERCENT:
				plp_toolbar2.setGroupCommandState('col_size', 'ruler_var', true );
				break;
			case COL_PANE:
				plp_toolbar2.setGroupCommandState('col_size', 'ruler_pane', true );
				break;
		}
	} else {
		plp_toolbar2.setGroupCommandState( 'col_size', '', false );
	}
}

function plp_BuildActionsToolbar( toolbar_site )
{
	if( !toolbar_site ) return;

    var toolbar = new INToolbar(document, 'actions', 'admin_ruler');

	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/cut.gif', 'Cut',
	    null, 'action_cut', '') );
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/copy.gif', 'Copy',
	    null, 'action_copy', '') );
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/paste.gif', 'Paste',
	    null, 'action_paste', '') );
	
	toolbar.AddSeparator();
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/arrow_left_green.gif', 'Move Item Left',
	    null, 'action_left', '') );
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/arrow_up_green.gif', 'Move Item Up',
	    null, 'action_up', '') );
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/arrow_down_green.gif', 'Move Item Down',
	    null, 'action_down', '') );
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/arrow_right_green.gif', 'Move Item Right',
	    null, 'action_right', '') );

	toolbar.AddSeparator();
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/window_new.gif', 'Add a new action to the selected path',
	    'New', 'action_new', '') );
	toolbar.AddSeparator();
	toolbar.Add( new INToolbarButton(toolbar, 
	    'Styles/Standard/Layout/Icons/window_delete.gif', 'Delete the selected item',
	    'Delete', 'action_delete', '', 'Delete Action - Are you sure?') );

	toolbar.oncommand = function(cmd, item) { plp_RulerCommand( cmd, item ); }
	toolbar_site.appendChild( toolbar.elem );

	return toolbar;
}


var plp_registeredPanes = new Array();

function INPane( paneid, panename, layoutid, themestyleflavour, cmds )
{
    this.paneID = paneid;
    this.paneName = panename;
    this.layoutID = layoutid;
    this.themeStyleFlavour = themestyleflavour;
    this.cmds = cmds;
    this.selected = false;
}

INPane.prototype.Select = new function( selected )
{
    if( this.selected && !selected )
    {
        
    }
    else if( !this.selected && selected )
    {
    }
}

function plp_RegisterPane( paneid, panename, layoutid, themestyleflavour, cmds, draggable ) 
{
    var newpane = new INPane(paneid, panename, layoutid, themestyleflavour, cmds );
    plp_registeredPanes[paneid] = newpane;

    if (draggable) {
        $('#' + paneid)
            .bind('dragstart', function(event) {
            if ($(event.target).is('.dropabove,.dropabove SPAN')) {
                    var w = $(this).outerWidth(); var h = $(this).outerHeight();

                    $.dropManage({ filter: '.dropcell,.dropabove' });

                    return $(this).css('opacity', .2)
                            .addClass('dragsource')
                            .clone()
                            .addClass('dragactive')
                            .css({ opacity: .6,
                                width: w, height: h
                            })
                            .insertAfter($('#PPH'));
                } else if ($(event.target).is('.action_cntr_t span,.action_std_t span')) {
                    var w = $(this).outerWidth(); var h = $(this).outerHeight();

                    $.dropManage({ filter: '.action_root_cntr_path,.action_seq_cntr_path,.action_root_cntr_prepath,.action_seq_cntr_prepath' });

                    return $(this).css('opacity', .2)
                            .addClass('dragsource')
                            .clone()
                            .addClass('dragactive')
                            .css({ opacity: .6,
                                width: w, height: h
                            })
                            .insertAfter($('#PPH'));
                } else {
                    return false;
                }
            })
            .bind('drag', { distance: 20 }, function(event) {
                $(event.dragProxy).css({
                    top: event.offsetY,
                    left: event.offsetX
                });
            })
            .bind('dragend', function(event) {
                $(event.dragProxy).remove();
                $(this).css('opacity', 1)
                    .removeClass('dragsource');
            })
    }        
}

function plp_getId(ctrl) {
    while (ctrl) { if (ctrl.id != '') return ctrl.id; ctrl = ctrl.parentNode; }
    return null;
}

function plp_RegisterDropTargets() {
    $('.dropcell').bind("dropstart", function(event) {
//            if (!event.ctrlKey) {
//                // don't drop in itself
//                var test = this;
//                while (test) {
//                    if (event.dragTarget.parentNode == test) return false;
//                    test = test.parentNode;
//                }
//            }
//            //if (this == event.dragTarget.parentNode) return false;
            // activate the "drop" target element
            $(this).addClass("dropcellactive");
            $(this).closest("table").addClass("droplayoutactive");
        })
        .bind("drop", function(event) {
            //window.alert((event.ctrlKey ? 'copyinto' : 'moveinto') + '|' + plp_getId(event.dropTarget) + '|' + event.dragTarget.id);
            var cmd = (event.ctrlKey ? 'copyinto' : 'moveinto');
            var srcid = event.dragTarget.id;
            var targetid = plp_getId(event.dropTarget);

            plp_DoCommand(event.dropTarget, cmd, targetid, srcid);
        })
        .bind("dropend", function(event) {
            // deactivate the "drop" target element
            $(this).removeClass("dropcellactive");
            $(this).closest("table").removeClass("droplayoutactive");
        });

    $('.dropabove').bind("dropstart", function(event) {
            if (!event.ctrlKey) {
                // don't drop in itself
                var test = this;
                while (test) {
                    if (event.dragTarget == test) return false;
                    test = test.parentNode;
                }
            }
            //if (this == event.dragTarget.parentNode) return false;
            // activate the "drop" target element
            $(this).closest("table").addClass("dropaboveactive");
            $(this).closest(".dropcell").addClass("dropabovecellactive");
            $(this).closest(".dropcell").closest("table").addClass("droplayoutactive");
        })
        .bind("drop", function(event) {
            //window.alert((event.ctrlKey ? 'copyabove' : 'moveabove') + '|' + plp_getId(event.dropTarget) + '|' + event.dragTarget.id);
            var cmd = (event.ctrlKey ? 'copyabove' : 'moveabove');
            var srcid = event.dragTarget.id;
            var targetid = plp_getId(event.dropTarget);

            plp_DoCommand(event.dropTarget, cmd, targetid, srcid);
        })
        .bind("dropend", function(event) {
            // deactivate the "drop" target element
            $(this).closest("table").removeClass("dropaboveactive");
            $(this).closest(".dropcell").removeClass("dropabovecellactive");
            $(this).closest(".dropcell").closest("table").removeClass("droplayoutactive");
        });
        
        $('.action_root_cntr_path,.action_seq_cntr_path').bind("dropstart", function(event) {
            if (!event.ctrlKey) {
                // don't drop in itself
                var test = this;
                while (test) {
                    if (event.dragTarget == test) return false;
                    test = test.parentNode;
                }
            }
            //if (this == event.dragTarget.parentNode) return false;
            // activate the "drop" target element
            $(this).addClass("dropactionactive");
        })
        .bind("drop", function(event) {
            var cmd = (event.ctrlKey ? 'copyinto' : 'moveinto');
            var srcid = event.dragTarget.id;
            var targetid = plp_getId(event.dropTarget);

            plp_DoCommand(event.dropTarget, cmd, targetid, srcid);
        })
        .bind("dropend", function(event) {
            // deactivate the "drop" target element
            $(this).removeClass("dropactionactive");
        });
        $('.action_root_cntr_prepath,.action_seq_cntr_prepath').bind("dropstart", function(event) {
            if (!event.ctrlKey) {
                // don't drop in itself
                var test = this;
                while (test) {
                    if (event.dragTarget == test) return false;
                    test = test.parentNode;
                }
            }
            //if (this == event.dragTarget.parentNode) return false;
            // activate the "drop" target element
            $(this).addClass("dropactionactive");
        })
        .bind("drop", function(event) {
            var cmd = (event.ctrlKey ? 'copyabove' : 'moveabove');
            var srcid = event.dragTarget.id;
            var targetid = plp_getId(event.dropTarget);

            plp_DoCommand(event.dropTarget, cmd, targetid, srcid);
        })
        .bind("dropend", function(event) {
            // deactivate the "drop" target element
            $(this).removeClass("dropactionactive");
        });
    }

function plp_SelectMultiple( paneids )
{
    if( Sys.WebForms && Sys.WebForms.PageRequestManager )
        Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded( function () { plp_UpdateSelections( paneids ); } )
    else
        window.setTimeout('plp_UpdateSelections("' + paneids +'");', 50);
 }

function plp_UpdateSelections(paneids)
{
    var _panes = paneids.split(',');
    
    for( var i=0; i< _panes.length; i++ )
        plp_Select( _panes[i] );
}

function plp_StyleLabel(value)
{
    if( value == undefined || value == '' )
        return '(Default)';
    return value;
}

function plp_Select( paneid ) 
{
    var pane = plp_registeredPanes[ paneid ];
    if( pane == undefined ) return;

    var panename = pane.paneName;
    var layoutid = pane.layoutID;
    var themestyleflavour = pane.themeStyleFlavour;
    var cmds = pane.cmds;
    
	plp_paneName = panename;
	
	plp_Highlight( paneid, layoutid );

    var tsfParts = themestyleflavour.split('.');

    plp_currentTheme = tsfParts[0];
    
    plp_RegisterToolbarCommands(panename, cmds, false);

    plp_themeComboItem.setOnlyOption(tsfParts[0], tsfParts[0], plp_themeComboItem.enabled);
    plp_styleComboItem.setOnlyOption(plp_StyleLabel(tsfParts.length > 1 ? tsfParts[1] : ''),tsfParts.length > 1 ? tsfParts[1] : '', tsfParts[0] != '');
    plp_flavourComboItem.setOnlyOption(plp_StyleLabel(tsfParts.length > 2 ? tsfParts[2] : ''), tsfParts.length > 2?tsfParts[2]:'' , tsfParts.length > 1);
}

function plp_RegisterToolbar(panename, cmds) {
    plp_RegisterToolbarCommands(panename, cmds, true);
}

function plp_RegisterToolbarCommands( panename, cmds, fixed ) {
	var _cmds = cmds.split(';');
	for( var i=0; i < _cmds.length; i++ )
		_cmds[i] = _cmds[i].split(','); // cmdid, group, text, enabled

    for(var t=0; t < INToolbars.toolbars.length; t++) {
        var toolbar = INToolbars.toolbars[t];

        for (var i = 0; i < toolbar.items.length; i++) {
            var item = toolbar.items[i];
		    if( item.cmdid == null || ( !fixed && item.panename != null && item.panename != panename ) ) continue;

		    var found = false;
		    // group handling
		    var group = item.group;
		    if( group != null && group != '' ) {
			    for( j=0; j < _cmds.length; j++ ) {
			        if (_cmds[j].length >= 4 && _cmds[j][1] == group) {
			            if (fixed)
			                item.panename = panename;
				        if (item.setSelectedCommand != undefined)
				            item.setSelectedCommand(_cmds[j][0]);
				        else
				            item.setSelected(item.command == _cmds[j][0]);
				        item.setEnabled(_cmds[j][3] == '1');
					    if( _cmds[j].length > 4 )
					        item.setCommandArgs(_cmds[j][4]);
					    item.redraw();
					    found = true;
					    break;
				    }
			    }
		    }
		    else
		    // command handling
		    {
			    for( j=0; j < _cmds.length; j++ ) {
			        if (_cmds[j].length >= 4 && _cmds[j][0] == item.command) {
			            if (fixed)
			                item.panename = panename;
			            item.setEnabled(_cmds[j][3] == '1');
			            if (_cmds[j][2] != '') item.setAlt(_cmds[j][2]);
					    if( _cmds[j].length > 4 )
					        item.setCommandArgs(_cmds[j][4]);
					    item.redraw();
					    found = true;
					    break;
				    }
			    }
		    }
		    if (!fixed && !found && item.getEnabled()) 
		    {
		        item.setEnabled(false); item.redraw(); 
		    }
		}
	}
}


// Declare a namespace.
Type.registerNamespace("WFControls");

// Define a simplified component.
WFControls.SizeableColumns = function(element) {
    WFControls.SizeableColumns.initializeBase(this, [element]);

    this.widths = null;
    this.selectable = false;
}

// Create protytype.
WFControls.SizeableColumns.prototype = 
{
    initialize : function() {
            WFControls.SizeableColumns.callBaseMethod(this, 'initialize');
    
            var element = this.get_element();
            if( !element ) return;
            
            
        },
    
    dispose : function() {
            this.releaseListItems();
            
            $clearHandlers( this.get_element());
            if( this.container != null ) $clearHandlers( this.container);
            
            WFControls.SizeableColumns.callBaseMethod(this, 'dispose');
        },

    get_widths : function() {
            return this.widths;
        },
    
    set_widths : function( value ) {
            this.widths = value;
            this.refresh_options();
        },

    add_change : function( handler ) {
            this.get_events().addHandler('change', handler );
        },
    
    remove_change : function( handler ) {
            this.get_events().removeHandler('change', handler );
        },

    fire_change : function() {
            var h = this.get_events().getHandler('change');
            if (h) h(this, Sys.EventArgs.Empty);
        },
    
    add_changing : function( handler ) {
            this.get_events().addHandler('changing', handler );
        },
    
    remove_changing : function( handler ) {
            this.get_events().removeHandler('changing', handler );
        },

    fire_changing : function() {
            var h = this.get_events().getHandler('changing');
            if (h) h(this, Sys.EventArgs.Empty);
        }

}

// descriptor for JSON serialization.
WFControls.SizeableColumns.descriptor = {
    properties: [ 
        {name: 'widths', type: Object},
        {name: 'selectable', type: Boolean}
        ],
    events: [
        {name: 'change' },
        {name: 'changing' }
        ]
}

// the base this class inherits from
WFControls.SizeableColumns.inheritsFrom(Sys.UI.Behavior);

// Register the class as derived from UI.Behavior.
WFControls.SizeableColumns.registerClass('WFControls.SizeableColumns', Sys.UI.Behavior);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

