
/* 'Ticker4All 041103' (c) by cybaer@vampirehost.de
   -------------------
 Inhalt    : Initialisiert und startet einen Ticker fuer alle Browser (nach dessen Faehigkeiten) als
             - DHTML-Ticker (fuer scriptfaehige Browser mit W3C-DOM),
             - Form-Ticker (fuer scriptfaehige Browser ohne W3C-DOM mit Formularfeld),
             - Status-Ticker (fuer scriptfaehige Browser ohne W3C-DOM),
             - Image-Ticker (fuer scriptfaehige Browser (ab V1.2) als Lauftext),
             - statischen Text (fuer nicht-scriptfaehige Browser),
             entweder als Lauftext (Endlosticker) oder als pulsierenden Text (PingPong-Ticker)
 Aufruf    : Ticker(Text,LCursor,RCursor,Size,Filler,FillerCheck,Chardelay,Linedelay,WhiteSpace,Status,Width,Height)
             (der Aufruf erfolgt nach dem Laden des HTML-Ticker-Elements als SCRIPT oder mit onLoad)
 Parameter : Name (ID des HTML-Ticker-Elements)
             Text (Ticker-Text, die Zeilen getrennt durch "|"; ist der Text-Parameter leer,
                   dann wird der Ticker-Text direkt aus dem HTML-Ticker-Element ermittelt!)
             LCursor (gewuenschtes Zeichen fuer den linken Ticker-Cursor)
             RCursor (gewuenschtes Zeichen fuer den rechten Ticker-Cursor)
             Size (Anzahl der gleichzeitig dargestellten Zeichen im Ticker (1 Zeile, konstante Zeichenzahl);
                   wenn 0, dann wird jede Zeile komplett von links nach rechts aufgebaut (variable Zeichenzahl);
                   wenn -1, dann wird sie auch wieder von rechts nach links abgebaut (variable Zeichenzahl))
             Filler (wenn True, dann werden Fuellzeichen zwischen den Zeilen generiert:
                     bei konstanter Zeichenzahl (Size>=1) ist dies ein kompletter Leerbereich,
                     bei variabler Zeichenzahl (Size<=0) sind dies Auslassungpunkte)
             FillerCheck (enthaelt die (Satz-)Zeichen, mit denen die Fuellzeichen gesteuert werden:
                          ein Leerbereich (Pause zw. Zeilen) entsteht nach den angegebenen (Satz-)Zeichen,
                          die Auslassungspunkte (Verbindung zw. Zeilen) werden vermieden nach den (Satz-)Zeichen)
             Chardelay (Wartezeit bis zum naechsten Buchstaben in Millisekunden; bei einem negativem
                        Wert gilt die Wartezeit nur fuer den Hinlauf - die Ruecklauf-Wartezeit ist 0)
             Linedelay (Wartezeit bis zur naechsten Zeile in Millisekunden; bei einem negativem Wert
                        gilt die Wartezeit nur nach dem Hinlauf - nach dem Ruecklauf ist die Wartezeit 0)
             WhiteSpace (wenn True, dann werden als Leerzeichen "white-spaces" (&#160;/&nbsp;) verwendet - nur JavaScript >=1.2)
             Status (wenn True, dann wird im "Notfall" die Statuszeile des Browsers als Tickerbereich missbraucht)
             ImgMask (Fuer Image-Ticker: Maske fuer Pfad und Namen der Buchstabendateien des
                      Image-Tickers: Bei "img/char.gif" ist z.B. die Datei fuer A "img/char65.gif".
                      Wenigstens die Angabe der Dateiextension (hier: ".gif") ist ZWINGEND erforderlich!)
             Capitals (Fuer Image-Ticker: True, wenn nur Grossbuchstaben dargestellt werden sollen)
             Width (Fuer Image-Ticker: Breite eines IMG-Buchstabens)
             Height (Fuer Image-Ticker: Hoehe eines IMG-Buchstabens)
 Sprache   : JavaScript 1.1 (ungesichert) & JScript 3.0/IE-DOM (gesichert) & JavaScript 1.5/W3C-DOM (gesichert)
 Quelle    : http://www.vampirehost.de/gruft/coding/ (cybaer@vampirehost.de)
             Die kostenlose Nutzung der Quelltexte in eigenen Projekten ist
             bei nicht-kommerziellen Projekten (und deren unentgeltlicher
             Herstellung) bei Nennung der Quelle ausdruecklich gestattet.
 InlineFunc: doTicker(), cacheTicker(), replaceHtmlTags(), reduceHtmlSpaces(), trim(), rc(),
             rnd(), xGetTicker(), xAllTicker(), xRandomTicker(), xShuffleTicker()
 Konstante : is_w3cTicker (True, wenn W3C-DOM-Ticker streng nach Standard)
             is_w3cxTicker (True, wenn mit Sicherheit erweiterter W3C-DOM-Ticker)
             is_domTicker (True, wenn DHTML-Ticker)
             is_formTicker (True, wenn Form-Ticker)
             is_statusTicker (True, wenn Status-Ticker)
             is_imageTicker (True, wenn Image-Ticker)
             is_infiniteTicker (True, wenn Endlostext ohne Leerzeilen)
             tickerName (HTML-ID des Tickers/Tickertextes)
             tickerLines(0) (enthaelt Ticker-Text in einer Endloszeile (fuer Size>0))
             tickerLines(n) (enthaelt Ticker-Text-Zeile n (fuer Size<=0))
             tickerCursor (entspricht Parameter Cursor)
             tickerSize (entspricht Parameter Size)
             tickerChardelay (entspricht Parameter Chardelay)
             tickerLinedelay (entspricht Parameter Linedelay)
             tickerElement (HTML-Object des Tickers)
             tickerImg (Maske fuer Image-Ticker)
             tickerExt (Extension der Images)
 Variable  : infiniteLineend (Fuellbereich in Endloszeile, i.d.R. " +++ ")
             finiteLineend (Fuellbereich nach Einzelzeile, i.d.R. Auslassungspunkte)
             finiteLinestart (Fuellbereich vor folgender Einzelzeile i.d.R. Auslassungspunkte)
             tickerSpace (Leerzeichen, i.d.R. " ")
             tickerWspace (festes Leerzeichen, i.d.R. &#160; (ab JavaScript 1.2))
 SystemVar : -
 ExternVar : -
 Rueckgabe : True, wenn Ticker erfolgreich gestartet, sonst False
 Anmerkung : Steht der Ticker-Text im HTML-Ticker-Element, dann kann er zeilenweise mit BR-, HR-
             oder Kommentar-Tags begrenzt werden. Sonstige HTML-Tags werden ausgefiltert!
             HTML-Entities (z.B. &auml;) sind bei uebergebenem Text nicht erlaubt!
             Beim Image-Ticker MUSS der Parameter Size groesser als 0 sein! Ausserdem sollte man die
             Grafiken auf einer vorgelagerten Seite mit cacheTicker(ImgMask,Capitals) vorab laden!!
             Text-Prioritaet: 1. Text aus Uebergabe, 2. Text aus Formularfeld, 3. Text aus HTML-Seite
 Beispiele : HTML  : <tt><div id="Ticker">Zeile1? <!-- Neue Tickerzeile --> Zeile2!<br></div></tt>
             Script: Ticker("Ticker","","","",40,true,"!.?",140,800,true,false)
                  -> tickert 2 HTML-Zeilen durchgehend im 40-Zeichen-Bereich (Monospace-Font),
                     ohne Cursor, mit Fuellbereich (Leerzeile) nach Satzende und ohne Umbruch.
                     Bei Browsern ohne IE/W3C-DOM oder JavaScript/JScript erscheint der Text statisch!
             HTML  : <span id="Ticker" style="background-color:#770000;">Zeile1?<br>Zeile2!</span><br>
             Script: Ticker("Ticker","","","]",0,true,"!.:?",100,800,false,false)
                  -> tickert 2 HTML-Zeilen mit rechtem Cursor von links nach rechts, mit Fuellbereich
                     (Auslassungspunkte - nicht jedoch bei Satzende), mit Umbruch und auf rotem Grund.
                     Bei Browsern ohne IE/W3C-DOM oder JavaScript/JScript erscheint der Text statisch!
                     Bei CSS-faehigen Browsern ist auch der statische Text auf rotem Grund.
             HTML  : <span id="Ticker"></span>
             Script: Ticker("Ticker","Zeile1?|Zeile2!","","",-1,false,"!.:?",-100,-800,false,true)
                     if(ticking) { if(tickerElement) { tickerElement.style.backgroundColor="#770000"; } }
                  -> tickert 2 uebergebene Zeilen ohne Cursor von links nach rechts und (schnell) wieder
                     zurueck, die naechste Zeile sofort beginnend, ohne Fuellbereich (Auslassungspunkte),
                     ohne Umbruch und auf rotem Grund, wenn der Ticker aktiv ist.
                     Bei JavaScript-Browsern ohne IE/W3C-DOM ist der Tickerbereich die Statuszeile!
                     Bei Browsern ohne JavaScript/JScript erscheint kein Text!
             HTML  : <form id="Ticker" name="Ticker"><input size="40" value="Zeile 1? | Zeile 2!"></form>
             Script: Ticker("Ticker","","","",50,true,"!.:?",140,0,false,true)
                  -> tickert 2 HTML-Formular-Zeilen durchgehend im Formularfeld, ohne Cursor und mit
                     Fuellbereich (" +++ ").
                     Der Form-Ticker funktioniert auf allen JavaScript-Browsern!
                     Bei JavaScript-Browsern mit IE/W3C-DOM wird aus dem Form- ein DHTML-Ticker!
                     Bei Browsern ohne Scripting erscheint unbewegter Text im Formularfeld!
             HTML  : <script>document.write('<form id="Ticker" name="Ticker"><input size="10"><\/form>')</script>
                     <noscript>Zeile 1?<br>Zeile 2!</noscript>
             Script: Ticker("Ticker","Zeile 1?|Zeile 2!","","",20,false,"!.:?",140,0,true,false)
                  -> tickert 2 uebergebene Zeilen durchgehend im generierten Formularfeld, ohne Cursor
                     und ohne Fuellbereich.
                     Der Form-Ticker funktioniert auf allen JavaScript-Browsern!
                     Bei JavaScript-Browsern mit IE/W3C-DOM wird aus dem Formular- ein DHTML-Ticker!
                     Bei Browsern ohne Scripting erscheint statischer Text und kein Formularfeld!
             HTML  : -
             Script: Ticker("Ticker","Zeile 1?|Zeile 2!","","","",20,false,"!.:?",80,0,true,true,"img/.gif",11,19,true)
                  -> tickert 2 uebergebene Zeilen durchgehend mit generierten IMG-Tags, in Grossbuchstaben,
                     ohne Cursor und ohne Fuellbereich; die Images sind "img/[ISO-8859-1-Code].gif".
                     Der Image-Ticker funktioniert auf allen Browsern mit JavaScript >=1.2!
                     Bei Browsern mit JavaScript 1.1 erscheint ein Status-Ticker!
                     Bei Browsern ohne Scripting erscheint statischer Text (falls definiert).
*/

