hobo 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/bin/hobo +21 -22
  2. data/hobo_files/plugin/CHANGES.txt +429 -4
  3. data/hobo_files/plugin/Rakefile +2 -2
  4. data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +6 -5
  5. data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +2 -2
  6. data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +20 -15
  7. data/hobo_files/plugin/generators/hobo_model/templates/model.rb +1 -0
  8. data/hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb +2 -0
  9. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_base.css +1 -2
  10. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.css +4 -3
  11. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +94 -12
  12. data/hobo_files/plugin/generators/hobo_rapid/templates/lowpro.js +5 -183
  13. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +1 -1
  14. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +23 -1
  15. data/hobo_files/plugin/generators/hobo_user_controller/templates/controller.rb +2 -0
  16. data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +3 -1
  17. data/hobo_files/plugin/init.rb +18 -7
  18. data/hobo_files/plugin/lib/active_record/has_many_association.rb +2 -2
  19. data/hobo_files/plugin/lib/extensions.rb +56 -12
  20. data/hobo_files/plugin/lib/hobo.rb +25 -88
  21. data/hobo_files/plugin/lib/hobo/composite_model.rb +2 -0
  22. data/hobo_files/plugin/lib/hobo/controller.rb +40 -20
  23. data/hobo_files/plugin/lib/hobo/dryml.rb +122 -106
  24. data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +2 -1
  25. data/hobo_files/plugin/lib/hobo/dryml/part_context.rb +3 -2
  26. data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +19 -3
  27. data/hobo_files/plugin/lib/hobo/dryml/template.rb +40 -25
  28. data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +41 -20
  29. data/hobo_files/plugin/lib/hobo/email_address.rb +4 -1
  30. data/hobo_files/plugin/lib/hobo/enum_string.rb +50 -0
  31. data/hobo_files/plugin/lib/hobo/field_declaration_dsl.rb +36 -0
  32. data/hobo_files/plugin/lib/hobo/field_spec.rb +4 -7
  33. data/hobo_files/plugin/lib/hobo/hobo_helper.rb +47 -44
  34. data/hobo_files/plugin/lib/hobo/html_string.rb +2 -0
  35. data/hobo_files/plugin/lib/hobo/markdown_string.rb +2 -0
  36. data/hobo_files/plugin/lib/hobo/model.rb +158 -89
  37. data/hobo_files/plugin/lib/hobo/model_controller.rb +422 -376
  38. data/hobo_files/plugin/lib/hobo/model_queries.rb +1 -1
  39. data/hobo_files/plugin/lib/hobo/model_router.rb +174 -0
  40. data/hobo_files/plugin/lib/hobo/password_string.rb +2 -0
  41. data/hobo_files/plugin/lib/hobo/percentage.rb +14 -0
  42. data/hobo_files/plugin/lib/hobo/plugins.rb +4 -4
  43. data/hobo_files/plugin/lib/hobo/rapid_helper.rb +10 -2
  44. data/hobo_files/plugin/lib/hobo/text.rb +3 -3
  45. data/hobo_files/plugin/lib/hobo/textile_string.rb +2 -0
  46. data/hobo_files/plugin/lib/hobo/undefined.rb +3 -2
  47. data/hobo_files/plugin/lib/hobo/{authenticated_user.rb → user.rb} +10 -3
  48. data/hobo_files/plugin/lib/hobo/user_controller.rb +27 -23
  49. data/hobo_files/plugin/tags/core.dryml +8 -2
  50. data/hobo_files/plugin/tags/rapid.dryml +52 -40
  51. data/hobo_files/plugin/tags/rapid_document_tags.dryml +15 -11
  52. data/hobo_files/plugin/tags/rapid_editing.dryml +41 -9
  53. data/hobo_files/plugin/tags/rapid_forms.dryml +136 -36
  54. data/hobo_files/plugin/tags/rapid_navigation.dryml +2 -2
  55. data/hobo_files/plugin/tags/rapid_pages.dryml +204 -221
  56. data/hobo_files/plugin/tags/rapid_plus.dryml +8 -6
  57. data/hobo_files/plugin/tags/rapid_support.dryml +2 -3
  58. metadata +44 -42
  59. data/hobo_files/plugin/lib/hobo/define_tags.rb +0 -56
  60. data/hobo_files/plugin/lib/hobo/http_parameters.rb +0 -225
