/** 
  *  (c) 2005-2007 Richard Cowin (http://openrico.org) 
  *  (c) 2005-2007 Matt Brown (http://dowdybrown.com) 
  * 
  *  Rico is licensed under the Apache License, Version 2.0 (the "License"); you may not use this 
  *  file except in compliance with the License. You may obtain a copy of the License at 
  *   http://www.apache.org/licenses/LICENSE-2.0 
  **/ 
 
 
/** @class core methods for transition effects */ 
Rico.ContentTransitionBase = function() {}; 
Rico.ContentTransitionBase.prototype = { 
    initialize: function(titles, contents, options) { 
    if (typeof titles == 'string') 
      titles = $$(titles); 
    if (typeof contents == 'string') 
      contents = $$(contents); 
 
      this.titles = titles; 
      this.contents = contents; 
        this.options = Object.extend({ 
            duration:200, 
            steps:8, 
            rate:Rico.Effect.easeIn 
      }, options || {}); 
      this.hoverSet = new Rico.HoverSet(titles, options); 
        contents.each(function(p){ if (p) Element.hide(p); }); 
      this.selectionSet = new Rico.SelectionSet(titles, Object.extend(this.options, {onSelect: this.select.bind(this)})); 
        if (this.initContent) this.initContent(); 
    }, 
    reset: function(){ 
      this.selectionSet.reset(); 
    }, 
    select: function(title) { 
        var panel = this.contentOf(title); 
      if ( this.selected == panel) return; 
        if (this.transition){ 
            if (this.selected){ 
              var effect = this.transition(panel); 
              if (effect) Rico.animate(effect, this.options); 
      } else { 
                Element.show(panel); 
      } 
        } else { 
            if (this.selected) Element.hide(this.selected); 
            Element.show(panel); 
        } 
        this.selected = panel; 
    }, 
    add: function(title, content){ 
        this.titles.push(title); 
        this.contents.push(content); 
        this.hoverSet.add(title); 
        this.selectionSet.add(title); 
        this.selectionSet.select(title); 
    }, 
    remove: function(title){}, 
    removeAll: function(){ 
        this.hoverSet.removeAll(); 
        this.selectionSet.removeAll(); 
    }, 
    openByIndex: function(index){this.selectionSet.selectIndex(index);}, 
    contentOf: function(title){ return this.contents[this.titles.indexOf(title)]; } 
}; 
 
Rico.ContentTransition = Class.create(); 
Rico.ContentTransition.prototype = Object.extend(new Rico.ContentTransitionBase(),{}); 
 
Rico.SlidingPanel = Class.create( 
/** @lends Rico.SlidingPanel# */ 
{ 
/** 
 * @class Implements sliding panel effect 
 * @constructs 
 * @param panel element that will be opened/closed 
 * @param options object may contain any of the following:<dl> 
 *   <dt>openEffect </dt><dd> </dd> 
 *   <dt>closeEffect</dt><dd> </dd> 
 *   <dt>disabler   </dt><dd> </dd> 
 *</dl> 
 */ 
    initialize: function(panel) { 
        this.panel = panel; 
        this.options = arguments[1] || {}; 
        this.closed = true; 
        this.showing = false; 
        this.openEffect = this.options.openEffect; 
        this.closeEffect = this.options.closeEffect; 
        this.animator = new Rico.Effect.Animator(); 
        Element.makeClipping(this.panel); 
    }, 
    toggle: function () { 
        if(!this.showing){ 
            this.open(); 
        } else { 
            this.close(); 
    } 
    }, 
    open: function () { 
      if (this.closed){ 
        this.showing = true; 
          Element.show(this.panel); 
          this.options.disabler.disableNative(); 
    } 
        /*this.animator.stop();*/ 
        this.animator.play(this.openEffect, 
                                             { onFinish: function(){ Element.undoClipping($(this.panel));}.bind(this), 
                                                rate: Rico.Effect.easeIn }); 
    }, 
     close: function () { 
        Element.makeClipping(this.panel); 
        this.animator.stop(); 
        this.showing = false; 
        this.animator.play(this.closeEffect, 
                         { onFinish: function(){  Element.hide(this.panel); this.options.disabler.enableNative();}.bind(this), 
                                                 rate: Rico.Effect.easeOut }); 
    } 
}); 
 
 
//------------------------------------------- 
// Example components 
//------------------------------------------- 
 
