## helper

module FormHelper

def render_tree_select(pages, name, control_id, control_name, current_selection, exclusion, blank_record)
ret = ''
ret += "<select name=\""+control_name+"\" id=\""+control_id+"\">"
ret += "<option value=\"0\">"+blank_record+"</option>" if not blank_record.empty?
for page in pages
ret += "<option value=\"" + page.id.to_s + "\" "
ret += "selected=\"selected\"" if current_selection == page.id
ret += ">"
ret += page[name] if page[name]
ret += "</option>"
ret += recurse_tree(page, 0, name, current_selection, exclusion) if page.children.size > 0
end
ret += "</select>"
end

def recurse_tree(page, depth, name, current_selection, exclusion)
depth = depth + 1
level = "- " * depth
ret = ''
if page.children.size > 0
page.children.each { |subpage|
if subpage.id != exclusion
if subpage.children.size > 0
ret += '<option value="'+subpage.id.to_s+'"'
ret += "selected=\"selected\"" if current_selection == subpage.id
ret += ">"
ret += h(level + subpage[name])
ret += recurse_tree(subpage, depth, name, current_selection, exclusion)
ret += '</option>'
else
ret += '<option value="'+subpage.id.to_s+'">'
ret += h(level + subpage[name])
ret += '</option>'
end
end
}
ret += ''
end
end
end

## view

<%= render_tree_select(Page.find(:all, :conditions => ["parent_id = ? and id != ?", 0, @page.id], :order => :position), :title, 'page_parent_id', 'page[parent_id]', @page.parent_id, @page.id, 'Main page (no parent)') %>