function Ticker(Name,Text,LCursor,RCursor,Size,Filler,FillerCheck,Chardelay,Linedelay,WhiteSpace,Status,ImgMask,Capitals,Width,Height) {
 // Lokale Variablen
 var infiniteLineend=" +++ ", finiteLineend=" ...", finiteLinestart="... ", tickerSpace=" ", htmlText="", formText, i;
 // Globale Variable
 tickerName=Name; tickerLCursor=LCursor; tickerRCursor=RCursor; tickerSize=Size; tickerChardelay=Chardelay; tickerLinedelay=Linedelay;
 tickerElement=""; tickerWspace=(String.fromCharCode)?String.fromCharCode(160):"";

 // Verwendetes Tickermodell
 // W3C-DHMTL-Tickerelement?
 is_w3cTicker=(document.getElementById && document.getElementById(tickerName) && !window.opera)?true:false;
 // W3C-DHMTL-Tickerelement, ansprechbar mit IE-DHTML?
 is_w3cxTicker=(document.getElementById && document.getElementById(tickerName) && (document.getElementById(tickerName).innerHTML || document.getElementById(tickerName).innerHTML==""))?true:false;
 // Formularzeile-Tickerelement?
 is_formTicker=(document.forms[tickerName] && document.forms[tickerName].elements[0] && (document.forms[tickerName].elements[0].type=="text"));
 // Formulartext sichern & loeschen
 formText=(is_formTicker)?document.forms[tickerName].elements[0].value:"";
 // Fuer Testzwecke: // is_ieTicker=false; is_w3cxTicker=false; // is_w3cTicker=false; // is_formTicker=false;
 // DHTML-Ticker?
 is_domTicker=(is_w3cxTicker || is_w3cTicker);
 // Form-Ticker nur, wenn kein DHTML und Text vorhanden (aus Uebergabe oder Formularzeile)
 is_formTicker=(!is_domTicker && is_formTicker && (Text || formText))?true:false;
 // Status-Ticker nur, wenn kein DHTML- oder Form-Ticker, ueberhaupt erlaubt und Text vorhanden
 is_statusTicker=(!is_domTicker && !is_formTicker && Status && Text)?true:false;
 // Image-Ticker, wenn gueltige Image-Maske, Size groesser 0, charCode-Funktion und Uebergabetext (oder DHTML-Element zum Text-Auslesen) vorhanden
 is_imageTicker=(document.images && ImgMask && ImgMask.indexOf(".")+1 && Size>0 && " ".charCodeAt && (Text || is_domTicker))?true:false;
 // Bei Form- und Status-Ticker Lauftext nur ohne Luecke
 is_infiniteTicker=((is_formTicker || is_statusTicker) && !is_imageTicker && Size>0)

 // HTML-Object des Ticker-Elements ermitteln (W3C-Ticker bevorzugt)
 if(is_w3cTicker || is_w3cxTicker) { tickerElement=eval(document.getElementById(tickerName)); }
 else if(is_formTicker) { tickerElement=eval(document.forms[tickerName].elements[0]); }

 // Wenn HTML-Element vorhanden
 if(tickerElement) {
  // HTML-Text sichern & loeschen (BR-/HR-/Kommentar-Tags als Zeilen-Trenner)
  if(is_w3cxTicker) {
   htmlText=tickerElement.innerHTML; tickerElement.innerHTML="";
   htmlText=replaceHtmlTags(htmlText,"!--","|",true);
   htmlText=replaceHtmlTags(htmlText,"BR","|",true);
   htmlText=replaceHtmlTags(htmlText,"HR","|",true);
  }
  else if(is_w3cTicker) {
   if(tickerElement.hasChildNodes()) { var Node=tickerElement.firstChild;
    while(Node!=null) {
     if(Node.nodeName=="#text") { Value=reduceHtmlSpaces(Node.nodeValue); htmlText+=Value; Node.nodeValue=""; }
     else if(Node.nodeName=="#comment" || Node.nodeName=="BR" || Node.nodeName=="HR") { htmlText+="|"; }
    Node=Node.nextSibling;
    }
    // HTML-Elemente entfernen (1. Element nicht, wenn Typ 3/Textknoten)
    for(i=(tickerElement.firstChild.nodeType==3)?1:0;i<tickerElement.childNodes.length;i++) { tickerElement.removeChild(tickerElement.childNodes[i]); }
   }
   // Ggf. fehlenden HTML-Textknoten einfuegen
   if(!tickerElement.hasChildNodes()) { tickerElement.appendChild(document.createTextNode("")); }
  }
  else if(is_formTicker) { htmlText=formText; tickerElement.value=""; }
  // Endgueltigen Text nach Wertigkeit zuweisen
  if(!Text) { Text=(formText)?formText:htmlText; }
 }

 // Text optimieren
 Text=trim(reduceHtmlSpaces(replaceHtmlTags(Text,"","",true))); tickerLines=new Array(); i=1;
 while(Text.indexOf("| ")>=0) { Text=rc(Text,"| ","|"); }
 while(Text.indexOf(" |")>=0) { Text=rc(Text," |","|"); }
 while(Text.indexOf("||")>=0) { Text=rc(Text,"||","|"); }
 if(Text.charAt(0)=="|") { Text=Text.substr(1,Text.length-1); }
 if(Text.charAt(Text.length-1)=="|") { Text=Text.substr(0,Text.length-1); }
 // Zeilen auf Array aufteilen
 while(Text.indexOf("|")>=0) { tickerLines[i]=Text.substring(0,Text.indexOf("|")); Text=Text.substring(tickerLines[i].length+1,Text.length); i++; } if(Text) { tickerLines[i]=Text; Text=""; }

 // Ticker-Text-Aufbereitung
 if(!tickerLines.length) { return false; }
 else {
  // Ticker-Text vorhanden
  if(Size>0) {  // Konstanter Zeichenbereich (Endlosticker)
   // Fuehrende und abschliessende Zeichen generieren (Form- oder Status-Ticker infiniteLineend, sonst Leerzeile)
   if(is_infiniteTicker) {
    var tickerTrailingSpaces=infiniteLineend; var tickerEndSpaces=""; }
   else {
    var tickerTrailingSpaces=""; for(i=Size;i>1;i--) { tickerTrailingSpaces+=tickerSpace; }
    tickerTrailingSpaces+=tickerSpace; var tickerEndSpaces=tickerTrailingSpaces;
   }
   // Komplett-Zeile erstellen, beginnend mit Vorlauf
   tickerLines[0]=tickerTrailingSpaces; i=1;
   while(i<tickerLines.length-1) {
    tickerLines[0]+=tickerLines[i]+tickerSpace;
    // Zeile um Fuellzeichen ("   ") ergaenzen, wenn sie mit FillerCheck-Zeichen beendet wird
    if(Filler && FillerCheck.indexOf(tickerLines[i].charAt(tickerLines[i].length-1))>=0) { tickerLines[0]+=tickerTrailingSpaces; }
    i++;
   }
   // Komplett-Zeile fertigstellen, abschliessend mit Leerbereich
   tickerLines[0]+=tickerLines[i]+tickerEndSpaces;
   // Ticker-Size verringen, wenn Ticker-Text kuerzer ist
   Size=Math.min(Size,tickerLines[0].length); tickerSize=Size;
   // Bei Endlos-Ticker Text am Ende vom Anfang ergaenzen
   if(is_infiniteTicker) { tickerLines[0]+=tickerLines[0].substr(0,tickerSize); }
   // Leerzeichen korrigieren
   if(is_infiniteTicker) { tickerLines[0]=reduceHtmlSpaces(tickerLines[0]); }
   if(WhiteSpace && String.fromCharCode) { tickerLines[0]=rc(tickerLines[0]," ",String.fromCharCode(160)); }
  }
  else {        // Variabler Zeichenbereich (PingPong-Ticker)
   // Zeile um Fuellzeichen ("...") ergaenzen, wenn sie nicht mit FillerCheck-Zeichen beendet wird
   if(Filler && tickerLines.length>2) {
    for(i=1;i<tickerLines.length-1;i++) { if(tickerLines[i] && FillerCheck.indexOf(tickerLines[i].charAt(tickerLines[i].length-1))<0) { tickerLines[i]+=finiteLineend; tickerLines[i+1]=finiteLinestart+tickerLines[i+1]; } }
    // Leerzeichen korrigieren
    if(WhiteSpace && String.fromCharCode) { for(i=1;i<tickerLines.length;i++) { tickerLines[i]=rc(tickerLines[i]," ",String.fromCharCode(160)); } }
   }
  }

  // Wenn Image-Ticker
  if(is_imageTicker) {
   // Ggf. nur Grossbuchstaben verwenden
   if(Capitals) { for(i=0;i<tickerLines.length;i++) { tickerLines[i]=tickerLines[i].toUpperCase(); } }
   // Images indizieren und vorladen (nur erlaubte Zeichen)
   cacheTicker(ImgMask,Capitals);
   // Groessenattribute erstellen
   Width=(Width)?'width="'+Width+'" ':''; Height=(Height)?'height="'+Height+'" ':'';
   // IMG-Tags generieren
   tickerSpace=tickerImg+32+tickerExt; nr=-1; document.write('<span id="'+Name+'Img">');
   for(i=0;i<LCursor.length;i++) { nr++; document.write('<img src="'+tickerSpace+'" name="'+Name+'Img'+nr+'" '+Width+Height+' alt="" border="0">'); }
   for(i=0;i<Size;i++) { nr++; document.write('<img src="'+tickerSpace+'" name="'+Name+'Img'+nr+'" '+Width+Height+' alt="" border="0">'); }
   for(i=0;i<RCursor.length;i++) { nr++; document.write('<img src="'+tickerSpace+'" name="'+Name+'Img'+nr+'" '+Width+Height+' alt="" border="0">'); }
   document.write('<\/span>');
  }

  // Ticker starten
  return doTicker((Size>0)?0:1,0,1);
 }
}

