
/* 
OlapGrid processing
*/


function DundasGrid(ctrlId)
{
	this.isIE = (navigator.userAgent.indexOf( "MSIE " ) > 0);
	
    if (this.isIE)
    {
        units="px";
    }
    else
    {
        units="px;";
    }
    this.visibleHeight=0;
    this.visibleWidth=0;
    this.scrollWidth=0;
    this.rowCellsCollection=null;
    this.outerDiv=null;
    this.startX = 0;
    this.startY = 0;
    this.gridId = ctrlId;
    this.vh = document.getElementById(this.gridId+"XrowHeader");
    this.hh = document.getElementById(this.gridId+"XcolumnHeader");
    this.dataAreaDiv = document.getElementById(this.gridId+"XdataAreaDiv");    
    this.hsDataArea = document.getElementById(this.gridId+"XhSDataArea");
    this.hsRowHeader = document.getElementById(this.gridId+"XhSRowHeader");    
    this.vsDataArea = document.getElementById(this.gridId+"XvSDataArea");  
    this.vsColumnHeader = document.getElementById(this.gridId+"XvSColumnHeader");
    
    this.vhOuterDiv = document.getElementById(this.gridId+"XrowHeaderDiv"); 
    this.hhOuterDiv = document.getElementById(this.gridId+"XcolumnHeaderDiv"); 
    this.rowHeaderWidth = this.vh.offsetWidth;
    this.dataArea = document.getElementById(this.gridId+"XdataArea");    
    this.gridDiv = document.getElementById(this.gridId);
    this.titleHeight = 0;
    
    this.ed = document.getElementById(this.gridId+"XemptyCellDiv"); 
    this.ed.style.fontSize="1pt"; 
    //this.et = document.getElementById(this.gridId+"XemptyCell");  
    this.mainDiv = document.getElementById(this.gridId+"XmainDiv");
    // get outer div by main div
    this.outerDiv = this.mainDiv.offsetParent;
    
    this.rowHeaderPart = 30;
    this.columnHeader = 30;
    this.scrollMode = 0;
}

DundasGrid.prototype.storeScrollPositions = function()
{
    var inputId = this.gridId+"Xscroll";
    var scrollPosition = document.getElementById(inputId);
    
    if (scrollPosition == null)
    {
        scrollPosition = document.createElement("input");
        scrollPosition.type = "hidden";        
        scrollPosition.id = inputId;        
        document.body.appendChild(scrollPosition);
    }
    
    scrollPosition.value = this.vhOuterDiv.scrollLeft+";"+this.hhOuterDiv.scrollTop+";"+this.dataAreaDiv.scrollTop+";"+this.dataAreaDiv.scrollLeft;    
}

DundasGrid.prototype.restoreScrollPositions = function()
{
    var inputId = this.gridId+"Xscroll";
    var scrollPosition = document.getElementById(inputId);
    
    if (scrollPosition == null)
    {
        return;
    }
    
    var scrollPositions = scrollPosition.value.split(';');
    
    this.hsRowHeader.scrollLeft = parseInt(scrollPositions[0]);
    this.vhOuterDiv.scrollLeft = parseInt(scrollPositions[0]);
    
    this.vsColumnHeader.scrollLeft = parseInt(scrollPositions[1]);
    this.hhOuterDiv.scrollLeft = parseInt(scrollPositions[1]);
    
    this.dataAreaDiv.scrollTop = parseInt(scrollPositions[2]);
    this.vsDataArea.scrollTop = parseInt(scrollPositions[2]);
    
    this.dataAreaDiv.scrollLeft = parseInt(scrollPositions[3]);    
    this.hsDataArea.scrollLeft = parseInt(scrollPositions[3]);
}


DundasGrid.prototype.calcDimension = function(e)    
    {    
        if (this.isIE)
        {
            return event.srcElement.dmn;    
        }    
        
        if (!e)
        {
            e=window.event;
        }
        
        dimIndex = e.target.getAttribute("dmn");
        return dimIndex;
    }


DundasGrid.prototype.checkCellVisibilityX = function(cell)
    {
        var rightSide = cell.offsetLeft+cell.offsetWidth;
        var scrollableElement = this.hsDataArea;

        if (scrollableElement.scrollLeft != null) 
        {
            var xPos = cell.offsetParent.offsetLeft - scrollableElement.scrollLeft;
        }
        else
        {
            var xPos = cell.offsetParent.offsetLeft;
        }
        if (xPos<0 && (xPos + cell.offsetWidth<0) || 
            xPos > this.visibleWidth)
        {
            return false;        
        }
        else
        {
            return true;
        }
    }

