﻿
var __preContainerWidth = 0;
var __curContainerWidth = 0;
var __curContainerHeight = 0;
var __preContainerHeight = 0;

function __getContentHolder() {
    return document.getElementById('ksDynamicContent');
}

function __getElementPosition(element) {
    var left = 0;
    var top = 0;
    try{
        if (element.offsetParent) {
            while (element) {
                left += element.offsetLeft;
                top += element.offsetTop;
                element = element.offsetParent;
            }
        }
    }catch(e){}
    
    return { offsetLeft: left, offsetTop: top };
}

function RenderInitialGrid(gridName)
{
    var grid = eval('GetGrid_' + gridName + '();');
    if (!grid) return;
    if (!__IsElementVisible(grid.element)) return;
    if (!grid.OuterFrameDomObj || !grid.FrameDomObj){
        window.setTimeout('RenderInitialGrid(\'' + grid.__ShortName + '\');', 300); 
        return;
    } 
    
    RenderWithDynamicPageSize(grid, false); 
    eval('RenderWithAdjustColSize_' + grid.__ShortName + '(false);');
}

function RenderWithDynamicPageSize(grid, forceRender) {
    if (!grid) return;

    if (!grid.OuterFrameDomObj) {
        window.setTimeout('try{ RenderWithDynamicPageSize(GetGrid_' + grid.__ShortName + '(),' + (forceRender ? 'true' : 'false') + '); }catch(e){ }', 1000);
        return;
    }

    if (!grid.__FillScreen) return;
    if (!grid.get_allowPaging()) return;
    if (!__IsElementVisible(grid.element)) return;     

    __preContainerHeight = __curContainerHeight;
    __preContainerWidth = __curContainerWidth;

    var winHeight = 0;
    var contentHolder = __getContentHolder();
    
    if (grid.__FillScreen) {
        if (document.all) {
            __curContainerHeight = winHeight = document.documentElement.clientHeight;
            __curContainerWidth = winWidth = document.documentElement.clientWidth;
        } else {
            __curContainerHeight = winHeight = window.innerHeight;
            __curContainerWidth = winWidth = window.innerWidth;
        }
    } else {
        __curContainerHeight = contentHolder.offsetHeight;
    }

    if (forceRender || 
            (__curContainerHeight - __preContainerHeight) > 10 ||
                (__preContainerHeight - __curContainerHeight) > 10) {

        var pos = __getElementPosition(grid.OuterFrameDomObj);

        var remainingHeight = grid.__FillScreen ? winHeight - pos.offsetTop : contentHolder.offsetHeight - grid.OuterFrameDomObj.offsetTop;
        var rowHeight = 28;
        var minPageSize = 5;
        var curPageSize;
        var minGridHeight = minPageSize * rowHeight;

        if (remainingHeight > minGridHeight) {
            curPageSize = Math.floor(remainingHeight / rowHeight);
        } else {
            curPageSize = minPageSize;
        }
        
        try{
            grid.editCancel();
            grid.PageSize = curPageSize;
            grid.PageCount = Math.ceil(grid.RecordCount / grid.PageSize);
            if(grid.FrameDomObj)
                grid.FrameDomObj.style.height = '0px';
            else
                grid.OuterFrameDomObj.style.height = '0px';
            grid.__forceAdjustDone = forceRender;
            window.setTimeout('__renderGridWithAdjustedScrollbar(GetGrid_' + grid.__ShortName + '());', 100);
        }catch(e){}
    }
}

function __NeedDynamicResize(){
    var curHeight;
    if (document.all) {
        curHeight = document.documentElement.clientHeight;
    } else {
        curHeight = window.innerHeight;
    }

    return (curHeight - __preContainerHeight) > 10 ||
                (__preContainerHeight - curHeight) > 10;
}

function __renderGridWithAdjustedScrollbar(grid) {
    var gridFrameDomObj = grid.FrameDomObj;
    var scrollDomObj = grid.ScrollDomObj;
    var outerFrameDomObj = grid.OuterFrameDomObj;
    if (scrollDomObj) {        
        scrollDomObj.parentNode.removeChild(scrollDomObj);
        grid.__origGridRenderFunc();
        __delayGridRender(grid.__ShortName);
        
        var outerFrameDomObj = grid.OuterFrameDomObj;
        var parentNodeWidth = __getParentNodeWidth(grid, __getContentHolder());    
        var gridNodeWidth = outerFrameDomObj.offsetWidth;

        if ((parentNodeWidth - gridNodeWidth) > 15) {
            eval('RenderWithAdjustColSize_' + grid.__ShortName + '(false);');
        }
    } else {
        __delayGridRender(grid.__ShortName);
    }
}

function __delayGridRender(gridShortName){
    var grid = eval('GetGrid_' + gridShortName + '();');
    grid.render();
}

function __adjustDynamicColWidth(grid, contentHolder, scrollBarAdjust) {
    if (!grid || !grid.OuterFrameDomObj) return;
    if (!__IsElementVisible(grid.element)) return;     

    var pos = null;
    var outerFrameDomObjPos = null;
    var outerFrameDomObj = grid.OuterFrameDomObj;

    if (contentHolder == null)
        contentHolder = outerFrameDomObj.parentNode;

    var gridTable = grid.get_table();
    var gridCols = gridTable.get_columns();
    var adjustCol = grid.get_allowEditing() ? gridCols[gridCols.length - 2] : gridCols[gridCols.length - 1];
    var parentNodeWidth = __getParentNodeWidth(grid, contentHolder);
    var gridNodeWidth = outerFrameDomObj.offsetWidth;

    if (gridNodeWidth <= 20)
        adjustCol.set_width(0);
    else {
        var adjWidth;
        if (adjustCol) {        
            var curWidth = adjustCol.get_width();
            adjWidth = parentNodeWidth - gridNodeWidth;
            var newWidth = curWidth + adjWidth - (scrollBarAdjust ? 16 : 0);
            if (newWidth >= 0)
                adjustCol.set_width(newWidth);
            else
                adjustCol.set_width(0);                
        }
    }
}

