module Merb::Helpers::Form def date_field(*args) if bound?(*args) current_form_context.bound_date_field(*args) else current_form_context.unbound_date_field(*args) end end def datetime_field(*args) if bound?(*args) current_form_context.bound_datetime_field(*args) else current_form_context.unbound_datetime_field(*args) end end end module Merb::Helpers::Form::Builder class Base def bound_date_field(method, attrs = {}) name = control_name(method) update_bound_controls(method, attrs, nil) unbound_date_field({:name => name}.merge(attrs)) end def bound_datetime_field(method, attrs = {}) name = control_name(method) update_bound_controls(method, attrs, nil) unbound_datetime_field({:name => name}.merge(attrs)) end def unbound_datetime_field(attrs) if attrs[:name] =~ /\[(.*)\]/ date = @obj.send($1) end date = Date.new(Time.now.year) if date.nil? hour_attrs = attrs.merge( :class => "date hour", :selected => date.hour.to_s, :name => attrs[:name] + '[hour]', :id => attrs[:id] + '_hour', :collection => (0..24).map{|i|[i, i.to_s]}, :label => nil ) minute_attrs = attrs.merge( :class => "date minutes", :selected => date.min.to_s, :name => attrs[:name] + '[minute]', :id => attrs[:id] + '_minute', :collection => %w[00 05 10 15 20 25 30 35 40 45 50 55].map{|i|[i.to_i, i]}, :value_method => :first, :text_method => :last, :label => nil ) unbound_date_field(attrs) + ' ' + unbound_select(hour_attrs) + ':' + unbound_select(minute_attrs) end def unbound_date_field(attrs) if attrs[:name] =~ /\[(.*)\]/ date = @obj.send($1) end date = Date.new(Time.now.year) if date.nil? month_attrs = attrs.merge( :class => "date month", :selected => date.month.to_s, :name => attrs[:name] + '[month]', :id => attrs[:id] + '_month', :collection => (1..12).map{|i|[i, DateTime::MONTHNAMES[i]]} ) day_attrs = attrs.merge( :class => "date day", :selected => date.day.to_s, :name => attrs[:name] + '[day]', :id => attrs[:id] + '_day', :collection => (1..31).map{|i|i.to_s}, :label => nil ) year_attrs = attrs.merge( :class => "date year", :selected => date.year.to_s, :name => attrs[:name] + '[year]', :id => attrs[:id] + '_year', :collection => (Time.now.year..Time.now.year + 2).map{|i|i.to_s}, :label => nil ) unbound_select(month_attrs) + unbound_select(day_attrs) + unbound_select(year_attrs) end end end