DundasGrid.prototype.findLeaf = function(cell, rowNo, hhLastRowIndex,rowPos,cellcoll)
{
    if (null == cell)
    {
        return;
    }
    
    var x = parseInt(cell.rowSpan);
    
    if (isNaN(x))
    {
        x=1;
    }
    
    
    if (hhLastRowIndex == rowNo || x>1) 
    {
        var d = cell.getElementsByTagName("div")[0];
        cellcoll.push(cell);
        return;
    }
    else
    {
        var y = parseInt(cell.colSpan);
        if (isNaN(y))
        {
            y=1;
        }
        var r = rowNo+1;
        for (var j=rowPos[r];j<rowPos[r]+y;j++)
        {
            var c = this.hh.rows[r].cells[j];
            this.findLeaf(c,r,hhLastRowIndex,rowPos,cellcoll);
        }        
        rowPos[rowNo+1]+=y;
    }
}

DundasGrid.prototype.findLeaves = function ()
{
    var hhLastRowIndex = this.hh.rows.length-1;
           
    var cellcoll = new Array();
    
    var cellsExist = true;
    
    var rowPos = Array();
    
    for (var i=0;i<this.hh.rows.length;i++)
    {
        rowPos.push(0);
    }
    
    for (var i=0;i<this.hh.rows[0].cells.length;i++)
    {
        this.findLeaf(this.hh.rows[0].cells[i],0,hhLastRowIndex,rowPos,cellcoll);
    }
    
    return cellcoll;
}

DundasGrid.prototype.setDivHeight = function (cell)
{
    var div = cell.getElementsByTagName("div")[0];
    var h = this.getElementHeight(cell);
    div.style.height = h+"px";
}


DundasGrid.prototype.vScrollData = function ()
{   
    var scrollCtrls = new Array();    
    scrollCtrls.push(this.vh);
    scrollCtrls.push(this.dataArea);
    this.scrollElementY(this.vsDataArea,scrollCtrls);
}

DundasGrid.prototype.vScrollHeader = function ()
{
    var scrollCtrls = new Array();
    scrollCtrls.push(this.hh);
    this.scrollElementY(this.vsColumnHeader,scrollCtrls);
}


DundasGrid.prototype.scrollElementX = function(scrollerCtrl,elementsToScroll)
{
    var x = parseInt(scrollerCtrl.scrollLeft);
    
    for(var i=0;i<elementsToScroll.length;i++)
    {
        elementsToScroll[i].parentNode.scrollLeft=x;
    }
}

DundasGrid.prototype.scrollElementY = function(scrollerCtrl,elementsToScroll)
{
    var y = parseInt(scrollerCtrl.scrollTop);
    
    for(var i=0;i<elementsToScroll.length;i++)
    {
        elementsToScroll[i].parentNode.scrollTop=y;
    }
}

DundasGrid.prototype.hScrollData = function()
{    
    // set area for ctrls for scrolling
    var scrollCtrls = new Array();
    scrollCtrls.push(this.hh);
    scrollCtrls.push(this.dataArea);
    this.scrollElementX(this.hsDataArea,scrollCtrls);
}

DundasGrid.prototype.hScrollHeader = function()
{    
    // set area for ctrls for scrolling
    var scrollCtrls = new Array();

    scrollCtrls.push(this.vh);
    
    this.scrollElementX(this.hsRowHeader,scrollCtrls);
}

