/* slides.js

   Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
   W3C liability, trademark, document use and software licensing
   rules apply, see:

   http://www.w3.org/Consortium/Legal/copyright-documents
   http://www.w3.org/Consortium/Legal/copyright-software
*/

var ns_pos = (typeof window.pageYOffset!='undefined');

window.onload = startup; // equivalent to onload on body element

var slidenum = 0;     // integer slide count: 0, 1, 2, ...
var slides;           // set to array of slide div's
var slideNumElement;  // element containing slide number
var notes;            // set to array of handout div's
var footer;           // element containing footer
var title;            // document title
var lastShown = null; // last incrementally shown item

var viewAll = 0;      // 1 to view all slides + handouts
var wantFooter = 1;   // 0 if footer isn't wanted
var scrollhack = 0;   // IE work around for position: fixed

var helpPage = "../help/help.html";
var helpText = "Pagina di help per conoscere il funzionamento dell\'interfaccia";

var sizeIndex = 0;
var sizes = new Array("10pt", "12pt", "14pt", "16pt", "18pt",
                      "20pt", "22pt", "24pt", "26pt");

// the corresponding expected footer height in pixels
// as measured with Internet Explorer and Galeon

var footerHeight = new Array(10,12,13,15,16,19,21,23,25);

var okayForIncremental = incrementalElementList();

var lastWidth = 0;

/* general initialization */
function startup()
{
   title = document.title;
   footer = addFooter();
   slides = collectSlides();
   notes = collectNotes();
   patchAnchors();
   slidenum = findSlideNumber(location.href);

   if (slides.length > 0)
   {
      lastShown = null;
      setVisibilityAllIncremental("hidden");
      slide = slides[slidenum];
      showSlide(slide);
      setLocation();
   }

   // bind even handlers
   document.onclick = mouseButtonClick;
   document.onkeydown = keyDown;
   //window.onresize = resized;
   window.onscroll = scrolled;

   setLocation();
   //resized();
   showFooter();
   //fontAdjust();
}

// hack to work around variation in point size to pixels as
// Opera/Linux displays fonts 30% smaller than other browsers

function fontAdjust()
{
   var fontAdjustment = footerHeight[sizeIndex] / footer.offsetHeight;
   //alert("fontAdjustment is " + fontAdjustment);

   if (fontAdjustment > 1.1)
   {
      // calculated adjustment varies with Opera's window size
      // which causes problems, so let's fix it to 1.3
      fontAdjustment = 1.3;

      for (var i = 0; i < sizes.length; ++i)
      {
         size = parseInt(sizes[i]);
         sizes[i] = Math.round(fontAdjustment * size) + "pt";
      }

      document.body.style.fontSize = sizes[sizeIndex];

      // force correct positioning of footer
      setTimeout(showFooter, 500);
      //alert("adjustment is " + fontAdjustment);
   }

   showFooter();
}
function cancel(event)
{
  event.cancel = true;
  event.returnValue = false;

  if (event.preventDefault)
    event.preventDefault();

  return false;
}
function resized()
{
   var width = 0;

   if( typeof( window.innerWidth ) == 'number' )
   {
      width = window.innerWidth;  // Non IE browser
   }
   else if (document.documentElement && document.documentElement.clientWidth)
   {
      width = document.documentElement.clientWidth;  // IE6
   }
   else if (document.body && document.body.clientWidth)
   {
      width = document.clientWidth; // IE4
   }
   //alert(width);

	/* fede */ width = Math.round((width*66)/100);
	//alert(width);
   // IE fires onresize even when only font size is changed!
   // so we do a check to avoid blocking < and > actions
   if (width != lastWidth)
   {
      if (width > 1100)
         sizeIndex = 4;
      else if (width > 1000)
         sizeIndex = 3;
      else if (width > 800)
         sizeIndex = 2;
      else if (width > 400)
         sizeIndex = 1;
      else if (width)
         sizeIndex = 0;

      document.body.style.fontSize = sizes[sizeIndex];
	  //alert(document.body.style.fontSize);
      lastWidth = width;

      // force correct positioning of footer
      hideFooter();
      setTimeout(showFooter, 500);
   }
}