// ----------- Elementare Unterroutinen -----------

// Ticker-Ausgabe
function doTicker(line,pos,dir) {
 // Lokale Variablen
 var text, last, delay;

 // Ticker-Zeile zusammenstellen
 if(line==0) {
  text=((is_imageTicker)?"":tickerWspace)+tickerLCursor+tickerLines[line].substring(pos,pos+tickerSize)+tickerRCursor+((is_imageTicker)?"":tickerWspace);
  last=tickerLines[line].length-tickerSize; }
 else { text=((is_imageTicker)?"":tickerWspace)+tickerLCursor+tickerLines[line].substring(0,pos)+tickerRCursor+((is_imageTicker)?"":tickerWspace); last=tickerLines[line].length; }

 // Seite aktualisieren
 if(is_imageTicker) { for(i=0;i<text.length;i++) { document.images[tickerName+"Img"+i].src=tickerCache[text.charCodeAt(i)].src; } }
 else if(is_w3cxTicker) { tickerElement.innerHTML=text; }
 else if(is_w3cTicker) { tickerElement.childNodes[0].nodeValue=text; }
 else if(is_formTicker) { tickerElement.value=text; }
 else if(is_statusTicker) { window.status=text; }

 // Zurueck ggf. schneller
 pos+=dir; delay=(tickerChardelay<0 && dir<0)?0:Math.abs(tickerChardelay);

 // Zeilenende erreicht?
 if(pos>last) {
  delay=Math.abs(tickerLinedelay);
  if(tickerSize<0) {
   // Zeile wieder verkleinern ...
   pos--; dir=-dir;
  } else {
   // ... oder neue Zeile
   pos=0;
   // Bei Endloszeile nur "Buchstaben-Wartezeit"
   delay=(is_infiniteTicker)?Math.abs(tickerChardelay):Math.abs(tickerLinedelay)
   if(line>0) { line=(line<tickerLines.length-1)?line+1:1 }
  }
 } else if(pos<0) {
  // Zeile zurueck-abgewickelt, also (ggf. sofort) neue Zeile
  pos=0; dir=-dir; delay=Math.max(0,tickerLinedelay);
  line=(line<tickerLines.length-1)?line+1:1
 }

 // Ticker erneut starten ...
 setTimeout('doTicker('+line+','+pos+','+dir+')',delay);
 return true;
}

