talia_core 0.4.1 → 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.
Files changed (139) hide show
  1. data/VERSION.yml +4 -0
  2. data/config/database.yml +19 -0
  3. data/config/database.yml.example +35 -0
  4. data/config/rdfstore.yml +13 -0
  5. data/config/rdfstore.yml.example +13 -0
  6. data/config/rdfstore.yml.rdflite_example +16 -0
  7. data/config/rdfstore.yml.redland_example +46 -0
  8. data/config/talia_core.yml +14 -0
  9. data/config/talia_core.yml.example +42 -0
  10. data/generators/generator_helpers.rb +49 -0
  11. data/generators/talia_admin/USAGE +1 -0
  12. data/generators/talia_admin/talia_admin_generator.rb +19 -0
  13. data/generators/talia_admin/templates/controllers/admin/background_controller.rb +50 -0
  14. data/generators/talia_admin/templates/controllers/admin/custom_templates_controller.rb +25 -0
  15. data/generators/talia_admin/templates/controllers/admin/locales_controller.rb +15 -0
  16. data/generators/talia_admin/templates/controllers/admin/sources_controller.rb +71 -0
  17. data/generators/talia_admin/templates/controllers/admin/translations_controller.rb +61 -0
  18. data/generators/talia_admin/templates/controllers/admin/users_controller.rb +48 -0
  19. data/generators/talia_admin/templates/controllers/admin_controller.rb +7 -0
  20. data/generators/talia_admin/templates/helpers/admin/background_helper.rb +60 -0
  21. data/generators/talia_admin/templates/helpers/admin/custom_templates_helper.rb +5 -0
  22. data/generators/talia_admin/templates/helpers/admin/locales_helper.rb +2 -0
  23. data/generators/talia_admin/templates/helpers/admin/sources_helper.rb +65 -0
  24. data/generators/talia_admin/templates/helpers/admin/translations_helper.rb +51 -0
  25. data/generators/talia_admin/templates/helpers/admin/users_helper.rb +2 -0
  26. data/generators/talia_admin/templates/helpers/admin_helper.rb +11 -0
  27. data/generators/talia_admin/templates/public/images/backend/body_bg.gif +0 -0
  28. data/generators/talia_admin/templates/public/images/backend/footer_bg.gif +0 -0
  29. data/generators/talia_admin/templates/public/images/backend/header.jpg +0 -0
  30. data/generators/talia_admin/templates/public/images/backend/header_bg.gif +0 -0
  31. data/generators/talia_admin/templates/public/images/backend/menu.jpg +0 -0
  32. data/generators/talia_admin/templates/public/images/backend/menu_bg.gif +0 -0
  33. data/generators/talia_admin/templates/public/images/backend/opednid.gif +0 -0
  34. data/generators/talia_admin/templates/public/images/backend/page_bg.jpg +0 -0
  35. data/generators/talia_admin/templates/public/images/backend/triangolino.gif +0 -0
  36. data/generators/talia_admin/templates/public/images/backend/triangolino_full.gif +0 -0
  37. data/generators/talia_admin/templates/public/javascripts/backend.js +24 -0
  38. data/generators/talia_admin/templates/public/javascripts/lowpro.js +321 -0
  39. data/generators/talia_admin/templates/public/stylesheets/backend.css +466 -0
  40. data/generators/talia_admin/templates/test/fixtures/users.yml +32 -0
  41. data/generators/talia_admin/templates/test/functional/admin/custom_templates_controller_test.rb +8 -0
  42. data/generators/talia_admin/templates/test/functional/admin/locales_controller_test.rb +35 -0
  43. data/generators/talia_admin/templates/test/functional/admin/sources_controller_test.rb +109 -0
  44. data/generators/talia_admin/templates/test/functional/admin/translations_controller_test.rb +93 -0
  45. data/generators/talia_admin/templates/test/functional/admin/users_controller_test.rb +67 -0
  46. data/generators/talia_admin/templates/test/functional/admin_controller_test.rb +15 -0
  47. data/generators/talia_admin/templates/test/unit/user_test.rb +134 -0
  48. data/generators/talia_admin/templates/views/admin/background/_finished.html.erb +9 -0
  49. data/generators/talia_admin/templates/views/admin/background/_pending.html.erb +1 -0
  50. data/generators/talia_admin/templates/views/admin/background/_progress.html.erb +15 -0
  51. data/generators/talia_admin/templates/views/admin/background/_running.html.erb +11 -0
  52. data/generators/talia_admin/templates/views/admin/background/environment.html.erb +12 -0
  53. data/generators/talia_admin/templates/views/admin/background/show.html.erb +17 -0
  54. data/generators/talia_admin/templates/views/admin/background/stderr.html.erb +6 -0
  55. data/generators/talia_admin/templates/views/admin/background/stdin.html.erb +6 -0
  56. data/generators/talia_admin/templates/views/admin/background/stdout.html.erb +6 -0
  57. data/generators/talia_admin/templates/views/admin/custom_templates/_content_form_column.rhtml +2 -0
  58. data/generators/talia_admin/templates/views/admin/custom_templates/_template_type_form_column.rhtml +2 -0
  59. data/generators/talia_admin/templates/views/admin/index.html.erb +5 -0
  60. data/generators/talia_admin/templates/views/admin/locales/new.html.erb +9 -0
  61. data/generators/talia_admin/templates/views/admin/sources/_data.html.erb +6 -0
  62. data/generators/talia_admin/templates/views/admin/sources/_data_form.html.erb +15 -0
  63. data/generators/talia_admin/templates/views/admin/sources/_form.html.erb +7 -0
  64. data/generators/talia_admin/templates/views/admin/sources/_list.html.erb +3 -0
  65. data/generators/talia_admin/templates/views/admin/sources/_notice.html.erb +1 -0
  66. data/generators/talia_admin/templates/views/admin/sources/_predicate.html.erb +22 -0
  67. data/generators/talia_admin/templates/views/admin/sources/_predicates.html.erb +15 -0
  68. data/generators/talia_admin/templates/views/admin/sources/_sources.html.erb +17 -0
  69. data/generators/talia_admin/templates/views/admin/sources/_upload.html.erb +6 -0
  70. data/generators/talia_admin/templates/views/admin/sources/edit.html.erb +6 -0
  71. data/generators/talia_admin/templates/views/admin/sources/index.html.erb +5 -0
  72. data/generators/talia_admin/templates/views/admin/translations/_new_translation.html.erb +7 -0
  73. data/generators/talia_admin/templates/views/admin/translations/_translation.html.erb +10 -0
  74. data/generators/talia_admin/templates/views/admin/translations/edit.html.erb +16 -0
  75. data/generators/talia_admin/templates/views/admin/users/_form.html.erb +10 -0
  76. data/generators/talia_admin/templates/views/admin/users/_form_roles.html.erb +8 -0
  77. data/generators/talia_admin/templates/views/admin/users/edit.html.erb +12 -0
  78. data/generators/talia_admin/templates/views/admin/users/index.html.erb +22 -0
  79. data/generators/talia_admin/templates/views/admin/users/new.html.erb +5 -0
  80. data/generators/talia_admin/templates/views/admin/users/show.html.erb +6 -0
  81. data/generators/talia_admin/templates/views/layouts/admin.html.erb +56 -0
  82. data/generators/talia_base/USAGE +5 -0
  83. data/generators/talia_base/talia_base_generator.rb +62 -0
  84. data/generators/talia_base/templates/app/controllers/custom_templates_controller.rb +27 -0
  85. data/generators/talia_base/templates/app/controllers/ontologies_controller.rb +13 -0
  86. data/generators/talia_base/templates/app/controllers/sessions_controller.rb +90 -0
  87. data/generators/talia_base/templates/app/controllers/source_data/show.html.erb +2 -0
  88. data/generators/talia_base/templates/app/controllers/source_data_controller.rb +43 -0
  89. data/generators/talia_base/templates/app/controllers/sources_controller.rb +62 -0
  90. data/generators/talia_base/templates/app/controllers/types_controller.rb +23 -0
  91. data/generators/talia_base/templates/app/helpers/custom_templates_helper.rb +2 -0
  92. data/generators/talia_base/templates/app/helpers/ontologies_helper.rb +2 -0
  93. data/generators/talia_base/templates/app/helpers/sessions_helper.rb +2 -0
  94. data/generators/talia_base/templates/app/helpers/source_data/show.html.erb +2 -0
  95. data/generators/talia_base/templates/app/helpers/source_data_helper.rb +2 -0
  96. data/generators/talia_base/templates/app/helpers/sources_helper.rb +39 -0
  97. data/generators/talia_base/templates/app/helpers/types_helper.rb +2 -0
  98. data/generators/talia_base/templates/app/views/ontologies/index.builder +10 -0
  99. data/generators/talia_base/templates/app/views/ontologies/show.builder +7 -0
  100. data/generators/talia_base/templates/app/views/sessions/new.html.erb +33 -0
  101. data/generators/talia_base/templates/app/views/source_data/show.html.erb +2 -0
  102. data/generators/talia_base/templates/app/views/sources/_form.html.erb +15 -0
  103. data/generators/talia_base/templates/app/views/sources/edit.html.erb +9 -0
  104. data/generators/talia_base/templates/app/views/sources/index.html.erb +2 -0
  105. data/generators/talia_base/templates/app/views/sources/new.html.erb +8 -0
  106. data/generators/talia_base/templates/app/views/sources/show.html.erb +19 -0
  107. data/generators/talia_base/templates/app/views/types/index.html.erb +4 -0
  108. data/generators/talia_base/templates/app/views/types/show.html.erb +3 -0
  109. data/generators/talia_base/templates/config/routes.rb +83 -0
  110. data/generators/talia_base/templates/config/talia_initializer.rb +8 -0
  111. data/generators/talia_base/templates/migrations/bj_migration.rb +10 -0
  112. data/generators/talia_base/templates/migrations/constraint_migration.rb +24 -0
  113. data/generators/talia_base/templates/migrations/create_active_sources.rb +15 -0
  114. data/generators/talia_base/templates/migrations/create_custom_templates.rb +17 -0
  115. data/generators/talia_base/templates/migrations/create_data_records.rb +27 -0
  116. data/generators/talia_base/templates/migrations/create_open_id.rb +26 -0
  117. data/generators/talia_base/templates/migrations/create_progress_jobs.rb +18 -0
  118. data/generators/talia_base/templates/migrations/create_roles.rb +20 -0
  119. data/generators/talia_base/templates/migrations/create_semantic_properties.rb +14 -0
  120. data/generators/talia_base/templates/migrations/create_semantic_relations.rb +17 -0
  121. data/generators/talia_base/templates/migrations/create_sessions.rb +16 -0
  122. data/generators/talia_base/templates/migrations/create_users.rb +20 -0
  123. data/generators/talia_base/templates/migrations/create_workflows.rb +28 -0
  124. data/generators/talia_base/templates/migrations/populate_users.rb +11 -0
  125. data/generators/talia_base/templates/migrations/upgrade_relations.rb +12 -0
  126. data/generators/talia_base/templates/ontologies/hyper_ontology.owl +1462 -0
  127. data/generators/talia_base/templates/ontologies/hyper_ontology.pprj +9351 -0
  128. data/generators/talia_base/templates/ontologies/hyper_ontology.repository +6 -0
  129. data/generators/talia_base/templates/ontologies/scholar_0.1.owl +109 -0
  130. data/generators/talia_base/templates/script/configure_talia +292 -0
  131. data/generators/talia_base/templates/script/prepare_images +100 -0
  132. data/generators/talia_base/templates/talia.sh +51 -0
  133. data/generators/talia_base/templates/tasks/talia_core.rk +1 -0
  134. data/lib/loader_helper.rb +9 -0
  135. data/lib/talia_core.rb +0 -2
  136. data/lib/talia_dependencies.rb +5 -0
  137. data/lib/talia_util/rake_tasks.rb +223 -0
  138. data/tasks/talia_core_tasks.rake +2 -0
  139. metadata +138 -13