function scrolled()
{
   if (footer && !ns_pos)
   {
      // hide footer
      footer.style.display = "none";

      // make it reappear later
      if (scrollhack == 0 && !viewAll)
      {
         setTimeout(showFooter, 2000);
         scrollhack = 1;
      }
   }
}

// restores footer after short delay
function showFooter()
{
   if (wantFooter)
      footer.style.display = "block";

   scrollhack = 0;
}

function hideFooter()
{
   footer.style.display = "none";
}

// invoked via F key
function toggleFooter()
{
   if (!viewAll)
   {
      if (footer.style.display == "none")
      {
         footer.style.display = "block";
         wantFooter = 1;
      }
      else
      {
         footer.style.display = "none";
         wantFooter = 0;
      }
   }
}

// these don't work well on Opera, for which
// we take advantage on @media projection
function smaller()
{
   if (sizeIndex > 0)
   {
      --sizeIndex;
   }

   footer.style.display = "none";
   document.body.style.fontSize = sizes[sizeIndex];
   setTimeout(showFooter, 300);
}

function bigger()
{
   if (sizeIndex < sizes.length - 1)
   {
      ++sizeIndex;
   }

   footer.style.display = "none";
   document.body.style.fontSize = sizes[sizeIndex];
   setTimeout(showFooter, 300);
}

//  See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
function keyDown(event)
{
    var key;

    if (!event)
      var event = window.event;

    // kludge around NS/IE differences 
    if (window.event)
       key = window.event.keyCode;
    else if (event.which)
       key = event.which;
    else
       return true; // Yikes! unknown browser

    // ignore event if key value is zero
    // as for alt on Opera and Konqueror
    if (!key)
       return true;

    // check for concurrent control/command/alt key
    // but are these only present on mouse events?

    if (event.ctrlKey || event.altKey)
       return true;

    if (key == 34) // Page Down
    {
       nextSlide(false);
       return cancel(event);
    }
    else if (key == 33) // Page Up
    {
       previousSlide(false);
       return cancel(event);
    }
    else if (key == 32) // space bar
    {
       nextSlide(true);
       return cancel(event);
    }
    else if (key == 37) // Left arrow
    {
       previousSlide(true);
       return cancel(event);
    }
    else if (key == 36) // Home
    {
       firstSlide();
       return cancel(event);
    }
    else if (key == 35) // End
    {
       lastSlide();
       return cancel(event);
    }
    else if (key == 39) // Right arrow
    {
       nextSlide(true);
       return cancel(event);
    }
    else if (key == 188)  // < for smaller fonts
    {
       smaller();
       return cancel(event);
    }
    else if (key == 190)  // > for larger fonts
    {
       bigger();
       return cancel(event);
    }
    else if (key == 189 || key == 109)  // - for smaller fonts
    {
       smaller();
       return cancel(event);
    }
    else if (key == 187 || key == 191 || key == 107)  // = +  for larger fonts
    {
       bigger();
       return cancel(event);
    }
    else if (key == 86)  // V for smaller fonts
    {
       smaller();
       return cancel(event);
    }
    else if (key == 66)  // B for larger fonts
    {
       bigger();
       return cancel(event);
    }
    else if (key == 90)  // Z for last slide
    {
       lastSlide();
       return cancel(event);
    }
    else if (key == 70)  // F for toggle toolbar
    {
       toggleToolbar();
       return cancel(event);
    }
    else if (key == 65)  // A for toggle view single/all slides
    {
       toggleView();
       return cancel(event);
    }
    else if (key == 75)  // toggle action of left click for next page
    {
       mouseClickEnabled = !mouseClickEnabled;
       alert((mouseClickEnabled ? "enabled" : "disabled") +  " mouse click advance");
       return cancel(event);
    }
    else if (key == 84)  // T for test
    {
       test();
       return cancel(event);
    }
    //else alert("key code is "+ key);

    return true;
}


