/****************************************************************************************************************************

Licensed Materials - Property of IBM 
BI and PM: QFW 
� Copyright IBM Corp. 2005, 2010 
US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 

*****************************************************************************************************************************/




var G_QanReportGenerator = {};

G_QanReportGenerator.F_convertQueryToReportSpec = function( sV5Command )
{
	var v_docCommandXML = U_XML.F_LoadString( D_XmlError, sV5Command, false, true );
	
	var v_nModelPath = v_docCommandXML.selectSingleNode( "./command/*/querySet/modelPath" );
		
	var v_sReportSpec = 
'<report xmlns="http://developer.cognos.com/schemas/report/6.0/" expressionLocale="en">' +
	U_XML.F_SerializeNode( v_nModelPath ) +
	'<drillBehavior modelBasedDrillThru="true"/>' +
	'<layouts>' +
		'<layout>' +
			'<reportPages>' +
				'<page name="Page1">' +
					'<style>' +
						'<defaultStyles>' +
							'<defaultStyle refStyle="pg"/>' +
						'</defaultStyles>' +
					'</style>' +
					'<pageBody>' +
						'<style>' +
							'<defaultStyles>' +
								'<defaultStyle refStyle="pb"/>' +
							'</defaultStyles>' +
						'</style>' +
						'<contents>';
	

	var v_nQRDs = v_docCommandXML.selectNodes( "./command/*/querySet/queryResultDefinitions/queryResultDefinition" );
	
	for ( var iQRD = 0; iQRD < v_nQRDs.length; iQRD++ )
	{
		v_sReportSpec += this.f_convertQRD( v_nQRDs.item( iQRD ) );
	}

	
	v_sReportSpec += 	'</contents>' +
					'</pageBody>' +
					'<pageFooter>' +
						'<contents>';

	v_sReportSpec += 		'<HTMLItem>' +
								'<dataSource>' +
									'<staticValue>&lt;script&gt; '+
//									'debugger; ' + 
//									' document.body.onload = function() { if (parent.adjustResultViewer) parent.adjustResultViewer(window); }; ' + 
									' setTimeout( function() { if (parent.adjustResultViewer) parent.adjustResultViewer(window); }, 10 )' + 
									// ' document.body.onreadystatechange = function() { alert(\'onreadystatechange\'); }; ' + 
									' &lt;/script&gt;</staticValue>' +
								'</dataSource>' +
							'</HTMLItem>'; 
							
	v_sReportSpec += 	'</contents>' +
						'<style>' +
							'<defaultStyles>' +
								'<defaultStyle refStyle="pf"/>' +
							'</defaultStyles>' +
							'<CSS value="padding:0px"/>' +
						'</style>' +
					'</pageFooter>' +
					
				'</page>' +
			'</reportPages>' +
		'</layout>' +
	'</layouts>';

	
	var v_nQueries = v_docCommandXML.selectSingleNode( "./command/*/querySet/queries" );
	
	var v_sQueries = U_XML.F_SerializeNode( v_nQueries );
		
	v_sReportSpec += G_QanReportGenerator.f_removeQueryExtensions( v_sQueries );

	v_sReportSpec += '</report>';
	
	return v_sReportSpec;
}