DundasGrid.prototype.processGrid = function (_rowHeaderPart,_columnHeaderPart, visible)
{
    if ( typeof(this.maskDiv) == "undefined" && this.gridDiv.processEnabled )
    {
        this.maskDiv = ChartCB.showMaskDiv(null, "_grid_");
    }
       
//    if (!this.startStylesUpdated && this.isIE )
//    {
//        this.pushStyle(this.gridId + "_back_", "");
//        //#000000
//        //this.pushStyle(this.gridId + "_back_tds", "#" + this.gridId + "XdataArea td.ida, #" + this.gridId + "XdataArea td.rda, #" + this.gridId + "XdataArea td.t { border-color:transparent;/*set an unused color to be index color*/ _border-color:green; /*For IE6-*/ /*then remove this indexed color*/ _filter:chroma(color=green);/*For IE6-*/}");
//        this.pushStyle(this.gridId + "_back_tds", "#" + this.gridId + "XdataArea td.ida, #" + this.gridId + "XdataArea td.rda, #" + this.gridId + "XdataArea td.t { border-color:red; /*then remove this indexed color*/ filter:progid:DXImageTransform.Microsoft.Chroma(color='red');");
//        this.startStylesUpdated = true;
//    }
    
    this.rowHeaderPart = _rowHeaderPart;
    this.columnHeaderPart = _columnHeaderPart;
    this.shouldBeVisible = visible;
    
    var thisObj = this;
    if (this.isIE)
    {
        if (!this.scrollWidth)
        {
            if (!this.scr)
            {
                this.getScrollerWidth();            
            }
            window.setTimeout( function () { thisObj.processGrid(_rowHeaderPart, _columnHeaderPart, visible) }, 2);
            return;
        }        
        
        if (this.hh.offsetWidth == 0 || this.dataArea.offsetWidth == 0 || this.vh.offsetWidth == 0)
        {
            window.setTimeout( function () { thisObj.processGrid(_rowHeaderPart, _columnHeaderPart, visible) }, 2);
            return;
        }
    }
    window.setTimeout( function () { thisObj.adjustGrid() }, 2);
}


DundasGrid.prototype.recalcWidth = function()
{    
    var w1 = this.outerDiv.clientWidth-this.vhOuterDiv.offsetWidth-Math.max(this.vsColumnHeader.offsetWidth,this.vsDataArea.offsetWidth);
    var w2 = this.outerDiv.offsetWidth-Math.max(this.vsColumnHeader.offsetWidth,this.vsDataArea.offsetWidth);
    this.mainDiv.style.width = w2+units;
    
    if (w1>0)
    {    
        this.dataAreaDiv.style.width = (w1-1)+units;
        this.hhOuterDiv.style.width = (w1-1)+units;        
        this.hsDataArea.style.width = w1+units;
    }
}

DundasGrid.prototype.recalcHeight = function()
{
    var t = this.gridDiv.clientHeight; 
    
    if (t == 0)
    {
        t = this.gridDiv.offsetHeight; 
    }
    
    if (this.isIE)
    {
        if (!this.heightSet)
        {            
            t = this.hh.offsetHeight+this.dataArea.offsetHeight+Math.max(this.hsDataArea.offsetHeight,this.hsRowHeader.offsetHeight)+this.titleHeight+window.offsetWM; 
            this.gridDiv.style.height = t+units;
        
        }
        t -= (this.titleHeight+window.offsetWM); 
    }
    else
    {
        if (this.heightSet)
        {
            // if height is not set adding a scrollbar height 
            // to compensate it for FF
            if (!this.removeTitle)
            {
                t -= (this.titleHeight+window.offsetWM); 
                this.removeTitle = true;
            }
        }
        else
        {
            t = this.hh.offsetHeight+this.dataArea.offsetHeight+Math.max(this.hsDataArea.offsetHeight,this.hsRowHeader.offsetHeight)+this.titleHeight+window.offsetWM; 
            this.gridDiv.style.height = t+units;
            t -= (this.titleHeight+window.offsetWM);
            
        }
    }
    
    t+=2;
    
    this.outerDiv.style.height = t+units;
    
    t -= (Math.max(this.hsDataArea.offsetHeight,this.hsRowHeader.offsetHeight)+2);
    
    this.mainDiv.style.height = t+units;
    t -= (this.hhOuterDiv.offsetHeight);
    
    if (t>0)
    {
        this.dataAreaDiv.style.height = t+units;
        this.vhOuterDiv.style.height = t+units;
        this.vsDataArea.style.height = t+units;
    }    
}