// right mouse button click is reserved for context menus
// it is more reliable to detect rightclick than leftclick
function mouseButtonClick(e)
{
   var rightclick = false;
   var target;

   if (!e)
      var e = window.event;

   if (e.target)
      target = e.target;
   else if (e.srcElement)
      target = e.srcElement;

   // work around Safari bug
   if (target.nodeType == 3)
      target = target.parentNode;

   if (e.which)
      rightclick = (e.which == 3);
   else if (e.button)
      rightclick = (e.button == 2);

   // check if target is something that probably want's clicks
   // e.g. embed, object, input, textarea, select, option

   if (!rightclick &&
        target.nodeName != "EMBED" &&
        target.nodeName != "OBJECT" &&
        target.nodeName != "INPUT" &&
        target.nodeName != "TEXTAREA" &&
        target.nodeName != "SELECT" &&
        target.nodeName != "OPTION")
   {
      nextSlide();
      stopPropagation(e);
   }
}

function previousSlide()
{
   if (!viewAll)
   {
      var slide;

      if (lastShown != null)
         lastShown = hidePreviousItem(lastShown);
      else if (slidenum > 0)
      {
         slide = slides[slidenum];
         hideSlide(slide);

         slidenum = slidenum - 1;
         slide = slides[slidenum];
         setVisibilityAllIncremental("visible");
         lastShown = previousIncrementalItem(null);
         showSlide(slide);
      }

      setLocation();
   }
}

function nextSlide()
{
   if (!viewAll)
   {
      var slide;

      lastShown = revealNextItem(lastShown);

      if (lastShown == null && slidenum < slides.length - 1)
      {
         slide = slides[slidenum];
         hideSlide(slide);

         slidenum = slidenum + 1;
         slide = slides[slidenum];
         lastShown = null;
         setVisibilityAllIncremental("hidden");
         showSlide(slide);
      }

      setLocation();
   }
}

function firstSlide()
{
   if (!viewAll)
   {
      var slide;

      if (slidenum != 0)
      {
         slide = slides[slidenum];
         hideSlide(slide);

         slidenum = 0;
         slide = slides[slidenum];
         lastShown = null;
         setVisibilityAllIncremental("hidden");
         showSlide(slide);
      }

      setLocation();
   }
}


function lastSlide()
{
   if (!viewAll)
   {
      var slide;

      lastShown = revealNextItem(lastShown);

      if (lastShown == null && slidenum < slides.length - 1)
      {
         slide = slides[slidenum];
         hideSlide(slide);

         slidenum = slides.length - 1;
         slide = slides[slidenum];
         lastShown = null;
         setVisibilityAllIncremental("hidden");
         showSlide(slide);
	  }

      setLocation();
	}
}

function showSlide(slide)
{
   slide.style.visibility = "visible";
   slide.style.display = "block";
}

function hideSlide(slide)
{
   slide.style.visibility = "hidden";
   slide.style.display = "none";
}

function toggleView()
{
   if (viewAll)
   {
      singleSlideView();
      showFooter();
      viewAll = 0;
   }
   else
   {
      showAllSlides();
      hideFooter();
      viewAll = 1;
   }
}

// prepare for printing
function showAllSlides()
{
   var slide;

   for (var i = 0; i < slides.length; ++i)
   {
      slide = slides[i];

      slide.style.borderTopStyle = "solid";
      slide.style.borderTopWidth = "thin";
      slide.style.borderTopColor = "black";

      setVisibilityAllIncremental("visible");
      showSlide(slide);
   }

   var note;

   for (var i = 0; i < notes.length; ++i)
   {
      showSlide(notes[i]);
   }
}

// restore after printing
function singleSlideView()
{
   var slide;

   for (var i = 0; i < slides.length; ++i)
   {
      slide = slides[i];

      if (i == slidenum)
      {
         slide.style.borderStyle = "none";
         showSlide(slide);
      }
      else
      {
         slide.style.borderStyle = "none";
         hideSlide(slide);
      }
   }

   setVisibilityAllIncremental("visible");
   lastShown = previousIncrementalItem(null);

   var note;

   for (var i = 0; i < notes.length; ++i)
   {
      hideSlide(notes[i]);
   }
}

