if(typeof(RNS)=="undefined"){RNS={};}


RNS.Bureau=Class.create();
Object.extend(RNS.Bureau.prototype,Event.Listener);
Object.extend(RNS.Bureau.prototype,{

drawers:null,
container:null,

triggerTimeout:null,

initialize:function(container){
this.drawers=[];
this.container=$(container);
},

addDrawer:function(newDrawer){},

getDrawerCount:function(){
return this.drawers.length;
},

hasDrawers:function(){
return(this.drawers.length>0);
},

getFirstDrawer:function(){
return this.drawers[0]||null;
},

getLastDrawer:function(){
return this.drawers[this.drawers.length-1]||null;
},

scheduleTrigger:function(onFire,delay){
this.triggerTimeout=setTimeout(onFire,delay);
},

clearTrigger:function(){
clearTimeout(this.triggerTimeout);
}

});

RNS.Drawer=Class.create();
Object.extend(RNS.Drawer.prototype,Event.Publisher);
Object.extend(RNS.Drawer.prototype,{

bureau:null,

contentElement:null,
handle:null,
indicator:null,

isOpen:true,

beforeOpen:null,
afterOpen:null,

beforeClose:null,
afterClose:null,

transitionDuration:0.3,
triggerDelay:0,





initialize:function(contentElement,handleElement,bureau,options){

this.contentElement=contentElement;
this.handle=handleElement;
this.bureau=bureau;

var triggerEvent='click';

if(options!=null&&typeof(options)!='undefined'){
this.beforeOpen=options.beforeOpen;
this.afterOpen=options.afterOpen;
this.beforeClose=options.beforeClose;
this.afterClose=options.afterClose;


if(typeof(options.triggerEvent)!='undefined'){
triggerEvent=options.triggerEvent;
}

if(typeof(options.triggerDelay)!='undefined'){
this.triggerDelay=options.triggerDelay;
}

if(typeof(options.transitionDuration)!='undefined'){
this.transitionDuration=options.transitionDuration;
}
}
Element.addClassName(this.contentElement,'last');

var fireTrigger=function(evt){

Event.stop(evt);

if(this.triggerDelay>0){
var onFire=this.trigger.bind(this);
bureau.scheduleTrigger(onFire,this.triggerDelay);
}else{
this.trigger();
}
}

Event.observe(this.handle,triggerEvent,fireTrigger.bind(this),false);
Event.observe(this.handle,'mouseout',bureau.clearTrigger.bind(bureau),false);

},

toggle:function(){},

open:function(){},

close:function(){}

});



RNS.FolderBureau=Class.create();
Object.extend(Object.extend(RNS.FolderBureau.prototype,RNS.Bureau.prototype),{

drawerDuration:0.5,

addDrawer:function(newDrawer){


if(this.hasDrawers()){

var lastDrawer=this.getLastDrawer();

lastDrawer.setNextDrawer(newDrawer);
newDrawer.setPreviousDrawer(lastDrawer);
newDrawer.closedOffset=lastDrawer.closedOffset+lastDrawer.getHandleHeight()-10;
}else{
Element.addClassName(newDrawer.contentElement,'first');
newDrawer.closedOffset=0-newDrawer.getHeight()+newDrawer.getHandleHeight()-10;
newDrawer.indicateVisible();
}


this.drawers.push(newDrawer);
},

getWidth:function(){
return Element.getWidth(this.container);
},

getHeight:function(){
return Element.getHeight(this.container);
},

moveDrawer:function(drawer,x,y){
new Effect.Move(drawer,{
x:x,
y:y,
mode:'absolute',
transition:Effect.Transitions.sinoidal,
duration:this.drawerDuration});
}

});

RNS.FolderEffect=Class.create();
Object.extend(Object.extend(RNS.FolderEffect.prototype,RNS.Drawer.prototype),{

openedOffset:0,
closedOffset:0,

previousDrawer:null,
nextDrawer:null,

isVisible:false,

trigger:function(){
if(!this.isVisible){
this.open(true);
this.indicateVisible();
}
},

toggle:function(){

if(!this.isOpen){
this.open();
this.indicateVisible();
}else{
this.close();
}

},

open:function(force){

if(this.isOpen&&!force){
return;
}

if(this.previousDrawer!==null){
this.previousDrawer.close();
this.previousDrawer.indicateObscured();
}

if(this.nextDrawer!==null){
this.nextDrawer.open();
this.nextDrawer.indicateObscured();
}

this.indicateVisible();
this.isOpen=true;

this.bureau.moveDrawer(this.contentElement,0,this.openedOffset);
},

close:function(force){

if(!this.isOpen){
return;
}

if(this==this.bureau.getLastDrawer()){
return;
}

if(this.previousDrawer!==null){
this.previousDrawer.close();
}

this.bureau.moveDrawer(this.contentElement,0,this.closedOffset);
this.indicateObscured();
this.isOpen=false;

},

setPreviousDrawer:function(drawer){
this.previousDrawer=drawer;

this.indicateObscured();

this.openedOffset=this.previousDrawer.openedOffset+this.previousDrawer.getHandleHeight()-10;
Element.setStyle(this.contentElement,{top:this.openedOffset+"px"});
},

setNextDrawer:function(drawer){
this.nextDrawer=drawer;

Element.removeClassName(this.contentElement,'last');

if(this.previousDrawer!=null){
this.previousDrawer.setNextDrawer(this);
}


zIndex=parseInt(Element.getStyle(this.contentElement,'zIndex'));
Element.setStyle(this.contentElement,{'zIndex':zIndex+1});
},

indicateObscured:function(){
Element.addClassName(this.contentElement,'obscured');
this.isVisible=false;
},

indicateVisible:function(){
this.isVisible=true;
Element.removeClassName(this.contentElement,'obscured');
},

getHandleWidth:function(){
return Element.getWidth(this.handle);
},

getHandleHeight:function(){
return Element.getHeight(this.handle);
},

getWidth:function(){
return Element.getWidth(this.contentElement);
},

getHeight:function(){
return Element.getHeight(this.contentElement);
}


});


