lm.expander = function() {
    var complementary_arrow = function(arrow, show) {
        if(arrow == '+' || arrow == '-') {
            if(show) {
                return '-';
            } else {
                return '+';
            }
        } else {
            if(show) {
                return '[-]';
            } else {
                return '[+]';
            }
        }
    };

    var fill_content = function(content_div) {
        var fill_with_response = function(response) {
            content_div.html(response);
            lm.utils.flush(function() {
                content_div.show();
            });
        };
        return fill_with_response;
    };

    var expand = function(e) {
        var handle = jQuery(this);
        var arrow = handle.children('.expander-arrow').eq(0);
        arrow.html(complementary_arrow(arrow.html(), true));
        var content = handle.parent().children('.expander-content');
        if(content.length === 0) {
            content = handle.parent().parent().children('.expander-content');
        }
        if(content.css('display') == 'none') {
            if(content.html() === '') {
                var inputs = content.parent().children('input');
                if(inputs.length == 1) {
                    var url = inputs.eq(0).val();
                    jQuery.ajax({url: url, success: fill_content(content)});
                } else {
                    content.show();
                }
            } else {
                content.show();
            }
        } else {
            arrow.html(complementary_arrow(arrow.html(), false));
            content.hide();
        }
    };

    var generate_paper_replacer = function(paper) {
        var paper_replacer = function(response) {
            paper.html(response);
            lm.utils.flush(function() {
                paper.slideDown('slow');
            });
        };
        return paper_replacer;
    };

    var replace = function(e) {
        var input = jQuery(this);
        var paper = input.closest('.paper-container');
        lm.utils.assert(paper.length == 1, 'No paper found for collect button');
        var form = input.closest('form');
        lm.utils.assert(form.length == 1, 'No form found for collect button');
        var url = form.attr('action');
        lm.utils.assert(url !== '', 'Add paper submit URL is not blank');
        var data = form.formSerialize();
        lm.utils.assert(data !== '', 'Should save some data');
        var paper_replacer = generate_paper_replacer(paper);
        input.hide(1, function() {
            paper.slideUp('slow', function() {
                jQuery.ajax({url: url, 
                             method: 'POST',
                             data: data,
                             success: paper_replacer});
            });
        });
        return false;
    };

    return {
        expand: expand,
        replace: replace
    };
}();



jQuery(function() {
    jQuery('.expander-handle').live('click', lm.expander.expand);
    jQuery('.add-to-paper-collection').live('click', lm.expander.replace);
});

