/* QwwJs_FlexiGridCtlMgr
 * 
 * Part of the QlikWeb WorkBench Javascript Library (http://www.qlikwebworkbench.com)
 *
 * Copyright (c) 2007 Industrial CodeBox Ltd. All Rights Reserved.
 * http://www.industrialcodebox.com
 * Email support@industrialcodebox.com for licensing and support information.
 */
function QwwJs_FlexiGridCtlMgr(cfgObj)
{
    this.Cfg = cfgObj;
    
    // -------------------------------------------------------------
    // Start of setting up defaults
//    if(!this.Cfg.SourceQlikViewObjectType)
//        this.Cfg.SourceQlikViewObjectType = "TableBox"; // Obsolete - always bound to a table
    
    if(!this.Cfg.NumberOfColumns)
        this.Cfg.NumberOfColumns = 1;

    if(!this.Cfg.TableSelectColumn)
        this.Cfg.TableSelectColumn = 0;
    
    if(!this.Cfg.NumberOfRows)
        this.Cfg.NumberOfRows =  100;
        
    if(!this.Cfg.Theme)
        this.Cfg.Theme = "Default";
                    
    // End of setting up defaults
    // -------------------------------------------------------------
            
    var tblMgrCfg = {};
    tblMgrCfg.ObjectID = this.Cfg.ObjectID;
    tblMgrCfg.ColumnIndexes = this.Cfg.ColumnIndexes;
    tblMgrCfg.PageSize = (this.Cfg.NumberOfRows*1) * (this.Cfg.NumberOfColumns*1);
    
    this.Cfg.MaxNumberOfProductsToShow = tblMgrCfg.PageSize;
    
    this.TableMgr = new QwwJs_TableMgr(tblMgrCfg);
                    
    this.SelectSingleRecord = function(val)
    {
        this.TableMgr.SelectSingleRecord(val, this.Cfg.TableSelectColumn);
    };

    this.PageDown = function()
    {
        this.TableMgr.PageDown();
    };
    
    this.PageUp = function()
    {
        this.TableMgr.PageUp();
    };
    
    this.SetPage = function(page)
    {
        this.TableMgr.SetPage(page);
    };
    
    this.renderPagingDefault = function(numberOfPages, pageSize, currentPage, pageUpMethod, pageDownMethod, setPageUpMethod)
    {     
        if(this.Cfg.JavascriptVariableName)
        {
            var id = this.Cfg.JavascriptVariableName;

            var fistPage = "<a class='QwwJs_FlexiGridCtl-PagingLink' style='cursor:pointer' alt='First Page' onclick='" + setPageUpMethod + "(1);'>|</a>";   
            var pageUp = "<a class='QwwJs_FlexiGridCtl-PagingLink' style='cursor:pointer' alt='Page Up' onclick='" + pageUpMethod + "();'>&gt;&gt;</a>";               
            var pageDown = "<a class='QwwJs_FlexiGridCtl-PagingLink' style='cursor:pointer' alt='Page Down' onclick='" + pageDownMethod + "();'>&lt;&lt;</a>";   
            var lastPage = "<a class='QwwJs_FlexiGridCtl-PagingLink' style='cursor:pointer' alt='First Page' onclick='" + setPageUpMethod + "(" + this.TableMgr.NoPages + ");'>|</a>";   
            
            return "<span class='QwwJs_FlexiGridCtl-Paging'>Displaying Page " + currentPage + " Of " + numberOfPages + "&nbsp;-&nbsp;"  
                    + fistPage + " " + pageDown + " " + pageUp + " " + lastPage + "</span>";
        }
        else{        
            return "Please Set JavascriptVariableName when creating QwwJs_FlexiGridCtlMgr instance.";
        }
    };
    
    this.renderSummaryDefault = function(numberOfResults, totalNumberOfResults)
    {
        return "<span class='QwwJs_FlexiGridCtl-Summary'>Showing " + numberOfResults + " out of " + totalNumberOfResults + "</summary>";
    };
    
    this.updatePaging = function()
    {
        if(cfgObj.ElementToShowPagingIn && this.renderPagingDefault)
        {
            var numberOfPages = this.TableMgr.InitialNoPages;
            var pageSize = this.TableMgr.PageSize;
            var currentPage = this.TableMgr.CurrentPage;
            
            var html;
            
            var id = this.Cfg.JavascriptVariableName;
            var pageUpMethod = id + ".PageUp";
            var pageDownMethod = id + ".PageDown";
            var setPageUpMethod = id + ".SetPage";
            
            if(this.Cfg.OnRenderPaging)
            {
                html = this.Cfg.OnRenderPaging(numberOfPages, pageSize, currentPage, pageUpMethod, pageDownMethod, setPageUpMethod);
            }
            else
            {
                html = this.renderPagingDefault(numberOfPages, pageSize, currentPage, pageUpMethod, pageDownMethod, setPageUpMethod);
            }
            
            $(QwwJs.EnsureIdHasHash(cfgObj.ElementToShowPagingIn)).html(html);    
        }
    };
    
    this.updateSummary = function()
    {
        if(this.Cfg.ElementToShowResultsSummaryIn)
        {
            var html = "";
            
            if(this.Cfg.OnRenderSummary)
            {
                html = this.Cfg.OnRenderSummary(this.TableMgr.NoRows, this.TableMgr.InitialTotalSize);
            }
            else
            {  
                html = this.renderSummaryDefault(this.TableMgr.NoRows, this.TableMgr.InitialTotalSize);
            }
            
            $(QwwJs.EnsureIdHasHash(cfgObj.ElementToShowResultsSummaryIn)).html(html);    
        }    
    };


    this.createClass = function(item)
    {
        return "class='QwwJs_FlexiGridCtl-" + item + "-" + this.Cfg.Theme + "'";
    };

    this.createCell = function(contents, isSingleCell, isEmptyCell)
    {        
        var className = "";
    
        if(isEmptyCell == true)
        {
            var className = "ResultCellEmpty";
        }
        else
        {
            var className = (isSingleCell == true) ? "ResultCellSingle" : "ResultCell";
        }
        
        return "<td " + this.createClass(className) + ">" + contents + "</td>";        
    };
    
    this.renderRecord = function(record)
    {   
        try
        {     
            var selectMethod = this.Cfg.JavascriptVariableName + ".SelectSingleRecord";

            if(this.Cfg.OnRenderRecord){
                return this.Cfg.OnRenderRecord(record, selectMethod);
            }
            else{
                return "No OnRenderRecord specified.";
            }
        }
        catch(e)
        {
            alert(QwwJs.Alert("QwwJs_FlexiGridCtlMgr.renderRecord:" + e.message));
        }
    };
    
    this.renderSingleRecord = function(record)
    {
        try
        {
            var selectMethod = this.Cfg.JavascriptVariableName + ".SelectSingleRecord";
                    
            if(this.Cfg.OnRenderSingleRecord){
                return this.Cfg.OnRenderSingleRecord(record, selectMethod);
            }
            else if(this.Cfg.OnRenderRecord){
                return this.Cfg.OnRenderRecord(record, selectMethod);
            }        
            else{
                return "No OnRenderSingleRecord or OnRenderRecord specified.";
            }
        }
        catch(e)
        {
            alert(QwwJs.Alert("QwwJs_FlexiGridCtlMgr.renderSingleRecord:" + e.message));
        }

    };
    
    this.buildTable = function()
    {
        //
        // Build style
        //
        //var style = "style='text-align:center;";
        var style = "style='";
        //if(this.Cfg.Width) style += "width:" + this.Cfg.Width + ";";
        //if(this.Cfg.Width) style += "width:96%;";
        //if(this.Cfg.Height) style += "height:" + this.Cfg.Height + ";";
        style += "'";
        
        //var tbl = "<table " + this.createClass("Table") + " border='0' cellpadding='0' " + style + " cellspacing='0'>";
        var tbl = "<table " + this.createClass("Table") + " cellpadding='0' " + style + " cellspacing='0'>";

        var ids = new Array();

        var currentProduct = 0;
                
        if(this.Cfg.OnRenderBegin)
            this.Cfg.OnRenderBegin();

        if(this.TableMgr.NoRows == 1)
        {
            var singleRow = this.TableMgr.GetRow(0);
            
            var contents = "resultRenderer == null";

            contents = this.renderSingleRecord(singleRow)
            
            tbl += "<tr>" + this.createCell(contents, true) + "</tr>";                
        }
        else
        {   
            for(var i = 0; i < this.TableMgr.NoRows; i++)
            {                                               
                tbl += "<tr>";     
                    
                for(c = 0; c < this.Cfg.NumberOfColumns; c++)
                {
                    if( (currentProduct < this.TableMgr.NoRows) &&
                        (currentProduct <= this.Cfg.MaxNumberOfProductsToShow) )
                    {
                        var resultRow = this.TableMgr.GetRow(currentProduct);
                        
                        while(resultRow.IsHeader)
                        {
                            currentProduct++;
                            resultRow = this.TableMgr.GetRow(currentProduct);
                        }
                        
                        if(currentProduct > this.Cfg.MaxNumberOfProductsToShow)
                        {
                            tbl += this.createCell("&nbsp;");
                        }
                        else
                        {
                            var contents = "resultRenderer == null";
                            
                            contents = this.renderRecord(resultRow)
                                            
                            tbl += this.createCell(contents);
                        }
                        
                        currentProduct++

                    }
                    else
                    {
                        tbl += this.createCell("&nbsp;", false, true);
                    }
                }
                
                tbl += "</tr>";
                
                if(currentProduct >= this.TableMgr.NoRows - 1 ||
                    currentProduct > this.Cfg.MaxNumberOfProductsToShow)
                {
                    break;
                }            
            }
        }

        tbl += "</table>";

        //var divStyle = "style='overflow:auto;text-align:center;vertical-align:top;";
        var divStyle = "style='";
        if(this.Cfg.Width) divStyle += "width:" + this.Cfg.Width + ";";
        if(this.Cfg.Height) divStyle += "height:" + this.Cfg.Height + ";";
        divStyle += "'";
        
        var ctl = "<div " + this.createClass("TableDiv") + " " + divStyle + ">" + tbl + "</div>";
        
        $(QwwJs.EnsureIdHasHash(cfgObj.ElementToShowResultsIn)).html(ctl);
        
        var elem = document.getElementById(cfgObj.ElementToShowResultsIn);
                
        if(this.Cfg.OnRenderComplete)
            this.Cfg.OnRenderComplete();
    };
          
    function updateTable(args)
    {
        args.buildTable();
        args.updatePaging();
        args.updateSummary();
    };
    
    this.TableMgr.RegisterUpdatedCallBack(updateTable, this);

//    if(qwwHub)
//        qwwHub.AddObjectToCallOnAvqUpdateComplete(this);
};