Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 86
- Log:
Initial import of I2, an Instiki clone.
- Author:
- adh
- Date:
- Mon Oct 16 10:40:36 +0100 2006
- Size:
- 20720 Bytes
1 | // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) |
2 | // |
3 | // Parts (c) 2005 Justin Palmer (http://encytemedia.com/) |
4 | // Parts (c) 2005 Mark Pilgrim (http://diveintomark.org/) |
5 | // |
6 | // Permission is hereby granted, free of charge, to any person obtaining |
7 | // a copy of this software and associated documentation files (the |
8 | // "Software"), to deal in the Software without restriction, including |
9 | // without limitation the rights to use, copy, modify, merge, publish, |
10 | // distribute, sublicense, and/or sell copies of the Software, and to |
11 | // permit persons to whom the Software is furnished to do so, subject to |
12 | // the following conditions: |
13 | // |
14 | // The above copyright notice and this permission notice shall be |
15 | // included in all copies or substantial portions of the Software. |
16 | // |
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
18 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
19 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
20 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
21 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
22 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
24 | |
25 | |
26 | Effect = {} |
27 | Effect2 = Effect; // deprecated |
28 | |
29 | /* ------------- transitions ------------- */ |
30 | |
31 | Effect.Transitions = {} |
32 | |
33 | Effect.Transitions.linear = function(pos) { |
34 | return pos; |
35 | } |
36 | Effect.Transitions.sinoidal = function(pos) { |
37 | return (-Math.cos(pos*Math.PI)/2) + 0.5; |
38 | } |
39 | Effect.Transitions.reverse = function(pos) { |
40 | return 1-pos; |
41 | } |
42 | Effect.Transitions.flicker = function(pos) { |
43 | return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25); |
44 | } |
45 | Effect.Transitions.wobble = function(pos) { |
46 | return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; |
47 | } |
48 | Effect.Transitions.pulse = function(pos) { |
49 | return (Math.floor(pos*10) % 2 == 0 ? |
50 | (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); |
51 | } |
52 | Effect.Transitions.none = function(pos) { |
53 | return 0; |
54 | } |
55 | Effect.Transitions.full = function(pos) { |
56 | return 1; |
57 | } |
58 | |
59 | /* ------------- element ext -------------- */ |
60 | |
61 | Element.makePositioned = function(element) { |
62 | element = $(element); |
63 | if(element.style.position == "") |
64 | element.style.position = "relative"; |
65 | } |
66 | |
67 | Element.makeClipping = function(element) { |
68 | element = $(element); |
69 | element._overflow = element.style.overflow || 'visible'; |
70 | if(element._overflow!='hidden') element.style.overflow = 'hidden'; |
71 | } |
72 | |
73 | Element.undoClipping = function(element) { |
74 | element = $(element); |
75 | if(element._overflow!='hidden') element.style.overflow = element._overflow; |
76 | } |
77 | |
78 | /* ------------- core effects ------------- */ |
79 | |
80 | Effect.Base = function() {}; |
81 | Effect.Base.prototype = { |
82 | setOptions: function(options) { |
83 | this.options = Object.extend({ |
84 | transition: Effect.Transitions.sinoidal, |
85 | duration: 1.0, // seconds |
86 | fps: 25.0, // max. 100fps |
87 | sync: false, // true for combining |
88 | from: 0.0, |
89 | to: 1.0 |
90 | }, options || {}); |
91 | }, |
92 | start: function(options) { |
93 | this.setOptions(options || {}); |
94 | this.currentFrame = 0; |
95 | this.startOn = new Date().getTime(); |
96 | this.finishOn = this.startOn + (this.options.duration*1000); |
97 | if(this.options.beforeStart) this.options.beforeStart(this); |
98 | if(!this.options.sync) this.loop(); |
99 | }, |
100 | loop: function() { |
101 | var timePos = new Date().getTime(); |
102 | if(timePos >= this.finishOn) { |
103 | this.render(this.options.to); |
104 | if(this.finish) this.finish(); |
105 | if(this.options.afterFinish) this.options.afterFinish(this); |
106 | return; |
107 | } |
108 | var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); |
109 | var frame = Math.round(pos * this.options.fps * this.options.duration); |
110 | if(frame > this.currentFrame) { |
111 | this.render(pos); |
112 | this.currentFrame = frame; |
113 | } |
114 | this.timeout = setTimeout(this.loop.bind(this), 10); |
115 | }, |
116 | render: function(pos) { |
117 | if(this.options.transition) pos = this.options.transition(pos); |
118 | pos *= (this.options.to-this.options.from); |
119 | pos += this.options.from; |
120 | if(this.options.beforeUpdate) this.options.beforeUpdate(this); |
121 | if(this.update) this.update(pos); |
122 | if(this.options.afterUpdate) this.options.afterUpdate(this); |
123 | }, |
124 | cancel: function() { |
125 | if(this.timeout) clearTimeout(this.timeout); |
126 | } |
127 | } |
128 | |
129 | Effect.Parallel = Class.create(); |
130 | Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { |
131 | initialize: function(effects) { |
132 | this.effects = effects || []; |
133 | this.start(arguments[1]); |
134 | }, |
135 | update: function(position) { |
136 | for (var i = 0; i < this.effects.length; i++) |
137 | this.effects[i].render(position); |
138 | }, |
139 | finish: function(position) { |
140 | for (var i = 0; i < this.effects.length; i++) |
141 | if(this.effects[i].finish) this.effects[i].finish(position); |
142 | } |
143 | }); |
144 | |
145 | // Internet Explorer caveat: works only on elements the have |
146 | // a 'layout', meaning having a given width or height. |
147 | // There is no way to safely set this automatically. |
148 | Effect.Opacity = Class.create(); |
149 | Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { |
150 | initialize: function(element) { |
151 | this.element = $(element); |
152 | options = Object.extend({ |
153 | from: 0.0, |
154 | to: 1.0 |
155 | }, arguments[1] || {}); |
156 | this.start(options); |
157 | }, |
158 | update: function(position) { |
159 | this.setOpacity(position); |
160 | }, |
161 | setOpacity: function(opacity) { |
162 | opacity = (opacity == 1) ? 0.99999 : opacity; |
163 | this.element.style.opacity = opacity; |
164 | this.element.style.filter = "alpha(opacity:"+opacity*100+")"; |
165 | } |
166 | }); |
167 | |
168 | Effect.MoveBy = Class.create(); |
169 | Object.extend(Object.extend(Effect.MoveBy.prototype, Effect.Base.prototype), { |
170 | initialize: function(element, toTop, toLeft) { |
171 | this.element = $(element); |
172 | this.originalTop = parseFloat(this.element.style.top || '0'); |
173 | this.originalLeft = parseFloat(this.element.style.left || '0'); |
174 | this.toTop = toTop; |
175 | this.toLeft = toLeft; |
176 | Element.makePositioned(this.element); |
177 | this.start(arguments[3]); |
178 | }, |
179 | update: function(position) { |
180 | topd = this.toTop * position + this.originalTop; |
181 | leftd = this.toLeft * position + this.originalLeft; |
182 | this.setPosition(topd, leftd); |
183 | }, |
184 | setPosition: function(topd, leftd) { |
185 | this.element.style.top = topd + "px"; |
186 | this.element.style.left = leftd + "px"; |
187 | } |
188 | }); |
189 | |
190 | Effect.Scale = Class.create(); |
191 | Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { |
192 | initialize: function(element, percent) { |
193 | this.element = $(element) |
194 | options = Object.extend({ |
195 | scaleX: true, |
196 | scaleY: true, |
197 | scaleContent: true, |
198 | scaleFromCenter: false, |
199 | scaleMode: 'box', // 'box' or 'contents' or {} with provided values |
200 | scaleFrom: 100.0 |
201 | }, arguments[2] || {}); |
202 | this.originalTop = this.element.offsetTop; |
203 | this.originalLeft = this.element.offsetLeft; |
204 | if(this.element.style.fontSize=="") this.sizeEm = 1.0; |
205 | if(this.element.style.fontSize && this.element.style.fontSize.indexOf("em")>0) |
206 | this.sizeEm = parseFloat(this.element.style.fontSize); |
207 | this.factor = (percent/100.0) - (options.scaleFrom/100.0); |
208 | if(options.scaleMode=='box') { |
209 | this.originalHeight = this.element.clientHeight; |
210 | this.originalWidth = this.element.clientWidth; |
211 | } else |
212 | if(options.scaleMode=='contents') { |
213 | this.originalHeight = this.element.scrollHeight; |
214 | this.originalWidth = this.element.scrollWidth; |
215 | } else { |
216 | this.originalHeight = options.scaleMode.originalHeight; |
217 | this.originalWidth = options.scaleMode.originalWidth; |
218 | } |
219 | this.start(options); |
220 | }, |
221 | |
222 | update: function(position) { |
223 | currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); |
224 | if(this.options.scaleContent && this.sizeEm) |
225 | this.element.style.fontSize = this.sizeEm*currentScale + "em"; |
226 | this.setDimensions( |
227 | this.originalWidth * currentScale, |
228 | this.originalHeight * currentScale); |
229 | }, |
230 | |
231 | setDimensions: function(width, height) { |
232 | if(this.options.scaleX) this.element.style.width = width + 'px'; |
233 | if(this.options.scaleY) this.element.style.height = height + 'px'; |
234 | if(this.options.scaleFromCenter) { |
235 | topd = (height - this.originalHeight)/2; |
236 | leftd = (width - this.originalWidth)/2; |
237 | if(this.element.style.position=='absolute') { |
238 | if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px"; |
239 | if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px"; |
240 | } else { |
241 | if(this.options.scaleY) this.element.style.top = -topd + "px"; |
242 | if(this.options.scaleX) this.element.style.left = -leftd + "px"; |
243 | } |
244 | } |
245 | } |
246 | }); |
247 | |
248 | Effect.Highlight = Class.create(); |
249 | Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { |
250 | initialize: function(element) { |
251 | this.element = $(element); |
252 | |
253 | // try to parse current background color as default for endcolor |
254 | // browser stores this as: "rgb(255, 255, 255)", convert to "#ffffff" format |
255 | var endcolor = "#ffffff"; |
256 | var current = this.element.style.backgroundColor; |
257 | if(current && current.slice(0,4) == "rgb(") { |
258 | endcolor = "#"; |
259 | var cols = current.slice(4,current.length-1).split(','); |
260 | var i=0; do { endcolor += parseInt(cols[i]).toColorPart() } while (++i<3); } |
261 | |
262 | var options = Object.extend({ |
263 | startcolor: "#ffff99", |
264 | endcolor: endcolor, |
265 | restorecolor: current |
266 | }, arguments[1] || {}); |
267 | |
268 | // init color calculations |
269 | this.colors_base = [ |
270 | parseInt(options.startcolor.slice(1,3),16), |
271 | parseInt(options.startcolor.slice(3,5),16), |
272 | parseInt(options.startcolor.slice(5),16) ]; |
273 | this.colors_delta = [ |
274 | parseInt(options.endcolor.slice(1,3),16)-this.colors_base[0], |
275 | parseInt(options.endcolor.slice(3,5),16)-this.colors_base[1], |
276 | parseInt(options.endcolor.slice(5),16)-this.colors_base[2] ]; |
277 | |
278 | this.start(options); |
279 | }, |
280 | update: function(position) { |
281 | var colors = [ |
282 | Math.round(this.colors_base[0]+(this.colors_delta[0]*position)), |
283 | Math.round(this.colors_base[1]+(this.colors_delta[1]*position)), |
284 | Math.round(this.colors_base[2]+(this.colors_delta[2]*position)) ]; |
285 | this.element.style.backgroundColor = "#" + |
286 | colors[0].toColorPart() + colors[1].toColorPart() + colors[2].toColorPart(); |
287 | }, |
288 | finish: function() { |
289 | this.element.style.backgroundColor = this.options.restorecolor; |
290 | } |
291 | }); |
292 | |
293 | Effect.ScrollTo = Class.create(); |
294 | Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { |
295 | initialize: function(element) { |
296 | this.element = $(element); |
297 | Position.prepare(); |
298 | var offsets = Position.cumulativeOffset(this.element); |
299 | var max = window.innerHeight ? |
300 | window.height - window.innerHeight : |
301 | document.body.scrollHeight - |
302 | (document.documentElement.clientHeight ? |
303 | document.documentElement.clientHeight : document.body.clientHeight); |
304 | this.scrollStart = Position.deltaY; |
305 | this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; |
306 | this.start(arguments[1] || {}); |
307 | }, |
308 | update: function(position) { |
309 | Position.prepare(); |
310 | window.scrollTo(Position.deltaX, |
311 | this.scrollStart + (position*this.delta)); |
312 | } |
313 | }); |
314 | |
315 | /* ------------- prepackaged effects ------------- */ |
316 | |
317 | Effect.Fade = function(element) { |
318 | options = Object.extend({ |
319 | from: 1.0, |
320 | to: 0.0, |
321 | afterFinish: function(effect) |
322 | { Element.hide(effect.element); |
323 | effect.setOpacity(1); } |
324 | }, arguments[1] || {}); |
325 | new Effect.Opacity(element,options); |
326 | } |
327 | |
328 | Effect.Appear = function(element) { |
329 | options = Object.extend({ |
330 | from: 0.0, |
331 | to: 1.0, |
332 | beforeStart: function(effect) |
333 | { effect.setOpacity(0); |
334 | Element.show(effect.element); }, |
335 | afterUpdate: function(effect) |
336 | { Element.show(effect.element); } |
337 | }, arguments[1] || {}); |
338 | new Effect.Opacity(element,options); |
339 | } |
340 | |
341 | Effect.Puff = function(element) { |
342 | new Effect.Parallel( |
343 | [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true }), |
344 | new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], |
345 | { duration: 1.0, |
346 | afterUpdate: function(effect) |
347 | { effect.effects[0].element.style.position = 'absolute'; }, |
348 | afterFinish: function(effect) |
349 | { Element.hide(effect.effects[0].element); } |
350 | } |
351 | ); |
352 | } |
353 | |
354 | Effect.BlindUp = function(element) { |
355 | Element.makeClipping(element); |
356 | new Effect.Scale(element, 0, |
357 | Object.extend({ scaleContent: false, |
358 | scaleX: false, |
359 | afterFinish: function(effect) |
360 | { |
361 | Element.hide(effect.element); |
362 | Element.undoClipping(effect.element); |
363 | } |
364 | }, arguments[1] || {}) |
365 | ); |
366 | } |
367 | |
368 | Effect.BlindDown = function(element) { |
369 | $(element).style.height = '0px'; |
370 | Element.makeClipping(element); |
371 | Element.show(element); |
372 | new Effect.Scale(element, 100, |
373 | Object.extend({ scaleContent: false, |
374 | scaleX: false, |
375 | scaleMode: 'contents', |
376 | scaleFrom: 0, |
377 | afterFinish: function(effect) { |
378 | Element.undoClipping(effect.element); |
379 | } |
380 | }, arguments[1] || {}) |
381 | ); |
382 | } |
383 | |
384 | Effect.SwitchOff = function(element) { |
385 | new Effect.Appear(element, |
386 | { duration: 0.4, |
387 | transition: Effect.Transitions.flicker, |
388 | afterFinish: function(effect) |
389 | { effect.element.style.overflow = 'hidden'; |
390 | new Effect.Scale(effect.element, 1, |
391 | { duration: 0.3, scaleFromCenter: true, |
392 | scaleX: false, scaleContent: false, |
393 | afterUpdate: function(effect) { |
394 | if(effect.element.style.position=="") |
395 | effect.element.style.position = 'relative'; }, |
396 | afterFinish: function(effect) { Element.hide(effect.element); } |
397 | } ) |
398 | } |
399 | } ); |
400 | } |
401 | |
402 | Effect.DropOut = function(element) { |
403 | new Effect.Parallel( |
404 | [ new Effect.MoveBy(element, 100, 0, { sync: true }), |
405 | new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], |
406 | { duration: 0.5, |
407 | afterFinish: function(effect) |
408 | { Element.hide(effect.effects[0].element); } |
409 | }); |
410 | } |
411 | |
412 | Effect.Shake = function(element) { |
413 | new Effect.MoveBy(element, 0, 20, |
414 | { duration: 0.05, afterFinish: function(effect) { |
415 | new Effect.MoveBy(effect.element, 0, -40, |
416 | { duration: 0.1, afterFinish: function(effect) { |
417 | new Effect.MoveBy(effect.element, 0, 40, |
418 | { duration: 0.1, afterFinish: function(effect) { |
419 | new Effect.MoveBy(effect.element, 0, -40, |
420 | { duration: 0.1, afterFinish: function(effect) { |
421 | new Effect.MoveBy(effect.element, 0, 40, |
422 | { duration: 0.1, afterFinish: function(effect) { |
423 | new Effect.MoveBy(effect.element, 0, -20, |
424 | { duration: 0.05, afterFinish: function(effect) { |
425 | }}) }}) }}) }}) }}) }}); |
426 | } |
427 | |
428 | Effect.SlideDown = function(element) { |
429 | element = $(element); |
430 | element.style.height = '0px'; |
431 | Element.makeClipping(element); |
432 | Element.cleanWhitespace(element); |
433 | Element.makePositioned(element.firstChild); |
434 | Element.show(element); |
435 | new Effect.Scale(element, 100, |
436 | Object.extend({ scaleContent: false, |
437 | scaleX: false, |
438 | scaleMode: 'contents', |
439 | scaleFrom: 0, |
440 | afterUpdate: function(effect) |
441 | { effect.element.firstChild.style.bottom = |
442 | (effect.originalHeight - effect.element.clientHeight) + 'px'; }, |
443 | afterFinish: function(effect) |
444 | { Element.undoClipping(effect.element); } |
445 | }, arguments[1] || {}) |
446 | ); |
447 | } |
448 | |
449 | Effect.SlideUp = function(element) { |
450 | element = $(element); |
451 | Element.makeClipping(element); |
452 | Element.cleanWhitespace(element); |
453 | Element.makePositioned(element.firstChild); |
454 | Element.show(element); |
455 | new Effect.Scale(element, 0, |
456 | Object.extend({ scaleContent: false, |
457 | scaleX: false, |
458 | afterUpdate: function(effect) |
459 | { effect.element.firstChild.style.bottom = |
460 | (effect.originalHeight - effect.element.clientHeight) + 'px'; }, |
461 | afterFinish: function(effect) |
462 | { |
463 | Element.hide(effect.element); |
464 | Element.undoClipping(effect.element); |
465 | } |
466 | }, arguments[1] || {}) |
467 | ); |
468 | } |
469 | |
470 | Effect.Squish = function(element) { |
471 | new Effect.Scale(element, 0, |
472 | { afterFinish: function(effect) { Element.hide(effect.element); } }); |
473 | } |
474 | |
475 | Effect.Grow = function(element) { |
476 | element = $(element); |
477 | var options = arguments[1] || {}; |
478 | |
479 | var originalWidth = element.clientWidth; |
480 | var originalHeight = element.clientHeight; |
481 | element.style.overflow = 'hidden'; |
482 | Element.show(element); |
483 | |
484 | var direction = options.direction || 'center'; |
485 | var moveTransition = options.moveTransition || Effect.Transitions.sinoidal; |
486 | var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal; |
487 | var opacityTransition = options.opacityTransition || Effect.Transitions.full; |
488 | |
489 | var initialMoveX, initialMoveY; |
490 | var moveX, moveY; |
491 | |
492 | switch (direction) { |
493 | case 'top-left': |
494 | initialMoveX = initialMoveY = moveX = moveY = 0; |
495 | break; |
496 | case 'top-right': |
497 | initialMoveX = originalWidth; |
498 | initialMoveY = moveY = 0; |
499 | moveX = -originalWidth; |
500 | break; |
501 | case 'bottom-left': |
502 | initialMoveX = moveX = 0; |
503 | initialMoveY = originalHeight; |
504 | moveY = -originalHeight; |
505 | break; |
506 | case 'bottom-right': |
507 | initialMoveX = originalWidth; |
508 | initialMoveY = originalHeight; |
509 | moveX = -originalWidth; |
510 | moveY = -originalHeight; |
511 | break; |
512 | case 'center': |
513 | initialMoveX = originalWidth / 2; |
514 | initialMoveY = originalHeight / 2; |
515 | moveX = -originalWidth / 2; |
516 | moveY = -originalHeight / 2; |
517 | break; |
518 | } |
519 | |
520 | new Effect.MoveBy(element, initialMoveY, initialMoveX, { |
521 | duration: 0.01, |
522 | beforeUpdate: function(effect) { $(element).style.height = '0px'; }, |
523 | afterFinish: function(effect) { |
524 | new Effect.Parallel( |
525 | [ new Effect.Opacity(element, { sync: true, to: 1.0, from: 0.0, transition: opacityTransition }), |
526 | new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: moveTransition }), |
527 | new Effect.Scale(element, 100, { |
528 | scaleMode: { originalHeight: originalHeight, originalWidth: originalWidth }, |
529 | sync: true, scaleFrom: 0, scaleTo: 100, transition: scaleTransition })], |
530 | options); } |
531 | }); |
532 | } |
533 | |
534 | Effect.Shrink = function(element) { |
535 | element = $(element); |
536 | var options = arguments[1] || {}; |
537 | |
538 | var originalWidth = element.clientWidth; |
539 | var originalHeight = element.clientHeight; |
540 | element.style.overflow = 'hidden'; |
541 | Element.show(element); |
542 | |
543 | var direction = options.direction || 'center'; |
544 | var moveTransition = options.moveTransition || Effect.Transitions.sinoidal; |
545 | var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal; |
546 | var opacityTransition = options.opacityTransition || Effect.Transitions.none; |
547 | |
548 | var moveX, moveY; |
549 | |
550 | switch (direction) { |
551 | case 'top-left': |
552 | moveX = moveY = 0; |
553 | break; |
554 | case 'top-right': |
555 | moveX = originalWidth; |
556 | moveY = 0; |
557 | break; |
558 | case 'bottom-left': |
559 | moveX = 0; |
560 | moveY = originalHeight; |
561 | break; |
562 | case 'bottom-right': |
563 | moveX = originalWidth; |
564 | moveY = originalHeight; |
565 | break; |
566 | case 'center': |
567 | moveX = originalWidth / 2; |
568 | moveY = originalHeight / 2; |
569 | break; |
570 | } |
571 | |
572 | new Effect.Parallel( |
573 | [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: opacityTransition }), |
574 | new Effect.Scale(element, 0, { sync: true, transition: moveTransition }), |
575 | new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: scaleTransition }) ], |
576 | options); |
577 | } |
578 | |
579 | Effect.Pulsate = function(element) { |
580 | var options = arguments[1] || {}; |
581 | var transition = options.transition || Effect.Transitions.sinoidal; |
582 | var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; |
583 | reverser.bind(transition); |
584 | new Effect.Opacity(element, |
585 | Object.extend(Object.extend({ duration: 3.0, |
586 | afterFinish: function(effect) { Element.show(effect.element); } |
587 | }, options), {transition: reverser})); |
588 | } |
589 | |
590 | Effect.Fold = function(element) { |
591 | $(element).style.overflow = 'hidden'; |
592 | new Effect.Scale(element, 5, Object.extend({ |
593 | scaleContent: false, |
594 | scaleTo: 100, |
595 | scaleX: false, |
596 | afterFinish: function(effect) { |
597 | new Effect.Scale(element, 1, { |
598 | scaleContent: false, |
599 | scaleTo: 0, |
600 | scaleY: false, |
601 | afterFinish: function(effect) { Element.hide(effect.element) } }); |
602 | }}, arguments[1] || {})); |
603 | } |
604 | |
605 | // old: new Effect.ContentZoom(element, percent) |
606 | // new: Element.setContentZoom(element, percent) |
607 | |
608 | Element.setContentZoom = function(element, percent) { |
609 | var element = $(element); |
610 | element.style.fontSize = (percent/100) + "em"; |
611 | if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); |
612 | } |