@@ -25,8 +25,8 @@ PLUGIN_DIR = File.dirname(__FILE__)
25
25
 
26
26
  rspec_base = File.expand_path(PLUGIN_DIR + '/spec/rails_root/vendor/plugins/rspec/lib')
27
27
  $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
28
- require 'spec/rake/spectask'
29
- require 'spec/translator'
28
+ require '../hobo_spec/rails_root/vendor/plugins/rspec/lib/spec/rake/spectask'
29
+ require '../hobo_spec/rails_root/vendor/plugins/rspec/lib/spec/translator'
30
30
 
31
31
  spec_prereq = :noop # File.exist?(File.join(PLUGIN_DIR, 'config', 'database.yml')) ? "db:test:prepare" : :noop
32
32
  task :noop do
@@ -1,9 +1,7 @@
1
1
  <Page title="<%= app_name %>">
2
2
 
3
- <main>
4
- <header>
5
- <h1 class="front_page_title"><%= app_name %></h1>
6
- </header>
3
+ <content_header>
4
+ <h1 class="front_page_title"><%= app_name %></h1>
7
5
  <panel>
8
6
  <div style="margin-left: 40px; ">
9
7
  <h3>Congratulations! Your Hobo Rails App is up and running</h3>
@@ -12,7 +10,10 @@
12
10
  </ul>
13
11
  </div>
14
12
  </panel>
13
+ </content_header>
15
14
 
15
+
16
+ <content_body>
16
17
  <repeat with="&Hobo.models">
17
18
  <panel>
18
19
  <header><h2><%%= this.name.titlecase.pluralize %></h2></header>
@@ -32,6 +33,6 @@
32
33
  </section>
33
34
  </panel>
34
35
  </repeat>
35
- </main>
36
+ </content_body>
36
37
 
37
38
  </Page>
@@ -1,7 +1,7 @@
1
1
  <Page title="Search">
2
2
  <body onload="Hobo.applyEvents(); Hobo.doSearch('search_field')"/>
3
3
 
4
- <main>
4
+ <content_body>
5
5
  <panel class="red" style="margin-top: 40px">
6
6
  <h2>Search</h2>
7
7
  <div class='search' style='margin:10px'>
@@ -14,6 +14,6 @@
14
14
  <h2>Results</h2>
15
15
  <section id="search_results">&nbsp;</section>
16
16
  </panel>
17
- </main>
17
+ </content_body>
18
18
 
19
19
  </Page>
@@ -15,16 +15,18 @@ class HoboMigrationGenerator < Rails::Generator::Base
15
15
  # Force load of hobo models
16
16
  Hobo.models
17
17
 
18
- ignore_tables = Hobo::Migrations.ignore_tables + Hobo::Migrations.ignore.every(:pluralize)
19
- ignore_models = (Hobo::Migrations.ignore + Hobo::Migrations.ignore_models).every(:underscore)
18
+ ignore_model_names = Hobo::Migrations.ignore.every(:underscore)
20
19
 
21
- db_tables = connection.tables - ignore_tables
20
+ all_models = ActiveRecord::Base.send(:subclasses).reject {|c| c.name.starts_with?("CGI::") }
21
+ models, ignore_models = all_models.partition do |m|
22
+ m.name.underscore.not_in?(ignore_model_names) && m < Hobo::Model
23
+ end
24
+ ignore_tables = ignore_models.every(:table_name) | Hobo::Migrations.ignore_tables
22
25
 
23
- models = ActiveRecord::Base.send(:subclasses).reject {|c| c.name.starts_with?("CGI::") }
24
- models = models.reject {|m| m.name.underscore.in?(ignore_models) }
25
- table_models = models.index_by {|m| m.table_name}
26
+ models_by_table_name = models.index_by {|m| m.table_name}
26
27
  model_table_names = models.every(:table_name)
27
-
28
+ db_tables = connection.tables - ignore_tables
29
+
28
30
  to_create = model_table_names - db_tables