DundasGrid.prototype.setFinalSizes = function()
{
    if (this.gw == "")
    {
        this.gridDiv.style.width = this.gridDiv.offsetWidth+units;
    }
    else
    {
        this.gridDiv.style.width=this.gw;    
    }

    this.recalcWidth();
    this.resizeRowHeader();

    this.setHorizontalScroll(this.hsDataArea, this.dataAreaDiv, this.dataArea.offsetWidth);
    
    this.hsDataArea.style.height = this.scrollWidth+units;
    
    this.hsRowHeader.style.height = this.scrollWidth+units;
    
    this.vsDataArea.style.width = this.scrollWidth+units;
    this.vsColumnHeader.style.width = this.scrollWidth+units;
    
    this.recalcHeight();    
    this.resizeColumnHeader();
    
    this.setVerticalScroll(this.vsDataArea,this.dataAreaDiv,this.dataArea.clientHeight);        
    
    this.recalcWidth();
    this.recalcHeight();
        
    this.setHorizontalScroll(this.hsDataArea, this.dataAreaDiv, this.dataArea.offsetWidth);        
    
    if (!this.vsDataArea.offsetWidth && this.vsColumnHeader.offsetWidth)
    {    
        this.vsDataArea.style.overflow="scroll";
        this.vsDataArea.style.display = "block";
    }

    if (!this.hsDataArea.offsetWidth && this.hsRowHeader.offsetWidth)
    {        
        this.hsDataArea.style.display = "block";
        this.hsDataArea.style.overflow="scroll";
    }
}

DundasGrid.prototype.resizeColumnHeader = function()
{
    if (!this.columnHeaderPart)
    {
        return;
    }
    
    var totalHeight = this.mainDiv.offsetHeight;

    // column header control scrollbar
    var columnHeaderHeight = this.hh.offsetHeight;

    var r = this.outerDiv.clientWidth - this.scrollWidth;

    // set sizes of column header scroller.
    
    var elementsHeight = this.dataArea.offsetHeight+this.hh.offsetHeight;
    if (elementsHeight > totalHeight)
    {
        var w1 = elementsHeight-totalHeight;

        if (columnHeaderHeight-w1<totalHeight/100*this.columnHeaderPart)
        {   
            w1 = this.columnHeaderPart/100 * totalHeight;
        }
        else
        {
            w1 = columnHeaderHeight - w1;
        }   
        
        columnHeaderHeight = columnHeaderHeight>w1?w1:columnHeaderHeight;
        
        this.hhOuterDiv.style.height = columnHeaderHeight + units;
                
        // set new width for empty cell and row header.
        this.ed.style.height = columnHeaderHeight + units;

        // set scrolling
        this.hhOuterDiv.style.overflow="hidden";        
    }
    

    this.setVerticalScroll(this.vsColumnHeader,this.hhOuterDiv,this.hh.clientHeight);
    
    var h = columnHeaderHeight;
    
    if (!this.isIE)
    {
        h+=this.titleHeight;
    }
    
    this.vsDataArea.style.top = h+units;
    this.vsColumnHeader.style.left = r+units;     
    this.vsDataArea.style.left = r+units;
    if (!this.isIE)
    {
        this.vsColumnHeader.style.top = this.titleHeight+units;     
    }
    this.ed.style.height = (columnHeaderHeight-2)+units;
}


DundasGrid.prototype.resizeRowHeader = function()
{

    if (!this.rowHeaderPart)
    {
        return;
    }
    
    // row header control scrollbar
    var controlWidth = this.mainDiv.offsetWidth;
    
    
    var totalWidth = this.dataArea.offsetWidth + this.vh.offsetWidth;
        
    if ( totalWidth > controlWidth)
    {
        var w1 = totalWidth-controlWidth;
        
        if (this.rowHeaderWidth-w1 < controlWidth / 100.0 * this.rowHeaderPart)
        {                        
            w1 = this.rowHeaderPart/100 * controlWidth;
        }
        else
        {
            w1 = this.rowHeaderWidth - w1;
        }
        
        this.rowHeaderWidth = this.rowHeaderWidth>w1?w1:this.rowHeaderWidth;
        
        // set new width for empty cell and row header.
    }
    
    this.vhOuterDiv.style.width = this.rowHeaderWidth+units;
    
    var columnHeaderWidth = this.dataAreaDiv.offsetWidth;        
    
    if (this.hh.offsetWidth<columnHeaderWidth)
    {
        columnHeaderWidth = this.hh.offsetWidth;    
    }        

    //this.hhOuterDiv.style.width = columnHeaderWidth + units;    
    
    // set scrolling
    this.vhOuterDiv.style.overflow="hidden";        
    
    // set sizes of row header scroller.
    this.setHorizontalScroll(this.hsRowHeader, this.vhOuterDiv,this.vh.offsetWidth);
    
    // change position of dataArea scrollbar
    this.hsDataArea.style.left = this.hsRowHeader.offsetWidth != 0?0+units:this.vh.offsetWidth+units;        
    this.ed.style.width = this.rowHeaderWidth+units;
}