// Ticker-Images laden
function cacheTicker(ImgMask,Capitals) {
 if(document.images) { var i;
  // Image-Namensmaske
  tickerImg=ImgMask.substring(0,ImgMask.lastIndexOf("."));
  tickerExt=ImgMask.substring(ImgMask.lastIndexOf("."),ImgMask.length);
  // Grafiken cachen
  tickerCache=new Array();
  for(i=0;i<256;i++) {
   if((i>=32 && i<=96) || (!Capitals && i>=97 && i<=122) || (i>=123 && i<=127) || (i>=160 && i<=223) || (!Capitals && i>=224 && i<=246) || i==247 || i==248 || (!Capitals && i>=249 && i<=253) || i==254 || i==255) {
    tickerCache[i]=new Image();
    tickerCache[i].src=tickerImg+i+tickerExt;
   }
  }
 }
}

// ----- Unterroutinen fuer externe Textdatei -----

// Arbeitskopie mit (ggf. ausgesuchten) Texten erstellen 290104
// Nur fuer den internen Gebrauch
function makeTickerWork(entry,all) {
 // Lokale Variablen
 var q, w=0;
 // Beschraenkung uebergeben?
 if(entry) {
  // Ja, Arbeitsfeld anlegen
  TickerWork=new Array();
  // Alle Texte durchgehen,
  for(q=0;q<TickerText.length;q++) {
   // und wenn gewuenschter String enthalten ist,
   if(TickerText[q].toLowerCase().indexOf(entry)>=0) {
    // Text in Arbeitsfeld uebernehmen
    TickerWork[w]=TickerText[q];
    // Wenn alle passenden Texte gefunden werden sollen
    if(all) {
     // Zeige auf naechsten Eintrag des Arbeitsfeldes setzen
     w++;
    } else {
     // Andernfalls Suche abbrechen
     break;
    }
   }
  }
 // Keine Beschraenkung uebergeben
 } else {
  // Schnell alle Texte in das Arbeitsfeld kopieren
  TickerWork=TickerText.join("$NewTickerLine$").split("$NewTickerLine$");
 }
}

