
if (g_kb) {
    g_kb.add('j', function() { move_quote(1); });
    g_kb.add('k', function() { move_quote(-1); });
    g_kb.add('h', function() { move_page(-1); });
    g_kb.add('l', function() { move_page(1); });

    if (g_view == 'list') {
        g_kb.add('d', function() { shortcut_command('remove'); });
        g_kb.add('o', function() { shortcut_command('info'); });
    }

    if (g_view == 'list' || g_view == 'image') {
        g_kb.add('i', function() { shortcut_command('add'); });
    }
}

var g_disable_shortcut = false;
function disable_shortcut() {
    if (g_kb) {
        g_disable_shortcut = true;
        g_kb.remove('j');
        g_kb.remove('k');
        g_kb.remove('h');
        g_kb.remove('l');
    }
}

var g_scroll_map = [];
var g_quote_loaded = false;

function add_g_scroll_map(n) {
    var pos = Position.cumulativeOffset(n);
    g_scroll_map.push({id: n.id, y: pos[1] - 20});
}

function calc_scroll_map() {
    g_quote_loaded = false;
    g_scroll_map.clear();

    if ($('paging-prev')) {
        g_scroll_map.push({id: 'prev', y: 0});
    }
    else {
        g_scroll_map.push({id: null, y: 0});
    }

    var nodes = $$('#quotes div.quote');
    for (var i = 0; i < nodes.length; i++) {
        var n = nodes[i];
        if (n.id.match(/^quote/i)) {
            add_g_scroll_map(n);
        }
    }

    g_scroll_map.sort(function(a, b) {
        return a.y - b.y;
    });

    var last = g_scroll_map.length - 1;

    if ($('paging-next')) {
        g_scroll_map.push({id: 'next', y: document.body.scrollHeight});
    }

    g_quote_loaded = true;

    /*
    if (document.referrer.match(location.pathname)) {
        var prev_offset = 0;
        if (document.referrer.match(/[&?]offset=(\d+)/)) {
            prev_offset = RegExp.$1;
        }

        if (prev_offset == g_offset_prev) {
            // move_quote(0, g_scroll_map[1]);
        }
        else if (prev_offset == g_offset_next) {
            move_quote(0, g_scroll_map[last]);
        }
    }
    */
}

var g_ff_ap_enabled = null;
function is_ff_ap_enabled() {
    if (g_ff_ap_enabled == null) {
        // Is this a proper way to detect the autopagerize script?
        g_ff_ap_enabled = $('autopagerize_icon') != null;
    }
    return g_ff_ap_enabled;
}

function move_quote(delta, p) {
    if (g_view == 'tile') {
        var p = where_am_i();
        if (0 < delta && p.is_at_last) {
            move_page_next();
        }
        else if (delta < 0 && p.is_at_top) {
            move_page_prev();
        }
        else {
            keyboard_scroll(0, 160 * delta);
        }

        return true;
    }

    if (!g_quote_loaded) {
        return false;
    }

    if (p == null) {
        p = get_current_quote(delta);
    }

    if (p) {
        if (p.id == 'prev' || p.id == 'next') {
            if (is_ff_ap_enabled()) {
                // If the autopagerize is enabled, then recalc a scroll map.
                if (p.id == 'next') {
                    calc_scroll_map();
                }
            }
            else {
                if (p.id == 'next') {
                    move_page_next();
                }
                else {
                    move_page_prev();
                }
            }

            return false;
        }

        var e = $(p.id + '-link') || $(p.id);
        var x = 0, y = 0;
        if (e) {
            e.focus();
            // x = 150;
            y = p.y;
        }
        else {
            y = p.y;
        }

        window.scrollTo(x, y);
    }

    return true;
}

var g_ma_auto_timer = false;
function move_quote_auto(delta) {
    if (!g_ma_auto_timer) {
        if (!move_quote(delta)) {
            return;
        }

        g_ma_auto_timer = setInterval(function() {
            if (!move_quote(delta)) {
                move_quote_auto_stop();
            }
        }, 200);
    }
}

Event.observe(document, 'mouseup', move_quote_auto_stop);
function move_quote_auto_stop() {
    clearInterval(g_ma_auto_timer);
    g_ma_auto_timer = false;
}

