﻿// JScript File

//Các biến dùng cho toàn chương trình
var ipageSize, bFirstTime, iContentStartRow, iStockRow, iStockColumn;
var iHeaderNum, iContentNum, imaxRow, iBuyRow, iSellRow, iMatchRow, aDu_Mua, aDu_Ban, aKhop_Lenh;
//ipageSize: số chứng khoán sẽ cho hiện trên bảng (thông thường là 20)
//bFirstTime: dạng bool, xem đây có phải là lần gọi đầu tiên không
//iContentStartRow: chỉ thứ tự của dòng bắt đầu được hiện trong mảng các CK động
//(vì không thể hiện hết tất cả các CK cùng một lúc
//iStockRow: Số dòng của bảng CK, tức là số CK
//iStockColumn: số cột của bảng CK, tức là số thuộc tính của một CK
//iHeaderNum: số CK cố định
//iContentNum: số CK động

var aHeaderStock, aContentStock, aLiveSecurity, aLastSecurity, aTempSecurity, aHeaderList, aContentList;
var aCompanyName;
//aHeaderStock: mảng các CK cố định (mảng 2 chiều)
//aContentStock: mảng các CK động (mảng 2 chiều)
//aLiveSecurity: mảng tất cả các CK hiện tại(mảng 2 chiều)
//aLastSecurity: mảng tất cả các CK lần trước(mảng 2 chiều)
//aTempSecurity: mảng các CK (một chiều)
//aHeaderList và aContentList là 1 mảng một chiều, chứa thứ tự của các CK động và tĩnh

var iContentStartRow = 0; //Dòng bắt đầu hiện trong mảng Content
var iDotNumber = 1; //Hiện đang là đợt mấy
var oldClass;
var iTableCol = 25;
var sTime = '';
var bTrading = true;

//Các mầu cho bảng giá, khai báo một lần
var _timerMKT = null;
var _timerSec = null;

var sSecurity = "";
var sTotalMKT = "";
var sPut_throught = "";

var bFirstSec = true; var iTime = 0;

setInterval('TotalMKTData()', 10000);
setInterval('TotalSecData()', 20000);


//======================Phần này trả ra một mảng 2 chiều thông tin về tên của tất cả các CK============
function fStockRoom()
{
    if (proxies.IsActive())
    {
        _timerSec = window.setTimeout(fStockRoom, 300, "javascript");
        return;
    }
    proxies.HASTCStockWebServices.GetCompanyDatas.func = myResultStock_Room;
    proxies.HASTCStockWebServices.GetCompanyDatas();
}

function myResultStock_Room(retVal)
{
    var aTemp = new Array();
    var i;
    
    aTemp = retVal.split('**');
    aCompanyName = new Array(aTemp.length);
    for (i = 0; i < aTemp.length; i++)
    {
        aCompanyName[i] = new Array(2);
        aCompanyName[i] = aTemp[i].split('|');
    }
}
//=============================================Hiện giao dịch thỏa thuận==================================
function fPUT_THROUGHT()
{
    if (proxies.IsActive())
    {
        _timerSec = window.setTimeout(fPUT_THROUGHT, 300, "javascript");
        return;
    }
    
    proxies.HASTCStockWebServices.LiveBroker.func = myResultPUT_THROUGHT;
    proxies.HASTCStockWebServices.LiveBroker();
}

function myResultPUT_THROUGHT(Result)
{
    if ((Result == null) || (Result == '')) {return;}
    var i, j;
    
    //Biến tham số đầu vào thành một chuỗi
    var sTempResult = Result + '';
    sPut_throught = sTempResult;
    
    //Mảng thông tin của các CK khớp lệnh, mỗi CK và các tt của nó là 1 chuỗi, là 1 ptu
    var aTemp1 = new Array();
    aTemp1 = sPut_throught.split('**');
    iMatchRow = aTemp1.length;
    
    //Mảng 2 chiều chứa thông tin về CK khớp lệnh
    aKhop_Lenh = new Array(aTemp1.length);
    for (i = 0; i < aTemp1.length; i++)
    {
        aKhop_Lenh[i] = new Array(5);
        aKhop_Lenh[i] = aTemp1[i].split('|');
    }
    
    //Số dòng của 3 bảng bằng số dòng lớn nhất
    imaxRow = Math.max(iMatchRow, imaxRow);

    fCreateTable("tblPut_Khop" , aKhop_Lenh);
}

