function load_SML(f) {

    slidemlfile = window.location.search.substring(1,window.location.search.length);
    if (!slidemlfile)
    {
        slidemlfile = f;
    }
    slides = null;

    contentspace = null;

    currentSlide = null;


    slideml = new xbXMLDocument("","bla");

    Docu = new xbXMLDocument("isDocument");


    if (isMozi) {
        slideml.onload = SML_loaded;
        slideml.load(slidemlfile);
    }

    if (isMSIE) {
        slideml.doc.async = false;
        slideml.doc.load(slidemlfile);

        SML_loaded();
    }
}

function SML_loaded(e) {
    /*if (!e.currentTarget.documentElement)
    {
        alert ("SlideML File couldn't be loaded");
        return false;
    }*/

    if (isMozi) {
        document.addEventListener("keypress",onKeyPress,false);
    } else {
        document.attachEvent("keypress",onKeyPress);
    }

    contentspace = Docu.nodeWrapperFactory(document.getElementById("contents"));

    titlespace = document.getElementById("title");

         /* xincludes = slideml.getElementsByTagNameNS("http://www.w3.org/2001/XInclude","include");}

                for (var i =0; i < xincludes.length; i++)
                {
                    var xincludeDoc = createDOMDocument("","bla",null);
                    xincludeDoc.href = xincludes[i].getAttribute("href");
                    xincludeDoc.Xnode = xincludes[i];
                    xincludeDoc.onload = xinclude_loaded;
                    xincludeDoc.load(xincludeDoc.href);
                }
                */

    if (isMozi) {
        slides = slideml.doc.getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","slide");
    }
    else {
        slides = slideml.doc.getElementsByTagName("s:slide");
    }

    showStart();
    //showToc();
    try {
     //   copyrightspace= document.getElementById("copyright");
     //   copyrightspace.firstChild.data = "copyright © 2003 " + slideml.doc.getElementsByTagNameNS("http://purl.org/dc/elements/1.1","rights")[0].firstChild.data;
    }
    catch (e) {};
}

function showSlide(number)
{
    if (number < 0)
    {
        showStart();
        return;
    }
//    document.getElementById("nav").style.background="#00cc00";

    currentSlide = number;
    document.getElementById("top").style.display ="none";
    clearSpace();

    if (isMozi) {
        var title = slides[number].getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","title");
    } else {
        var title = slides[number].getElementsByTagName("s:title");
    }

try{
    if (isMozi) {
        var nexttitle = slides[number+1].getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","title");
    } else {
        var nexttitle = slides[number+1].getElementsByTagName("s:title");
    }
} catch(e) {}
    try {
        window.defaultStatus = "Slide Nr. "+(currentSlide + 1) + " -> " + nexttitle[0].firstChild.nodeValue;
    } catch(e) {
       window.defaultStatus = "Slide Nr. "+(currentSlide + 1);
    }

    var h1 = contentspace.node.appendChild(document.createElement("h1"));

    Docu.getElementById("title").appendChild(Docu.importNode(slideml.nodeWrapperFactory(title[0]),1));

       if (isMozi) {
        var content = slides[number].getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","content");
    } else {

        var content = slides[number].getElementsByTagName("s:content");
    }

    for (var i =0; i < content.length; i++)
    {

        contentspace.appendChild(Docu.importNode(slideml.nodeWrapperFactory(content[i]),1));
    }

    updatePrevNext(number);
}

function showToc ()
{
    clearSpace();
    document.getElementById("top").style.display ="none";

    for (var i =0; i < slides.length; i++)
    {
        var title = slides[i].getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","title");
        var toc_title = document.createElementNS("http://www.w3.org/1999/xhtml","a");

        toc_title.setAttribute("href","javascript:showSlide("+i+")");
        if (title[0].firstChild) {

            toc_title.appendChild(title[0].firstChild.cloneNode(1));
        }

        var toc_title = document.getElementById("contents").appendChild(toc_title);
        toc_title.parentNode.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml","br"),toc_title.nextSibling);

    }
}

