/**
* JavaScript XSLT Transofrmation Model
* @author Shant Adam
* @created 31 Jan 2007
* @version v.0.1.2.10
*/
function XSLTModel()
{
	var delegate = new Delegate();
	var domAdapter = new DOMAdapter();
	var xmlhttprequest = null;
	var loadHandler;
	
	// START CONSTRUCTOR
	{
		
	}
	// END CONSTRUCTOR
	
	/**
	* function to handle outputing messages to user
	* @param data:object
	* return void
	*/
	this.output = function (data) 
	{
		// taking care of data
		alert(data)
	}

	/**
	* function to handle XMLHttpRequest object state change event
	* return void
	*/
	this.xmlHttpStateChangehandler = function () 
	{	
		if(this.xmlhttprequest.readyState == 4 && this.xmlhttprequest.status == 200) 
		{
			var xmlString = this.xmlhttprequest.responseText;
			var doc = domAdapter.parseXml(xmlString);
			
			// so far so good
			if(doc != null && doc.childNodes)
			{
				// success!
				this.loadHandler(doc);
			}
			else
			{
				this.output(null);
			}
		} 
		else if (this.xmlhttprequest.readyState == 4 && this.xmlhttprequest.status != 200) 
		{
			/* fetched the network error...
			this.output("Network Error: " + this.xmlhttprequest.status + " : " + this.xmlhttprequest.statusText);
			*/
			var xmlString = this.xmlhttprequest.responseText;
			var doc = domAdapter.parseXml(xmlString);
			
			// so far so good
			if(doc != null && doc.childNodes)
			{
				// success!
				this.loadHandler(doc);
			}
			else
			{
				this.output(null);
			}
		}
	}
	
	/**
	* function to create crossbrowser XMLHttpRequest object
	* return XMLHttpRequest
	*/
	this.createXMLHttp = function() 
	{
		if (typeof XMLHttpRequest != "undefined") 
		{
			return new XMLHttpRequest();
		} 
		else if (window.ActiveXObject) 
		{
			var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
			
			for (var i = 0; i < aVersions.length; i++) 
			{
				try 
				{
					var oXmlHttp = new ActiveXObject(aVersions[i]);
					return oXmlHttp;
				} 
				catch (oError) 
				{
					// do nothing
				}
			}
		}
		throw new Error("XMLHttp object could be created.");
	}
	
	/**
	* function to handle xml document parsing process
	* @params url:string, loadHandler:function
	* return void
	*/
	this.loadXMLFromURL = function (url, loadHandler, filetype) 
	{
		try
		{
			this.xmlhttprequest = this.createXMLHttp();
		}
		catch(e)
		{
			this.output(e.message);
		}
		this.loadHandler = loadHandler;
		this.xmlhttprequest.onreadystatechange = delegate.create(this, this.xmlHttpStateChangehandler);
		this.xmlhttprequest.open('GET', url, true);
		switch(filetype)
		{
			case "xml": 
				this.xmlhttprequest.setRequestHeader("Content-Type", "text/xml"); 
				break;
			case "xsl": 
				this.xmlhttprequest.setRequestHeader("Content-Type", "text/xsl"); 
				break;
		}
		this.xmlhttprequest.send(null);
	}
	
	/**
	* function the processing of the xml document with xslt
	* @params xmlDoc:XMLDocument|XMLObject, xslDoc:XMLDocument|XMLObject, element:string
	* return void
	*/
	this.processXML = function (xmlDoc, xslDoc, element)
	{
		// code for IE
		if (typeof ActiveXObject != 'undefined')
		{
			var resultDocument = xmlDoc.transformNode(xslDoc);
			document.getElementById(element).innerHTML = resultDocument;
		}
		// code for Mozilla, Firefox, Opera, etc.
		else if (typeof document != 'undefined' && document.implementation && document.implementation.createDocument && typeof DOMParser != 'undefined')
		{
			xsltProcessor = new XSLTProcessor();
			xsltProcessor.importStylesheet(xslDoc);
			var resultDocument = xsltProcessor.transformToFragment(xmlDoc, document);
			document.getElementById(element).appendChild(resultDocument);
		}
	}
}

if(!xsltObj)
	var xsltObj = new XSLTModel();
