function displayWatchList (tbl, symbol, lprice, hprice, cprice,
                         shares, prev_price, prev_vol) {
    var row = tbl.insertRow(tbl.rows.length);
    var classColor='';

    // no volume and price, skip display!!!
    if ((shares == 0) && !IsNumber(cprice)) {
        return;
    }
    
    if (tbl.rows.length%2==0) {
        classColor = 'Color';
    }

    var i=0;
    // symbol
    var cell = row.insertCell(i++);
    cell.appendChild(document.createTextNode(symbol));
    cell.className = 'center'+classColor;

    // lprice
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(lprice));

    // hprice
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(hprice));

    // cprice
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(cprice));

    // shares
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(shares));

    if (prev_price == 0) {
        return;
    }
    // prev price
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(prev_price));

    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    var color, diff = cprice-prev_price;
    if (diff < 0) {
        color = 'red';
    } else {
        color = 'green';
    }
    cell.style.color = color;
    cell.appendChild(document.createTextNode(formatFloat(diff)));

    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.style.color = color;
    cell.appendChild(document.createTextNode(formatFloat((diff/prev_price)*100)+'%'));

    diff = shares - prev_vol;
    if (diff < 0) {
        color = 'red';
    } else {
        color = 'green';
    }
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.style.color = color;
    cell.appendChild(document.createTextNode(formatFloat((diff/prev_vol)*100)+'%'));
}

function displayWatchListSummary (tbl, category, symbol, lprice, hprice,
                                  cprice, shares, prev_price, prev_vol) {
    var row = tbl.insertRow(tbl.rows.length);
    var classColor='';

    // no volume and price, skip display!!!
    if ((shares == 0) && !IsNumber(cprice)) {
        return;
    }
    
    if (tbl.rows.length%2==0) {
        classColor = 'Color';
    }

    var i=0;
    // symbol
    var cell = row.insertCell(i++);
    cell.appendChild(document.createTextNode(symbol));
    cell.className = 'center'+classColor;

    // cprice
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.appendChild(document.createTextNode(cprice));

    if ((category == 'v') || (category == 'w')) {
        // shares
        cell = row.insertCell(i++);
        cell.className = 'right'+classColor;
        cell.appendChild(document.createTextNode(shares));
    }
    
    if (prev_price == 0) {
        return;
    }

    var color, diff = cprice-prev_price;
    if (diff < 0) {
        color = 'red';
    } else {
        color = 'green';
    }

    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.style.color = color;
    cell.appendChild(document.createTextNode(formatFloat((diff/prev_price)*100)));

    diff = shares - prev_vol;
    if (diff < 0) {
        color = 'red';
    } else {
        color = 'green';
    }
    cell = row.insertCell(i++);
    cell.className = 'right'+classColor;
    cell.style.color = color;
    cell.appendChild(document.createTextNode(formatFloat((diff/prev_vol)*100)));
}

function watchListResp (req, p_arr) {
    var divId = p_arr[1];
    var category = p_arr[2];
    var num = p_arr[3];
    var resp = req.responseText.split(DELIMITER);
    var tbl, i=3;
    
    // alert(resp[0]+' '+resp[1]+' '+resp[2]);

    var asofDiv = document.getElementById('asof');
    if (asofDiv) {
        if (!asofDiv.hasChildNodes()) {
            var asof_para = document.createElement('p');
            asof_para.appendChild(document.createTextNode('* As of market close on '+resp[2]));
            asof_para.style.fontStyle = 'italic';
            asof_para.style.fontSize = '11px';
            asofDiv.appendChild(asof_para);
        }
    }
    
    if (num) {
        tbl = createTblSummary(divId, resp[2], category);
        while (resp[i]) {
            displayWatchListSummary(tbl, category, resp[i++], resp[i++], resp[i++],
                             resp[i++], resp[i++], resp[i++], resp[i++]);
        }
    } else {
        tbl = createTbl(divId, resp[2], category);
        while (resp[i]) {
            displayWatchList(tbl, resp[i++], resp[i++], resp[i++],
                             resp[i++], resp[i++], resp[i++], resp[i++]);
        }
    }

    displayPages('watchlPages', p_arr[0], resp[0], resp[1]);
}

