/*
  The HTML markup for this view cannot be altered, so this code
  rewrites the dom in such a way that it can be properly styled.

  This version tries to encapsulate the widget completely so that
  it's more stable in the presence of other markup.
*/

(function($) {
    var altered_markup_class_prefix = "az-microblog-altered";
    
    function ElementInColumn($el, container_parent_levels) {
        this.$el = $el;
        this.container_parent_levels = container_parent_levels != null ? container_parent_levels : 0;
    }

    ElementInColumn.prototype.extract = function() {
        var $final_el = this.$el;
        for(var i=0; i < this.container_parent_levels; i++) {
            $final_el = $final_el.parent();
        }

        return $final_el;
    }

    ElementInColumn.prototype.mark_processed = function() {
        this.$el.addClass(altered_markup_class_prefix + '-columns');
    }
    
    ElementInColumn.prototype.should_process = function() {
        return !this.$el.hasClass(altered_markup_class_prefix + '-columns');
    }
    
    function alter_markup() {
        // Reorganize elements into columns
        var $root_el = $('<div class="microblog-container"></div>');
        $root_el.insertBefore($('.BlogPost').parent().parent());
        $root_el.append($('.BlogPost').parent().parent());
        
        var left_column_items = [
            new ElementInColumn($('.MicroBlogSearch')),
            new ElementInColumn($('.TagCloud'))
        ];
        var right_column_items = [
            new ElementInColumn($('.BlogPost'), 2),
            new ElementInColumn($('.OptOut'), 0),            
            new ElementInColumn($('.MicroBlogFullList'), 1),
        ];

        var $left_column = $('<div class="column left"></div>');
        for(var i=0; i < left_column_items.length; i++) {
            var element_in_column = left_column_items[i];
            if(element_in_column.should_process()) {
                $left_column.append(element_in_column.extract());
                element_in_column.mark_processed();
            }
        }
        
        var $right_column = $('<div class="column right"></div>');
        for(var i=0; i < right_column_items.length; i++) {
            var element_in_column = right_column_items[i];
            if(element_in_column.should_process()) {
                $right_column.append(element_in_column.extract());
                element_in_column.mark_processed();
            }
        }

        $root_el.append($left_column);
        $root_el.append($right_column);
        $root_el.append('<div class="clear"></div>');

        // Add 'block' containers for padding
        $('.BlogPost, .MicroBlogFullList, .ShowMore, .OptOut, .BlogComments, .TagCloud, .BlogReply').each(function() {
            var altered_markup_class = altered_markup_class_prefix + '-block';
            if($(this).hasClass(altered_markup_class)) {
                return true;
            }
                      
            var $block_wrapper = $('<div class="block"></div>');
            $block_wrapper.append($(this).contents());
            $(this).append($block_wrapper);
            $block_wrapper.after('<div class="clear"></div>');

            $(this).addClass(altered_markup_class);
        });
    }

    $(function() {
        if($('.MicroBlogFullList').length) {
            $('body').addClass('microblog-page');
        }
      
        alter_markup();
        setInterval(alter_markup, 500);
    });
})(jQuery);