// Text(e) aus der Datei holen 290104
// Parameter: entry (optional: Textnummer oder String, um Texte einzugrenzen)
//            all (optional: true, wenn alle passenden Texte geholt werden sollen)
function xGetTicker(entry,all) {
 // Lokale Variablen
 var text="", nr;
 // Wenn Beschraenkung uebergeben wurde: Umwandeln in Kleinbuchstaben. Sonst: 1. Text
 entry=(entry)?(""+entry).toLowerCase():1;
 // Beschraenkung umwandeln in eine Zahl
 nr=parseInt("0"+entry,10);
 // Wenn dies eine gueltige Zahl ist
 if(nr>0 && nr<=TickerText.length && (""+nr).length==entry.length) {
  // Text mit der gewuenschten Nummer holen
  text=TickerText[nr-1]
 // Wenn es keine gueltige Zahl ist
 } else {
  // all definitiv einen Wert zuweisen
  all=(all)?true:false;
  // Arbeitsfeld erstellen
  makeTickerWork(entry,all);
  // gewuenschter Text entspricht dem Arbeitsfeld
  text=TickerWork.join("||");
 }
 // gefundenen Text uebergeben
 return text;
}

// Alle Texte aus der Datei holen 290104
// Parameter: reverse (optional: true, wenn Reihenfolge umgekehrt werden soll)
function xAllTicker(reverse) {
 // Wenn umgekehrte Reihenfolge gewuenscht wird
 if(reverse) {
  // Arbeitsfeld mit allen Texten erstellen
  makeTickerWork();
  // und mit umgekehrte Reihenfolge uebergeben
  return TickerWork.reverse().join("||");
 // Wenn originale Reihenfolge gewuenscht wird
 } else {
  // Originalfeld uebergeben
  return TickerText.join("||");
 }
}