function fCreateTable(sTenBang, aMang)
{
    var sPrefix = '<span style="color:'+sYellow+'">';
    var sSuffix = '<span/>';
    var i, j, iTableRowNum, oTable, oRow, oCell;
    var aTemp = new Array(5);
    
    oTable = document.getElementById(sTenBang);
    iTableRowNum = oTable.rows.length;
    
    for (i = 0; i < aMang.length; i++)
    {
        fCopyArray(aMang[i], aTemp);
        if (i+1 < iTableRowNum)
        {
            oRow = oTable.rows[i+1];
            for (j = 0; j < 4; j++)
            {
                oCell = oRow.cells[j];
                switch (j)
                {
                    case 0:
                        oCell.innerHTML = sPrefix + aTemp[j] + sSuffix;
                        break;
                    case 1:
                        oCell.innerHTML = sPrefix + fFormatVolume(aTemp[j]) + sSuffix;
                        break;
                    case 2: case 3: case 4:
                        oCell.innerHTML = sPrefix + fFormatVolume(aTemp[j]) + sSuffix;
                        break;
                }
            }
        }
        else
        {
            oRow = oTable.insertRow(i + 1);
            oRow.className = fGetClassName(-1, i + 1);
            for (j = 0; j < 4; j++)
            {
                oCell = oRow.insertCell(j);
                
                switch (j)
                {
                    case 0:
                        oCell.innerHTML = sPrefix + aTemp[j] + sSuffix;
                        oCell.className = fGetBrokerClassName(0, i + 1);
                        break;
                    case 1:
                        oCell.innerHTML = sPrefix + fFormatVolume(aTemp[j]) + sSuffix;
                        oCell.className = fGetBrokerClassName(1, i + 1);
                        break;
                    case 2: case 3: case 4:
                        oCell.innerHTML = sPrefix + fFormatVolume(aTemp[j]) + sSuffix;
                        oCell.className = fGetBrokerClassName(1, i + 1);
                        break;
                }
            }
        }
    }
    
    if (oTable.rows.length < imaxRow + 2)
    {
        for (i = oTable.rows.length; i < imaxRow + 2; i++)
        {
            oRow = oTable.insertRow(i);
            oRow.className = fGetBrokerClassName(-1, i + 1);
            oRow.height = 22;
            for (j = 0; j < 4; j++)
            {
                oCell = oRow.insertCell(j);
                oCell.className = fGetBrokerClassName(1, i + 1);
                oCell.innerHTML = '<span style="background-color: black; color: #33ff00;"> </span>';
            }
        }
    }
    else
    {
        while (oTable.rows.length < imaxRow + 2)
        {
            oTable.deleteRow(oTable.rows.length - 1);
        }
    }
}


function fGetClassPut(i, j)
{
    if (Math.ceil(i / 2) == (i / 2)) //hang` chan
    {
        switch (j)
        {
            case 0:
                return "EvenRowCKPut";
                break;
            case 1: case 2: case 3: case 4:
                return "EvenRowPut";
                break;
        }
    }
    else
    {
        switch (j)
        {
            case 0:
                return "OddRowCKPut";
                break;
            case 1: case 2: case 3: case 4:
                return "OddRowPut";
                break;
        }
    }
}

//Hàm lấy ra tên class cho một cột
function fGetBrokerClassName(iCol, iRow)
{
    if (Math.ceil(iRow / 2) == (iRow / 2)) //hang` chan
    {
        switch (iCol)
        {
            case 4:
                return 'EvenColBorderPut';
            default:
                return 'EvenColOthersPut';
        }
    }
    else //hang` le
    {
        switch (iCol)
        {
            case 4:
                return 'OddColBorderPut';
            default:
                return 'OddColOthersPut';
        }
    }
}

//================================================Phần hiện bảng giá====================================

// Hàm này được gọi từ trang HTML
function TotalSecData()
{
    if (proxies.IsActive())
    {
        _timerSec = window.setTimeout(TotalSecData, 300, "javascript");
        return;
    }
    
    if (bFirstSec == false && iTime > 103033)
    {
        myResultSec(sSecurity);
        return;
    }
    
    proxies.HASTCStockWebServices.GetLiveSecurityTemp.func = myResultSec;
    proxies.HASTCStockWebServices.GetLiveSecurityTemp(true);
}

function myResultSec(retVal)
{
    myResultsSecurityData(retVal);
}


//Hàm này dùng để tạo ra hai mảng, chứa thứ tự của các CK động và tĩnh
function fCreateStockList()
{
    var i = 0, iHeader = 0, iContent = 0;
    var aChkBoxList = new Array();
    aChkBoxList = document.forms["form1"].ChkStock;
    
    if (aHeaderList != null)
    {
        aHeaderList.splice(0, aHeaderStock.length);
    }
    aHeaderList = new Array(iHeaderNum);
    
    if (aContentList != null)
    {
        aContentList.splice(0, aHeaderStock.length);
    }
    aContentList = new Array(iContentNum);
    
    for (i = 0; i < iStockRow; i++)
    {
        if (aChkBoxList[i].checked)
        {
            aHeaderList[iHeader] = new Array(iStockColumn);
            aHeaderList[iHeader] = i;
            iHeader++;
        }
        else
        {
            aContentList[iContent] = new Array(iStockColumn);
            aContentList[iContent] = i;
            iContent++;
        }
    }
    
    iHeaderNum = iHeader;
    iContentNum = iContent;
}