DundasGrid.prototype.pushStyle = function( styleID, cssBody)
{
    var cssBodyHead = "<style id=\""+styleID + "\" type=\"text/css\">";
    var cssBodyEnd = "</style>";

    var hightStyle = document.getElementById(styleID);
    if ( hightStyle)
    {        
	    if ( DundasChart.msieFlag)
	    {
	        hightStyle.styleSheet.cssText=cssBody;	
	    }
	    else
	    {
	        hightStyle.innerHTML = cssBody;	
	    }
    }
    else
    {                
        ChartCB.pushElement(  cssBodyHead + cssBody + cssBodyEnd, styleID);
    }
}

DundasGrid.prototype.adjustGrid = function()
{
    
    this.startX = 0;
    
    
    this.titleDiv = document.getElementById(this.gridId+"XtitleDiv");
    
    if (this.titleDiv != null)
    {
        this.titleHeight = this.titleDiv.offsetHeight; 
    }
    
    
    this.removeTitle = false;
       
    // get elements
    
    // the structure is : outerdiv includes outerdiv and title div
    // outer div includes vertical and horizontal scrollbar, 
    // main div. main div includes emptycell, horizontal and vertical hearderes
    // and data area
    
    var e = document.getElementById(this.gridId+"XemptyCell");
    this.rowHeaderWidth = this.vh.offsetWidth;
       
    if (!this.isIE)
    {   
        var dataAreaHeight = this.dataArea.rows[0].cells[0].offsetHeight;
        var l = this.dataArea.rows.length-1;
        if (l>0)
        {
            dataAreaHeight = Math.max(dataAreaHeight,this.dataArea.rows[1].cells[0].offsetHeight);
            dataAreaHeight = Math.max(dataAreaHeight,this.dataArea.rows[l].cells[0].offsetHeight);
        }
        
    }
    else
    {   
        var dataAreaHeight = this.dataArea.rows[0].cells[0].clientHeight;
        var l = this.dataArea.rows.length-1;
        if (l>0)
        {
            dataAreaHeight = Math.max(dataAreaHeight,this.dataArea.rows[1].cells[0].clientHeight);
            dataAreaHeight = Math.max(dataAreaHeight,this.dataArea.rows[l].cells[0].clientHeight);
        }
    }
    
    this.dataAreaDiv = document.getElementById(this.gridId+"XdataAreaDiv");    

    this.ghp = this.gridDiv.offsetHeight;
    this.gwp = this.gridDiv.offsetWidth;

    this.gh = this.gridDiv.style.height;

    this.gw = this.gridDiv.style.width;

    this.heightSet = (this.gh != "");

    var sibling = this.gridDiv.nextSibling;

	while( sibling && sibling.nodeType != 1 )
	{
		sibling = sibling.nextSibling;
	}

    var topPadding = 2;
    var bottomPadding = 2;
    
    var infoField = document.getElementById("S_"+this.gridId);

    if (infoField)
    {    
        
        var infoContent = infoField.value;
        
        var infoArray = new Array();
        
        infoArray = infoContent.split(';');
        
        topPadding = parseInt(infoArray[4]);
        bottomPadding = parseInt(infoArray[5]);
//        alert(topPadding);
    }
    
//    
//    if ( sibling.tagName.toLowerCase() == "code")
//    {
//        var padding = sibling.innerHTML;
//        var commaIndex = padding.indexOf(',');
//        topPadding = parseInt(padding.substring(0, commaIndex));
//        bottomPadding = parseInt(padding.substring(commaIndex+1));
//    }
    
	if (!this.isIE)
	{
    	this.scrollWidth = this.getScrollerWidth()+1;
	}
    
    this.dataAreaDiv.style.display = "block";
    
    this.outerDiv.style.textAlign="left";
    this.outerDiv.style.verticalAlign="top";
    
    // calculate sizes
    // remove border 

    var w = this.gridDiv.clientWidth;    
    if (w == 0)
    {
        w = this.gridDiv.offsetWidth;
    }
    this.outerDiv.style.width = w+units;    
    
    this.visibleWidth = this.mainDiv.clientWidth - this.vh.clientWidth;
    this.visibleHeight = this.mainDiv.clientHeight - this.hh.clientHeight;
                       
    var cssStyle = document.getElementById("_"+this.gridId+ "_css_");

    var theStyleSheet = null;
    var ruleCheckStr = "#"+this.gridId;
    for (var i=0; i<document.styleSheets.length; i++)
    {
        var cssRules = document.styleSheets[i].cssRules?document.styleSheets[i].cssRules:document.styleSheets[i].rules;
        if (cssRules[0])
        {
            if (cssRules[0].selectorText.substr(0,ruleCheckStr.length) == ruleCheckStr)
            {
                theStyleSheet = document.styleSheets[i];
                break;
            }
        }
    }
    
    var ruleArray = new Array();
    
    ruleArray.push("td.ida");
    ruleArray.push("td.rda");
    ruleArray.push("td.t");
    ruleArray.push("th.rh");
    ruleArray.push("th.t");
    ruleArray.push("td.c");
    ruleArray.push("th.c");
    
    var rowHeightRule = ruleCheckStr+" "+ruleArray[0];
    
    var l = this.vh.rows[0].cells.length-1;
    
    if (!this.isIE)
    {
        var rowHeaderHeight = this.vh.rows[0].cells[l].offsetHeight;
    }
    else
    {
        var rowHeaderHeight = this.vh.rows[0].cells[l].clientHeight;        
    }
    
    var h2 = Math.max(rowHeaderHeight,dataAreaHeight);
    var hbackup
    if (this.isIE)
    {
        h2 -= (topPadding + bottomPadding);
        hbackup += (topPadding + bottomPadding);
    }
    
    var cssRules = theStyleSheet.cssRules?theStyleSheet.cssRules:theStyleSheet.rules;

    // get cell height for row header and create new rule for control
    var parent = this.gridDiv.parentNode;
    
    parent.removeChild(this.gridDiv);

    
    var cssBody = "";
    var cssBody1 = "";
    for (var i=0;i<ruleArray.length;i++)
    {
        cssBody += "#"+this.gridId +" "+ruleArray[i] + "{ height:"+h2+"px; } \n";
        cssBody1 += "#"+this.gridId +"_o_ "+ruleArray[i] + "{ height:"+h2+"px; } \n";
    }
        
    this.pushStyle( this.gridId+"_back_", cssBody);
    this.pushStyle( this.gridId+"_back_o_", cssBody1);

    
    parent.insertBefore(this.gridDiv,sibling);

    // set scroller sizes
    this.vsDataArea.style.width = this.scrollWidth+units;
    this.vsColumnHeader.style.width = this.scrollWidth+units;
    this.hsDataArea.style.height = this.scrollWidth+units;
    this.hsRowHeader.style.height = this.scrollWidth+units;

    // calculating scroll position and width    
    var r = this.outerDiv.offsetWidth - this.scrollWidth;
        
    this.hsDataArea.style.width = (r-2)+units;
    this.vsDataArea.style.left = r+units;
         
    // align columns for data area and header
    
    this.dataAreaDiv.style.display="block";
    this.cellcoll = this.findLeaves();
    this.alignColumns(0,this.cellcoll.length);
    
    if (this.titleDiv != null)
    {
        this.titleDiv.style.width = this.gw;
    }
    
    this.setFinalSizes();

    this.gridDiv.style.height=this.gh;    
    
    // remove the scrollbar area 
    if (this.scr && this.outerDiv.contains(this.scr))
    {        
        this.outerDiv.removeChild(this.scr);
    }

    if ( this.gridDiv.oldGridElement )
    {
        this.gridDiv.parentNode.removeChild(this.gridDiv);
        if ( this.gridDiv.backupStyle )
        {
            this.gridDiv.style.position = this.gridDiv.backupStyle.position;
            this.gridDiv.style.top = this.gridDiv.backupStyle.top;
            this.gridDiv.style.left = this.gridDiv.backupStyle.left;
        }
        this.gridDiv.oldGridElement.parentNode.replaceChild(this.gridDiv,this.gridDiv.oldGridElement);
    }
    
    this.restoreScrollPositions();

    if (this.isIE)
    {
        this.dataArea.style.borderColor="";
        this.dataArea.style.filter="";
        this.hh.style.borderColor="";
        this.hh.style.filter="";
        this.vh.style.borderColor="";
        this.vh.style.filter="";

    }
    
    // make control visible
    if (this.shouldBeVisible)
    {
        this.gridDiv.style.visibility="visible";  
    }
    
    if ( this.maskDiv )
    {
        ChartCB.hideMaskDiv(null, "_grid_");
    }
    
}