// the string str is a whitespace separated list of tokens
// test if str contains a particular token, e.g. "slide"
function hasToken(str, token)
{
   if (str)
   {
      // define pattern as regular expression
      var pattern = /\w+/g;

      // check for matches
      // place result in array
      var result = str.match(pattern);

      // now check if desired token is present
      for (var i = 0; i < result.length; i++)
      {
         if (result[i] == token)
            return true;
      }
   }

   return false;
}

// return new array of all slides
function collectSlides()
{
   var slides = new Array();
   var divs = document.body.getElementsByTagName("div");

   // IE getAttribute requires "class" to be "className"
   var name = ns_pos ? "class" : "className";

   for (var i = 0; i < divs.length; ++i)
   {
      div = divs.item(i);

      if (hasToken(div.getAttribute(name), "slide"))
      {
         // add slide to collection
         slides[slides.length] = div;

         // hide each slide as it is found
         div.style.display = "none";
         div.style.visibility = "hidden";
      }
   }

   return slides;
}

// return new array of all <div class="handout">
function collectNotes()
{
   var notes = new Array();
   var divs = document.body.getElementsByTagName("div");

   // IE getAttribute requires "class" to be "className"
   var name = ns_pos ? "class" : "className";

   for (var i = 0; i < divs.length; ++i)
   {
      div = divs.item(i);

      if (hasToken(div.getAttribute(name), "handout"))
      {
         // add slide to collection
         notes[notes.length] = div;

         // hide handout notes as they are found
         div.style.display = "none";
         div.style.visibility = "hidden";
      }
   }

   return notes;
}

// left to right traversal of root's content
function nextNode(root, node)
{
   if (node == null)
      return root.firstChild;

   if (node.firstChild)
      return node.firstChild;

   if (node.nextSibling)
      return node.nextSibling;

   for (;;)
   {
      node = node.parentNode;

      if (node == root)
         return null;

      if (node.nextSibling)
         return node.nextSibling;
   }

   return null;
}

// right to left traversal of root's content
function previousNode(root, node)
{
   if (node == null)
   {
      node = root.lastChild;

      if (node)
      {
         while (node.lastChild)
            node = node.lastChild;
      }

      return node;
   }

   if (node.previousSibling)
   {
      node = node.previousSibling;

      while (node.lastChild)
         node = node.lastChild;

      return node;
   }

   if (node.parentNode != root)
      return node.parentNode;

   return null;
}

// HTML elements that can be used with class="incremental"
// note that you can also put the class on containers like
// up, ol, dl, and div to make their contents appear
// incrementally. Upper case is used since this is what
// browsers report for HTML node names (text/html).
function incrementalElementList()
{
   var inclist = new Array();
   inclist["P"] = true;
   inclist["PRE"] = true;
   inclist["LI"] = true;
   inclist["BLOCKQUOTE"] = true;
   inclist["DT"] = true;
   inclist["DD"] = true;
   inclist["H2"] = true;
   inclist["H3"] = true;
   inclist["H4"] = true;
   inclist["H5"] = true;
   inclist["H6"] = true;
   inclist["SPAN"] = true;
   inclist["ADDRESS"] = true;
   inclist["TABLE"] = true;
   inclist["IMG"] = true;
   inclist["OBJECT"] = true;
   return inclist;
}

function nextIncrementalItem(node)
{
   var slide = slides[slidenum];

   // IE getAttribute requires "class" to be "className"
   var classattr = ns_pos ? "class" : "className";


   for (;;)
   {
      node = nextNode(slide, node);

      if (node == null || node.parentNode == null)
         break;

      if (node.nodeType == 1)  // ELEMENT
      {
         if (node.parentNode.getAttribute(classattr) == "incremental"
             && node.nodeName != "BR")
            return node;

         if (node.getAttribute(classattr) == "incremental"
             && okayForIncremental[node.nodeName])
         {
            return node;
         }
      }
   }

   return node;
}