// Hàm thật sự xử lý chuỗi mà webservice trả về
function myResultsSecurityData(Result)
{
    if ((Result ==  null) || (Result == '')) {return;}
    
    var i = 0, j = 0;
    
    //Biến tam thời để lưu chuỗi do webservice trả về
    var TempResult = Result + '';
    sSecurity = TempResult;
    
    var aItemRow = new Array();
    var sCookie = '';
    
    //Mảng tạm một chiều, chứa thông tin của tất cả các CK
    aTempSecurity = new Array();
    aTempSecurity = TempResult.split("**");
    
    //Biến chung, chứa số lượng CK
    iStockRow = aTempSecurity.length;
    
    if (bFirstTime) //Nếu là lần gọi đầu tiên
    {
        aLiveSecurity = new Array(iStockRow);
        aLastSecurity = new Array(iStockRow);
        
        //Câu lệnh for để copy thông tin của các CK vào mảng 2 chiều aLiveSecurity và aLastSecurity
        for (i = 0; i < iStockRow; i++)
        {
            aItemRow = aTempSecurity[i].split("|");
            aLiveSecurity[i] = new Array(aItemRow.length);
            aLastSecurity[i] = new Array(aItemRow.length);
            fCopyArray(aItemRow, aLiveSecurity[i]);
            fCopyArray(aItemRow, aLastSecurity[i]);
        }
        
        //Tạo ra các checkbox trên form dựa vào mảng 2 chiều aLiveSecurity
        fCreateChkStock(aLiveSecurity);
        
        //Lay' ra Cookie cai' da
        sCookie = fGetCookie();
        
        //Neu' co' Cookie
        if ((sCookie.match("/") == "/") || (sCookie != ''))
        {
            var aCookie = sCookie.split('/');
            ipageSize = parseFloat(aCookie[aCookie.length - 1]);
            document.getElementById("txtPageSize").value = ipageSize.toString();
            
            //Check cac' CK ma` lan` truoc' user da chon
            var aChkBoxList = document.forms["form1"].ChkStock;
            for (i = 0; i < aChkBoxList.length; i++)
            {
                for (j = 0; j < aCookie.length - 1; j++)
                {
                    if (i == parseFloat(aCookie[j]))
                    {
                        aChkBoxList[i].checked = true;
                    }
                }
            }
            
            //Bo check mac dinh
            document.getElementById("ChkDefault").checked = false;
        }
        
        //Tạo ra hai mảng danh sách các CK động và tĩnh
        fCreateStockList();
    }
    
    else //Nếu không phải lần đầu thì ko cần khởi tạo mảng, copy luôn ttin vào aLiveSecurity
    {
        for (i = 0; i < iStockRow; i++)
        {
            aItemRow = aTempSecurity[i].split("|");
            fCopyArray(aItemRow, aLiveSecurity[i]);
        }
    }
    
    //Biến chung chứa số "thông tin" của một CK (VD: 20)
    iStockColumn = aItemRow.length;
    
    //Vòng lặp for, so sánh từng dòng của mảng aLiveSecurity và aLastSecurity (chủ yếu là aLastSecurity!)
    //Từ đó gán các thông tin dạng HTML vào mảng aLiveSecurity
    //Đồng thời copy mảng aLiveSecurity sang aLastSecurity để chuẩn bị cho lần gọi sau (mới trở thành cũ)
    for (i = 0; i < iStockRow; i++)
    {
        fCompareStock(aLastSecurity[i], aLiveSecurity[i]);
    }
    
    //Hàm tạo ra mảng động và tĩnh chứa ttin HTML, dựa vào aLiveSecurity (cũng HTML!)
    fCreateHeaderContentStock();
    
    //Hiện các CK cố định lên form
    fShowHeaderStock();
    
    //Hiện các CK động lên form
    fShowContentStock();
    
    //Từ nay không còn là lần đầu gọi nữa!
    bFirstTime = false;
    bFirstSec = false;
}


//Hàm đưa các CK cố định lên form
function fShowHeaderStock()
{
    if (aHeaderStock == null || aHeaderStock.length == 0) {return;}
    //Nếu số lượng CK cố định = 0 thì thoát luôn
    if (iHeaderNum == 0)
    {
        return;
    }
    
    var i = 0, j = 0;
    var dRow, dCell;
    var aHeaderRow = new Array(iStockColumn);
    var dTab = document.getElementById("tblBanggia");
    var imaxRow = dTab.rows.length;
    
    //Vòng lặp i chạy từ 0 đến số lượng CK cố định
    for (i = 0; i < iHeaderNum; i++)
    {
        //Copy hàng thứ i trong mảng CK cố định vào 1 mảng tạm
        fCopyArray(aHeaderStock[i], aHeaderRow);
        
        //Nếu dòng này trong bảng tblBanggia (trên form) có rồi
        if (i + 2 < imaxRow)
        {
            dRow = dTab.rows[i + 2];
            
            //Vòng lặp j từ 0 đến số "cột" của bảng tblBanggia (21)
            for (j = 0; j < iTableCol; j++)
            {
                dCell = dRow.cells[j];
                dCell.innerHTML = aHeaderRow[j];
            }
        }
        else //Nếu dòng này chưa có
        {
            //Insert một dòng mới
            dRow = dTab.insertRow(i + 2);
            dRow.onmouseover = function(){fHighLightRow(this);}
            dRow.onmouseout = function(){fNormalizeRow(this)}
            dRow.className = fGetClassName(-1, i);
            dRow.height = 20;
            
            //Cho số dòng của bảng tblBanggia tăng lên
            imaxRow = imaxRow + 1;
            
            //Vòng lặp từ 0 đến số cột của bảng tblBanggia
            for (j = 0; j < iTableCol; j++)
            {
                //Insert thêm một cell
                dCell = dRow.insertCell(j);
                dCell.className = fGetClassName(j, i);
                dCell.innerHTML = aHeaderRow[j];
            }
        }
    }
}