G_QanReportGenerator.f_removeQueryExtensions = function( sQueries  )
{
	var v_sQuery = sQueries.replace( /\<reportMeasure[^\>]*\>/g, "" );
	v_sQuery = v_sQuery.replace( /rID=\"[^\"]\"/g, "" );
	v_sQuery = v_sQuery.replace( /orgRollupAggregate=\"[^\"]*\"/g, "" );
	return v_sQuery;
}


	
G_QanReportGenerator.f_convertQRD = function( nV5QRD )
{
	var v_nV5Edges = nV5QRD.selectNodes( "edges/edge" );
	
	if( v_nV5Edges.length == 1 )
	{
		return G_QanReportGenerator.f_convertListQRD( nV5QRD, v_nV5Edges[0] );
	}
	else
		return G_QanReportGenerator.f_convertCrosstabQRD( nV5QRD, v_nV5Edges );
}


G_QanReportGenerator.f_convertListQRD = function( nV5QRD, nV5Edge )
{
	var v_sList = 
		'<list horizontalPagination="true" name="' + 
	                  nV5QRD.getAttribute("name").F_XMLEncode() +'" refQuery="'+
	                  nV5QRD.getAttribute("refQuery").F_XMLEncode() + '">' +
			'<style>' +
				'<defaultStyles>' +
					'<defaultStyle refStyle="ls"/>' +
				'</defaultStyles>' +
				'<CSS value="border-collapse:collapse"/>' +
			'</style>';
			

	
	this.m_sListColumns = "";
	this.m_aListColumns = [];
	
	G_QanReportGenerator.f_collectListItems( nV5Edge );

	var v_nV5Valueset = nV5Edge.selectSingleNode( "edgeGroups/edgeGroup/valueSets/valueSet" );
	var v_sListGroups = "";

	if( v_nV5Valueset && v_nV5Valueset.getAttribute("refDataItem") )
	{
		v_sListGroups = "<listGroups>";
		v_sListGroups += G_QanReportGenerator.f_convertListValueset( v_nV5Valueset, 0 );
		v_sListGroups += "</listGroups>";
	}
			
	if( v_nV5Valueset )		
	{
		var v_sOverallGroup = G_QanReportGenerator.f_convertOverallHeaderAndFooter( v_nV5Valueset );
		if( v_sOverallGroup )
			v_sListGroups += "<listOverallGroup>" + v_sOverallGroup + "</listOverallGroup>";
	}

	var v_nDetailSort = nV5Edge.selectSingleNode( 
							".//edgeGroups/edgeGroup/valueSets/valueSet[not(@refDataItem)]/groupSort" )
	var v_sDetailSort = G_QanReportGenerator.f_convertGroupSort( v_nDetailSort );
	
						
	v_sList += 
			'<listColumns>' + 
				this.m_sListColumns +
			'</listColumns>' + 
			((v_sListGroups)? v_sListGroups: "") +
			v_sDetailSort +
		'</list>';


	return v_sList;
}



G_QanReportGenerator.f_generateFHItem = function( sItemName, bIsStaticValue, bIsFirstPos, iSpan, sAssociatedItems )
{
	var v_sCell = 
		"<rowCell colSpan=\"" + iSpan + "\">" +
			"<contents>" +
				"<textItem>" +
					"<dataSource>";

	if( bIsStaticValue )
		v_sCell +=		"<staticValue>" + sItemName.F_XMLEncode() + "</staticValue>";
	else
		v_sCell +=		"<dataItemValue refDataItem=\"" + sItemName.F_XMLEncode() + "\"/>";

	v_sCell +=		"</dataSource>" +
				"</textItem>" +
				sAssociatedItems + 
			"</contents>" +
			"<style>" +
				"<defaultStyles>" +
					"<defaultStyle refStyle=\"" + ( bIsFirstPos? "of": "os" ) + "\"/>" +
				"</defaultStyles>" +
			"</style>" +
		"</rowCell>";
		
	return v_sCell;
}


G_QanReportGenerator.f_generateAssociatedColumn = function( sItemName )
{
	var v_sAsscociatedColumnBlock =		
			"<block>" +
				"<contents>" +
					"<textItem>" +
						"<dataSource>" +
							"<staticValue>" + sItemName.F_XMLEncode() + ": </staticValue>" +
						"</dataSource>" +
					"</textItem>" +
					"<textItem>" +
						"<dataSource>" +
							"<dataItemValue refDataItem=\"" + sItemName.F_XMLEncode() + "\"/>" +
						"</dataSource>" +
					"</textItem>" +
				"</contents>" +
			"</block>";
			
	return v_sAsscociatedColumnBlock;
}

G_QanReportGenerator.f_convertFooterAndHeader = function( nV5HeaderFooter, sBlockName, iGroupOrdinal, bIsOverall )
{
	if( !nV5HeaderFooter )
		return "";
	
	var v_sFooterHeader =
		"<" + sBlockName + ">" +
			"<listRows>" +
				"<listRow>" +
					"<rowCells>";
	

	var v_nlV5BlockItems = nV5HeaderFooter.selectNodes( "dataItemRef" );

	var v_aItemPositions = [];
	if( !bIsOverall )
		v_aItemPositions[0] = this.m_aListColumns[iGroupOrdinal];
		
	var v_sNotAlignedColumns = "";
	
	for( var i = 0; i < v_nlV5BlockItems.length; ++i )
	{
		var v_sItemName = v_nlV5BlockItems[i].getAttribute( "refDataItem" );
		var v_iItemIndex = this.m_aListColumns.indexOf( v_sItemName );
		if( v_iItemIndex > iGroupOrdinal )
			v_aItemPositions[v_iItemIndex-iGroupOrdinal] = v_sItemName;
	}

	for( var i = 0; i < v_nlV5BlockItems.length; ++i )
	{
		var v_sItemName = v_nlV5BlockItems[i].getAttribute( "refDataItem" );
		var v_iItemIndex = this.m_aListColumns.indexOf( v_sItemName );
		if( v_iItemIndex > iGroupOrdinal )
			continue;
			
		var v_sNonAggrName = v_sItemName.replace( /^(Aggregate|Total|Count|Average|Minimum|Maximum|Calculated)\(/i, "" );	
		var v_sNonAggrName = v_sNonAggrName.replace( /\)$/, "" );	
		var v_iItemIndex = this.m_aListColumns.indexOf( v_sNonAggrName );
		if( v_iItemIndex > iGroupOrdinal && !v_aItemPositions[v_iItemIndex-iGroupOrdinal] )
		{
			v_aItemPositions[v_iItemIndex-iGroupOrdinal] = v_sItemName;
			continue;
		}
			
		v_sNotAlignedColumns += G_QanReportGenerator.f_generateAssociatedColumn( v_sItemName );
	}

	for( var pos = 0; pos < v_aItemPositions.length; ++pos )
	{
		if( !v_aItemPositions[pos] && !( bIsOverall && pos == 0 ) )	
			continue; 
	
		for( var nextPos = pos + 1; nextPos < v_aItemPositions.length; ++nextPos )
			if( v_aItemPositions[nextPos] )
				break;
			
		if( bIsOverall && pos == 0 && !v_aItemPositions[pos] )	
		{
			v_sFooterHeader += G_QanReportGenerator.f_generateFHItem( "Summary: ", true, ( pos == 0 ),
																		nextPos - pos, 	( pos == 0 )? v_sNotAlignedColumns: "" );
			continue;
		}
																		
		v_sFooterHeader += G_QanReportGenerator.f_generateFHItem( v_aItemPositions[pos], false, ( pos == 0 ),
																		nextPos - pos, 	( pos == 0 )? v_sNotAlignedColumns: "" );
	}


	v_sFooterHeader +=
						"</rowCells>" +
					"</listRow>" +
				"</listRows>" +
			"</" + sBlockName + ">";

	return v_sFooterHeader;
} 



G_QanReportGenerator.f_convertOverallHeaderAndFooter = function( nV5Valueset )
{
	var v_sListGroup = "";

	var v_nV5Header = nV5Valueset.selectSingleNode( "groupHeader" );
	v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Header, "listHeader", 0, true ); 

	var v_nV5Footer = nV5Valueset.selectSingleNode( "groupFooter" );
	v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Footer, "listFooter", 0, true ); 
	
	return v_sListGroup;
}


