// --------------------------------------------------
// $Id: slides.js,v 1.17 2008/05/20 14:21:51 jg Exp $
// JS-Funktionen fuer die xphp-slides
// Author: Jens Giessmann
// Mail: jg@handcode.de
// --------------------------------------------------

// --------------------------------------------------
// TOC - PopUp
// --------------------------------------------------

// Links aus dem TOC-Fenster
function toclink(url){
  window.opener.location=url;
  window.close();
}

// Das Popup fuer die TOC Seite
function tocopen(url){
  window.open(url,'slidelist','toolbar=no,directories=no,location=no,status=no,menubar=no,resizable=no,scrollbars=yes,width=300,height=400'); 
  return false;
}

// --------------------------------------------------
// Spotlight-Effekt: einzelne Bloecke "einblenden", den Rest der Seite
// ausblenden
// --------------------------------------------------

// Die globalen Vars fuer den spotlight Effekt initialisieren
// Array mit den IDs der aktivierten Nodes damit ich spaeter wieder
// diese zugreifen kann
var xpsSpotlightNodes;
var xpsSpotlightHideNode;
var xpsSpotlightHideId;
var xpsFadeOpacityEnd;
var xpsFadeOpacityStart;
var xpsFadeOpacityTime;


function xpsSpotlightInit() {
  
  xpsSpotlightHideId = 'spotlighthide';
  xpsFadeOpacityEnd = 80;
  xpsFadeOpacityStart = 0;
  xpsFadeOpacityTime = 500;
  
  xpsSpotlightNodes = new Array();
  xpsSpotlightHideNode = document.getElementById(xpsSpotlightHideId); 
}

// Einen Block ein/ausblenden 
function xpsSpotlightNode(highNode){  

  // haben wir was zu highlighten und ist das auch ein Elementknoten?
  if (! highNode || highNode.nodeType != 1) {
    return;
  }

  // gibt es das "ueberblend div"?
  if (! xpsSpotlightHideNode) {
    return;
  }

  // Die ID des Kntoens fuer das Array xpsSpotlightNodes damit ich
  // weiss was aktuell ge-highlighted ist.
  var nodeid = getID(highNode);

  // spotlight anschalten
  if (! inArray(highNode.id,xpsSpotlightNodes)) {

    xpsSpotlightNodeOn(highNode);

    xpsSpotlightHideNodeOn();

  }

  // spotlight ausschalten
  else { 
  
    xpsSpotlightNodeOff(highNode);

    // Wenn wir der letzte aktive Knoten waren die gesamte Seite
    // wieder einblenden
    if (xpsSpotlightNodes.length == 0) {
      xpsSpotlightHideNodeOff();
    }
  } 

  // alert("SpotNodes: " + xpsSpotlightNodes.length);
 
} 

// Spotlight komplett zuruecksetzen
function xpsSpotlightAllOff () {
  if (xpsSpotlightNodes.length != 0) {
    for (i in xpsSpotlightNodes) {
      xpsSpotlightNodeOff(document.getElementById(xpsSpotlightNodes[i]));
    }
  }
  xpsSpotlightHideNodeOff();
}

// Spotlight fuer einen Node anschalten
function xpsSpotlightNodeOn (highNode) {
  highNode.zIndex=9; 
  addClass(highNode,'spotlightshow');
  highNode.style.position="relative"; 
  
  xpsSpotlightNodes[xpsSpotlightNodes.length] = highNode.id;
}

// Spotlight fuer einen Node ausschalten 
function xpsSpotlightNodeOff (highNode) {

  highNode.zIndex=1; 
  highNode.style.position="static"; 
  removeClass(highNode,'spotlightshow');

  // Die ID aus dem xpsSpotlightNodes Array entfernen, wenn
  // vorhanden
  if (toDelete = inArray(highNode.id,xpsSpotlightNodes)) { 
    xpsSpotlightNodes.splice(toDelete,1); 
  }   
}

// Spotlight, die Seite mit dem Hide-Div ueberblenden
function xpsSpotlightHideNodeOn () {

  // Wenn noch nicht an, die Seite mit dem Hide-Div ueberblenden
  if (xpsSpotlightHideNode.style.visibility=="hidden") { 
    // xpsSpotlightHideNode.style.zIndex="0";  
    xpsSpotlightHideNode.style.visibility="visible"; 
    // xpsFadeOpacity(xpsSpotlightHideNode, xpsFadeOpacityStart, xpsFadeOpacityEnd, 10000);

  }

}