//Hàm đưa các CK dong lên form
function fShowContentStock()
{
    if (aContentStock == null || aContentStock.length == 0) {return;}
    var i = 0, j = 0;
    var dRow, dCell;
    var aContentRow = new Array(iStockColumn);
    var dTab = document.getElementById("tblBanggia");
    var imaxRow = dTab.rows.length;
    
    //Vòng lặp từ 0 đến số lượng CK động sẽ được hiển thị = tổng số CK hiển thị - số CK cố định
    for (i = 0; i < ipageSize - iHeaderNum; i++)
    {
        //iContentStartRow là thứ tự dòng đầu tiên trong mảng CK động sẽ dc hiển thị
        //nếu iContentStartRow + i vượt quá số lượng CK động thì
        if (i + iContentStartRow >= iContentNum)
        {
            iContentStartRow = 0;
            return;
        }
        
        //Copy hàng này vào mảng tạm
        fCopyArray(aContentStock[i + iContentStartRow], aContentRow);
        
        //Nếu dòng này trên bảng tblBanggia có rồi
        if (i + 2 + iHeaderNum < imaxRow)
        {
            dRow = dTab.rows[i + 2 + iHeaderNum];
            for (j = 0; j < iTableCol; j++)
            {
                dCell = dRow.cells[j];
                dCell.innerHTML = aContentRow[j];
            }
        }
        else //Còn nếu dòng này chưa có
        {
            //Insert một dòng mới
            dRow = dTab.insertRow(i + 2 + iHeaderNum);
            dRow.onmouseover = function(){fHighLightRow(this);}
            dRow.onmouseout = function(){fNormalizeRow(this);}
            dRow.className = fGetClassName(-1, i + iHeaderNum);
            dRow.height = 20;
            
            
            //Cho số dòng của bảng tblBanggia tăng lên 1
            imaxRow = imaxRow + 1;
            
            //Vòng lặp từ 0 đên số côt của bảng tblBanggia
            for (j = 0; j < iTableCol; j++)
            {
                dCell = dRow.insertCell(j);
                dCell.className = fGetClassName(j, i + iHeaderNum);
                dCell.innerHTML = aContentRow[j];
            }
        }
    }
    
    //Cho dòng bắt đầu tăng lên
    iContentStartRow = iContentStartRow + ipageSize - iHeaderNum;
    
    while (dTab.rows.length > ipageSize + 2)
    {
        dTab.deleteRow(ipageSize + 2);
    }
}


//Hàm lấy ra tên class cho một cột
function fGetClassName(iCol, iRow)
{
    if (Math.ceil(iRow / 2) == (iRow / 2)) //hang` chan
    {
        switch (iCol)
        {
            case 1:
                return 'EvenColCeiling';
            case 2:
                return 'EvenColFloor';
            case 3:
                return 'EvenColRef';            
            case 0:
                return 'EvenColCK';
            case 10:case 11:case 19:case 20:
                return 'EvenColHighLight';
            case 12: case 21:
                return 'EvenColHighLight1';
            case 9:case 18:
                return 'EvenColBorder';
            case -1:
                return 'EvenRow';
            default:
                return 'EvenColOthers';
        }
    }
    else //hang` le
    {
        switch (iCol)
        {
            case 0:
                return 'OddColCK';
            case 1:
                return 'OddColCeiling';
            case 2:
                return 'OddColFloor';
            case 3:
                return 'OddColRef';
            case 10:case 11:case 19:case 20:
                return 'OddColHighLight';
            case 12: case 21:
                return 'OddColHighLight1';
            case 9:case 18:
                return 'OddColBorder';
            case -1:
                return 'OddRow';
            default:
                return 'OddColOthers';
        }
    }
}

//Hàm này tạo ra một bảng các CK cố định và thay đổi, dựa vào bảng aLiveSecurity
function fCreateHeaderContentStock()
{
    var i = 0, iHeader = 0, iContent = 0, j = 0;
    var aChkBoxList = new Array();
    aChkBoxList = document.forms["form1"].ChkStock;
    
    if (aHeaderStock != null)
    {
        aHeaderStock.splice(0, aHeaderStock.length);
    }
    aHeaderStock = new Array(iHeaderNum);
    
    if (aContentStock != null)
    {
        aContentStock.splice(0, aHeaderStock.length);
    }
    aContentStock = new Array(iContentNum);
    
    for (i = 0; i < iStockRow; i++)
    {
        for (j = 0; j < aHeaderList.length; j++)
        {
            if (i == parseFloat(aHeaderList[j]))
            {
                aHeaderStock[iHeader] = new Array(iStockColumn);
                fCopyArray(aLiveSecurity[i], aHeaderStock[iHeader]);
                iHeader++;
            }
        }
    }
    
    for (i = 0; i < iStockRow; i++)
    {
        for (j = 0; j < aContentList.length; j++)
        {
            if (i == parseFloat(aContentList[j]))
            {
                aContentStock[iContent] = new Array(iStockColumn);
                fCopyArray(aLiveSecurity[i], aContentStock[iContent]);
                iContent++;
            }
        }
    }
}


//Hàm này để đếm số lượng CK được check
function fCountHeader()
{
    var iChecked = 0, i = 0;
    var aChkBoxList = new Array();
    
    aChkBoxList = document.forms["form1"].ChkStock;
    for (i = 0; i < aChkBoxList.length; i++)
    {
        if (aChkBoxList[i].checked)
        {
            iChecked = iChecked + 1;
        }
    }
    return iChecked;
}