DundasGrid.prototype.setHorizontalScroll = function(scroller, ctrlToScroll, scrWidth)
{        
        
    scroller.style.width = (ctrlToScroll.offsetWidth) +units;
    
    if (scrWidth < parseInt(ctrlToScroll.offsetWidth,10)+1)
    {        
        scroller.style.display = "none";        
    }
    else
    {
        scroller.style.display = "block";
        var innerDiv = scroller.getElementsByTagName("div")[0];
        innerDiv.style.width = scrWidth+units;
    }
    
}

DundasGrid.prototype.setVerticalScroll = function(scroller, ctrlToScroll, scrHeight)
{        
    scroller.style.height = (scrHeight<ctrlToScroll.clientHeight+1?scrHeight:ctrlToScroll.clientHeight+1) +units;
    
    if (scrHeight < ctrlToScroll.offsetHeight+2)
    {
        scroller.style.display = "none";
    }   
    else
    {
        scroller.style.display = "block";
        var innerDiv = scroller.getElementsByTagName("div")[0];    
        innerDiv.style.width = "100%";
        innerDiv.style.height = scrHeight+units;
    }
}

DundasGrid.prototype.alignColumns = function (startPosition,endPosition)
{    
    var len = 0;
    
    var col1 = this.cellcoll;
    var col2 = this.dataArea.rows[0].cells;
      
    var widthcoll = new Array();
    
    for (var i=startPosition;i<endPosition; i++)
    {
        if (!col1[i] || !col2[i])
        {
            continue;
        }

        var c1=col1[i].getElementsByTagName("div")[0];
                
        var c2=col2[i].getElementsByTagName("div")[0];

        var w1 = this.getElementWidth(c1);
        var w2 = this.getElementWidth(c2);
        var width = Math.max(w1,w2);
        widthcoll.push(width);
        
    }
    
    // remove grid from the doc
    
    var sibling = this.gridDiv.nextSibling;
    var parent = this.gridDiv.parentNode;
    
    this.gridDiv.style.display="none";

    var j=0;
    for (var i=startPosition;i<endPosition; i++)
    {                
        if (!col1[i] || !col2[i])
        {
            continue;
        }
        
        var c1=col1[i].getElementsByTagName("div")[0];
        
        if (c1.processed)
        {
            continue;
        } 
        
        var c2=col2[i].getElementsByTagName("div")[0];

        var width = widthcoll[j++];

        c1.style.width = width+units;
        c2.style.width = width+units;
  
        
        c1.processed=true;
        
    }
    
    this.gridDiv.style.display="block";
    
    var scrWidth = parseInt(this.dataArea.offsetWidth);        
    
    this.setHorizontalScroll(this.hsDataArea, this.dataAreaDiv, this.dataArea.offsetWidth);
 
}

