diff options
Diffstat (limited to 'framework/Web/Javascripts/js/effects.js')
-rw-r--r-- | framework/Web/Javascripts/js/effects.js | 921 |
1 files changed, 66 insertions, 855 deletions
diff --git a/framework/Web/Javascripts/js/effects.js b/framework/Web/Javascripts/js/effects.js index 24aea4f9..14d659b7 100644 --- a/framework/Web/Javascripts/js/effects.js +++ b/framework/Web/Javascripts/js/effects.js @@ -1,855 +1,66 @@ - -String.prototype.parseColor = function() { -var color = '#'; -if(this.slice(0,4) == 'rgb(') { -var cols = this.slice(4,this.length-1).split(','); -var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); -} else { -if(this.slice(0,1) == '#') { -if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); -if(this.length==7) color = this.toLowerCase(); -} -} -return(color.length==7 ? color : (arguments[0] || this)); -} -Element.collectTextNodes = function(element) { -return $A($(element).childNodes).collect( function(node) { -return (node.nodeType==3 ? node.nodeValue : -(node.hasChildNodes() ? Element.collectTextNodes(node) : '')); -}).flatten().join(''); -} -Element.collectTextNodesIgnoreClass = function(element, className) { -return $A($(element).childNodes).collect( function(node) { -return (node.nodeType==3 ? node.nodeValue : -((node.hasChildNodes() && !Element.hasClassName(node,className)) ? -Element.collectTextNodesIgnoreClass(node, className) : '')); -}).flatten().join(''); -} -Element.setContentZoom = function(element, percent) { -element = $(element); -Element.setStyle(element, {fontSize: (percent/100) + 'em'}); -if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); -} -Element.getOpacity = function(element){ -var opacity; -if (opacity = Element.getStyle(element, 'opacity')) -return parseFloat(opacity); -if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) -if(opacity[1]) return parseFloat(opacity[1]) / 100; -return 1.0; -} -Element.setOpacity = function(element, value){ -element= $(element); -if (value == 1){ -Element.setStyle(element, { opacity: -(/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? -0.999999 : null }); -if(/MSIE/.test(navigator.userAgent)) -Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); -} else { -if(value < 0.00001) value = 0; -Element.setStyle(element, {opacity: value}); -if(/MSIE/.test(navigator.userAgent)) - Element.setStyle(element, - { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + - 'alpha(opacity='+value*100+')' }); -} -} -Element.getInlineOpacity = function(element){ -return $(element).style.opacity || ''; -} -Element.childrenWithClassName = function(element, className, findFirst) { -var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)"); -var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { -return (c.className && c.className.match(classNameRegExp)); -}); -if(!results) results = []; -return results; -} -Element.forceRerendering = function(element) { -try { -element = $(element); -var n = document.createTextNode(' '); -element.appendChild(n); -element.removeChild(n); -} catch(e) { } -}; -Array.prototype.call = function() { -var args = arguments; -this.each(function(f){ f.apply(this, args) }); -} -var Effect = { -tagifyText: function(element) { -var tagifyStyle = 'position:relative'; -if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; -element = $(element); -$A(element.childNodes).each( function(child) { -if(child.nodeType==3) { -child.nodeValue.toArray().each( function(character) { -element.insertBefore( -Builder.node('span',{style: tagifyStyle}, -character == ' ' ? String.fromCharCode(160) : character), -child); -}); -Element.remove(child); -} -}); -}, -multiple: function(element, effect) { -var elements; -if(((typeof element == 'object') || -(typeof element == 'function')) && - (element.length)) -elements = element; -else -elements = $(element).childNodes; -var options = Object.extend({ -speed: 0.1, -delay: 0.0 -}, arguments[2] || {}); -var masterDelay = options.delay; -$A(elements).each( function(element, index) { -new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); -}); -}, -PAIRS: { -'slide':['SlideDown','SlideUp'], -'blind':['BlindDown','BlindUp'], -'appear': ['Appear','Fade'] -}, -toggle: function(element, effect) { -element = $(element); -effect = (effect || 'appear').toLowerCase(); -var options = Object.extend({ -queue: { position:'end', scope:(element.id || 'global'), limit: 1 } -}, arguments[2] || {}); -Effect[element.visible() ? -Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); -} -}; -var Effect2 = Effect; -Effect.Transitions = {} -Effect.Transitions.linear = function(pos) { -return pos; -} -Effect.Transitions.sinoidal = function(pos) { -return (-Math.cos(pos*Math.PI)/2) + 0.5; -} -Effect.Transitions.reverse= function(pos) { -return 1-pos; -} -Effect.Transitions.flicker = function(pos) { -return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; -} -Effect.Transitions.wobble = function(pos) { -return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; -} -Effect.Transitions.pulse = function(pos) { -return (Math.floor(pos*10) % 2 == 0 ? -(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); -} -Effect.Transitions.none = function(pos) { -return 0; -} -Effect.Transitions.full = function(pos) { -return 1; -} -Effect.ScopedQueue = Class.create(); -Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { -initialize: function() { -this.effects= []; -this.interval = null; -}, -_each: function(iterator) { -this.effects._each(iterator); -}, -add: function(effect) { -var timestamp = new Date().getTime(); -var position = (typeof effect.options.queue == 'string') ? -effect.options.queue : effect.options.queue.position; -switch(position) { -case 'front': - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { -e.startOn+= effect.finishOn; -e.finishOn += effect.finishOn; -}); -break; -case 'end': - timestamp = this.effects.pluck('finishOn').max() || timestamp; -break; -} -effect.startOn+= timestamp; -effect.finishOn += timestamp; -if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) -this.effects.push(effect); -if(!this.interval) -this.interval = setInterval(this.loop.bind(this), 40); -}, -remove: function(effect) { -this.effects = this.effects.reject(function(e) { return e==effect }); -if(this.effects.length == 0) { -clearInterval(this.interval); -this.interval = null; -} -}, -loop: function() { -var timePos = new Date().getTime(); -this.effects.invoke('loop', timePos); -} -}); -Effect.Queues = { -instances: $H(), -get: function(queueName) { -if(typeof queueName != 'string') return queueName; -if(!this.instances[queueName]) -this.instances[queueName] = new Effect.ScopedQueue(); -return this.instances[queueName]; -} -} -Effect.Queue = Effect.Queues.get('global'); -Effect.DefaultOptions = { -transition: Effect.Transitions.sinoidal, -duration: 1.0,fps:25.0, sync: false,from: 0.0, -to: 1.0, -delay:0.0, -queue:'parallel' -} -Effect.Base = function() {}; -Effect.Base.prototype = { -position: null, -start: function(options) { -this.options= Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); -this.currentFrame = 0; -this.state= 'idle'; -this.startOn= this.options.delay*1000; -this.finishOn = this.startOn + (this.options.duration*1000); -this.event('beforeStart'); -if(!this.options.sync) -Effect.Queues.get(typeof this.options.queue == 'string' ? -'global' : this.options.queue.scope).add(this); -}, -loop: function(timePos) { -if(timePos >= this.startOn) { -if(timePos >= this.finishOn) { -this.render(1.0); -this.cancel(); -this.event('beforeFinish'); -if(this.finish) this.finish(); -this.event('afterFinish'); -return; -} -var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); -var frame = Math.round(pos * this.options.fps * this.options.duration); -if(frame > this.currentFrame) { -this.render(pos); -this.currentFrame = frame; -} -} -}, -render: function(pos) { -if(this.state == 'idle') { -this.state = 'running'; -this.event('beforeSetup'); -if(this.setup) this.setup(); -this.event('afterSetup'); -} -if(this.state == 'running') { -if(this.options.transition) pos = this.options.transition(pos); -pos *= (this.options.to-this.options.from); -pos += this.options.from; -this.position = pos; -this.event('beforeUpdate'); -if(this.update) this.update(pos); -this.event('afterUpdate'); -} -}, -cancel: function() { -if(!this.options.sync) -Effect.Queues.get(typeof this.options.queue == 'string' ? -'global' : this.options.queue.scope).remove(this); -this.state = 'finished'; -}, -event: function(eventName) { -if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); -if(this.options[eventName]) this.options[eventName](this); -}, -inspect: function() { -return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>'; -} -} -Effect.Parallel = Class.create(); -Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { -initialize: function(effects) { -this.effects = effects || []; -this.start(arguments[1]); -}, -update: function(position) { -this.effects.invoke('render', position); -}, -finish: function(position) { -this.effects.each( function(effect) { -effect.render(1.0); -effect.cancel(); -effect.event('beforeFinish'); -if(effect.finish) effect.finish(position); -effect.event('afterFinish'); -}); -} -}); -Effect.Opacity = Class.create(); -Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { -initialize: function(element) { -this.element = $(element); - if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) -this.element.setStyle({zoom: 1}); -var options = Object.extend({ -from: this.element.getOpacity() || 0.0, -to: 1.0 -}, arguments[1] || {}); -this.start(options); -}, -update: function(position) { -this.element.setOpacity(position); -} -}); -Effect.Move = Class.create(); -Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { -initialize: function(element) { -this.element = $(element); -var options = Object.extend({ -x:0, -y:0, -mode: 'relative' -}, arguments[1] || {}); -this.start(options); -}, -setup: function() { -this.element.makePositioned(); -this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); -this.originalTop= parseFloat(this.element.getStyle('top')|| '0'); -if(this.options.mode == 'absolute') { - this.options.x = this.options.x - this.originalLeft; -this.options.y = this.options.y - this.originalTop; -} -}, -update: function(position) { -this.element.setStyle({ -left: this.options.x* position + this.originalLeft + 'px', -top:this.options.y* position + this.originalTop+ 'px' -}); -} -}); -Effect.MoveBy = function(element, toTop, toLeft) { -return new Effect.Move(element, -Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); -}; -Effect.Scale = Class.create(); -Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { -initialize: function(element, percent) { -this.element = $(element) -var options = Object.extend({ -scaleX: true, -scaleY: true, -scaleContent: true, -scaleFromCenter: false, -scaleMode: 'box', scaleFrom: 100.0, -scaleTo: percent -}, arguments[2] || {}); -this.start(options); -}, -setup: function() { -this.restoreAfterFinish = this.options.restoreAfterFinish || false; -this.elementPositioning = this.element.getStyle('position'); -this.originalStyle = {}; -['top','left','width','height','fontSize'].each( function(k) { -this.originalStyle[k] = this.element.style[k]; -}.bind(this)); -this.originalTop= this.element.offsetTop; -this.originalLeft = this.element.offsetLeft; -var fontSize = this.element.getStyle('font-size') || '100%'; -['em','px','%'].each( function(fontSizeType) { -if(fontSize.indexOf(fontSizeType)>0) { -this.fontSize = parseFloat(fontSize); -this.fontSizeType = fontSizeType; -} -}.bind(this)); -this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; -this.dims = null; -if(this.options.scaleMode=='box') -this.dims = [this.element.offsetHeight, this.element.offsetWidth]; -if(/^content/.test(this.options.scaleMode)) -this.dims = [this.element.scrollHeight, this.element.scrollWidth]; -if(!this.dims) -this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; -}, -update: function(position) { -var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); -if(this.options.scaleContent && this.fontSize) -this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); -this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); -}, -finish: function(position) { -if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); -}, -setDimensions: function(height, width) { -var d = {}; -if(this.options.scaleX) d.width = width + 'px'; -if(this.options.scaleY) d.height = height + 'px'; -if(this.options.scaleFromCenter) { -var topd= (height - this.dims[0])/2; -var leftd = (width- this.dims[1])/2; -if(this.elementPositioning == 'absolute') { -if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; -if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; -} else { -if(this.options.scaleY) d.top = -topd + 'px'; -if(this.options.scaleX) d.left = -leftd + 'px'; -} -} -this.element.setStyle(d); -} -}); -Effect.Highlight = Class.create(); -Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { -initialize: function(element) { -this.element = $(element); -var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); -this.start(options); -}, -setup: function() { - if(this.element.getStyle('display')=='none') { this.cancel(); return; } - this.oldStyle = { -backgroundImage: this.element.getStyle('background-image') }; -this.element.setStyle({backgroundImage: 'none'}); -if(!this.options.endcolor) -this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); -if(!this.options.restorecolor) -this.options.restorecolor = this.element.getStyle('background-color'); - this._base= $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); -this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); -}, -update: function(position) { -this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ -return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); -}, -finish: function() { -this.element.setStyle(Object.extend(this.oldStyle, { -backgroundColor: this.options.restorecolor -})); -} -}); -Effect.ScrollTo = Class.create(); -Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { -initialize: function(element) { -this.element = $(element); -this.start(arguments[1] || {}); -}, -setup: function() { -Position.prepare(); -var offsets = Position.cumulativeOffset(this.element); -if(this.options.offset) offsets[1] += this.options.offset; -var max = window.innerHeight ? -window.height - window.innerHeight : -document.body.scrollHeight - -(document.documentElement.clientHeight ? -document.documentElement.clientHeight : document.body.clientHeight); -this.scrollStart = Position.deltaY; -this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; -}, -update: function(position) { -Position.prepare(); -window.scrollTo(Position.deltaX, -this.scrollStart + (position*this.delta)); -} -}); -Effect.Fade = function(element) { -element = $(element); -var oldOpacity = element.getInlineOpacity(); -var options = Object.extend({ -from: element.getOpacity() || 1.0, -to: 0.0, -afterFinishInternal: function(effect) { -if(effect.options.to!=0) return; -effect.element.hide(); -effect.element.setStyle({opacity: oldOpacity}); -}}, arguments[1] || {}); -return new Effect.Opacity(element,options); -} -Effect.Appear = function(element) { -element = $(element); -var options = Object.extend({ -from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), -to: 1.0, - afterFinishInternal: function(effect) { -effect.element.forceRerendering(); -}, -beforeSetup: function(effect) { -effect.element.setOpacity(effect.options.from); -effect.element.show(); -}}, arguments[1] || {}); -return new Effect.Opacity(element,options); -} -Effect.Puff = function(element) { -element = $(element); -var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; -return new Effect.Parallel( - [ new Effect.Scale(element, 200, -{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, -beforeSetupInternal: function(effect) { -effect.effects[0].element.setStyle({position: 'absolute'}); }, -afterFinishInternal: function(effect) { - effect.effects[0].element.hide(); - effect.effects[0].element.setStyle(oldStyle); } - }, arguments[1] || {}) - ); -} -Effect.BlindUp = function(element) { -element = $(element); -element.makeClipping(); -return new Effect.Scale(element, 0, -Object.extend({ scaleContent: false, -scaleX: false, -restoreAfterFinish: true, -afterFinishInternal: function(effect) { -effect.element.hide(); -effect.element.undoClipping(); -} -}, arguments[1] || {}) -); -} -Effect.BlindDown = function(element) { -element = $(element); -var elementDimensions = element.getDimensions(); -return new Effect.Scale(element, 100, -Object.extend({ scaleContent: false, -scaleX: false, -scaleFrom: 0, -scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, -restoreAfterFinish: true, -afterSetup: function(effect) { -effect.element.makeClipping(); -effect.element.setStyle({height: '0px'}); -effect.element.show(); -}, -afterFinishInternal: function(effect) { -effect.element.undoClipping(); -} -}, arguments[1] || {}) -); -} -Effect.SwitchOff = function(element) { -element = $(element); -var oldOpacity = element.getInlineOpacity(); -return new Effect.Appear(element, { -duration: 0.4, -from: 0, -transition: Effect.Transitions.flicker, -afterFinishInternal: function(effect) { -new Effect.Scale(effect.element, 1, { -duration: 0.3, scaleFromCenter: true, -scaleX: false, scaleContent: false, restoreAfterFinish: true, -beforeSetup: function(effect) { -effect.element.makePositioned(); -effect.element.makeClipping(); -}, -afterFinishInternal: function(effect) { -effect.element.hide(); -effect.element.undoClipping(); -effect.element.undoPositioned(); -effect.element.setStyle({opacity: oldOpacity}); -} -}) -} -}); -} -Effect.DropOut = function(element) { -element = $(element); -var oldStyle = { -top: element.getStyle('top'), -left: element.getStyle('left'), -opacity: element.getInlineOpacity() }; -return new Effect.Parallel( -[ new Effect.Move(element, {x: 0, y: 100, sync: true }), -new Effect.Opacity(element, { sync: true, to: 0.0 }) ], -Object.extend( -{ duration: 0.5, -beforeSetup: function(effect) { -effect.effects[0].element.makePositioned(); -}, -afterFinishInternal: function(effect) { -effect.effects[0].element.hide(); -effect.effects[0].element.undoPositioned(); -effect.effects[0].element.setStyle(oldStyle); -} -}, arguments[1] || {})); -} -Effect.Shake = function(element) { -element = $(element); -var oldStyle = { -top: element.getStyle('top'), -left: element.getStyle('left') }; -return new Effect.Move(element, -{ x:20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { -new Effect.Move(effect.element, -{ x: -40, y: 0, duration: 0.1,afterFinishInternal: function(effect) { -new Effect.Move(effect.element, -{ x:40, y: 0, duration: 0.1,afterFinishInternal: function(effect) { -new Effect.Move(effect.element, -{ x: -40, y: 0, duration: 0.1,afterFinishInternal: function(effect) { -new Effect.Move(effect.element, -{ x:40, y: 0, duration: 0.1,afterFinishInternal: function(effect) { -new Effect.Move(effect.element, -{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { -effect.element.undoPositioned(); -effect.element.setStyle(oldStyle); -}}) }}) }}) }}) }}) }}); -} -Effect.SlideDown = function(element) { -element = $(element); -element.cleanWhitespace(); - var oldInnerBottom = $(element.firstChild).getStyle('bottom'); -var elementDimensions = element.getDimensions(); -return new Effect.Scale(element, 100, Object.extend({ -scaleContent: false, -scaleX: false, -scaleFrom: window.opera ? 0 : 1, -scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, -restoreAfterFinish: true, -afterSetup: function(effect) { -effect.element.makePositioned(); -effect.element.firstChild.makePositioned(); -if(window.opera) effect.element.setStyle({top: ''}); -effect.element.makeClipping(); -effect.element.setStyle({height: '0px'}); -effect.element.show(); }, -afterUpdateInternal: function(effect) { -effect.element.firstChild.setStyle({bottom: -(effect.dims[0] - effect.element.clientHeight) + 'px' }); -}, -afterFinishInternal: function(effect) { -effect.element.undoClipping(); - if(/MSIE/.test(navigator.userAgent)){ -effect.element.undoPositioned(); -effect.element.firstChild.undoPositioned(); -}else{ -effect.element.firstChild.undoPositioned(); -effect.element.undoPositioned(); -} -effect.element.firstChild.setStyle({bottom: oldInnerBottom}); } -}, arguments[1] || {}) -); -} -Effect.SlideUp = function(element) { -element = $(element); -element.cleanWhitespace(); -var oldInnerBottom = $(element.firstChild).getStyle('bottom'); -return new Effect.Scale(element, window.opera ? 0 : 1, - Object.extend({ scaleContent: false, -scaleX: false, -scaleMode: 'box', -scaleFrom: 100, -restoreAfterFinish: true, -beforeStartInternal: function(effect) { -effect.element.makePositioned(); -effect.element.firstChild.makePositioned(); -if(window.opera) effect.element.setStyle({top: ''}); -effect.element.makeClipping(); -effect.element.show(); }, -afterUpdateInternal: function(effect) { -effect.element.firstChild.setStyle({bottom: -(effect.dims[0] - effect.element.clientHeight) + 'px' }); }, -afterFinishInternal: function(effect) { -effect.element.hide(); -effect.element.undoClipping(); -effect.element.firstChild.undoPositioned(); -effect.element.undoPositioned(); -effect.element.setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || {}) -); -} -Effect.Squish = function(element) { -return new Effect.Scale(element, window.opera ? 1 : 0, -{ restoreAfterFinish: true, -beforeSetup: function(effect) { -effect.element.makeClipping(effect.element); }, -afterFinishInternal: function(effect) { -effect.element.hide(effect.element); -effect.element.undoClipping(effect.element); } -}); -} -Effect.Grow = function(element) { -element = $(element); -var options = Object.extend({ -direction: 'center', -moveTransition: Effect.Transitions.sinoidal, -scaleTransition: Effect.Transitions.sinoidal, -opacityTransition: Effect.Transitions.full -}, arguments[1] || {}); -var oldStyle = { -top: element.style.top, -left: element.style.left, -height: element.style.height, -width: element.style.width, -opacity: element.getInlineOpacity() }; -var dims = element.getDimensions(); -var initialMoveX, initialMoveY; -var moveX, moveY; -switch (options.direction) { -case 'top-left': -initialMoveX = initialMoveY = moveX = moveY = 0; -break; -case 'top-right': -initialMoveX = dims.width; -initialMoveY = moveY = 0; -moveX = -dims.width; -break; -case 'bottom-left': -initialMoveX = moveX = 0; -initialMoveY = dims.height; -moveY = -dims.height; -break; -case 'bottom-right': -initialMoveX = dims.width; -initialMoveY = dims.height; -moveX = -dims.width; -moveY = -dims.height; -break; -case 'center': -initialMoveX = dims.width / 2; -initialMoveY = dims.height / 2; -moveX = -dims.width / 2; -moveY = -dims.height / 2; -break; -} -return new Effect.Move(element, { -x: initialMoveX, -y: initialMoveY, -duration: 0.01, -beforeSetup: function(effect) { -effect.element.hide(); -effect.element.makeClipping(); -effect.element.makePositioned(); -}, -afterFinishInternal: function(effect) { -new Effect.Parallel( -[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), -new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), -new Effect.Scale(effect.element, 100, { -scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, -sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) -], Object.extend({ - beforeSetup: function(effect) { - effect.effects[0].element.setStyle({height: '0px'}); - effect.effects[0].element.show(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.undoClipping(); - effect.effects[0].element.undoPositioned(); - effect.effects[0].element.setStyle(oldStyle); - } - }, options) -) -} -}); -} -Effect.Shrink = function(element) { -element = $(element); -var options = Object.extend({ -direction: 'center', -moveTransition: Effect.Transitions.sinoidal, -scaleTransition: Effect.Transitions.sinoidal, -opacityTransition: Effect.Transitions.none -}, arguments[1] || {}); -var oldStyle = { -top: element.style.top, -left: element.style.left, -height: element.style.height, -width: element.style.width, -opacity: element.getInlineOpacity() }; -var dims = element.getDimensions(); -var moveX, moveY; -switch (options.direction) { -case 'top-left': -moveX = moveY = 0; -break; -case 'top-right': -moveX = dims.width; -moveY = 0; -break; -case 'bottom-left': -moveX = 0; -moveY = dims.height; -break; -case 'bottom-right': -moveX = dims.width; -moveY = dims.height; -break; -case 'center': -moveX = dims.width / 2; -moveY = dims.height / 2; -break; -} -return new Effect.Parallel( -[ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), -new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), -new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) -], Object.extend({ - beforeStartInternal: function(effect) { - effect.effects[0].element.makePositioned(); - effect.effects[0].element.makeClipping(); }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide(); - effect.effects[0].element.undoClipping(); - effect.effects[0].element.undoPositioned(); - effect.effects[0].element.setStyle(oldStyle); } - }, options) -); -} -Effect.Pulsate = function(element) { -element = $(element); -var options= arguments[1] || {}; -var oldOpacity = element.getInlineOpacity(); -var transition = options.transition || Effect.Transitions.sinoidal; -var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; -reverser.bind(transition); -return new Effect.Opacity(element, -Object.extend(Object.extend({duration: 3.0, from: 0, -afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } -}, options), {transition: reverser})); -} -Effect.Fold = function(element) { -element = $(element); -var oldStyle = { -top: element.style.top, -left: element.style.left, -width: element.style.width, -height: element.style.height }; -Element.makeClipping(element); -return new Effect.Scale(element, 5, Object.extend({ -scaleContent: false, -scaleX: false, -afterFinishInternal: function(effect) { -new Effect.Scale(element, 1, { -scaleContent: false, -scaleY: false, -afterFinishInternal: function(effect) { -effect.element.hide(); -effect.element.undoClipping(); -effect.element.setStyle(oldStyle); -} }); -}}, arguments[1] || {})); -}; -['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', - 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( -function(f) { Element.Methods[f] = Element[f]; } -); -Element.Methods.visualEffect = function(element, effect, options) { -s = effect.gsub(/_/, '-').camelize(); -effect_class = s.charAt(0).toUpperCase() + s.substring(1); -new Effect[effect_class](element, options); -return $(element); -}; -Element.addMethods(); + +String.prototype.parseColor=function(){var color='#';if(this.slice(0,4)=='rgb('){var cols=this.slice(4,this.length-1).split(',');var i=0;do{color+=parseInt(cols[i]).toColorPart()}while(++i<3);}else{if(this.slice(0,1)=='#'){if(this.length==4)for(var i=1;i<4;i++)color+=(this.charAt(i)+this.charAt(i)).toLowerCase();if(this.length==7)color=this.toLowerCase();}} +return(color.length==7?color:(arguments[0]||this));} +Element.collectTextNodes=function(element){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:(node.hasChildNodes()?Element.collectTextNodes(node):''));}).flatten().join('');} +Element.collectTextNodesIgnoreClass=function(element,className){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:((node.hasChildNodes()&&!Element.hasClassName(node,className))?Element.collectTextNodesIgnoreClass(node,className):''));}).flatten().join('');} +Element.setContentZoom=function(element,percent){element=$(element);Element.setStyle(element,{fontSize:(percent/100)+'em'});if(navigator.appVersion.indexOf('AppleWebKit')>0)window.scrollBy(0,0);} +Element.getOpacity=function(element){var opacity;if(opacity=Element.getStyle(element,'opacity')) +return parseFloat(opacity);if(opacity=(Element.getStyle(element,'filter')||'').match(/alpha\(opacity=(.*)\)/)) +if(opacity[1])return parseFloat(opacity[1])/100;return 1.0;} +Element.setOpacity=function(element,value){element=$(element);if(value==1){Element.setStyle(element,{opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?0.999999:null});if(/MSIE/.test(navigator.userAgent)) +Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});}else{if(value<0.00001)value=0;Element.setStyle(element,{opacity:value});if(/MSIE/.test(navigator.userAgent)) +Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')+'alpha(opacity='+value*100+')'});}} +Element.getInlineOpacity=function(element){return $(element).style.opacity||'';} +Element.childrenWithClassName=function(element,className,findFirst){var classNameRegExp=new RegExp("(^|\\s)"+className+"(\\s|$)");var results=$A($(element).getElementsByTagName('*'))[findFirst?'detect':'select'](function(c){return(c.className&&c.className.match(classNameRegExp));});if(!results)results=[];return results;} +Element.forceRerendering=function(element){try{element=$(element);var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n);}catch(e){}};Array.prototype.call=function(){var args=arguments;this.each(function(f){f.apply(this,args)});} +var Effect={tagifyText:function(element){var tagifyStyle='position:relative';if(/MSIE/.test(navigator.userAgent))tagifyStyle+=';zoom:1';element=$(element);$A(element.childNodes).each(function(child){if(child.nodeType==3){child.nodeValue.toArray().each(function(character){element.insertBefore(Builder.node('span',{style:tagifyStyle},character==' '?String.fromCharCode(160):character),child);});Element.remove(child);}});},multiple:function(element,effect){var elements;if(((typeof element=='object')||(typeof element=='function'))&&(element.length)) +elements=element;else +elements=$(element).childNodes;var options=Object.extend({speed:0.1,delay:0.0},arguments[2]||{});var masterDelay=options.delay;$A(elements).each(function(element,index){new effect(element,Object.extend(options,{delay:index*options.speed+masterDelay}));});},PAIRS:{'slide':['SlideDown','SlideUp'],'blind':['BlindDown','BlindUp'],'appear':['Appear','Fade']},toggle:function(element,effect){element=$(element);effect=(effect||'appear').toLowerCase();var options=Object.extend({queue:{position:'end',scope:(element.id||'global'),limit:1}},arguments[2]||{});Effect[element.visible()?Effect.PAIRS[effect][1]:Effect.PAIRS[effect][0]](element,options);}};var Effect2=Effect;Effect.Transitions={} +Effect.Transitions.linear=function(pos){return pos;} +Effect.Transitions.sinoidal=function(pos){return(-Math.cos(pos*Math.PI)/2)+0.5;} +Effect.Transitions.reverse=function(pos){return 1-pos;} +Effect.Transitions.flicker=function(pos){return((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;} +Effect.Transitions.wobble=function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;} +Effect.Transitions.pulse=function(pos){return(Math.floor(pos*10)%2==0?(pos*10-Math.floor(pos*10)):1-(pos*10-Math.floor(pos*10)));} +Effect.Transitions.none=function(pos){return 0;} +Effect.Transitions.full=function(pos){return 1;} +Effect.ScopedQueue=Class.create();Object.extend(Object.extend(Effect.ScopedQueue.prototype,Enumerable),{initialize:function(){this.effects=[];this.interval=null;},_each:function(iterator){this.effects._each(iterator);},add:function(effect){var timestamp=new Date().getTime();var position=(typeof effect.options.queue=='string')?effect.options.queue:effect.options.queue.position;switch(position){case'front':this.effects.findAll(function(e){return e.state=='idle'}).each(function(e){e.startOn+=effect.finishOn;e.finishOn+=effect.finishOn;});break;case'end':timestamp=this.effects.pluck('finishOn').max()||timestamp;break;} +effect.startOn+=timestamp;effect.finishOn+=timestamp;if(!effect.options.queue.limit||(this.effects.length<effect.options.queue.limit)) +this.effects.push(effect);if(!this.interval) +this.interval=setInterval(this.loop.bind(this),40);},remove:function(effect){this.effects=this.effects.reject(function(e){return e==effect});if(this.effects.length==0){clearInterval(this.interval);this.interval=null;}},loop:function(){var timePos=new Date().getTime();this.effects.invoke('loop',timePos);}});Effect.Queues={instances:$H(),get:function(queueName){if(typeof queueName!='string')return queueName;if(!this.instances[queueName]) +this.instances[queueName]=new Effect.ScopedQueue();return this.instances[queueName];}} +Effect.Queue=Effect.Queues.get('global');Effect.DefaultOptions={transition:Effect.Transitions.sinoidal,duration:1.0,fps:25.0,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'} +Effect.Base=function(){};Effect.Base.prototype={position:null,start:function(options){this.options=Object.extend(Object.extend({},Effect.DefaultOptions),options||{});this.currentFrame=0;this.state='idle';this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.event('beforeStart');if(!this.options.sync) +Effect.Queues.get(typeof this.options.queue=='string'?'global':this.options.queue.scope).add(this);},loop:function(timePos){if(timePos>=this.startOn){if(timePos>=this.finishOn){this.render(1.0);this.cancel();this.event('beforeFinish');if(this.finish)this.finish();this.event('afterFinish');return;} +var pos=(timePos-this.startOn)/(this.finishOn-this.startOn);var frame=Math.round(pos*this.options.fps*this.options.duration);if(frame>this.currentFrame){this.render(pos);this.currentFrame=frame;}}},render:function(pos){if(this.state=='idle'){this.state='running';this.event('beforeSetup');if(this.setup)this.setup();this.event('afterSetup');} +if(this.state=='running'){if(this.options.transition)pos=this.options.transition(pos);pos*=(this.options.to-this.options.from);pos+=this.options.from;this.position=pos;this.event('beforeUpdate');if(this.update)this.update(pos);this.event('afterUpdate');}},cancel:function(){if(!this.options.sync) +Effect.Queues.get(typeof this.options.queue=='string'?'global':this.options.queue.scope).remove(this);this.state='finished';},event:function(eventName){if(this.options[eventName+'Internal'])this.options[eventName+'Internal'](this);if(this.options[eventName])this.options[eventName](this);},inspect:function(){return'#<Effect:'+$H(this).inspect()+',options:'+$H(this.options).inspect()+'>';}} +Effect.Parallel=Class.create();Object.extend(Object.extend(Effect.Parallel.prototype,Effect.Base.prototype),{initialize:function(effects){this.effects=effects||[];this.start(arguments[1]);},update:function(position){this.effects.invoke('render',position);},finish:function(position){this.effects.each(function(effect){effect.render(1.0);effect.cancel();effect.event('beforeFinish');if(effect.finish)effect.finish(position);effect.event('afterFinish');});}});Effect.Opacity=Class.create();Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);if(/MSIE/.test(navigator.userAgent)&&(!this.element.hasLayout)) +this.element.setStyle({zoom:1});var options=Object.extend({from:this.element.getOpacity()||0.0,to:1.0},arguments[1]||{});this.start(options);},update:function(position){this.element.setOpacity(position);}});Effect.Move=Class.create();Object.extend(Object.extend(Effect.Move.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({x:0,y:0,mode:'relative'},arguments[1]||{});this.start(options);},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle('left')||'0');this.originalTop=parseFloat(this.element.getStyle('top')||'0');if(this.options.mode=='absolute'){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop;}},update:function(position){this.element.setStyle({left:this.options.x*position+this.originalLeft+'px',top:this.options.y*position+this.originalTop+'px'});}});Effect.MoveBy=function(element,toTop,toLeft){return new Effect.Move(element,Object.extend({x:toLeft,y:toTop},arguments[3]||{}));};Effect.Scale=Class.create();Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{initialize:function(element,percent){this.element=$(element) +var options=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:'box',scaleFrom:100.0,scaleTo:percent},arguments[2]||{});this.start(options);},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle('position');this.originalStyle={};['top','left','width','height','fontSize'].each(function(k){this.originalStyle[k]=this.element.style[k];}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var fontSize=this.element.getStyle('font-size')||'100%';['em','px','%'].each(function(fontSizeType){if(fontSize.indexOf(fontSizeType)>0){this.fontSize=parseFloat(fontSize);this.fontSizeType=fontSizeType;}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=='box') +this.dims=[this.element.offsetHeight,this.element.offsetWidth];if(/^content/.test(this.options.scaleMode)) +this.dims=[this.element.scrollHeight,this.element.scrollWidth];if(!this.dims) +this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];},update:function(position){var currentScale=(this.options.scaleFrom/100.0)+(this.factor*position);if(this.options.scaleContent&&this.fontSize) +this.element.setStyle({fontSize:this.fontSize*currentScale+this.fontSizeType});this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale);},finish:function(position){if(this.restoreAfterFinish)this.element.setStyle(this.originalStyle);},setDimensions:function(height,width){var d={};if(this.options.scaleX)d.width=width+'px';if(this.options.scaleY)d.height=height+'px';if(this.options.scaleFromCenter){var topd=(height-this.dims[0])/2;var leftd=(width-this.dims[1])/2;if(this.elementPositioning=='absolute'){if(this.options.scaleY)d.top=this.originalTop-topd+'px';if(this.options.scaleX)d.left=this.originalLeft-leftd+'px';}else{if(this.options.scaleY)d.top=-topd+'px';if(this.options.scaleX)d.left=-leftd+'px';}} +this.element.setStyle(d);}});Effect.Highlight=Class.create();Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options);},setup:function(){if(this.element.getStyle('display')=='none'){this.cancel();return;} +this.oldStyle={backgroundImage:this.element.getStyle('background-image')};this.element.setStyle({backgroundImage:'none'});if(!this.options.endcolor) +this.options.endcolor=this.element.getStyle('background-color').parseColor('#ffffff');if(!this.options.restorecolor) +this.options.restorecolor=this.element.getStyle('background-color');this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]}.bind(this));},update:function(position){this.element.setStyle({backgroundColor:$R(0,2).inject('#',function(m,v,i){return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart());}.bind(this))});},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));}});Effect.ScrollTo=Class.create();Object.extend(Object.extend(Effect.ScrollTo.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);this.start(arguments[1]||{});},setup:function(){Position.prepare();var offsets=Position.cumulativeOffset(this.element);if(this.options.offset)offsets[1]+=this.options.offset;var max=window.innerHeight?window.height-window.innerHeight:document.body.scrollHeight- +(document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight);this.scrollStart=Position.deltaY;this.delta=(offsets[1]>max?max:offsets[1])-this.scrollStart;},update:function(position){Position.prepare();window.scrollTo(Position.deltaX,this.scrollStart+(position*this.delta));}});Effect.Fade=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();var options=Object.extend({from:element.getOpacity()||1.0,to:0.0,afterFinishInternal:function(effect){if(effect.options.to!=0)return;effect.element.hide();effect.element.setStyle({opacity:oldOpacity});}},arguments[1]||{});return new Effect.Opacity(element,options);} +Effect.Appear=function(element){element=$(element);var options=Object.extend({from:(element.getStyle('display')=='none'?0.0:element.getOpacity()||0.0),to:1.0,afterFinishInternal:function(effect){effect.element.forceRerendering();},beforeSetup:function(effect){effect.element.setOpacity(effect.options.from);effect.element.show();}},arguments[1]||{});return new Effect.Opacity(element,options);} +Effect.Puff=function(element){element=$(element);var oldStyle={opacity:element.getInlineOpacity(),position:element.getStyle('position')};return new Effect.Parallel([new Effect.Scale(element,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:1.0,beforeSetupInternal:function(effect){effect.effects[0].element.setStyle({position:'absolute'});},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.setStyle(oldStyle);}},arguments[1]||{}));} +Effect.BlindUp=function(element){element=$(element);element.makeClipping();return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();}},arguments[1]||{}));} +Effect.BlindDown=function(element){element=$(element);var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makeClipping();effect.element.setStyle({height:'0px'});effect.element.show();},afterFinishInternal:function(effect){effect.element.undoClipping();}},arguments[1]||{}));} +Effect.SwitchOff=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();return new Effect.Appear(element,{duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(effect){new Effect.Scale(effect.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makePositioned();effect.element.makeClipping();},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.undoPositioned();effect.element.setStyle({opacity:oldOpacity});}})}});} +Effect.DropOut=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left'),opacity:element.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(element,{x:0,y:100,sync:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:0.5,beforeSetup:function(effect){effect.effects[0].element.makePositioned();},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},arguments[1]||{}));} +Effect.Shake=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left')};return new Effect.Move(element,{x:20,y:0,duration:0.05,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-20,y:0,duration:0.05,afterFinishInternal:function(effect){effect.element.undoPositioned();effect.element.setStyle(oldStyle);}})}})}})}})}})}});} +Effect.SlideDown=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.setStyle({height:'0px'});effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.undoClipping();if(/MSIE/.test(navigator.userAgent)){effect.element.undoPositioned();effect.element.firstChild.undoPositioned();}else{effect.element.firstChild.undoPositioned();effect.element.undoPositioned();} +effect.element.firstChild.setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));} +Effect.SlideUp=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');return new Effect.Scale(element,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(effect){effect.element.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.firstChild.undoPositioned();effect.element.undoPositioned();effect.element.setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));} +Effect.Squish=function(element){return new Effect.Scale(element,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makeClipping(effect.element);},afterFinishInternal:function(effect){effect.element.hide(effect.element);effect.element.undoClipping(effect.element);}});} +Effect.Grow=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var initialMoveX,initialMoveY;var moveX,moveY;switch(options.direction){case'top-left':initialMoveX=initialMoveY=moveX=moveY=0;break;case'top-right':initialMoveX=dims.width;initialMoveY=moveY=0;moveX=-dims.width;break;case'bottom-left':initialMoveX=moveX=0;initialMoveY=dims.height;moveY=-dims.height;break;case'bottom-right':initialMoveX=dims.width;initialMoveY=dims.height;moveX=-dims.width;moveY=-dims.height;break;case'center':initialMoveX=dims.width/2;initialMoveY=dims.height/2;moveX=-dims.width/2;moveY=-dims.height/2;break;} +return new Effect.Move(element,{x:initialMoveX,y:initialMoveY,duration:0.01,beforeSetup:function(effect){effect.element.hide();effect.element.makeClipping();effect.element.makePositioned();},afterFinishInternal:function(effect){new Effect.Parallel([new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}),new Effect.Move(effect.element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}),new Effect.Scale(effect.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:options.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(effect){effect.effects[0].element.setStyle({height:'0px'});effect.effects[0].element.show();},afterFinishInternal:function(effect){effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},options))}});} +Effect.Shrink=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var moveX,moveY;switch(options.direction){case'top-left':moveX=moveY=0;break;case'top-right':moveX=dims.width;moveY=0;break;case'bottom-left':moveX=0;moveY=dims.height;break;case'bottom-right':moveX=dims.width;moveY=dims.height;break;case'center':moveX=dims.width/2;moveY=dims.height/2;break;} +return new Effect.Parallel([new Effect.Opacity(element,{sync:true,to:0.0,from:1.0,transition:options.opacityTransition}),new Effect.Scale(element,window.opera?1:0,{sync:true,transition:options.scaleTransition,restoreAfterFinish:true}),new Effect.Move(element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition})],Object.extend({beforeStartInternal:function(effect){effect.effects[0].element.makePositioned();effect.effects[0].element.makeClipping();},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},options));} +Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{};var oldOpacity=element.getInlineOpacity();var transition=options.transition||Effect.Transitions.sinoidal;var reverser=function(pos){return transition(1-Effect.Transitions.pulse(pos))};reverser.bind(transition);return new Effect.Opacity(element,Object.extend(Object.extend({duration:3.0,from:0,afterFinishInternal:function(effect){effect.element.setStyle({opacity:oldOpacity});}},options),{transition:reverser}));} +Effect.Fold=function(element){element=$(element);var oldStyle={top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};Element.makeClipping(element);return new Effect.Scale(element,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(effect){new Effect.Scale(element,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.setStyle(oldStyle);}});}},arguments[1]||{}));};['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom','collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(function(f){Element.Methods[f]=Element[f];});Element.Methods.visualEffect=function(element,effect,options){s=effect.gsub(/_/,'-').camelize();effect_class=s.charAt(0).toUpperCase()+s.substring(1);new Effect[effect_class](element,options);return $(element);};Element.addMethods();
\ No newline at end of file |