module MenuRenderer

def add_child_disabled?

def add_child_disabled?
  allowed_child_classes.size == 0
end

def add_child_link

def add_child_link
  view.link_to((view.image('plus') + ' Add Child'), view.new_admin_page_child_path(self, :page_class => default_child.name), :class => "action")
end

def add_child_link_with_menu

def add_child_link_with_menu
  add_child_link_with_menu_hook + add_child_menu
end

def add_child_link_with_menu_hook

def add_child_link_with_menu_hook
  view.link_to((view.image('plus') + ' Add Child'), "#allowed_children_#{id}", :class => "action dropdown")
end

def add_child_menu

def add_child_menu
  menu_list
end

def add_child_option

def add_child_option
  if add_child_disabled?
    disabled_add_child_link
  else
    if allowed_child_classes.size == 1
      add_child_link
    else
      add_child_link_with_menu
    end
  end
end

def additional_menu_features?

def additional_menu_features?
  @additional_menu_features ||= (menu_renderer_module_name != 'MenuRenderer' && Object.const_defined?(menu_renderer_module_name))
end

def allowed_child_classes

def allowed_child_classes
  (allowed_children_cache.to_s.split(',') - Array(excluded_class_names)).map do |name|
    begin
      name.constantize
    rescue LoadError, NameError => _
      nil
    end
  end.compact
end

def child_items

def child_items
  (allowed_child_classes - [self.class.default_child]).map do |child|
    menu_item(child)
  end
end

def clean_page_description(page_class)

def clean_page_description(page_class)
  page_class.description.to_s.strip.gsub(/\t/,'').gsub(/\s+/,' ')
end

def default_child_item

def default_child_item
  menu_item(default_child)
end

def disabled_add_child_link

def disabled_add_child_link
  view.content_tag :span, view.image('plus_disabled') + ' Add Child', :class => 'action disabled'
end

def exclude(*type_names)

def exclude(*type_names)
  @excluded_class_names ||= []
  @excluded_class_names.concat(type_names).uniq!
end

def excluded_class_names

def excluded_class_names
  MenuRenderer.instance_variable_get(:@excluded_class_names)
end

def link_text_for_child_class(given_class_name)

def link_text_for_child_class(given_class_name)
  translation_key = if given_class_name == 'Page' || given_class_name.blank?
    'normal_page'
  else
    given_class_name.sub('Page','').underscore
  end
  fallback = given_class_name == 'Page' ? 'Page' : given_class_name.sub('Page','').titleize
  I18n.t(translation_key, :default => fallback)
end

def menu_item(child_class)

def menu_item(child_class)
  view.content_tag(:li, menu_link(child_class))
end

def menu_items

def menu_items
  [default_child_item, separator_item] + child_items
end

def menu_link(child_class)

def menu_link(child_class)
  title = clean_page_description(child_class)
  path = view.new_admin_page_child_path(self, :page_class => child_class.name)
  text = link_text_for_child_class(child_class.name)
  view.link_to(text, path, :title => title)
end

def menu_list

def menu_list
  view.content_tag :ul, menu_items.join.html_safe, :class => 'menu', :id => "allowed_children_#{id}"
end

def menu_renderer_module_name

def menu_renderer_module_name
  simple_name = self.class_name.to_s.sub('Page','')
  "#{simple_name}MenuRenderer"
end

def menu_renderer_modules

def menu_renderer_modules
  [Object.const_get(menu_renderer_module_name)]
end

def remove_link

def remove_link
  view.link_to view.image('minus') + ' ' + I18n.t('remove'), view.remove_admin_page_url(self), :class => "action"
end

def remove_option

def remove_option
  remove_link
end

def separator_item

def separator_item
  view.content_tag :li, '', :class => 'separator'
end

def view

def view
  @view
end

def view=(val)

def view=(val)
  @view = val
end