hobo 0.6.2 → 0.6.3

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 (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
-