var args = {
	"type": "report",
	"title": "Control Account Plan",
	"sql" : [
		"select ElemID, WbsNum, ElemDesc, ElemType, Evm from Element e where
			(ParentID = ce_id or e.ElemID = ce_id) order by FilterHier",
		"select u.UnitID, UnitName from Unit u inner join ContrUnit cu on u.UnitID = cu.UnitID inner join
		Period on Period.ContrID = cu.ContrID where Period.PeriodID = cd_id and (u.UnitID in (1, 2) or cu.EocType = 1)
		order by u.RptSeq",
		{
		"query": "select Element.ElemID, UnitID, EndDate FDate, EndDate, BcwsCur, BcwpCur, AcwpCur from EarnedValue
			inner join Element on Element.ElemID = EarnedValue.ElemID
			inner join Period on Period.PeriodID = EarnedValue.PeriodID
			where (ParentID = ce_id or Element.ElemID = ce_id)
			and EndDate <= (select EndDate from Period where PeriodID = cd_id)
			order by FilterHier, UnitID, EndDate",
		"format": ["", "", "fmt", "", "ndd", "ndd", "ndd"]
		},
		{
		"query": "select e.ElemID, f.UnitID, f.EndDate FDate, f.EndDate, Bcws, Etc
			from FutureEtc f inner join Element e on e.ElemID = f.ElemID
			inner join Period on Period.PeriodID = f.PeriodID
			where (ParentID = ce_id or f.ElemID = ce_id) and f.PeriodID = cd_id and
			f.EndDate > (select EndDate from Period where PeriodID = cd_id)
			order by e.FilterHier, f.UnitID, f.EndDate",
		"format": ["", "", "fmt", "", "ndd", "ndd"]
		},
		{
		"query": "
			with q as (
				select ElemID from Element where ParentID = ce_id or ElemID = ce_id
			),
			u as (
				select min(EndDate) MinDate from Period inner join EarnedValue on Period.PeriodID = EarnedValue.PeriodID
				inner join q on q.ElemID = EarnedValue.ElemID where UnitID = 1
			),
			v as (
				select EndDate from Period inner join EarnedValue on Period.PeriodID = EarnedValue.PeriodID
				inner join q on q.ElemID = EarnedValue.ElemID
				where UnitID = 1 and EndDate <= (select EndDate from Period where PeriodID = cd_id)
			),
			w as (
				select EndDate as EndDate from FutureEtc inner join q on q.ElemID = FutureEtc.ElemID where PeriodID = cd_id and UnitID = 1
				UNION select EndDate as EndDate from v
			),
			x as (
				select max(EndDate) MaxDate from w
			)
			select cd.EndDate FDate, cd.EndDate from CalendarDet cd inner join Contract c on cd.CalID = c.CalID
			inner join Period p on c.ContrID = p.ContrID
			where p.PeriodID = cd_id and cd.EndDate >= (select MinDate from u)
			and cd.EndDate <= (select MaxDate from x)
			order by cd.EndDate",
		"format": ["fmt", ""]
		},
		"select EndDate from Period where PeriodID = cd_id",
		"select Element.ElemID, UnitID, BcwsCum, BcwpCum, AcwpCum, Bac, Lre from EarnedValue
		inner join Element on EarnedValue.ElemID = Element.ElemID
		where PeriodID = cd_id and (ParentID = ce_id or Element.ElemID = ce_id)"
	]
};