//Hàm này tạo ra các checkbox, biến đầu vào là mảng 2 chiều các CK
function fCreateChkStock(aStock)
{
    var iS, i = 0, j, dRow, cell, iSodong;
    var dtab = document.getElementById('tblCheckStock');
    var dtab1 = document.getElementById('tblChkRowStock');
    var iSocot = 13;
    
    iSodong = Math.ceil(aStock.length / iSocot) + 1;
    for (i = 0; i < iSodong; i++)
    {
        dRow = dtab.insertRow(i + 1);
        dRow1 = dtab1.insertRow(i + 1);
        for (j = 0; j < iSocot; j++)
        {
            cell = dRow.insertCell(j);
            if(j==0 && i<iSodong-1)
            {
                cell1 = dRow1.insertCell(j);
                cell1.className = "ChkStock";
                cell1.innerHTML = '<input id="SelAll' + (i+1) + '" name="ChkStock" type="checkbox" onclick=fSetCheckboxByRow('+(i+1)+') />'+(i+1);
            }
            cell.className = "ChkStock";
            if (i*iSocot + j < aStock.length)
            {
                cell.innerHTML = '<input id="SL' + (i*iSocot + j + 1) + '" name="ChkStock" type="checkbox" />' + aStock[i*iSocot + j][0];
            }
        }
    }
}

//Hàm này copy mảng nguồn sang mảng đích
function fCopyArray(aSource, aDestination)
{
    if (aSource == null || aDestination == null) {return;}
    var iCol;
    for (iCol = 0; iCol < aDestination.length; iCol++)
    {
        aDestination[iCol] = aSource[iCol];
    }
}

//Hàm này so sánh mảng cũ và mới, sau đó gán vào mảng mới thông tin dạng HTML
function fCompareStock(aStockBefore, aStockNow)
{
    if (aStockBefore == null || aStockNow == null) { return; }
    var iItem = aStockNow.length;
    var j = 0;
    var sGiaTrunggian = '';
    var sKLTrunggian = '';
    var sTamthoi = '';
    var sPriceChange;
    if (parseFloat(aStockNow[10]) != 0)
    {
        sPriceChange = Math.round((parseFloat(aStockNow[10]) - parseFloat(aStockNow[3])) * 10) / 10;
    }
    else
    {
        sPriceChange = '';
    }
    for (j = 0; j < aStockNow.length; j++)
    {
        switch (j)
        {
            //Cột giá tham chiếu, trần, sàn, NN mua (các cột này style luôn cố định)
            case 1: case 2: 
                if(parseFloat(aStockNow[j])>0)
                {sTamthoi = fTruncNumber(aStockNow[j], 1);}
                else
                {sTamthoi='';}
                break;
            case 3:
                if(parseFloat(aStockNow[1])>0 || parseFloat(aStockNow[2])>0 || parseFloat(aStockNow[j])>0)
                {sTamthoi = fTruncNumber(aStockNow[j], 1);}
                else
                {sTamthoi='';}
                break;
            
            case 21: case 22: case 23: case 24:
                if (parseFloat(aStockNow[j]) <= 0)
                {
                    sTamthoi = fGetStyle(1, '', '0', '0', '0', '0', '', '', '', '', '', '');
                }
                else
                {
                    sTamthoi = fGetStyle(1, '', '0', '0', '0', '0', fFormatVolume(aStockNow[j]), sWhite, sWhite, sWhite, sWhite, sWhite);
                }
                break;
             
            //Cột mã CK
            case 0:
                var sNewMaCK = '<table width="100%" cellpadding=0 cellspacing=0><tr>';
                if (sPriceChange > 0)
                {
                    sNewMaCK +=  '<td width="60%" align="left" style="padding-left:2px;">' + aStockNow[j]+'</td><td align="center" valign="middle"><img src="images/u.gif"></td>';
                }
                else if (sPriceChange < 0)
                {
                    sNewMaCK +=  '<td width="60%" align="left" style="padding-left:2px;">' + aStockNow[j]+'</td><td align="center" valign="middle"><img src="images/d.gif"></td>';
                } 
                else
                    sNewMaCK +=  '<td width="60%" align="left" style="padding-left:2px;">' + aStockNow[j]+'</td><td align="center" valign="middle"><img src="images/n.gif"></td>';
                sNewMaCK +="</tr></table>" ;
                sTamthoi = fGetStyle(1, '', aStockNow[10], aStockNow[3], aStockNow[1], aStockNow[2], sNewMaCK, sWhite, sWhite, sWhite, sWhite, sWhite);
                break;
                
            //Cột giá đóng cửa
            case 10:
                var sCloseTemp = aStockNow[j] + '';
                var sFinishAmountTemp = aStockNow[j+1] + '';
                if (parseFloat(sCloseTemp) == 0)
                {
                    sTamthoi = fGetStyle(1, '', sCloseTemp, aStockNow[3], aStockNow[1], aStockNow[2], '', sGreen, sRed, sYellow, sViolet, sBlue);
                }
                else
                {
                    sTamthoi = fGetStyle(2, aStockBefore[j], sCloseTemp, aStockNow[3], aStockNow[1], aStockNow[2], fTruncNumber(sCloseTemp, 1), sGreen, sRed, sYellow, sViolet, sBlue);
                }
                break;
                
            //Cột KL thực hiện
            case 11:
                sTamthoi = fGetStyle(3, aStockBefore[j], aStockNow[j], aStockNow[3], aStockNow[1], aStockNow[2], sCloseTemp, sGreen, sRed, sYellow, sViolet, sBlue);
                break;
            
            //Cột thay đổi về giá (cột này phức tạp)
            case 12:
                var sPre = '';
                var sPrefix = '<div style="float:left;padding-left:2px;">';
                var sSuffix = '</div>';

                /*sPre = sPrefix;
                sPre += aStockNow[0];
                sPre+=sSuffix;*/
                if(sPriceChange>0)
                    sPriceChange='+'+sPriceChange;
                /*if (parseFloat(aStockBefore[10]) == parseFloat(aStockBefore[1]))
                {
                    sPriceChange = '<div style="float:right">CE&nbsp;'+sPriceChange+'</div>';
                }
                if (parseFloat(aStockBefore[10]) == parseFloat(aStockBefore[2]))
                {
                    sPriceChange = '<div style="float:right">FL&nbsp;'+sPriceChange+'</div>';
                }*/
                sTamthoi = fGetStyle(2, aStockBefore[10], sCloseTemp, aStockNow[3], aStockNow[1], aStockNow[2], sPre+sPriceChange, sGreen, sRed, sYellow, sViolet, sBlue);
                break;
                
            
            
            //Các cột giá
            case 4: case 6: case 8: case 13: case 15: case 17:
                sGiaTrunggian = aStockNow[j] + ''; //force a string
                if (parseFloat(sGiaTrunggian) != 0)
                {
                    if ((sGiaTrunggian == "ATC") || (sGiaTrunggian == "ATO") || (sGiaTrunggian == "MP"))
                    {
                        sTamthoi = '<span style="color:' + sWhite + ';">' + sGiaTrunggian + '</span>';
                    }
                    else
                    {
                        sTamthoi = fGetStyle(2, aStockBefore[j], aStockNow[j], aStockNow[3], aStockNow[1], aStockNow[2], fTruncNumber(aStockNow[j], 1), sGreen, sRed, sYellow, sViolet, sBlue);
                    }
                }
                else
                {
                   sTamthoi = fGetStyle(1, '', aStockNow[j], aStockNow[j], '', '', '', sGreen, sRed, sYellow, sViolet, sBlue);
                }
                break;
            
            //Các cột KL
            case 5: case 7: case 9: case 14: case 16: case 18:
                if (parseFloat(aStockNow[j]) == 0)
                {
                    sTamthoi = '';
                    aStockNow[j - 1] = '';
                }
                else
                {
                    if (parseFloat(aStockBefore[j]) != parseFloat(aStockNow[j]))
                    {
                        sTamthoi = fGetStyle(3, aStockBefore[j], aStockNow[j], aStockNow[3], aStockNow[1], aStockNow[2], aStockBefore[j-1], sGreen, sRed, sYellow, sViolet, sBlue);
                    }
                    else
                    {
                        if ((sGiaTrunggian != 'ATC') && (sGiaTrunggian != 'ATO') && (sGiaTrunggian != 'MP'))
                        {
                            sTamthoi = fGetStyle(1, sGiaTrunggian, sGiaTrunggian, aStockNow[3], aStockNow[1], aStockNow[2], fFormatVolume(aStockNow[j]), sGreen, sRed, sYellow, sViolet, sBlue);
                        }
                        else
                        {
                            sTamthoi = fGetStyle(1, '', '0', '0', '0', '0', fFormatVolume(aStockNow[j]), sWhite,  sWhite,  sWhite,  sWhite,  sWhite);
                        }
                    }
                }
                break;
            
            case 19: case 20: 
                if (parseFloat(aStockNow[j]) != 0)
                {
                    sTamthoi = fGetStyle(1, '', aStockNow[j], aStockNow[3], aStockNow[1], aStockNow[2], fTruncNumber(aStockNow[j], 1), sGreen, sRed, sYellow, sViolet, sBlue);
                }
                else
                {
                    sTamthoi = '';
                }
                break;
        }
        
        aStockBefore[j] = aStockNow[j];
        aStockNow[j] = sTamthoi;
    }
}

