/*
SYNOPSIS:
var graphdata = {
  series: new Array(
    // color: RRGGBB color for the series.
    // value: the name of the value field in the dataset (see 'data' array below)
    // name: label of the series.
    {color:'9DDC25', value:'v', name:'Page views'},
    {color:'557A0B', value:'u', name:'Visitors'}
  ),
  data: new Array(
    // v and u: values for the series specified above
    // s ans l: short and long labels 
    {v:11950211, u:3451624, s:'40', l:'week 40 2007'},
    {v:11064591, u:3196874, s:'41', l:'week 41 2007'},
    {v:10968618, u:3242922, s:'42', l:'week 42 2007'},
    {v:9624487,  u:3055299, s:'43', l:'week 43 2007'},
    {v:10547106, u:3265681, s:'44', l:'week 44 2007'},
    {v:10091999, u:3246925, s:'45', l:'week 45 2007'},
    {v:9715985,  u:3268493, s:'46', l:'week 46 2007'}
  )
};

// Update graph: show graphdata in graph_div (the element with id="graph_div");
// show 'v' series, but neither 'u' series nor trendline:
updateGraph('graph_div', graphdata, {v:1, u:0});

// Update graph: show graphdata in graph_div;
//  show 'v' and 'u' series; calculate and show 'v' trend:
calculateTrendlines(graphdata);
updateGraph('graph_div', graphdata, {v:1, u:1, v_trend:1});

// show both trendlines:
updateGraph('graph_div', graphdata, {v:1, u:1, v_trend:1, u_trend:1});


*/
function updateGraph(divid, graphdata, enabledSeries, options)
{
  var legend = 1;
  var swfurl = "/FusionChartsFree/Charts/FCF_MSColumn2DLineDY.swf";
  var width = 702;
  var height = 200;
  var caption = '';
  var maxN = 0;
  var margin = 15;
  var xAxisName = '';
  if (options) {
    if (options.maxN) maxN = options.maxN;
    if (options.swfserver) swfurl = options.swfserver + swfurl;
    if (options.width) width = options.width;
    if (options.height) height = options.height;
    if (options.legend) legend = options.legend == 'yes' ? 1 : 0;
    if (options.margin||0===options.margin) margin = options.margin;
    if (options.xAxisName) xAxisName = options.xAxisName;
//    if (options.caption) caption = "caption='"+options.caption+"' ";
  }
  
  // Generate "categories", i.e. list of x-values
  var firstN = 0;
  if (maxN && maxN<=graphdata.data.length) firstN=graphdata.data.length-maxN;
  var categories = '<categories>';
  for (var i=firstN; i<graphdata.data.length; ++i) {
    var data = graphdata.data[i];
    categories += "<category name='"+data.s+"' hoverText='"+data.l+"' />\n";
  }
  categories += '</categories>';

  // Generate "dataset" for each series (+trendlines)
  var datasets = '';
  var max = 0;

  // Primary sets
  for (var n=0; n<graphdata.series.length; ++n) {
    var series = graphdata.series[n];
    
    if (enabledSeries && !enabledSeries[series.value]) {
      // skip disabled series
      continue;
    }
    
    datasets += "<dataset seriesname='"+series.name+"' showValues='0' color='"+series.color+"' parentYAxis='P'>";
    for (var i=firstN; i<graphdata.data.length; ++i) {
      var datum = graphdata.data[i][series.value];
      datasets += "<set value='"+datum+"' />\n";
      if (datum>max) max = datum;
    }
    datasets += "</dataset>";
  }
  
  // Secondary sets (trendlines)
  for (var n=0; n<graphdata.series.length; ++n) {
    var series = graphdata.series[n];
    
    if (enabledSeries && (!enabledSeries[series.value] || !enabledSeries[series.value+'_trend'])) {
      // skip disabled series
      continue;
    }
    
    datasets += "<dataset showAnchors='0' seriesname='"+series.name+" (trend)' showValues='0' color='337733' parentYAxis='S'>";
    for (var i=firstN; i<graphdata.data.length; ++i) {
      var datum = graphdata.data[i][series.value+'_trend'];
      datasets += "<set value='"+datum+"' />\n";
      if (datum>max) max = datum;
    }
    datasets += "</dataset>";
  }
  
  // Round up max to two significant digits (e.g. 1234567 becomes 1300000, 999 becomes 1000);
  // if this is less than 10, max is set to 10.
  var ml = Math.floor(Math.log(max)/Math.LN10)-1;
  var mm = ml > 0 ? ml : 1;
  mm = Math.round(Math.exp(mm*Math.LN10));
  max = Math.ceil(max/mm)*mm;
  if (max<10) max = 10; // covers cases where max=0, which should be the only case where max<10;

  var xml = 
    "<graph "+caption+" baseFont='Arial' shownames='1' showShadow='0' "+
    "xAxisName='"+xAxisName+"' PYAxisName='' SYAxisName='' "+
    "showvalues='0' showLegend='"+legend+"' rotateNames='1' formatNumberScale='0' "+
    "decimalPrecision='0' limitsDecimalPrecision='0' divLineDecimalPrecision='0' "+
    "showColumnShadow='1' PYAxisMaxValue='"+max+"' SYAxisMaxValue='"+max+"' "+
    "chartTopMargin='"+(margin+10)+"' chartBottomMargin='"+margin+"' "+
    "chartLeftMargin='"+margin+"' chartRightMargin='"+margin+"' "+
    "formatNumber='0' animation='1' hoverCapSepChar=': '>" +
    categories +
    datasets + 
    "</graph>";

  var chart = new FusionCharts(swfurl, divid+"_chart", width, height);
  chart.setDataXML(xml);
  chart.render(divid);
}

/*
Calculate trend lines (moving average) for the specified traffic data.
The trend lines become named after the series they are derived from with a '_trend' postfix.
*/
function calculateTrendlines(traffic, movingAverageRadius)
{
  for (var n=0; n<traffic.series.length; ++n) {
    var series = traffic.series[n];
    var trend  = series.value + '_trend';

    var d = movingAverageRadius; // N*2+1 sample moving average
    if (! d>0) d = 3;            // default is 7-sample moving average
    for (var i=0; i<traffic.data.length; ++i) {
      var total = 0;
      var start = i-d;
      var end   = i+d;
      if (end>=traffic.data.length) end = traffic.data.length - 1;
      if (start<0) start = 0;
      for (var j=start; j<=end; ++j) {
        var mult = 1;
	if (j==traffic.data.length-1 && series.trend_last_mult) {
	  mult = series.trend_last_mult;
	}
        total += mult * traffic.data[j][series.value];
      }
      traffic.data[i][trend] = Math.ceil((end>start) ? total/(end-start+1) : 0);
    }
  }
}


