

function XML(text) {
    return new MezXML(text);
};

var isIE = function() {
    return (typeof window.ActiveXObject != 'undefined');
};

var isMozilla = function() {
    return    (typeof document.implementation != 'undefined') && 
            (typeof document.implementation.createDocument != 'undefined');
};

var MezXML = Class.create({
    initialize: function(text) {
        this.dom = DOMUtils.parseText(text);
    },

    toString: function() {        
        if(isIE()) {
            return this.dom.xml;    
        }
        else {
            return new XMLSerializer().serializeToString(this.dom);
        }
    },

    find: function(xpath) {
        return DOMUtils.selectNodes(xpath, this.dom);
    },

    xslt: function(stylesheet, args) {
        try {
            var xslt = DOMUtils.loadXslt(stylesheet);
            var html = DOMUtils.xslTransform(this.dom, xslt, args);
            return html;
        } catch (err) {
            K.logException("Transformation error on: " + stylesheet);
            throw err;
        }
    }
});

var DOMUtils = {
    xsltBasePath: 'xsl/',

    createNewDocument: function() {
        var doc = null;

        if (isIE()) {
            doc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
        }
        else {
            doc = document.implementation.createDocument("", "", null);
        }    
        
        doc.async = false;
        
        return doc;
    },

    parseText: function(xml) {
        var doc = this.createNewDocument();

        if (isIE()) {
            doc.loadXML(xml);
        }
        else {
            var parser = new DOMParser();
            doc.strictErrorChecking = false;
            doc = parser.parseFromString(xml,"text/xml");
        }
        
        return doc;
    },
    
    loadSafariXMLDocument: function (url) {        
        var xmldoc = null;
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
            req.open("GET", url, false);
            req.send(null);
            if(req.status == 200) {
                xmldoc = req.responseXML;
                if(xmldoc == null) {
                    // this seems to be a weirdness with safari on windows.
                    // it retrieves the document but there is no
                    // req.responseXML property.
                    xmldoc = XML(req.responseText).dom;
                }
            }
        }
        
        return xmldoc;
    },


    loadXslt: function(stylesheet) {

        if(isIE()) {
            var xsltDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
            xsltDoc.async = false;
            xsltDoc.setProperty('AllowDocumentFunction', true);
        }
        else {
            var xsltDoc = this.createNewDocument();
        }       
        
        try {
            xsltDoc.load(this.xsltBasePath + I18N.lang + '/' + stylesheet);
        }
        catch(ex) {
            xsltDoc = this.loadSafariXMLDocument(this.xsltBasePath + I18N.lang + '/' + stylesheet);
        }
        
        return xsltDoc;
    },

    selectNodes: function(xPath,xmlDoc) {
        if(isIE()) {
            return xmlDoc.selectNodes(xPath);
        }
        else {
            return this.getMozillaNodeList(xPath,xmlDoc);    
        }
    },

    getMozillaNodeList: function(xPath,xmlDoc) {
        var arrNodes = new Array();
        var result = xmlDoc.evaluate(xPath, xmlDoc, null, XPathResult.ANY_TYPE, null);
        var nextNode = result.iterateNext();
        while (nextNode) {
            arrNodes.push(nextNode);
            nextNode = result.iterateNext();
        }
        return arrNodes; 
    },

    xslTransform: function(doc, xslt, parameters) {
        var processor;
        var dom;
        var returnString;

        if(isIE()) {
            var template = new ActiveXObject("Msxml2.XSLTemplate.6.0");
            template.stylesheet = xslt;
            processor = template.createProcessor();            
            
            for (var p in parameters) {
                processor.addParameter(p, parameters[p]);
            }
            
            dom = new ActiveXObject("Msxml2.DOMDocument.6.0");
            dom.async = false;
                        
            processor.input = doc;
            processor.transform();

            returnString = processor.output;
        }        
        else {
            processor = new XSLTProcessor();
            processor.importStylesheet(xslt);
            
            if (parameters != null) {
                for (var p in parameters) {
                    processor.setParameter(null, p, parameters[p]);
                }
            }
            
            dom = processor.transformToDocument(doc);
            returnString = new XMLSerializer().serializeToString(dom);
        }

        return returnString;
    }    
};

