// SETTINGS \\ (Einstellungen)

//mit diesem Text werden die einzelnen News verbunden. Zeichen, die
//nicht direkt druckbar sind, können Probleme bereiten (z.B. muss das
//Leerzeichen mit &nbsp; kodiert werden).
var glue = "&nbsp;&nbsp;-&nbsp;&nbsp;";

//die Einheit der Bewegung in einem Schritt. "px" für Pixel, "em", "ex"
//richten sich nach der Website, "cm" für Zentimeter, "mm" für Millimeter,
//"in" für Zoll, "pt" für 1/72 Zoll
var movementUnit = "px";

//Bewegungsgröße in einem Schritt
var movementPerStep = 2;

//Zeit zwischen zwei Schritten
var timeBetweenSteps = 25;

//Anhalten, wenn die Maus über den Ticker fährt? true für ja, false für nein
var stopOnMouseOver = true;

//soll der Ticker im Moment, da die Seite geladen wird schon gefüllt
//sein, oder soll die erste Nachricht erst von rechts hereinlaufen?
//true für schon gefüllt, false für hereinlaufen
var filledOnSiteLoad = false;


// FUNCTIONS \\

function stopMovement() {
  window.clearInterval(timer);
}
function startMovement() {
  timer = window.setInterval("moveLeft();", timeBetweenSteps);
}

function mod(a, b) {
  if (a < 0) {
    return -((-a) % b - b);
  } else {
    return a % b;
  }
}

function moveLeft() {
  
  for (var i = 0; i < repetitions; i++) {
    
    container.childNodes[i].style.left = (parseInt(container.childNodes[i].style.left) - 1) + movementUnit;
    if (parseInt(container.childNodes[i].style.left) < -container.childNodes[i].offsetWidth) {
      previous = mod(i - 1, container.childNodes.length);
      container.childNodes[i].style.left = (
        parseInt(container.childNodes[previous].style.left)
        + container.childNodes[previous].offsetWidth
      ) + movementUnit;
    }
  
  }

}

function appendTextContainer() {

  newNode = document.createElement("div");
  newNode.innerHTML = completeNewsText;
  with (newNode.style) {
    position = "absolute";
    display = "inline";
    left = (startPosition + offset) + movementUnit;
    whiteSpace = "nowrap";
  }
  container.appendChild(newNode);
  offset += newNode.offsetWidth;

}

function getZIndex(node) {

  zIndex = null;
  currentNode = node;
  while (currentNode != document.body && zIndex == null) {
    if (currentNode.style && currentNode.style.zIndex) {
      zIndex = parseInt(currentNode.style.zIndex);
    };
    currentNode = currentNode.parentNode;
  };

  if (zIndex == null) {
    return 0;
  } else {
    return zIndex;
  }

}


// MAIN PROGRAM \\

var list = document.getElementById("newsList");
var nodes = list.getElementsByTagName("li");
var offset = 0;
var container;
var repetitions;
var timer;
var startPosition;

//read and concat all news
var completeNewsText = "";
for (var i = 0; i < nodes.length; i++) {
  completeNewsText += glue + nodes[i].innerHTML;
};

//create and place the ticker
container = document.createElement("div");
with (container.style) {
  width = "100%";
  position = "relative";
  height = "1.2em";
  padding = "0px";
  margin = "0px";
  overflow = "hidden";
};
list.parentNode.replaceChild(container, list);

//place the news into the ticker
startPosition = filledOnSiteLoad ? 0 : container.offsetWidth;
do {
  appendTextContainer();
} while (offset < container.offsetWidth && offset != 0);
appendTextContainer();
repetitions = container.childNodes.length;

//pretty straight-forward
if (stopOnMouseOver) {
  container.onmouseover = stopMovement;
  container.onmouseout  = startMovement;
}

//start moving the ticker
window.onload = startMovement();
