// Ticker script - © Marcus Gilroy-Ware 2009 - www.vsclabs.com

String.prototype.fragment = function (){
    
    var s = this.replace(/(.)/g, "<span style=\"display:none\" class=\"appearing-letter\">$1</span>");
    return s;
    
}

String.prototype.parseLinks = function (){
    
    var s = this.replace(/(http:\/\/[^\s]+)/g, "<a href=\"$1\">$1</a>");
    return s;
    
}

var tickerItems;
var currentTickerItemId;
var currentLinkObject;
var nextItemCanProceed = true;
var typer;
var typingInProgress = false;

function initializeTicker(){
    // display first item
    tickerItems = $$('#ticker li');
    currentTickerItemId = tickerItems.first().id;
    displayTickerItem(tickerItems.first().id);
    
    // set interval to execute nextTickerItem()
    // var interval = setInterval("nextTickerItem()", 5000);
}

function clearTicker(){
    // clear currently visible ticker item, if any
    if(currentTickerItemId){
        hideTickerItem(currentTickerItemId);
    }
}

function displayTickerItem(id){
    
    // display ticker item with supplied id
    // set 'current' to new value
    currentTickerItemId = id;
    currentLinkObject = $(id);
    // var t = setTimeout('', 501);
    displayNewElement();
    
}

function nextTickerItem(){
    
    if(nextItemCanProceed){
    
        // if item is already visible, clear ticker
        clearTicker();

        var nextTickerId;

        // figure out the next ticker id
        if(currentTickerItemId == tickerItems.last().id){
            nextTickerId = tickerItems.first().id;
        }else{
            var c = 0;
            // for (item in tickerItems){
            tickerItems.each(function(item, index) {
                var nextIndex = c+1;
        
                if(item.id == currentTickerItemId){
                    nextTickerId = tickerItems[nextIndex].id;
                }
        
                c++;
            });
        }

        // display using displayTickerItem()
        displayTickerItem(nextTickerId);
    
    }else{
        
    }
    
}

function hideTickerItem(id){
    
    $(id).style.display = 'none';
    
    /* var link = getLinkFromListItem($(id));
    link.innerHTML = link.innerHTML.stripTags(); */
    
    var li = $(id);
    li.innerHTML = li.innerHTML.stripTags();

}

function displayNewElement(){
    displayLettersProgressively(currentLinkObject, true);
}

function setNextItemReady(){
    
    nextItemCanProceed = true;
    typer.stop();
    var t = setTimeout("nextTickerItem()", 3800);
    
}

function displayLettersProgressively(element, triggerReadyCallback){
    
    nextItemCanProceed = false;
    
    // var link = getLinkFromListItem(element);
    // var li = 
    
    // capture the original string
    var originalContents = element.innerHTML;
    
    // fill the element with invisible spans
    element.style.color = '#888';
    element.innerHTML = originalContents.stripTags().fragment();
    // link.id = element.id+'-link';
        
    // make the actual element visible
    element.style.display = 'block';
    // link.style.display = 'inline';
    
    var selector = '#'+element.id+' span.appearing-letter';
    
    var spans = $$(selector);
    var spanIndex = 0;
    
    typingInProgress = true;
    
    typer = new PeriodicalExecuter(function(){
        
        if(spanIndex < spans.length){
            spans[spanIndex].id = element.id+'-letter-'+spanIndex;
            // new Effect.Appear(spans[spanIndex].id, {duration:0.5});
            $(spans[spanIndex].id).style.display = 'inline';
            spanIndex++;
        }else{
            typingInProgress = false;
            if(triggerReadyCallback){
                // This code is called after the ticker item has finished "printing"
                element.innerHTML = element.innerHTML.stripTags();
                element.innerHTML = element.innerHTML.parseLinks();
                element.morph('color: #fff', {duration: 0.5});
                // alert(element.innerHTML);
                setNextItemReady();
            }
        }
        
    },  0.05);
    
}

function getLinkFromListItem(listItem){
    var a = Array.from(listItem.getElementsByTagName('a')).first();
    return a;
}
