webpulser-jrails 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ (function($){$.ajaxSettings.accepts._default = "text/javascript, text/html, application/xml, text/xml, */*"})(jQuery);(function($){$.fn.reset=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset()}})};$.fn.enable=function(){return this.each(function(){this.disabled=false})};$.fn.disable=function(){return this.each(function(){this.disabled=true})}})(jQuery);(function($){$.extend({fieldEvent:function(el,obs){var field=el[0]||el,e="change";if(field.type=="radio"||field.type=="checkbox"){e="click"}else{if(obs&&field.type=="text"||field.type=="textarea"){e="keyup"}}return e}});$.fn.extend({delayedObserver:function(delay,callback){var el=$(this);if(typeof window.delayedObserverStack=="undefined"){window.delayedObserverStack=[]}if(typeof window.delayedObserverCallback=="undefined"){window.delayedObserverCallback=function(stackPos){observed=window.delayedObserverStack[stackPos];if(observed.timer){clearTimeout(observed.timer)}observed.timer=setTimeout(function(){observed.timer=null;observed.callback(observed.obj,observed.obj.formVal())},observed.delay*1000);observed.oldVal=observed.obj.formVal()}}window.delayedObserverStack.push({obj:el,timer:null,delay:delay,oldVal:el.formVal(),callback:callback});var stackPos=window.delayedObserverStack.length-1;if(el[0].tagName=="FORM"){$(":input",el).each(function(){var field=$(this);field.bind($.fieldEvent(field,delay),function(){observed=window.delayedObserverStack[stackPos];if(observed.obj.formVal()==observed.obj.oldVal){return}else{window.delayedObserverCallback(stackPos)}})})}else{el.bind($.fieldEvent(el,delay),function(){observed=window.delayedObserverStack[stackPos];if(observed.obj.formVal()==observed.obj.oldVal){return}else{window.delayedObserverCallback(stackPos)}})}},formVal:function(){var el=this[0];if(el.tagName=="FORM"){return this.serialize()}if(el.type=="checkbox"||self.type=="radio"){return this.filter("input:checked").val()||""}else{return this.val()}}})})(jQuery);(function($){$.fn.extend({visualEffect:function(o){e=o.replace(/\_(.)/g,function(m,l){return l.toUpperCase()});return eval("$(this)."+e+"()")},appear:function(speed,callback){return this.fadeIn(speed,callback)},blindDown:function(speed,callback){return this.show("blind",{direction:"vertical"},speed,callback)},blindUp:function(speed,callback){return this.hide("blind",{direction:"vertical"},speed,callback)},blindRight:function(speed,callback){return this.show("blind",{direction:"horizontal"},speed,callback)},blindLeft:function(speed,callback){this.hide("blind",{direction:"horizontal"},speed,callback);return this},dropOut:function(speed,callback){return this.hide("drop",{direction:"down"},speed,callback)},dropIn:function(speed,callback){return this.show("drop",{direction:"up"},speed,callback)},fade:function(speed,callback){return this.fadeOut(speed,callback)},fadeToggle:function(speed,callback){return this.animate({opacity:"toggle"},speed,callback)},fold:function(speed,callback){return this.hide("fold",{},speed,callback)},foldOut:function(speed,callback){return this.show("fold",{},speed,callback)},grow:function(speed,callback){return this.show("scale",{},speed,callback)},highlight:function(speed,callback){return this.show("highlight",{},speed,callback)},puff:function(speed,callback){return this.hide("puff",{},speed,callback)},pulsate:function(speed,callback){return this.show("pulsate",{},speed,callback)},shake:function(speed,callback){return this.show("shake",{},speed,callback)},shrink:function(speed,callback){return this.hide("scale",{},speed,callback)},squish:function(speed,callback){return this.hide("scale",{origin:["top","left"]},speed,callback)},switchOff:function(speed,callback){return this.hide("clip",{},speed,callback)},switchOn:function(speed,callback){return this.show("clip",{},speed,callback)}})})(jQuery);
@@ -0,0 +1,186 @@
1
+ /*
2
+ *
3
+ * jRails ajax extras
4
+ * version 0.1
5
+ * <aaron@ennerchi.com> | http://www.ennerchi.com
6
+ *
7
+ */
8
+
9
+ (function($) {
10
+ $.ajaxSettings.accepts._default = "text/javascript, text/html, application/xml, text/xml, */*";
11
+ })(jQuery);
12
+
13
+
14
+ /*
15
+ *
16
+ * jRails form extras
17
+ * <aaron@ennerchi.com> | http://www.ennerchi.com
18
+ *
19
+ */
20
+
21
+
22
+ (function($) {
23
+ // reset a form
24
+ $.fn.reset = function() {
25
+ return this.each(function() {
26
+ // guard against an input with the name of 'reset'
27
+ // note that IE reports the reset function as an 'object'
28
+ if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
29
+ this.reset();
30
+ });
31
+ };
32
+ // enable a form element
33
+ $.fn.enable = function() {
34
+ return this.each(function() {
35
+ this.disabled = false;
36
+ });
37
+ };
38
+ // disable a form element
39
+ $.fn.disable = function() {
40
+ return this.each(function() {
41
+ this.disabled = true;
42
+ });
43
+ };
44
+
45
+ })(jQuery);
46
+
47
+ /*
48
+ *
49
+ * jRails form observer plugin
50
+ * version 0.2
51
+ * <aaron@ennerchi.com> | http://www.ennerchi.com
52
+ *
53
+ */
54
+
55
+ (function($) {
56
+ $.extend({ // Translate field to event
57
+ fieldEvent: function(el, obs) {
58
+ var field = el[0] || el, e = 'change';
59
+ if (field.type == 'radio' || field.type == 'checkbox') e = 'click';
60
+ else if (obs && field.type == 'text' || field.type == 'textarea') e = 'keyup';
61
+ return e;
62
+ }
63
+ });
64
+ $.fn.extend({ // Delayed observer for fields and forms
65
+ delayedObserver: function(delay, callback){
66
+ var el = $(this);
67
+ if (typeof window.delayedObserverStack == 'undefined') window.delayedObserverStack = [];
68
+ if (typeof window.delayedObserverCallback == 'undefined') {
69
+ window.delayedObserverCallback = function(stackPos) {
70
+ var observed = window.delayedObserverStack[stackPos];
71
+ if (observed.timer) clearTimeout(observed.timer);
72
+ observed.timer = setTimeout(function(){
73
+ observed.timer = null;
74
+ observed.callback(observed.obj, observed.obj.formVal());
75
+ }, observed.delay * 1000);
76
+ observed.oldVal = observed.obj.formVal();
77
+ };
78
+ }
79
+ window.delayedObserverStack.push({
80
+ obj: el, timer: null, delay: delay,
81
+ oldVal: el.formVal(), callback: callback
82
+ });
83
+ var stackPos = window.delayedObserverStack.length-1;
84
+ if (el[0].tagName == 'FORM') {
85
+ $(':input', el).each(function(){
86
+ var field = $(this);
87
+ field.bind($.fieldEvent(field, delay), function(){
88
+ var observed = window.delayedObserverStack[stackPos];
89
+ if (observed.obj.formVal() == observed.oldVal) return;
90
+ else window.delayedObserverCallback(stackPos);
91
+ });
92
+ });
93
+ } else {
94
+ el.bind($.fieldEvent(el, delay), function(){
95
+ var observed = window.delayedObserverStack[stackPos];
96
+ if (observed.obj.formVal() == observed.oldVal) return;
97
+ else window.delayedObserverCallback(stackPos);
98
+ });
99
+ };
100
+ },
101
+ formVal: function() { // Gets form values
102
+ var el = this[0];
103
+ if(el.tagName == 'FORM') return this.serialize();
104
+ if(el.type == 'checkbox' || el.type == 'radio') return this.filter('input:checked').val() || '';
105
+ else return this.val();
106
+ }
107
+ });
108
+ })(jQuery);
109
+
110
+ /*
111
+ *
112
+ * jRails visual effects stubs
113
+ * version 0.2
114
+ * <aaron@ennerchi.com> | http://www.ennerchi.com
115
+ *
116
+ */
117
+
118
+ (function($) {
119
+ $.fn.extend({
120
+ visualEffect : function(o) {
121
+ e = o.replace(/\_(.)/g, function(m, l){return l.toUpperCase()});
122
+ return eval('$(this).'+e+'()');
123
+ },
124
+ appear : function(speed, callback) {
125
+ return this.fadeIn(speed, callback);
126
+ },
127
+ blindDown : function(speed, callback) {
128
+ return this.show('blind', { direction: 'vertical' }, speed, callback);
129
+ },
130
+ blindUp : function(speed, callback) {
131
+ return this.hide('blind', { direction: 'vertical' }, speed, callback);
132
+ },
133
+ blindRight : function(speed, callback) {
134
+ return this.show('blind', { direction: 'horizontal' }, speed, callback);
135
+ },
136
+ blindLeft : function(speed, callback) {
137
+ this.hide('blind', { direction: 'horizontal' }, speed, callback);
138
+ return this;
139
+ },
140
+ dropOut : function(speed, callback) {
141
+ return this.hide('drop', {direction: 'down' }, speed, callback);
142
+ },
143
+ dropIn : function(speed, callback) {
144
+ return this.show('drop', { direction: 'up' }, speed, callback);
145
+ },
146
+ fade : function(speed, callback) {
147
+ return this.fadeOut(speed, callback);
148
+ },
149
+ fadeToggle : function(speed, callback) {
150
+ return this.animate({opacity: 'toggle'}, speed, callback);
151
+ },
152
+ fold : function(speed, callback) {
153
+ return this.hide('fold', {}, speed, callback);
154
+ },
155
+ foldOut : function(speed, callback) {
156
+ return this.show('fold', {}, speed, callback);
157
+ },
158
+ grow : function(speed, callback) {
159
+ return this.show('scale', {}, speed, callback);
160
+ },
161
+ highlight : function(speed, callback) {
162
+ return this.show('highlight', {}, speed, callback);
163
+ },
164
+ puff : function(speed, callback) {
165
+ return this.hide('puff', {}, speed, callback);
166
+ },
167
+ pulsate : function(speed, callback) {
168
+ return this.show('pulsate', {}, speed, callback);
169
+ },
170
+ shake : function(speed, callback) {
171
+ return this.show('shake', {}, speed, callback);
172
+ },
173
+ shrink : function(speed, callback) {
174
+ return this.hide('scale', {}, speed, callback);
175
+ },
176
+ squish : function(speed, callback) {
177
+ return this.hide('scale', { origin: ['top', 'left'] }, speed, callback);
178
+ },
179
+ switchOff : function(speed, callback) {
180
+ return this.hide('clip', {}, speed, callback);
181
+ },
182
+ switchOn : function(speed, callback) {
183
+ return this.show('clip', {}, speed, callback);
184
+ }
185
+ });
186
+ })(jQuery);
data/lib/jrails.rb ADDED
@@ -0,0 +1,412 @@
1
+ module ActionView
2
+ module Helpers
3
+
4
+ module JavaScriptHelper
5
+
6
+ # This function can be used to render rjs inline
7
+ #
8
+ # <%= javascript_function do |page|
9
+ # page.replace_html :list, :partial => 'list', :object => @list
10
+ # end %>
11
+ #
12
+ def javascript_function(*args, &block)
13
+ html_options = args.extract_options!
14
+ function = args[0] || ''
15
+
16
+ html_options.symbolize_keys!
17
+ function = update_page(&block) if block_given?
18
+ javascript_tag(function)
19
+ end
20
+
21
+ def jquery_id(id)
22
+ id.to_s.count('#.*,>+~:[/ ') == 0 ? "##{id}" : id
23
+ end
24
+
25
+ def jquery_ids(ids)
26
+ Array(ids).map{|id| jquery_id(id)}.join(',')
27
+ end
28
+
29
+ end
30
+
31
+ module PrototypeHelper
32
+
33
+ unless const_defined? :JQUERY_VAR
34
+ JQUERY_VAR = '$'
35
+ end
36
+
37
+ unless const_defined? :JQCALLBACKS
38
+ JQCALLBACKS = Set.new([ :beforeSend, :complete, :error, :success ] + (100..599).to_a)
39
+ #instance_eval { remove_const :AJAX_OPTIONS }
40
+ remove_const(:AJAX_OPTIONS) if const_defined?(:AJAX_OPTIONS)
41
+ AJAX_OPTIONS = Set.new([ :before, :after, :condition, :url,
42
+ :asynchronous, :method, :insertion, :position,
43
+ :form, :with, :update, :script ]).merge(JQCALLBACKS)
44
+ end
45
+
46
+ def periodically_call_remote(options = {})
47
+ frequency = options[:frequency] || 10 # every ten seconds by default
48
+ code = "setInterval(function() {#{remote_function(options)}}, #{frequency} * 1000)"
49
+ javascript_tag(code)
50
+ end
51
+
52
+ def remote_function(options)
53
+ javascript_options = options_for_ajax(options)
54
+
55
+ update = ''
56
+ if options[:update] && options[:update].is_a?(Hash)
57
+ update = []
58
+ update << "success:'#{options[:update][:success]}'" if options[:update][:success]
59
+ update << "failure:'#{options[:update][:failure]}'" if options[:update][:failure]
60
+ update = '{' + update.join(',') + '}'
61
+ elsif options[:update]
62
+ update << "'#{options[:update]}'"
63
+ end
64
+
65
+ function = "#{JQUERY_VAR}.ajax(#{javascript_options})"
66
+
67
+ function = "#{options[:before]}; #{function}" if options[:before]
68
+ function = "#{function}; #{options[:after]}" if options[:after]
69
+ function = "if (#{options[:condition]}) { #{function}; }" if options[:condition]
70
+ function = "if (confirm('#{escape_javascript(options[:confirm])}')) { #{function}; }" if options[:confirm]
71
+ return function
72
+ end
73
+
74
+ class JavaScriptGenerator
75
+ module GeneratorMethods
76
+
77
+ def insert_html(position, id, *options_for_render)
78
+ insertion = position.to_s.downcase
79
+ insertion = 'append' if insertion == 'bottom'
80
+ insertion = 'prepend' if insertion == 'top'
81
+ call "#{JQUERY_VAR}(\"#{jquery_id(id)}\").#{insertion}", render(*options_for_render)
82
+ end
83
+
84
+ def replace_html(id, *options_for_render)
85
+ insert_html(:html, id, *options_for_render)
86
+ end
87
+
88
+ def replace(id, *options_for_render)
89
+ call "#{JQUERY_VAR}(\"#{jquery_id(id)}\").replaceWith", render(*options_for_render)
90
+ end
91
+
92
+ def remove(*ids)
93
+ call "#{JQUERY_VAR}(\"#{jquery_ids(ids)}\").remove"
94
+ end
95
+
96
+ def show(*ids)
97
+ call "#{JQUERY_VAR}(\"#{jquery_ids(ids)}\").show"
98
+ end
99
+
100
+ def hide(*ids)
101
+ call "#{JQUERY_VAR}(\"#{jquery_ids(ids)}\").hide"
102
+ end
103
+
104
+ def toggle(*ids)
105
+ call "#{JQUERY_VAR}(\"#{jquery_ids(ids)}\").toggle"
106
+ end
107
+
108
+ def jquery_id(id)
109
+ id.to_s.count('#.*,>+~:[/ ') == 0 ? "##{id}" : id
110
+ end
111
+
112
+ def jquery_ids(ids)
113
+ Array(ids).map{|id| jquery_id(id)}.join(',')
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ protected
120
+ def options_for_ajax(options)
121
+ js_options = build_callbacks(options)
122
+
123
+ url_options = options[:url]
124
+ url_options = url_options.merge(:escape => false) if url_options.is_a?(Hash)
125
+ js_options['url'] = "'#{url_for(url_options)}'"
126
+ js_options['async'] = false if options[:type] == :synchronous
127
+ js_options['type'] = options[:method] ? method_option_to_s(options[:method]) : ( options[:form] ? "'post'" : nil )
128
+ js_options['dataType'] = options[:datatype] ? "'#{options[:datatype]}'" : (options[:update] ? nil : "'script'")
129
+
130
+ if options[:form]
131
+ js_options['data'] = "#{JQUERY_VAR}.param(#{JQUERY_VAR}(this).serializeArray())"
132
+ elsif options[:submit]
133
+ js_options['data'] = "#{JQUERY_VAR}(\"##{options[:submit]} :input\").serialize()"
134
+ elsif options[:with]
135
+ js_options['data'] = options[:with].gsub("Form.serialize(this.form)","#{JQUERY_VAR}.param(#{JQUERY_VAR}(this.form).serializeArray())")
136
+ end
137
+
138
+ js_options['type'] ||= "'post'"
139
+ if options[:method]
140
+ if method_option_to_s(options[:method]) == "'put'" || method_option_to_s(options[:method]) == "'delete'"
141
+ js_options['type'] = "'post'"
142
+ if js_options['data']
143
+ js_options['data'] << " + '&"
144
+ else
145
+ js_options['data'] = "'"
146
+ end
147
+ js_options['data'] << "_method=#{options[:method]}'"
148
+ end
149
+ end
150
+
151
+ if respond_to?('protect_against_forgery?') && protect_against_forgery?
152
+ if js_options['data']
153
+ js_options['data'] << " + '&"
154
+ else
155
+ js_options['data'] = "'"
156
+ end
157
+ js_options['data'] << "#{request_forgery_protection_token}=' + encodeURIComponent('#{escape_javascript form_authenticity_token}')"
158
+ end
159
+ js_options['data'] = "''" if js_options['type'] == "'post'" && js_options['data'].nil?
160
+ options_for_javascript(js_options.reject {|key, value| value.nil?})
161
+ end
162
+
163
+ def build_update_for_success(html_id, insertion=nil)
164
+ insertion = build_insertion(insertion)
165
+ "#{JQUERY_VAR}('#{jquery_id(html_id)}').#{insertion}(request);"
166
+ end
167
+
168
+ def build_update_for_error(html_id, insertion=nil)
169
+ insertion = build_insertion(insertion)
170
+ "#{JQUERY_VAR}('#{jquery_id(html_id)}').#{insertion}(request.responseText);"
171
+ end
172
+
173
+ def build_insertion(insertion)
174
+ insertion = insertion ? insertion.to_s.downcase : 'html'
175
+ insertion = 'append' if insertion == 'bottom'
176
+ insertion = 'prepend' if insertion == 'top'
177
+ insertion
178
+ end
179
+
180
+ def build_observer(klass, name, options = {})
181
+ if options[:with] && (options[:with] !~ /[\{=(.]/)
182
+ options[:with] = "'#{options[:with]}=' + value"
183
+ else
184
+ options[:with] ||= 'value' unless options[:function]
185
+ end
186
+
187
+ callback = options[:function] || remote_function(options)
188
+ javascript = "#{JQUERY_VAR}('#{jquery_id(name)}').delayedObserver("
189
+ javascript << "#{options[:frequency] || 0}, "
190
+ javascript << "function(element, value) {"
191
+ javascript << "#{callback}}"
192
+ #javascript << ", '#{options[:on]}'" if options[:on]
193
+ javascript << ")"
194
+ javascript_tag(%(#{JQUERY_VAR}(function(){ #{javascript} });))
195
+ end
196
+
197
+ def build_callbacks(options)
198
+ callbacks = {}
199
+ options[:beforeSend] = '';
200
+ [:uninitialized,:loading,:loaded].each do |key|
201
+ options[:beforeSend] << (options[key].last == ';' ? options.delete(key) : options.delete(key) << ';') if options[key]
202
+ end
203
+ options.delete(:beforeSend) if options[:beforeSend].blank?
204
+ options[:error] = options.delete(:failure) if options[:failure]
205
+ if options[:update]
206
+ if options[:update].is_a?(Hash)
207
+ options[:update][:error] = options[:update].delete(:failure) if options[:update][:failure]
208
+ if options[:update][:success]
209
+ options[:success] = build_update_for_success(options[:update][:success], options[:position]) << (options[:success] ? options[:success] : '')
210
+ end
211
+ if options[:update][:error]
212
+ options[:error] = build_update_for_error(options[:update][:error], options[:position]) << (options[:error] ? options[:error] : '')
213
+ end
214
+ else
215
+ options[:success] = build_update_for_success(options[:update], options[:position]) << (options[:success] ? options[:success] : '')
216
+ end
217
+ end
218
+ options.each do |callback, code|
219
+ if JQCALLBACKS.include?(callback)
220
+ callbacks[callback] = "function(request){#{code}}"
221
+ end
222
+ end
223
+ callbacks
224
+ end
225
+
226
+ end
227
+
228
+ class JavaScriptElementProxy < JavaScriptProxy #:nodoc:
229
+
230
+ unless const_defined? :JQUERY_VAR
231
+ JQUERY_VAR = PrototypeHelper::JQUERY_VAR
232
+ end
233
+
234
+ def initialize(generator, id)
235
+ id = id.to_s.count('#.*,>+~:[/ ') == 0 ? "##{id}" : id
236
+ @id = id
237
+ super(generator, "#{JQUERY_VAR}(\"#{id}\")")
238
+ end
239
+
240
+ def replace_html(*options_for_render)
241
+ call 'html', @generator.send(:render, *options_for_render)
242
+ end
243
+
244
+ def replace(*options_for_render)
245
+ call 'replaceWith', @generator.send(:render, *options_for_render)
246
+ end
247
+
248
+ def reload(options_for_replace={})
249
+ replace(options_for_replace.merge({ :partial => @id.to_s.sub(/^#/,'') }))
250
+ end
251
+
252
+ def value()
253
+ call 'val()'
254
+ end
255
+
256
+ def value=(value)
257
+ call 'val', value
258
+ end
259
+
260
+ end
261
+
262
+ class JavaScriptElementCollectionProxy < JavaScriptCollectionProxy #:nodoc:\
263
+
264
+ unless const_defined? :JQUERY_VAR
265
+ JQUERY_VAR = PrototypeHelper::JQUERY_VAR
266
+ end
267
+
268
+ def initialize(generator, pattern)
269
+ super(generator, "#{JQUERY_VAR}(#{pattern.to_json})")
270
+ end
271
+ end
272
+
273
+ module ScriptaculousHelper
274
+
275
+ unless const_defined? :JQUERY_VAR
276
+ JQUERY_VAR = PrototypeHelper::JQUERY_VAR
277
+ end
278
+
279
+ unless const_defined? :SCRIPTACULOUS_EFFECTS
280
+ SCRIPTACULOUS_EFFECTS = {
281
+ :appear => {:method => 'fadeIn'},
282
+ :blind_down => {:method => 'blind', :mode => 'show', :options => {:direction => 'vertical'}},
283
+ :blind_up => {:method => 'blind', :mode => 'hide', :options => {:direction => 'vertical'}},
284
+ :blind_right => {:method => 'blind', :mode => 'show', :options => {:direction => 'horizontal'}},
285
+ :blind_left => {:method => 'blind', :mode => 'hide', :options => {:direction => 'horizontal'}},
286
+ :bounce_in => {:method => 'bounce', :mode => 'show', :options => {:direction => 'up'}},
287
+ :bounce_out => {:method => 'bounce', :mode => 'hide', :options => {:direction => 'up'}},
288
+ :drop_in => {:method => 'drop', :mode => 'show', :options => {:direction => 'up'}},
289
+ :drop_out => {:method => 'drop', :mode => 'hide', :options => {:direction => 'down'}},
290
+ :fade => {:method => 'fadeOut'},
291
+ :fold_in => {:method => 'fold', :mode => 'hide'},
292
+ :fold_out => {:method => 'fold', :mode => 'show'},
293
+ :grow => {:method => 'scale', :mode => 'show'},
294
+ :shrink => {:method => 'scale', :mode => 'hide'},
295
+ :slide_down => {:method => 'slide', :mode => 'show', :options => {:direction => 'up'}},
296
+ :slide_up => {:method => 'slide', :mode => 'hide', :options => {:direction => 'up'}},
297
+ :slide_right => {:method => 'slide', :mode => 'show', :options => {:direction => 'left'}},
298
+ :slide_left => {:method => 'slide', :mode => 'hide', :options => {:direction => 'left'}},
299
+ :squish => {:method => 'scale', :mode => 'hide', :options => {:origin => "['top','left']"}},
300
+ :switch_on => {:method => 'clip', :mode => 'show', :options => {:direction => 'vertical'}},
301
+ :switch_off => {:method => 'clip', :mode => 'hide', :options => {:direction => 'vertical'}},
302
+ :toggle_appear => {:method => 'fadeToggle'},
303
+ :toggle_slide => {:method => 'slide', :mode => 'toggle', :options => {:direction => 'up'}},
304
+ :toggle_blind => {:method => 'blind', :mode => 'toggle', :options => {:direction => 'vertical'}},
305
+ }
306
+ end
307
+
308
+ def visual_effect(name, element_id = false, js_options = {})
309
+ element = element_id ? element_id : "this"
310
+
311
+ if SCRIPTACULOUS_EFFECTS.has_key? name.to_sym
312
+ effect = SCRIPTACULOUS_EFFECTS[name.to_sym]
313
+ name = effect[:method]
314
+ mode = effect[:mode]
315
+ js_options = js_options.merge(effect[:options]) if effect[:options]
316
+ end
317
+
318
+ [:color, :direction].each do |option|
319
+ js_options[option] = "'#{js_options[option]}'" if js_options[option]
320
+ end
321
+
322
+ if js_options.has_key? :duration
323
+ speed = js_options.delete :duration
324
+ speed = (speed * 1000).to_i unless speed.nil?
325
+ else
326
+ speed = js_options.delete :speed
327
+ end
328
+
329
+ if ['fadeIn','fadeOut','fadeToggle'].include?(name)
330
+ javascript = "#{JQUERY_VAR}('#{jquery_id(element_id)}').#{name}("
331
+ javascript << "#{speed}" unless speed.nil?
332
+ javascript << ");"
333
+ else
334
+ javascript = "#{JQUERY_VAR}('#{jquery_id(element_id)}').#{mode || 'effect'}('#{name}'"
335
+ javascript << ",#{options_for_javascript(js_options)}" unless speed.nil? && js_options.empty?
336
+ javascript << ",#{speed}" unless speed.nil?
337
+ javascript << ");"
338
+ end
339
+ %(#{JQUERY_VAR}(function(){ #{javascript} });)
340
+ end
341
+
342
+ def sortable_element_js(element_id, options = {}) #:nodoc:
343
+ #convert similar attributes
344
+ options[:handle] = ".#{options[:handle]}" if options[:handle]
345
+ if options[:tag] || options[:only]
346
+ options[:items] = "> "
347
+ options[:items] << options.delete(:tag) if options[:tag]
348
+ options[:items] << ".#{options.delete(:only)}" if options[:only]
349
+ end
350
+ options[:connectWith] = options.delete(:containment).map {|x| "##{x}"} if options[:containment]
351
+ options[:containment] = options.delete(:container) if options[:container]
352
+ options[:dropOnEmpty] = false unless options[:dropOnEmpty]
353
+ options[:helper] = "'clone'" if options[:ghosting] == true
354
+ options[:axis] = case options.delete(:constraint)
355
+ when "vertical"
356
+ "y"
357
+ when "horizontal"
358
+ "x"
359
+ when false
360
+ nil
361
+ when nil
362
+ "y"
363
+ end
364
+ options.delete(:axis) if options[:axis].nil?
365
+ options.delete(:overlap)
366
+ options.delete(:ghosting)
367
+
368
+ if options[:onUpdate] || options[:url]
369
+ options[:with] ||= "#{JQUERY_VAR}(this).sortable('serialize',{key:'#{element_id}[]'})"
370
+ options[:onUpdate] ||= "function(){" + remote_function(options) + "}"
371
+ end
372
+
373
+ options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
374
+ options[:update] = options.delete(:onUpdate) if options[:onUpdate]
375
+
376
+ [:axis, :cancel, :containment, :cursor, :handle, :tolerance, :items, :placeholder].each do |option|
377
+ options[option] = "'#{options[option]}'" if options[option]
378
+ end
379
+
380
+ options[:connectWith] = array_or_string_for_javascript(options[:connectWith]) if options[:connectWith]
381
+
382
+ %(#{JQUERY_VAR}(function(){ #{JQUERY_VAR}('#{jquery_id(element_id)}').sortable(#{options_for_javascript(options)}); });)
383
+ end
384
+
385
+ def draggable_element_js(element_id, options = {})
386
+ %(#{JQUERY_VAR}(function(){ #{JQUERY_VAR}("#{jquery_id(element_id)}").draggable(#{options_for_javascript(options)}); });)
387
+ end
388
+
389
+ def drop_receiving_element_js(element_id, options = {})
390
+ #convert similar options
391
+ options[:hoverClass] = options.delete(:hoverclass) if options[:hoverclass]
392
+ options[:drop] = options.delete(:onDrop) if options[:onDrop]
393
+
394
+ if options[:drop] || options[:url]
395
+ options[:with] ||= "'id=' + encodeURIComponent(#{JQUERY_VAR}(ui.draggable).attr('id'))"
396
+ options[:drop] ||= "function(ev, ui){" + remote_function(options) + "}"
397
+ end
398
+
399
+ options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
400
+
401
+ options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
402
+ [:activeClass, :hoverClass, :tolerance].each do |option|
403
+ options[option] = "'#{options[option]}'" if options[option]
404
+ end
405
+
406
+ %(#{JQUERY_VAR}(function(){ #{JQUERY_VAR}('#{jquery_id(element_id)}').droppable(#{options_for_javascript(options)}); });)
407
+ end
408
+
409
+ end
410
+
411
+ end
412
+ end