G_QanReportGenerator.f_convertListValueset = function( nV5Valueset, iGroupOrdinal )
{
	var v_sItemName = nV5Valueset.getAttribute("refDataItem");
	if( !v_sItemName )
		return "";
	
	var v_nV5NestedValueset = nV5Valueset.selectSingleNode( "../../edgeGroups/edgeGroup/valueSets/valueSet" );

	var v_sListGroup =
		'<listGroup refDataItem="' + v_sItemName.F_XMLEncode() + '">';

	if( v_nV5NestedValueset )
	{
		var v_nV5Header = v_nV5NestedValueset.selectSingleNode( "groupHeader" );
		v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Header, "listHeader", iGroupOrdinal ); 

		var v_nV5Footer = v_nV5NestedValueset.selectSingleNode( "groupFooter" );
		v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Footer, "listFooter", iGroupOrdinal ); 
	}
	
	v_sListGroup += G_QanReportGenerator.f_convertGroupSort( nV5Valueset.selectSingleNode( "groupSort" ) );
	
	v_sListGroup +=
		'</listGroup>';

//	this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sItemName );
	

	if( v_nV5NestedValueset )
		v_sListGroup += G_QanReportGenerator.f_convertListValueset( v_nV5NestedValueset, iGroupOrdinal + 1 );
	
	return v_sListGroup;
}



G_QanReportGenerator.f_convertDetailGroup = function( nV5Edge )
{

}


