/**
 *Aufruf:
 *    
    <div id="newstickerWrapper1" style="overflow:hidden; width:600px; height: 18px; border: none;">
        Text Ticker 1
    </div>
    <div id="newstickerWrapper2" style="overflow:hidden; width:600px; height: 18px; border: none;">
        Text Ticker 2
    </div>
    <div id="newstickerWrapper3" style="overflow:hidden; width:600px; height: 18px; border: none;">
        Text Ticker 3
    </div>
    <div id="newstickerWrapper4" style="overflow:hidden; width:600px; height: 18px; border: none;">
        Text Ticker 4
    </div>
    <script type="text/javascript">
        newsTicker erwartet beim Aufruf ein JSON-Objekt als Parameter.
        var tickerParams = {
                            id: 'Element-ID',   // Erforderlich
                            
                            // Optional, Anzahl der Ticks pro Sekunde. Sinnvolle Werte sind 2-80
                            // Default: 5
                            FPS: int,    
                            
                            // Optional, Sprungweite in PX pro Tick.
                            // Default: 7
                            tickWidth: int,     
                            
                            // Gibt an, ob der Ticker von Links nach Rechts tickt
                            // Default: false
                            LTR: boolean 
                           }
        var ticker1 = new newsTicker({id:'newstickerWrapper1'});
        var ticker2 = new newsTicker({id:'newstickerWrapper2', FPS: 7});
        var ticker3 = new newsTicker({id:'newstickerWrapper3', FPS: 6, tickWidth: 7});
        var ticker4 = new newsTicker({id:'newstickerWrapper4', FPS: 8, tickWidth: 5, LTR: true});
    </script>
  **/            


function __$(element){
  return document.getElementById(element);
}


// Ticker-Object
function newsTicker(params){
    // Zeit zwischen den Ticks 
    this.FPS = params.FPS || false;
    
    // Tick-Weite
    this.tickWidth = params.tickWidth || 7;
    
    // Left-to-Right Ticking
    this.LTR = params.LTR || false;
    
    // Sonstige Variablen 
    this.timeout = 200;
    this.wrapper = params.id;
    this.tickerText = false; 
    this.tickerWidth = false;
    this.textWidth;
    this.paused = false;
    this.textLeft = false;
  
    this.initTicker = function(obj){
        if(obj.FPS){
            obj.timeout = 1000/obj.FPS;
        }
        if(obj.wrapper){
            if(!__$(obj.wrapper)){
                setTimeout(function(){ obj.initTicker(obj); },150);
            } else {
                obj.wrapper = __$(obj.wrapper);
                obj.startTickingPreparations(obj);
            }
        } else {
            setTimeout(function(){ obj.initTicker(obj); } ,150);
        }
    }
  
    this.startTickingPreparations = function(obj){
        obj.tickerText = obj.wrapper.innerHTML;
        obj.wrapper.innerHTML = "";
        obj.wrapper.style.position = "relative";
        
        obj.tickerText = obj.createElement("div", obj.tickerText, new Array(), obj);
        
        obj.tickerWidth = obj.getComputedWidth(obj.wrapper);
        obj.wrapper.appendChild(obj.tickerText);
        
        if(obj.tickerText.parentNode.addEventListener){
            obj.tickerText.parentNode.addEventListener("mouseover",function(){ obj.paused = true; },false);
            obj.tickerText.parentNode.addEventListener("mouseout",function(){ obj.paused = false; },false);
        } else if(obj.tickerText.parentNode.attachEvent){
            obj.tickerText.parentNode.attachEvent("onmouseover",function(){ obj.paused = true; });
            obj.tickerText.parentNode.attachEvent("onmouseout",function(){ obj.paused = false; });
        }
        
        
        obj.getTextWidth(obj); 
        //_debug(textWidth);
        obj.tickerText.style.left = (obj.LTR) ? (obj.textWidth*-1)+"px" : obj.tickerWidth+"px";
        
        obj.startTick(obj);
    }
  //<script type="text/javascript" language="javascript">var ticker = new newsTicker({id:'newstickerWrapper'});</script>
    this.getTextWidth = function(obj){
        var x = obj.getComputedWidth(obj.tickerText);
        if(x <= 0 || x.isNaN){
            setTimeout(function(){ obj.getTextWidth(obj); },100);
        } else {
            obj.textWidth = x
            return true;
        }
    }
    
    // ticken
    this.startTick = function(obj){
        // Zunächst den aktuellen left-Wert des Textes auslesen, falls nicht vorhanden
        if(!obj.textLeft){
        obj.textLeft = obj.tickerText.style.left;
        obj.textLeft = obj.textLeft.replace(/([^-\d]{0,})/g, "");
        }
        
        // Wenn pausiert oder kein left-Wert ermittelt werden konnte dieses mal nicht ticken
        if(!obj.paused && obj.textLeft){
            
            // Ticker von Links nach rechts laufen lassen...
            if(obj.LTR){
                // Ticker wieder nach Links setzen, wenn left-Wert des Tickers größer der Ticker-Breite ist
                if(obj.textLeft > obj.tickerWidth){
                    obj.textLeft = obj.textWidth*-1;
                    obj.tickerText.style.left = parseInt(obj.textWidth*-1)+"px";
                // Sonst Ticker um eins nach rechts ticken lassen
                } else {
                    obj.tickerText.style.left = (obj.textLeft*1+obj.tickWidth*1)+"px";
                    obj.textLeft = obj.textLeft*1+obj.tickWidth*1;
                }
            // ...bzw. von Rechts nach Links
            } else {
                // Wenn left-Wert des Tickers kleiner der Textbreite*-1 ist Ticker wieder nach Rechts setzen
                if(obj.textLeft < obj.textWidth*-1){
                    obj.tickerText.style.left = obj.tickerWidth+"px";
                    obj.textLeft = obj.tickerWidth;
                // Sonst Ticker um eins nach Links ticken lassen
                } else {
                    obj.tickerText.style.left = parseInt(parseInt(obj.textLeft*1)-parseInt(obj.tickWidth*1))+"px";
                    obj.textLeft = obj.textLeft*1-obj.tickWidth*1;
                }
            }  
        }
        //_debug(left);
        if(obj.tickerText.innerHTML != ""){
            setTimeout(function(){ obj.startTick(obj); }, obj.timeout);
        }
    }
    
    this.getComputedWidth = function(obj){
        // Wenn man direkt an die Style-Breite rankommt diese zurueckgeben
        if(obj.style.width) return parseInt(obj.style.width);
        
        // Sonst Fallback auf vom Browser berechnete Breiten
        var tmphght = false;
        if(obj.attachEvent){
            tmphght = obj.offsetWidth;
        }
        else{
            var tmphght1 = document.defaultView.getComputedStyle(obj, "").getPropertyValue("width");
            tmphght = tmphght1.split('px');
            tmphght = tmphght[0];
        }
        return tmphght;
    }

    
    
    this.createElement = function(type,content,obj){
        var x = document.createElement(type);
        x.style.position = "absolute";
        x.style.whiteSpace = "nowrap";
        x.innerHTML = content;
        return x;
    }
    

  this.initTicker(this); 
}



function _debug(text){
  document.body.innerHTML+= text+"<br/>";
}