// Zufaelligen Text aus (ggf. einem Teil) der Datei holen 290104
// Parameter: entry (optional: String, um Texte einzugrenzen)
function xRandomTicker(entry) {
 // Wenn Beschraenkung uebergeben wurde: Umwandeln in Kleinbuchstaben. Sonst: false
 entry=(entry)?(""+entry).toLowerCase():false;
 // Arbeitsfeld mit allen zutreffenden Texten erstellen
 makeTickerWork(entry,true);
 // und aus diesem Arbeitsfeld einen Text aussuchen
 return TickerWork[rnd(TickerWork.length)-1];
}

// Alle oder begrenzte Texte aus der Datei holen 290104
// Parameter: entry (optional: String, um Texte einzugrenzen)
function xShuffleTicker(entry) {
 // Lokale Variablen
 var q, r, text="";
 // Wenn Beschraenkung uebergeben wurde: Umwandeln in Kleinbuchstaben. Sonst: false
 entry=(entry)?(""+entry).toLowerCase():false;
 // Arbeitsfeld mit allen zutreffenden Texten erstellen
 makeTickerWork(entry,true);
 // Soviele Texte das Arbeitsfeld hat:
 for(q=0;q<TickerWork.length;q++) {
  // Zufallszahl ermitteln
  r=rnd(TickerWork.length-q)+q-1;
  // Text holen (ggf. mit Abgrenzer vorneweg)
  text+=((text)?"||":"")+TickerWork[r];
  // Eintrag des Arbeitsfeldes loeschen
  TickerWork[r]="";
  // Arbeitsfeld sortieren (leere Elemente wandern nach oben)
  TickerWork.sort();
 }
 // Ergebnis uebergeben
 return text;
}

