2
0

effects.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  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. Effect = {}
  25. Effect2 = Effect; // deprecated
  26. /* ------------- transitions ------------- */
  27. Effect.Transitions = {}
  28. Effect.Transitions.linear = function(pos) {
  29. return pos;
  30. }
  31. Effect.Transitions.sinoidal = function(pos) {
  32. return (-Math.cos(pos*Math.PI)/2) + 0.5;
  33. }
  34. Effect.Transitions.reverse = function(pos) {
  35. return 1-pos;
  36. }
  37. Effect.Transitions.flicker = function(pos) {
  38. return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25);
  39. }
  40. Effect.Transitions.wobble = function(pos) {
  41. return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
  42. }
  43. Effect.Transitions.pulse = function(pos) {
  44. return (Math.floor(pos*10) % 2 == 0 ?
  45. (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
  46. }
  47. Effect.Transitions.none = function(pos) {
  48. return 0;
  49. }
  50. Effect.Transitions.full = function(pos) {
  51. return 1;
  52. }
  53. /* ------------- element ext -------------- */
  54. Element.makePositioned = function(element) {
  55. element = $(element);
  56. if(element.style.position == "")
  57. element.style.position = "relative";
  58. }
  59. Element.makeClipping = function(element) {
  60. element = $(element);
  61. element._overflow = element.style.overflow || 'visible';
  62. if(element._overflow!='hidden') element.style.overflow = 'hidden';
  63. }
  64. Element.undoClipping = function(element) {
  65. element = $(element);
  66. if(element._overflow!='hidden') element.style.overflow = element._overflow;
  67. }
  68. /* ------------- core effects ------------- */
  69. Effect.Base = function() {};
  70. Effect.Base.prototype = {
  71. setOptions: function(options) {
  72. this.options = Object.extend({
  73. transition: Effect.Transitions.sinoidal,
  74. duration: 1.0, // seconds
  75. fps: 25.0, // max. 100fps
  76. sync: false, // true for combining
  77. from: 0.0,
  78. to: 1.0
  79. }, options || {});
  80. },
  81. start: function(options) {
  82. this.setOptions(options || {});
  83. this.currentFrame = 0;
  84. this.startOn = new Date().getTime();
  85. this.finishOn = this.startOn + (this.options.duration*1000);
  86. if(this.options.beforeStart) this.options.beforeStart(this);
  87. if(!this.options.sync) this.loop();
  88. },
  89. loop: function() {
  90. var timePos = new Date().getTime();
  91. if(timePos >= this.finishOn) {
  92. this.render(1.0);
  93. if(this.finish) this.finish();
  94. if(this.options.afterFinish) this.options.afterFinish(this);
  95. return;
  96. }
  97. var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
  98. var frame = Math.round(pos * this.options.fps * this.options.duration);
  99. if(frame > this.currentFrame) {
  100. this.render(pos);
  101. this.currentFrame = frame;
  102. }
  103. this.timeout = setTimeout(this.loop.bind(this), 10);
  104. },
  105. render: function(pos) {
  106. if(this.options.transition) pos = this.options.transition(pos);
  107. pos *= (this.options.to-this.options.from);
  108. pos += this.options.from;
  109. if(this.options.beforeUpdate) this.options.beforeUpdate(this);
  110. if(this.update) this.update(pos);
  111. if(this.options.afterUpdate) this.options.afterUpdate(this);
  112. },
  113. cancel: function() {
  114. if(this.timeout) clearTimeout(this.timeout);
  115. }
  116. }
  117. Effect.Parallel = Class.create();
  118. Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  119. initialize: function(effects) {
  120. this.effects = effects || [];
  121. this.start(arguments[1]);
  122. },
  123. update: function(position) {
  124. for (var i = 0; i < this.effects.length; i++)
  125. this.effects[i].render(position);
  126. },
  127. finish: function(position) {
  128. for (var i = 0; i < this.effects.length; i++)
  129. if(this.effects[i].finish) this.effects[i].finish(position);
  130. }
  131. });
  132. // Internet Explorer caveat: works only on elements the have
  133. // a 'layout', meaning having a given width or height.
  134. // There is no way to safely set this automatically.
  135. Effect.Opacity = Class.create();
  136. Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  137. initialize: function(element) {
  138. this.element = $(element);
  139. options = Object.extend({
  140. from: 0.0,
  141. to: 1.0
  142. }, arguments[1] || {});
  143. this.start(options);
  144. },
  145. update: function(position) {
  146. this.setOpacity(position);
  147. },
  148. setOpacity: function(opacity) {
  149. opacity = (opacity == 1) ? 0.99999 : opacity;
  150. this.element.style.opacity = opacity;
  151. this.element.style.filter = "alpha(opacity:"+opacity*100+")";
  152. }
  153. });
  154. Effect.MoveBy = Class.create();
  155. Object.extend(Object.extend(Effect.MoveBy.prototype, Effect.Base.prototype), {
  156. initialize: function(element, toTop, toLeft) {
  157. this.element = $(element);
  158. this.originalTop = parseFloat(this.element.style.top || '0');
  159. this.originalLeft = parseFloat(this.element.style.left || '0');
  160. this.toTop = toTop;
  161. this.toLeft = toLeft;
  162. Element.makePositioned(this.element);
  163. this.start(arguments[3]);
  164. },
  165. update: function(position) {
  166. topd = this.toTop * position + this.originalTop;
  167. leftd = this.toLeft * position + this.originalLeft;
  168. this.setPosition(topd, leftd);
  169. },
  170. setPosition: function(topd, leftd) {
  171. this.element.style.top = topd + "px";
  172. this.element.style.left = leftd + "px";
  173. }
  174. });
  175. Effect.Scale = Class.create();
  176. Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  177. initialize: function(element, percent) {
  178. this.element = $(element)
  179. options = Object.extend({
  180. scaleX: true,
  181. scaleY: true,
  182. scaleContent: true,
  183. scaleFromCenter: false,
  184. scaleMode: 'box', // 'box' or 'contents' or {} with provided values
  185. scaleFrom: 100.0
  186. }, arguments[2] || {});
  187. this.originalTop = this.element.offsetTop;
  188. this.originalLeft = this.element.offsetLeft;
  189. if(this.element.style.fontSize=="") this.sizeEm = 1.0;
  190. if(this.element.style.fontSize && this.element.style.fontSize.indexOf("em")>0)
  191. this.sizeEm = parseFloat(this.element.style.fontSize);
  192. this.factor = (percent/100.0) - (options.scaleFrom/100.0);
  193. if(options.scaleMode=='box') {
  194. this.originalHeight = this.element.clientHeight;
  195. this.originalWidth = this.element.clientWidth;
  196. } else
  197. if(options.scaleMode=='contents') {
  198. this.originalHeight = this.element.scrollHeight;
  199. this.originalWidth = this.element.scrollWidth;
  200. } else {
  201. this.originalHeight = options.scaleMode.originalHeight;
  202. this.originalWidth = options.scaleMode.originalWidth;
  203. }
  204. this.start(options);
  205. },
  206. update: function(position) {
  207. currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
  208. if(this.options.scaleContent && this.sizeEm)
  209. this.element.style.fontSize = this.sizeEm*currentScale + "em";
  210. this.setDimensions(
  211. this.originalWidth * currentScale,
  212. this.originalHeight * currentScale);
  213. },
  214. setDimensions: function(width, height) {
  215. if(this.options.scaleX) this.element.style.width = width + 'px';
  216. if(this.options.scaleY) this.element.style.height = height + 'px';
  217. if(this.options.scaleFromCenter) {
  218. topd = (height - this.originalHeight)/2;
  219. leftd = (width - this.originalWidth)/2;
  220. if(this.element.style.position=='absolute') {
  221. if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px";
  222. if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px";
  223. } else {
  224. if(this.options.scaleY) this.element.style.top = -topd + "px";
  225. if(this.options.scaleX) this.element.style.left = -leftd + "px";
  226. }
  227. }
  228. }
  229. });
  230. Effect.Highlight = Class.create();
  231. Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  232. initialize: function(element) {
  233. this.element = $(element);
  234. // try to parse current background color as default for endcolor
  235. // browser stores this as: "rgb(255, 255, 255)", convert to "#ffffff" format
  236. var endcolor = "#ffffff";
  237. var current = this.element.style.backgroundColor;
  238. if(current && current.slice(0,4) == "rgb(") {
  239. endcolor = "#";
  240. var cols = current.slice(4,current.length-1).split(',');
  241. var i=0; do { endcolor += parseInt(cols[i]).toColorPart() } while (++i<3); }
  242. var options = Object.extend({
  243. startcolor: "#ffff99",
  244. endcolor: endcolor,
  245. restorecolor: current
  246. }, arguments[1] || {});
  247. // init color calculations
  248. this.colors_base = [
  249. parseInt(options.startcolor.slice(1,3),16),
  250. parseInt(options.startcolor.slice(3,5),16),
  251. parseInt(options.startcolor.slice(5),16) ];
  252. this.colors_delta = [
  253. parseInt(options.endcolor.slice(1,3),16)-this.colors_base[0],
  254. parseInt(options.endcolor.slice(3,5),16)-this.colors_base[1],
  255. parseInt(options.endcolor.slice(5),16)-this.colors_base[2] ];
  256. this.start(options);
  257. },
  258. update: function(position) {
  259. var colors = [
  260. Math.round(this.colors_base[0]+(this.colors_delta[0]*position)),
  261. Math.round(this.colors_base[1]+(this.colors_delta[1]*position)),
  262. Math.round(this.colors_base[2]+(this.colors_delta[2]*position)) ];
  263. this.element.style.backgroundColor = "#" +
  264. colors[0].toColorPart() + colors[1].toColorPart() + colors[2].toColorPart();
  265. },
  266. finish: function() {
  267. this.element.style.backgroundColor = this.options.restorecolor;
  268. }
  269. });
  270. Effect.ScrollTo = Class.create();
  271. Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  272. initialize: function(element) {
  273. this.element = $(element);
  274. Position.prepare();
  275. var offsets = Position.cumulativeOffset(this.element);
  276. var max = window.innerHeight ?
  277. window.height - window.innerHeight :
  278. document.body.scrollHeight -
  279. (document.documentElement.clientHeight ?
  280. document.documentElement.clientHeight : document.body.clientHeight);
  281. this.scrollStart = Position.deltaY;
  282. this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  283. this.start(arguments[1] || {});
  284. },
  285. update: function(position) {
  286. Position.prepare();
  287. window.scrollTo(Position.deltaX,
  288. this.scrollStart + (position*this.delta));
  289. }
  290. });
  291. /* ------------- prepackaged effects ------------- */
  292. Effect.Fade = function(element) {
  293. options = Object.extend({
  294. from: 1.0,
  295. to: 0.0,
  296. afterFinish: function(effect)
  297. { Element.hide(effect.element);
  298. effect.setOpacity(1); }
  299. }, arguments[1] || {});
  300. return new Effect.Opacity(element,options);
  301. }
  302. Effect.Appear = function(element) {
  303. options = Object.extend({
  304. from: 0.0,
  305. to: 1.0,
  306. beforeStart: function(effect)
  307. { effect.setOpacity(0);
  308. Element.show(effect.element); },
  309. afterUpdate: function(effect)
  310. { Element.show(effect.element); }
  311. }, arguments[1] || {});
  312. return new Effect.Opacity(element,options);
  313. }
  314. Effect.Puff = function(element) {
  315. return new Effect.Parallel(
  316. [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true }),
  317. new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ],
  318. { duration: 1.0,
  319. afterUpdate: function(effect)
  320. { effect.effects[0].element.style.position = 'absolute'; },
  321. afterFinish: function(effect)
  322. { Element.hide(effect.effects[0].element); }
  323. }
  324. );
  325. }
  326. Effect.BlindUp = function(element) {
  327. Element.makeClipping(element);
  328. return new Effect.Scale(element, 0,
  329. Object.extend({ scaleContent: false,
  330. scaleX: false,
  331. afterFinish: function(effect)
  332. {
  333. Element.hide(effect.element);
  334. Element.undoClipping(effect.element);
  335. }
  336. }, arguments[1] || {})
  337. );
  338. }
  339. Effect.BlindDown = function(element) {
  340. $(element).style.height = '0px';
  341. Element.makeClipping(element);
  342. Element.show(element);
  343. return new Effect.Scale(element, 100,
  344. Object.extend({ scaleContent: false,
  345. scaleX: false,
  346. scaleMode: 'contents',
  347. scaleFrom: 0,
  348. afterFinish: function(effect) {
  349. Element.undoClipping(effect.element);
  350. }
  351. }, arguments[1] || {})
  352. );
  353. }
  354. Effect.SwitchOff = function(element) {
  355. return new Effect.Appear(element,
  356. { duration: 0.4,
  357. transition: Effect.Transitions.flicker,
  358. afterFinish: function(effect)
  359. { effect.element.style.overflow = 'hidden';
  360. new Effect.Scale(effect.element, 1,
  361. { duration: 0.3, scaleFromCenter: true,
  362. scaleX: false, scaleContent: false,
  363. afterUpdate: function(effect) {
  364. if(effect.element.style.position=="")
  365. effect.element.style.position = 'relative'; },
  366. afterFinish: function(effect) { Element.hide(effect.element); }
  367. } )
  368. }
  369. } );
  370. }
  371. Effect.DropOut = function(element) {
  372. return new Effect.Parallel(
  373. [ new Effect.MoveBy(element, 100, 0, { sync: true }),
  374. new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ],
  375. { duration: 0.5,
  376. afterFinish: function(effect)
  377. { Element.hide(effect.effects[0].element); }
  378. });
  379. }
  380. Effect.Shake = function(element) {
  381. return new Effect.MoveBy(element, 0, 20,
  382. { duration: 0.05, afterFinish: function(effect) {
  383. new Effect.MoveBy(effect.element, 0, -40,
  384. { duration: 0.1, afterFinish: function(effect) {
  385. new Effect.MoveBy(effect.element, 0, 40,
  386. { duration: 0.1, afterFinish: function(effect) {
  387. new Effect.MoveBy(effect.element, 0, -40,
  388. { duration: 0.1, afterFinish: function(effect) {
  389. new Effect.MoveBy(effect.element, 0, 40,
  390. { duration: 0.1, afterFinish: function(effect) {
  391. new Effect.MoveBy(effect.element, 0, -20,
  392. { duration: 0.05, afterFinish: function(effect) {
  393. }}) }}) }}) }}) }}) }});
  394. }
  395. Effect.SlideDown = function(element) {
  396. element = $(element);
  397. element.style.height = '0px';
  398. Element.makeClipping(element);
  399. Element.cleanWhitespace(element);
  400. Element.makePositioned(element.firstChild);
  401. Element.show(element);
  402. return new Effect.Scale(element, 100,
  403. Object.extend({ scaleContent: false,
  404. scaleX: false,
  405. scaleMode: 'contents',
  406. scaleFrom: 0,
  407. afterUpdate: function(effect)
  408. { effect.element.firstChild.style.bottom =
  409. (effect.originalHeight - effect.element.clientHeight) + 'px'; },
  410. afterFinish: function(effect)
  411. { Element.undoClipping(effect.element); }
  412. }, arguments[1] || {})
  413. );
  414. }
  415. Effect.SlideUp = function(element) {
  416. element = $(element);
  417. Element.makeClipping(element);
  418. Element.cleanWhitespace(element);
  419. Element.makePositioned(element.firstChild);
  420. Element.show(element);
  421. return new Effect.Scale(element, 0,
  422. Object.extend({ scaleContent: false,
  423. scaleX: false,
  424. afterUpdate: function(effect)
  425. { effect.element.firstChild.style.bottom =
  426. (effect.originalHeight - effect.element.clientHeight) + 'px'; },
  427. afterFinish: function(effect)
  428. {
  429. Element.hide(effect.element);
  430. Element.undoClipping(effect.element);
  431. }
  432. }, arguments[1] || {})
  433. );
  434. }
  435. Effect.Squish = function(element) {
  436. return new Effect.Scale(element, 0,
  437. { afterFinish: function(effect) { Element.hide(effect.element); } });
  438. }
  439. Effect.Grow = function(element) {
  440. element = $(element);
  441. var options = arguments[1] || {};
  442. var originalWidth = element.clientWidth;
  443. var originalHeight = element.clientHeight;
  444. element.style.overflow = 'hidden';
  445. Element.show(element);
  446. var direction = options.direction || 'center';
  447. var moveTransition = options.moveTransition || Effect.Transitions.sinoidal;
  448. var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal;
  449. var opacityTransition = options.opacityTransition || Effect.Transitions.full;
  450. var initialMoveX, initialMoveY;
  451. var moveX, moveY;
  452. switch (direction) {
  453. case 'top-left':
  454. initialMoveX = initialMoveY = moveX = moveY = 0;
  455. break;
  456. case 'top-right':
  457. initialMoveX = originalWidth;
  458. initialMoveY = moveY = 0;
  459. moveX = -originalWidth;
  460. break;
  461. case 'bottom-left':
  462. initialMoveX = moveX = 0;
  463. initialMoveY = originalHeight;
  464. moveY = -originalHeight;
  465. break;
  466. case 'bottom-right':
  467. initialMoveX = originalWidth;
  468. initialMoveY = originalHeight;
  469. moveX = -originalWidth;
  470. moveY = -originalHeight;
  471. break;
  472. case 'center':
  473. initialMoveX = originalWidth / 2;
  474. initialMoveY = originalHeight / 2;
  475. moveX = -originalWidth / 2;
  476. moveY = -originalHeight / 2;
  477. break;
  478. }
  479. return new Effect.MoveBy(element, initialMoveY, initialMoveX, {
  480. duration: 0.01,
  481. beforeUpdate: function(effect) { $(element).style.height = '0px'; },
  482. afterFinish: function(effect) {
  483. new Effect.Parallel(
  484. [ new Effect.Opacity(element, { sync: true, to: 1.0, from: 0.0, transition: opacityTransition }),
  485. new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: moveTransition }),
  486. new Effect.Scale(element, 100, {
  487. scaleMode: { originalHeight: originalHeight, originalWidth: originalWidth },
  488. sync: true, scaleFrom: 0, scaleTo: 100, transition: scaleTransition })],
  489. options); }
  490. });
  491. }
  492. Effect.Shrink = function(element) {
  493. element = $(element);
  494. var options = arguments[1] || {};
  495. var originalWidth = element.clientWidth;
  496. var originalHeight = element.clientHeight;
  497. element.style.overflow = 'hidden';
  498. Element.show(element);
  499. var direction = options.direction || 'center';
  500. var moveTransition = options.moveTransition || Effect.Transitions.sinoidal;
  501. var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal;
  502. var opacityTransition = options.opacityTransition || Effect.Transitions.none;
  503. var moveX, moveY;
  504. switch (direction) {
  505. case 'top-left':
  506. moveX = moveY = 0;
  507. break;
  508. case 'top-right':
  509. moveX = originalWidth;
  510. moveY = 0;
  511. break;
  512. case 'bottom-left':
  513. moveX = 0;
  514. moveY = originalHeight;
  515. break;
  516. case 'bottom-right':
  517. moveX = originalWidth;
  518. moveY = originalHeight;
  519. break;
  520. case 'center':
  521. moveX = originalWidth / 2;
  522. moveY = originalHeight / 2;
  523. break;
  524. }
  525. return new Effect.Parallel(
  526. [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: opacityTransition }),
  527. new Effect.Scale(element, 0, { sync: true, transition: moveTransition }),
  528. new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: scaleTransition }) ],
  529. options);
  530. }
  531. Effect.Pulsate = function(element) {
  532. var options = arguments[1] || {};
  533. var transition = options.transition || Effect.Transitions.sinoidal;
  534. var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
  535. reverser.bind(transition);
  536. return new Effect.Opacity(element,
  537. Object.extend(Object.extend({ duration: 3.0,
  538. afterFinish: function(effect) { Element.show(effect.element); }
  539. }, options), {transition: reverser}));
  540. }
  541. Effect.Fold = function(element) {
  542. $(element).style.overflow = 'hidden';
  543. return new Effect.Scale(element, 5, Object.extend({
  544. scaleContent: false,
  545. scaleTo: 100,
  546. scaleX: false,
  547. afterFinish: function(effect) {
  548. new Effect.Scale(element, 1, {
  549. scaleContent: false,
  550. scaleTo: 0,
  551. scaleY: false,
  552. afterFinish: function(effect) { Element.hide(effect.element) } });
  553. }}, arguments[1] || {}));
  554. }
  555. // old: new Effect.ContentZoom(element, percent)
  556. // new: Element.setContentZoom(element, percent)
  557. Element.setContentZoom = function(element, percent) {
  558. var element = $(element);
  559. element.style.fontSize = (percent/100) + "em";
  560. if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  561. }