require File.dirname(__FILE__) + '/tag_helper' module ActionView module Helpers # You must call <%= define_javascript_functions %> in your application before using these helpers. module JavascriptHelper # Returns a link that'll toggle the visibility of the DOM objects which ids are mentioned in +tags+. If they're visible, we hide them, # and vice versa. This is particularly useful for hiding and showing input and edit forms on in-page elements. # # Examples: # link_to_toggle_display "Toggle controls", "control_box" # link_to_toggle_display "Add note", %w( add_link add_form ) def link_to_toggle_display(name, tags, html_options = {}) html_options.symbolize_keys! toggle_functions = [ tags ].flatten.collect { |tag| "toggle_display_by_id('#{tag}'); " }.join content_tag( "a", name, html_options.merge(:href => "#", :onclick => "#{toggle_functions}#{html_options[:onclick]}; return false;") ) end # Returns a link that'll trigger a javascript +function+ using the onclick handler and return false after the fact. # # Examples: # link_to_function "Greeting", "alert('Hello world!')" # link_to_function(image_tag("delete"), "if confirm('Really?'){ do_delete(); }") def link_to_function(name, function, html_options = {}) content_tag( "a", name, html_options.symbolize_keys.merge(:href => "#", :onclick => "#{function}; return false;") ) end # Returns a link to a remote action defined by options[:url] (using the url_for format) that's called in the background # using XMLHttpRequest. The result of that request can then be inserted into a DOM object who's id can be specified # with options[:update]. Usually, the result would be a partial prepared by the controller with either render_partial # or render_partial_collection. # # Examples: # link_to_remote "Delete this post", :update => "posts", :url => { :action => "destroy", :id => post.id } # link_to_remote(image_tag("refresh"), :update => "emails", :url => { :action => "list_emails" }) def link_to_remote(name, options = {}) link_to_function(name, remote_function(options)) end def form_remote_tag(options = {}) options[:form] = true options[:html] ||= { } options[:html][:onsubmit] = "#{remote_function(options)}; return false;" tag("form", options[:html], true) end def define_javascript_functions <<-EOF EOF end private def remote_function(options) function = options[:update] ? "update_with_response('#{options[:update]}', '#{url_for(options[:url])}'#{', Form.serialize(this)' if options[:form]})" : "xml_request('#{url_for(options[:url])}'#{', Form.serialize(this)' if options[:form]})" function = "#{options[:before]};#{function}" if options[:before] function = "#{function};#{options[:after]}" if options[:after] return function end end end end