/* Simple Accordion Script 

 * Requires Prototype and Script.aculo.us Libraries

 * By: Brian Crescimanno <brian.crescimanno@gmail.com>

 * http://briancrescimanno.com

 * This work is licensed under the Creative Commons Attribution-Share Alike 3.0

 * http://creativecommons.org/licenses/by-sa/3.0/us/

 */ 

 



if (typeof Effect == 'undefined')

  throw("You must have the script.aculo.us library to use this accordion");



var Accordion = Class.create({



    initialize: function(id, defaultExpandedCount, _option, _mastercontainer) {

        if(!$(id)) throw("Attempted to initalize accordion with id: "+ id + " which was not found.");

        this.accordion = $(id);

		

		if(_option == undefined || _option == null){

			this.options = {

				toggleClass: "pr_accordion_toggle",

				toggleActive: "pr_accordion_toggle_active",

				contentClass: "pr_accordion_content"

			}

		}else{

			this.options = _option;

		}

		

		this.mcontainer = _mastercontainer;

		

        this.contents = this.accordion.select('div.'+this.options.contentClass);

		this.setOriginalHeigth();

        this.isAnimating = false;

        this.maxHeight = 0;

        this.current = defaultExpandedCount ? this.contents[defaultExpandedCount-1] : this.contents[0];

        this.toExpand = null;

		

		

       	this.checkMaxHeight();

        this.initialHide();

        //this.attachInitialMaxHeight();



        var clickHandler =  this.clickHandler.bindAsEventListener(this);

        this.accordion.observe('click', clickHandler);

    },



    expand: function(el) {

        this.toExpand = el.next('div.'+this.options.contentClass);

        if(this.current != this.toExpand){

			this.toExpand.show();

            this.animate();

        }

    },	

		

	setOriginalHeigth: function(){

        for(var i=0; i<this.contents.length; i++){

            if(this.contents[i] != this.current) {

                this.contents[i].origHeigth = this.contents[i].getHeight();

            }

        }

    },



    checkMaxHeight: function() {

        for(var i=0; i<this.contents.length; i++) {

            if(this.contents[i].getHeight() > this.maxHeight) {

                this.maxHeight = this.contents[i].getHeight();

            }

        }

    },



    attachInitialMaxHeight: function() {

		this.current.previous('div.'+this.options.toggleClass).addClassName(this.options.toggleActive);

        if(this.current.getHeight() != this.maxHeight) this.current.setStyle({height: this.maxHeight+"px"});

    },



   clickHandler: function(e) {

		if (!this.isAnimating){

			var el = e.element();

			while (el && el.hasClassName && !el.hasClassName(this.options.toggleClass)){

				el=el.parentNode;

			}

			if(el && el.hasClassName && el.hasClassName(this.options.toggleClass)) {

				this.expand(el);

			}

		}

	},



    initialHide: function(){

        for(var i=0; i<this.contents.length; i++){

            if(this.contents[i] != this.current) {

                this.contents[i].hide();

                this.contents[i].setStyle({height: 0});

            }

        }

    },





    animate: function() {

        var effects = new Array();

        var options = {

            sync: true,

            scaleFrom: 0,

            scaleContent: false,

            transition: Effect.Transitions.sinoidal,

            scaleMode: {

                originalHeight: this.toExpand.origHeigth ,

                originalWidth: this.accordion.getWidth()

            },

            scaleX: false,

            scaleY: true

        };



        effects.push(new Effect.Scale(this.toExpand, 100, options));



        options = {

            sync: true,

            scaleContent: false,

            transition: Effect.Transitions.sinoidal,

            scaleX: false,

            scaleY: true

        };



        effects.push(new Effect.Scale(this.current, 0, options));



        var myDuration = 0.75;



        new Effect.Parallel(effects, {

            duration: myDuration,

            fps: 35,

            queue: {

                position: 'end',

                scope: 'accordion'

            },

            beforeStart: function() {

                this.isAnimating = true;

                this.current.previous('div.'+this.options.toggleClass).removeClassName(this.options.toggleActive);

                this.toExpand.previous('div.'+this.options.toggleClass).addClassName(this.options.toggleActive);

				if(this.toExpand.origHeigth > this.current.origHeigth){

					var HNE = (this.contents.length*50);

					var HH  = this.toExpand.origHeigth+HNE+this.mcontainer.hederH +30;

					this.mcontainer.setStyle({height:HH+"px"});

				}

            }.bind(this),

            afterFinish: function() {

                this.current.hide();

                this.toExpand.setStyle({ height: this.toExpand.origHeigth+"px" });

                this.current = this.toExpand;

                this.isAnimating = false;

				var HNE = (this.contents.length*50);

				var HH  = this.toExpand.origHeigth+HNE+this.mcontainer.hederH +30;

				this.mcontainer.setStyle({height:HH+"px"});

            }.bind(this)

        });

    }



});
