/**
* (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');
|