
var SdEcEngine = {};		// public  global identifiers
var $_EcEngine = {};		// private global identifiers

$_EcEngine.ddt = false;

$_EcEngine.typeToHandlerMap = {};

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SdEcEngine.registerTypeHandler = function (type, handler)
{
	$_EcEngine.typeToHandlerMap[type] = handler;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SdEcEngine.processContentDefinitionXmlFile = function (xmlDom, contentRegionId, parameters, ref)
{
	var regionDefinition = SdEcRegionDef.extractRegionDefinitionFromXmlDom(xmlDom);

	var showContentRegions = parameters["show-content-regions"];
	if (showContentRegions == "1" || showContentRegions == "populated")
	{
		var populate = (showContentRegions == "populated");
		var label    = (populate ? contentRegionId + ": " : contentRegionId);

		var eNode = document.getElementById(contentRegionId);
		var demo  = eNode.getAttribute("demo");
		if (!demo) demo = "div";				// "span" looks better on the hit-list page;
		
		var vNode = document.createElement(demo);
		vNode.id = eNode.id;
		eNode.id = null;

		eNode.appendChild(vNode);

		vNode.style.border="1px solid black";
		var style = vNode.style;
		style.backgroundColor = "#55FFFF";
		style.padding="0px";

		var tNode = document.createTextNode(label);
		vNode.appendChild(tNode);

		$_EcEngine.showContentRegionsDefinedInContentDefinitionXmlFile(xmlDom, contentRegionId, parameters, label);
		if (!populate) return;
	}

	$_EcEngine.doProcessContentDefinitionXmlFile(regionDefinition, xmlDom, contentRegionId, parameters, ref);	
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.doProcessContentDefinitionXmlFile = function (regionDefinition, xmlDom, contentRegionId, parameters, ref)
{
	if ($_EcEngine.ddt) SdCommon.log("populating '" + contentRegionId + "' [" + "display" + "]");

	if (regionDefinition ["jason-type"] != "region-definition") SdCommon.error("invalid region-definition");

	var idToContentDefMap = regionDefinition["content-def-map"];
	var properties        = $_EcEngine.getProperties(regionDefinition["properties"]);

	var refs = ref ? [ref] : regionDefinition["region"];

	var size = (refs ? refs.length : 0);
	for (var k = 0; k < size; k++)
	{
		var refId = refs[k];
		var def = idToContentDefMap[refId];
//SdCommon.log("ref-id '" + refId + "' -> " + SdCommon.mapToText(def));
		if (!def) continue;

		// put spans into page file content region now
		// so they stay in the right order when they are
		// populated asynchronously ...

		var subordinateId = contentRegionId;
		if (size > 1)
		{
			subordinateId   = contentRegionId + "-sub-" + k;
			var subordinateNode = document.createElement("span");
			subordinateNode.id  = subordinateId;

			var regionNode = document.getElementById(contentRegionId);
			regionNode.appendChild(subordinateNode);
		}

		var  ok = $_EcEngine.handleContentReference(def, properties, parameters, subordinateId);
//		if (!ok) regionNode.removeChild(subordinateNode);
	}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.handleContentReference = function (def, properties, parameters, elementId, key)
{	
	var type = def["type"];

	var  handler = $_EcEngine.typeToHandlerMap[type];
	if (!handler)
	{
		var errMsg = "unknown enriched content type '" + type + "' in "
			    + "'content-def' node with 'id' of '" + def["id"] + "'";

		SdCommon.error(errMsg);
		return false;
	}

	var definition = $_EcEngine.resolveAttributes(def, properties, parameters, def);

	var tagId = elementId;
	for (var specificId in definition)
	{
		var specificValue = definition[specificId];
		SdEcSpecifics.setSpecific(tagId, specificId, specificValue);
	}

	var context = {
              "jason-type"     :    "context",
		"properties"     :   properties,
		"parameters"     :   parameters,
		"definition"     :   definition
	};			

	var cond = definition["cond"];
	if (cond)
	{
		var  result = SdEcConditions.evaluate(cond);
//		if ($_EcEngine.ddt) SdCommon.log("condition for '" + elementId + "' is '" + cond + "' -> " + result);
		if (!result) return false;
	}
	else
	{
//		if ($_EcEngine.ddt) SdCommon.log("condition for '" + elementId + "' is " + " not specified");
	}

	handler(elementId);
	return true;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.resolveAttributes = function (attributes, properties, parameters, definition,key)
{	
	var context = {
              "jason-type" :  "context",
		"properties" : properties,
		"parameters" : parameters,
		"definition" : definition
	};	

	for (var name in attributes)
	{
		var text  = attributes[name];
		var value = SdEcValues.populate(text, context);
		attributes[name] = value;
	}
	return definition;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.getAttributes = function (element)
{
	var map = {};

	var list = element.attributes;

	var count = (list ? list.length : 0);
	for (var k = 0; k < count; k++)
	{
		var node  = list[k];

		var name  = node.nodeName ;
		var value = node.nodeValue;

		map[name] = value;
	}

	return map;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.getProperties = function (contentDefinitionProperties)	// array of name-value pairs
{
	if (typeof contentDefinitionProperties !== 'object') SdCommon.error("invalid content-definition-properties");

	var map = {};

	var count = (contentDefinitionProperties ? contentDefinitionProperties.length : 0);
	for (var k = 0;  k < count; k++)
	{
		var pair  = contentDefinitionProperties[k];
		var name  = pair[ "name"];
		var value = pair["value"];
		map[name] = value;
	}
	
	return map;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcEngine.getIdToContentDefMap = function (xml)
{
	var map = {};

	var defs  = ( xml ? xml.getElementsByTagName("content-def") : [] );
	var count = (defs ? defs.length : 0);
	for (var k = 0;  k < count; k++)
	{
		var def = defs[k];
		var  id = def.getAttribute("id");
		map[id] = def;
	}
	
	return map;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