(function() {
	"use strict";
	var em = [],
		s, t = '', i, ilen, j, jlen, val, k, klen, l, check, key, curstyle, curstyle2, curper, bkgr, col,
		scale = extra.scale, elid, unid, uname, first, p,
		decpl = scale.dd,
		earr = args.sql[0], uarr = args.sql[1], evarr = args.sql[2],
		farr = args.sql[3], carr = args.sql[4], perarr = args.sql[5], tarr = args.sql[6];

	var bstyle = 'border-bottom:2px solid lightgray;padding:5px';
	var lstyle = 'border-left:1px solid lightgray;padding:5px;text-align:left';
	var rstyle = 'padding:5px;text-align:left';
	var rlstyle = ';border-right:1px solid lightgray;text-align:right';

	var names = ["BCWS", "BCWP", "ACWP", "ETC"];

	var adata = [], evdata = {}, tdata = {};

	var searchall = function(val) {
		return val === '&nbsp;';
	};

	for( i = 0, ilen = earr.length; i < ilen; i++ ) {
		for( j = 0, jlen = uarr.length; j < jlen; j++ ) {
			evdata[earr[i][0] + '.' + uarr[j][0]] = { "BCWS": [], "BCWP": [], "ACWP": [], "ETC": [] };
		}
	}

	for( i = 0, ilen = tarr.length; i < ilen; i++ ) {
		tdata[tarr[i][0] + '.' + tarr[i][1]] = { "BCWS": tarr[i][2], "BCWP": tarr[i][3], "ACWP": tarr[i][4], "BAC": tarr[i][5], "EAC": tarr[i][6] };
	}

	Object.keys(evdata).forEach(function (key) {
		for( j = 0, jlen = carr.length; j < jlen; j++ ) {
			evdata[key]["BCWS"].push('&nbsp;');
			evdata[key]["BCWP"].push('&nbsp;');
			evdata[key]["ACWP"].push('&nbsp;');
			evdata[key]["ETC"].push('&nbsp;');
		}	
	});

	var ncols = +carr.length + 4, test = {};	

	for( j = 0, jlen = carr.length; j < jlen; j++ ) {
		check = 0;
		if( carr[j][1] === perarr[0][0] ) {
			curper = j;
		}

		if( carr[j][1] <= perarr[0][0]) {
			for( i = 0, ilen = evarr.length; i < ilen; i++ ) {
				key = evarr[i][0] + '.' + evarr[i][1];

				if( evarr[i][2] === carr[j][0] && evdata[key] ) {
					evdata[key]["BCWS"][j] = dtostr(evarr[i][4], decpl);
					evdata[key]["BCWP"][j] = dtostr(evarr[i][5], decpl);
					evdata[key]["ACWP"][j] = dtostr(evarr[i][6], decpl);
					test[evarr[i][0]] = 1;
					check = 1;
				}
			}
		}
		else if( carr[j][1] > perarr[0][0] ) {
			for( i = 0, ilen = farr.length; i < ilen; i++ ) {
				key = farr[i][0] + '.' + farr[i][1];

				if( farr[i][2] === carr[j][0] && evdata[key] ) {
					evdata[key]["BCWS"][j] = dtostr(farr[i][4], decpl);
					evdata[key]["ETC"][j] = dtostr(farr[i][5], decpl);
					test[farr[i][0]] = 1;
					check = 1;
				}
			}
		}
	}

	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;
	if (extra.scale.text.length) {
		s = s + ' (' + extra.scale.text + ')';
	}
	em.push(s);
	em.push('</div><p><table class="rpt">');

	for( i = 0, ilen = earr.length; i < ilen; i++ ) {
		em.push('<tr>');
		val = earr[i];
			if( !test[val[0]] ) {
				continue;
			}
		elid = val[0];
		val[2] = val[2] ? val[2] : '&nbsp;';
		val[3] = val[3] ? val[3] : '&nbsp;';
		val[4] = val[4] ? val[4] : '&nbsp;';

		s = '<td class="rpt ral rcgr1 rtb">' + val[1] + ' ' + val[2] + '</td>';
		em.push(s);

		s = '<td class="rpt ral rcgr1 rtb">' + val[3] + '</td>' + '<td class="rpt ral rcgr1 rtb">' + val[4] + '</td>';
		em.push(s);

		for( j = 0, jlen = carr.length; j < jlen; j++ ) {
			em.push('<td class="rpt rar rcgr1 rtb" style="white-space:nowrap">' + carr[j][0] + '</td>');
		}

		s = '<td class="rpt rac rcgr1 rtb">CTD</td><td class="rpt rac rcgr1 rtb" >Total</td>';
		em.push(s);
		em.push('</tr>');

		for( j = 0, jlen = uarr.length; j < jlen; j++ ) {
			curstyle = 'border-bottom:none';

			bkgr = '';
			if( j%2 != 0 ) {
				bkgr = 'background-color: #edf3fd;';
			}

			unid = uarr[j][0];
			
			key = elid + '.' + unid;

			first = 0;
			p = '';
			for( l = names.length-1; l >= 0; l-- ) {
				adata = evdata[key][names[l]];
				if( adata.every(searchall) ) {
					continue;
				}

				if( !first ) {
					curstyle = bstyle;
					first = 1;
				}
				uname = (l === 0) ? uarr[j][1] : '';

				t = '<tr>';
				t += '<td style="' + curstyle + ';' + lstyle + ';padding 5px;text-align:right">' + uname + '</td>';
				t += '<td style="'+ curstyle + ';border-right:1px solid lightgray;padding:5px;text-align:right">' + names[l] + '</td>';
				t += '<td style="' + curstyle + ';border-right:1px solid lightgray;padding:5px"></td>';
				for( k = 0, klen = adata.length; k < klen; k++ ) {
					curstyle2 = curstyle;
					if( k === klen - 1 ) {
						curstyle2 += rlstyle;
					}
					if( k === curper ) {
						curstyle2 += ';border-right:1px solid red';
					}
					t += '<td style="'+ bkgr + curstyle2 + ';padding:5px;text-align:right">' + adata[k] + '</td>';
				}

				if( tdata[key] ) {
					adata = tdata[key][names[l]] ? dtostr(tdata[key][names[l]], decpl) : '&nbsp;';
					t += '<td style="'+ bkgr + curstyle + ';padding:5px;text-align:right">' + adata + '</td>';
					adata = '&nbsp;';

					if( names[l] === 'BCWS' ) {
						adata = tdata[key]['BAC'] ? dtostr(tdata[key]['BAC'], decpl) : '&nbsp;';
					}
					else if( names[l] === 'ETC' ) {
						adata = tdata[key]['EAC'] ? dtostr(tdata[key]['EAC'], decpl) : '&nbsp;';
					}
					t += '<td style="'+ bkgr + curstyle + ';padding:5px' + rlstyle + '">' + adata + '</td>';
				}
				else {
					t += '<td style="' + bkgr + curstyle + '"></td>';
					t += '<td style="'+ bkgr + curstyle + ';padding:5px' + rlstyle + '"></td>';
				}

				t += '</tr>';
				p = t + p;
				curstyle = 'border-bottom:none';
			}
			if( p != '' ) {	
				em.push(p);
			}
			p = '';
		}
	}
	
	em.push('</table>');
	em.push('</div>');
	return em.join('');
})();