function move_quote_wheel(e) {
    if (g_disable_shortcut) {
        return;
    }

    if (e.preventDefault) {
        e.preventDefault();
    }
    e.returnValue = false;

    var n = - Event.wheel(e);
    move_quote(0 < n ? 1 : -1);
}

function get_current_quote(delta, y) {
    if (y == null) {
        y = getScrollTop();
    }

    var p = g_scroll_map.length - 1;

    for (var i = 0; i < g_scroll_map.length; i++) {
        if (y < g_scroll_map[i].y) {
            p = i - 1;
            break;
        }
    }

    if ((delta < 0 && g_scroll_map[p] && g_scroll_map[p].y == y) || 0 < delta) {
        p += delta;
    }

    if (getWindowBounds().h + getScrollTop() == document.body.scrollHeight && 0 < delta) {
        p++;
    }

    p = Math.max(p, 0);

    return g_scroll_map[p];
}

function where_am_i() {
    var st = document.body.scrollTop;
    var sl = document.body.scrollLeft;
    var sh = document.body.scrollHeight;
    var ch = 0;

    if (Prototype.Browser.WebKit) {
        ch = window.innerHeight;
    }
    else {
        ch = document.body.clientHeight;
    }

    return {
        'top': st,
        'left': sl,
        'height': sh,
        'clientHeight': ch,

        'is_at_top': st == 0 && sl == 0,
        'is_at_last': st + ch == sh && sl == 0 
    }
}

function move_page(delta) {
    /*
    if (delta < 0) {
        if ($('paging-prev')) {
            redirect($('paging-prev').href);
            disable_shortcut();
        }
    }
    else {
        if ($('paging-next')) {
            redirect($('paging-next').href);
            disable_shortcut();
        }
    }
    */

    var p = where_am_i();

    if (delta < 0) {
        if (p.is_at_top) {
            move_page_prev();
        }
        else {
            window.scroll(0, 0);
        }
    }
    else {
        if (p.is_at_last) {
            move_page_next();
        }
        else {
            window.scroll(0, p.height);
        }
    }
}

function move_page_next() {
    if ($('paging-next')) {
        redirect($('paging-next').href);
        disable_shortcut();
        return true;
    }
    else {
        return false;
    }
}

function move_page_prev() {
    if ($('paging-prev')) {
        redirect($('paging-prev').href);
        disable_shortcut();
        return true;
    }
    else {
        return false;
    }
}

function remove_quote_toggle(id) {
    var r1 = $('quote-' + id + '-remove1')
    var r2 = $('quote-' + id + '-remove2')
    if (r1.style.display == '') {
        r1.hide();
        r2.show();
    }
    else {
        r1.show();
        r2.hide();
    }
}

function shortcut_command(type) {
    if (!g_quote_loaded) {
        return;
    }

    var p = null;
    if (g_view == 'image') {
        var nodes = $$('#quotes blockquote.quote');
        if (0 < nodes.length) {
            p = { 'id': nodes[0].id };
        }
    }
    else {
        var b = getWindowBounds();
        var y = b.y + (b.h / 2);
        p = get_current_quote(0, y);
    }

    if (p && p.id && p.id.match(/^quote/i)) {
        var e = $(p.id);
        if (e) {
            var a = $(p.id + '-' + type);
            if (a && a.onclick) {
                a.onclick();

                if (type == 'add') {
                    var t = setInterval(function () {
                        if (e.style.backgroundColor == '') {
                            e.style.backgroundColor = 'yellow';
                            setTimeout(function () {
                                e.style.backgroundColor = '';
                            }, 100);
                        }
                    }, 200);

                    setTimeout(function () {
                        clearInterval(t);
                        e.style.backgroundColor = '';
                    }, 1000);
                }
            }
            else if (a && a.href) {
                location.href = a.href;
            }
        }
    }
}

//

function init_quotes_page() {
    if (Prototype.Browser.MobileSafari) {
        return;
    }

    $(document).observe('dom:loaded', function() {
        calc_scroll_map();
    });
}

function init_quote_page() {
    $(document).observe('dom:loaded', function() {
        g_quote_loaded = true;
    });
}


