function compare_metadata()
{
	// warn user if original metadata box is empty
	if(original_metadata.length == 0)
	{
		window.alert("Paste the metadata you want to analyse into the 'Original metadata' box.");
		return;
	}
	// warn user if revised metadata box is empty
	if(revised_metadata.length == 0)
	{
		window.alert("Paste the metadata you want to analyse into the 'Revised Metadata' box.");
		return;
	}
	originalMetadata = parseMetadata(original_metadata.value);
	revisedMetadata = parseMetadata(revised_metadata.value);
	
	changes = "Action\tSection\tMember\tAttribute\tOriginal\tRevised\r\n";
	
	changes += findChanges(originalMetadata, revisedMetadata);
	changes += findDeletes(originalMetadata, revisedMetadata);
	changes += findInserts(originalMetadata, revisedMetadata);
	
	metadata_changes.innerText = changes;
}
/**
 *
 */
function findChanges(originalMetadata, revisedMetadata)
{
	changes = '';
	for(sectionKey in originalMetadata)
	{
		for(memberKey in originalMetadata[sectionKey])
		{
			if(revisedMetadata[sectionKey] != undefined)
			{
				if(revisedMetadata[sectionKey][memberKey] != undefined)
				{
					for(attributeKey in originalMetadata[sectionKey][memberKey])
					{
						originalValue = originalMetadata[sectionKey][memberKey][attributeKey];
						revisedValue = revisedMetadata[sectionKey][memberKey][attributeKey];
						if(originalValue != revisedValue)
						{						
							changes = changes
								+ "Changed\t"
								+ sectionKey + "\t"
								+ memberKey + "\t" 
								+ attributeKey + "\t"
								+ originalValue + "\t"							
								+ revisedValue + "\r\n";
						}
					}
				}
			}
		}
	}
	return changes;
}
/**
 *
 */
function findDeletes(originalMetadata, revisedMetadata)
{
	changes = '';
	for(sectionKey in originalMetadata)
	{
		for(memberKey in originalMetadata[sectionKey])
		{
			if(revisedMetadata[sectionKey] == undefined)
			{
				changes = changes
							+ "Deleted\t"
							+ sectionKey + "\t"
							+ memberKey + "\r\n";
			}
			else if(revisedMetadata[sectionKey][memberKey] == undefined)
			{
				changes = changes
							+ "Deleted\t"
							+ sectionKey + "\t"
							+ memberKey + "\r\n";
			}
		}
	}
	return changes;
}
/**
 *
 */