function previousIncrementalItem(node)
{
   var slide = slides[slidenum];

   // IE getAttribute requires "class" to be "className"
   var classattr = ns_pos ? "class" : "className";


   for (;;)
   {
      node = previousNode(slide, node);

      if (node == null || node.parentNode == null)
         break;

      if (node.nodeType == 1)
      {
         if (node.parentNode.getAttribute(classattr) == "incremental"
             && node.nodeName != "BR")
            return node;

         if (node.getAttribute(classattr) == "incremental"
             && okayForIncremental[node.nodeName])
         {
            return node;
         }
      }
   }

   return node;
}

// set visibility for all elements on current slide with
// a parent element with attribute class="incremental"
function setVisibilityAllIncremental(value)
{
   var node = nextIncrementalItem(null);

   while (node)
   {
      node.style.visibility = value;
      node = nextIncrementalItem(node);
   }
}

// reveal the next hidden item on the slide
// node is null or the node that was last revealed
function revealNextItem(node)
{
   node = nextIncrementalItem(node);

   if (node && node.nodeType == 1)  // an element
      node.style.visibility = "visible";

   return node;
}


// exact inverse of revealNextItem(node)
function hidePreviousItem(node)
{
   if (node && node.nodeType == 1)  // an element
      node.style.visibility = "hidden";

   return previousIncrementalItem(node);
}


/* set click handlers on all anchors */
function patchAnchors()
{
   var anchors = document.body.getElementsByTagName("a");

   for (var i = 0; i < anchors.length; ++i)
   {
      anchors[i].onclick = clickedAnchor;
   }
}

function clickedAnchor(e)
{
   if (!e)
      var e = window.event;

   // compare this.href with location.href
   // for link to another slide in this doc

   if (pageAddress(this.href) == pageAddress(location.href))
   {
      // yes, so find new slide number
      var newslidenum = findSlideNumber(this.href);

      if (newslidenum != slidenum)
      {
         slide = slides[slidenum];
         hideSlide(slide);
         slidenum = newslidenum;
         slide = slides[slidenum];
         showSlide(slide);
         setLocation();
      }
   }
   else if (this.target == null)
      location.href = this.href;

   this.blur();
   stopPropagation(e);
}

function pageAddress(uri)
{
   var i = uri.indexOf("#");

   // check if anchor is entire page

   if (i < 0)
      return uri;  // yes

   return uri.substr(0, i);
}

function showSlideNumber()
{
   slideNumElement.innerHTML = "lezione " +
           (slidenum + 1) + "/" + slides.length;
}

function setLocation()
{
   var uri = pageAddress(location.href);

   if (slidenum > 0)
      uri = uri + "#[" + (slidenum+1) + "]";

   if (uri != location.href)
      location.href = uri;

   document.title = title + " [" + (slidenum+1) + "]";
   //document.title = (slidenum+1) + ") " + slideName();
   showSlideNumber();
}

// find current slide based upon location
// first find target anchor and then look
// for associated div element enclosing it
// finally map that to slide number
function findSlideNumber(uri)
{
   // first get anchor from page location

   var i = uri.indexOf("#");

   // check if anchor is entire page

   if (i < 0)
      return 0;  // yes

   var anchor = uri.substr(i+1);

   // now use anchor as XML ID to find target
   var target = document.getElementById(anchor);

   if (!target)
   {
      // does anchor look like "[2]" for slide 2 ??
      // where first slide is [1]
      var re = /\[(\d)+\]/;

      if (anchor.match(re))
      {
         var num = parseInt(anchor.substring(1, anchor.length-1));

         if (num > slides.length)
            num = 1;

         if (--num < 0)
            num = 0;

         return num;
      }

      // oh dear unknown anchor
      return 0;
   }

   // search for enclosing slide

   // IE getAttribute requires "class" to be "className"
   var name = ns_pos ? "class" : "className";

   while (true)
   {
      // browser coerces html elements to uppercase!
      if (target.nodeName.toLowerCase() == "div" &&
          target.getAttribute(name) == "slide")
      {
         // found the slide element
         break;
      }

      // otherwise try parent element if any

      target = target.parentNode;

      if (!target)
      {
         return 0;   // no luck!
      }
   };

   for (i = 0; i < slides.length; ++i)
   {
      if (slides[i] == target)
         return i;  // success
   }

   // oh dear still no luck
   return 0;
}

