module Nitro
# A helper mixin for programmatically building XHTML
# blocks.
module XhtmlHelper
private
# Render select options. The parameter is a hash of options.
#
# [+labels+]
# The option labels.
#
# [+values+]
# The corresponding values.
#
# [+labels_values+]
# Use when labels == values.
#
# [+selected+]
# The value of the selected option.
#
# === Examples
#
# labels = ['Male', 'Female']
# o.select(:name => 'sex') {
# o.options(:labels => labels, :selected => 1)
# }
#
# or
#
# #{options :labels => labels, :values => [..], :selected => 1}
# #{build :options, :labels => labels, :values => [..], :selected => 1}
def options(options = {})
if labels = options[:labels] || options[:labels_values]
str = ''
values = options[:values] || options[:labels_values] || (0...labels.size).to_a
selected = (options[:selected] || -1).to_i
labels.each_with_index do |label, idx|
value = values[idx]
if options[:style]
style = if options[:style].is_a?(Array)
options[:style][idx]
else
options[:style]
end
style = %{ style="#{style}"}
end
if value == selected
str << %||
else
str << %||
end
end
return str
else
raise ArgumentError.new('No labels provided')
end
end
# Render a submit input.
def submit(options = nil)
str = ''
if options
opts = options.collect { |k, v| %[#{k}="#{v}"] }.join(' ')
str << %[]
else
str << %||
end
return str
end
# Render a date select. Override to customize this.
#
# === Example
#
# #{date_select date, :name => 'brithday'}
def date_select(date, options = {})
raise 'No name provided to date_select' unless name = options[:name]
date ||= Time.now
%{
}
end
# Render a time select. Override to customize this.
def time_select(time, options = {})
raise 'No name provided to time_select' unless name = options[:name]
time ||= Time.now
%{
}
end
# Render a datetime select. Override to customize this.
def datetime_select(time, options)
date_select(time, options) + ' at ' + time_select(time, options)
end
# gmosx: keep the leading / to be IE friendly.
def js_popup(options = {})
o = {
:width => 320,
:height => 240,
:title => 'Popup',
:resizable => false,
:scrollbars => false,
}.merge(options)
poptions = (o[:resizable] ? 'resizable=yes,' : 'resizable=no,')
poptions << (o[:scrollbars] ? 'scrollbars=yes' : 'scrollbars=no')
url = o[:url] || o[:uri]
%[javascript: var pwl = (screen.width - #{o[:width]}) / 2; var pwt = (screen.height - #{o[:height]}) / 2; window.open('#{url}', '#{o[:title]}', 'width=#{o[:width]},height=#{o[:height]},top='+pwt+',left='+pwl+', #{poptions}'); return false;"]
end
# === Example
#
# true}>Hello
def onclick_popup(options = {})
%|onclick="#{js_popup(options)}"|
end
# Emit a link that spawns a popup window.
#
# === Example
#
# 'Hello', :url => 'add-comment', :scrollbars => true}>Hello
def popup(options = {})
%|#{options[:text] || 'Popup'}|
end
end
end
# * George Moschovitis