/*
 *******************************************
 *******************************************
 *
 * Accordion Content Module
 * Nicholas Ortenzio 
 *
 * Requires Prototype and Scriptaculous
 * 
 * Updated 11/16/2009
 *******************************************
 *******************************************
 */


var Accordion = Class.create({

	/*
	 ************************************
	 * CONSTRUCTOR
	 ************************************
	 */

	initialize : function(base) {
		if (!base) { return; }
		this.base = $(base);

    this.setOptions();
		this.setProperties();
		this.setEvents();
    this.openPane(this.options.defaultPane - 1);
	},

	/*
	 ************************************
	 * INITIALIZATION METHODS
	 ************************************
	 */

	setOptions : function(opt) {
		this.options = {
				paneSelector : null,
				contentSelector : null,
				toggleSelector : null,
				titleSelector : null,
				highlightClass : null,
				closedClass : null,
				duration : .5,
				maxOpen : 1,
				defaultPane : 1,
				transition : 'linear',
				hoverTrigger : false,
				hoverDelay : .5,
        paneHeight : 150
		};

		for (var x in this.options) { this.options[x] = $(this.base).getAttribute(x) || this.options[x]; }

		this.options.hoverTrigger = (this.options.hoverTrigger == 'true') ? true : false;

		this.options.hoverDelay = parseFloat(this.options.hoverDelay);
		this.options.duration = parseFloat(this.options.duration);
    this.options.duration = parseFloat(this.options.duration);

		this.options.maxOpen = parseInt(this.options.maxOpen);
		this.options.defaultPane = parseInt(this.options.defaultPane);
    this.options.paneHeight = parseInt(this.options.paneHeight);
	},

	setProperties : function() {
		this.panes = this.base.select(this.options.paneSelector);
		this.toggles = this.base.select(this.options.toggleSelector);
		this.titles = this.base.select(this.options.titleSelector);
		this.contents = this.base.select(this.options.contentSelector);

		this.contents.each(function(n){n.setStyle({height:0})})

		this.hoverTimer = null;
		this.openPanes = [];
		this.isOpening = false;
		this.effect = Effect.Transitions[this.options.transition];
	},

	setEvents : function() {
		this.toggles.each(function(t,i) {
			t.observe("mouseover", this.onPaneOver.bind(this,i));
			t.observe("mouseout", this.onPaneOut.bind(this,i));
			t.observe("click", this.onPaneClick.bind(this,i));
      if (this.options.hoverTrigger) {
        t.observe("mouseover", this.onHoverOver.bind(this,i));
        t.observe("mouseout", this.onHoverOut.bind(this,i));
      }
		}.bind(this))
	},

	/*
	 ************************************
	 * EVENT METHODS
	 ************************************
	 */

	onPaneClick : function(i) { this.openPane(i) },
	onPaneOver  : function(i) { this.toggles[i].addClassName(this.options.highlightClass); },
	onPaneOut   : function(i) { this.toggles[i].removeClassName(this.options.highlightClass); },
	onHoverOver : function(i) { this.hoverTimer=new PeriodicalExecuter(this.openPane.bind(this,i), this.options.hoverDelay)},
	onHoverOut  : function(i) { if (this.hoverTimer) this.hoverTimer.stop(); },
  beforeStart : function(i,j) { 
    this.isOpening=true;
    this.toggles[i].addClassName(this.options.closedClass); 
    if(j!=null){this.toggles[j].removeClassName(this.options.closedClass)}; 
  },
  afterFinish : function(i) { this.openPanes.push(i); this.isOpening=false; },

  /*
	 ************************************
	 * METHODS
	 ************************************
	 */

	canOpen : function(i) {return (i!=null && !(this.openPanes.indexOf(i)>-1) && !this.isOpening)},

	/*
	 ************************************
	 * ANIMATE METHOD
	 ************************************
	 */

	openPane : function(i) {
		if (!this.canOpen(i)) return;
		var j = (this.openPanes.length == this.options.maxOpen) ? this.openPanes.shift() : null;
    var effects = [];
    effects.push(new Effect.Scale(this.contents[i], 100, { scaleFrom: 0, scaleY:true, scaleX:false, scaleContent:false, scaleMode: { originalHeight: this.options.paneHeight, originalWidth: 200 }, sync:true }));
    if(j!=null){effects.push(new Effect.Scale(this.contents[j], 0, { scaleFrom: 100, scaleY:true, scaleX:false, scaleContent:false, scaleMode: { originalHeight: this.options.paneHeight, originalWidth: 200 }, sync:true }))};

     new Effect.Parallel(effects.compact(), {
        duration : this.options.duration,
        transition : this.effect,
        queue : {position:'end', scope:this.base.id},
        beforeStart : this.beforeStart.bind(this,i,j),
        afterFinish : this.afterFinish.bind(this,i)
    });
  }

});


//document.observe("dom:loaded", function(){$$('.accordionModule').each(function(n){new Accordion(n)})})
NBAUtil.Events.addDomLoadedHandler( function() { $$('.accordionModule').each(function(n) { new Accordion(n); }); });