/*
 * Rhizomer AJAX
 *
 * Author: http://rhizomik.net/~roberto
 */

/****************************************************************************
 * Rhizomer Transform Class
 ****************************************************************************/

rhizomik.Transform = function(baseURL)
{
	var self = this;
	
	/**
	 * Private Attributes
	 */	
	// Base URL
	var base = baseURL || "http://localhost:8080/rhizomer";
	// RDF to HTML XSL transformation
	var xslRDF2HTML = "/style/rdf2html.js.xsl";
	// XML Document for the RDF to HTML XSL transformation
	var xslDocRDF2HTML;
	// RDF to HTML Form XSL transformation
	var xslRDF2FORM = "/style/rdf2form.xsl";
	// XML Document	for the RDF to HTML Form XSL transformation
	var xslDocRDF2FORM;
	// XML Factory
	var XML = new rhizomik.XMLFactory();
	
	/**
	 * Private Methods
	 */	
	// Load the XML documents for the XSL Transformations
	function loadTransformations()
	{
		xslDocRDF2HTML = XML.createXMLDocFromURL(base+xslRDF2HTML);
		xslDocRDF2FORM = XML.createXMLDocFromURL(base+xslRDF2FORM);
	};
	
	/**
	 * Public Methods
	 */	
	// Perform a transformation based on the RDF2HTML XSL
	self.rdf2html = function(response, targetElem)
	{
		if (!xslDocRDF2HTML)
			loadTransformations();
		
		if (typeof XSLTProcessor != "undefined") 
		{
			try
			{
				var inputXML = new DOMParser().parseFromString(response, 'text/xml');
				var processor = new XSLTProcessor();
		        processor.importStylesheet(xslDocRDF2HTML);
				var node = processor.transformToFragment(inputXML, document);
				targetElem.innerHTML = "";
				targetElem.appendChild(node);	
			}
			catch(e){ targetElem.innerHTML = e.toString(); }
		}
		else
		{
			try
			{
				var inputXML = XML.createXMLDocFromText(response);
				targetElem.innerHTML = inputXML.transformNode(xslDocRDF2HTML);
			}
			catch(e){ targetElem.innerHTML = e.toString(); }
		}
    };
    // Perform a transformation based on the RDF2FORM XSL
	self.rdf2form = function(response, targetElem)
	{
		if (!xslDocRDF2FORM)
			loadTransformations();
	
		if (typeof XSLTProcessor != "undefined") 
		{
			try
			{
				var inputXML = new DOMParser().parseFromString(response, 'text/xml');
				var processor = new XSLTProcessor();
		        processor.importStylesheet(xslDocRDF2FORM);
				var node = processor.transformToFragment(inputXML, window.document);
				targetElem.innerHTML = "";
				targetElem.appendChild(node);
			}
			catch(e){ targetElem.innerHTML = e.toString(); }
		}
		else
		{
			try
			{
				var inputXML = XML.createXMLDocFromText(response);
				targetElem.innerHTML = inputXML.transformNode(xslDocRDF2FORM);
			}
			catch(e){ targetElem.innerHTML = e.toString(); }
		}
    };
    return self;
};

/****************************************************************************
 * XML Factory Class
 ****************************************************************************/
rhizomik.XMLFactory = function()
{
	var self = this;
	
	/**
	 * Private Attributes
	 */	
	var MSXML = getMSXMLVersion();
	
	/**
	 * Private Methods
	 */	
	// Detect MSXML version for IExplorer
	function getMSXMLVersion() 
	{
		if (window.ActiveXObject)
	    {
			var aVersions = // ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0",
	    					[ "MSXML2.DOMDocument","Microsoft.DOMDocument"];
			for (var i = 0; i < aVersions.length; i++)
			{
	        	try 
	        	{
	            	var oXmlHttp = new ActiveXObject(aVersions[i]);
	            	return aVersions[i];
	        	} catch(e){}
	      	}
	    }
	};
	
	/**
	 * Public Methods
	 */	
	// Browser independent creation of an XML Document from the input URL
	self.createXMLDoc = function()
	{
		var xmlDoc;
		
		if (document.implementation && document.implementation.createDocument)
			xmlDoc = document.implementation.createDocument("", "", null);
		else
			xmlDoc = new ActiveXObject(MSXML);
		
		return xmlDoc;
	};
	
	self.createXMLHTTPRequest = function () 
	{
		   try { return new XMLHttpRequest(); } catch(e) {}
		   try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
		   try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
		   throw new Error("XMLHttpRequest not supported");
		   return null;
	};
	
	self.createXMLDocFromURLSync = function(url)
	{
		var xmlDoc = self.createXMLDoc();
		
		xmlDoc.async = false;
		if (!xmlDoc.load(url))
			 throw new Error("Parse error for:\n"+url);
		
		return xmlDoc;
	};
	
	self.createXMLDocFromURL = function(url, doc)
	{
		var request = self.createXMLHTTPRequest();
		request.open("GET", url, false); // false indicates this call is synchronous
		request.send(null);
		return request.responseXML;
	};
	
	self.createXMLDocFromText = function(text)
	{
		var xmlDoc;

		if (typeof XSLTProcessor != "undefined") 
		{
			xmlDoc = new DOMParser().parseFromString(text, 'text/xml');
		}
		else 
		{
			xmlDoc = self.createXMLDoc();
			xmlDoc.async = false;
			if (!xmlDoc.loadXML(text))
				throw new Error("Parse error for:\n"+text);
		}
		return xmlDoc;
	};
	    
    return self;
};


/*XMLDocument.prototype.xml = function()
{
	return (new XMLSerializer()).serializeToString(this);
};*/