// Spotlight, das Hide-Div ausblenden und damit die Seite wieder
// einblenden
function xpsSpotlightHideNodeOff () {

  // xpsFadeOpacity(xpsSpotlightHideNode, xpsFadeOpacityEnd, xpsFadeOpacityStart, 1000);
  // xpsSpotlightHideNode.style.zIndex="-1";
  xpsSpotlightHideNode.style.visibility = "hidden"; 
}

function xpsFadeOpacity(node, opacStart, opacEnd, millisec) {

  // var speed = Math.round(millisec / 2);
  var speed = 500;
  var timer = 0;

  if (opacStart > opacEnd) {
    for (i = opacStart; i >= opacEnd; i--) {
      setTimeout("xpsSetOpacity('" + xpsSpotlightHideId + "'," + i + ")",(timer * speed));
      timer++;
    }
  }
  else if (opacStart < opacEnd) {
    for(i = opacStart; i <= opacEnd; i++) {
      setTimeout("xpsSetOpacity('" + xpsSpotlightHideId + "'," + i + ")",(timer * speed));
      timer++;
    }
  }
  
}

function xpsSetOpacity(nodeId, opacity) {

  node = document.getElementById(nodeId);
  node.opacity = (opacity / 100);
  node.MozOpacity = (opacity / 100);
  node.KhtmlOpacity = (opacity / 100);
  node.filter = "alpha(opacity=" + opacity + ")";
}

// --------------------------------------------------
// Keyhandler fuer die Aktionen die ueber HotKeys getriggert werden
// koennen
// --------------------------------------------------

document.onkeyup = xpsKeyHandler;
// Keyhandler auch fuer die mouseClicks
// document.onclick = xpsKeyHandler;

// event handler function fuer die Key-Events
function xpsKeyHandler(e) {

  // Wenn der Browser die Event-Info nicht an die Funktion
  // uebergibt, muessen wir das eben selber aus dem event register
  // einlesen.
  if( !e ) {
    if( window.event ) {
      //Internet Explorer
      e = window.event;
    } else {
      // Wenn's gar nix gibt kann man auch nix machen
      return;
    }
  }
  // Versch. Browser, versch. Kram.....
  if( typeof( e.keyCode ) == 'number'  ) {
    //DOM
    e = e.keyCode;
  } else if( typeof( e.which ) == 'number' ) {
    //NS 4 compatible
    e = e.which;
  } else if( typeof( e.charCode ) == 'number'  ) {
    //NS 6+, Mozilla 0.9+
    e = e.charCode;
  } else if( typeof( e.button ) == 'number'  ) {
    // mouse-Button
    e = e.button;
  } else {
    // Nix zu holen...
    return;
  }

  // Die URL fuer die naechste Folie (vor oder zurueck)
  var next;

  // alert(e);

  // Wenn wir endlich wissen welcher Key, dann die entspr. Aktionen
  // triggern
  switch (e) {
   
    // ------------------------------
    // SeitenNavigation und incrementelle Anzeige
    // ------------------------------
    // Seite vor blaettern
    // case 13: // enter
  case 32: // spacebar
  case 34: // page down
  case 39: // rightkey
    // case 78: // n
    // case 40: // downkey
    
    
    // innerhalb der Seiten weiter in der inkrementelle Anzeige?
    if (incrementals.length > 0 && incrementals.length > incrementalnext) {
      
      incrementalcurrent = incrementalnext;
      incrementalprev = incrementalcurrent -1;
      
      // CSS Klassen setzen
      removeClass(incrementals[incrementalprev], 'current');
      addClass(incrementals[incrementalcurrent], 'current');
      
      // Einblenden
      incrementals[incrementalcurrent].style.visibility = 'visible';
      ++incrementalnext;
      
      //       alert("Gesamt: " + incrementals.length 
      // 	    + " Prev: " + incrementalprev 
      // 	    + " Current: " + incrementalcurrent 
      // 	    + " Next: " + incrementalnext);
      return;

    }
    // ...oder ab zum naechsten slide?
    else if (document.getElementById('navinext')) {
      next = document.getElementById('navinext').href;
      document.location = next;
    }
    else {
      return;
    }

    break;
    

    // Seite zurueck blaettern
  case 33: // page up
  case 37: // leftkey
    // case 80: // p
    // case 66: // b
    // case 38: // upkey

    // innerhalb der Seiten zurueck in der inkrementelle Anzeige?    
    if (incrementals.length > 0 && incrementalprev >= 0) {
      incrementalcurrent = incrementalprev;
      --incrementalprev;
      --incrementalnext;

      // CSS Klassen setzen
      removeClass(incrementals[incrementalnext], 'current');
      addClass(incrementals[incrementalcurrent], 'current');
      
      // Ausblenden
      incrementals[incrementalnext].style.visibility = 'hidden';

      //       alert("Gesamt: " + incrementals.length 
      // 	    + " Prev: " + incrementalprev 
      // 	    + " Current: " + incrementalcurrent 
      // 	    + " Next: " + incrementalnext);
      return;
    }
    // ... oder zurueck zum vorherigen slide?
    else if (document.getElementById('naviprev')) {
      next = document.getElementById('naviprev').href;
    }
    // ... oder zurueck zum Start Slide? dann den homelink nehmen
    else if (document.getElementById('navihome')) {
      next = document.getElementById('navihome').href;
    }
    else {
      return;
    }

    document.location = next;
    
    break;

    // zur Start-Seite
  case 36: // home/pos1

    if (document.getElementById('navihome')) { 
      next = document.getElementById('navihome').href; 
      document.location = next; 
    } 
    else { 
      return; 
    } 
    
    break;

    // zur letzten Seite
  case 35: // end

    if (document.getElementById('navilast')) { 
      next = document.getElementById('navilast').href; 
      document.location = next; 
    } 
    else { 
      return; 
    } 
    
    break;

    // ------------------------------
    // Spotlight Aktionen
    // ------------------------------
  case 27: // ESC 
    // case 19: // Pause
    // Spotlight zuruecksetzen
    xpsSpotlightAllOff();
  }
    
}