function findInserts(originalMetadata, revisedMetadata)
{
	changes = '';
	for(sectionKey in revisedMetadata)
	{
		for(memberKey in revisedMetadata[sectionKey])
		{
			if(originalMetadata[sectionKey] == undefined)
			{
				changes = changes
							+ "Inserted\t"
							+ sectionKey + "\t"
							+ memberKey + "\t" 
							+ "\t\t"
							+ "\r\n";
				/*// Output member inserted and all attributes
				for(attributeKey in revisedMetadata[sectionKey][memberKey])
				{
						changes = changes
							+ "Inserted\t"
							+ sectionKey + "\t"
							+ memberKey + "\t" 
							+ attributeKey + "\t\t"
							+ revisedMetadata[sectionKey][memberKey][attributeKey] + "\r\n";
				}*/
			}
			else if(originalMetadata[sectionKey][memberKey] == undefined)
			{
				changes = changes
							+ "Inserted\t"
							+ sectionKey + "\t"
							+ memberKey + "\t" 
							+ "\t\t"
							+ "\r\n";
				/*// Output member inserted and all attributes
				for(attributeKey in revisedMetadata[sectionKey][memberKey])
				{
						changes = changes
							+ "Inserted\t"
							+ sectionKey + "\t"
							+ memberKey + "\t" 
							+ attributeKey + "\t\t"
							+ revisedMetadata[sectionKey][memberKey][attributeKey] + "\r\n";
				}*/
			}
		}		
	}
	return changes;
}
function parseAccountMembers(lineIn)
{
	lineOut = {};
	lineOut['AccountType'] = lineIn[1];
	lineOut['IsCalculated'] = lineIn[2];
	lineOut['IsConsolidated'] = lineIn[3];
	lineOut['IsICP'] = lineIn[4];
	lineOut['PlugAcct'] = lineIn[5];
	lineOut['Custom1TopMember'] = lineIn[6];
	lineOut['Custom2TopMember'] = lineIn[7];
	lineOut['Custom3TopMember'] = lineIn[8];
	lineOut['Custom4TopMember'] = lineIn[9];
	lineOut['NumDecimalPlaces'] = lineIn[10];
	lineOut['UsesLineItems'] = lineIn[11];
	lineOut['EnableCustom1Aggr'] = lineIn[12];
	lineOut['EnableCustom2Aggr'] = lineIn[13];
	lineOut['EnableCustom3Aggr'] = lineIn[14];
	lineOut['EnableCustom4Aggr'] = lineIn[15];
	lineOut['UserDefined1'] = lineIn[16];
	lineOut['UserDefined2'] = lineIn[17];
	lineOut['UserDefined3'] = lineIn[18];
	lineOut['XBRLTags'] = lineIn[19];
	lineOut['SecurityClass'] = lineIn[20];
	lineOut['ICPTopMember'] = lineIn[21];
	lineOut['EnableDataAudit'] = lineIn[22];
	lineOut['CalcAttribute'] = lineIn[23];
	lineOut['SubmissionGroup'] = lineIn[24];
	lineOut['DefaultParent'] = lineIn[25];
	lineOut['Descriptions'] = lineIn[26];
	
	return lineOut;
}
function parseConsolidationMethodsAccount(lineIn)
{ 
	lineOut = {};
	lineOut['UsedByCalcRoutine'] = lineIn[1];
	lineOut['IsHoldingMethod'] = lineIn[2];
	lineOut['ToPercentControlComp,'] = lineIn[3];
	lineOut['ToPercentControl'] = lineIn[4];
	lineOut['PercentConsol'] = lineIn[5];
	lineOut['Control'] = lineIn[6];
	lineOut['Descriptions'] = lineIn[7];
	
	return lineOut;
}
function parseCurrencies(lineIn)
{ 
	lineOut = {};
	lineOut['Scale'] = lineIn[1];
	lineOut['TranslationOperator'] = lineIn[2];
	lineOut['DisplayInICT'] = lineIn[3];
	lineOut['Descriptions'] = lineIn[4];
	
	return lineOut;
}
function parseCustomMembers(lineIn)
{ 
	lineOut = {};
	lineOut['IsCalculated'] = lineIn[1];
	lineOut['SwitchSignForFlow'] = lineIn[2];
	lineOut['SwitchTypeForFlow'] = lineIn[3];
	lineOut['UserDefined1'] = lineIn[4];
	lineOut['UserDefined2'] = lineIn[5];
	lineOut['UserDefined3'] = lineIn[6];
	lineOut['SecurityClass'] = lineIn[7];
	lineOut['SubmissionGroup'] = lineIn[8];
	lineOut['DefaultParent'] = lineIn[9];
	lineOut['Descriptions'] = lineIn[10];
	
	return lineOut;
}
function parseEntityMembers(lineIn)
{ 
	lineOut = {};
	lineOut['DefCurrency'] = lineIn[1];
	lineOut['AllowAdjs'] = lineIn[2];
	lineOut['IsICP'] = lineIn[3];
	lineOut['AllowAdjFromChildren'] = lineIn[4];
	lineOut['SecurityClass'] = lineIn[5];
	lineOut['UserDefined1'] = lineIn[6];
	lineOut['UserDefined2'] = lineIn[7];
	lineOut['UserDefined3'] = lineIn[8];
	lineOut['HoldingCompany'] = lineIn[9];
	lineOut['SecurityAsPartner'] = lineIn[10];
	lineOut['DefaultParent'] = lineIn[11];
	lineOut['Descriptions'] = lineIn[12];
	
	return lineOut;
}
function parseScenarioMembers(lineIn)
{ 
	lineOut = {};
	lineOut['DefaultFreq'] = lineIn[1];
	lineOut['DefaultView'] = lineIn[2];
	lineOut['ZeroViewForNonadj'] = lineIn[3];
	lineOut['ZeroViewForAdj'] = lineIn[4];
	lineOut['ConsolidateYTD'] = lineIn[5];
	lineOut['UserDefined1'] = lineIn[6];
	lineOut['UserDefined2'] = lineIn[7];
	lineOut['UserDefined3'] = lineIn[8];
	lineOut['SupportsProcessManagement'] = lineIn[9];
	lineOut['SecurityClass'] = lineIn[10];
	lineOut['MaximumReviewLevel'] = lineIn[11];
	lineOut['UsesLineItems'] = lineIn[12];
	lineOut['EnableDataAudit'] = lineIn[13];
	lineOut['DefFreqForICTrans'] = lineIn[14];
	lineOut['DefaultParent'] = lineIn[15];
	lineOut['Descriptions'] = lineIn[16];
	
	return lineOut;
}
/**
 * Parses metadata into nexted array.
 */ 