DundasGrid.prototype.adjustInnerTableHeight = function(el)
{
    var table = el.getElementsByTagName("table")[0];
    table.style.height = this.getElementHeight(el)+units;
}

DundasGrid.prototype.getPxStyleValue = function(str)
{
    var x=str;
    if (x.indexOf("px")>0)
    {        
        var l = x.length-2;
        x = x.substr(0,l);
    }
    x = parseInt(x,10);
    if (isNaN(x))
    {
        return 0;
    }
    return x;
}

DundasGrid.prototype.getElementWidth = function(element)
{
    if (!this.isIE)
    {
        x = element.clientWidth; 
    }
    else
    {
        x = element.offsetWidth; 
    }
    if (element.style.marginLeft != null)
    {
        x+=this.getPxStyleValue(element.style.marginLeft);                
    }
    if (element.style.marginRight != null)
    {
        x+=this.getPxStyleValue(element.style.marginRight);
        
    }
    if (element.style.borderWidth != null)
    {
        x-=this.getPxStyleValue(element.style.borderWidth);
    }
    else
    {
        if (element.style.borderLeftWidth != null)
        {
            x+=this.getPxStyleValue(element.style.borderLeftWidth);
        }
        if (element.style.borderRightWidth != null)
        {
            x+=this.getPxStyleValue(element.style.borderRightWidth);
        }
    }
    if (element.style.paddingLeft != null)
    {
        x-=this.getPxStyleValue(element.style.paddingLeft);
    }
    
    if (element.style.paddingRight != null)
    {
        x-=this.getPxStyleValue(element.style.paddingRight);
    }       
    return x;
}