@@ -0,0 +1,65 @@
1
+ module Admin::SourcesHelper
2
+ def add_another_predicate(namespace)
3
+ link_to_function image_tag('add.png', :size => '12x12', :alt => 'Add another predicate for '+namespace, :class => 'add') do |page|
4
+ page.insert_html :bottom, 'new_predicates_for_'+namespace.underscore, :partial => 'predicate', :object => TaliaCore::Source.new(''), :locals => {:namespace => namespace, :name => ''}
5
+ page[namespace.underscore].select('.predicate').last.visual_effect :highlight
6
+ page << "attachAjaxAutocompleterOnNewElement('"+h(namespace.underscore)+"');"
7
+ page << "showPredicatesOfDiv('"+h(namespace.underscore)+"');"
8
+ end
9
+ end
10
+
11
+ def show_upload_form
12
+ link_to_function "upload", :id => 'upload_link' do |page|
13
+ page.replace_html 'data_form', :partial => 'upload'
14
+ page['upload_link'].visual_effect :fade, :duration => 0.001
15
+ page['data_form'].visual_effect :appear, :duration => 0.4
16
+ end
17
+ end
18
+
19
+ def hide_upload_form
20
+ link_to_function "cancel" do |page|
21
+ page['data_form'].visual_effect :fade, :duration => 0.001
22
+ page['upload_link'].visual_effect :appear, :duration => 0.4
23
+ page.replace_html 'data_form', ''
24
+ end
25
+ end
26
+
27
+ def file_type(data_type)
28
+ data_type = case data_type
29
+ when Class
30
+ data_type.name
31
+ when nil
32
+ 'Record'
33
+ else
34
+ data_type
35
+ end.demodulize.gsub(/(Data|Simple|Media)/, '').gsub(/Record/, 'File').upcase
36
+
37
+ %(<span class="data #{h data_type.downcase}">#{h data_type}</span>)
38
+ end
39
+
40
+ # Use this method in your view to generate a return for the AJAX autocomplete requests.
41
+ #
42
+ # Example action:
43
+ #
44
+ # def auto_complete_for_item_title
45
+ # @items = Item.find(:all,
46
+ # :conditions => [ 'LOWER(description) LIKE ?',
47
+ # '%' + request.raw_post.downcase + '%' ])
48
+ # render :inline => "<%= auto_complete_result(@items, 'description') %>"
49
+ # end
50
+ #
51
+ # The auto_complete_result can of course also be called from a view belonging to the
52
+ # auto_complete action if you need to decorate it further.
53
+ def auto_complete_result(entries, field, phrase = nil)
54
+ return unless entries
55
+ items = entries.map { |entry| content_tag("li", phrase ? highlight(entry.send(field), phrase) : h(entry.send(field))) }
56
+ content_tag("ul", items.uniq)
57
+ end
58
+
59
+ def escaped_source_identifiers(source)
60
+ tokens = source.uri.to_s.split('/')
61
+ name = unescape(tokens.pop)
62
+ uri = tokens.join('/') + "/" + unescape_link(name)
63
+ [ uri, name ]
64
+ end
65
+ end
@@ -0,0 +1,51 @@
1
+ module Admin::TranslationsHelper
2
+ # Always pick fresh locales, instead of rely on application.rb
3
+ # This because application.rb is evaluated once in production mode.
4
+ # TODO: Rely on globalize2 when migrate to Rails 2.2.2
5
+ delegate :locales, :to => I18n
6
+
7
+ def add_translation
8
+ link_to_function "Add a translation" do |page|
9
+ page.insert_html :bottom, "translations", :partial => 'new_translation', :object => ViewTranslation.new
10
+ page['translations'].select('.translation').last.focus
11
+ end
12
+ end
13
+
14
+ def add_locale
15
+ link_to "Add locale", :controller => 'admin/locales', :action => 'new'
16
+ end
17
+
18
+ def languages_picker
19
+ content_tag(:div, :id => 'languages_picker') do
20
+ returning result = "Pick a language: " do
21
+ result << select_tag("languages", languages_options_tags(params[:id]), :onchange => change_language_function)
22
+ result << " | #{reference_translations_picker} | #{add_locale} | #{add_translation}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def reference_translations_picker
28
+ returning result = "Load translations: " do
29
+ result << select_tag("reference_languages", languages_options_tags(session[:reference_locale] || params[:id], false))
30
+ end
31
+ end
32
+
33
+ def languages_options_tags(locale_code, include_url = true)
34
+ locales.map do |language, locale|
35
+ language = language.to_s.titleize
36
+ selected = "selected" if locale_code.match %r{#{locale}}
37
+ value = include_url ? edit_admin_translation_url(locale) : locale
38
+ content_tag(:option, language, :value => value, :selected => selected)
39
+ end
40
+ end
41
+
42
+ def delete_admin_traslation_path(translation, params)
43
+ admin_translation_path(translation) + "?locale=" + params[:id] + "&page=" + (params[:page] || "1")
44
+ end
45
+
46
+ def autoload_reference_translations
47
+ content_for :javascript do
48
+ javascript_tag "var autoloadReferenceTranslations = #{@autoload};"
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::UsersHelper
2
+ end
@@ -0,0 +1,11 @@
1
+ module AdminHelper
2
+ def admin_toolbar
3
+ widget(:toolbar, :buttons => [
4
+ ["Home", {:controller => 'source', :action => 'show', :id => 'Lucca'}],
5
+ ["Admin", {:action => 'index'} ],
6
+ ["Sources", {:controller => 'admin/sources' }],
7
+ ["Users", { :controller => 'admin/users'} ],
8
+ ["Print Page", "javascript:print();"]
9
+ ] )
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ //= require <prototype>
2
+
3
+ // LOAD PAGE EVENT
4
+ Event.observe(window, 'load', function() {
5
+ setContentHeight();
6
+ });
7
+
8
+ // RESIZE PAGE EVENT
9
+ window.onresize = function () {
10
+ setContentHeight();
11
+ }
12
+
13
+ // Set the height of div content from back end
14
+ function setContentHeight() {
15
+ // SPROCKETIZED
16
+ if(contents = $('contenuti')) {
17
+ // Height of the whole window
18
+ var windowHeight = document.viewport.getDimensions().height;
19
+ // Top position of div content
20
+ var contentPosY = $('contenuti').cumulativeOffset().top;
21
+ contents.style.height = ( windowHeight - contentPosY ) + "px";
22
+ }
23
+ }
24
+
@@ -0,0 +1,321 @@
1
+ //= require <prototype>
2
+
3
+ LowPro = {};
4
+ LowPro.Version = '0.5';
5
+ LowPro.CompatibleWithPrototype = '1.6';
6
+
7
+ if (Prototype.Version.indexOf(LowPro.CompatibleWithPrototype) != 0 && console && console.warn)
8
+ console.warn("This version of Low Pro is tested with Prototype " + LowPro.CompatibleWithPrototype +
9
+ " it may not work as expected with this version (" + Prototype.Version + ")");
10
+
11
+ if (!Element.addMethods)
12
+ Element.addMethods = function(o) { Object.extend(Element.Methods, o) };
13
+
14
+ // Simple utility methods for working with the DOM
15
+ DOM = {};
16
+
17
+ // DOMBuilder for prototype
18
+ DOM.Builder = {
19
+ tagFunc : function(tag) {
20
+ return function() {
21
+ var attrs, children;
22
+ if (arguments.length>0) {
23
+ if (arguments[0].nodeName ||
24
+ typeof arguments[0] == "string")
25
+ children = arguments;
26
+ else {
27
+ attrs = arguments[0];
28
+ children = Array.prototype.slice.call(arguments, 1);
29
+ };
30
+ }
31
+ return DOM.Builder.create(tag, attrs, children);
32
+ };
33
+ },
34
+ create : function(tag, attrs, children) {
35
+ attrs = attrs || {}; children = children || []; tag = tag.toLowerCase();
36
+ var el = new Element(tag, attrs);
37
+
38
+ for (var i=0; i<children.length; i++) {
39
+ if (typeof children[i] == 'string')
40
+ children[i] = document.createTextNode(children[i]);
41
+ el.appendChild(children[i]);
42
+ }
43
+ return $(el);
44
+ }
45
+ };
46
+
47
+ // Automatically create node builders as $tagName.
48
+ (function() {
49
+ var els = ("p|div|span|strong|em|img|table|tr|td|th|thead|tbody|tfoot|pre|code|" +
50
+ "h1|h2|h3|h4|h5|h6|ul|ol|li|form|input|textarea|legend|fieldset|" +
51
+ "select|option|blockquote|cite|br|hr|dd|dl|dt|address|a|button|abbr|acronym|" +
52
+ "script|link|style|bdo|ins|del|object|param|col|colgroup|optgroup|caption|" +
53
+ "label|dfn|kbd|samp|var").split("|");
54
+ var el, i=0;
55
+ while (el = els[i++])
56
+ window['$' + el] = DOM.Builder.tagFunc(el);
57
+ })();
58
+
59
+ DOM.Builder.fromHTML = function(html) {
60
+ var root;
61
+ if (!(root = arguments.callee._root))
62
+ root = arguments.callee._root = document.createElement('div');
63
+ root.innerHTML = html;
64
+ return root.childNodes[0];
65
+ };
66
+
67
+
68
+
69
+ // Wraps the 1.6 contentloaded event for backwards compatibility
70
+ //
71
+ // Usage:
72
+ //
73
+ // Event.onReady(callbackFunction);
74
+ Object.extend(Event, {
75
+ onReady : function(f) {
76
+ if (document.body) f();
77
+ else document.observe('dom:loaded', f);
78
+ }
79
+ });
80
+
81
+ // Based on event:Selectors by Justin Palmer
82
+ // http://encytemedia.com/event-selectors/
83
+ //
84
+ // Usage:
85
+ //
86
+ // Event.addBehavior({
87
+ // "selector:event" : function(event) { /* event handler. this refers to the element. */ },
88
+ // "selector" : function() { /* runs function on dom ready. this refers to the element. */ }
89
+ // ...
90
+ // });
91
+ //
92
+ // Multiple calls will add to exisiting rules. Event.addBehavior.reassignAfterAjax and
93
+ // Event.addBehavior.autoTrigger can be adjusted to needs.
94
+ Event.addBehavior = function(rules) {
95
+ var ab = this.addBehavior;
96
+ Object.extend(ab.rules, rules);
97
+
98
+ if (!ab.responderApplied) {
99
+ Ajax.Responders.register({
100
+ onComplete : function() {
101
+ if (Event.addBehavior.reassignAfterAjax)
102
+ setTimeout(function() { ab.reload() }, 10);
103
+ }
104
+ });
105
+ ab.responderApplied = true;
106
+ }
107
+
108
+ if (ab.autoTrigger) {
109
+ this.onReady(ab.load.bind(ab, rules));
110
+ }
111
+
112
+ };
113
+
114
+ Object.extend(Event.addBehavior, {
115
+ rules : {}, cache : [],
116
+ reassignAfterAjax : false,
117
+ autoTrigger : true,
118
+
119
+ load : function(rules) {
120
+ for (var selector in rules) {
121
+ var observer = rules[selector];
122
+ var sels = selector.split(',');
123
+ sels.each(function(sel) {
124
+ var parts = sel.split(/:(?=[a-z]+$)/), css = parts[0], event = parts[1];
125
+ $$(css).each(function(element) {
126
+ if (event) {
127
+ observer = Event.addBehavior._wrapObserver(observer);
128
+ $(element).observe(event, observer);
129
+ Event.addBehavior.cache.push([element, event, observer]);
130
+ } else {
131
+ if (!element.$$assigned || !element.$$assigned.include(observer)) {
132
+ if (observer.attach) observer.attach(element);
133
+
134
+ else observer.call($(element));
135
+ element.$$assigned = element.$$assigned || [];
136
+ element.$$assigned.push(observer);
137
+ }
138
+ }
139
+ });
140
+ });
141
+ }
142
+ },
143
+
144
+ unload : function() {
145
+ this.cache.each(function(c) {
146
+ Event.stopObserving.apply(Event, c);
147
+ });
148
+ this.cache = [];
149
+ },
150
+
151
+ reload: function() {
152
+ var ab = Event.addBehavior;
153
+ ab.unload();
154
+ ab.load(ab.rules);
155
+ },
156
+
157
+ _wrapObserver: function(observer) {
158
+ return function(event) {
159
+ if (observer.call(this, event) === false) event.stop();
160
+ }
161
+ }
162
+
163
+ });
164
+
165
+ Event.observe(window, 'unload', Event.addBehavior.unload.bind(Event.addBehavior));
166
+
167
+ // A silly Prototype style shortcut for the reckless
168
+ $$$ = Event.addBehavior.bind(Event);
169
+
170
+ // Behaviors can be bound to elements to provide an object orientated way of controlling elements
171
+ // and their behavior. Use Behavior.create() to make a new behavior class then use attach() to
172
+ // glue it to an element. Each element then gets it's own instance of the behavior and any
173
+ // methods called onxxx are bound to the relevent event.
174
+ //
175
+ // Usage:
176
+ //
177
+ // var MyBehavior = Behavior.create({
178
+ // onmouseover : function() { this.element.addClassName('bong') }
179
+ // });
180
+ //
181
+ // Event.addBehavior({ 'a.rollover' : MyBehavior });
182
+ //
183
+ // If you need to pass additional values to initialize use:
184
+ //
185
+ // Event.addBehavior({ 'a.rollover' : MyBehavior(10, { thing : 15 }) })
186
+ //
187
+ // You can also use the attach() method. If you specify extra arguments to attach they get passed to initialize.
188
+ //
189
+ // MyBehavior.attach(el, values, to, init);
190
+ //
191
+ // Finally, the rawest method is using the new constructor normally:
192
+ // var draggable = new Draggable(element, init, vals);
193
+ //
194
+ // Each behaviour has a collection of all its instances in Behavior.instances
195
+ //
196
+ var Behavior = {
197
+ create: function() {
198
+ var parent = null, properties = $A(arguments);
199
+ if (Object.isFunction(properties[0]))
200
+ parent = properties.shift();
201
+
202
+ var behavior = function() {
203
+ var behavior = arguments.callee;
204
+ if (!this.initialize) {
205
+ var args = $A(arguments);
206
+
207
+ return function() {
208
+ var initArgs = [this].concat(args);
209
+ behavior.attach.apply(behavior, initArgs);
210
+ };
211
+ } else {
212
+ var args = (arguments.length == 2 && arguments[1] instanceof Array) ?
213
+ arguments[1] : Array.prototype.slice.call(arguments, 1);
214
+
215
+ this.element = $(arguments[0]);
216
+ this.initialize.apply(this, args);
217
+ behavior._bindEvents(this);
218
+ behavior.instances.push(this);
219
+ }
220
+ };
221
+
222
+ Object.extend(behavior, Class.Methods);
223
+ Object.extend(behavior, Behavior.Methods);
224
+ behavior.superclass = parent;
225
+ behavior.subclasses = [];
226
+ behavior.instances = [];
227
+
228
+ if (parent) {
229
+ var subclass = function() { };
230
+ subclass.prototype = parent.prototype;
231
+ behavior.prototype = new subclass;
232
+ parent.subclasses.push(behavior);
233
+ }
234
+
235
+ for (var i = 0; i < properties.length; i++)
236
+ behavior.addMethods(properties[i]);
237
+
238
+ if (!behavior.prototype.initialize)
239
+ behavior.prototype.initialize = Prototype.emptyFunction;
240
+
241
+ behavior.prototype.constructor = behavior;
242
+
243
+ return behavior;
244
+ },
245
+ Methods : {
246
+ attach : function(element) {
247
+ return new this(element, Array.prototype.slice.call(arguments, 1));
248
+ },
249
+ _bindEvents : function(bound) {
250
+ for (var member in bound)
251
+ if (member.match(/^on(.+)/) && typeof bound[member] == 'function')
252
+ bound.element.observe(RegExp.$1, Event.addBehavior._wrapObserver(bound[member].bindAsEventListener(bound)));
253
+ }
254
+ }
255
+ };
256
+
257
+ Remote = Behavior.create({
258
+ initialize: function(options) {
259
+ if (this.element.nodeName == 'FORM') new Remote.Form(this.element, options);
260
+ else new Remote.Link(this.element, options);
261
+ }
262
+ });
263
+
264
+ Remote.Base = {
265
+ initialize : function(options) {
266
+ this.options = Object.extend({
267
+ evaluateScripts : true
268
+ }, options || {});
269
+ },
270
+ _makeRequest : function(options) {
271
+ if (options.update) new Ajax.Updater(options.update, options.url, options);
272
+ else new Ajax.Request(options.url, options);
273
+ return false;
274
+ }
275
+ }
276
+
277
+ Remote.Link = Behavior.create(Remote.Base, {
278
+ onclick : function() {
279
+ var options = Object.extend({ url : this.element.href, method : 'get' }, this.options);
280
+ return this._makeRequest(options);
281
+ }
282
+ });
283
+
284
+
285
+ Remote.Form = Behavior.create(Remote.Base, {
286
+ onclick : function(e) {
287
+ var sourceElement = e.element();
288
+
289
+ if (['input', 'button'].include(sourceElement.nodeName.toLowerCase()) &&
290
+ sourceElement.type == 'submit')
291
+ this._submitButton = sourceElement;
292
+ },
293
+ onsubmit : function() {
294
+ var options = Object.extend({
295
+ url : this.element.action,
296
+ method : this.element.method || 'get',
297
+ parameters : this.element.serialize({ submit: this._submitButton.name })
298
+ }, this.options);
299
+ this._submitButton = null;
300
+ return this._makeRequest(options);
301
+ }
302
+ });
303
+
304
+ Observed = Behavior.create({
305
+ initialize : function(callback, options) {
306
+ this.callback = callback.bind(this);
307
+ this.options = options || {};
308
+ this.observer = (this.element.nodeName == 'FORM') ? this._observeForm() : this._observeField();
309
+ },
310
+ stop: function() {
311
+ this.observer.stop();
312
+ },
313
+ _observeForm: function() {
314
+ return (this.options.frequency) ? new Form.Observer(this.element, this.options.frequency, this.callback) :
315
+ new Form.EventObserver(this.element, this.callback);
316
+ },
317
+ _observeField: function() {
318
+ return (this.options.frequency) ? new Form.Element.Observer(this.element, this.options.frequency, this.callback) :
319
+ new Form.Element.EventObserver(this.element, this.callback);
320
+ }
321
+ });