var sep_att = '*';
var sep_cell = '$';
var sep_row = '@';
var sep_content = '!!';

var arrStock;
var arrMarket;
var strHeader;

var isBusy = false;
var hAJAX = 0;
var interval = 5000;
var firstRun = true;
var rowCount = 0;

/* Interface function */
function start() {
    firstRun = true;
    request();
}

function stop() {
    clearTimer();
}
/***************************/


function setTimer() {
    clearTimer();
    hAJAX = setInterval('request()', interval);
}

function clearTimer() {
    if (hAJAX > 0) clearInterval(hAJAX);
}

function request() {
    try {
        logInfo('BEGIN','request');
        clearTimer();
        
        newAJAX();
        if (!ajaxObject) {
            return;
        }
        
        if (isBusy) {
            ajaxObject.onreadystatechange = null;
            stopAJAX();
        }
        
        ajaxObject.onreadystatechange = populateData;
        var method = (isIE?'POST':'GET');
        ajaxObject.open(method, 'Data.aspx?s=' + se + '&key=' + key, true);
        ajaxObject.send(null);
        isBusy = true;
        
        logInfo('END  ','request');
    }
    catch (err) {logInfo('request', err);}
}

function populateData() {
    try {
        if (ajaxObject.readyState != 4)
            return;
        isBusy = false;
        var ajaxData = ajaxObject.responseText;
        
        if (ajaxData && ajaxData.length > 0) {
            var arrTemp = ajaxData.split(sep_content);
            arrMarket = arrTemp[0].split(sep_row);
            strHeader = arrTemp[1];
            if (!arrTemp[2] || arrTemp[2].length == 0)
                arrStock = null;
            else {
                var arrTemp2 = arrTemp[2].split(sep_row);
                arrStock = new Array(arrTemp2.length);
                for (var i=0; i<arrStock.length; i++) {
                    arrStock[i] = arrTemp2[i].split(sep_cell);
                }
            }
        }
        
        updateMarketInfo(arrMarket); /* Market data */
        if (firstRun) updateStockHeader(strHeader); /* Stock Header is duplicated */
        updateStockInfo();
        updateStockHeader(strHeader); /* Stock Header */
        firstRun = false;
        showObj('loadingBar', false);
    } catch(err) {logInfo('populateData', err + '<br>' + ajaxData);}
    finally {setTimer();}
}

/* Very good performance for generating StockInfo
 for both IE & FF (sonpm@cis.com.vn) */
function updateStockInfo() {
    try {
        logInfo('- BEGIN ','updateStockInfo');
        var table = getRef('StockContent');
        if (!table) return;
        
        var strContent = '';
        
        if (arrStock) {
            var maxRow = arrStock.length;
            var maxCol = arrStock[0].length/2;
            
            for (var i=0; i<maxRow; i++) {
                strContent +='<tr onmouseover="javascript:rMOver(this);" onmouseout="javascript:rMOut(this);">';
                for (var j=0; j<maxCol; j++) {
                    strContent+='<td class=' + arrStock[i][2*j+1] + '>' + arrStock[i][2*j] + '</td>';
                }
                strContent +='</tr>';
            }
        }
        else strContent = '';
        
        table.innerHTML = '<table class=SSTable>' + getRef('StockInfoTable').innerHTML + strContent + '</table>';
    
        logInfo('- END   ','updateStockInfo');
    } catch(err) {logInfo('updateStockInfo', err);}
}

function updateMarketInfo(marketData) {
    try {
        if (se == 'HOSE') {
            for (var i=0; i<3;i++) {
                updateSession(i+1, arrMarket[i]);
            }
        } else {
            var arrSessionCell = marketData[0].split(sep_cell);
            updateSessionCell(1, 'mIndex', arrSessionCell[0]);
            updateSessionCell(1, 'mIndexChange', arrSessionCell[1]);
            updateSessionCell(1, 'mTrade', arrSessionCell[2]);
            updateSessionCell(1, 'mShare', arrSessionCell[3]);
            updateSessionCell(1, 'mVal', arrSessionCell[4]);
        }
    } catch (err) {logInfo('updateMarketInfo', err);}
}

function updateSession(session, sessionData) {
    var arrSessionCell = sessionData.split(sep_cell);
    updateSessionCell(session, 'mIndex', arrSessionCell[0]);
    updateSessionCell(session, 'mIndexChange', arrSessionCell[1]);
    updateSessionCell(session, 'mIndexPercent', arrSessionCell[2]);
    updateSessionCell(session, 'mTrade', arrSessionCell[3]);
    updateSessionCell(session, 'mShare', arrSessionCell[4]);
    updateSessionCell(session, 'mVal', arrSessionCell[5]);
}

function updateSessionCell(session, ref, cellData) {
    var arrAtt = cellData.split(sep_att);
    getRef(ref + session).className = arrAtt[1];
    getRef(ref + session).innerHTML = arrAtt[0];
}

function updateStockHeader(data) {
    try {
        var arrHeader = data.split(sep_cell);
        getRef('hB').innerHTML = arrHeader[0];
        getRef('hSession').innerHTML = arrHeader[1];
        getRef('hS').innerHTML = arrHeader[2];
    } catch (err) {logInfo('updateStockHeader', err);}
}