29
31
  to_drop = db_tables - model_table_names - ['schema_info']
30
32
  to_change = db_tables & model_table_names
@@ -46,7 +48,7 @@ class HoboMigrationGenerator < Rails::Generator::Base
46
48
  end * "\n\n"
47
49
 
48
50
  creates = to_create.map do |t|
49
- create_table(table_models[t])
51
+ create_table(models_by_table_name[t])
50
52
  end * "\n\n"
51
53
  undo_creates = to_create.map do |t|
52
54
  "drop_table :#{t}"
@@ -55,27 +57,30 @@ class HoboMigrationGenerator < Rails::Generator::Base
55
57
  changes = []
56
58
  undo_changes = []
57
59
  to_change.each do |t|
58
- change, undo = change_table(table_models[t])
60
+ change, undo = change_table(models_by_table_name[t])
59
61
  changes << change
60
62
  undo_changes << undo
61
63
  end
62
64
 
63
65
  up = [renames, drops, creates, changes].flatten.select{|s|!s.blank?} * "\n\n"
64
66
  down = [undo_renames, undo_drops, undo_creates, undo_changes].flatten.select{|s|!s.blank?} * "\n\n"
65
-
67
+
68
+ if up.blank?
69
+ puts "Database and models match -- nothing to change"
70
+ return record {|m| }
71
+ end
72
+
66
73
  puts "\n---------- Up Migration ----------", up, "----------------------------------"
67
74
  puts "\n---------- Down Migration --------", down, "----------------------------------"
68
75
 
69
- return record {|m| } if up.blank?
70
-
71
76
  action = input("What now: [g]enerate migrations, generate and [m]igrate now or [c]ancel?", %w(g m c))
72
77
 
73
78
  if action == 'c'
74
79
  # record nothing to keep the generator happy
75
80
  record {|m| }
76
81
  else
77
- puts "\n(you can type spaces instead of '_' -- every little helps)"
78
- migration_name = input("Migration filename [#@migration_name]:").strip.gsub(' ', '_')
82
+ puts "\nMigration filename:", "(you can type spaces instead of '_' -- every little helps)"
83
+ migration_name = input("Filename [#@migration_name]:").strip.gsub(' ', '_')
79
84
  migration_name = @migration_name if migration_name.blank?
80
85
 
81
86
  at_exit { system "rake db:migrate" } if action == 'm'
@@ -189,7 +194,7 @@ class HoboMigrationGenerator < Rails::Generator::Base
189
194
  change_spec[:precision] = spec.precision if !spec.precision.nil?
190
195
  change_spec[:scale] = spec.scale if !spec.scale.nil?
191
196
  change_spec[:null] = false unless spec.null
192
- change_spec[:default] = spec.default if !spec.default.nil?
197
+ change_spec[:default] = spec.default
193
198
 
194
199
  changes << "change_column :#{table_name}, :#{c}, " +
195
200
  ([":#{spec.sql_type}"] + format_options(change_spec, spec.sql_type)).join(", ")
@@ -6,6 +6,7 @@ class <%= class_name %> < ActiveRecord::Base
6
6
  <% for attribute in attributes -%>
7
7
  <%= attribute.name %> :<%= attribute.type %>
8
8
  <% end -%>
9
+ timestamps
9
10
  end
10
11
 
11
12
 
@@ -2,4 +2,6 @@ class <%= class_name %>Controller < ApplicationController
2
2
 
3
3
  hobo_model_controller
4
4
 
5
+ auto_actions :all
6
+
5
7
  end
@@ -52,8 +52,7 @@ blockquote, q {
52
52
  quotes: "" "";
53
53
  }
54
54
 
