compass-jquery-plugin 0.2.4.5 → 0.2.4.99

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.
Files changed (65) hide show
  1. data/README.textile +36 -4
  2. data/VERSION.yml +1 -1
  3. data/compass-jquery-plugin.gemspec +49 -3
  4. data/gem_tasks/calendar.rake +2 -2
  5. data/gem_tasks/dynatree.rake +2 -2
  6. data/gem_tasks/jqgrid.rake +2 -2
  7. data/gem_tasks/jqtouch.rake +114 -0
  8. data/gem_tasks/jrails.rake +20 -4
  9. data/gem_tasks/rubygems.rake +4 -1
  10. data/gem_tasks/secret_sauce.rake +2 -2
  11. data/lib/jquery/jqgrid/jqgrid.rb +435 -0
  12. data/lib/jquery/jqgrid/jqgrid2xml.rb +50 -0
  13. data/lib/jquery/jqgrid.rb +3 -419
  14. data/lib/jquery/jqtouch.rb +4 -0
  15. data/templates/dynatree/jquery.ui/dynatree.vista/folder.png +0 -0
  16. data/templates/dynatree/manifest.rb +0 -1
  17. data/templates/jqtouch/config/initializers/jqtouch.rb +3 -0
  18. data/templates/jqtouch/jqtouch/apple/backButton.png +0 -0
  19. data/templates/jqtouch/jqtouch/apple/blueButton.png +0 -0
  20. data/templates/jqtouch/jqtouch/apple/cancel.png +0 -0
  21. data/templates/jqtouch/jqtouch/apple/chevron.png +0 -0
  22. data/templates/jqtouch/jqtouch/apple/grayButton.png +0 -0
  23. data/templates/jqtouch/jqtouch/apple/listArrowSel.png +0 -0
  24. data/templates/jqtouch/jqtouch/apple/listGroup.png +0 -0
  25. data/templates/jqtouch/jqtouch/apple/loading.gif +0 -0
  26. data/templates/jqtouch/jqtouch/apple/on_off.png +0 -0
  27. data/templates/jqtouch/jqtouch/apple/pinstripes.png +0 -0
  28. data/templates/jqtouch/jqtouch/apple/selection.png +0 -0
  29. data/templates/jqtouch/jqtouch/apple/thumb.png +0 -0
  30. data/templates/jqtouch/jqtouch/apple/toggle.png +0 -0
  31. data/templates/jqtouch/jqtouch/apple/toggleOn.png +0 -0
  32. data/templates/jqtouch/jqtouch/apple/toolButton.png +0 -0
  33. data/templates/jqtouch/jqtouch/apple/toolbar.png +0 -0
  34. data/templates/jqtouch/jqtouch/apple/whiteButton.png +0 -0
  35. data/templates/jqtouch/jqtouch/apple.sass +651 -0
  36. data/templates/jqtouch/jqtouch/icons/iphone_16x16.png +0 -0
  37. data/templates/jqtouch/jqtouch/iphone-emulator.sass +17 -0
  38. data/templates/jqtouch/jqtouch/iphone_fullsize.png +0 -0
  39. data/templates/jqtouch/jqtouch/jqt/back_button.png +0 -0
  40. data/templates/jqtouch/jqtouch/jqt/back_button_clicked.png +0 -0
  41. data/templates/jqtouch/jqtouch/jqt/button.png +0 -0
  42. data/templates/jqtouch/jqtouch/jqt/button_clicked.png +0 -0
  43. data/templates/jqtouch/jqtouch/jqt/chevron.png +0 -0
  44. data/templates/jqtouch/jqtouch/jqt/chevron_circle.png +0 -0
  45. data/templates/jqtouch/jqtouch/jqt/grayButton.png +0 -0
  46. data/templates/jqtouch/jqtouch/jqt/loading.gif +0 -0
  47. data/templates/jqtouch/jqtouch/jqt/on_off.png +0 -0
  48. data/templates/jqtouch/jqtouch/jqt/rowhead.png +0 -0
  49. data/templates/jqtouch/jqtouch/jqt/toggle.png +0 -0
  50. data/templates/jqtouch/jqtouch/jqt/toggleOn.png +0 -0
  51. data/templates/jqtouch/jqtouch/jqt/toolbar.png +0 -0
  52. data/templates/jqtouch/jqtouch/jqt/whiteButton.png +0 -0
  53. data/templates/jqtouch/jqtouch/jqt.sass +580 -0
  54. data/templates/jqtouch/jqtouch/jqtouch.sass +75 -0
  55. data/templates/jqtouch/jquery.jqtouch.js +1007 -0
  56. data/templates/jqtouch/jquery.jqtouch.min.js +1 -0
  57. data/templates/jqtouch/manifest.rb +43 -0
  58. data/templates/jrails/config/initializers/jrails.rb +2 -0
  59. data/templates/jrails/jquery.compat-1.3.js +288 -0
  60. data/templates/jrails/jquery.compat-1.3.min.js +1 -0
  61. data/templates/jrails/jquery.js +4483 -2570
  62. data/templates/jrails/jquery.min.js +12 -8
  63. data/templates/jrails/manifest.rb +2 -0
  64. metadata +49 -3
  65. data/templates/dynatree/jquery.ui/dynatree.vista/folder_open.png +0 -0
