﻿/// Create an XML DOM object.
function createXMLDomObject()
{
    try { return document.implementation.createDocument("","",null); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLDOM"); } catch (e) {}
    try { return new ActiveXObject("Microsoft.XMLDOM"); } catch (e) {}
  
    return null;
}

/// Create an XML HTTP Request.
function createXMLHttpRequest() {
    try { return new XMLHttpRequest(); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}

    return null;
}

/// Load a local (to the site) xml document.
/// Used primarily for loading XSL files.
function loadLocalXMLDocument(fileName)
{
    var docRequest = new AJAXRequest(fileName, null);
    if(docRequest.WebReq == null)
        return null;
    docRequest.Get('');
    return docRequest.ResponseText();
}

var XSLArray = new Array();


function AsynchTranslation(dataUrl, xslUrl, translationUrl, objectTypeCode, pageCallback)
{
    var dataAJR = new AJAXRequest(dataUrl, dataRetrievedCallBack);
    var xslAJR = new AJAXRequest(xslUrl, xslRetrievedCallBack);
    var xfrmAJR = new AJAXRequest(translationUrl, transformCompletedCallBack);
    
    dataAJR.BeginRequest();
    
    if(XSLArray[xslUrl] == null) 
    {
        xslAJR.BeginRequest();
    }
    
    this.TransformedContent = TransformedContent;
    
    function TransformedContent()
    {
        try
        {
            return xfrmAJR.ResponseText();
        }
        catch(e)
        {
            return null;
        }
    }
    
    function BeginTransform()
    {
        var data;
        var xsl;
        
        data = dataAJR.ResponseText();
        if(XSLArray[xslUrl] == null)
        {
            xsl = xslAJR.ResponseText();
            
        }
        else
        {
            xsl = XSLArray[xslUrl];
        }
        
        if((data == null) || (xsl == null))
        {
            pageCallback(null);
            return;
        }
        
        var postData = 'DataContent=' + escape(data) + '&Transformation=' + escape(xsl) + '&Typecode=' + objectTypeCode;
        xfrmAJR.BeginPost(postData);
        XSLArray[xslUrl] = xsl;
    }
    
    
    function dataRetrievedCallBack(xmlData)
    {
        if(xmlData != null)
        {
            if(XSLArray[xslUrl] == null)
            {
                if(xslAJR.Completed() && xslAJR.Succeeded())
                {
                    BeginTransform();
                }
            }
            else
            {
                BeginTransform();
            }
        }
        else
        {
            pageCallback(null);
        }            
    }
    function xslRetrievedCallBack(xslData)
    {
        if(xslData != null)
        {
            if(dataAJR.Completed() && dataAJR.Succeeded())
            {
                BeginTransform();
            }
        }
        else
        {
            pageCallback(null);
        }
    }
    function transformCompletedCallBack(htmlContent)
    {
        pageCallback(htmlContent);
    }
}





/// Does the translation of a datadom object, and an XSL object
function doXslTranslation(dataDom, xslDom,  translationUrl, objectTypeCode)
{
    var retValue = '';
    var postData = 'DataContent=' + escape(dataDom) + '&Transformation=' + escape(xslDom) + '&Typecode=' + objectTypeCode;
    var xslTranslationRequest = new AJAXRequest(translationUrl, null);
    xslTranslationRequest.Post(postData);
    retValue = xslTranslationRequest.ResponseText();
    xslTranslationRequest = null;
    return retValue;
}

function AJAXRequest(url, completeMethod)
{
    // ? Properties
    this.WebReq = createXMLHttpRequest();
    this.UrlPassed = url;
    this.PageCallback = completeMethod;
    
    this.BeginRequest = BeginRequest;
    this.BeginPost = BeginPost;
    this.Post = Post;
    this.Get = Get;
    this.ResponseText = ResponseText;
    this.Completed = Completed;
    this.Succeeded = Succeeded;
    

    /// This function does not assume success.
    function Succeeded()
    {
        try
        {
            if(this.WebReq.readyState == 4)
            {
                return (this.WebReq.status == "200");
            }
            return false;
        }
        catch(e)
        {
            return false;
        }
    }
    
    
    /// This function does not assume success.
    function Completed()
    {
        try
        {
            return (this.WebReq.readyState == 4);
        }
        catch(e)
        {
            return false;
        }
    }
    
    
    // Perform synch post
    function Post(dataToPost)
    {
        if(this.WebReq == null)
        {
            return;
        }
        this.WebReq.open('post', url, false);
        this.WebReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        this.WebReq.send(dataToPost);
    }
    
    // Perform synch get
    function Get(dataToPost)
    {
        if(this.WebReq == null)
        {
            return;
        }
        this.WebReq.open('get', url, false);
        this.WebReq.send(dataToPost);
    }
      
    // Asynch Post function
    function BeginPost(dataToPost)
    {
        if(this.WebReq == null)
        {
            return;
        }
        var listener = new AJAXListener(this.WebReq, CallBack);        
        this.WebReq.open('post', url, true);
        this.WebReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        this.WebReq.onreadystatechange = listener.Listen;
        this.WebReq.send(dataToPost);
    }
    
    // Asynch Get function...
    function BeginRequest()
    {
        if(this.WebReq == null)
        {
            return;
        }
        
        var listener = new AJAXListener(this.WebReq, CallBack);        
        this.WebReq.open('get', url, true);
        this.WebReq.onreadystatechange = listener.Listen;
        this.WebReq.send('');
    }
    
    // Get Response data
    function ResponseText()
    {
        try
        {
            return this.WebReq.responseText;
        }
        catch(e)
        {
            return null;
        }       
    }
    
    function CallBack(xmldoc)
    {
        if(completeMethod)
            completeMethod(xmldoc);
    }
}


function AJAXListener(request, callBack)
{
    this.Listen = listen;
    
    function listen()
    {
        if(request.readyState == 4)
        {
            if(request.status == "200")
            {
                callBack(request.responseText);
                //callBack(request.responseXML);
            }
            else
            {
                callBack(null);
            }
        }
    }
}