55
- body,ul,ol,dl,h1,h2,h3,h4,h5,h6,td,th,
56
- caption,pre,p,blockquote,input,textarea {
55
+ body {
57
56
  font-family: "Lucida Grande", Helvetica, Arial, Verdana, sans-serif;
58
57
  font-size: 12px;
59
58
  }
@@ -73,9 +73,10 @@ textarea { height: 200px; }
73
73
  textarea.wide { width: 100%; }
74
74
  textarea.tall { height: 350px; }
75
75
 
76
+ .field_list input.percentage {width: 25px; display: inline; margin-right: 5px; padding: 1px 3px;}
76
77
 
77
78
  /* rails error message */
78
- .errorExplanation {
79
+ .error_messages {
79
80
  font-family: "Lucida Grande", arial, sans-serif;
80
81
  background: #9d0018;
81
82
  border: 1px solid #7a0013;
@@ -83,11 +84,11 @@ textarea.tall { height: 350px; }
83
84
  color: white;
84
85
  margin-bottom: 20px;
85
86
  }
86
- .errorExplanation h2 {
87
+ .error_messages h2 {
87
88
  text-transform: none;
88
89
  letter-spacing: normal;
89
90
  color: white;
90
91
  }
91
- .errorExplanation li {
92
+ .error_messages li {
92
93
  margin-left: 20px;
93
94
  }
@@ -1,4 +1,3 @@
1
-
2
1
  Object.extend = function(destination) {
3
2
  $A(arguments).slice(1).each(function (src) {
4
3
  for (var property in src) {
@@ -46,13 +45,18 @@ var Hobo = {
46
45
  var params = []
47
46
  var i = 0
48
47
  if (updates.length > 0) {
49
- updates.each(function(dom_id) {
50
- if (!hoboParts[dom_id]) { throw "Update of dom-id that is not a part: " + dom_id }
51
- params.push("render["+i+"][part_context]=" + encodeURIComponent(hoboParts[dom_id]))
52
- params.push("render["+i+"][id]=" + dom_id)
53
- i += 1
48
+ updates.each(function(id_or_el) {
49
+ var el = $(id_or_el)
50
+ if (el) { // ignore update of parts that do not exist
51
+ var dom_id
52
+ dom_id = el.id
53
+ if (!hoboParts[dom_id]) { throw "Update of dom-id that is not a part: " + dom_id }
54
+ params.push("render["+i+"][part_context]=" + encodeURIComponent(hoboParts[dom_id]))
55
+ params.push("render["+i+"][id]=" + dom_id)
56
+ i += 1
57
+ }
54
58
  })
55
- params.push("part_page=" + hoboPartPage)
59
+ params.push("page_path=" + hoboPagePath)
56
60
  }
57
61
 
58
62
  if (resultUpdates) {
@@ -299,7 +303,7 @@ var Hobo = {
299
303
 
300
304
  putUrl: function(el) {
301
305
  spec = Hobo.parseFieldId(el)
302
- return urlBase + "/" + controllerNames[spec.name] + "/" + spec.id + "?_method=PUT"
306
+ return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id + "?_method=PUT"
303
307
  },
304
308
 
305
309
 
@@ -314,13 +318,15 @@ var Hobo = {
314
318
  afterFinish: function (ef) { ef.element.remove() } });
315
319
  },
316
320
 
317
- removeButton: function(el, url, updates, fade) {
318
- if (fade == null) { fade = true; }
319
- if (confirm("Are you sure?")) {
321
+ removeButton: function(el, url, updates, options) {
322
+ if (options.fade == null) { options.fade = true; }
323
+ if (options.confirm == null) { options.fade = "Are you sure?"; }
324
+
325
+ if (options.confirm == false || confirm(options.confirm)) {
320
326
  objEl = Hobo.objectElementFor(el)
321
327
  Hobo.showSpinner('Removing');
322
328
  function complete() {
323
- if (fade) { Hobo.fadeObjectElement(el) }
329
+ if (options.fade) { Hobo.fadeObjectElement(el) }
324
330
  Hobo.hideSpinner()
325
331
  }
326
332
  if (updates && updates.length > 0) {
@@ -400,8 +406,26 @@ var Hobo = {
400
406
 
401
407
  backgroundColor: function(el) {
402
408
  return Hobo.rgbColorToHex(Hobo.getStyle(el, 'background-color'))
409
+ },
410
+
411
+ partFor: function(el) {
412
+ while (el) {
413
+ if (el.id && hoboParts[el.id]) { return el }
414
+ el = el.parentNode
415
+ }
416
+ return null
417
+ },
418
+
419
+ pluralise: function(s) {
420
+ return pluralisations[s] || s + "s"
421
+ },
422
+
423
+ addUrlParams: function(params) {
424
+ params = $H(window.location.search.toQueryParams()).merge(params)
425
+ return window.location.href.sub(/(\?.*|$)/, "?" + params.toQueryString())
403
426
  }
404
427
 
428
+
405
429
  }
406
430
 
407
431
  Element.findContaining = function(el, tag) {
@@ -430,6 +454,16 @@ Ajax.InPlaceEditor.prototype.enterEditMode = function(evt) {
430
454
  return false
431
455
  }
432
456
 
457
+ // Fix Safari in-place-editor bug
458
+ Ajax.InPlaceEditor.prototype.removeForm = function() {
459
+ if(this.form) {
460
+ if (this.form.parentNode) {
461
+ try { Element.remove(this.form); } catch (e) {}
462
+ }
463
+ this.form = null;
464
+ }
465
+ }
466
+
433
467
  // Silence errors from IE :-(
434
468
  Field.scrollFreeActivate = function(field) {
435
469
  setTimeout(function() {
@@ -438,3 +472,51 @@ Field.scrollFreeActivate = function(field) {
438
472
  } catch(e) {}
439
473
  }, 1);
440
474
  }
475
+
476
+
477
+ Element.Methods.$$ = function(e, css) {
478
+ return new Selector(css).findElements(e)
479
+ }
480
+
481
+ // --- has_many_through_input --- //
482
+
483
+ HasManyThroughInput = Behavior.create({
484
+
485
+ initialize : function() {
486
+ // onchange doesn't bubble in IE6 so...
487
+ Event.observe(this.element.down('select'), 'change', this.addOne.bind(this))
488
+ },
489
+
490
+ addOne : function() {
491
+ var select = this.element.down('select')
492
+ var selected = select.options[select.selectedIndex]
493
+ if (selected.style.display != "none" & selected.value != "") {
494
+ var newItem = strToDom(this.element.down('.item_proto').innerHTML)
495
+ this.element.down('.items').appendChild(newItem);
496
+ newItem.down('span').innerHTML = selected.innerHTML
497
+ newItem.down('input[type=hidden]').value = selected.innerHTML
498
+ selected.style.display = 'none'
499
+ select.value = ""
500
+ }
501
+ },
502
+
503
+ onclick : function(e) {
504
+ var el = Event.element(e);
505
+ Event.stop(e);
506
+ if (el.match(".remove_item")) { this.removeOne(el.parentNode) }
507
+ },
508
+
509
+ removeOne : function(el) {
510
+ new Effect.BlindUp(el,
511
+ { duration: 0.3,
512
+ afterFinish: function (ef) { ef.element.remove() } } )
513
+ var label = el.down('span').innerHTML
514
+ var option = $A(this.element.getElementsByTagName('option')).find(function(o) { return o.innerHTML == label })
515
+ option.style.display = 'block'
516
+ }
517
+
518
+ })
519
+
520
+ Event.addBehavior({
521
+ 'div.has_many_through.input' : HasManyThroughInput()
522
+ });
@@ -1,30 +1,11 @@
1
1
  LowPro = {};
2
- LowPro.Version = '0.4.1';
2
+ LowPro.Version = '0.5';
3
3
 
4
4
  if (!Element.addMethods)
5
5
  Element.addMethods = function(o) { Object.extend(Element.Methods, o) };
6
6
 
7
7
  // Simple utility methods for working with the DOM
8
8
  DOM = {
9
- insertAfter : function(element, node, otherNode) {
10
- element = $(element);
11
- if (otherNode.nextSibling)
12
- return element.insertBefore(node, otherNode.nextSibling);
13
- else
14
- return element.appendChild(node);
15
- },
16
- addBefore : function(element, node) {
17
- element = $(element);
18
- return element.parentNode.insertBefore(node, element);
19
- },
20
- addAfter : function(element, node) {
21
- element = $(element);
22
- return $(element.parentNode).insertAfter(node, element);
23
- },
24
- replaceElement : function(element, node) {
25
- $(element).parentNode.replaceChild(node, element);
26
- return node;
27
- },
28
9
  prependChild : function(element, node) {
29
10
  $(element).insertBefore(node, element.firstChild);
30
11
  },
@@ -42,24 +23,6 @@ Element.addMethods(DOM);
42
23
 
43
24
  // DOMBuilder for prototype
44
25
  DOM.Builder = {
45
- IE_TRANSLATIONS : {
46
- 'class' : 'className',
47
- 'for' : 'htmlFor'
48
- },
49
- cache: {},
50
- ieAttrSet : function(attrs, attr, el) {
51
- var trans;
52
- if (trans = this.IE_TRANSLATIONS[attr]) el[trans] = attrs[attr];
53
- else if (attr == 'style') el.style.cssText = attrs[attr];
54
- else if (attr.match(/^on/)) el[attr] = new Function(attrs[attr]);
55
- else el.setAttribute(attr, attrs[attr]);
56
- },
57
- getElement : function(tag) {
58
- var element = DOM.Builder.cache[tag];
59
- if (element == null)
60
- element = DOM.Builder.cache[tag] = document.createElement(tag);
61
- return element.cloneNode(false);
62
- },
63
26
  tagFunc : function(tag) {
64
27
  return function() {
65
28
  var attrs, children;
@@ -77,20 +40,7 @@ DOM.Builder = {
77
40
  },
78
41
  create : function(tag, attrs, children) {
79
42
  attrs = attrs || {}; children = children || []; tag = tag.toLowerCase();
80
- var isIE = navigator.userAgent.match(/MSIE/);
81
- var el = (isIE && attrs.name) ?
82
- document.createElement("<" + tag + " name=" + attrs.name + ">") :
83
- DOM.Builder.getElement(tag);
84
-
85
- for (var attr in attrs) {
86
- if (attrs[attr] === true) attrs[attr] = attr;
87
- if (typeof attrs[attr] != 'function') {
88
- if (isIE) this.ieAttrSet(attrs, attr, el);
89
- else el.setAttribute(attr, attrs[attr].toString());
90
- } else if (attr.match(/^on(.+)$/)) {
91
- Event.observe(el, RegExp.$1, attrs[attr]);
92
- };
93
- }
43
+ var el = new Element(tag, attrs);
94
44
 
95
45
  for (var i=0; i<children.length; i++) {
96
46
  if (typeof children[i] == 'string')
@@ -121,141 +71,16 @@ DOM.Builder.fromHTML = function(html) {
121
71
  return root.childNodes[0];
122
72
  };
123
73
 
124
- String.prototype.toElement = function() {
125
- return DOM.Builder.fromHTML(this);
126
- };
127
-
128
- (function() {
129
- var old$ = $;
130
- $ = function(element) {
131
- if (element && element.toElement && element.match(/^<(.+)>$/))
132
- return $(element.toElement());
133
- return old$.apply(this, arguments);
134
- }
135
- })();
136
-
137
74
 
138
75
 
139
- // Adapted from DOM Ready extension by Dan Webb
140
- // http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
141
- // which was based on work by Matthias Miller, Dean Edwards and John Resig
76
+ // Wraps the 1.6 contentloaded event for backwards compatibility
142
77
  //
143
78
  // Usage:
144
79
  //
145
80
  // Event.onReady(callbackFunction);
146
81
  Object.extend(Event, {
147
- _domReady : function() {
148
- if (arguments.callee.done) return;
149
- arguments.callee.done = true;
150
-
151
- if (Event._timer) clearInterval(Event._timer);
152
-
153
- Event._readyCallbacks.each(function(f) { f() });
154
- Event._readyCallbacks = null;
155
-
156
- },
157
82
  onReady : function(f) {
158
- if (!this._readyCallbacks) {
159
- var domReady = this._domReady;
160
-
161
- if (domReady.done) return f();
162
-
163
- if (document.addEventListener)
164
- document.addEventListener("DOMContentLoaded", domReady, false);
165
-
166
- /*@cc_on @*/
167
- /*@if (@_win32)
168
- var dummy = location.protocol == "https:" ? "https://javascript:void(0)" : "javascript:void(0)";
169
- document.write("<script id=__ie_onload defer src='" + dummy + "'><\/script>");
170
- document.getElementById("__ie_onload").onreadystatechange = function() {
171
- if (this.readyState == "complete") { domReady(); }
172
- };
173
- /*@end @*/
174
-
175
- if (/WebKit/i.test(navigator.userAgent)) {
176
- this._timer = setInterval(function() {
177
- if (/loaded|complete/.test(document.readyState)) domReady();
178
- }, 10);
179
- }
180
-
181
- Event.observe(window, 'load', domReady);
182
- Event._readyCallbacks = [];
183
- }
184
- Event._readyCallbacks.push(f);
185
- }
186
- });
187
-
188
- // Extend Element with observe and stopObserving.
189
- if (typeof Element.Methods.observe == 'undefined') Element.addMethods({
190
- observe : function(el, event, callback) {
191
- Event.observe(el, event, callback);
192
- },
193
- stopObserving : function(el, event, callback) {
194
- Event.stopObserving(el, event, callback);
195
- }
196
- });
197
-
198
- // Replace out existing event observe code with Dean Edwards' addEvent
199
- // http://dean.edwards.name/weblog/2005/10/add-event/
200
- Object.extend(Event, {
201
- _observeAndCache : function(el, type, func) {
202
- if (!func.$$guid) func.$$guid = Event._guid++;
203
- if (!el.events) el.events = {};
204
- var handlers = el.events[type];
205
- if (!handlers) {
206
- handlers = el.events[type] = {};
207
- if (el["on" + type]) {
208
- handlers[0] = el["on" + type];
209
- }
210
- }
211
- handlers[func.$$guid] = func;
212
- el["on" + type] = Event._handleEvent;
213
-
214
- if (!Event.observers) Event.observers = [];
215
- Event.observers.push([el, type, func, false]);
216
- },
217
- stopObserving : function(el, type, func) {
218
- el = $(el);
219
- if (el.events && el.events[type]) delete el.events[type][func.$$guid];
220
-
221
- for (var i = 0; i < Event.observers.length; i++) {
222
- if (Event.observers[i] &&
223
- Event.observers[i][0] == el &&
224
- Event.observers[i][1] == type &&
225
- Event.observers[i][2] == func) delete Event.observers[i];
226
- }
227
- },
228
- _handleEvent : function(e) {
229
- var returnValue = true;
230
- e = e || Event._fixEvent(window.event);
231
- var handlers = this.events[e.type], el = $(this);
232
- for (var i in handlers) {
233
- el.$$handleEvent = handlers[i];
234
- if (el.$$handleEvent(e) === false) returnValue = false;
235
- }
236
- if (returnValue == false) e.preventDefault();
237
- return returnValue;
238
- },
239
- _fixEvent : function(e) {
240
- e.preventDefault = Event._preventDefault;
241
- e.stopPropagation = Event._stopPropagation;
242
- return e;
243
- },
244
- _preventDefault : function() { this.returnValue = false },
245
- _stopPropagation : function() { this.cancelBubble = true },
246
- _guid : 1
247
- });
248
-
249
- // Allows you to trigger an event element.
250
- Object.extend(Event, {
251
- trigger : function(element, event, fakeEvent) {
252
- element = $(element);
253
- fakeEvent = fakeEvent || { type : event };
254
- if(element.events && element.events[event]) {
255
- $H(element.events[event]).each(function(cache) {
256
- cache[1].call(element, fakeEvent);
257
- });
258
- }
83
+ document.observe('contentloaded', f);
259
84
  }
260
85
  });
261
86
 
@@ -366,9 +191,7 @@ Behavior = {
366
191
  var behavior = function() {
367
192
  var behavior = arguments.callee;
368
193
  if (this == window || $H(this).values().include(behavior)) {
369
- var args = [];
370
- for (var i = 0; i < arguments.length; i++)
371
- args.push(arguments[i]);
194
+ var args = $A(arguments);
372
195
 
373
196
  return function() {
374
197
  var initArgs = [this].concat(args);
@@ -402,4 +225,3 @@ Behavior = {
402
225
  }
403
226
  };
404
227
 
405
-