﻿// Helper Functions to deal With XML & XSL in JavaScript
var mLastSuccessfulXmlHttpClassId = "";
var mdblXmlHttpVersion = 6.0;
var mLastSuccessfulXmlDomClassId = "";
var mdblXmlDomVersion = 6.0;
var mLastSuccessfulXmlFTDomClassId = "";
var mdblXmlFTDomVersion = 6.0;
var mLastSuccessfulXsltProcClassId = "";
var mdblXstlProcVersion = 6.0;

// call right away:
setClassIDs();



// *********** AJAX Client Functions *************************************************************************


function sendHttpRequestToWsl(sUrl, sParam, fnHandler, fnHandlerArg ) {
        
        var http_request = false;

        http_request = GetXmlHttpObject('text/xml');
        if (!http_request) {
            alert('Giving up. Cannot create a required object instance');
            return false;
        }
        http_request.onreadystatechange = function () {  getXmlHttpRequestData(http_request, fnHandler, fnHandlerArg); }; 
        /*http_request.open('GET', sUrl, true);
        http_request.send(null);*/
        http_request.open('POST', sUrl, true);
        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        http_request.setRequestHeader("Content-Length",sParam.length);
        http_request.send(sParam);
        

    }
    
function transformWithWslData(sUrl, sParam, sDivId, sXsltFile, sFunction, saFunctionArgs, sXslParameterList ) {
        
        var http_request = false;

        http_request = GetXmlHttpObject('text/xml');
        if (!http_request) {
            alert('Giving up. Cannot create a required object instance');
            return false;
        }
        http_request.onreadystatechange = function () { transformXml( returnXmlHttpRequestData(http_request), sDivId, sXsltFile, sFunction, saFunctionArgs, sXslParameterList); }; 
        /*http_request.open('GET', sUrl, true);
        http_request.send(null);*/
        http_request.open('POST', sUrl, true);
        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        http_request.setRequestHeader("Content-Length",sParam.length);
        http_request.send(sParam);
        

    } 
    
function sendHttpRequestToWslToFillDiv(sUrl, sParam, sDivId, bWithCloseButton ) {
        
        var http_request = false;

        http_request = GetXmlHttpObject('text/xml');
        if (!http_request) {
            alert('Giving up. Cannot create a required object instance');
            return false;
        }
        http_request.onreadystatechange = function () { fillDivWithWslHtml( returnXmlHttpRequestData(http_request), sDivId, bWithCloseButton); }; 
        /*http_request.open('GET', sUrl, true);
        http_request.send(null);*/
        http_request.open('POST', sUrl, true);
        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        http_request.setRequestHeader("Content-Length",sParam.length);
        http_request.send(sParam);
        

    } 
    
