﻿// WinSaaS (http://www.winsaas.com) and HotelASP (http://www.hotelasp.com). Licensing apply to this source code. Please read and comply with source license available at site.
// Copyright (C) 2009 by Miguel Angelo Canaria Ribeiro (miguel.ribeiro@netcabo.pt). All rights reserved.
function GridManager(view) 
{
    this.view = view;
    this.grids = new Array();      
}

GridManager.prototype.AddGrid = function (id, controlID, keyID, 
        rowCss, rowAltCss, selectedRowCss, cellCss, rowStyleText, rowAltStyleText, selectedRowStyleText, cellStyleText, 
        serverGridUrl, controlViewID, controlViewUniqueID, regionID, configPath)
{
    this.grids[this.grids.length] = new Grid(id, controlID, keyID, 
    rowCss, rowAltCss, selectedRowCss, cellCss, rowStyleText, rowAltStyleText, selectedRowStyleText, cellStyleText,
    serverGridUrl, controlViewID, controlViewUniqueID, regionID, configPath, this);
}

GridManager.prototype.GetGrid = function (gridID)
{ 
    for(var i = 0; i < this.grids.length; i++)
	{
	    var grid = this.grids[i];
	    if (grid.id == gridID)
	    {
	        return grid
	    }
    }    
    return null;
}

function Grid(id, controlID, keyID, 
        rowCss, rowAltCss, selectedRowCss, cellCss, rowStyleText, rowAltStyleText, selectedRowStyleText, cellStyleText,
        serverGridUrl, controlViewID, controlViewUniqueID, regionID, configPath, gridManager) 
{
    this.id = id;
    this.controlID = controlID;
    this.gridManager = gridManager;
    this.regionID = regionID;
    this.configPath = decodeURIComponent(configPath);
    
    this.rawRows = null;
    this.rows = new Array();
    this.keyID = keyID;
    this.selectedRowKeyValue = null;
    this.selectedRowIndex = -1;
    this.selectedRowElement = null;
        
    this.oldSelectedRowStyleText = null;
    this.oldSelectedRowCss = null;

    this.rowCss = rowCss;
    this.rowAltCss = rowAltCss;
    this.selectedRowCss = selectedRowCss;
    this.cellCss = cellCss;

    this.cellStyleBase = "white-space: nowrap;overflow:hidden;";
    this.cellStyleText = decodeURIComponent(cellStyleText);
    this.cellStyleText = this.cellStyleText.replace(/\*/gi, '\'');

    this.rowStyleText = decodeURIComponent(rowStyleText);
    this.rowStyleText = this.rowStyleText.replace(/\*/gi, '\'');
    
    this.rowAltStyleText = decodeURIComponent(rowAltStyleText);
    this.rowAltStyleText = this.rowAltStyleText.replace(/\*/gi, '\'');
    
    this.selectedRowStyleText = decodeURIComponent(selectedRowStyleText);
    this.selectedRowStyleText = this.selectedRowStyleText.replace(/\*/gi, '\'');
        
    this.moveGridColsCellName = null;
    this.moveGridColsPlaceHolderId = null;    
    
    this.pagerOldID = null;
    this.pagerNewID = null;
    
    this.serverGridUrl = serverGridUrl;
    this.controlViewID = controlViewID;
    this.controlViewUniqueID = controlViewUniqueID;
    
    this.serverPath = this.serverGridUrl + "&WorkAreaViewID=" + this.controlViewID + "&_TGC=" + this.controlID + "&_TGV=" + this.controlViewUniqueID + "&_TGR=" + this.regionID;   
    
    this.pagerIndex = 0;
    this.sortExpression = null;
    this.sortDirection = null;    
}

function GRow(rowIndex, grid) 
{
    this.rowIndex = rowIndex; 
    this.cells = null; 
    this.grid = grid;
}

GRow.prototype.GetCell = function (id)
{
	for(var i=0;i < this.cells.length;i++)
	{
		if (this.cells[i].id == id)
		{
		    return this.cells[i];
		}
	}
	return null;
}

function GCell(columnID, value, row) 
{
    this.columnID = columnID; 
    this.value = value;
    this.row = row;
    
    this.id = "_" + this.row.grid.gridManager.view.id.toUpperCase() + "_" + this.row.grid.regionID.toUpperCase() + "_" + this.columnID.toUpperCase(); 
}

Grid.prototype.Pager = function (index)
{
    this.pagerIndex = index;

    var url = this.serverPath;    
    url = url + "&_GP=" + index;
       
    if (this.sortExpression != null)
    {
        url = url + "&_GSE=" + this.sortExpression;
    }

    if (this.sortDirection != null)
    {
        url = url + "&_GSD=" + this.sortDirection;
    }

    if (this.configPath != "")
    {
        url = url + "&ConfigPath=" + this.configPath;
    }
                
    this.Execute(this.controlID, this.controlID, url, "");
}