// find slide name from h1 element
// default to document title
function slideName()
{
   var nodes = slides[slidenum].childNodes

   for (var i = 0; i < nodes.length; ++i)
   {
      var node = nodes[i];

      if (node.nodeType == 1 &&
           (node.nodeName == "H1" || node.nodeName == "h1"))
         return node.innerHTML;
   }

   return title;
}

// find copyright text from meta element
function findCopyright()
{
   var name, content;
   var meta = document.getElementsByTagName("meta");

   for (var i = 0; i < meta.length; ++i)
   {
      name = meta[i].getAttribute("name");
      content = meta[i].getAttribute("content");

      if (name == "copyright")
         return content;
   }

   return null;
}

function addFooter()
{
   var slideCounter, page;

   var footer = createElement("div");
   footer.setAttribute("class", "footer");

   if (ns_pos) // a reasonably behaved browser
   {
      var right = document.createElement("div");
      right.setAttribute("style", "float: right; text-align: right; ");

      slideCounter = document.createElement("div")
      slideCounter.innerHTML = "slide n/m";
      right.appendChild(slideCounter);
      footer.appendChild(right);

      var left = document.createElement("div");
      left.setAttribute("style", "text-align: left");

	

      var help = document.createElement("a");
      help.setAttribute("href", helpPage);
      help.setAttribute("title", helpText);
      help.innerHTML = "help";
      left.appendChild(help);

      var gap = document.createTextNode(" ");
      left.appendChild(gap);

      var i = location.href.indexOf("#");

      // check if anchor is entire page

      if (i > 0)
         page = location.href.substr(0, i);
      else
         page = location.href;

		
			/*NEW fede 06-05-05*/
	  var center = document.createElement("div");
      center.setAttribute("style", "text-align: center");
	  //footer.appendChild(center);
	 
	  var rew = document.createElement("a");
	  rew.setAttribute("class", "control_bar");
	  rew.setAttribute("href", "#");
      rew.setAttribute("title", "vai al capitolo precedente");
      rew.innerHTML = "&lt;&lt;";

	  var prev = document.createElement("a");
	  prev.setAttribute("class", "control_bar");
	  prev.setAttribute("href", "#");
      prev.setAttribute("title", "vai alla lezione precedente");
      prev.innerHTML = "&lt;";
	  
	  var next = document.createElement("a");
	  next.setAttribute("class", "control_bar");
	  next.setAttribute("href", "#");
      next.setAttribute("title", "vai alla lezione successiva");
      next.innerHTML = "&gt;";

	  var ffwd = document.createElement("a");
	  ffwd.setAttribute("class", "control_bar");
	  ffwd.setAttribute("href", "#");
      ffwd.setAttribute("title", "vai al capitolo successivo");
      ffwd.innerHTML = " &gt;&gt;";

	  
	  /**/
      var start = document.createElement("a");
      start.setAttribute("href", page);
      start.setAttribute("title", "ritorna alla prima lezione");
      start.innerHTML = "restart";
      left.appendChild(start);

	 

	 /*var menu = document.createElement("a");
      menu.setAttribute("href", "../Home.html");
	  
      menu.setAttribute("title", "torna al menu");
      menu.innerHTML = "menu";
      left.appendChild(menu);*/

	  /*left.appendChild(rew);	
	  left.appendChild(prev);
      left.appendChild(next);
	  left.appendChild(ffwd);*/

      var copyright = findCopyright();

      if (copyright)
      {
         var span = document.createElement("span");
         span.innerHTML = copyright;
         span.style.color = "black";
         span.style.marginLeft = "4em";
         left.appendChild(span);
      }

      footer.appendChild(left);
	  //footer.appendChild(center);
   }
   else // IE so need to work around its poor CSS support
   {
      footer.style.position = "absolute";
      footer.style.width = "100%";
      footer.style.height = "1.2em";
	  //footer.style.height = "5em";
      footer.style.top = "auto";
      footer.style.bottom = 0;
      footer.style.left = "0";
      footer.style.right = "0";
      footer.style.textAlign = "left";
      footer.style.fontSize = "60%";
      footer.style.color = "yellow";
	  footer.style.padding ="0 1em;";
      //footer.style.background = "rgb(240,240,240)";
	  footer.style.background = "#153987";

      // would like to have help text left aligned
      // and page counter right aligned, floating
      // div's don't work, so instead use nested
      // absolutely positioned div's.

      var sp = document.createElement("span");
      sp.innerHTML = "&nbsp;&nbsp;";
      footer.appendChild(sp);

      var help = document.createElement("a");
      help.setAttribute("href", helpPage);
      help.setAttribute("title", helpText);
      help.innerHTML = "help";
      footer.appendChild(help);

      var gap = document.createTextNode(" ");
      footer.appendChild(gap);


      var i = location.href.indexOf("#");
	
      // check if anchor is entire page

      if (i > 0)
         page = location.href.substr(0, i);
      else
         page = location.href;

      var start = document.createElement("a");
      start.setAttribute("href", page);
      start.setAttribute("title", "ritorna alla prima lezione");
      start.innerHTML = "restart";
      footer.appendChild(start);
	  
	/*var menu = document.createElement("a");
      menu.setAttribute("href", "../Home.html");
	
      menu.setAttribute("title", "torna al menu");
      menu.innerHTML = "menu";
     footer.appendChild(menu);*/

      var copyright = findCopyright();

      if (copyright)
      {
         var span = document.createElement("span");
         span.innerHTML = copyright;
         span.style.color = "black";
         span.style.marginLeft = "2em";
         footer.appendChild(span);
      }

      slideCounter = document.createElement("div")
      slideCounter.style.position = "absolute";
	  //slideCounter.style.padding="1em 1em";
	  slideCounter.style.margin="0 0 0 0";
      slideCounter.style.width = "auto"; //"20%";
      slideCounter.style.height = "1.2em";
	  //slideCounter.style.height = "5em";
      slideCounter.style.top = "auto";
      slideCounter.style.bottom = "0";
      slideCounter.style.right = "0";
      slideCounter.style.textAlign = "right";
      slideCounter.style.color = "yellow";
      //slideCounter.style.background = "rgb(240,240,240)";
	  //slideCounter.style.background = "#153987";

      slideCounter.innerHTML = "slide n/m";
      footer.appendChild(slideCounter);
   }

   // ensure that click isn't passed through to the page
   footer.onclick = stopPropagation;
   document.body.appendChild(footer);
   slideNumElement = slideCounter;
   return footer;
}