function parseMetadata(metadataIn)
{
	// remove white space
	metadataIn = metadataIn.replace(/ +;/g, ";");
	metadataIn = metadataIn.replace(/ +\r\n/g, "\r\n");

	// split into array
	metadataIn = metadataIn.split("\r\n");
	 
	section="Header";
	// Create metadata out object
	metadataOut = {};		 
	
	// for each line in metadata file
	for(metadataInKey in metadataIn)
	{
		lineIn = metadataIn[metadataInKey];

		// Check if line contains member
		 		
		// if line is blank do not output
		isLineOutput = true
		if(lineIn == "")
		{
			isLineOutput = false;
		}
		// if line starts with an ! do not output
		if(lineIn.substr(0, 1) == "!")
		{
			isLineOutput = false;
			if(lineIn.substr(0, 13) != "!FILE_FORMAT=" && lineIn.substr(0, 9) != "!VERSION=")
			{
				section = lineIn.substr(1, lineIn.length - 1);
			}
		}
		// if line is comment do not output
		if((lineIn.substr(0, 1) == "'"))
		{
			isLineOutput = false;
		}
		// Parse line		 		
		if(isLineOutput)
		{
			if(metadataOut[section] == undefined)
			{
					metadataOut[section] = {};
			}
			
			if (section == "APPLICATION_SETTINGS")
			{
				lineIn = lineIn.split("=");
				metadataOut[section][lineIn[0]] = {};
				metadataOut[section][lineIn[0]]['Value'] = lineIn[1];
			}
			else if(section == "CURRENCIES")
			{
				lineIn = lineIn.split(";");				
				metadataOut[section][lineIn[0]] = parseCurrencies(lineIn);
			}			
			else if(section == "MEMBERS=Account")
			{
				lineIn = lineIn.split(";");				
				metadataOut[section][lineIn[0]] = parseAccountMembers(lineIn);
			}
			else if(section == "MEMBERS=Custom1" || section == "MEMBERS=Custom2" || section == "MEMBERS=Custom3" || section == "MEMBERS=Custom4")
			{
				lineIn = lineIn.split(";");				
				metadataOut[section][lineIn[0]] = parseCustomMembers(lineIn);
			}
			else if(section == "MEMBERS=Entity")
			{
				lineIn = lineIn.split(";");				
				metadataOut[section][lineIn[0]] = parseEntityMembers(lineIn);
			}
			else if(section == "MEMBERS=Scenario")
			{
				lineIn = lineIn.split(";");				
				metadataOut[section][lineIn[0]] = parseScenarioMembers(lineIn);
			}
		}	
	}
	return(metadataOut);
}
