var posts = {};
var links_lookup = {};

function nav_setup() {
    
    var next = document.getElementById('nav_next');
    if (!next) {
        return;
    }
    var prev = document.getElementById('nav_prev');
    
    var main = document.getElementById('main');
    for (var i = 0; i < main.childNodes.length; i++) {
        var node = main.childNodes[i];
        if (node.nodeName == 'DIV' && node.className == 'post') {
            var anchor = node.previousSibling.getAttribute('name');
            posts[anchor] = find_pos(node)[1];
        }
    }
    
    event_add(next, 'click', function(e) {
        if (!e) {
            var e = window.event;
        }
        if (e.preventDefault && e.stopPropagation) {
            e.preventDefault();
            e.stopPropagation();
        }
        e.cancelBubble = true;
        nav_next();
    });
    
    event_add(prev, 'click', function(e) {
        if (!e) {
            var e = window.event;
        }
        if (e.preventDefault && e.stopPropagation) {
            e.preventDefault();
            e.stopPropagation();
        }
        e.cancelBubble = true;
        nav_prev();
    });
    
    event_add(prev, 'mouseover', function() {
        next.getElementsByTagName('span')[0].style.display = 'none';
        document.getElementById('prev_label').style.display = 'inline';
    });
    
    event_add(prev, 'mouseout', function() {
        next.getElementsByTagName('span')[0].style.display = 'inline';
        document.getElementById('prev_label').style.display = 'none';
    });
    
}

event_add(window, 'load', nav_setup);

function links_setup() {
    
    var links = document.getElementById('links');
    var overview = links.getElementsByTagName('div')[1]
                   .getElementsByTagName('a');
    for (var i = 0; i < overview.length; i++) {
        var link = overview[i];
        event_add(link, 'click', function(e) {
            if (!e) {
                var e = window.event;
            }
            
            if (e.target) {
                var target = e.target;
            } else if (e.srcElement) {
                var target = e.srcElement;
            }
            
            if (target.nodeType == 3) { // defeat Safari bug
                target = target.parentNode;
            }
            
            var letter = target.getAttribute('href').match(/#links_(.+)$/)[1];
            show_links(letter);
            
            if (e.preventDefault && e.stopPropagation) {
                e.preventDefault();
                e.stopPropagation();
            }
            e.cancelBubble = true;
        });
    }
    
    var sections = document.getElementById('sections');
    sections.getElementsByTagName('div')[0].style.marginLeft = 0;
    
    var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
                   'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
                   'y', 'z'];
    links_lookup['num'] = 0;
    var last_pos = 0;
    var sections_pos = find_pos(sections)[0];
    
    for (var i = 0; i < letters.length; i++) {
        var letter = letters[i];
        var link = document.getElementById('links_' + letter);
        if (link) {
            links_lookup[letter] = find_pos(link)[0] - sections_pos;
            last_pos = find_pos(link)[0] - sections_pos;
        } else {
            links_lookup[letter] = last_pos;
        }
    }
}

event_add(window, 'load', links_setup);

function nav_next() {
    var found = false;
    var scroll = page_scroll()[1];
    for (var id in posts) {
        if (found) {
            window.scrollTo(0, posts[id] - 32);
            break;
        }
        if (posts[id] > scroll) {
            found = true;
        }
    }
    if (!found) {
        window.scrollTo(0, posts[id] - 32);
    }
}

function nav_prev() {
    var prev_id = null;
    var scroll = page_scroll()[1];
    found = false;
    for (var id in posts) {
        if (posts[id] + 10 >= scroll && prev_id) {
            window.scrollTo(0, posts[prev_id] - 32);
            found = true;
            break;
        }
        prev_id = id;
    }
    if (!found) {
        window.scrollTo(0, posts[id] - 32);
    }
}

function show_links(letter) {
    var sections = document.getElementById('sections');
    var inner = sections.getElementsByTagName('div')[0];
    var end_value = links_lookup[letter];
    
    animate({
        target: inner,
        property: 'style.marginLeft',
        start_value: parseInt(inner.style.marginLeft),
        end_value: -end_value,
        postfix: 'px',
        duration: 1000,
        motion: tween.quint_out
    });
}

event_add(window, 'load', function() {
    var tags = document.getElementById('tags');
    var links = tags.getElementsByTagName('a');
    links[0].onclick = function() {
        links[0].className = 'active';
        links[1].className = '';
        document.getElementById('tags_freq').style.display = 'block';
        document.getElementById('tags_alpha').style.display = 'none';
        return false;
    }
    links[1].onclick = function() {
        links[0].className = '';
        links[1].className = 'active';
        document.getElementById('tags_freq').style.display = 'none';
        document.getElementById('tags_alpha').style.display = 'block';
        return false;
    }
});

function find_pos(target) {
    // Thanks to PPK & Quirksmode
	var x = 0;
    var y = 0;
	while (target.offsetParent) {
		x += target.offsetLeft;
        y += target.offsetTop;
		target = target.offsetParent;
    }
	return [x, y];
}

function event_add(target, type, func) {
    // Thanks to John Resig
    if (target.attachEvent) {
        target['e' + type + func] = func;
        target[type + func] = function() {
            target['e' + type + func](window.event);
        }
        target.attachEvent('on' + type, target[type + func]);
    } else {
        target.addEventListener(type, func, false);
    }
}


function page_scroll() {
    // Thanks to PPK & Quirksmode
    var x,y;
    if (self.pageYOffset) // all except Explorer
    {
        x = self.pageXOffset;
        y = self.pageYOffset;
    }
    else if (document.documentElement && document.documentElement.scrollTop)
        // Explorer 6 Strict
    {
        x = document.documentElement.scrollLeft;
        y = document.documentElement.scrollTop;
    }
    else if (document.body) // all other Explorers
    {
        x = document.body.scrollLeft;
        y = document.body.scrollTop;
    }
    return [x, y];
}