/* ****************************************************************************************************************************** */

    
function getXmlHttpRequestData(oXmlHttp, finalFunctionName, aFinalFunctionArgs){
        
        if (oXmlHttp.readyState == 4 ) { 
            if( oXmlHttp.status == 200 ) {
                var oXml = oXmlHttp.responseXML;
                var sReturn="";
                if ( oXml ){
                    //alert("oXml:\n" + new XMLSerializer().serializeToString(oXml));
                    var sTag = null;
                    try{
                        sTag = oXml.childNodes[0].tagName;
                        }
                    catch(e){
                    }
                    var oNode = null;
                    if (sTag){ oNode = oXml.getElementsByTagName(sTag).item(0);}
                    if ( oNode ) {
                        // mozilla
                        sReturn = getMozNodeData( oNode );
                    } // oNode
                    else {
                        // ie
                        sReturn = oXml.text;
                    }
                }
                else{
                    sReturn = oXmlHttp.responseText;
                }
                if ( sReturn ){
                    sReturn = sReturn.replace(/"/g,'\\"'); // make sure double quotes are double escaped
                    sReturn = sReturn.replace(/'/g,"\\'"); // make sure quotes are double escaped    
                    sReturn = sReturn.replace(/\n/g, "\\\\n"); //make sure new lines are double escaped
                }
                /* ** Call function to do the work ** */
                if ( aFinalFunctionArgs ){
                    eval(finalFunctionName + "(\"" + sReturn + "\"," + aFinalFunctionArgs + ");");
                    }
                else{
                    if ( finalFunctionName ){
                        eval( finalFunctionName + "(\"" + sReturn + "\");");
                        }
                }
            }
            else{                
                var sResponse =  oXmlHttp.responseText;
                alert("Problem fetching data:\n" + sResponse);
                
                
            }
        } 
    
    }
       
function returnXmlHttpRequestData(oXmlHttp){
        var sReturn = "";
        
        if (oXmlHttp.readyState == 4 ) { 
        
            if( oXmlHttp.status == 200 ) {
                var oXml = oXmlHttp.responseXML;
                if ( oXml ){
                    var sTag = null;
                    try{
                        sTag = oXml.childNodes[0].tagName;
                        }
                    catch(e){
                    }
                    var oNode = null;
                    if (sTag){oNode = oXml.getElementsByTagName(sTag).item(0);}
                    if ( oNode ) {
                        // Mozilla
                        sReturn = getMozNodeData( oNode );
                    } // oNode
                    else {
                        // ie
                        sReturn = oXml.text;
                    }
                    if ( sReturn == "" && oXmlHttp.responseText.indexOf("action=\"default.aspx") > -1 ){
                        // session expired, request was redirected to default page
                        alert("Session expired due to inactivity.");
                        window.location.assign(window.location.href);
                    }
                }
                else{
                    sReturn = oXmlHttp.responseText;
                }
            }
            else{                
                var sResponse =  oXmlHttp.responseText;
                alert("Problem fetching data:\n" + sResponse);              
                
            } // 200
         
        } // 4
        return sReturn;
    }
function getMozNodeData(oNode){
// mozilla
    var sData = "";
    try {
        for ( i=0; i < oNode.childNodes.length; i++ ){
            sData += oNode.childNodes[i].data;
        }//for
    } // try
    catch (e){
        sData = "";
        alert("getting data from oNode: " + e);        
    }
    if ( sData.indexOf("XML Parsing Error: no element found\nLocation:") >-1 ){
        sData = "";
    }
    return sData
}

function setClassIDs(){
    //debugger;
    GetMSXmlHttp();
    GetMSXmlDom();
    GetMSXmlFTDom();
    GetMSXslt();
    var dblMinVer=6.0;
    if ( mdblXmlHttpVersion < dblMinVer ){
        dblMinVer = mdblXmlHttpVersion;
    }
    if ( mdblXmlDomVersion < dblMinVer ){
        dblMinVer = mdblXmlDomVersion;
    }
    if ( mdblXmlFTDomVersion < dblMinVer ){
        dblMinVer = mdblXmlFTDomVersion;
    }
    if ( mdblXstlProcVersion < dblMinVer ){
        dblMinVer = mdblXstlProcVersion;
    }
    mLastSuccessfulXmlHttpClassId = mLastSuccessfulXmlHttpClassId.replace( new RegExp( mdblXmlHttpVersion.toString() ), dblMinVer.toString() );
    mLastSuccessfulXmlDomClassId = mLastSuccessfulXmlDomClassId.replace( new RegExp( mdblXmlDomVersion.toString() ), dblMinVer.toString() ); 
    mLastSuccessfulXmlFTDomClassId = mLastSuccessfulXmlFTDomClassId.replace( new RegExp( mdblXmlFTDomVersion.toString() ), dblMinVer.toString() );
    mLastSuccessfulXsltProcClassId = mLastSuccessfulXsltProcClassId.replace( new RegExp( mdblXstlProcVersion.toString() ), dblMinVer.toString() );
    /* alert(mLastSuccessfulXmlHttpClassId + "\n"
        + mLastSuccessfulXmlDomClassId + "\n"
        + mLastSuccessfulXmlFTDomClassId + "\n"
        + mLastSuccessfulXsltProcClassId + "\n" 
    ); */
}

function GetXmlHttpObject(sMimeType)
{ 
    var objXmlHttp = null;
    if (window.XMLHttpRequest)
    {
        // Mozilla | Netscape | Safari | IE 7+
        /*try{
        if ( netscape.security.PrivilegeManager.enablePrivilege ) {
            netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            alert('priveleges enabled (1).');
            }
        }
        catch(e){
            alert('priveleges not enabled (1).');
        }*/
        
        objXmlHttp = new XMLHttpRequest();
        if (objXmlHttp != null)
        {        
            // set type accordingly to anticipated content type
            // 'text/xml' or 'text/html'
            if ( objXmlHttp.overrideMimeType ){
                objXmlHttp.overrideMimeType(sMimeType);
            }
        }
        
    } 
    else
    {
       // IE 6 and older
        objXmlHttp = GetMSXmlHttp();
    } 
   
    return objXmlHttp; 
} 

function GetMSXmlHttp()
{
    var xmlHttp = null;
    if ( mLastSuccessfulXmlHttpClassId != "" ){
        return CreateMsObject(mLastSuccessfulXmlHttpClassId);
    }
    var clsids = ["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0"];
    for(var i=0; i<clsids.length && xmlHttp == null; i++) {
        xmlHttp = CreateMsObject(clsids[i]);
        mLastSuccessfulXmlHttpClassId = clsids[i];
        mdblXmlHttpVersion = parseFloat(mLastSuccessfulXmlHttpClassId.substring(15));
        window.status =  mLastSuccessfulXmlDomClassId + ' - ' + mLastSuccessfulXmlHttpClassId;
    }
    return xmlHttp;
}

function GetMSXmlDom(){
    var XmlDom = null;
    if ( mLastSuccessfulXmlDomClassId != "" ){
        XmlDom = CreateMsObject( mLastSuccessfulXmlDomClassId );
    }
    // var clsids = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ];
    var clsids = [ 'Msxml2.DOMDocument.6.0','Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0' ];
    for(var i=0; i < clsids.length && XmlDom == null; i++) {
        XmlDom = CreateMsObject(clsids[i]);
        mLastSuccessfulXmlDomClassId = clsids[i];
        mdblXmlDomVersion = parseFloat(mLastSuccessfulXmlDomClassId.substring(19));
        window.status =  mLastSuccessfulXmlDomClassId + ' - ' + mLastSuccessfulXmlHttpClassId;
    }
    if ( mLastSuccessfulXmlDomClassId == "Msxml2.DOMDocument.6.0" ){
        XmlDom.setProperty("AllowDocumentFunction", true);
        XmlDom.resolveExternals = true;
    }
    return XmlDom;
}

function GetMSXmlFTDom(){
    var XmlFTDom = null;
    if ( mLastSuccessfulXmlFTDomClassId != "" ){
        XmlFTDom = CreateMsObject( mLastSuccessfulXmlFTDomClassId );
    }
    // var clsids = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ];
    var clsids = [ 'MSXML2.FreeThreadedDOMDocument.6.0','MSXML2.FreeThreadedDOMDocument.4.0', 'MSXML2.FreeThreadedDOMDocument.3.0' ];
    for(var i=0; i < clsids.length && XmlFTDom == null; i++) {
        XmlFTDom = CreateMsObject(clsids[i]);
        mLastSuccessfulXmlFTDomClassId = clsids[i];
        mdblXmlFTDomVersion = parseFloat(mLastSuccessfulXmlFTDomClassId.substring(31));
        window.status =  mLastSuccessfulXmlFTDomClassId + ' - ' + mLastSuccessfulXmlHttpClassId;
    }
     if ( mLastSuccessfulXmlFTDomClassId == "MSXML2.FreeThreadedDOMDocument.6.0" ){
        XmlFTDom.setProperty("AllowDocumentFunction", true);
        XmlFTDom.resolveExternals = true;
        XmlFTDom.setProperty("AllowXsltScript", true);
    }
    
    return XmlFTDom;
}

function GetMSXslt(){
    var Xslt = null;
    if ( mLastSuccessfulXsltProcClassId != "" ){
        Xslt = CreateMsObject( mLastSuccessfulXsltProcClassId );
    }
    var clsids = ["Msxml2.XSLTemplate.6.0","Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"];
    for(var i=0; i < clsids.length && Xslt == null; i++) {
        Xslt = CreateMsObject(clsids[i]);
        mLastSuccessfulXsltProcClassId = clsids[i];
        mdblXstlProcVersion = parseFloat(mLastSuccessfulXsltProcClassId.substring(19));
        window.status =  mLastSuccessfulXmlDomClassId + ' - ' + mLastSuccessfulXmlHttpClassId + ' - ' + mLastSuccessfulXsltProcClassId;
    }
    return Xslt;
}

function CreateMsObject(clsid) {
    var o = null;
    try {
        o = new ActiveXObject(clsid);
        return o;
    }
    catch(e) {
        window.status=e;
    }
}




// ********* X M L *******************************************************************************


function setFireFoxPermission(){
    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
        
       } catch (e) {
        alert( e );
       }
}

function transformXml(sXml, sTargetDivId, sXsltFile, sFunction, saFunctionArgs, sXslParameterList){
    /*
     * adapted from http://www.agavegroup.com/?p=37
     * and
     * http://www.webreference.com/programming/prof_ajax/3.html
     */
    if ( sXml && sXml != "" ){
        var saXslParams = null;
        if ( sXslParameterList != null ){ 
            if ( sXslParameterList.toString() != "" 
                && sXslParameterList.toString() != "undefined" 
                && sXslParameterList.toString().indexOf("~") > 0 ) {
                saXslParams = sXslParameterList.split("|");
            }        
        }
        //sXml = sXml.replace(/&lt;!--/g,"<!--").replace(/--&gt;/g,"-->");
        if(document.implementation && document.implementation.createDocument){
            // *** Mozilla
            try{
                var xsltProcessor = new XSLTProcessor();
                // *** load the XSL file
                var myXMLHTTPRequest = new XMLHttpRequest();
                myXMLHTTPRequest.open("GET", sXsltFile, false);
                myXMLHTTPRequest.send(null);
                // *** get the XSL document
                xslStylesheet = myXMLHTTPRequest.responseXML;
                xsltProcessor.importStylesheet(xslStylesheet);
                if ( saXslParams != null ){
                    for ( iP = 0; iP < saXslParams.length; iP++ ){
                        var saP = saXslParams[iP].split("~");
                        try{
                            xsltProcessor.setParameter( null, saP[0], saP[1] );
                        }
                        catch(e){
                            alert(e + "\n" + "parameter " + saP[0] + " could not be set to " + saP[1] + "!");
                        }
                    }
                }
                // *** load the xml document
                var oParser = new DOMParser();
                var xmlSource = oParser.parseFromString(sXml,"text/xml");
                // *** transform
                var resultDocument = xsltProcessor.transformToFragment(xmlSource, document);
                document.getElementById(sTargetDivId).innerHTML = ""; // erase content first
                document.getElementById(sTargetDivId).appendChild(resultDocument);
                }
            catch(e){
                if ( e.message){
                    alert(sXsltFile + ":\n" + e.message);                        
                    }
                else{
                    alert(e);
                    }
                }    // catch           
            } // mozilla
        else if(window.ActiveXObject){
            //debugger;
            // *** IE
            // *** Load XML
            // Load XML 
            try{
                var oXml = GetMSXmlDom();
                oXml.async = false;
                oXml.loadXML(sXml);

                // *** Load XSL
                var xslDoc = GetMSXmlFTDom();
                xslDoc.async = false
                xslDoc.load(sXsltFile)
                
                var xslt = GetMSXslt();
                xslt.stylesheet = xslDoc;
                
                // *** Transform
                xslProc = xslt.createProcessor();
                xslProc.input = oXml;
                if ( saXslParams != null ){
                    for ( iP = 0; iP < saXslParams.length; iP++ ){
                        var saP = saXslParams[iP].split("~");
                        xslProc.addParameter( saP[0], saP[1] );
                    }
                }
                xslProc.transform();
                document.getElementById(sTargetDivId).innerHTML = xslProc.output;
                //document.getElementById(sTargetDivId).innerHTML = oXml.transformNode(xsl);
                        
                if ( saFunctionArgs ){
                    eval(sFunction + "(\"" + saFunctionArgs + "\");");
                    }
                else{
                    if ( sFunction ){
                        eval( sFunction + "();");
                        }
                    }
                
                }
            catch(e){                
                if ( e.message){
                    alert(sXsltFile + ":\n" + e.message);                        
                    }
                else{
                    alert(e);
                    }
                }            
         }
         else{
            // *** Browser unknown
            alert("Browser unknown");
        }
     } // sXml != ""
     else{
        var oTargetDiv = document.getElementById(sTargetDivId);
        if ( oTargetDiv ){
            oTargetDiv.innerHTML = "No data yet..."
        }
     }
}

function getLoadedXml( sXml ){
    var oXml = null;
    
    if(document.implementation && document.implementation.createDocument){
        // *** Mozilla
        try{
            oXml = oParser.parseFromString(sXml,"text/xml");
        }
        catch(e){
            alert("Could not load mozilla xml:\n" + e);
        }
    }
    else{
        try{
            oXml = GetMSXmlDom();
            oXml.async = false;
            oXml.loadXML(sXml);
        }
        catch(e){
            alert("Could not load IE xml:\n" + e);
        }
    }
    return oXml;

}