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.collectTextNodes(node):''));
}).flatten().join('');
}
Element.setStyle=function(element,style){
element=$(element);
for(k in style)element.style[k.camelize()]=style[k];
}
Element.setContentZoom=function(element,percent){
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){
return $A($(element).getElementsByTagName('*')).select(
function(c){return Element.hasClassName(c,className)});
}
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')}
},arguments[2]||{});
Effect[Element.visible(element)?
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;
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))
Element.setStyle(this.element,{zoom:1});
var options=Object.extend({
from:Element.getOpacity(this.element)||0.0,
to:1.0
},arguments[1]||{});
this.start(options);
},
update:function(position){
Element.setOpacity(this.element,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(){
Element.makePositioned(this.element);
this.originalLeft=parseFloat(Element.getStyle(this.element,'left')||'0');
this.originalTop=parseFloat(Element.getStyle(this.element,'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){
Element.setStyle(this.element,{
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=Element.getStyle(this.element,'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=Element.getStyle(this.element,'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)
Element.setStyle(this.element,{fontSize:this.fontSize*currentScale+this.fontSizeType});
this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale);
},
finish:function(position){
if(this.restoreAfterFinish)Element.setStyle(this.element,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';
}
}
Element.setStyle(this.element,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(Element.getStyle(this.element,'display')=='none'){this.cancel();return;}
this.oldStyle={
backgroundImage:Element.getStyle(this.element,'background-image')};
Element.setStyle(this.element,{backgroundImage:'none'});
if(!this.options.endcolor)
this.options.endcolor=Element.getStyle(this.element,'background-color').parseColor('#ffffff');
if(!this.options.restorecolor)
this.options.restorecolor=Element.getStyle(this.element,'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){
Element.setStyle(this.element,{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(){
Element.setStyle(this.element,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){
var oldOpacity=Element.getInlineOpacity(element);
var options=Object.extend({
from:Element.getOpacity(element)||1.0,
to:0.0,
afterFinishInternal:function(effect){with(Element){
if(effect.options.to!=0)return;
hide(effect.element);
setStyle(effect.element,{opacity:oldOpacity});}}
},arguments[1]||{});
return new Effect.Opacity(element,options);
}
Effect.Appear=function(element){
var options=Object.extend({
from:(Element.getStyle(element,'display')=='none'?0.0:Element.getOpacity(element)||0.0),
to:1.0,
beforeSetup:function(effect){with(Element){
setOpacity(effect.element,effect.options.from);
show(effect.element);}}
},arguments[1]||{});
return new Effect.Opacity(element,options);
}
Effect.Puff=function(element){
element=$(element);
var oldStyle={opacity:Element.getInlineOpacity(element),position:Element.getStyle(element,'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){with(Element){
setStyle(effect.effects[0].element,{position:'absolute'});}},
afterFinishInternal:function(effect){with(Element){
hide(effect.effects[0].element);
setStyle(effect.effects[0].element,oldStyle);}}
},arguments[1]||{})
);
}
Effect.BlindUp=function(element){
element=$(element);
Element.makeClipping(element);
return new Effect.Scale(element,0,
Object.extend({scaleContent:false,
scaleX:false,
restoreAfterFinish:true,
afterFinishInternal:function(effect){with(Element){
[hide,undoClipping].call(effect.element);}}
},arguments[1]||{})
);
}
Effect.BlindDown=function(element){
element=$(element);
var oldHeight=Element.getStyle(element,'height');
var elementDimensions=Element.getDimensions(element);
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){with(Element){
makeClipping(effect.element);
setStyle(effect.element,{height:'0px'});
show(effect.element);
}},
afterFinishInternal:function(effect){with(Element){
undoClipping(effect.element);
setStyle(effect.element,{height:oldHeight});
}}
},arguments[1]||{})
);
}
Effect.SwitchOff=function(element){
element=$(element);
var oldOpacity=Element.getInlineOpacity(element);
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){with(Element){
[makePositioned,makeClipping].call(effect.element);
}},
afterFinishInternal:function(effect){with(Element){
[hide,undoClipping,undoPositioned].call(effect.element);
setStyle(effect.element,{opacity:oldOpacity});
}}
})
}
});
}
Effect.DropOut=function(element){
element=$(element);
var oldStyle={
top:Element.getStyle(element,'top'),
left:Element.getStyle(element,'left'),
opacity:Element.getInlineOpacity(element)};
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){with(Element){
makePositioned(effect.effects[0].element);}},
afterFinishInternal:function(effect){with(Element){
[hide,undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element,oldStyle);}}
},arguments[1]||{}));
}
Effect.Shake=function(element){
element=$(element);
var oldStyle={
top:Element.getStyle(element,'top'),
left:Element.getStyle(element,'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){with(Element){
undoPositioned(effect.element);
setStyle(effect.element,oldStyle);
}}})}})}})}})}})}});
}
Effect.SlideDown=function(element){
element=$(element);
Element.cleanWhitespace(element);
var oldInnerBottom=Element.getStyle(element.firstChild,'bottom');
var elementDimensions=Element.getDimensions(element);
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){with(Element){
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera)setStyle(effect.element,{top:''});
makeClipping(effect.element);
setStyle(effect.element,{height:'0px'});
show(element);}},
afterUpdateInternal:function(effect){with(Element){
setStyle(effect.element.firstChild,{bottom:
(effect.dims[0]-effect.element.clientHeight)+'px'});}},
afterFinishInternal:function(effect){with(Element){
undoClipping(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild,{bottom:oldInnerBottom});}}
},arguments[1]||{})
);
}
Effect.SlideUp=function(element){
element=$(element);
Element.cleanWhitespace(element);
var oldInnerBottom=Element.getStyle(element.firstChild,'bottom');
return new Effect.Scale(element,0,
Object.extend({scaleContent:false,
scaleX:false,
scaleMode:'box',
scaleFrom:100,
restoreAfterFinish:true,
beforeStartInternal:function(effect){with(Element){
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera)setStyle(effect.element,{top:''});
makeClipping(effect.element);
show(element);}},
afterUpdateInternal:function(effect){with(Element){
setStyle(effect.element.firstChild,{bottom:
(effect.dims[0]-effect.element.clientHeight)+'px'});}},
afterFinishInternal:function(effect){with(Element){
[hide,undoClipping].call(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild,{bottom:oldInnerBottom});}}
},arguments[1]||{})
);
}
Effect.Squish=function(element){
return new Effect.Scale(element,window.opera?1:0,
{restoreAfterFinish:true,
beforeSetup:function(effect){with(Element){
makeClipping(effect.element);}},
afterFinishInternal:function(effect){with(Element){
hide(effect.element);
undoClipping(effect.element);}}
});
}
Effect.Grow=function(element){
element=$(element);
var options=Object.extend({
direction:'center',
moveTransistion: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(element)};
var dims=Element.getDimensions(element);
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){with(Element){
hide(effect.element);
makeClipping(effect.element);
makePositioned(effect.element);
}},
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){with(Element){
setStyle(effect.effects[0].element,{height:'0px'});
show(effect.effects[0].element);}},
afterFinishInternal:function(effect){with(Element){
[undoClipping,undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element,oldStyle);}}
},options)
)
}
});
}
Effect.Shrink=function(element){
element=$(element);
var options=Object.extend({
direction:'center',
moveTransistion: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(element)};
var dims=Element.getDimensions(element);
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){with(Element){
[makePositioned,makeClipping].call(effect.effects[0].element)}},
afterFinishInternal:function(effect){with(Element){
[hide,undoClipping,undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element,oldStyle);}}
},options)
);
}
Effect.Pulsate=function(element){
element=$(element);
var options=arguments[1]||{};
var oldOpacity=Element.getInlineOpacity(element);
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){Element.setStyle(effect.element,{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){with(Element){
[hide,undoClipping].call(effect.element);
setStyle(effect.element,oldStyle);
}}});
}},arguments[1]||{}));
}