function replaceByNonBreakingSpace(str)
{
   for (var i = 0; i < str.length; ++i)
      str[i] = 160;
}

function stopPropagation(e)
{
   if (window.event)
   {
      window.event.cancelBubble = true;
      //window.event.returnValue = false;
   }
   else
   {
      e.cancelBubble = true;
      e.stopPropagation();
      //e.preventDefault();
   }
}

// works with text/html and text/xhtml+xml with thanks to Simon Willison
function createElement(element)
{
   if (typeof document.createElementNS != 'undefined')
   {
      return document.createElementNS('http://www.w3.org/1999/xhtml', element);
   }

   if (typeof document.createElement != 'undefined')
   {
      return document.createElement(element);
   }

   return false;
}

// designed to work with both text/html and text/xhtml+xml
function getElementsByTagName(name)
{
   if (typeof document.getElementsByTagNameNS != 'undefined')
   {
      return document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', name);
   }

   if (typeof document.getElementsByTagName != 'undefined')
   {
      return document.getElementsByTagName(name);
   }

   return null;
}

// clean alternative to innerHTML method, but on IE6
// it doesn't work with named entities like &nbsp;
// which need to be replaced by numeric entities
function insertText(element, text)
{
   if (element.textContent)  // DOM3 only
      element.textContent = text;
   else
   {
      if (element.firstChild)
      {
         // remove current children
         while (element.firstChild)
            element.removeChild(element.firstChild);
      }

      element.appendChild(document.createTextNode(text));
   }
}