//Hàm này cắt tỉa giá CK cho gọn
function fTruncNumber(sNumber, iPrecision)
{
    if (sNumber == null || sNumber == '' || sNumber == "")
    {
        return '0';
    }
    
    var sTemp = sNumber + ''; //make a string
    var iPoint = sTemp.lastIndexOf(".");
    if (iPoint >= 0)
    {
        return sTemp.substring(0, iPoint + 1 + iPrecision);
    }
    else
    {
        return sNumber;
    }
}

//Hàm này định dạng lại một số (thường là KL)
function fFormatVolume(sVolume)
{
    if ((sVolume == null) || (sVolume == '') || (sVolume == ""))
    {
        return '';
    }
    
    if (parseFloat(sVolume) == 0)
    {
        return '';
    }
    
    var i = 0; var sRs = ''; var sDuoi = '';
    var sTempVolume = sVolume + ''; //create a string
    
    i = sTempVolume.lastIndexOf(".");
    if (i > -1)
    {
        sDuoi = sTempVolume.substr(i, 2);
        sTempVolume = sTempVolume.substr(0, i);
    }
    
    var iDodai = sTempVolume.length;
    var iSodauphay = Math.ceil(iDodai / 3) - 1;
    var iSodu = iDodai%3;
    if (iSodu == 0) {iSodu = 3;}
    sRs = sTempVolume.substr(0, iSodu);
    for (i = 0; i < iSodauphay; i++)
    {
        sRs = sRs + ',' + sTempVolume.substr(iSodu, 3);
        iSodu += 3;
    }
    
    sRs += sDuoi;
    return sRs;
}


