var f;
var nav;
var current = 0, next = 1;
var override = 0;
var featureTime = 6000;
var initialized = false;
var timeouts = Array();

// TODO: Clean up code, rewrite bloated structures.
//       Create support for Internet Explorer 8

window.onload = function() {
    init();
}


// Helper functions to stop several unwanted timeouts to be run.
function addTimeout(t) {
    var l = timeouts.length-1 || 0;
    timeouts[timeouts.length-1] = t; 
}

function clearTimeouts() {
    for(var i in timeouts) {
        clearTimeout(timeouts[i]);
    }
    timeouts = Array();
}

function init() {
    if(initialized) return;
    initialized = true;
    f = document.getElementsByClassName('featured');
    f[0].style.opacity = 1;

    var e = document.getElementById('featured-nav');
    var g = "";
    for(var i = 0; i < f.length; i++) {
        g += '<a href="javascript:;" class="featured-nav" onclick="showFeature(' +  i + ')">' + (i+1) + '</a> ';
        f[i].onmouseover = function() { 
            override++;
        }
        f[i].onmouseout = function() { 
            override--;
            addTimeout(
                setTimeout(function() {
                    nextFeature();
                }, featureTime)
            );
        }
    }
    e.innerHTML = g;



    nav = document.getElementsByClassName('featured-nav');
    nav[0].className = 'featured-nav selected';
    addTimeout(
        setTimeout(function() {
            nextFeature();
        }, featureTime)
    );
}

function fadeDown(i, cur, nxt) {
    if(i > 5) {
        return;
    }
    f[cur].style.opacity = 0; 
	
    addTimeout(
    	setTimeout(function() {
        	fadeUp(0, cur, nxt);
        }, 25)
    );
}

function fadeUp(i, cur, nxt) {
    if(i > 5) {
        return;
    }
    f[nxt].style.opacity = i/5;
    if(i < 5) {
        addTimeout(
            setTimeout(function() {
                fadeUp(i+1, cur, nxt);
            }, 5)
        );
    } else {
        fixAttributes(cur, nxt);
    }
}

function nextFeature() {
    if(override > 0) {
        return;
    }
    clearTimeouts();
    next = current + 1;
    if(next == f.length) { 
        next = 0;
    }
    fadeDown(0, current, next);
    addTimeout(
        setTimeout(function() {
            current = next;
            addTimeout(
                setTimeout(function() {
                    nextFeature();
                }, featureTime)
            );
        }, 500)
    );
}

function fixAttributes(a, b) {
    f[a].style.opacity = 0;
    f[b].style.opacity = 1;
    nav[a].className = 'featured-nav';
    nav[b].className = 'featured-nav selected';
}

function showFeature(i) {
    if(i < 0 || i > f.length || i == current) return;
    clearTimeouts();
    var cur = current;
    override++; 
    next = i; 
    current = i;
    for(var j = 0; j < f.length; j++) {
        if(j != i) {
            f[j].style.opacity = 0;
        }
    }
    fadeUp(0, cur, i); 

    addTimeout(
        setTimeout(function() {
            override--;
            if(override < 1) {
                next = current + 1;
                nextFeature();
            }
        }, 2*featureTime)
    );
}