// --------------------------------------------------
// Funktionen fuer die incrementelle Anzeige von Elementen ueber CSS
// classes (ein/ausblenden)
// --------------------------------------------------

function xpsGetIncrementals() {
 
  var all;
 
  content = document.getElementById("content");

  all = content.getElementsByTagName("*");
  
  for (var i = 0, length = all.length; i < length; i++) { 
    node = all[i]; 
    if (hasClass(node, 'incremental')) {
      // alert(node.tagName);
      incrementals[incrementals.length] = node;
    }
  }
}


// --------------------------------------------------
// Allgemeine Helper Funktionen
// --------------------------------------------------
function hasClass(node, className) { 
  if (!node.className) return false; 
  return (node.className.search('(^|\\s)' + className + '(\\s|$)') != -1); 
} 

function removeClass(node,className) { 
  if (!node) return; 
  node.className = node.className.replace(new RegExp('(^|\\s)' + className + '(\\s|$)'), RegExp.$1+RegExp.$2); 
} 

function addClass(node,className) { 
  if (!node || hasClass(node, className)) return; 
  if (node.className) { 
    node.className += ' '+className; 
  } else { 
    node.className = className; 
  } 
} 

// gibt die ID eines Knoten zurueck, wenn keine ID vorhanden wird eine
// random ID erzeugt und diese gesetzt.
function getID(node) {

  if (!node.id) {
    newID = genRandID();
    node.setAttribute("id", newID);
  }
  
  return node.id;
}

// erzeugt eine (noch nicht vorhandene) random ID
function genRandID() {

  var randID = 1 + Math.floor((Math.random()*32767));  

  // Gibt's die schon? Wenn ja, noch mal
  if (document.getElementById(randID)) {
    randID = genRandID;
  }
  return randID;
}

// Sucht in einem Array nach einem bestimmten Wert und gibt dessen Key
// zurueck
function inArray(needle, haystack) {

  if (! haystack.length) {
    return false; 
  }

  for (key in haystack) {
    if (haystack[key] == needle) {
      return key;
    }
  }
  return false;
}

// EventChecker fuer Rechts-Clicks
// document.onclick = eventChecker;

// // event handler function fuer die Mouse-Events (right clicks)
// function eventChecker(e) {
//   var rightclick;
//   if (!e) var e = window.event;
//   if (e.which) rightclick = (e.which == 3);
//   else if (e.button) rightclick = (e.button == 2);
//   alert('Rightclick: ' + rightclick); // true or false
// }

var incrementals = new Array();
var incrementalcurrent = 0;
var incrementalnext = 0;
var incrementalprev = -1;

function xpsInit() {
  sp = xpsSpotlightInit();
  xi = xpsGetIncrementals();
}

// window.onload = xpsSpotlightInit;
// window.onload = xpsGetIncrementals;

window.onload = xpsInit;

// --------------------------------------------------
// End slides.js
// --------------------------------------------------
