//
// JavaScript Newsticker written by KjM <kjm@kjm.hu>
// You can use this script only if you include this header
// Eventwrapper by Scrott Andrew
//

// Shortcuts
var dcm = document;

// Wrapper for getElementById
function gE(id) {return dcm.getElementById(id);}

// Wrapper für getElementsByTagName
function eB(o,t,e) {var r = o.getElementsByTagName(t); return (e==null)?r:r[e];}

// Start NewsTicker Object
var NewsTicker = {

  // MS XML lib
  msobj: null,
  ismsie: false,

  // Cross browser event handling by Scrott Andrew
  addEvent: function(obj, evType, fn, useCapture) {
    if (obj.addEventListener) {
      obj.addEventListener(evType, fn, useCapture);
      return true;
    } else if (obj.attachEvent) {
      var r = obj.attachEvent('on'+evType,fn);
      return r;
    } else {
      obj['on'+evType] = fn;
    }
  },

  // Setup Function which can be used after page is loaded
  isLoaded: function() {

    // Setup mouseover Function
    Drag.init(gE("ticker"),null,0,0,0,null);
  },

  // Pick best available XML lib under MSIE
  pickLib: function() {

    // Possible Libs in MSIE
    var l = new Array("Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");

    // Alle möglichen Libs testen
    for (var i = 0; i < l.length; i++) {
      try {
        var t = new ActiveXObject(l[i]);
	return l[i];
      } catch (e) { }
    }

    // Nothing found
    return null;
  },

  // Init Function
  Init: function() {
    
    // Init news array
    NewsTicker.Content = new Array();
    NewsTicker.WaitFor = 1000; NewsTicker.Orient = 0;
    NewsTicker.WaitAfter = 5000; NewsTicker.ClearOld = 0;
    NewsTicker.Timeout = setTimeout("NewsTicker.Tick()",NewsTicker.WaitFor);
    NewsTicker.CharAt  = 1; NewsTicker.Element = 0;
    NewsTicker.TxtPrefix = ""; NewsTicker.NewsUrl = "";
    NewsTicker.TO = ""; NewsTicker.xmlhttp = null;

    // Init XML Object
    if (!window.opera && navigator.userAgent.indexOf("MSIE") !=-1) {
      NewsTicker.ismsie = true;
      NewsTicker.msobj = NewsTicker.pickLib();
      if (NewsTicker.msobj!=null)
        NewsTicker.xmlhttp = new ActiveXObject(NewsTicker.msobj);
    } else {
      NewsTicker.xmlhttp = new XMLHttpRequest();
    }
  },

  // Set Prefix for the newsticker
  Prefix: function(prf) {
    NewsTicker.TxtPrefix = prf;
  },

  // Start fetch request of new newsfeed
  GetNews: function(url,clearold) {
    
    // Clear old array?
    if ((clearold != null) && (clearold)) NewsTicker.ClearOld = 1;

    // Fetch news from the given URL
    if ((url != null) && (NewsTicker.xmlhttp != null)) {

      // Re-Init MS XML Object
      if (NewsTicker.ismsie) 
        NewsTicker.xmlhttp = new ActiveXObject(NewsTicker.msobj);

      // Stop display timeout
      clearTimeout(NewsTicker.Timeout);

      // ReFetch xml content
      NewsTicker.NewsUrl = url;
      NewsTicker.xmlhttp.onreadystatechange = NewsTicker.XMLHandler;
      NewsTicker.xmlhttp.open("GET",url,true);
      NewsTicker.xmlhttp.send(null);
    }
  },

  // XML Fetch Handler
  XMLHandler: function() {

    // Fetch is done
    if (NewsTicker.xmlhttp.readyState == 4) {
      var res = NewsTicker.xmlhttp.responseXML;
      var count = NewsTicker.get(res,"Counter",true);

      // Clear newsticker content
      NewsTicker.Clear(); 
 
      // No new contacts
      if (!count) {
        NewsTicker.Add("Today no new contacted aircrafts","");

        // Set re-fetch interval
        NewsTicker.ReFetch();
        return;
      }

      // Set header
      NewsTicker.Add("Today "+count+" new contacted aircrafts. "+NewsTicker.get(res,"Add"),"");

      // Get entries
      var d = eB(res,"Entry");

      // Get content
      for (var i=0;i<d.length;i++) {
        var a  = NewsTicker.get(d[i],"Airline");
        var r  = NewsTicker.get(d[i],"Reg");
        var ac = NewsTicker.get(d[i],"Aircraft");
        var n  = NewsTicker.get(d[i],"Flightnum");
        var f  = NewsTicker.get(d[i],"Flight");

        // Show content
        NewsTicker.Add(a+" "+ac+" ["+r+"] on flight "+n+" ("+f+")","http://www.planespotting.net/R_"+r+".html");
      }

      // Init timeout to display contacts
      NewsTicker.Timeout = setTimeout("NewsTicker.Tick()",NewsTicker.WaitFor);

      // Set re-fetch interval
      NewsTicker.ReFetch();
    }
  },

  // Set re-fetch interval
  ReFetch: function() {

    // New fetch after 15 Minutes
    if (NewsTicker.TO.length) clearTimeout(NewsTicker.TO);
    NewsTicker.TO = setTimeout("NewsTicker.GetNews(NewsTicker.NewsUrl,1)",60000*15);
  },

  // Show Ticker
  Tick: function() {

    // Get display container
    var d = gE("ticker");

    // We have content to show
    if ((d) && (NewsTicker.Content.length)) {

      // Get current Array element
      var a = NewsTicker.Content[NewsTicker.Element];
      var s = ''+a[0]+''; var l = ''+a[1]+'';

      // Orientation
      if (!NewsTicker.Orient) {

        // With or without link
        if (l.length) 
          d.innerHTML = NewsTicker.TxtPrefix+"<a target='_blank' title='"+a[0]+"' href='"+a[1]+"'>"+s.substr(0,NewsTicker.CharAt)+"_</a>";
        else 
          d.innerHTML = NewsTicker.TxtPrefix+s.substr(0,NewsTicker.CharAt)+"_";
      } else {

        // With or without link
        var o = "";
        if (l.length) 
          o = "<a href='"+a[1]+"'>";
        for (var i = 0; i < NewsTicker.CharAt; i++) {
          o += s.substr(i,1) + "<br>";
        }
        // With or without link
        if (l.length) o += "</a>";
        d.innerHTML = o;
      }

      // Increment Char Offset
      NewsTicker.CharAt++;
      if (NewsTicker.CharAt > s.length) {
        NewsTicker.CharAt = 1; 
        NewsTicker.WaitFor = NewsTicker.WaitAfter;
        NewsTicker.Element++;

        // End of Array?
        if (NewsTicker.Element>=NewsTicker.Content.length)
          NewsTicker.Element = 0;
      } else

        // Change newsticker intervall
        NewsTicker.WaitFor = 55;
    }

    // Next Element
    NewsTicker.Timeout = setTimeout("NewsTicker.Tick()",NewsTicker.WaitFor);
  },

  // Clear all entries within the private array
  Clear: function() {
    NewsTicker.Content = new Array();
  },

  // Fill content of the NewsTicker database
  Add: function(text,link) {
    if (!NewsTicker.Content) return 0;
    NewsTicker.Content[NewsTicker.Content.length] = [[''+text+''],[''+link+'']];
    return NewsTicker.Content.length;
  },

  //
  // Short wrapper
  //
  get: function(x,s,l) { 
    try { 
      var r = eB(x,s); 
    } catch (e) { 
      if (l==null) return ""; 
      return (l==true)?0:0.0;
    }
    if ((r.length) && (r[0].firstChild)) {
      var b = r[0].firstChild.nodeValue; 
      if (l==null) return b;
      return (l)?parseInt(b):parseFloat(b);
    } else { return (l!=null)?0:""; }
  }
}

// Setup loader 
NewsTicker.addEvent(window,'load',NewsTicker.isLoaded,false);

// Start Image Object Handler
NewsTicker.Init();

