├── .gitignore
├── CHANGELOG
├── README.markdown
├── Rakefile
├── doc
└── rdoc
│ ├── Object.html
│ ├── RubyEvents.html
│ ├── RubyEvents
│ └── Events.html
│ ├── created.rid
│ ├── images
│ ├── brick.png
│ ├── brick_link.png
│ ├── bug.png
│ ├── bullet_black.png
│ ├── bullet_toggle_minus.png
│ ├── bullet_toggle_plus.png
│ ├── date.png
│ ├── find.png
│ ├── loadingAnimation.gif
│ ├── macFFBgHack.png
│ ├── package.png
│ ├── page_green.png
│ ├── page_white_text.png
│ ├── page_white_width.png
│ ├── plugin.png
│ ├── ruby.png
│ ├── tag_green.png
│ ├── wrench.png
│ ├── wrench_orange.png
│ └── zoom.png
│ ├── index.html
│ ├── js
│ ├── darkfish.js
│ ├── jquery.js
│ ├── quicksearch.js
│ └── thickbox-compressed.js
│ ├── lib
│ ├── ruby_events
│ │ ├── core_rb.html
│ │ └── object_patch_rb.html
│ └── ruby_events_rb.html
│ └── rdoc.css
├── lib
├── ruby_events.rb
└── ruby_events
│ ├── core.rb
│ └── object_patch.rb
├── pkg
├── ruby_events-0.0.1.gem
├── ruby_events-0.0.2.gem
├── ruby_events-0.0.3.gem
├── ruby_events-0.0.4.gem
├── ruby_events-0.0.5.gem
├── ruby_events-0.0.6.gem
├── ruby_events-0.0.7.gem
├── ruby_events-0.0.8.gem
├── ruby_events-1.0.0.gem
├── ruby_events-1.0.1.gem
├── ruby_events-1.1.0.beta.gem
├── ruby_events-1.1.0.beta2.gem
└── ruby_events-1.1.0.gem
├── ruby_events.gemspec
└── spec
└── ruby_events_spec.rb
/.gitignore:
--------------------------------------------------------------------------------
1 | nbproject
--------------------------------------------------------------------------------
/CHANGELOG:
--------------------------------------------------------------------------------
1 | # CHANGELOG
2 |
3 | ## v 1.1.1 - ?
4 |
5 | * Fixed depedency for RSpec to be the right version.
6 | * Migrated tests to RSpec
7 | * Lots of significant updates to README.
8 | * Regenerated docs, will be moving these to the GitHub wiki with the next
9 | release.
10 |
11 | ## v 1.1.0 - 17th June, 2011
12 |
13 | * :fire_on_method now takes an array of Symbols to attach to, so you can define
14 | handlers for multiple methods, including their aliases.
15 | * Refactored into a split Module - this allows you to require ruby_events/core
16 | to get the library without extending Object by default.
17 | * Added proper .gemspec, and cleaned up Rakefile of all bogus tasks.
18 | * Added proper dependencies to the .gemspec.
19 | * Adding MIT license for those who were asking about license restrictions.
20 |
21 | ***
22 |
23 | ## v 1.0.2 - 6th September, 2011
24 |
25 | * Updating docs.
26 |
27 | ***
28 |
29 | ## v 1.0.1 - 6th September, 2011
30 |
31 | * Fix for Enumerable detection that was causing exceptions for some people.
32 |
33 | ***
34 |
35 | ## v 1.0.0 - 6th September, 2011
36 |
37 | * Added proper spec tests in place of the original crappy tests that didn't
38 | really help with anything.
39 | * Cleanup of Rakefile to get rid of warnings and errors.
40 | * Adding comments and regerating docs.
41 |
--------------------------------------------------------------------------------
/README.markdown:
--------------------------------------------------------------------------------
1 | # RubyEvents
2 |
3 | Use RubyEvents to add event listening and firing capabilities to all Ruby
4 | objects. It's simple, fast and remains Ruby-ish in style and usage.
5 |
6 | A really simple event implementation that hooks into the Object class by
7 | default, or can be used to extend modules and classes. Now all your objects can
8 | join in the fun of firing events! RubyEvents even offers you callbacks on
9 | already defined methods, without having to do the hard work yourself - yes this
10 | means you can have callbacks on standard library methods without having to
11 | monkey patch!
12 |
13 | ## Installation
14 |
15 | ```shell
16 | gem install ruby_events
17 | ```
18 |
19 | ## Usage
20 |
21 | Using ruby_events is simple
22 |
23 | ```ruby
24 | require 'rubygems'
25 | require 'ruby_events'
26 | ```
27 |
28 | By default, all Objects are extended with a RubyEvents, and given a new method
29 | called `events`. You can also require RubyEvents without the Object patch:
30 |
31 | ```ruby
32 | require 'rubygems'
33 | require 'ruby_events/core'
34 | ```
35 |
36 | This allows you to patch objects yourself, or apply the RubyEvents module
37 | however you like.
38 |
39 | ### Examples
40 |
41 | RubyEvents allows you to use events like callbacks, whether within your own
42 | classes, or by monkey patching others:
43 |
44 | ```ruby
45 | class Example
46 | def initialize
47 | events.listen(:test_event) do |event_data|
48 | puts 'Hai there!'
49 | puts event_data
50 | end
51 | end
52 |
53 | def call_me
54 | events.fire(:test_event, 'My name is Mr Test Man!')
55 | end
56 | end
57 |
58 | e = Example.new
59 | e.call_me # Fires the event, and our handler gets called!
60 | ```
61 |
62 | You can do cooler and more advanced things, like add listeners to an Array:
63 |
64 | ```ruby
65 | a = []
66 |
67 | class << a
68 | alias_method :inject_old, :inject
69 |
70 | def inject(item)
71 | events.fire(:injected, self, item)
72 | inject_old(item)
73 | end
74 | end
75 |
76 | a.events.listen(:injected) do |a, item|
77 | puts a
78 | puts item
79 | end
80 |
81 | a.inject('This is a test')
82 | ```
83 |
84 | But because this is a fairly common pattern, RubyEvents does it for you with
85 | a little bit of sugar:
86 |
87 | ```ruby
88 | a = []
89 | a.events.fire_on_method('<<'.to_sym, :item_injected)
90 | a.events.listen(:injected) do |event_data|
91 | puts event_data
92 | end
93 |
94 | a << 'this is a test'
95 | ```
96 |
97 | You can supply multiple methods to fire a single event type on, useful for
98 | catching methods and their aliases:
99 |
100 | ```ruby
101 | a.events.fire_on_method(['<<'.to_sym, :push], :item_injected)
102 | ```
103 |
104 | You can supply the `listen` method with a Proc, an array of Procs, or a block.
105 | You can also give it a mixute of Procs and a block if you really want:
106 |
107 | ```ruby
108 | a = []
109 | a.events.fire_on_method('<<'.to_sym, :item_injected)
110 | a.events.listen(:injected, [Proc.new { |event_data| puts event_data; }, Proc.new { puts 'Hello, I was called!'; }])
111 |
112 | a << 'this is a test'
113 | ```
114 |
115 | These method events will automatically be passed the arguments that were passed
116 | to that method when it was called. Don't let your imagination stop there. You
117 | can add an event to any class method, and because all ruby objects are passed by
118 | reference, you can set these arguments and change the outcome of the function.
119 | Effectively, you can use the events as callbacks on any method:
120 |
121 | ```ruby
122 | a = {:one => 1}
123 | b = {:two => 3}
124 |
125 | a.events.fire_on_method(:merge, :merged)
126 | a.events.listen(:merged) do |items|
127 | items[:three] = 3
128 | puts 'The hash will have the extra item.'
129 | items
130 | end
131 |
132 | puts a.merge(b)
133 | ```
134 |
135 | All RubyEvents functionality is just an `object.events` call away.
136 |
137 | ## Licence
138 |
139 | The MIT License
140 |
141 | Copyright (c) 2011 Nathan Kleyn
142 |
143 | Permission is hereby granted, free of charge, to any person obtaining a copy
144 | of this software and associated documentation files (the "Software"), to deal
145 | in the Software without restriction, including without limitation the rights
146 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
147 | copies of the Software, and to permit persons to whom the Software is
148 | furnished to do so, subject to the following conditions:
149 |
150 | The above copyright notice and this permission notice shall be included in
151 | all copies or substantial portions of the Software.
152 |
153 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
155 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
156 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
157 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
158 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
159 | THE SOFTWARE.
160 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | require 'rubygems'
2 | require 'rake'
3 | require 'rake/clean'
4 | require 'rdoc/task'
5 | require 'rspec/core/rake_task'
6 |
7 | RDoc::Task.new do |rdoc|
8 | files =['README.markdown', 'lib/**/*.rb']
9 | rdoc.rdoc_files.add(files)
10 | rdoc.main = "README.markdown" # page to start on
11 | rdoc.title = "ruby_events Docs"
12 | rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
13 | rdoc.options << '--line-numbers'
14 | end
15 |
16 | RSpec::Core::RakeTask.new(:spec)
17 |
--------------------------------------------------------------------------------
/doc/rdoc/Object.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Class: Object
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
109 |
110 |
111 |
Object
112 |
113 |
114 |
115 |
Extending the Object class with the events
116 | accessor.
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | events [W]
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 | events ()
167 | click to toggle source
168 |
169 |
170 |
171 |
172 |
173 |
Attribute reader for the events accessor. Returns a new instance of the
174 | events class if not defined, or the already defined class otherwise.
175 |
176 |
177 |
178 |
179 |
180 |
181 | def events
182 | @events ||= RubyEvents :: Events .new (self )
183 | end
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
206 |
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/doc/rdoc/RubyEvents.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Module: RubyEvents
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
101 |
102 |
103 |
RubyEvents
104 |
105 |
106 |
107 |
The RubyEvents module contains the core logic
108 | used by the events firing class. All Object’s are extended by default
109 | with an events accessor that is set to an instance of the RubyEvents::Events class. By calling the
111 | methods on this accessor, you can set up and listen to events or callbacks
112 | as fired by this class.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
138 |
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/doc/rdoc/RubyEvents/Events.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Class: RubyEvents::Events
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
121 |
122 |
123 |
RubyEvents::Events
124 |
125 |
126 |
127 |
The Events class. Contains all the methods and
128 | functionality that drives the actual processes of adding, listening,
129 | calling and receiving events.
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 | new (parent)
156 | click to toggle source
157 |
158 |
159 |
160 |
161 |
162 |
Initialize the events class by instantiating the class methods we’ll be
163 | using.
164 |
165 |
166 |
167 |
168 |
169 |
170 | def initialize (parent )
171 | @parent , @events = parent , {}
172 | end
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 | version ()
190 | click to toggle source
191 |
192 |
193 |
194 |
195 |
196 |
The current version of RubyEvents .
197 |
198 |
199 |
200 |
201 |
202 |
203 | def self .version
204 | '1.1.0'
205 | end
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 | fire (event_type, *arguments)
229 | click to toggle source
230 |
231 |
232 |
233 |
234 |
235 |
Fire all registered listeners to the passed event, passing them the
236 | arguments as provided.
237 |
238 |
239 |
240 |
241 |
242 |
243 | def fire (event_type , *arguments )
244 | @events [event_type ].each do | event |
245 | event .call (*arguments )
246 | end if event_is_defined (event_type )
247 | end
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 | fire_on_method (method, event_type, &block)
265 | click to toggle source
266 |
267 |
268 |
269 |
270 |
271 |
Set an event to fire when passed method is called. This is useful for
272 | adding callbacks or events to built-in methods.
273 |
274 |
275 |
276 |
277 |
278 |
279 | def fire_on_method (method , event_type , &block )
280 | if method .is_a? Array
281 | method .map { | sym | fire_on_method (sym , event_type , &block ) }
282 | return
283 | end
284 |
285 |
286 |
287 | parent , old_method = @parent , ('ruby_events_' + method .to_s + '_event_old' ).to_sym
288 | if parent && parent .respond_to? (method )
289 | parent .class .class_eval do
290 |
291 |
292 |
293 | if parent .respond_to? (old_method , true )
294 | remove_method method
295 | alias_method method , old_method
296 | remove_method old_method
297 | end
298 |
299 | alias_method old_method , method
300 | private old_method
301 |
302 |
303 |
304 | define_method method do | *args |
305 | events .fire (event_type , *args )
306 | block .call (*args ) if block
307 | __send__ (old_method , *args )
308 | end
309 | end
310 | else
311 | raise 'The given object does not respond to method you are trying to intercept calls to.'
312 | end
313 | end
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 | listen (event_type, procs = nil, &block)
331 | click to toggle source
332 |
333 |
334 |
335 |
336 |
337 |
Add a listener to the passed event type. You can pass a Proc, an array of
338 | Proc’s, or a block.
339 |
340 |
341 |
342 |
343 |
344 |
345 | def listen (event_type , procs = nil , &block )
346 | @events [event_type ] = [] unless event_is_defined (event_type )
347 | procs_collected = []
348 | if procs .respond_to? (:each ) && procs .respond_to? (:to_a )
349 | procs_collected += procs .to_a
350 | elsif procs
351 | procs_collected << procs
352 | end
353 | procs_collected << block if block
354 | @events [event_type ] += procs_collected
355 | end
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 | remove (event_type, event)
373 | click to toggle source
374 |
375 |
376 |
377 |
378 |
379 |
Remove a method from the listening queue.
380 |
381 |
382 |
383 |
384 |
385 |
386 | def remove (event_type , event )
387 | @events [event_type ].delete_if {| stored_event | stored_event == event } if event_is_defined (event_type )
388 | end
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 | remove_fire_on_method (method)
406 | click to toggle source
407 |
408 |
409 |
410 |
411 |
412 |
Remove a fire on method alias event.
413 |
414 |
415 |
416 |
417 |
418 |
419 | def remove_fire_on_method (method )
420 | parent , old_method = @parent , ('ruby_events_' + method .to_s + '_event_old' ).to_sym
421 | parent .class .class_eval do
422 | if parent .respond_to? (old_method , true )
423 | remove_method method
424 | alias_method method , old_method
425 | public method
426 | else
427 | raise 'The fire on method trigger you were trying to remove does not exist.'
428 | end
429 | end
430 | end
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
453 |
454 |
455 |
456 |
457 |
--------------------------------------------------------------------------------
/doc/rdoc/created.rid:
--------------------------------------------------------------------------------
1 | Fri, 17 Jun 2011 23:47:39 +0100
2 | lib/ruby_events.rb Fri, 17 Jun 2011 23:07:23 +0100
3 | lib/ruby_events/core.rb Fri, 17 Jun 2011 23:35:59 +0100
4 | README.markdown Fri, 17 Jun 2011 23:40:05 +0100
5 | lib/ruby_events/object_patch.rb Fri, 17 Jun 2011 20:53:32 +0100
6 |
--------------------------------------------------------------------------------
/doc/rdoc/images/brick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/brick.png
--------------------------------------------------------------------------------
/doc/rdoc/images/brick_link.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/brick_link.png
--------------------------------------------------------------------------------
/doc/rdoc/images/bug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bug.png
--------------------------------------------------------------------------------
/doc/rdoc/images/bullet_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_black.png
--------------------------------------------------------------------------------
/doc/rdoc/images/bullet_toggle_minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_toggle_minus.png
--------------------------------------------------------------------------------
/doc/rdoc/images/bullet_toggle_plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_toggle_plus.png
--------------------------------------------------------------------------------
/doc/rdoc/images/date.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/date.png
--------------------------------------------------------------------------------
/doc/rdoc/images/find.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/find.png
--------------------------------------------------------------------------------
/doc/rdoc/images/loadingAnimation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/loadingAnimation.gif
--------------------------------------------------------------------------------
/doc/rdoc/images/macFFBgHack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/macFFBgHack.png
--------------------------------------------------------------------------------
/doc/rdoc/images/package.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/package.png
--------------------------------------------------------------------------------
/doc/rdoc/images/page_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_green.png
--------------------------------------------------------------------------------
/doc/rdoc/images/page_white_text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_white_text.png
--------------------------------------------------------------------------------
/doc/rdoc/images/page_white_width.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_white_width.png
--------------------------------------------------------------------------------
/doc/rdoc/images/plugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/plugin.png
--------------------------------------------------------------------------------
/doc/rdoc/images/ruby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/ruby.png
--------------------------------------------------------------------------------
/doc/rdoc/images/tag_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/tag_green.png
--------------------------------------------------------------------------------
/doc/rdoc/images/wrench.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/wrench.png
--------------------------------------------------------------------------------
/doc/rdoc/images/wrench_orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/wrench_orange.png
--------------------------------------------------------------------------------
/doc/rdoc/images/zoom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/zoom.png
--------------------------------------------------------------------------------
/doc/rdoc/index.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 | ruby_events Docs
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | ruby_events Docs
23 |
24 |
25 | This is the API documentation for 'ruby_events Docs'.
26 |
27 |
28 |
29 |
30 |
31 | Classes/Modules
32 |
41 |
42 | Methods
43 |
62 |
63 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/doc/rdoc/js/darkfish.js:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | * Darkfish Page Functions
4 | * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $
5 | *
6 | * Author: Michael Granger
7 | *
8 | */
9 |
10 | /* Provide console simulation for firebug-less environments */
11 | if (!("console" in window) || !("firebug" in console)) {
12 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
13 | "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
14 |
15 | window.console = {};
16 | for (var i = 0; i < names.length; ++i)
17 | window.console[names[i]] = function() {};
18 | };
19 |
20 |
21 | /**
22 | * Unwrap the first element that matches the given @expr@ from the targets and return them.
23 | */
24 | $.fn.unwrap = function( expr ) {
25 | return this.each( function() {
26 | $(this).parents( expr ).eq( 0 ).after( this ).remove();
27 | });
28 | };
29 |
30 |
31 | function showSource( e ) {
32 | var target = e.target;
33 | var codeSections = $(target).
34 | parents('.method-detail').
35 | find('.method-source-code');
36 |
37 | $(target).
38 | parents('.method-detail').
39 | find('.method-source-code').
40 | slideToggle();
41 | };
42 |
43 | function hookSourceViews() {
44 | $('.method-description,.method-heading').click( showSource );
45 | };
46 |
47 | function toggleDebuggingSection() {
48 | $('.debugging-section').slideToggle();
49 | };
50 |
51 | function hookDebuggingToggle() {
52 | $('#debugging-toggle img').click( toggleDebuggingSection );
53 | };
54 |
55 | function hookQuickSearch() {
56 | $('.quicksearch-field').each( function() {
57 | var searchElems = $(this).parents('.section').find( 'li' );
58 | var toggle = $(this).parents('.section').find('h3 .search-toggle');
59 | // console.debug( "Toggle is: %o", toggle );
60 | var qsbox = $(this).parents('form').get( 0 );
61 |
62 | $(this).quicksearch( this, searchElems, {
63 | noSearchResultsIndicator: 'no-class-search-results',
64 | focusOnLoad: false
65 | });
66 | $(toggle).click( function() {
67 | // console.debug( "Toggling qsbox: %o", qsbox );
68 | $(qsbox).toggle();
69 | });
70 | });
71 | };
72 |
73 | function highlightTarget( anchor ) {
74 | console.debug( "Highlighting target '%s'.", anchor );
75 |
76 | $("a[name=" + anchor + "]").each( function() {
77 | if ( !$(this).parent().parent().hasClass('target-section') ) {
78 | console.debug( "Wrapping the target-section" );
79 | $('div.method-detail').unwrap( 'div.target-section' );
80 | $(this).parent().wrap( '
' );
81 | } else {
82 | console.debug( "Already wrapped." );
83 | }
84 | });
85 | };
86 |
87 | function highlightLocationTarget() {
88 | console.debug( "Location hash: %s", window.location.hash );
89 | if ( ! window.location.hash || window.location.hash.length == 0 ) return;
90 |
91 | var anchor = window.location.hash.substring(1);
92 | console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" );
93 |
94 | highlightTarget( anchor );
95 | };
96 |
97 | function highlightClickTarget( event ) {
98 | console.debug( "Highlighting click target for event %o", event.target );
99 | try {
100 | var anchor = $(event.target).attr( 'href' ).substring(1);
101 | console.debug( "Found target anchor: %s", anchor );
102 | highlightTarget( anchor );
103 | } catch ( err ) {
104 | console.error( "Exception while highlighting: %o", err );
105 | };
106 | };
107 |
108 |
109 | $(document).ready( function() {
110 | hookSourceViews();
111 | hookDebuggingToggle();
112 | hookQuickSearch();
113 | highlightLocationTarget();
114 |
115 | $('ul.link-list a').bind( "click", highlightClickTarget );
116 | });
117 |
--------------------------------------------------------------------------------
/doc/rdoc/js/jquery.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery 1.2.6 - New Wave Javascript
3 | *
4 | * Copyright (c) 2008 John Resig (jquery.com)
5 | * Dual licensed under the MIT (MIT-LICENSE.txt)
6 | * and GPL (GPL-LICENSE.txt) licenses.
7 | *
8 | * $Date: 2008-09-25 09:50:52 -0700 (Thu, 25 Sep 2008) $
9 | * $Rev: 38 $
10 | */
11 | (function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
12 | return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
13 | return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
14 | selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
16 | this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
17 | return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
18 | jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
22 | jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,""]||!tags.indexOf(""," "]||(!tags.indexOf(""," "]||!tags.indexOf(""," "]||jQuery.browser.msie&&[1,"div","
"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
23 | ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
24 | while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
26 | for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
").append(res.responseText.replace(/
15 |
17 |
19 |
21 |
22 |
23 |
24 |
41 |
42 |
43 |
44 |
45 |
Description
46 |
47 |
The RubyEvents module contains the core
48 | logic used by the events firing class. All Object’s are extended by
49 | default with an events accessor that is set to an instance of the RubyEvents::Events class. By
51 | calling the methods on this accessor, you can set up and listen to events
52 | or callbacks as fired by this class.
53 |
54 |
55 |
56 |
57 |
58 |