
 
function newsTicker( howMany, howManyVisible, newsTickerWrapID, tickerHeight, setUpTimer, varName, data ){
    
    // Init variables
    this.elementWrap                = document.getElementById( newsTickerWrapID );
    this.elementIDs                 = new Array( );
    this.elementPositions           = new Array( );
    this.tickerHolderIDs            = new Array( );
    this.ticketNumbering            = new Array( );
    this.elementNumber              = howMany;
    this.elementHeight              = tickerHeight; 
    this.howMany                    = howMany;
    this.howManyVisible             = howManyVisible;
    this.innerWrapMoveStep          = 5;
    this.innerWrapMoveStepTimer     = 35;
    this.innerWrapBetweenTimer      = setUpTimer;
    this.dataActivated              = ( !data ) ? false : true;
    
    if( this.dataActivated )
        this.howMany = data.length;
    
    // Init values    
    for( var i = 0; i < this.howMany; i++ ){
        
        this.elementIDs[ i ]       = "news-ticker-c-" + varName + "-" + i;
        this.elementPositions[ i ] = tickerHeight * i;   
        
        if( this.dataActivated )     
            this.ticketNumbering[ i ]  = data[ i ];
        else
            this.ticketNumbering[ i ]  = i;
    }   
    
    // Place a height corresponding to number of visible boxes * height
    this.elementWrap.style.height = ( tickerHeight * howManyVisible ) + "px";
    
    // Does it animate or we just show all cases?
    if ( this.howMany == howManyVisible || this.howMany < howManyVisible ){

        startTickerTop = 0;
        // Generate holders and fill up data
        for( var i = 0; i < this.howMany; i++ ){
            tickerTempID                = "TCH-"+ varName + "-" + i;
            this.tickerHolderIDs[ i ]   = tickerTempID;
            this.elementWrap.innerHTML += "<div id='" + tickerTempID + "'" +
                "style='position: absolute; top:" + startTickerTop + "px; height:" + this.elementHeight + "px;'" + ">";
                "</div>";
            ;
            document.getElementById( this.tickerHolderIDs[ i ] ).innerHTML = this.ticketNumbering[ i ];
        
            startTickerTop += tickerHeight;
        }
        
        // No animation, no need for object functions -- release the memory
        return false;
    }
    
    // It animates -- so we need to generate proper holders \ID\Color\Positions\Number
    
    // Temporary variables
    var tickerTempID    = "";
    var startTickerTop  = ( -1 ) * tickerHeight;
    
    for( var i = 0; i <= howManyVisible; i++ ){
        
        tickerTempID                = "TCH-"+ varName + "-" + i;
        this.tickerHolderIDs[ i ]   = tickerTempID;
        this.elementWrap.innerHTML += "<div id='" + tickerTempID + "'" +
            "style='position: absolute; top:" + startTickerTop + "px; height:" + this.elementHeight + "px;'" + ">";
            "</div>";
        ;
        document.getElementById( this.tickerHolderIDs[ i ] ).innerHTML = this.ticketNumbering[ howManyVisible - i ];
        
        startTickerTop += tickerHeight;
    }
    
    // Set up methods
    
    this.next       = NT_nextF;
    
    // Start to animate

    setTimeout( varName + ".next( 0, " + setUpTimer + ", '" + varName + "')", setUpTimer );
    
    // Release memory -- temporary variables
    
    tickerHeight        = null;
    tickerTempID        = null;
    startTickerTop      = null;
    i                   = null;
}

// Object methods

function NT_nextF( totalMoved, setUpTimer, varName ){
    
    if( totalMoved < this.elementHeight ){
        
        totalMoved                      += this.innerWrapMoveStep;

        changeOpacity( this.tickerHolderIDs[ 0 ], parseFloat( totalMoved / this.elementHeight ) );
        changeOpacity( this.tickerHolderIDs[ this.tickerHolderIDs.length - 1 ], parseFloat( 1 - totalMoved / this.elementHeight ) );
       

        for( var i = 0; i < this.tickerHolderIDs.length; i++ ){
            
            var element             = document.getElementById( this.tickerHolderIDs[ i ] );
            var curTopPos           = parseInt( element.style.top ) + this.innerWrapMoveStep;

                element.style.top   = curTopPos + "px";
        }
        
        setTimeout( varName + ".next(" + totalMoved + ", " + setUpTimer + ", '" + varName + "')", this.innerWrapMoveStepTimer  );
        
    } else {
        
        // Reset colors

        var tempNumber  = this.ticketNumbering[ 0 ];
            
        for( var i = 0; i < this.howMany - 1; i++ ){
            
            this.ticketNumbering[ i ] = this.ticketNumbering[ i + 1 ];
        }
        this.ticketNumbering[ this.howMany - 1 ] = tempNumber;
        
        var tempElement = null;
        var tempTopPos  = ( -1 ) * this.elementHeight ;
        
        document.getElementById( this.tickerHolderIDs[ this.tickerHolderIDs.length - 1 ] ).style.opacity = 1;
        
        for( var i = 0; i <= this.howManyVisible; i++ ){
         
            tempElement                         = document.getElementById( this.tickerHolderIDs[ i ] );
            tempElement.style.top               = tempTopPos + "px";
            tempElement.innerHTML               = this.ticketNumbering[ this.howManyVisible - i ];
            
            tempTopPos += this.elementHeight; 
        }
        
        
        tempElement=  null;
        tempTopPos = null;
        
        // Start new one
        setTimeout(  varName + ".next( 0," + setUpTimer + ", '" + varName + "')", setUpTimer );
    }
}

// Extern functions
function toPixel( intValue ){ return ( parseInt( intValue ) + "px" ); }


