// Portable XSLT transformation routine
// Copyright (C) 2006 Artem Yunusov (splyer at splyer dot com)


parseXMLFromString = function(str, contentType){
    if (window.DOMParser){
        try {
            var domParser = new DOMParser();
            return domParser.parseFromString(str,  'application/xml');
            
        } catch(e) {
            //pass
        }
    }
    if (window.ActiveXObject) {
         try {
             var d = new ActiveXObject("MSXML.DomDocument");
             d.loadXML(str);
             return d;
         } catch(e) {
            //pass
         }
    } 
    //For old versions Safari and Opera without DOMParser
    if (window.XMLHttpRequest) {
        try {
            var req = new XMLHttpRequest;
            req.open("GET", "data:" + ( "application/xml") + ";charset=utf-8," + encodeURIComponent(str), false);
            if (req.overrideMimeType) {
                req.overrideMimeType(contentType);
            }
            req.send(null);
            return req.responseXML;
        } catch(e) {
        //pass
        }
    }
    return;
}


MyXSLTProcessor.prototype.transform = function(){
    if (window.XSLTProcessor){
        var xsltProcessor = false;
        try {
	        xsltProcessor = new XSLTProcessor();
        } catch(e) {
	        xsltProcessor = false;
        }
        if (xsltProcessor) {
            xsl = this.parseXMLFromString(this.xslStr);
            xsltProcessor.importStylesheet(xsl);
            //return xsltProcessor.transformToFragment(this.xml.resXML, document).firstChild.innerHTML;

            //node = xsltProcessor.transformToFragment(this.xml.resXML, document);
            xml = this.parseXMLFromString(this.xmlStr)
          
            node = xsltProcessor.transformToFragment(xml, document);
            serializer = new XMLSerializer();
            return serializer.serializeToString(node);
        }
    } else if (window.ActiveXObject){
        try {
	        var xmlAO = new ActiveXObject("Msxml2.DOMDocument");
	        var xslAO = new ActiveXObject("Msxml2.DOMDocument");
        } catch(e) {
	        var xmlAO = new ActiveXObject("Microsoft.XMLDOM");
	        var xslAO = new ActiveXObject("Microsoft.XMLDOM");
        }
        if (xmlAO && xslAO) {
            xslAO.validateOnParse = false;
            xmlAO.validateOnParse = false;
            xslAO.loadXML(this.xslStr);
            xmlAO.loadXML(this.xmlStr);
            return xmlAO.transformNode(xslAO);
        }
    } else{
        alert('Your Browser does not support XSLT Transformation!')        
    }
}


MyXSLTProcessor.prototype.setTmplVar = function(name, value){
    var pattern = RegExp('\\$' + name, 'g');
    this.xslStr = this.xslStr.replace(pattern, value);
}


//Constructor recives MyXMLHttpRequest instance
function MyXSLTProcessor(xml, xsl){
    this.xml = xml;
    this.xsl = xsl;
    this.xmlStr = xml.resText;
    this.xslStr = xsl.resText;
}


my_xsl_transform_loaded = true;