function __getParentNodeWidth(grid, contentHolder) {
    if (!grid || !grid.OuterFrameDomObj) return;
    if (contentHolder == null) return;
    if (!__IsElementVisible(grid.element)) return;     

    var outerFrameDomObj = grid.OuterFrameDomObj;
    var pos = __getElementPosition(contentHolder);
    var outerFrameDomObjPos = __getElementPosition(outerFrameDomObj.parentNode);
    var parentNodeWidth = contentHolder.offsetWidth - (outerFrameDomObjPos.offsetLeft - pos.offsetLeft);    
    return parentNodeWidth;
}

/********************************************

********************************************/

function ColumnProperty(columnName, metaDataLength, width, percentage) {
    this.ColumnName = columnName;
    this.MetadataLength = metaDataLength;
    this.Percentage = percentage;
    this.Width = width;
    this.Formatter = null;
    this.IsCurrency = this.IsPercentageFormat = this.IsFloat = this.IsInt = false;
    this.HasExpressionTemplate = false;
    this.HasTotalRowExpressionTemplate = false;
    this.TotalRowExpression = '';
}

function __setColumnProperty(grid) {
    var totalMetadataLength = 0;
    var totalFixedColWidth = 0;
    var gridTable = grid.get_table();
    var gridCols = gridTable.get_columns();
    var colLength = gridTable.ColumnDisplayOrder.length;
    var adjustColIndex = grid.get_allowEditing() ? colLength - 2 : colLength - 1;
    var columnPropArray = grid.__columnProperties;

    var colWithMetadata = [];
    var colWithFixedWidth = [];
    var colWithPercentageWidth = [];
    var colWithUnknownWidth = [];
    
    for (var i = 0; i < columnPropArray.length; i++) {
        var curCol = __getColumn(grid, columnPropArray[i].ColumnName);
        if (curCol) {
            if (columnPropArray[i].Width > 0) {
                totalFixedColWidth += columnPropArray[i].Width;
                colWithFixedWidth.push(curCol);
            } else if (columnPropArray[i].Percentage > 0) {
                colWithPercentageWidth.push(curCol);                
            } else {
                if (columnPropArray[i].MetadataLength > 0) {
                    totalMetadataLength += columnPropArray[i].MetadataLength;
                    colWithMetadata.push(curCol);
                } else {
                    colWithUnknownWidth.push(curCol);
                }
            }
            curCol.__columnProperty = columnPropArray[i];
        }
    }

    grid.__colWithMetadata = colWithMetadata;
    grid.__colWithFixedWidth = colWithFixedWidth;
    grid.__colWithPercentageWidth = colWithPercentageWidth;
    grid.__colWithUnknownWidth = colWithUnknownWidth;
    grid.__totalMetadataLength = totalMetadataLength;
    grid.__totalFixedColWidth = totalFixedColWidth;
}

function __setPercentageColWidth(grid){
    if (!__IsElementVisible(grid.element)) return;
    var outerFrameDomObj = grid.OuterFrameDomObj;
    
    if(!outerFrameDomObj){
        window.setTimeout('__setPercentageColWidth(GetGrid_' + grid.__ShortName + '());', 250);
        grid.render();
        return;
    }
    
    var parentNodeWidth = __getParentNodeWidth(grid, __getContentHolder());      
    var gridNodeWidth = outerFrameDomObj.offsetWidth;
    var adjWidth;

    var availWidth = parentNodeWidth - grid.__totalFixedColWidth - (grid.PageCount > 1 ? 28 : 0);
    if (availWidth > 0) {
        for (var i = 0; i < grid.__colWithPercentageWidth.length; i++) {
            var curCol = grid.__colWithPercentageWidth[i];
            var adjWidth = parseInt(availWidth * (curCol.__columnProperty.Percentage / 100));    
            curCol.Width = adjWidth; 
            grid.SetColumnWidth(grid.Levels[0], curCol.ColumnIndex, adjWidth, false);
        }
        grid.render();
    }
}

function __reSetPercentageColWidth(grid){
    __setPercentageColWidth(grid);
    RenderWithDynamicPageSize(grid, true);
    eval('RenderWithAdjustColSize_' + grid.__ShortName + '(false);');
}

function __getColumn(grid, columnName) {
    var gridTable = grid.get_table();
    var gridCols = gridTable.get_columns();
    var colLength = gridTable.ColumnDisplayOrder.length;

    for (var i = 0; i < colLength; i++) {
        var colIndex = gridTable.ColumnDisplayOrder[i];
        var curCol = gridCols[colIndex];
        curCol.ColumnIndex = colIndex;
        var dataField = curCol.get_dataField();

        if (dataField == columnName)
            return curCol;
    }
}

function __IsElementVisible(element){
//    var parentElement = element;
//    var notVisible = false;
//    while (parentElement && parentElement.id != 'ksDynamicContent' && parentElement != document.body){
//        if(parentElement.style && parentElement.style.display == 'none')
//            notVisible = true;
//        parentElement = parentElement.parentNode;        
//    }
//    return !notVisible;

    return true;
}