//Hàm này so sánh 2 chuỗi
//iType: dạng 1 là chỉ hiện mầu, dạng 2 là có thay đổi cả nền
//sOldText: dữ liệu cũ, chỉ cần trong dạng 2
//sNewText: dữ liệu mới nhất
//sRefText: giá tham chiếu
//sCeilText: giá trần
//sFloorText: giá sàn
//sShowText: dữ liệu sẽ được hiển thị
//sIncColor: mầu tăng
//sDecColor: mầu giảm
//sStayColor: mầu đứng yên
//sCeilColor: mầu tăng trần
//sFloorColor: mầu giảm sàn
function fGetStyle(iType, sOldText, sNewText, sRefText, sCeilText, sFloorText, sShowText, sIncColor, sDecColor, sStayColor, sCeilColor, sFloorColor)
{
    var sPrefix = '<span style="color:';
    var sSuffix = '<span>';
    switch (iType)
    {
        case 1:
            if (parseFloat(sNewText) == parseFloat(sCeilText))
            {
                return sPrefix + sCeilColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) == parseFloat(sFloorText))
            {
                return sPrefix + sFloorColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) > parseFloat(sRefText))
            {
                return sPrefix + sIncColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) < parseFloat(sRefText))
            {
                return sPrefix + sDecColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) == parseFloat(sRefText))
            {
                return sPrefix + sStayColor + ';">' + sShowText + sSuffix;
            }
			return sPrefix + sStayColor + ';">' + sShowText + sSuffix;
            break;
            
        case 2:
            if ((parseFloat(sNewText) != parseFloat(sOldText)) || (sNewText != sOldText))
            {
                if (parseFloat(sNewText) == parseFloat(sCeilText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeCeil"><tr><td>' + sShowText + '</td></tr></table>';
                }
                if (parseFloat(sNewText) == parseFloat(sFloorText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeFloor"><tr><td>' + sShowText + '</td></tr></table>';
                }
                if (parseFloat(sNewText) > parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeInc"><tr><td>' + sShowText + '</td></tr></table>';
                }
                if (parseFloat(sNewText) < parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeDec"><tr><td>' + sShowText + '</td></tr></table>';
                }
                if (parseFloat(sNewText) == parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeRef"><tr><td>' + sShowText + '</td></tr></table>';
                }                
				return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeRef"><tr><td>' + sShowText + '</td></tr></table>';
            }
            
            if (parseFloat(sNewText) == parseFloat(sCeilText))
            {
                return sPrefix + sCeilColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) == parseFloat(sFloorText))
            {
                return sPrefix + sFloorColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) > parseFloat(sRefText))
            {
                return sPrefix + sIncColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) < parseFloat(sRefText))
            {
                return sPrefix + sDecColor + ';">' + sShowText + sSuffix;
            }
            if (parseFloat(sNewText) == parseFloat(sRefText))
            {
                return sPrefix + sStayColor + ';">' + sShowText + sSuffix;
            }
			return sPrefix + sStayColor + ';">' + sShowText + sSuffix;
            break;
        case 3://Riêng cho cột KLTH
            var sShowTextTemp = fFormatVolume(sNewText);
            if ((parseFloat(sNewText) != parseFloat(sOldText)) || (sNewText != sOldText))
            {
                if (parseFloat(sShowText) == parseFloat(sCeilText))

                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeCeil"><tr><td>' + sShowTextTemp + '</td></tr></table>';
                }
                if (parseFloat(sShowText) == parseFloat(sFloorText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeFloor"><tr><td>' + sShowTextTemp + '</td></tr></table>';
                }
                if (parseFloat(sShowText) > parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeInc"><tr><td>' + sShowTextTemp + '</td></tr></table>';
                }
                if (parseFloat(sShowText) < parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeDec"><tr><td>' + sShowTextTemp + '</td></tr></table>';
                }
                if (parseFloat(sShowText) == parseFloat(sRefText))
                {
                    return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeRef"><tr><td>' + sShowTextTemp + '</td></tr></table>';
                }
				return '<table cellpadding="0" cellspacing="0" style="width: 100%; height: 98%" class="ColChangeRef"><tr><td>' + sShowTextTemp + '</td></tr></table>';
            }
            
            if (parseFloat(sShowText) == parseFloat(sCeilText))
            {
                return sPrefix + sCeilColor + ';">' + sShowTextTemp + sSuffix;
            }
            if (parseFloat(sShowText) == parseFloat(sFloorText))
            {
                return sPrefix + sFloorColor + ';">' + sShowTextTemp + sSuffix;
            }
            if (parseFloat(sShowText) > parseFloat(sRefText))
            {
                return sPrefix + sIncColor + ';">' + sShowTextTemp + sSuffix;
            }
            if (parseFloat(sShowText) < parseFloat(sRefText))
            {
                return sPrefix + sDecColor + ';">' + sShowTextTemp + sSuffix;
            }
            if (parseFloat(sShowText) == parseFloat(sRefText))
            {
                return sPrefix + sStayColor + ';">' + sShowTextTemp + sSuffix;
            }
			return sPrefix + sStayColor + ';">' + sShowTextTemp + sSuffix;
            break;
    }
}