// ===========================================================================

// 'Natuerliche Zufallszahl 130703' (1<=Zahl<=max) by cybaer@vampirehost.de
function rnd(max) { if(Math.random) { return Math.ceil(Math.max(1,max)*Math.random()); } else { return max; } }

// ---------------------------------------------------------------------------

/* 'Replace HTML Tags 020703' (c) by cybaer@vampirehost.de
   --------------------------
 Inhalt    : Ersetzt alle gefundenen HTML-(End-)Tags durch eine Zeichenfolge
 Aufruf    : replaceHtmlTags(text,tagname,subs)
 Parameter : Text (String mit Tags)
             Tagname (Name des gewuenschten Tags (z.B. "A " oder "BR" - Endtags mit
                      vorangestelltem "/"); leer, wenn alle Tags ersetzt werden sollen)
             Subs (Ersatzstring)
             All (wenn True, werden alle Tags geaendert; bei False nur der erste)
             Start (Anfangsposition der Suche - optional)
 Sprache   : JavaScript 1.0
 Quelle    : http://www.vampirehost.de/gruft/coding/ (cybaer@vampirehost.de)
             Die kostenlose Nutzung der Quelltexte in eigenen Projekten ist
             bei nicht-kommerziellen Projekten (und deren unentgeltlicher
             Herstellung) bei Nennung der Quelle ausdruecklich gestattet.
 InlineFunc: -
 Konstante : -
 Variable  : -
 SystemVar : -
 ExternVar : -
 Rueckgabe : Bearbeiteter String
 Anmerkung : Start- und End-Tags werden separat behandelt
 Beispiele : -
*/

function replaceHtmlTags(text,tagname,subs,all,start) {
 var ende; tagname=tagname.toUpperCase();
 start=(start)?start:0;
 while(text.toUpperCase().indexOf("<"+tagname,start)>=0) {
  start=text.toUpperCase().indexOf("<"+tagname,start);
  if(tagname=="!--") { ende=text.indexOf("-->",start)+3 } else { ende=text.toUpperCase().indexOf(">",start)+1 }
  text=text.substring(0,start)+subs+text.substring(ende,text.length);
  if(!all) { break; }
 }
 return text;
}