G_QanReportGenerator.f_collectListItems = function( nV5Edge )
{
	var v_nlV5GroupItems = nV5Edge.selectNodes( ".//edgeGroups/edgeGroup/valueSets/valueSet[@refDataItem]" );
	
	for( var i = 0; i < v_nlV5GroupItems.length; ++i )
	{
		var v_sColumnName = v_nlV5GroupItems[i].getAttribute("refDataItem");
		this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sColumnName, true );
	}	

	var v_nlV5DetailItems = nV5Edge.selectNodes( ".//edgeGroups/edgeGroup/valueSets/valueSet[not(@refDataItem)]/groupBody/dataItemRef" );
	
	for( var i = 0; i < v_nlV5DetailItems.length; ++i )
	{
		var v_sColumnName = v_nlV5DetailItems[i].getAttribute("refDataItem") ;
		this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sColumnName );
	}	
}

G_QanReportGenerator.f_convertGroupSort = function( nV5GroupSort )
{
	if( !nV5GroupSort )
		return "";
		
	var v_sGroupSort = 
		"<sortList>";
	
	var v_nlSortItems = nV5GroupSort.selectNodes( "sortItem" );
	for( var i = 0; i < v_nlSortItems.length; ++i )
	{
		v_sGroupSort += v_nlSortItems[i].xml;
	}
	
	v_sGroupSort += 
		"</sortList>";
	
	return v_sGroupSort;
}



G_QanReportGenerator.f_generateListColumn = function( sColumnName, bIsGroupingColumn )
{
	this.m_aListColumns.push( sColumnName );

	var v_sListColumn = 
		'<listColumn>' +
				'<listColumnTitle>' +
					'<style>' +
						'<defaultStyles>' +
							'<defaultStyle refStyle="lt"/>' +
						'</defaultStyles>' +
					'</style>' +
					'<contents>' +
						'<textItem>' +
							'<dataSource>' +
								'<dataItemLabel refDataItem="'+ sColumnName.F_XMLEncode() +'"/>' +
							'</dataSource>' +
						'</textItem>' +
					'</contents>' +
				'</listColumnTitle>' +
				'<listColumnBody>' +
					'<style>' +
						'<defaultStyles>' +
							'<defaultStyle refStyle="lc"/>' +
						'</defaultStyles>' +
					'</style>' +
					'<contents>' +
						'<textItem>' +
							'<dataSource>' +
								'<dataItemValue refDataItem="'+ sColumnName.F_XMLEncode() +'"/>' +
							'</dataSource>' +
						'</textItem>' +
					'</contents>';
					
			if( bIsGroupingColumn )
			{
				v_sListColumn +=
					'<listColumnRowSpan refDataItem="'+ sColumnName.F_XMLEncode() +'"/>';
			}

	v_sListColumn +=
				'</listColumnBody>' +
			'</listColumn>';
			
	return v_sListColumn;		
}	


	
G_QanReportGenerator.f_convertCrosstabQRD = function( nV5QRD, v_nV5Edges )
{
	var v_sCrosstab = 
	'<crosstab horizontalPagination="true" name="'+ 
	                  nV5QRD.getAttribute("name").F_XMLEncode() +'" refQuery="'+
	                  nV5QRD.getAttribute("refQuery").F_XMLEncode() + '">' +
		'<crosstabCorner>' +
			'<contents>';
			
	if( v_nV5Edges.length >= 3 )
	{
		var v_nV5Valuesets = v_nV5Edges[2].selectNodes( ".//valueSet[@refDataItem]" );
		if( v_nV5Valuesets.length == 1 )
		{
			v_sCrosstab += 
				'<textItem>' +
					'<dataSource>' +
						'<dataItemLabel refDataItem="'+ v_nV5Valuesets[0].getAttribute("refDataItem").F_XMLEncode() +'"/>' +
					'</dataSource>' +
				'</textItem>';
		}
	}

	v_sCrosstab += 
			'</contents>' +
			'<style>' +
				'<defaultStyles>' +
					'<defaultStyle refStyle="xm"/>' +
				'</defaultStyles>' +
			'</style>' +
		'</crosstabCorner>' +
		'<style>' +
			'<CSS value="border-collapse:collapse"/>' +
			'<defaultStyles>' +
				'<defaultStyle refStyle="xt"/>' +
			'</defaultStyles>' +
		'</style>';
		

	if( v_nV5Edges.length >= 2 )
	{
		var v_sValuesets = "";
		var v_nV5Valuesets = v_nV5Edges[1].selectNodes( "edgeGroups/edgeGroup/valueSets/valueSet" );
		for( var iVS = 0; iVS < v_nV5Valuesets.length; ++iVS )
		{
			v_sValuesets += G_QanReportGenerator.f_convertValueset( v_nV5Valuesets[iVS] );
		}

		if( v_sValuesets )
			v_sCrosstab += '<crosstabRows>' + v_sValuesets + '</crosstabRows>';
	}

	v_sCrosstab += 
		'<crosstabFactCell>' +
			'<contents>' +
				'<textItem>' +
					'<dataSource>' +
						'<cellValue/>' +
					'</dataSource>' +
				'</textItem>' +
			'</contents>' +
			'<style>' +
				'<defaultStyles>' +
					'<defaultStyle refStyle="mv"/>' +
				'</defaultStyles>' +
			'</style>' +
		'</crosstabFactCell>';

	if( v_nV5Edges.length >= 3 )
	{
		var v_nV5Valuesets = v_nV5Edges[2].selectNodes( ".//valueSet[@refDataItem]" );
		if( v_nV5Valuesets.length == 1 )
		{
			v_sCrosstab += 
			'<defaultMeasure refDataItem="' + v_nV5Valuesets[0].getAttribute("refDataItem").F_XMLEncode() + '"/>';
		}
	}
		
	if( v_nV5Edges.length >= 1 )
	{
		var v_sValuesets = "";
		var v_nV5Valuesets = v_nV5Edges[0].selectNodes( "edgeGroups/edgeGroup/valueSets/valueSet" );
		for( var iVS = 0; iVS < v_nV5Valuesets.length; ++iVS )
		{
			v_sValuesets += G_QanReportGenerator.f_convertValueset( v_nV5Valuesets[iVS] );
		}

		if( v_sValuesets )
			v_sCrosstab += '<crosstabColumns>' + v_sValuesets + '</crosstabColumns>';
	}
		
	v_sCrosstab += 
	'</crosstab>';

	return v_sCrosstab;
}