//Hàm này gọi khi NSD bấm vào checkall
function fCheckAll()
{
    document.getElementById("ChkAll").checked = false;
    
    //Neu' chua co' CK nao` thi` thoat' luon
    if ((iStockRow == null) || (iStockRow == 0))
    {
        return;
    }
    
    //Cho tất cả các checkbox về dạng được check hết
    fSetCheckbox(true);
    
    //Thiết lập lại số dòng hiển thị
    document.getElementById("txtPageSize").value = iStockRow;
}


//Hàm cho tất cả các checkbox được check hoặc bỏ check
function fSetCheckbox(bValue)
{
//    alert('sfsd');
    var i = 0;
    var checkboxId;
    var aChkBoxList = new Array();
//    aChkBoxList = document.forms("form1").ChkStock;
    
//    for (i = 0; i < aChkBoxList.length; i++)
    for (i = 0; i < iStockRow; i++)
    {
//        aChkBoxList[i].checked = bValue;
        checkboxId = "SL";
        checkboxId += (i + 1).toString();
//        alert(checkboxId);
        document.getElementById(checkboxId).checked = bValue;
    }
}


//Hàm này được gọi khi ấn nút hiển thị mặc định
function fApplyDefault()
{
    document.getElementById("ChkDefault").checked = false;
    
    //Neu' chua co' CK nao` thi` thoat' luon
    if ((iStockRow == null) || (iStockRow == 0))
    {
        return;
    }
    
    //Cho tất cả các checkbox về dạng ko được check
    fSetCheckbox(false);
    
    document.getElementById("txtPageSize").value = "17";
}


//Hàm này được gọi khi ấn nút OK
function fApplySettings()
{
    document.getElementById("AGSelect").style.display = "none";
    
    //Neu' chua co' CK nao` thi` thoat' luon
    if ((iStockRow == null) || (iStockRow == 0))
    {
        return;
    }
    
    //Neu' nguoi` dung` nhap so' dong` hien thi nho hon 1 thi` cung thoat' luon
    if (parseFloat(document.getElementById("txtPageSize").value) < 1)
    {
        return;
    }
    
    //Cho so' dong` hien thi. bang` voi' so' trong textbox
    ipageSize = parseFloat(document.getElementById("txtPageSize").value);
    
    //Nhớ thông tin vào Cookie
    fSavingCookie();
    
    //Cho dòng bắt đầu hiển thị về 0
    iContentStartRow = 0;
    
    //Tính số lượng CK cố định và CK động
    fCreateStockList();
    
    //Tạo mảng header và content
    fCreateHeaderContentStock();
    
    //Cho hiện mảng header và content lên bảng
    fShowHeaderStock();
    fShowContentStock();
}


//Hàm tạo Cookie
function fSavingCookie()
{
//    alert(sStockCookie);
    var sStockCookie = '';
    var iChecked = 0, i = 0;
    var aChkBoxList = new Array();
    
    aChkBoxList = document.forms["form1"].ChkStock;
    for (i = 0; i < aChkBoxList.length; i++)
    {
        if (aChkBoxList[i].checked)
        {
            sStockCookie += i.toString() + "/";
        }
    }
    
//    //Nếu chuỗi ko rỗng thì thêm số dòng vào
//    if (sStockCookie != '')
//    {
        sStockCookie += ipageSize.toString();
//    }
    
    //Lưu chuỗi trên vào Cookie
    var exp = new Date();     //set new date object 
    exp.setTime(exp.getTime() + (1000 * 60 * 60 * 24 * 30));     //set it 30 days ahead
    document.cookie = "HaStock = " + sStockCookie + "; expires = " + exp.toGMTString() + "; path=/";
}

//Hàm lấy ra cookie
function fGetCookie()
{
    var nameEQ = "HaStock=";
    var i = 0;
    var ca = document.cookie.split(';');
    
    for (i = 0; i < ca.length; i++)
    {
        var c = ca[i];
        while (c.charAt(0) == ' ')
        {
            c = c.substring(1, c.length);
        }
        
        if (c.indexOf(nameEQ) == 0)
        {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return '';
}


function fHighLightRow(e)
{
    e.className = 'HighLightRow';
    if (aCompanyName == null)
    {
        return;
    }
    
    var i = 0;
    var oSpan = e.firstChild.lastChild;
    
    if (oSpan != null)
    {
        i = oSpan.innerHTML.indexOf('width="60%" align=left>');
		if(i==0 || i==-1)
		{
        	i = oSpan.innerHTML.indexOf('align="left" width="60%">');
			if(i==0 || i==-1)
			{
				i = oSpan.innerHTML.indexOf('align=left width="60%">');
				var sMA_CK = oSpan.innerHTML.substr(i+23, 3);
			}
			else
			{
				var sMA_CK = oSpan.innerHTML.substr(i+25, 3);
			}			
		}
		else
		{
			var sMA_CK = oSpan.innerHTML.substr(i+23, 3);
		}		
        /*alert(oSpan.innerHTML);
		alert(i);
		alert(sMA_CK);*/
        var sTEN_CTY, sROOM, sTemp;
        
        i = 0;
        while (aCompanyName[i][0] != sMA_CK)
        {
            i++;
        }

        sTEN_CTY = aCompanyName[i][1];
        if (sTEN_CTY == '0') sTEN_CTY = sMA_CK;
        Tip(sTEN_CTY);
    }
}

function fNormalizeRow(e)
{
    var i = e.rowIndex;
    if (Math.ceil(i / 2) == (i / 2)) //hang` chan
    {
        e.className = 'EvenRow';
    }
    else
    {
        e.className = 'OddRow';
    }
}