CFFrame = function()
{
    
     this.FocusedColor =  '#708090';
    this.NoChangeColor = 'Black';
 this.CeilingColor='Blue';
   this.UpColor='#009800';
    this.FloorColor='#990066';
   this.DownColor='Red';
    this.UpdatedColor = '#ffa742';
     this.FocusedColor =  '#708090';
    
    this.currentExchange = 'HASTC';
    this.infoDataVersion = 0;
    this.EndsScrollDelay = 3000;
    this.UpdateInfoInterval = 2000;
    this.ScrollStep = 1;
    this.scrollDirection = 1;
    this.ScrollDelay = 60;
        
    this.odivStockInfo = $get('divStockInfo');
    this.otblStockInfo = $get('tblStockInfo');
    this.otxtVNIndex = $get('txtIndex');
    this.otxtTotalValue = $get('txtTotalValue');   
    this.otxtTotal = $get('txtTotal');
    this.obtnStockExchange = $get('btnStockExchange');
    this.olblTitle = $get('lblTitle');
    this.otblHeader = $get('tblHeader');
    this.ochkIsScroll = $get('chkIsScroll');
    
    this.changedCells = new Array();
    this.mktRecord = new Object();
    this.index = new Array();
    
    this.iInfoColCount = 5;
    this.STOCK_SYMBOL_IDX = 0;
    this.VOLUME_IDX = 1;
    this.PRICE_IDX = 2;
    this.CHANGE_IDX = 3;
    this.FOREIGN_IDX = 4;
    
    this.tableStockInfo=
    "<table id='tblStockInfo' border='1' bordercolor='gray' cellpadding='1' cellspacing='0' style='border-collapse: collapse; font-weight:normal; font-family: Arial;' width='170px'>\
    <tr>\
    <td style='width: 42px;' class='StockSymbol'>&nbsp;</td>\
    <td style='width: 32px;' class='Volume'>&nbsp;</td>\
    <td style='width: 32px;' class='Price'>&nbsp;</td>\
    <td style='width: 32px;' class='Change'>&nbsp;</td>\
    <td style='width: 32px;' class='Foreign'>&nbsp;</td>\
    </tr>";
    this.rowOdd=
    "<tr>\
    <td style='width: 42px;' class='StockSymbol'>&nbsp;</td>\
    <td style='width: 32px;' class='Volume'>&nbsp;</td>\
    <td style='width: 32px;' class='Price'>&nbsp;</td>\
    <td style='width: 32px;' class='Change'>&nbsp;</td>\
    <td style='width: 32px;' class='Foreign'>&nbsp;</td>\
    </tr>";
    this.rowEven=
    "<tr>\
    <td style='width: 42px;' class='StockSymbolEven'>&nbsp;</td>\
    <td style='width: 32px;' class='VolumeEven'>&nbsp;</td>\
    <td style='width: 32px;' class='PriceEven'>&nbsp;</td>\
    <td style='width: 32px;' class='ChangeEven'>&nbsp;</td>\
    <td style='width: 32px;' class='ForeignEven'>&nbsp;</td>\
    </tr>";
    
}
CFFrame.prototype =
{    
    init: function()
    {
        objX.ochkIsScroll.checked = false;
        var ret = framecf.DataFeeder.GetInfo(0, objX.currentExchange, objX.onInitComplete, objX.onInitError, objX.onInitError);
        
    },
    onInitError: function(arg)
    {
        
    },
    onSwitchExchange: function()
    {
        if (objX.currentExchange == 'HASTC')
        {
            objX.obtnStockExchange.src = 'Images/Hastc.gif';
            objX.obtnStockExchange.alt = 'Sàn giao dịch HASTC';
            objX.olblTitle.innerHTML = 'Bảng giá HOSE';
            objX.currentExchange = 'HOSTC'
        } else 
        if (objX.currentExchange == 'HOSTC')
        {
            objX.obtnStockExchange.src = 'Images/Hose.gif';
            objX.obtnStockExchange.alt = 'Sàn giao dịch HOSE';        
            objX.olblTitle.innerHTML = 'Bảng giá HASTC';
            objX.currentExchange = 'HASTC'
        }        
        objX.infoDataVersion = 0;
        objX.changedCells = new Array();
        objX.mktRecord = new Object();
        objX.resetHeader();
        objX.init();
    },
    onInitComplete: function(arg)
    {
        if (arg.MarketUpdated.length > 0) objX.onGetMktInfoComplete(arg);
        var recordSet = arg.StockUpdated.split(';');
        objX.aStockInfo = new Array();
        var i;
        var record;
        var idx;
        for(i = 0; i < recordSet.length; i++)
        {
            if(recordSet[i].length > 2)
            {
                record = objX.stockInfoDataParse(recordSet[i]);                
                objX.aStockInfo.push(record);  
                objX.index[i] = i;           
            }
        }
        objX.initTables();
        objX.initTablesData();
        objX.infoDataVersion = arg.DataVersion;
    },
    initTables: function()
    {
        var tableDefinition=objX.tableStockInfo;
        for(i=1; i< objX.aStockInfo.length; i++)
        {
            if ((i%2)==0)
            {                  
                tableDefinition+=objX.rowOdd;
            }
            else
            {
                tableDefinition+=objX.rowEven;
            }
        }
        tableDefinition+="</table>";   
        objX.odivStockInfo = $get('divStockInfo');     
        objX.odivStockInfo.innerHTML=tableDefinition;
        objX.otblStockInfo = $get('tblStockInfo');
        objX.otblStockInfo.style.width = objX.otblHeader.style.width;
    },
    onRowFocused: function(e)
    {
        var targ;
        if (!e)
        {
          var e=window.event;
        }
        if (e.target)
        {
          targ=e.target.parentNode;
        }
        else if (e.srcElement)
        {
          targ=e.srcElement.parentNode;
        }
        if (targ.nodeType==3) // defeat Safari bug
        {
          targ = targ.parentNode.parentNode;
        }
        for(j = 0; j < objX.iInfoColCount; j++)
           {
             targ.cells[j].style.backgroundColor = objX.FocusedColor;
           }
    },
    onRowUnfocused: function(e)
    {
        var targ;
        if (!e)
        {
          var e=window.event;
        }
        if (e.target)
        {
          targ=e.target.parentNode;
        }
        else if (e.srcElement)
        {
          targ=e.srcElement.parentNode;
        }
        if (targ.nodeType==3) // defeat Safari bug
        {
          targ = targ.parentNode.parentNode;
        }
       for(j = 0; j < objX.iInfoColCount; j++)
       {
         targ.cells[j].style.backgroundColor = '';
       }
    },
    initTablesData: function()
    {
        for(i = 0; i < objX.aStockInfo.length; i++)
        {
            record = objX.aStockInfo[i];
            row = objX.otblStockInfo.rows[i];
            record.TableRow = row;
            var cell = row.cells[objX.STOCK_SYMBOL_IDX];
            row.onmouseover = objX.onRowFocused;
            row.onmouseout = objX.onRowUnfocused;
            cell.innerHTML = record.StockSymbol;
            
            objX.updateStockInfoRow(record, objX.aStockInfo[i]);
        }
        if(objX.updateInfoTimer != undefined)
            clearTimeout(objX.updateInfoTimer);
        if(objX.scrollTableTimer != undefined)
            clearTimeout(objX.scrollTableTimer);
        objX.updateInfoTimer = setTimeout('objX.updateInfo()',objX.UpdateInfoInterval);            
    },
    onClickScroll: function()
    {
        if (objX.ochkIsScroll.checked) objX.delayEndsScrollTables();
         else clearTimeout(objX.scrollTableTimer);
    },
    delayEndsScrollTables: function()
    {
        if(objX.scrollTableTimer != undefined)
            clearTimeout(objX.scrollTableTimer);
        objX.scrollTableTimer = setTimeout('objX.scrollTable()',objX.EndsScrollDelay);
    },
    scrollTable: function()
    {
        var scrollTop = objX.odivStockInfo.scrollTop;
        scrollTop += objX.ScrollStep * objX.scrollDirection;
        if(scrollTop < 0)
        {
            objX.scrollDirection = 1;
            objX.delayEndsScrollTables();
        }
        else if(scrollTop > objX.odivStockInfo.scrollHeight)
        {
            objX.scrollDirection = -1;
            objX.delayEndsScrollTables();
        }
        else
        {
            objX.odivStockInfo.scrollTop = scrollTop;
            if(objX.odivStockInfo.scrollTop != scrollTop)
            {
                objX.scrollDirection = -1;
                objX.delayEndsScrollTables();
            }
            else
            {
                 if(objX.scrollTableTimer != undefined)
                    clearTimeout(objX.scrollTableTimer);
                objX.scrollTableTimer = setTimeout('objX.scrollTable()',objX.ScrollDelay);
            }
        }
    },    
    updateInfo: function()
    {
        if(objX.updateInfoTimer != undefined)
            clearTimeout(objX.updateInfoTimer);
        var cell;
        while(objX.changedCells.length > 0)
        {
            cell = objX.changedCells.pop();
            cell.style.backgroundColor = '';
            cell.style.fontWeight = '';
        }
        var ret = framecf.DataFeeder.GetInfo( objX.infoDataVersion, objX.currentExchange, objX.onGetInfoComplete, objX.onGetInfoError, objX.onGetInfoError);    
    },
    onGetInfoComplete: function(arg)
    {
        if (arg != null)
        {
            if (arg.StockUpdated.length > 0) objX.onGetStockInfoComplete(arg);
            if (arg.MarketUpdated.length > 0) objX.onGetMktInfoComplete(arg);
            objX.infoDataVersion = arg.DataVersion; 
        }        
        if(objX.updateInfoTimer != undefined)
            clearTimeout(objX.updateInfoTimer);
        objX.updateInfoTimer = setTimeout('objX.updateInfo()',objX.UpdateInfoInterval);    
    },
    onGetInfoError: function(arg)
    {
        setTimeout('objX.updateInfo()',objX.UpdateInfoInterval*5);
    },
    quickSearch: function(arr, val)
    {       
        var left = 0;
        var right = arr.length - 1;
        var midle;
        while(left <= right)
        {
            if(arr[left].StockSymbol == val.StockSymbol)
                return left;
            
            if(left == right)
                return -1;
                
            if(arr[right].StockSymbol == val.StockSymbol)
                return right;
            
            midle = Math.floor((right + left)/2);            
            
            if (arr[midle].StockSymbol < val.StockSymbol)
            {
                left = midle + 1;
                right = right -1;
            } else 
            if (arr[midle].StockSymbol == val.StockSymbol)
                return midle;
            else     
            {    
                right = midle - 1;
                left = left + 1;
            }
        }
        return -1;
    },
    stockInfoDataParse: function(inputString)
    {
        var record = new Object();
        record.foreignBuyVolume = 0;
        var change_list = inputString.split(',');
        var change_idx;
        var field_idx = 0;
        record.StockSymbol = change_list[change_list.length - 1];
        var pair;
        var field_value;
        for(change_idx = 0; change_idx < change_list.length - 1; change_idx++)
        {
            pair = change_list[change_idx].split(':');
            if(pair.length == 2)
            {
                field_value = pair[1];
                field_idx = parseInt(pair[0]);
            }
            else
            {
                field_value = pair[0];
            };
            switch(field_idx)
            {
                case 0: 
                    record.lastPrice = parseInt(field_value) * 100;
                    break;
                case 1: 
                    record.lastVolume = parseInt(field_value) * 10;
                    break;  
                case 2:
                    record.foreignBuyVolume = parseInt(field_value) * 10;
                    break;      
                case 3:
                    record.referencePrice = parseInt(field_value) * 100;
                    break;
                case 4:
                    record.ceilingPrice = parseInt(field_value) * 100;
                    break;            
                case 5:
                    record.floorPrice = parseInt(field_value) * 100;
                    break;                
                ////////////////////////////////////////////////////////////////////////
                default:
                    break;
            }            
            field_idx ++;
        }                
        return record;
    },
    mktInfoDataParse: function(inputString)
    {
       var record = new Object();
        var fields = inputString.split(',');
        var i;
        var pair;
        for(i = 0; i < fields.length; i++)
        {
            pair = fields[i].split(':');
            if(pair.length != 2)
                continue;
            switch(pair[0])
            {                
                case 'MI': 
                    record.marketIndex = parseFloat(pair[1]);
                    break;
                case 'IC': 
                    record.indexChange = parseFloat(pair[1]);
                    break;                               
                ////////////////////////////////////////////////////////////////////////
                default:
                    break;
            }
        }
        return record;
    },
    onGetStockInfoComplete: function(arg)
    {
        var recordSet = arg.StockUpdated.split(';');
        objX.infoDataVersion = arg.DataVersion;
        var i;
        var record;
        var idx;

        for(i = 0; i < recordSet.length; i++)
        {
            record = objX.stockInfoDataParse(recordSet[i]);
            idx = objX.quickSearch(objX.aStockInfo, record);
            if(idx >= 0)
            {
                objX.updateStockInfoRow(record, objX.aStockInfo[idx]);
                continue;
            }
        }        
    },
    findPriceCellColorName: function(price, record)
    {
         if(price == 0)
        {
            return  objX.NoChangeColor;
        }
        if(price == record.ceilingPrice)
        {
            return objX.CeilingColor;
        }
        else if(price > record.referencePrice)
        {
            return  objX.UpColor;
        }
        else if(price == record.referencePrice)
        {
            return  objX.NoChangeColor;
        }
        else if(price == record.floorPrice)
        {
            return  objX.FloorColor;
        }
        else if(price < record.referencePrice)
        {
            return  objX.DownColor;
        }     
    },
    removeSeparatorFromDgtStr: function(num, thounsandSeparator, precisionSeparator)
    {
	    if(!thounsandSeparator)
		    thounsandSeparator = ',';
	    if(!precisionSeparator)
		    precisionSeparator = '.';
	    num = num + '';
	    var str = num.split(thounsandSeparator).join('') + '';
	    str = parseFloat(str) + '';
	    return str;
    },
    numToStringWithDgtGrp: function(num, thounsandSeparator, precisionSeparator)
    {
        if(!thounsandSeparator)
		    thounsandSeparator = ',';
	    if(!precisionSeparator)
		    precisionSeparator = '.';
	    num = num + '';
	    var str = objX.removeSeparatorFromDgtStr(num, thounsandSeparator, precisionSeparator);

	    var sign = '';
	    if(str.charAt(0) == '-')
		    sign ='-';

	    str = Math.abs(str)+'';

	    var int_len = str.indexOf(precisionSeparator);

	    var rsl = '';
	    if(int_len >= 0)
		    rsl = str.substring(int_len, str.length);

	    if(int_len < 0)
		    int_len = str.length;

	    var separator_count = Math.floor(int_len/3);
	    if (separator_count * 3 == int_len)
			    separator_count--;

	    for (var i = 1; i <= separator_count; i++)
		    rsl = thounsandSeparator + str.substring(int_len - i * 3, int_len - (i - 1) * 3) + rsl;
    	
	    rsl = sign + str.substring(0, int_len - (i - 1) * 3) + rsl;

	    return rsl;
    },
    findPriceTrendingSign: function(price, record)
    {
        if(price == 0)
        {
            return  '■';
        }
        if(price == record.ceilingPrice)
        {
            return '▲';
        }
        else if(price > record.referencePrice)
        {
            return  '▲';
        }
        else if(price == record.referencePrice)
        {
            return  '■';
        }
        else if(price == record.floorPrice)
        {
            return  '▼';
        }
        else if(price < record.referencePrice)
        {
            return  '▼';
        }
    },
    findPriceColorName: function(price, record)
    {
         if(price == 0)
        {
            return  objX.NoChangeColor;
        }
        if(price == record.ceilingPrice)
        {
            return objX.CeilingColor;
        }
        else if(price > record.referencePrice)
        {
            return  objX.UpColor;
        }
        else if(price == record.referencePrice)
        {
            return  objX.NoChangeColor;
        }
        else if(price == record.floorPrice)
        {
            return  objX.FloorColor;
        }
        else if(price < record.referencePrice)
        {
            return  objX.DownColor;
        }     
    },
    resetHeader: function()
    {
        $get('lblStockSymbol').innerHTML = 'Mã CK';
        $get('lblVolume').innerHTML = 'KL';
        $get('lblPrice').innerHTML = 'Giá';
        $get('lblChange').innerHTML = '+/-';
        $get('lblForeign').innerHTML = 'GDNN';
    },
    cmp2Symbol: function(a,b)
    {
        if(a.StockSymbol > b.StockSymbol)
            return 1;
        else if (a.StockSymbol < b.StockSymbol)
            return -1;
        else return 0;
    },    
    reSort: function(idx)
    {
        var str;        
        var k;
        var cmp = -1; 
        var sign = '▲' 
        switch(idx)
        {
            case 0: {str = $get('lblStockSymbol').innerHTML;
                    objX.resetHeader();
                    if (str.charAt(0) == '▲') {cmp = 1; sign = '▼';}
                    $get('lblStockSymbol').innerHTML = sign + $get('lblStockSymbol').innerHTML;
                    for(i = 0; i < objX.aStockInfo.length-1; i++)
                        for(j = i+1; j < objX.aStockInfo.length; j++)
                            if (objX.cmp2Symbol(objX.aStockInfo[objX.index[i]],objX.aStockInfo[objX.index[j]])*cmp > 0)
                                {k = objX.index[j]; objX.index[j] = objX.index[i]; objX.index[i] = k;}                            
                    }    
                    break;
            case 1: {str = $get('lblVolume').innerHTML;
                    objX.resetHeader();
                    if (str.charAt(0) == '▲') {cmp = 1; sign = '▼';}
                    $get('lblVolume').innerHTML = sign + $get('lblVolume').innerHTML;
                    for(i = 0; i < objX.aStockInfo.length-1; i++)
                        for(j = i+1; j < objX.aStockInfo.length; j++)
                            if ((objX.aStockInfo[objX.index[i]].lastVolume - objX.aStockInfo[objX.index[j]].lastVolume)*cmp > 0)
                                {k = objX.index[j]; objX.index[j] = objX.index[i]; objX.index[i] = k;}                            
                    }    
                    break;
                    
            case 2: {str = $get('lblPrice').innerHTML;
                    objX.resetHeader();
                    if (str.charAt(0) == '▲') {cmp = 1; sign = '▼';}
                    $get('lblPrice').innerHTML = sign + $get('lblPrice').innerHTML;
                    for(i = 0; i < objX.aStockInfo.length-1; i++)
                        for(j = i+1; j < objX.aStockInfo.length; j++)
                            if ((objX.aStockInfo[objX.index[i]].lastPrice - objX.aStockInfo[objX.index[j]].lastPrice)*cmp > 0)
                                {k = objX.index[j]; objX.index[j] = objX.index[i]; objX.index[i] = k;}                            
                    }    
                    break;
            case 3: {str = $get('lblChange').innerHTML;
                    objX.resetHeader();
                    if (str.charAt(0) == '▲') {cmp = 1; sign = '▼';}
                    $get('lblChange').innerHTML = sign + $get('lblChange').innerHTML;
                    for(i = 0; i < objX.aStockInfo.length-1; i++)
                        for(j = i+1; j < objX.aStockInfo.length; j++)
                            if ((objX.aStockInfo[objX.index[i]].changePrice - objX.aStockInfo[objX.index[j]].changePrice)*cmp > 0)
                                {k = objX.index[j]; objX.index[j] = objX.index[i]; objX.index[i] = k;}                            
                    }    
                    break;
            case 4: {str = $get('lblForeign').innerHTML;
                    objX.resetHeader();
                    if (str.charAt(0) == '▲') {cmp = 1; sign = '▼';}
                    $get('lblForeign').innerHTML = sign + $get('lblForeign').innerHTML;
                    for(i = 0; i < objX.aStockInfo.length-1; i++)
                        for(j = i+1; j < objX.aStockInfo.length; j++)
                            if (objX.aStockInfo[objX.index[i]].foreignBuyVolume != undefined && objX.aStockInfo[objX.index[j]].foreignBuyVolume != undefined)
                            if ((objX.aStockInfo[objX.index[i]].foreignBuyVolume - objX.aStockInfo[objX.index[j]].foreignBuyVolume)*cmp > 0)
                                {k = objX.index[j]; objX.index[j] = objX.index[i]; objX.index[i] = k;}                            
                    }    
                    break;
            default:
                    break; 
        }        
        objX.reSortTable();
    },
    reSortTable: function()
    {       
        for(i = 0; i < objX.aStockInfo.length; i++)
        {            
            var record = objX.aStockInfo[objX.index[i]];
            row = objX.otblStockInfo.rows[i];            
            var reflectingColor = objX.findPriceColorName(record.lastPrice, record);
            var trendingSign = objX.findPriceTrendingSign(record.lastPrice, record);            
            row.cells[objX.STOCK_SYMBOL_IDX].innerHTML = record.StockSymbol;
            row.cells[objX.STOCK_SYMBOL_IDX].style.color = reflectingColor;
            if(record.lastVolume!=undefined&&record.lastVolume!=0)row.cells[objX.VOLUME_IDX].innerHTML = objX.numToStringWithDgtGrp(record.lastVolume/10);
            else row.cells[objX.VOLUME_IDX].innerHTML = '&nbsp;';
            row.cells[objX.VOLUME_IDX].style.color = reflectingColor;
            row.cells[objX.STOCK_SYMBOL_IDX].style.color = reflectingColor;            
            row.cells[objX.CHANGE_IDX].style.color = reflectingColor;            
            row.cells[objX.CHANGE_IDX].innerHTML =  record.changePrice + trendingSign;  
            row.cells[objX.PRICE_IDX].style.color = reflectingColor;
            if(record.lastPrice!=undefined&&record.lastPrice!=0)row.cells[objX.PRICE_IDX].innerHTML = objX.numToStringWithDgtGrp(record.lastPrice/1000);  
            else row.cells[objX.PRICE_IDX].innerHTML = '&nbsp;';
            if(record.foreignBuyVolume!=undefined&&record.foreignBuyVolume!=0)row.cells[objX.FOREIGN_IDX].innerHTML = objX.numToStringWithDgtGrp(record.foreignBuyVolume/10);            
            else row.cells[objX.FOREIGN_IDX].innerHTML = '&nbsp;';
            row.onmouseover = objX.onRowFocused;
            row.onmouseout = objX.onRowUnfocused;
            record.TableRow = row;
        }
    },
    onGetMktInfoComplete: function(arg)
    {
        var record = objX.mktInfoDataParse(arg.MarketUpdated);
        if(record.marketIndex != undefined && record.indexChange != undefined)
        {
            if(record.marketIndex != undefined)
                objX.mktRecord.marketIndex = record.marketIndex;
            if(record.indexChange != undefined)
                objX.mktRecord.indexChange = record.indexChange;
            var changePecent = (objX.mktRecord.indexChange*100/(objX.mktRecord.marketIndex - objX.mktRecord.indexChange)).toFixed(2);                                
            var sign;
            if (objX.mktRecord.indexChange>0)
            {
                objX.otxtVNIndex.style.color = objX.UpColor;
                sign = '▲';
            } else  
            if (objX.mktRecord.indexChange<0)
            {
                objX.otxtVNIndex.style.color = objX.DownColor;
                sign = '▼';
            } else
            {
                objX.otxtVNIndex.style.color = objX.NoChangeColor;
                sign = '';
            }
            
            objX.otxtVNIndex.innerHTML = objX.numToStringWithDgtGrp(objX.mktRecord.marketIndex) + sign + '(' + objX.numToStringWithDgtGrp(objX.mktRecord.indexChange) + ';' + objX.numToStringWithDgtGrp(changePecent) + '%)';
            if(objX.infoDataVersion != 0)
            {
                objX.changedCells.push(objX.otxtVNIndex);
                objX.otxtVNIndex.style.backgroundColor = objX.UpdatedColor;
            }    
        }
    },
    updateStockInfoRow: function(newRecord, oldRecord)
    {        
        var row = oldRecord.TableRow;
        if (oldRecord.changePrice == undefined) oldRecord.changePrice = 0;
        if(newRecord.referencePrice != undefined)
        {
            oldRecord.referencePrice = newRecord.referencePrice;                                
        }
        if(newRecord.floorPrice != undefined)
        {
            oldRecord.floorPrice = newRecord.floorPrice;         
        }
        if(newRecord.ceilingPrice != undefined)
        {
            oldRecord.ceilingPrice = newRecord.ceilingPrice;         
        }
        if(newRecord.lastVolume != undefined)
        {
            if(newRecord.lastVolume != 0)
            {
                oldRecord.lastVolume = newRecord.lastVolume;
                cell = row.cells[objX.VOLUME_IDX];
                cell.innerHTML = objX.numToStringWithDgtGrp(oldRecord.lastVolume/10);
                if (objX.infoDataVersion!=0)
                {
                    objX.changedCells.push(cell);
                    cell.style.fontWeight = 'bold';
                    cell.style.backgroundColor = objX.UpdatedColor;
                }   
            }    
        }                
        if(newRecord.lastPrice != undefined)
        {   
            if(newRecord.lastPrice != 0)
            {
                oldRecord.lastPrice = newRecord.lastPrice;
                var reflectingColor = objX.findPriceColorName(oldRecord.lastPrice, oldRecord);
                cell = row.cells[objX.PRICE_IDX];
                cell.style.color = reflectingColor;
                cell.innerHTML = objX.numToStringWithDgtGrp(oldRecord.lastPrice/1000);
                if (objX.infoDataVersion!=0)
                {
                    cell.style.fontWeight = 'bold';
                    objX.changedCells.push(cell);
                    cell.style.backgroundColor = objX.UpdatedColor;
                }                   
                row.cells[objX.STOCK_SYMBOL_IDX].style.color = reflectingColor;            
                var trendingSign = objX.findPriceTrendingSign(oldRecord.lastPrice, oldRecord);                
                
                cell = row.cells[objX.CHANGE_IDX];                
                oldRecord.changePrice = (oldRecord.lastPrice - oldRecord.referencePrice)/1000;
                cell.style.color = reflectingColor;
                cell.innerHTML = oldRecord.changePrice + trendingSign;                
                if (objX.infoDataVersion!=0)
                {
                    cell.style.fontWeight = 'bold';
                    objX.changedCells.push(cell);
                    cell.style.backgroundColor = objX.UpdatedColor;
                }                  
            }
            else
            {
                row.cells[objX.PRICE_IDX].innerHTML = '&nbsp;';
                row.cells[objX.CHANGE_IDX].innerHTML = '&nbsp;';
                row.cells[objX.VOLUME_IDX].innerHTML = '&nbsp;';
            }
            row.cells[objX.VOLUME_IDX].style.color = reflectingColor;            
        }
        if (newRecord.foreignBuyVolume != undefined)
        {
            if (newRecord.foreignBuyVolume != 0)
            
            {
                oldRecord.foreignBuyVolume = newRecord.foreignBuyVolume;
                cell = row.cells[objX.FOREIGN_IDX];
                cell.innerHTML = objX.numToStringWithDgtGrp(oldRecord.foreignBuyVolume/10);
                if (objX.infoDataVersion!=0)
                {
                    cell.style.fontWeight = 'bold';
                    objX.changedCells.push(cell);
                    cell.style.backgroundColor = objX.UpdatedColor;
                }             
            }
        }        
    }    
}
var objX = new CFFrame();
var cfObj = objX;
objX.init();