
//  platformMoz:  http://www.mozilla.org/projects/xslt/js-interface.html
//  platformIE6:  http://www.perfectxml.com/articles/xml/XSLTInMSXML.asp

var platformMoz = (document.implementation && document.implementation.createDocument);
var platformIE6 = (!platformMoz && document.getElementById && window.ActiveXObject);
var noXSLT      = (!platformMoz && !platformIE6);

var msxmlVersion = '3.0';

var urlXML;
var urlXSL;
var docXML;
var docXSL;
var target;
var cache;
var processor;
var i;

var paramNames = new Array('id','res','uri');
var paramValues = new Array('','','');
var nParams = paramNames.length;

if (platformIE6)
{
    // TODO... find out version of MSXML installed
    cache = new ActiveXObject('Msxml2.XSLTemplate.' + msxmlVersion);
}

function Initialize()
{
    if (noXSLT)
    {
        FatalError();
        return;
    }
    Defaults();
}

function Defaults()
{
    SetTarget('target');
    SetInput('slides.xml');
    SetStylesheet('style.xsl');
}

function SetTarget(id)
{
    target = document.getElementById(id);
}

function SetInput(url)
{
    urlXML = url;
}

function SetStylesheet(url)
{
    urlXSL = url;
}

function SetParam(name, value)
{
    var found = false;

    for (i = 0; i< nParams; i++)
    {
        if (paramNames[i] == name)
        {
            paramValues[i] = value;
            found = true;
        }
    }
    if (!found)
    {
        NoSuchParam(name);
    }
}

function SetParamInt(name, value)
{
    var found = false;

    for (i = 0; i< nParams; i++)
    {
        if (paramNames[i] == name)
        {
            paramValues[i] = parseInt(value);
            found = true;
        }
    }
    if (!found)
    {
        NoSuchParam(name);
    }
}

function SetPrevious(name,value,min)
{
    var found = false;

    for (i = 0; i< nParams; i++)
    {
        if (paramNames[i] == name)
        {
            if (paramValues[i] > min)
            {
                paramValues[i] = parseInt(value) - 1;
            }
            found = true;
        }
    }
    if (!found)
    {
        NoSuchParam(name);
    }
}

function SetNext(name,value,max)
{
    var found = false;

    for (i = 0; i< nParams; i++)
    {
        if (paramNames[i] == name)
        {
            if (paramValues[i] < max)
            {
                paramValues[i] = parseInt(value) + 1;
            }
            found = true;
        }
    }
    if (!found)
    {
        NoSuchParam(name);
    }
}

function FatalError()
{
    alert("Sorry, this doesn't work in your browser");
}

function NoSuchParam(name)
{
    alert("There is no " + name + " parameter");
}

function CreateDocument()
{
    var doc = null;

    if (platformMoz)
    {
        doc = document.implementation.createDocument('', '', null);
    }
    else if (platformIE6)
    {
        doc = new ActiveXObject('Msxml2.FreeThreadedDOMDocument.' + msxmlVersion);
    }
    return doc;
}

function Transform()
{
    if (noXSLT)
    {
        FatalError();
        return;
    }
    docXML = CreateDocument();
    docXSL = CreateDocument();

    if (platformMoz)
    {
        docXML.addEventListener('load', DoLoadXSL, false);
        docXML.load(urlXML);
    }
    else if (platformIE6)
    {
        docXML.async = false;
        docXML.load(urlXML);

        docXSL.async = false;
        docXSL.load(urlXSL);

        DoTransform();
    }
}

function DoLoadXSL()
{
    if (platformMoz)
    {
        docXSL.addEventListener('load', DoTransform, false);
        docXSL.load(urlXSL);
    }
}

function DoTransform()
{
    if (platformMoz)
    {
        processor = new XSLTProcessor();
        processor.importStylesheet(docXSL);

        AddParams(processor);

        var fragment = processor.transformToFragment(docXML, document);

        while (target.hasChildNodes()) target.removeChild(target.childNodes[0]);

        target.appendChild(fragment);
    }
    else if (platformIE6)
    {
        cache.stylesheet = docXSL;

        processor = cache.createProcessor();
        processor.input = docXML;

        AddParams(processor);

        processor.transform();

        target.innerHTML = processor.output;
    }
}

function AddParams(processor)
{
    for (i = 0; i< nParams; i++)
        if (paramValues[i] != '') AddParam(processor, paramNames[i], paramValues[i]);
}

function AddParam(processor, name, value)
{
    if (platformMoz) processor.setParameter(null, name, value);
    else if (platformIE6) processor.addParameter(name, value);
}