@@ -0,0 +1,435 @@
1
+ module ActionView
2
+ module Helpers
3
+
4
+ def jqgrid_javascripts(locale)
5
+ js = capture { javascript_include_tag "i18n/jqgrid/locale-#{locale}.min" }
6
+ js << capture {javascript_tag "jQuery.jgrid.no_legacy_api = true;" }
7
+ js << capture { javascript_include_tag 'jquery.jqGrid.min' }
8
+ end
9
+
10
+ def jqgrid_from_xml(name, opts={})
11
+ @@grid_name = name.to_s
12
+ grid_data = YAML::load_file("#{RAILS_ROOT}/config/jquery/jqGrid/#{name}.yml")
13
+
14
+ before = grid_data[:before]
15
+ params = grid_data[:params]
16
+
17
+ def param_body(value)
18
+ value.scan(/^\((.+?)\)(.+)/).flatten
19
+ end
20
+
21
+ jquery_grid_code = <<-CODE
22
+ <script type="text/javascript">
23
+ <%= before %>_n_
24
+ jQuery(document).ready(function(){
25
+ jQuery("#<%= name %>").jqGrid({
26
+ <% params.each do |key,value| %>
27
+ <% if opts.keys.include?(key) %>
28
+ _ss_<%= key %>: <%= opts[key].to_json %>,
29
+ <% elsif (value.is_a? String) && (value[0..0] == "$") %>
30
+ _ss_<%= key %>: <%= "jQuery"+value[1,value.length] %>,
31
+ <% elsif (key.to_s[0..8] == 'function_') %>
32
+ <% js_params, body = param_body(value) %>
33
+ _ss_<%= key.to_s[9..-1] %>: function(<%= js_params %>) {
34
+ _ss__ss_<%= body %>
35
+ _ss_},
36
+ <% else %>
37
+ _ss_<%= key %>: <%= value.to_json %>,
38
+ <% end %>
39
+ <% end %>
40
+ <% opts.each do |key,value| %>
41
+ <% unless params.keys.include?(key) %>
42
+ _ss_<%= key %>: <%= value.to_json %>,
43
+ <% end %>
44
+ <% end %> });
45
+ });
46
+ </script>
47
+ CODE
48
+ ::ERB.new(jquery_grid_code, nil, '>').result(binding).gsub("_n_", "\n").
49
+ gsub(/[ \t]{2,}/,' ').
50
+ gsub(/,\s+\}\);/, "\n });").
51
+ gsub(/\n\s*\n/m, "\n").
52
+ gsub("_ss_", " ").
53
+ gsub("<grid_name>", @@grid_name)
54
+ end
55
+
56
+
57
+ def jqgrid(title, id, action, columns = {},
58
+ options = {}, edit_options = "", add_options = "", del_options = "", search_options = "",
59
+ custom1_button = nil, custom2_button = nil, custom3_button = nil, custom4_button = nil, custom5_button = nil )
60
+
61
+ # Default options
62
+ options =
63
+ {
64
+ :rows_per_page => '10',
65
+ :sort_column => '',
66
+ :sort_order => '',
67
+ :height => '150',
68
+ :gridview => 'false',
69
+ :error_handler => 'null',
70
+ :inline_edit_handler => 'null',
71
+ :add => 'false',
72
+ :delete => 'false',
73
+ :search => 'true',
74
+ :edit => 'false',
75
+ :inline_edit => 'false',
76
+ :autowidth => 'false',
77
+ :hidegrid => 'false',
78
+ :rownumbers => 'false'
79
+ }.merge(options)
80
+
81
+ # Stringify options values
82
+ options.inject({}) do |options, (key, value)|
83
+ options[key] = (key != :subgrid) ? value.to_s : value
84
+ options
85
+ end
86
+
87
+ options[:error_handler_return_value] = (options[:error_handler] == 'null') ? 'true;' : options[:error_handler]
88
+ edit_button = (options[:edit] == 'true' && options[:inline_edit] == 'false').to_s
89
+
90
+ # Generate columns data
91
+ col_names, col_model = gen_columns(columns)
92
+
93
+ # Enable multi-selection (checkboxes)
94
+ multiselect = "multiselect: false,"
95
+ if options[:multi_selection]
96
+ multiselect = "multiselect: true,"
97
+ multihandler = %Q/
98
+ jQuery("##{id}_select_button").click( function() {
99
+ var s; s = jQuery("##{id}").jqGrid('getGridParam', 'selarrrow');
100
+ #{options[:selection_handler]}(s);
101
+ return false;
102
+ });/
103
+ end
104
+
105
+ # Enable master-details
106
+ masterdetails = ""
107
+ if options[:master_details]
108
+ masterdetails = %Q/
109
+ onSelectRow: function(ids) {
110
+ if(ids == null) {
111
+ ids=0;
112
+ if(jQuery("##{id}_details").jqGrid('getGridParam', 'records') >0 )
113
+ {
114
+ jQuery("##{id}_details").jqGrid('setGridParam', {url:"#{options[:details_url]}?q=1&id="+ids,page:1})
115
+ jQuery("##{id}_details").jqGrid('setCaption', "#{options[:details_caption]}: "+ids)
116
+ jQuery("##{id}_details").trigger('reloadGrid');
117
+ }
118
+ }
119
+ else
120
+ {
121
+ jQuery("##{id}_details").jqGrid('setGridParam', {url:"#{options[:details_url]}?q=1&id="+ids,page:1})
122
+ jQuery("##{id}_details").jqGrid('setCaption', "#{options[:details_caption]} : "+ids)
123
+ jQuery("##{id}_details").trigger('reloadGrid');
124
+ }
125
+ },/
126
+ end
127
+
128
+ # Enable selection link, button
129
+ # The javascript function created by the user (options[:selection_handler]) will be called with the selected row id as a parameter
130
+ selection_link = ""
131
+ if options[:direct_selection].blank? && options[:selection_handler].present? && options[:multi_selection].blank?
132
+ selection_link = %Q/
133
+ jQuery("##{id}_select_button").click( function(){
134
+ var id = jQuery("##{id}").jqGrid('getGridParam', 'selrow');
135
+ if (id) {
136
+ #{options[:selection_handler]}(id);
137
+ } else {
138
+ alert("Please select a row");
139
+ }
140
+ return false;
141
+ });/
142
+ end
143
+
144
+ # Enable direct selection (when a row in the table is clicked)
145
+ # The javascript function created by the user (options[:selection_handler]) will be called with the selected row id as a parameter
146
+ direct_link = ""
147
+ if options[:direct_selection] && options[:selection_handler].present? && options[:multi_selection].blank?
148
+ direct_link = %Q/
149
+ onSelectRow: function(id){
150
+ if(id){
151
+ #{options[:selection_handler]}(id);
152
+ }
153
+ },/
154
+ end
155
+
156
+ # Enable grid_loaded callback
157
+ # When data are loaded into the grid, call the Javascript function options[:grid_loaded] (defined by the user)
158
+ grid_loaded = ""
159
+ if options[:grid_loaded].present?
160
+ grid_loaded = %Q/
161
+ loadComplete: function(){
162
+ #{options[:grid_loaded]}();
163
+ },
164
+ /
165
+ end
166
+
167
+ # Enable inline editing
168
+ # When a row is selected, all fields are transformed to input types
169
+ editable = ""
170
+ if options[:edit] && options[:inline_edit] == 'true'
171
+ editable = %Q/
172
+ onSelectRow: function(id){
173
+ if(id && id!==lastsel){
174
+ jQuery('##{id}').jqGrid('restoreRow', lastsel);
175
+ jQuery('##{id}').jqGrid('editRow', id, true, #{options[:inline_edit_handler]}, #{options[:error_handler]});
176
+ lastsel=id;
177
+ }
178
+ },/
179
+ end
180
+
181
+ # Enable subgrids
182
+ subgrid = ""
183
+ subgrid_enabled = "subGrid:false,"
184
+
185
+ if options[:subgrid].present?
186
+
187
+ subgrid_enabled = "subGrid:true,"
188
+
189
+ options[:subgrid] =
190
+ {
191
+ :rows_per_page => '10',
192
+ :sort_column => 'id',
193
+ :sort_order => 'asc',
194
+ :add => 'false',
195
+ :edit => 'false',
196
+ :delete => 'false',
197
+ :search => 'false'
198
+ }.merge(options[:subgrid])
199
+
200
+ # Stringify options values
201
+ options[:subgrid].inject({}) do |suboptions, (key, value)|
202
+ suboptions[key] = value.to_s
203
+ suboptions
204
+ end
205
+
206
+ subgrid_inline_edit = ""
207
+ if options[:subgrid][:inline_edit] == true
208
+ options[:subgrid][:edit] = 'false'
209
+ subgrid_inline_edit = %Q/
210
+ onSelectRow: function(id){
211
+ if(id && id!==lastsel){
212
+ jQuery('#'+subgrid_table_id).jqGrid('restoreRow', lastsel);
213
+ jQuery('#'+subgrid_table_id).jqGrid('editRow', id,true);
214
+ lastsel=id;
215
+ }
216
+ },
217
+ /
218
+ end
219
+
220
+ if options[:subgrid][:direct_selection] && options[:subgrid][:selection_handler].present?
221
+ subgrid_direct_link = %Q/
222
+ onSelectRow: function(id){
223
+ if(id){
224
+ #{options[:subgrid][:selection_handler]}(id);
225
+ }
226
+ },
227
+ /
228
+ end
229
+
230
+ sub_col_names, sub_col_model = gen_columns(options[:subgrid][:columns])
231
+
232
+ subgrid = %Q(
233
+ subGridRowExpanded: function(subgrid_id, row_id) {
234
+ var subgrid_table_id, pager_id;
235
+ subgrid_table_id = subgrid_id+"_t";
236
+ pager_id = "p_"+subgrid_table_id;
237
+ $("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
238
+ jQuery("#"+subgrid_table_id).jqGrid({
239
+ url:"#{options[:subgrid][:url]}?q=2&id="+row_id,
240
+ editurl:'#{options[:subgrid][:edit_url]}?parent_id='+row_id,
241
+ datatype: "json",
242
+ colNames: #{sub_col_names},
243
+ colModel: #{sub_col_model},
244
+ rowNum:#{options[:subgrid][:rows_per_page]},
245
+ pager: pager_id,
246
+ imgpath: '/images/jqgrid',
247
+ sortname: '#{options[:subgrid][:sort_column]}',
248
+ sortorder: '#{options[:subgrid][:sort_order]}',
249
+ viewrecords: true,
250
+ toolbar : [true,"top"],
251
+ #{subgrid_inline_edit}
252
+ #{subgrid_direct_link}
253
+ height: '100%'
254
+ });
255
+ jQuery("#"+subgrid_table_id).jqGrid('navGrid', "#"+pager_id,{edit:#{options[:subgrid][:edit]},add:#{options[:subgrid][:add]},del:#{options[:subgrid][:delete]},search:false})
256
+ jQuery("#"+subgrid_table_id).jqGrid('navButtonAdd', "#"+pager_id,{caption:"Search",title:"Toggle Search",buttonimg:'/images/jqgrid/search.png',
257
+ onClickButton:function(){
258
+ if(jQuery("#t_"+subgrid_table_id).css("display")=="none") {
259
+ jQuery("#t_"+subgrid_table_id).css("display","");
260
+ } else {
261
+ jQuery("#t_"+subgrid_table_id).css("display","none");
262
+ }
263
+ }
264
+ });
265
+ jQuery("#t_"+subgrid_table_id).height(25).hide().jqGrid('filterGrid', ""+subgrid_table_id,{gridModel:true,gridToolbar:true});
266
+ },
267
+ subGridRowColapsed: function(subgrid_id, row_id) {
268
+ },
269
+ )
270
+ end
271
+
272
+ # Generate required Javascript & html to create the jqgrid
273
+ %Q(
274
+ <script type="text/javascript">
275
+ var lastsel;
276
+ jQuery(document).ready(function(){
277
+ jQuery("##{id}").jqGrid({
278
+ url:'#{action}?q=1',
279
+ editurl:'#{options[:edit_url]}',
280
+ datatype: "json",
281
+ colNames:#{col_names},
282
+ colModel:#{col_model},
283
+ pager: '##{id}_pager',
284
+ rowNum:#{options[:rows_per_page]},
285
+ rowList:[10,25,50,100],
286
+ sortname: '#{options[:sort_column]}',
287
+ sortorder: '#{options[:sort_order]}',
288
+ viewrecords: true,
289
+ height: #{options[:height]},
290
+ toolbar : [true,"top"],
291
+ gridview: #{options[:gridview]},
292
+ hidegrid: #{options[:hidegrid]},
293
+ scrollrows: true,
294
+ rownumbers: #{options[:rownumbers]},
295
+ autowidth: #{options[:autowidth]},
296
+ #{multiselect}
297
+ #{masterdetails}
298
+ #{grid_loaded}
299
+ #{direct_link}
300
+ #{editable}
301
+ #{subgrid_enabled}
302
+ #{subgrid}
303
+ caption: "#{title}"
304
+ });
305
+ jQuery("##{id}").jqGrid('navGrid', '##{id}_pager',
306
+ {edit:#{edit_button},add:#{options[:add]},del:#{options[:delete]},search:#{options[:search]},refresh:true},
307
+ {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'edit');}},
308
+ {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'add');}},
309
+ {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'delete');}},
310
+ {#{search_options}}
311
+ );
312
+ #{multihandler}
313
+ #{selection_link}
314
+ });
315
+ </script>
316
+ )
317
+ end
318
+
319
+ private
320
+
321
+ def gen_columns(columns)
322
+ # Generate columns data
323
+ col_names = "[" # Labels
324
+ col_model = "[" # Options
325
+ columns.each do |c|
326
+ col_names << "'#{c[:label]}',"
327
+ col_model << "{name:'#{c[:field]}', index:'#{c[:field]}'#{get_attributes(c)}},"
328
+ end
329
+ col_names.chop! << "]"
330
+ col_model.chop! << "]"
331
+ [col_names, col_model]
332
+ end
333
+
334
+ # Generate a list of attributes for related column (align:'right', sortable:true, resizable:false, ...)
335
+ def get_attributes(column)
336
+ options = ","
337
+ column.except(:field, :label).each do |couple|
338
+ if couple[0] == :editoptions
339
+ options << "editoptions:#{get_sub_options(couple[1])},"
340
+ elsif couple[0] == :formoptions
341
+ options << "formoptions:#{get_sub_options(couple[1])},"
342
+ elsif couple[0] == :searchoptions
343
+ options << "searchoptions:#{get_sub_options(couple[1])},"
344
+ elsif couple[0] == :editrules
345
+ options << "editrules:#{get_sub_options(couple[1])},"
346
+ else
347
+ if couple[1].class == String
348
+ options << "#{couple[0]}:'#{couple[1]}',"
349
+ else
350
+ options << "#{couple[0]}:#{couple[1]},"
351
+ end
352
+ end
353
+ end
354
+ options.chop!
355
+ end
356
+
357
+ # Generate options for editable fields (value, data, width, maxvalue, cols, rows, ...)
358
+ def get_sub_options(editoptions)
359
+ options = "{"
360
+ editoptions.each do |couple|
361
+ if couple[0] == :value # :value => [[1, "Rails"], [2, "Ruby"], [3, "jQuery"]]
362
+ options << %Q/value:"/
363
+ couple[1].each do |v|
364
+ options << "#{v[0]}:#{v[1]};"
365
+ end
366
+ options.chop! << %Q/",/
367
+ elsif couple[0] == :data # :data => [Category.all, :id, :title])
368
+ options << %Q/value:"/
369
+ couple[1].first.each do |obj|
370
+ options << "%s:%s;" % [obj.send(couple[1].second), obj.send(couple[1].third)]
371
+ end
372
+ options.chop! << %Q/",/
373
+ else # :size => 30, :rows => 5, :maxlength => 20, ...
374
+ if couple[1].instance_of?(Fixnum) || couple[1] == 'true' || couple[1] == 'false' || couple[1] == true || couple[1] == false
375
+ options << %Q/#{couple[0]}:#{couple[1]},/
376
+ else
377
+ options << %Q/#{couple[0]}:"#{couple[1]}",/
378
+ end
379
+ end
380
+ end
381
+ options.chop! << "}"
382
+ end
383
+ end
384
+ end
385
+
386
+ module JqgridJson
387
+ include ActionView::Helpers::JavaScriptHelper
388
+
389
+ def to_jqgrid_json(attributes, current_page, per_page, total)
390
+ json = %Q({"page":"#{current_page}","total":#{total/per_page.to_i+1},"records":"#{total}")
391
+ if total > 0
392
+ json << %Q(,"rows":[)
393
+ each do |elem|
394
+ elem.id ||= index(elem)
395
+ json << %Q({"id":"#{elem.id}","cell":[)
396
+ couples = elem.attributes.symbolize_keys
397
+ attributes.each do |atr|
398
+ value = get_atr_value(elem, atr, couples)
399
+ value = escape_javascript(value) if value and value.is_a? String
400
+ json << %Q("#{value}",)
401
+ end
402
+ json.chop! << "]},"
403
+ end
404
+ json.chop! << "]}"
405
+ else
406
+ json << "}"
407
+ end
408
+ end
409
+
410
+ private
411
+
412
+ def get_atr_value(elem, atr, couples)
413
+ if atr.to_s.include?('.')
414
+ value = get_nested_atr_value(elem, atr.to_s.split('.').reverse)
415
+ else
416
+ value = couples[atr]
417
+ value = elem.send(atr.to_sym) if value.blank? && elem.respond_to?(atr) # Required for virtual attributes
418
+ end
419
+ value
420
+ end
421
+
422
+ def get_nested_atr_value(elem, hierarchy)
423
+ return nil if hierarchy.size == 0
424
+ atr = hierarchy.pop
425
+ raise ArgumentError, "#{atr} doesn't exist on #{elem.inspect}" unless elem.respond_to?(atr)
426
+ nested_elem = elem.send(atr)
427
+ return "" if nested_elem.nil?
428
+ value = get_nested_atr_value(nested_elem, hierarchy)
429
+ value.nil? ? nested_elem : value
430
+ end
431
+ end
432
+
433
+ class Array
434
+ include JqgridJson
435
+ end
@@ -0,0 +1,50 @@
1
+ module ActionView
2
+ module Helpers
3
+
4
+ def jqgrid_from_xml(name, opts={})
5
+ @@grid_name = name.to_s
6
+ grid_data = YAML::load_file("#{RAILS_ROOT}/config/jquery/jqGrid/#{name}.yml")
7
+
8
+ before = grid_data[:before]
9
+ params = grid_data[:params]
10
+
11
+ def param_body(value)
12
+ value.scan(/^\((.+?)\)(.+)/).flatten
13
+ end
14
+
15
+ jquery_grid_code = <<-CODE
16
+ <script type="text/javascript">
17
+ <%= before %>_n_
18
+ jQuery(document).ready(function(){
19
+ jQuery("#<%= name %>").jqGrid({
20
+ <% params.each do |key,value| %>
21
+ <% if opts.keys.include?(key) %>
22
+ _ss_<%= key %>: <%= opts[key].to_json %>,
23
+ <% elsif (value.is_a? String) && (value[0..0] == "$") %>
24
+ _ss_<%= key %>: <%= "jQuery"+value[1,value.length] %>,
25
+ <% elsif (key.to_s[0..8] == 'function_') %>
26
+ <% js_params, body = param_body(value) %>
27
+ _ss_<%= key.to_s[9..-1] %>: function(<%= js_params %>) {
28
+ _ss__ss_<%= body %>
29
+ _ss_},
30
+ <% else %>
31
+ _ss_<%= key %>: <%= value.to_json %>,
32
+ <% end %>
33
+ <% end %>
34
+ <% opts.each do |key,value| %>
35
+ <% unless params.keys.include?(key) %>
36
+ _ss_<%= key %>: <%= value.to_json %>,
37
+ <% end %>
38
+ <% end %> });
39
+ });
40
+ </script>
41
+ CODE
42
+ ::ERB.new(jquery_grid_code, nil, '>').result(binding).gsub("_n_", "\n").
43
+ gsub(/[ \t]{2,}/,' ').
44
+ gsub(/,\s+\}\);/, "\n });").
45
+ gsub(/\n\s*\n/m, "\n").
46
+ gsub("_ss_", " ").
47
+ gsub("<grid_name>", @@grid_name)
48
+ end
49
+ end
50
+ end