/*
* Accordion
* @author Gennadiy Ukhanov
* @version 0.0.1
* @build 1 (07/07/2011 20:20 AM)
*/

(function() {

    var $=jQuery;
    var Accordion = (function() {
        /**
         * Constructor
         */
        bfm.ui.Accordion = function() {
            this.toggle = false;
            this.currentAccordionListItemContainer = null;
            this.accordionContainer = null;
            this.accordionListItemContainer = null;
            this.accordionListSubItemContainer = null;
            this.accordionControlLink = null;
            this.accordionExpandedClass = 'expanded';
            this.accordionListItemCounter = 0;
            this.totalItem = 0;
        }

        bfm.ui.Accordion.prototype = {

            /**
             * @public
             * @param {_el} accordion selector
             */
            create : function(_el) {
                this.accordionListItemContainer.find('i.b-accordion_arrow').addClass('accordion-control')
                this.accordionListSubItemContainer.find('i.b-accordion_arrow').removeClass('accordion-control')
                this.accordionControlLink = this.accordionListItemContainer.find('i.accordion-control');
                this.accordionControlLink.bind('click', $.proxy(this, '_expand'));
                for(var i=0; i<this.accordionListItemContainer.length; i++) {
                    if(!$(this.accordionListItemContainer[i]).hasClass(this.accordionExpandedClass)) {
                        $(this.accordionListItemContainer[i]).find('UL').hide();
                    }
                    if(!$(this.accordionListItemContainer[i]).find('UL').length==0) {
                        $(this.accordionListItemContainer[i]).addClass('no-expanded');
                        this.totalItem+=1;
                    }
                }
            },

            _expand : function(event) {
                this.currentAccordionListItemContainer = $(event.currentTarget).parent().parent();
                if(this.currentAccordionListItemContainer.find('UL').length!=0) {
                    if(this.currentAccordionListItemContainer.hasClass(this.accordionExpandedClass)) {
                        this.currentAccordionListItemContainer.find('UL').slideUp($.proxy(this, '_onSlideUp'));
                    } else {
                        if(this.toggle) {
                            this.accordionListItemContainer.find('UL').slideUp($.proxy(this, '_onSlideToggleUp'));
                        } else {
                            this.currentAccordionListItemContainer.addClass(this.accordionExpandedClass);
                            this.currentAccordionListItemContainer.find('UL').slideDown($.proxy(this, '_onSlideDown'));
                        }
                    }
                } else {
                    location.href = this.currentAccordionListItemContainer.find('A').attr('href');
                }

                return false;
            },

            expandItem : function(index) {
                this.currentAccordionListItemContainer = this.accordionListItemContainer.eq(index);
                if(this.currentAccordionListItemContainer.find('UL').length!=0) {
                    if(this.currentAccordionListItemContainer.hasClass(this.accordionExpandedClass)) {
                        this.currentAccordionListItemContainer.find('UL').slideUp($.proxy(this, '_onSlideUp'));
                    } else {
                        if(this.toggle) {
                            this.accordionListItemContainer.find('UL').slideUp($.proxy(this, '_onSlideToggleUp'));
                        } else {
                            this.currentAccordionListItemContainer.addClass(this.accordionExpandedClass);
                            this.currentAccordionListItemContainer.find('UL').slideDown($.proxy(this, '_onSlideDown'));
                        }
                    }
                } else {
                    location.href = this.currentAccordionListItemContainer.find('A').attr('href');
                }

                return false;
            },

            _onSlideUp : function() {
                this.currentAccordionListItemContainer.removeClass(this.accordionExpandedClass);
            },

            _onSlideToggleUp : function() {
                this.accordionListItemCounter+=1;
                if(this.accordionListItemCounter >= this.totalItem) {
                    this.accordionListItemContainer.removeClass(this.accordionExpandedClass);
                    this.currentAccordionListItemContainer.addClass(this.accordionExpandedClass)
                    this.currentAccordionListItemContainer.find('UL').slideDown($.proxy(this, '_onSlideToggleDown'));
                    this.accordionListItemCounter = 0;
                }
            }
        }
    })(Accordion);
})();
