(function($) {
  $.fn.menublocks = function(options){

    var settings = {
      menu_blocks: '.menu-block', // Selector for the menu blocks
      cached_menus: '#cached_menus', // Selector for what div should be used to hold cached menu blocks
      active_menu_item: 'active', // class name to use for active menu items
      menu_item_link: 'li.parent a', // Selector link that should trigger getting the next menu block
      menu_item_parent: 'li.parent' // Parent of the link, used to set the active class
    };

    return this.each(function(){
      if (options) {
        $.extend(settings, options);
      }

      var menu_block_container = $(this);

      function load_next_menu_block(data, i) {
        menu_block_container.find(settings.menu_blocks).eq(i+1).html(data);
        var next_index = parseInt(i+1);
        menu_block_container.find(settings.menu_blocks+":gt("+next_index+")").empty(); // empty all the rest after i
      }
      menu_block_container.delegate(settings.menu_item_link, 'click', function(e){
        var li_parent = $(this).parents(settings.menu_item_parent);
        li_parent.siblings().removeClass(settings.active_menu_item)
        li_parent.addClass(settings.active_menu_item);
        var link = $(this).attr('href');
        var re_linkid = new RegExp("#[0-9]+");
        link = re_linkid.exec(link)[0];
        var data = $(settings.cached_menus+" "+link);
        var i = menu_block_container.find(settings.menu_blocks).index($(this).parents(settings.menu_blocks));
        if (data.get().length) { // we have a cached version of this
          load_next_menu_block(data.html(), i);

        } else { 
          $.data(menu_block_container.get(0), 'menu_block_last_index', i); 
          $.ajax({
            cache:false,
            error:function(request, textStatus, error){
              var i = $.data(menu_block_container.get(0), 'menu_block_last_index'); 
              load_next_menu_block(textStatus, i); // show the error
            },
            success:function(data, textStatus){
              var i = $.data(menu_block_container.get(0), 'menu_block_last_index'); 
              // append retrieved html to cache_menus div and redirect all links
              // that linked to this data to this html div that was appended.
              $(settings.cached_menus).append(data);

              var re_div = new RegExp("id=\"[0-9]+\"");
              var re_id = new RegExp("\\d+");
              var div = re_div.exec(data)[0];
              var my_id = re_id.exec(div)[0];

              var data = $("#"+my_id); // TODO: put a namespace in front of my_id?
              var from_url = data.attr('from_url');
              $("a[href='"+from_url+"']").attr('href', "#"+my_id);
              load_next_menu_block(data.html(), i);
            },
            url:link
          });
        }
        e.preventDefault();
      });

    });

};

})(jQuery);