function createTbl (divId, asof_date, category) {
    var div_elem = document.getElementById(divId);
    var tbl = document.createElement('table');
    var i=0;
    tbl.className = 'tfmtFixed';
    
    var row = tbl.insertRow(tbl.rows.length);

    var cell = row.insertCell(i++);
    cell.className = 'centerBold';
    cell.style.width = '98px';
    cell.appendChild(document.createTextNode('Symbol'));

    var cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '50px';
    cell.appendChild(document.createTextNode('Low'));
    
    var cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '50px';
    cell.appendChild(document.createTextNode('High'));

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '50px';
    cell.appendChild(document.createTextNode('Closing Price'));
    
    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '80px';
    cell.appendChild(document.createTextNode('Volume'));

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '50px';
    cell.appendChild(document.createTextNode('Prev Close'));
    
    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '60px';
    cell.appendChild(document.createTextNode('Net Change'));

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '60px';
    cell.appendChild(document.createTextNode('Price % Change'));

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '60px';
    cell.appendChild(document.createTextNode('Volume % Change  '));

    var h3hdr = document.createElement('h3');
    h3hdr.className = "center";
    var tbl_name;

    switch (category) {
      case 'v':
          tbl_name = 'Biggest Volume Change';
          break;
      case 'w':
          tbl_name = 'Most Watched Stocks by Our Members';
          break;
      case 'iup':
          tbl_name = 'Major Indices Price % Gainers *';
          break;
      case 'idw':
          tbl_name = 'Major Indices Price % Losers *';
          break;
      default:
          tbl_name = '???';
          break;
    }
    
    if (asof_date) {
        asof_date = ' as of End of'+asof_date;
    } else {
        asof_date = ' Data Unavailable';
    }
    
    h3hdr.appendChild(document.createTextNode(tbl_name));
    div_elem.appendChild(h3hdr);
    div_elem.appendChild(tbl);

    return(tbl);
}

function createTblSummary (divId, asof_date, category) {
    var div_elem = document.getElementById(divId);
    var tbl = document.createElement('table');
    var i=0;
    tbl.className = 'tfmtFixed';
    
    var row = tbl.insertRow(tbl.rows.length);

    var cell = row.insertCell(i++);
    cell.className = 'centerBold';
    if ((category == 'iup') || (category == 'idw')) {
        cell.style.width = '84px';
        cell.appendChild(document.createTextNode('Index'));
    } else {
        cell.style.width = '30px';
        cell.appendChild(document.createTextNode('Sym'));
    }


    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '40px';
    cell.appendChild(document.createTextNode('Closing Price'));

    if ((category == 'v') || (category == 'w')) {
        cell = row.insertCell(i++);
        cell.className = 'rightBold';
        cell.style.width = '54px';
        cell.appendChild(document.createTextNode('Volume'));
    }

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '34px';
    cell.appendChild(document.createTextNode('Price %chg'));

    cell = row.insertCell(i++);
    cell.className = 'rightBold';
    cell.style.width = '37px';
    cell.appendChild(document.createTextNode('Vol %chg'));

    h3hdr = document.createElement('h2');
    h3hdr.className = "center";
    var tbl_name;

    if (asof_date) {
        asof_date = ' as of End of'+asof_date;
    } else {
        asof_date = ': Data Unavailable';
    }
    switch (category) {
      case 'v':
          tbl_name = 'Biggest Volume Change';
          break;
      case 'w':
          tbl_name = 'Watch List from Our Members';
          break;
      case 'iup':
          tbl_name = 'Major Indices Price % Gainers *';
          break;
      case 'idw':
          tbl_name = 'Major Indices Price % Losers *';
          break;
          
      default:
          tbl_name = '???';
          break;
    }
    var a = document.createElement('a');
    a.setAttribute('href', 'watch_list.php?c='+category);
    a.appendChild(document.createTextNode(tbl_name));
    h3hdr.appendChild(a);
    div_elem.appendChild(h3hdr);

//    h3hdr2 = document.createElement('h2');
//    h3hdr2.className = "center";
    
//    h3hdr2.appendChild(document.createTextNode(asof_date));
//    h3hdr2.style.fontSize = '10px';

//    div_elem.appendChild(h3hdr2);
    div_elem.appendChild(tbl);

    return(tbl);
}

function watchListReq (divId, category, page, num) {
    if ((category == 'bull') || (category == 'bear')) {
        mostBullishReq (divId, category, page);
        return;
    }
    
    var url = 'watch_list_handler.php';
    var url_param = '?c='+category+'&num='+num+'&page='+page;
    var p_arr;
    
    url += url_param;
    if (document.getElementById(divId) != undefined) {
        p_arr = new Array('watch_list.php'+url_param, divId, category, num);
        xmlHttpReq(xmlHttpObj(), url, true, null, watchListResp, p_arr);
    }
}

function mostBullishReq (divId, category, page) {
    var url = 'most_bullish_handler.php';
    var data = '?c='+category+'&num='+num+'&page='+page;    
    var p_arr;
    
    url += url_param;
    p_arr = new Array('watch_list.php'+url_param, divId, category);
    xmlHttpReq(xmlHttpObj(), url, true, null, mostBullishResp, p_arr);
}

function chkMostBullish () {
    var symObj = document.getElementById("symbol");    
    if (!symObj.value) {
        alert('Symbol is missing');
        symObj.focus();
        return false;
    }
    var sentObj = document.getElementById("mb");

    if ((sentObj.value !=1) && (sentObj.value !=2)){
        alert('Bullish or Bearish? Sentiment is missing');
        sentObj.focus();
        return false;
    }

    return true;
}