DundasGrid.prototype.getElementHeight = function(element)
{
    x = element.offsetHeight;
    if (element.style.marginTop != null)
    {
        x+=this.getPxStyleValue(element.style.marginTop);                
    }
    if (element.style.marginBottom != null)
    {
        x+=this.getPxStyleValue(element.style.marginBottom);
        
    }
    
    if (element.style.borderWidth != null)
    {
        x-=this.getPxStyleValue(element.style.borderWidth);
    }
    else
    {        
        
        if (element.style.borderTopWidth != null)
        {
            x+=this.getPxStyleValue(element.style.borderTopWidth);
        }
        if (element.style.borderBottomWidth != null)
        {
            x+=this.getPxStyleValue(element.style.borderBottomWidth);
        }
    }
    if (element.style.paddingTop != null)
    {
        x-=this.getPxStyleValue(element.style.paddingTop);
    }
    
    if (element.style.paddingBottom != null)
    {
        x-=this.getPxStyleValue(element.style.paddingBottom);
    }        
    return x;
}



DundasGrid.prototype.getScrollerWidth = function() 
{
	if (this.isIE)
	{
		this.getScrollerWidthIE();
	}
	else
	{
		return this.getScrollerWidthFF();	
	}
	
}
DundasGrid.prototype.getScrollerWidthFF = function() 
{
    var scr = null;
    var inn = null;
    var wNoScroll = 0;
    var wScroll = 0;

    // Outer scrolling div
    scr = document.createElement('div');
    scr.style.position = 'absolute';
    scr.style.top = '-1000px';
    scr.style.left = '-1000px';
    scr.style.width = '50px';
    scr.style.height = '100px';
    // Start with no scrollbar
    scr.style.overflow = 'hidden';

    // Inner content div
    inn = document.createElement('div');
    inn.style.width = '100%';
    inn.style.height = '200px';

    // Put the inner div in the scrolling div
    scr.appendChild(inn);
    // Append the scrolling div to the doc
    document.body.appendChild(scr);

    // Width of the inner div sans scrollbar
    wNoScroll = inn.offsetWidth;
    // Add the scrollbar
    scr.style.overflow = 'auto';
    // Width of the inner div width scrollbar
    wScroll = inn.offsetWidth;

    // Remove the scrolling div from the doc
    document.body.removeChild(
        document.body.lastChild);
          
    // Pixel width of the scroller
    return (wNoScroll - wScroll);
}

DundasGrid.prototype.getScrollerWidthIE = function() 
{
    this.scr = null;
    var inn = null;
    this.wNoScroll = 0;
    var wScroll = 0;

    // Outer scrolling div
    this.scr = document.createElement('textarea');
    this.scr.cols="20";
    this.scr.rows="2";
    this.scr.style.position = 'absolute';
    this.scr.style.top = '0px';
    this.scr.style.left = '0px';
    this.outerDiv.appendChild(this.scr);
    var thisObj = this;
    window.setTimeout( function() { thisObj.setScrollWidth();} ,2);
}


DundasGrid.prototype.setScrollWidth = function ()
{
    // Remove the scrolling div from the doc
    //this.scrollWidth = document.body.lastChild.offsetWidth-document.body.lastChild.clientWidth;
    
    if (!this.scr.offsetWidth)
    {        
        var thisObj = this;
        window.setTimeout( function() { thisObj.setScrollWidth();} ,2);
        return;
    }
    
    this.scr.wrap="off";
    var w1 = this.scr.offsetHeight;
    this.scr.wrap="soft";
    w1 -= this.scr.offsetHeight;    
    this.scrollWidth = w1;    
    this.outerDiv.removeChild(this.scr);
    this.scrollWidth++;
    
    
}

function dump(dumpInfo)
{

    ChartCB.debugOut(dumpInfo);
    
    var debug_div = document.getElementById("debug_div");
    
    if (null == debug_div)
    {
        return;
    }
    
    var date = new Date();
    var outStr = "";
    outStr = date.getHours()+":"+date.getMinutes()+":"+date.getSeconds()+"."+date.getMilliseconds();
    
    var p = debug_div.getElementsByTagName("p")[0];
    p.innerHTML = p.innerHTML+outStr+"->"+dumpInfo+"<br/>";
}

function clearDump()
{
    var debug_div = document.getElementById("debug_div");
    
    if (null == debug_div)
    {
        return;
    }
    
    var p = debug_div.getElementsByTagName("p")[0];
    p.innerHTML = "";
}