Grid.prototype.Sort = function (sortExpr, sortDir)
{
    this.sortExpression = sortExpr;
    this.sortDirection = sortDir;
    
    var url = this.serverPath;
    url = url + "&_GSE=" + sortExpr + "&_GSD=" + sortDir;    
    url = url + "&_GP=" + this.pagerIndex;
    
    if (this.configPath != "")
    {
        url = url + "&ConfigPath=" + this.configPath;
    }
    
    this.Execute(this.controlID, this.controlID, url, "");
}

Grid.prototype.Execute = function (sourceObjectID, targetObjectID, targetServer, formData)
{
    if (targetServer == "") targetServer = _$ServiceServerURL
    if (targetObjectID == "") targetObjectID = this.gridManager.view.messageID;
	this.ServerRequest(sourceObjectID, targetObjectID, targetServer, formData);
}

Grid.prototype.ServerRequest = function (sourceObjectID, targetObjectID, targetServerURL, formData)
{
	this.gridManager.view.CreateWaitMessage(1, sourceObjectID, targetObjectID);
	if (this.waitMessage!=null)
	{
		this.gridManager.view.waitMessage.style.visibility = 'visible';
	}
		
	var callBackData = targetObjectID + ";" + targetServerURL + ";" + formData;
	var callBack =
	{
		success: this.ServerResponse,
		failure: this.gridManager.view.ServerResponseException,
		argument: callBackData,
		scope: this
	}
    
    
    YAHOO.util.Connect.setForm(this.gridManager.view.defaultFormID, false); 
    var callBackObject = YAHOO.util.Connect.asyncRequest('POST', targetServerURL, callBack, null);
	
	var actualDate = new Date();
	this.gridManager.view.startTime = actualDate.getTime();
	this.gridManager.view.waitMessageRefresh = window.setInterval(this.gridManager.view.RefreshWaitMessage.bind(this.gridManager.view), 100);
	
}

Grid.prototype.ServerResponse = function (response)
{
	var tld = response.tld;
	var status = response.status;
	var statusText = response.statusText;
	var allResponseHeaders = response.allResponseHeaders;
	var responseText = response.responseText;
	var responseXML = response.responseXML;
	if (responseText!=null)
	{
		window.status = "Transferred " + responseText.length + " Bytes";
	}

	try
	{
		var callBackData = response.argument.split(";");
		var targetObjectID = callBackData[0];
		var targetServerURL = callBackData[1];
		var specificRequestFormData = callBackData[2];		
		var targetObject = document.getElementById(targetObjectID);
        this.Render(targetObject, responseText);            
	}
	catch (e)
	{
		alert ("Error '" + e.message + "' in Grid ServerResponse");
		CloseBatchWaitMessage()
	}	
	this.gridManager.view.ClearWaitMessage();
}

Grid.prototype.Render = function (targetObject, responseText)
{
    var gridResponse = responseText.split("$#-#$");	    
    var freezePager = gridResponse[0];
    var freezeColumns = gridResponse[1];	    
	var gridID = targetObject.id;    
    this.rawRows = gridResponse[2];	    
    
	targetObject.innerHTML = gridResponse[3];
		
	if (freezePager == "true")
	{
	    this.InitPager();
    }	    
    if (freezeColumns == "true")
	{
        this.InitMoveGridCols();	    
    }	    
    
    this.InitializeLayout();
}

Grid.prototype.InitializeLayout = function ()
{
	try
	{
		this.InitializeRowLayout("tbody");
        this.LoadRows();

        if (this.selectedRowKeyValue != null)
        {   
            var rowElem = this.GetRowElementByID("r" + this.selectedRowKeyValue);
            if (rowElem!=null)
            {
                this.SelectRow(-1, rowElem);
            }
        }
	}
	catch (e)
	{
		alert ("Error in Initialize Layout. " + e.message);
	}
}

Grid.prototype.InitializeRowLayout = function (tableSection)
{     
    var gridTable = document.getElementById(tableSection + "_" + this.controlID);
    if (gridTable == null) return;
    
    var cellToken;
    if (tableSection == "thead")
    {
        cellToken = "TH";
    }
    else
    {
        cellToken = "TD";
    }
    
    var rows = gridTable.childNodes;
    for(var r = 0; r < rows.length; r++)
    {
        if (rows[r].nodeName == "TR")
        {
            var cells = rows[r].childNodes;
            for(var c = 0; c < cells.length; c++)
            {
                if (cells[c].nodeName == cellToken)
                {
                    cells[c].noWrap = true;
                    
                    if ((cells[c].className=="") && (this.cellCss!=""))
                    {
                        cells[c].className = this.cellCss;
                    }
                    
                    var style = this.cellStyleBase;                    
                    if (this.cellStyleText!="")
                    {
                        style = style + this.cellStyleText;
                    }

                    cells[c].style.cssText = style + cells[c].style.cssText;
                    
                    if (cells[c].childNodes.length > 0)
                    {
                        var node = cells[c].childNodes[0];
                        if (node.nodeName == "A")
                        {
                            node.style.cssText = this.cellStyleBase + node.style.cssText;
                        }
                    }
                }
            }
        }
    }
}