G_QanReportGenerator.f_convertValueset = function( nV5Valueset )
{
	var v_sValueset = 
	'<crosstabNode>';

	var v_nNestedValuesets = nV5Valueset.selectNodes( "../../edgeGroups/edgeGroup/valueSets/valueSet" );
	if( v_nNestedValuesets.length > 0 )
	{
		v_sValueset += '<crosstabNestedNodes>';
		
		var v_sNestedValuesets = "";
		
		for( var iVS = 0; iVS < v_nNestedValuesets.length; ++iVS )
		{
			v_sNestedValuesets += G_QanReportGenerator.f_convertValueset( v_nNestedValuesets[iVS] );
		}

		v_sValueset += v_sNestedValuesets +
					   '</crosstabNestedNodes>';
	}	

	var v_nlAssociatedItems = nV5Valueset.selectNodes( "groupBody/dataItemRef" );
	var v_sAssociatedItems = "";
	for( var iItem = 0; iItem < v_nlAssociatedItems.length; ++iItem )
	{
		v_sAssociatedItems += G_QanReportGenerator.f_generateAssociatedColumn(
											 v_nlAssociatedItems[iItem].getAttribute("refDataItem") );
	}

	var v_sGroupSort = G_QanReportGenerator.f_convertGroupSort( 
									nV5Valueset.selectSingleNode( "groupSort" ) );

	v_sValueset += 
		'<crosstabNodeMembers>' +
			'<crosstabNodeMember refDataItem="' + nV5Valueset.getAttribute("refDataItem").F_XMLEncode() + '" >' +
				'<style>' +
					'<defaultStyles>' +
						'<defaultStyle refStyle="ml"/>' +
					'</defaultStyles>' +
				'</style>' +
				'<contents>' +
					'<textItem>' +
						'<dataSource>' +
							'<memberCaption/>' +
						'</dataSource>' +
					'</textItem>' +
					v_sAssociatedItems +
				'</contents>' +
				v_sGroupSort + 
			'</crosstabNodeMember>' +
		'</crosstabNodeMembers>' +
	'</crosstabNode>';
	
	return v_sValueset;
}