﻿var productType;
var parNames,parValues;
var connectorType,connectorNum;
var connectionDest,connectionType,connectionNum;
var compatDest,compatPar,compatVal;
var newParameterListData,newCompatListData,newConnectorListData,newFormListData;
var parIdx,connectorIdx;

var formType = new Array();
var formNum = new Array();

function getNumOptions(n0,n)
{
	var numOpts = "";
	for (var i=n0;i<=n;i++)
	{ 
		numOpts += "<option value='" + i + "'>" + i + "</option>";
	}
	return numOpts;
}


/*********************
  parameter functions
**********************/

function RemoveParameter(i)
{
	parNames.splice(i,1);
	parValues.splice(i,1);
	RenderParameters();
}
function AddParameter(i)
{
	var newParameterName = document.getElementById('newParameterName');
	var newParameterValue = document.getElementById('newParameterValue');
	if (newParameterName.value == "")
	{
		alert("please specify a parameter name");
		return;
	}
	if (newParameterValue.value == "")
	{
		alert("please specify a parameter value");
		return;
	}
	parNames.push(newParameterName.value);
	parValues.push(newParameterValue.value);
	RenderParameters();	
}
function updateNewParameterValues()
{
	var selectedParameterIdx = document.getElementById('newParameterName').selectedIndex-1;
	if (selectedParameterIdx == -1)
	{
		document.getElementById('newParameterValueArea').innerHTML = "";
		return;
	}
	if (newParameterListData[parIdx][1][selectedParameterIdx][1].length==0)
	{
		var sText = " = <input class='SpecEditElt' type='text' id='newParameterValue' />";
		document.getElementById('newParameterValueArea').innerHTML = sText;
	}
	else
	{
		var sText = " = <select class='SpecEditElt' id='newParameterValue'><option value=''>--please select--</option>";
		for (var i=0;i<newParameterListData[parIdx][1][selectedParameterIdx][1].length;i++)
		{
			var opt = newParameterListData[parIdx][1][selectedParameterIdx][1][i];
			sText += "<option value='"+opt+"'>"+opt+"</option>";
		}
		sText += "</select>";
		document.getElementById('newParameterValueArea').innerHTML = sText;
	}
}
function RenderParameters()
{
	if (parIdx == null || newParameterListData[parIdx] == "")
		return;
	var sText="<h3>Parameters:</h3>";
	for (var i=0;i<parNames.length;i++)
	{
		sText += parNames[i] + " = " + parValues[i] + " <input class='SpecEditElt' type='button' value='delete' onclick='RemoveParameter(" + i + ")'><br/>";
	}
	sText += "<select class='SpecEditElt' id='newParameterName' onchange='updateNewParameterValues()'>";
	sText += "<option value=''>--please select--</option>";
	for (var i=0;i<newParameterListData[parIdx][1].length;i++)
	{
		var opt = newParameterListData[parIdx][1][i][0];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "</select>";
	sText += "<span id='newParameterValueArea'></span>";
	sText += " <input class='SpecEditElt' type='button' value='add' onclick='AddParameter()'>";
	document.getElementById('parameters').innerHTML = sText;
}

/*********************
  connector functions
**********************/

function RemoveConnector(i)
{
	connectorType.splice(i,1);
	connectorNum.splice(i,1);
	RenderConnectors();
}
function AddConnector(i)
{
	var newConnector = document.getElementById('newConnector');
	var newConnectorNum = document.getElementById('newConnectorNum');
	if (newConnector.value == "")
	{
		alert("please specify a connector");
		return;
	}
	if (newConnectorNum.value == "")
	{
		alert("please specify number of connectors");
		return;
	}
	connectorType.push(newConnector.value);
	connectorNum.push(newConnectorNum.value);
	RenderConnectors();	
}
function RenderConnectors()
{
	if (connectorIdx == null || newConnectorListData[connectorIdx] == "")
		return;
	var sText="<h3>Connectors:</h3>";
	for (var i=0;i<connectorType.length;i++)
	{
		sText += connectorNum[i] + " x " + connectorType[i] + " <input class='SpecEditElt' type='button' value='delete' onclick='RemoveConnector(" + i + ")'><br/>";
	}
	sText += "<select class='SpecEditElt' id='newConnectorNum'>" + getNumOptions(1,9) + "</select> x ";
	sText += "<select class='SpecEditElt' id='newConnector'>";
	sText += "<option value=''>--please select--</option>";
	for (var i=0;i<newConnectorListData[connectorIdx][1].length;i++)
	{
		var opt = newConnectorListData[connectorIdx][1][i];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "</select>";
	sText += " <input class='SpecEditElt' type='button' value='add' onclick='AddConnector()'>";
	document.getElementById('connectors').innerHTML = sText;
}

/*********************
  connection functions
**********************/

function RemoveConnection(i)
{
	connectionType.splice(i,1);
	connectionDest.splice(i,1);
	connectionNum.splice(i,1);
	RenderConnections();
}
function AddConnection(i)
{
	var newConnectionType = document.getElementById('newConnectionType');
	var newConnectionDest = document.getElementById('newConnectionDest');
	var newConnectionNum = document.getElementById('newConnectionNum');
	if (newConnectionNum.value == "")
	{
		alert("please specify number of connections");
		return;
	}
	if (newConnectionType.value == "")
	{
		alert("please specify a connection Type");
		return;
	}
	if (newConnectionDest.value == "")
	{
		alert("please specify a the connection destination");
		return;
	}
	connectionDest.push(newConnectionDest.value != "ANYDEVICE" ? newConnectionDest.value : "");
	var newTypeArray = new Array();
	newTypeArray[0] = newConnectionType.value;
	connectionType.push(newTypeArray);
	var newTypeArray = new Array();
	newTypeArray[0] = newConnectionNum.value;
	connectionNum.push(newTypeArray);
	RenderConnections();	
}
function updateNewConnectionType()
{
	var selectedDestIdx = document.getElementById('newConnectionDest').selectedIndex-1;
	if (selectedDestIdx == -1)
	{
		document.getElementById('newConnectionArea').innerHTML = "";
		return;
	}

 	var sText = "via <select class='SpecEditElt' id='newConnectionNum'>" + getNumOptions(1,9) + "</select> ";
	sText += " x <select class='SpecEditElt' id='newConnectionType'>";
	sText += "<option value=''>--please select--</option>";
	if (selectedDestIdx < newConnectorListData.length)
	{
		for (var i=0;i<newConnectorListData[selectedDestIdx][1].length;i++)
		{
			var opt = newConnectorListData[selectedDestIdx][1][i];
			sText += "<option value='"+opt+"'>"+opt+"</option>";
		}
	}
	else
	{
		for (var i=0;i<newConnectorListData[i][1].length;i++)
		{
			for (var j=0;j<newConnectorListData[i][1].length;j++)
			{
				var opt = newConnectorListData[i][1][j];
				sText += "<option value='"+opt+"'>"+opt+"</option>";
			}
		}
	}
	sText += "</select> socket(s)/interface(s)";
	document.getElementById('newConnectionArea').innerHTML = sText;
}
function RenderConnections()
{
	var sText="<h3>Connections:</h3>";
	for (var i=0;i<connectionType.length;i++)
	{
		if (i>0) sText += "and ";
		if (connectionDest[i] == "")
			sText += "connects to any device via ";
		else
			sText += "connects to a " + connectionDest[i] + " via ";
		for (var j=0;j<connectionType[i].length;j++)
		{
			if (j>0) sText += " or ";
			sText +=  connectionNum[i][j] + " x " + connectionType[i][j] + " socket(s)/interface(s)";
		}
		sText += " <input class='SpecEditElt' type='button' value='delete' onclick='RemoveConnection(" + i + ")'><br/>";
	}
	sText += "connects to a <select class='SpecEditElt' id='newConnectionDest' onchange='updateNewConnectionType()'>";
	sText += "<option value=''>--please select--</option>";
	for (var i=0;i<newConnectorListData.length;i++)
	{
		var opt = newConnectorListData[i][0];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "<option value='ANYDEVICE'>any device</option>";
	sText += "</select>";
	sText += "<span id='newConnectionArea'></span>";
	sText += " <input class='SpecEditElt' type='button' value='add' onclick='AddConnection()'>";
	document.getElementById('connections').innerHTML = sText;
}

/*********************
  compat functions
**********************/

function RemoveCompatability(i)
{
	compatDest.splice(i,1);
	compatPar.splice(i,1);
	compatVal.splice(i,1);
	RenderCompatability();
}
function AddCompatability(i)
{
	var newCompatDest = document.getElementById('newCompatDest');
	var newCompatPar = document.getElementById('newCompatPar');
	var newCompatVal = document.getElementById('newCompatVal');
	if (newCompatDest.value == "")
	{
		alert("please specify compatible object");
		return;
	}
	if (newCompatPar.value == "")
	{
		alert("please specify a compatability parameter");
		return;
	}
	if (newCompatVal.value == "")
	{
		alert("please specify a compatability value");
		return;
	}
	compatDest.push(newCompatDest.value);
	compatPar.push(newCompatPar.value);
	compatVal.push(newCompatVal.value);
	RenderCompatability();	
}
function updateNewCompatPars()
{
	var selectedDestIdx = document.getElementById('newCompatDest').selectedIndex-1;
	if (selectedDestIdx==-1)
	{
		document.getElementById('newCompatArea').innerHTML = "";
		return;
	}
	var sText = " with <select class='SpecEditElt' id='newCompatPar' onchange='updateNewCompatVals()'>";
	sText += "<option value=''>--please select--</option>";
	for (var i=0;i<newCompatListData[selectedDestIdx][1].length;i++)
	{
		var opt = newCompatListData[selectedDestIdx][1][i][0];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "</select>";
	sText += "<span id='newCompatValArea'></span>"
	document.getElementById('newCompatArea').innerHTML = sText;
}
function updateNewCompatVals()
{
	var selectedDestIdx = document.getElementById('newCompatDest').selectedIndex-1;
	var selectedParameterIdx = document.getElementById('newCompatPar').selectedIndex-1;
	if (selectedParameterIdx==-1)
	{
		document.getElementById('newCompatValArea').innerHTML = "";
		return;
	}
	if (newCompatListData[selectedDestIdx][1][selectedParameterIdx][1].length==0)
	{
		var sText = " = <input class='SpecEditElt' type='text' id='newCompatVal' />";
		document.getElementById('newCompatValArea').innerHTML = sText;
	}
	else
	{
		var sText = " = <select class='SpecEditElt' id='newCompatVal'><option value=''>--please select--</option>";
		for (var i=0;i<newCompatListData[selectedDestIdx][1][selectedParameterIdx][1].length;i++)
		{
			var opt = newCompatListData[selectedDestIdx][1][selectedParameterIdx][1][i];
			sText += "<option value='"+opt+"'>"+opt+"</option>";
		}
		sText += "</select>";
		document.getElementById('newCompatValArea').innerHTML = sText;
	}
}
function RenderCompatability()
{
	var sText="<h3>Compatability:</h3>";
	for (var i=0;i<compatDest.length;i++)
	{
		sText += "compatible with " + compatDest[i] + " with " + compatPar[i] + " = " + compatVal[i] + " <input class='SpecEditElt' type='button' value='delete' onclick='RemoveCompatability(" + i + ")'><br/>";
	}
	sText += "compatible with <select class='SpecEditElt' id='newCompatDest' onchange='updateNewCompatPars()'>";
	sText += "<option value=''>--please select--</option>";
	for (var i=0;i<newCompatListData.length;i++)
	{
		var opt = newCompatListData[i][0];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "</select>";
	sText += "<span id='newCompatArea'></span>";
	sText += " <input class='SpecEditElt' type='button' value='add' onclick='AddCompatability()'>";
	document.getElementById('compatability').innerHTML = sText;
}

/*********************
  form functions
**********************/

function RemoveForm(i)
{
	formType.splice(i,1);
	formNum.splice(i,1);
	RenderForms();
}
function AddForm(i)
{
	var newFormType = document.getElementById('newFormType');
	var newFormNum = document.getElementById('newFormNum');
	if (newFormType.value == "")
	{
		alert("please specify a Form");
		return;
	}
	if (newFormNum.value == "")
	{
		alert("please specify number of forms");
		return;
	}
	var newTypeArray = new Array();
	newTypeArray[0] = newFormType.value;
	formType.push(newTypeArray);
	var newTypeArray = new Array();
	newTypeArray[0] = newFormNum.value;
	formNum.push(newTypeArray);
	RenderForms();	
}
function updateFormNumArea()
{
	var sText = "";
	if (document.getElementById('newFormType').selectedIndex > 0)
		sText += "<select class='SpecEditElt' id='newFormNum'>" + getNumOptions(1,9) + "</select> x ";
	document.getElementById('newFormNumArea').innerHTML = sText;
}
function RenderForms()
{
	var sText="<h3>Allowed Forms:</h3>";
	for (var i=0;i<formType.length;i++)
	{
		for (var j=0;j<formType[i].length;j++)
		{
			if (j>0) sText += " or ";
			sText += formNum[i][j] + " x " + formType[i][j];
		}
		sText += " <input class='SpecEditElt' type='button' value='delete' onclick='RemoveForm(" + i + ")'><br/>";
	}
	sText += "<span id='newFormNumArea'></span>";
	sText += "<select class='SpecEditElt' id='newFormType' onchange='updateFormNumArea()'>";
	sText += "<option value=''>-- N/A --</option>";
	for (var i=0;i<newFormListData.length;i++)
	{
		var opt = newFormListData[i];
		sText += "<option value='"+opt+"'>"+opt+"</option>";
	}
	sText += "</select>";
	sText += " <input class='SpecEditElt' type='button' value='add' onclick='AddForm()'>";
	document.getElementById('forms').innerHTML = sText;
}

function InitSpecEditor()
{
	parNames = new Array();
	parValues = new Array();
	
	connectorType = new Array();
	connectorNum = new Array();
	
	connectionDest = new Array();
	connectionType = new Array();
	connectionNum = new Array();
	
	compatDest = new Array();
	compatPar = new Array();
	compatVal = new Array();
	
	parIdx=null;
	connectorIdx=null;

	var data = document.getElementById('SpecEditData').value.split("&");
	
	productType = data[0];
	if (data[1] != "" && data[1] != null)
	{
		var eltData = data[1].split(",");
		for (var i=0;i<eltData.length;i++)
		{
			var parData = eltData[i].split("=");
			parNames[i]=parData[0];parValues[i]=parData[1];
		}
	}
	
	if (data[2] != "" && data[2] != null)
	{
		var eltData = data[2].split(",");
		for (var i=0;i<eltData.length;i++)
		{
			var eltData1 = eltData[i].split("-");
			connectorNum[i]=eltData1[0];connectorType[i]=eltData1[1];
		}
	}
	
	if (data[3] != "" && data[3] != null)
	{
		var eltData = data[3].split("\t");
		var idx=0;
		for (var i=0;i<eltData.length;)
		{
			var dest = eltData[i++]; var connections = eltData[i++].split(",");
			for (var j=0;j<connections.length;j++)
			{
				connectionDest[idx] = dest;
				var connections1 = connections[j].split("\|");
				connectionNum[idx] = new Array();
				connectionType[idx] = new Array();
				for (var k=0;k<connections1.length;k++)
				{
					var eltData1 = connections1[k].split("-");
					connectionNum[idx][k] = eltData1[0]; connectionType[idx][k] = eltData1[1];
				}
				idx++;
			}
		}
	}

	if (data[4] != "" && data[4] != null)
	{
		var eltData = data[4].split("\t");
		var idx=0;
		for (var i=0;i<eltData.length;)
		{
			var dest = eltData[i++]; var parDataList = eltData[i++].split(";");
			for (var j=0;j<parDataList.length;j++)
			{
				var parData = parDataList[j].split("=");
				var parvalues = parData[1].split(",");
				for (var k=0;k<parvalues.length;k++)
				{
					compatDest[idx] = dest; compatPar[idx] = parData[0]; compatVal[idx] = parvalues[k];
					idx++;
				}
			}
		}
	}
	
	if (data[5] != "" && data[5] != null)
	{
		var eltData = data[5].split(",");
		for (var i=0;i<eltData.length;i++)
		{
			var form1= eltData[i].split("\|");
			formNum[i] = new Array();
			formType[i] = new Array();
			for (var k=0;k<form1.length;k++)
			{
				var eltData1 = form1[k].split("-");
				formNum[i][k]=eltData1[0];formType[i][k]=eltData1[1];
			}
		}
	}
	
	//new default choices
	
	newParameterListData = document.getElementById("newParameterListData").value.split("&");
	for (var i=0;i<newParameterListData.length;i++)
	{
		newParameterListData[i] = newParameterListData[i].split("\t");
		if (newParameterListData[i][0] == productType)
		{
			parIdx=i;
		}
		newParameterListData[i][1] = newParameterListData[i][1].split(";");
		for (var j=0;j<newParameterListData[i][1].length;j++)
		{
			newParameterListData[i][1][j] = newParameterListData[i][1][j].split("=");
			if (newParameterListData[i][1][j][1] != "") 
				newParameterListData[i][1][j][1] = newParameterListData[i][1][j][1].split(",");
		}
	}
	
	newCompatListData = document.getElementById("newCompatListData").value.split("&");
	for (var i=0;i<newCompatListData.length;i++)
	{
		newCompatListData[i] = newCompatListData[i].split("\t");
		newCompatListData[i][1] = newCompatListData[i][1].split(";");
		for (var j=0;j<newCompatListData[i][1].length;j++)
		{
			newCompatListData[i][1][j] = newCompatListData[i][1][j].split("=");
			if (newCompatListData[i][1][j][1] != "") 
				newCompatListData[i][1][j][1] = newCompatListData[i][1][j][1].split(",");
		}
	}
	
	newConnectorListData = document.getElementById("newConnectorListData").value.split("&");
	for (var i=0;i<newConnectorListData.length;i++)
	{
		newConnectorListData[i] = newConnectorListData[i].split("\t");
		if (newConnectorListData[i][0] == productType)
		{
			connectorIdx=i;
		}
		newConnectorListData[i][1] = newConnectorListData[i][1].split(",");
	}
	
	newFormListData = document.getElementById("newFormListData").value.split("\t");
	
	RenderParameters();
	RenderConnectors();
	RenderConnections();
	RenderCompatability();
	RenderForms();
}

function constructSpecData(pcode)
{
	var specData = "<Product id=\"" + pcode + "\" Type=\"" + productType + "\" ";
	for (var i=0;i<parNames.length;i++)
	{
		specData += parNames[i] + "=\"" + parValues[i] + "\" ";
	}
	specData += ">";
	if (connectorType.length>0)
	{
		specData += "<Connector>";
		for (var i=0;i<connectorType.length;i++)
		{
			if (i>0) specData += ",";
			specData += connectorNum[i] + "-" + connectorType[i];
		}
		specData += "</Connector>";
	}
	var connectsToType = new Array();
	var connectsToList = new Array();
	for (var i=0;i<connectionDest.length;i++)
	{
		var type = connectionDest[i];
		var connectsToIdx; 
		for (connectsToIdx=0;connectsToIdx<connectsToType.length;connectsToIdx++)
		{
			if (connectsToType[connectsToIdx] == type)
			{
				break;
			}
		}
		if (connectsToIdx<connectsToType.length)
		{
			connectsToList[connectsToIdx] += ",";
		}
		else
		{
			connectsToType[connectsToIdx] = type;
			connectsToList[connectsToIdx] = "";
		}
		for (var j=0;j<connectionType[i].length;j++)
		{
			if (j>0) connectsToList[connectsToIdx] += "\|";
			connectsToList[connectsToIdx] += connectionNum[i][j] + "-" + connectionType[i][j];
		}
	}
	for (i=0;i<connectsToType.length;i++)
	{
		if (connectsToType[i] == "")
		{
			specData += "<ConnectsTo>" + connectsToList[i] + "</ConnectsTo>";
		}
		else
		{
			specData += "<ConnectsTo Type=\"" + connectsToType[i] + "\">" + connectsToList[i] + "</ConnectsTo>";
		}
	}
	var compatabilityType = new Array();
	var compatabilityList = new Array();
	for (var i=0;i<compatDest.length;i++)
	{
		var type = compatDest[i];
		var compatIdx; 
		for (compatIdx=0;compatIdx<compatabilityType.length;compatIdx++)
		{
			if (compatabilityType[compatIdx] == type)
			{
				break;
			}
		}
		if (compatIdx<compatabilityType.length)
		{
			compatabilityList[compatIdx] += " ";
		}
		else
		{
			compatabilityType[compatIdx] = type;
			compatabilityList[compatIdx] = "";
		}
		compatabilityList[compatIdx] += compatPar[i] + "=\"" + compatVal[i] + "\"";
	}
	for (i=0;i<compatabilityType.length;i++)
	{
		specData += "<Compatability Type=\"" + compatabilityType[i] + "\" " + compatabilityList[i] + " />";
	}
	if (formType.length>0)
	{
		specData += "<AcceptsForm>";
		for (var i=0;i<formType.length;i++)
		{
			if (i>0) specData += ",";
			for (var j=0;j<formType[i].length;j++)
			{
				if (j>0) specData += "\|";
				specData += formNum[i][j] + "-" + formType[i][j];
			}
		}
		specData += "</AcceptsForm>";
	}
	specData += "</Product>";
	return specData;
}