/** 
 * @class Implements accordion effect 
 * @see Rico.ContentTransitionBase#initialize for construction parameters 
 * @extends Rico.ContentTransitionBase 
 */ 
Rico.Accordion = Class.create(); 
Rico.Accordion.prototype = Object.extend(new Rico.ContentTransitionBase(),  
/** @lends Rico.Accordion# */ 
{ 
  /** called by Rico.ContentTransitionBase#initialize */ 
  initContent: function() { 
        this.selected.style.height = this.options.panelHeight + "px"; 
    }, 
  transition: function(p){ 
    if (!this.options.noAnimate) 
          return new Rico.AccordionEffect(this.selected, p, this.options.panelHeight); 
    else{ 
      p.style.height = this.options.panelHeight + "px"; 
      if (this.selected) Element.hide(this.selected); 
          Element.show(p); 
    } 
    } 
}); 
 
 
/** 
 * @class Implements tabbed panel effect 
 * @see Rico.ContentTransitionBase#initialize for construction parameters 
 * @extends Rico.ContentTransitionBase 
 */ 
Rico.TabbedPanel = Class.create(); 
Rico.TabbedPanel.prototype = Object.extend(new Rico.ContentTransitionBase(), 
/** @lends Rico.TabbedPanel# */ 
{ 
  /** called by Rico.ContentTransitionBase#initialize */ 
  initContent: function() { 
      if (typeof this.options.panelWidth=='number') this.options.panelWidth+="px"; 
      if (typeof this.options.panelHeight=='number') this.options.panelHeight+="px"; 
    if (!this.options.corners) this.options.corners='top'; 
    if (Rico.Corner && this.options.corners!='none') { 
      if (!this.options.border) this.options.color='transparent'; 
      for (var i=0; i<this.titles.length; i++) { 
        if (this.titles[i]) { 
          if (this.options.panelHdrWidth) this.titles[i].style.width=this.options.panelHdrWidth; 
          Rico.Corner.round(this.titles[i], this.options); 
        } 
      } 
    } 
        this.transition(this.selected); 
    }, 
  transition: function(p){ 
    if (this.selected) Element.hide(this.selected); 
        Element.show(p); 
    if (this.options.panelHeight) p.style.height = this.options.panelHeight; 
    if (this.options.panelWidth) p.style.width = this.options.panelWidth; 
    } 
}); 
 
 
Rico.SlidingPanel.top = function(panel, innerPanel){ 
    var options = Object.extend({ 
        disabler: Rico.Controls.defaultDisabler 
  }, arguments[2] || {}); 
    var height = options.height || Element.getDimensions(innerPanel)[1] || innerPanel.offsetHeight; 
    var top = options.top || Position.positionedOffset(panel)[1]; 
    options.openEffect = new Rico.Effect.SizeFromTop(panel, innerPanel, top, height, {baseHeight:height}); 
    options.closeEffect = new Rico.Effect.SizeFromTop(panel, innerPanel, top, 1, {baseHeight:height}); 
  panel.style.height = "0px"; 
    innerPanel.style.top = -height + "px"; 
    return new Rico.SlidingPanel(panel, options); 
}; 
 
Rico.SlidingPanel.bottom = function(panel){ 
    var options = Object.extend({ 
        disabler: Rico.Controls.blankDisabler 
  }, arguments[1] || {}); 
    var height = options.height || Element.getDimensions(panel).height; 
    var top = Position.positionedOffset(panel)[1]; 
    options.openEffect = new Rico.Effect.SizeFromBottom(panel, top - height, height); 
    options.closeEffect = new Rico.Effect.SizeFromBottom(panel, top, 1); 
    return new Rico.SlidingPanel(panel, options); 
}; 
 
Rico.includeLoaded('ricoComponents.js'); 
 
 |