

var SdEcXdocLoader = {};		// public  global identifiers
var $_EcXdocLoader = {};		// private global identifiers

$_EcXdocLoader.cache = {};

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

SdEcXdocLoader.fetchXMLDoc = function (xsl)
{
	if (xsl && xsl.length > 0 && xsl.charAt(0) != '/') xsl = "/" + xsl;

	var xslTxt;
	try {
		xslTxt = SdXslData.getXslAsHardCodedString(xsl);
	} catch (e) {
		xslTxt = null;
	}

	var xslDoc;
	if (xslTxt == null)
	{
		xslDoc = SdEcXdocLoader.LoadXSLDocFromFile(xsl,"xml-content");
		xslTxt = $_EcXdocLoader.XmlDocumentToString(xslDoc);
		xslTxt = $_EcXdocLoader.translate(xslTxt);
		xslDoc = SdEcXdocLoader.loadXMLDocFromText(xslTxt,"xml-content",xsl);		
	}
	else 
	{
		xslDoc = SdEcXdocLoader.loadXMLDocFromText(xslTxt,"xml-content",xsl);
	}
	return xslDoc;
}

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

SdEcXdocLoader.loadXMLDocFromText = function (fname, task, url)
{
	var ajaxlet = new SdEcStats.Ajaxlet((task ? task : "UNKNOWN"), "xsl", (url ? url : "UNKNOWN"));
	SdEcStats.topOfRequestingData(ajaxlet);
	SdEcStats.addNote(ajaxlet, "text");
	SdEcStats.endOfRequestingData(ajaxlet);
	SdEcStats.topOfProcessingData(ajaxlet);

	var xmlDoc = "unitialized";
	if (window.ActiveXObject)
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(fname);
	}
	else if (DOMParser)
	{
		var parser = new DOMParser();
		xmlDoc=parser.parseFromString(fname,"text/xml");
	}
	else
	{
		alert('Your browser cannot handle this script');
	}

	SdEcStats.endOfProcessingData(ajaxlet);
	return(xmlDoc);
}

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

SdEcXdocLoader.LoadXSLDocFromFile = function (xslFileName, task)
{
	var  xslDoc = ($_EcXdocLoader.cache ? $_EcXdocLoader.cache[xslFileName] : null);
	if (!xslDoc)
	{
		var ajaxlet = new SdEcStats.Ajaxlet((task ? task : "load-soft-xsl"), "xsl", xslFileName);
		SdEcStats.topOfRequestingData(ajaxlet);
		SdEcStats.addNote(ajaxlet, "ajax");

		if (window.ActiveXObject)
		{
			xslDoc = new ActiveXObject("Microsoft.XMLDOM");
		}
		else if (document.implementation && document.implementation.createDocument)
		{
			xslDoc = document.implementation.createDocument("","",null);
		}
		else
		{
			alert('Your browser cannot handle this script');
		}

		try {
		    xslDoc.async = false;
		    xslDoc.load(xslFileName);
		}
		catch(e) {//unable to load, for Safari
		    new Ajax.Request(xslFileName, {
			method: "get",
			asynchronous: false,
			onSuccess: function(resp, jsonObj) {
			    xslDoc = resp.responseXML;
			}
		    });
		}
		SdEcStats.endOfRequestingData(ajaxlet);
		SdEcStats.topOfProcessingData(ajaxlet);
		SdEcStats.endOfProcessingData(ajaxlet);

		if ($_EcXdocLoader.cache) $_EcXdocLoader.cache[xslFileName] = xslDoc;
	}

	return xslDoc;
}

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

$_EcXdocLoader.XmlDocumentToString = function (xmlObject)
{
	// from http://www.hiteshagrawal.com/javascript/convert-xml-document-to-string-in-javascript

	var text;
	if (window.ActiveXObject)
	{
		text = xmlObject.xml;
	}
	else if (document.implementation && document.implementation.createDocument)
	{
		text = (new XMLSerializer()).serializeToString(xmlObject);
	}
	else
	{
		text = null;
	}
	return text;
}

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

$_EcXdocLoader.translate = function (text)
{
	while (true)
	{
		var indexOfLeftBrace = text.indexOf('{');
		if (indexOfLeftBrace < 0) break;

		var indexOfRightBrace = text.indexOf('}', indexOfLeftBrace);
		if (indexOfRightBrace < 0) break;

		var prefix = text.substring(0, indexOfLeftBrace                       );
		var middle = text.substring(   indexOfLeftBrace+1, indexOfRightBrace  );
		var suffix = text.substring(                       indexOfRightBrace+1);

		var replacement = SdEcValues.getTranslation(middle);

		text = prefix + replacement + suffix;

	}
	return text;
}

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