// ---------------------------------------------------------------------------

/* 'Reduce HTML Spaces 240703' (c) by cybaer@vampirehost.de
   ---------------------------
 Inhalt    : Reduziert in einem String doppelt vorkommene Leerzeichen (nach HTML-Definition)
 Aufruf    : reduceHtmlSpaces(Text)
 Parameter : Text (String)
 Sprache   : JavaScript 1.0
 Quelle    : http://www.vampirehost.de/gruft/coding/ (cybaer@vampirehost.de)
             Die kostenlose Nutzung der Quelltexte in eigenen Projekten ist
             bei nicht-kommerziellen Projekten (und deren unentgeltlicher
             Herstellung) bei Nennung der Quelle ausdruecklich gestattet.
 InlineFunc: rc()
 Konstante : -
 Variable  : -
 SystemVar : -
 ExternVar : -
 Rueckgabe : Bearbeiteter String
 Anmerkung : -
 Beispiele : -
*/

function reduceHtmlSpaces(text) {
 text=rc(text,"\x0A"," ");
 text=rc(text,"\x0D"," ");
 while(text.indexOf("  ")>=0) { text=rc(text,"  "," "); }
 return text;
}

// ---------------------------------------------------------------------------

/* 'ReplaceChar 041103' (c) by cybaer@vampirehost.de
   --------------------
 Inhalt    : Ersetzt alle gefundenen Zeichen durch eine Zeichenfolge
 Aufruf    : rc(text,chars,subs,insensitive)
 Parameter : Text (String)
             Chars (Gesuchter Teilstring)
             Subs (Ersatzstring)
             Insensitive (true, wenn Klein-/Grossschreibung ignoriert werden soll)
 Sprache   : JavaScript 1.0
 Quelle    : http://www.vampirehost.de/gruft/coding/ (cybaer@vampirehost.de)
             Die kostenlose Nutzung der Quelltexte in eigenen Projekten ist
             bei nicht-kommerziellen Projekten (und deren unentgeltlicher
             Herstellung) bei Nennung der Quelle ausdruecklich gestattet.
 InlineFunc: -
 Konstante : -
 Variable  : -
 SystemVar : -
 ExternVar : -
 Rueckgabe : Bearbeiteter String
 Anmerkung : -
 Beispiele : "ABCabc","B","D",true -> "ADCaDc"
             "ABCabc","B","D" -> "ADCabc"
             "ABCabc","B" -> "ACabc"
*/

function rc(text,chars,subs,insensitive) {
 if(chars) {
  var i, work, result="", start=0;
  subs=(subs)?subs:"";
  if(insensitive) {
   work=text.toLowerCase();
   chars=chars.toLowerCase();
  } else {
   work=text;
  }
  i=work.indexOf(chars,start);
  while(i>=0) {
   result+=text.substring(start,i)+subs;
   start=i+chars.length;
   i=work.indexOf(chars,start);
   if(!i) { break; }
  }
  result+=text.substring(start,text.length);
  return result;
 } else {
  return text;
 }
}

// ---------------------------------------------------------------------------

/* 'Trim Trailing Spaces 010703' (c) by cybaer@vampirehost.de
   -----------------------------
 Inhalt    : Entfernt einem String vorstehende und folgende Leerzeichen
 Aufruf    : trim(Text)
 Parameter : Text (String)
 Sprache   : JavaScript 1.0
 Quelle    : http://www.vampirehost.de/gruft/coding/ (cybaer@vampirehost.de)
             Die kostenlose Nutzung der Quelltexte in eigenen Projekten ist
             bei nicht-kommerziellen Projekten (und deren unentgeltlicher
             Herstellung) bei Nennung der Quelle ausdruecklich gestattet.
 InlineFunc: -
 Konstante : -
 Variable  : -
 SystemVar : -
 ExternVar : -
 Rueckgabe : Bearbeiteter String
 Anmerkung : -
 Beispiele : -
*/

function trim(text) {
 while(text.charAt(0)==" ") { text=text.substring(1,text.length); }
 while(text.charAt(text.length-1)==" ") { text=text.substring(0,text.length-1); }
 return text;
}

// ---------------------------------------------------------------------------

xJSticker=true; // Externes JavaScript geladen!