Grid.prototype.GetRowElementByID = function (id)
{     
    var gridTable = document.getElementById("tbody_" + this.controlID);
    var rows = gridTable.childNodes;
    for(var r = 0; r < rows.length; r++)
    {
        if (rows[r].nodeName == "TR")
        {
            if (rows[r].id == id)
            {
                return rows[r];                                
            } 
        }
    }
    return null;
}

Grid.prototype.SelectRow = function (rowIndex, tableRow)
{        
    var rows = tableRow.parentNode.childNodes;
    var alternate = false;        
    if (rowIndex != -1)
    {
        if (rowIndex != this.selectedRowIndex)
        {   
            
            if (this.selectedRowElement!=null)
            {
                this.selectedRowElement.style.cssText = this.oldSelectedRowStyleText;
                this.selectedRowElement.className = this.oldSelectedRowCss;
            }
            
            if (this.selectedRowStyleText!="")
            {
                this.oldSelectedRowStyleText = tableRow.style.cssText;
                tableRow.style.cssText = this.selectedRowStyleText;                    
            }
                
            if (this.selectedRowCss!="")
            {
                this.oldSelectedRowCss = tableRow.className;
                tableRow.className = this.selectedRowCss;
            }
            
            var selectedRow = this.GetRow(rowIndex);
	        if (selectedRow!=null)
	        {
	            var cell = selectedRow.GetCell(this.keyID);
	            if (cell!=null)
	            {
	                this.selectedRowKeyValue = cell.value;
	            }
	        }    
        			
            this.selectedRowIndex = rowIndex;
            this.selectedRowElement = tableRow;
        }
        else
        {
            if (this.selectedRowElement!=null)
            {
                this.selectedRowElement.style.cssText = this.oldSelectedRowStyleText;
                this.selectedRowElement.className = this.oldSelectedRowCss;
            }
            
            this.selectedRowKeyValue = null;
            this.selectedRowIndex = -1;
            this.selectedRowElement = null;
        }     
    }
    else
    {
        if (this.selectedRowStyleText!="")
        {
            tableRow.style.cssText = this.selectedRowStyleText;                    
        }
            
        if (this.selectedRowCss!="")
        {
            tableRow.className = this.selectedRowCss;
        }
    }
}

Grid.prototype.LoadRows = function ()
{            
    if (this.rawRows == "") return;
    
    this.rows = new Array();
    
	var rowsDataArray = this.rawRows.split('%');
	for(var i = 0; i < rowsDataArray.length; i++)
	{
		var rowData = rowsDataArray[i];
	    var rowDataArray = rowData.split(';');
	    
	    var rowIndex = rowDataArray[0];
	    
	    var colsData = rowDataArray[1];
        var colsDataArray = colsData.split('$');

	    var row = new GRow(rowIndex, this);   

        var cells = new Array();	    	    
      	for(z = 0; z < colsDataArray.length; z++)
	    {
	        var colData = colsDataArray[z];
	        var colDataArray = colData.split('#');
	        var colID = colDataArray[0];
	        var cellData = colDataArray[1];
	        
            cells[cells.length] = new GCell(colID, cellData, row);
	    }
	    
        row.cells = cells;
        
	    this.rows[this.rows.length] = row;
	}
}

Grid.prototype.InitPager = function ()
{
    this.InitializePager(this.pagerOldID, this.pagerNewID);
}

Grid.prototype.InitializePager = function (oldPagerID, newPagerID)
{
    this.pagerOldID = oldPagerID;
    this.pagerNewID = newPagerID;
    
    var pagerOld = document.getElementById(oldPagerID);
    var pagerNew = document.getElementById(newPagerID);
    
    if ((pagerNew!=null) && (pagerOld!=null)) 
    {
        pagerNew.innerHTML = '<table><tr>' + pagerOld.innerHTML + '</tr></table>';
    }
    
    if (pagerOld!=null) 
    {
        pagerOld.style.display = 'none';
    }
}

Grid.prototype.GRowClick = function (rowIndex, tableRow)
{    
    this.SelectRow(rowIndex, tableRow);    
}

