let hierarchical_menu_breadth_first
    ?(classe=[])
    ?id
    (((page, pages): ([< Eliom_services.get_service_kind],
                [< Eliom_services.registrable ],
                Eliom_duce.Blocks.a_content_elt_list) hierarchical_site) as the_menu)
    ?service
    ~sp =

  let rec breadth_first_fun pages level pos : {{ [Xhtmltypes_duce.ul*] }} =
    let rec one_item first last i s =
      let (classe, pos2, deplier) =
        match pos with
        | [] -> ([], [], false)
        | a::l when a = i -> ([current_class], l, true)
        | _::l -> ([], l, false)
      in
      let classe =
        if last then
          last_class::classe
        else classe
      in
      let classe =
        if first then
          first_class::classe
        else classe
      in
      (* let attclass =
        if classe = [] then
          []
        else [a_class classe]
      in *)

      match s with
      | (text, Site_tree (Default_page page, _))
      | (text, Site_tree (Main_page page, _)) ->
                                        {{ <li class={: attrib_list classe :}>[{: a page sp {: text :} () :}] }}
      | (text, Site_tree (Not_clickable, _)) ->
                                        {{ <li class={: attrib_list classe :}>{: text :} }}
      | (text, Disabled->
                                        {{ <li class={: attrib_list (disabled_class::classe) :}>{: text :} }}
    and one_menu first i = function
      | [] -> []
      | [a] -> [one_item first true i a]
      | a::l -> (one_item first false i a)::(one_menu false (i+1) l)
    and submenu i pos pages =
      match snd (List.nth pages i) with
      | Disabled
      | Site_tree (_, []) -> {{ [] }}
      | Site_tree (_, hsl) -> breadth_first_fun hsl (level+1) pos
    in
    let classe =
      (level_class^string_of_int level)::classe
    in
    let l =
      match pos with
      | [] -> {{ [] }}
      | a::l -> submenu a l pages
    in
    match one_menu true 0 pages with
    | [] -> l
    | li::lis ->
        {{ [ <ul ({{ ul_attribs (menu_class::classe) id level}})>[ {: li :} !{: lis :} ] !l ] }}

  in
  (breadth_first_fun pages 0 (find_in_hierarchy sp service the_menu))