var args = {
	"type": "report",
	"title": "RAM",
	"dataset" : "(|ContrName|) (|EndDate|) (|Structure|StruName|) (|Unit|UnitName|)",
	"sql" : [
		{
		"query": "select e.ElemID, WbsNum, ProjOff, ObsNum from Element e
		inner join altelem ra on e.ElemID = ra.ElemID
		inner join Contract c on e.ContrID = c.ContrID
		inner join Period p on c.ContrID = p.ContrID
		where p.PeriodID = cd_id
		and ra.StruID = st_id and ra.RptElem >= 0
		and ElemType in (CaSym, SlppSym) order by e.FilterHier",
		"format": ["", "", "", ""]
		},
		{
		"query": "select e.ElemID, Bac, Bac BacNum from Element e
		inner join altelem ra on e.ElemID = ra.ElemID
		inner join EarnedValue ev on ra.ElemID = ev.ElemID
		inner join Contract c on e.ContrID = c.ContrID
		where PeriodID = cd_id and UnitID = un_id and ra.StruID = st_id
		and ElemType in (CaSym, SlppSym) order by e.FilterHier",
		"format": ["", "cdd", "ndd"]
		},
		{
		"query": "select distinct ObsNum from Element e
		inner join altelem ra on e.ElemID = ra.ElemID
		inner join Contract c on e.ContrID = c.ContrID
		inner join Period p on c.ContrID = p.ContrID
		where PeriodID = cd_id
		and WbsNum <> '[PMB]' and WbsNum <> '[Unlinked Tasks]'
		and ElemType in (CaSym, SlppSym)
		and ra.StruID = st_id order by ObsNum",
		"format": ["", "", ""]
		},
	],
};

(function() {
	"use strict";
	var em = [],
		s, i, ilen, j, jlen, val, val2, llen, check, str, res, bacval, cls,
		scale = extra.scale, decpl = scale.dd, gtotal,
		caarr = args.sql[0], evarr = args.sql[1], obsarr = args.sql[2];

	llen = obsarr.length;
	em.push('<div class="rpt">');
	em.push('<div class="rtitle">');
	s = extra.title;
	if (args.sync && extra.pf && extra.pf.length) {
		s = s + ' (' + extra.pf + ')';
	}
	em.push(s);
	em.push('<br>');
	s = args.title + ' Report';
	em.push(s);

	var evdata = {};
	for( i = 0, ilen = caarr.length; i < ilen; i++ ) {
		check = 0;
		val = caarr[i];
		for( j = 0, jlen = evarr.length; j < jlen; j++ ) {
			val2 = evarr[j];
			if( val[0] === val2[0] ) {
				evdata[val[0]] = { "WbsNum": val[1], "ObsNum": val[3], "ProjOff": val[2], "Bac": val2[1], "BacNum": val2[2] };
				check = 1;
			}
		}
		if( !check ) {
			evdata[val[0]] = { "WbsNum": val[1], "ObsNum": val[3], "ProjOff": val[2], "BacNum": 0 };
		}
	}

	em.push('</div><p><table class="rpt" style="border-top: 0 solid black">');

	var obstotals = {}, sval;
	em.push('<tr>');
	s = '<td class="rpt ral rcgr2 rtb" style="position: sticky;top: 0">CONTROL ACCOUNT</td><td class="rpt ral rcgr2 rtb" style="position: sticky;top: 0">CAM</td>';
	em.push(s);
	for( i = 0, ilen = llen; i < ilen; i++ ) {
		val = obsarr[i][0];
		sval = (val) ? val : '';
		s = '<td class="rpt rar rcgr2 rtb" style="position: sticky;top: 0">' + sval + '</td>';
		em.push(s);
		obstotals[val] = 0;
	}
	s = '<td class="rpt rar rcgr2 rtb" style="position: sticky;top: 0">TOTAL</td>';
	em.push(s);
	em.push('</tr>');

	gtotal = 0;
	for( j = 0, jlen = caarr.length; j < jlen; j++ ) {
		check = 0;
		em.push('<tr>');
		val = evdata[caarr[j][0]];
		bacval = ( val["Bac"] && val["Bac"] != 0 ) ? val["Bac"] : '';
		cls = (j % 2 == 0) ? '' : 'rcgr0';

		em.push('<td class="rpt ral rnw ' + cls + '">' + val["WbsNum"] + '</td>');
		sval = (val["ProjOff"]) ? val["ProjOff"] : '';
		em.push('<td class="rpt ral ' + cls + '">' + sval + '</td>');

		for( i = 0, ilen = llen; i < ilen; i++ ) {
			res = val["ObsNum"];

			if( res === obsarr[i][0] ) {
				em.push('<td class="rpt rar ' + cls + '">' + bacval + '</td>');
				check = 1;
				obstotals[res] += +val["BacNum"];
			}
			else {
				em.push('<td class="rpt rar ' + cls + '"></td>');
			}
		}
		gtotal += +val["BacNum"];
		em.push('<td class="rpt rar rcb0">' + bacval + '</td>');
		em.push('</tr>');
	}

	em.push('<tr>');
	em.push('<td class="rpt ral rcb0 rtb">GRAND TOTAL</td>');
	em.push('<td class="rpt ral rcb0 rtb"></td>');

	for( i = 0, ilen = llen; i < ilen; i++ ) {
		val = obsarr[i][0];
		var t = dtostr(obstotals[val], decpl);
		em.push('<td class="rpt ral rcb0 rtb">' + t + '</td>');
	}

	var n = dtostr(gtotal, decpl);
	em.push('<td class="rpt rar rcb0 rtb">' + n + '</td>');
	em.push('</tr>');
	
	em.push('</table>');
	em.push('</div>');
	return em.join('');
})();