function showStart()
{
//    document.getElementById("nav").style.backgroundImage="";
//    document.getElementById("top").style.display ="block";
//    document.getElementById("nav").style.backgroundImage="url(bg_pattern.gif)";

    document.getElementById("top").style.display ="block";
    clearSpace();


    if (isMozi) {
        var metadata = slideml.getElementsByTagNameNS("http://www.oscom.org/2003/SlideML/1.0/","metadata");
    } else {
        var metadata = slideml.getElementsByTagName("s:metadata");
    }


    var slide_title = metadata[0];
    
    var importNode = Docu.importNode(slide_title,true);

    var toc_title = Docu.getElementById("contents").appendChild(importNode);
//    alert(toc_title.node.outerHTML);

    //alert("contents = " + document.getElementById("contents").outerHTML);

    currentSlide = -1;
    updatePrevNext(-1);
}

function clearSpace()
{
    var contentspaceLength = contentspace.node.childNodes.length;
    for (var i =0; i < contentspaceLength; i++)
    {
        contentspace.node.removeChild(contentspace.node.childNodes[0]);
    }

    var titlespaceLength = titlespace.childNodes.length;
    for (var i =0; i < titlespaceLength; i++)
    {
        titlespace.removeChild(titlespace.childNodes[0]);
    }
}

function updatePrevNext(number)
{
    if (number < 0)
    {
        document.getElementById("prev").style.visibility="hidden";
    }
    else
    {
        document.getElementById("prev").style.visibility="visible";
        //      document.getElementById("prev").setAttribute("href","javascript:showSlide(currentSlide - 1)");
    }
    if (number+1 == slides.length)
    {
        document.getElementById("next").style.visibility="hidden";
    }
    else
    {
        document.getElementById("next").style.visibility="visible";
    }


}

function onKeyPress(e)
{
        switch (e.keyCode)
        {
            case e.DOM_VK_LEFT:
            showSlide(currentSlide - 1);
            e.preventDefault();
            break;
            case e.DOM_VK_RIGHT:
            showSlide(currentSlide + 1)
            e.preventDefault();
            break;
            case e.DOM_VK_HOME: // backspace
            showStart()
            e.preventDefault();
            break;
            case e.DOM_VK_END: // backspace
            showToc()
            e.preventDefault();
            break;

        }

        switch (e.charCode)
        {
            case e.DOM_VK_SPACE: // backspace
            showSlide(currentSlide + 1)
            e.preventDefault();
            break;
        }
}

function BX_debug(object)
{
    var win = window.open("","debug",null);
    bla = "";

    for (b in object)

    {

        /*bla += b;
        try {

            bla +=  ": "+object.eval(b) ;
        }
        catch(e)
        {
            bla += ": NOT EVALED";
        };*/
        bla += "\n";
    }
    win.document.innerHTML = "";

    win.document.writeln("<pre>");
    win.document.writeln(bla);
    win.document.writeln("<hr>");
}

function xinclude_loaded(e)
{
    // xpath by namespace does only work with mozilla 1.1....
    var xmlns = e.currentTarget.href.match(/xmlns\(([a-z]+)=([^\)]*)\)/);
    var xpointer = e.currentTarget.href.match(/xpointer\(([^\)]*)\)/);
    var nsResolver = e.currentTarget.createNSResolver(e.currentTarget.documentElement);
    var result = e.currentTarget.evaluate(xpointer[1],e.currentTarget.documentElement, nsResolver, 0, null);

    if (node = result.iterateNext())
    {
        newNode = node.cloneNode(1);
        bli = e.currentTarget.Xnode.parentNode.replaceChild(newNode,e.currentTarget.Xnode);
        while ((node = result.iterateNext()))
        {
            newNode.parentNode.insertBefore(node.cloneNode(1),newNode.nextSibling);
        }
    }
}
