jQuery(function() {
    (function($) {

        if ($('.relatedItems').length > 0) {
            if ($('body').data('user'))
                    renderWidget();
        }

        $('.relatedItems .itemList').children()
                .addClass('minified', 'fast')
                .bind('mouseover', function() {
                    $(this).stop(true,true).removeClass('minified', 'fast');
                })
                .bind('mouseout', function() {
                    $(this).stop(true,true).delay(1000).addClass('minified', 'fast');
                });

        function renderWidget() {
            $('.addRelatedItems').each(function() {
                var item1_type = $('.type',this).remove().text();
                var item1_id = $('.id',this).remove().text();

                $(this)
                    .append("<h3>Add a related item</h3>")
                    .append("<p>Type the item's title that you wish to associate</p>")
                    .append($("<form action='/item_links.json' method='post'>" +
                                "<input type='search' class='search' placeholder='title of item to link'>" +
                                "<input type='submit' value='Relate this item'/>" +
                                "<input type='hidden' name='item_link[item1_type]' class='item1_type'/>" +
                                "<input type='hidden' name='item_link[item1_id]' class='item1_id'/>" +
                                "<input type='hidden' name='item_link[item2_type]' class='item2_type'/>" +
                                "<input type='hidden' name='item_link[item2_id]' class='item2_id'/>" +
                                "<div class='selectedItem'></div>" +
                              "</form>").submit(submitForm)
                              .find('input.item1_type').val(item1_type).end()
                              .find('input.item1_id').val(item1_id).end())
                    .addClass("content_box")
                    .slideDown()
                    .find('input.search')
                        .autocomplete({ source:'/item_links.json',
                                        focus: focusItem,
                                        select: selectItem })
                        .data('autocomplete')._renderItem = renderItem;

                // Hide linked items that are the same as the item being viewed
                $('.' + item1_type.toLowerCase()).hide();

                // Add disassociate button (delete item_association)
                $('.relatedItems .itemList').children()
                    .append($("<a href='' class='disassociate'>Disassociate</a>"));
                $('.relatedItems .itemList a.disassociate').click(function() {
                        if (confirm("Disassociate this item?")) {
                            var $item_link = $(this).closest('.item_link');
                            var item_id = (/\d+/).exec($item_link.attr('id'));
                            $.post('/item_links/' + item_id + '.json',
                                { _method:'delete' },
                                function(data) {
                                    if (data.success)
                                        $item_link.slideUp('fast', function() { $item_link.remove() });
                                    else
                                        alert(data.errorMessage);
                                });
                        }
                        return false;
                    });

            });
        }

        function submitForm(event) {
            $.post('/item_links', { item_link:{
                item1_id:$('input.item1_id', this).val(),
                item1_type:$('input.item1_type', this).val(),
                item2_id:$('input.item2_id', this).val(),
                item2_type:$('input.item2_type', this).val()
            }}, function(data) {
                if (data.success) {
                    var $moveMe = $('div.selectedItem', event.currentTarget).find(':first');
                    $moveMe.slideUp('fast', function() {
                        var $appendTo = $moveMe.closest('.relatedItems').find('.itemList');
                        $moveMe.remove().appendTo($appendTo).slideDown();
                    })
                    $('input.search', event.currentTarget).val('');
                } else {
                    alert(data.errorMessage);
                }
            });
            return false;
        }

        function focusItem(event, ui) {
            $(event.target).val(ui.item.title);
            return false;
        }

        function selectItem(event, ui) {
            $(this)
                .siblings('input.item2_type').val('Upload');
                $(this).siblings('input.item2_id').val(ui.item.id);
                $(this).siblings('.selectedItem')
                    .append("<div class='loading'><img src='/images/spinner.gif'/></div>");
                    $(this).siblings('.selectedItem').load('/render_partial?' +
                        $.param({ type:ui.item.type, id:ui.item.id }));
            return false;
        }

        function renderItem(ul, item) {
            return $("<li></li>")
                    .data('item.autocomplete', item)
                    .append($("<a></a>").text(item.title))
                    .appendTo(ul);
        }

    })(jQuery);
});