Grid.prototype.GRowDblClick = function (rowIndex, tableRow)
{
    this.SelectRow(rowIndex, tableRow);
    
    var region = this.gridManager.view.GetRegion(this.regionID);
	var link = region.GetLink("GridRowDoubleClick");
	var cellValue = "";
	
	if (link == null) return;
	
	var copyData = link.copyData;	
	if (copyData!="")
	{
		copyData = decodeURIComponent(copyData);
		var copyDataArray = copyData.split(";");
		for(var i = 0; i < copyDataArray.length; i++)
		{
			var dataArray = copyDataArray[i].split("#");

			var from = dataArray[0];			
			var to = dataArray[1];
			
			var selectedRow = this.GetRow(rowIndex);
			if (selectedRow!=null)
			{
			    var cell = selectedRow.GetCell(from);
			    if (cell!=null)
			    {
			        cellValue = cell.value;
			        break;
			    }
			}            			
		}
	}
	
	this.OpenLink(link, cellValue);    
}

Grid.prototype.GCellClick = function (columnId, cellValue)
{
	var region = this.gridManager.view.GetRegion(this.regionID);
	var link = region.GetLink(columnId);
	this.OpenLink(link, cellValue);
}

Grid.prototype.OpenLink = function (link, value)
{
	if (link != null)
	{
	    var applicationID = link.applicationID;
	    var moduleName = link.moduleName;
		var workAreaName = link.workAreaName;
		var viewName = link.viewName;
	    var regionID = link.targetRegionID;
		var serviceID = link.serviceID;
		var linkType = link.linkType;
		var fieldPrefix = link.fieldPrefix;
		var copyData = link.copyData;
		var windowFeatures = link.windowFeatures;
		
		var data = this.gridManager.view.FillCopyDataWithValues(copyData, value);
			
		this.gridManager.view.OpenWindow(applicationID, moduleName, workAreaName, viewName, regionID, serviceID, linkType, data, windowFeatures);
	}
}

Grid.prototype.GetRow = function (rowIndex)
{
	for(var index=0;index< this.rows.length;index++)
	{
		if (this.rows[index].rowIndex == rowIndex)
		{
		    return this.rows[index];
		}
	}
	return null;
}

Grid.prototype.XViewFireOnChangeEvent = function (control)
{
	if (control!=null)
	{
		if (isIE)
		{
			//var newEvent = document.createEventObject();
			//control.fireEvent("onchange", newEvent);
			control.fireEvent("onchange");
		}
		else
		{
			var evt = document.createEvent("HTMLEvents");
			evt.initEvent("change", true, false);
			control.dispatchEvent(evt);
		}
	}
}

Grid.prototype.InitMoveGridCols = function ()
{
    this.MoveGridCols(this.moveGridColsCellName, this.moveGridColsPlaceHolderId);
}

Grid.prototype.MoveGridCols = function (cellName, placeHolderId)
{
    this.moveGridColsCellName = cellName;
    this.moveGridColsPlaceHolderId = placeHolderId;        

    var placeHolder = document.getElementById(placeHolderId);
    var html = "<table cellpadding=0 cellspacing=0>";
    
    if (document.all) //ie
    {        
        var grid = document.getElementById(this.controlID);
        if (grid == null) return;
        
        var elements = grid.getElementsByTagName("th");                
        html += this.MoveGridColsHelper(elements, cellName, true);
        
        elements = grid.getElementsByTagName("td");
        html += this.MoveGridColsHelper(elements, cellName, true);
    }
    else
    {                
        var elements = document.getElementsByName(cellName);
        if (elements == null) return;

        html += this.MoveGridColsHelper(elements, cellName, false);    
	}
	
    html += "</table>";
    placeHolder.innerHTML = html;
}

Grid.prototype.MoveGridColsHelper = function (elements, cellName, isIE)
{
    var html = "";
    for(var i = 0; i < elements.length; i++)
    {
        var cell = elements[i];      
        if ((cell.name == cellName) || (!isIE))
        {
            var att1 = cell.parentNode.attributes["class"];
            var att2 = cell.parentNode.attributes["oncontextmenu"];
            
            var att1value = "";
            var att2value = "";
            if (att1!=null)
            {
                att1value = att1.value;
            }

            if (att2!=null)
            {
                att2value = att2.value;
            }
                        
            html += "<tr class=\"" + att1value + "\" oncontextmenu=\"" + att2value + "\">";
            
            if (isIE)
            {
                html += cell.outerHTML;
            }
            else
            {
                var row = document.createElement("tr");
                row.appendChild(cell.cloneNode(true));
                html += row.innerHTML;
            }
            
            html += "</tr>";
            
            cell.style.display = 'none';
	        cell.style.visibility = 'hidden';
        }
    }
    
    return html;
}

