var ListToggler = function(container, options){    
    this.container = container;
    this.options = {
        item: 'item',
        toggler: 'h3',
        toggleContent: 'p',
        activeClassname: 'active',
        transitionTime: 2,
        toggle: true,
        hideContent: true
    }; 
    this.hasInit = false;
    
    this.items = [];
    
    ListToggler.instances.push(this);
        
    if(options){
        Object.extend(this.options, options);
    }
    if(ArticleSlideshow.isDomLoaded){
        this.initialize();
    }else{
        Event.observe(document, 'dom:loaded', this.initialize.bind(this), false);
    }
}

ListToggler.instances = [];
ListToggler.isDomLoaded = false;

ListToggler.getInstance = function(id){
    var instances = QaToggler.instances;
    var i = instances.length;
    while(i--){
        if(instances[i].tileId === id){
            return instances[i];
        }
    }
};

ListToggler.prototype = {
    initialize: function() {
        this.items = this.container.select(this.options.item);        
        var itemCount = this.items.size();
        for(var i=0; i<itemCount;i++){
            this.addItem(this.items[i]);
        }
        this.hasInit=true;            
    },
    
    
    addItem: function(item){        
        if(ListToggler.isDomLoaded){
            var toggler = item.down(this.options.toggler);
            var toggleContent = item.down(this.options.toggleContent);
            if(toggler != undefined && toggleContent != undefined){
                if(this.options.toggle){
                    Event.observe(toggler, 'click', this.onToggle.bind(this));
                } else {
                    Event.observe(toggler, 'click', this.onClick.bind(this));
                }
                if(this.options.hideContent){
                    toggleContent.hide();
                }
            }
        } else {
            this.items.push(item);
        }
    },
    
    getItem: function(el){
        var element = undefined;
        var itemCount = this.items.size();
        for(var i=0; i<itemCount;i++){
            if(el.descendantOf(this.items[i])){
                element = this.items[i];
                break;
            }
        }
        return element;
    },
    
    onClick: function(event){
        var target = (event.currentTarget) ? event.currentTarget : event.srcElement;
        this.ActiveElement = this.getItem(target);
        var content = this.ActiveElement.down(this.options.toggleContent);
        if(content.visible()){
            this.hideElement(content);
        } else {
            this.showElement(content);
        }
        event.stop();
    },
    
    onToggle: function(event){
        
        var target = (event.currentTarget) ? event.currentTarget : event.srcElement;
        var element = this.getItem(target);
        var content = undefined;
        if(this.ActiveElement == element){
            content = this.ActiveElement.down(this.options.toggleContent);
            if(content.visible()){
                this.ActiveElement.removeClassName(this.options.activeClassname);
                this.hideElement(content);
            } else {
                this.ActiveElement.addClassName(this.options.activeClassname);
                this.showElement(content);
            }
        } else {
            if(this.ActiveElement!=undefined){
                content = this.ActiveElement.down(this.options.toggleContent);
                this.hideElement(content);            
                this.ActiveElement.removeClassName(this.options.activeClassname);
            }
        
            this.ActiveElement = element;
            this.ActiveElement.addClassName(this.options.activeClassname);
            
            if(this.ActiveElement!=undefined){
                content = this.ActiveElement.down(this.options.toggleContent);
                this.showElement(content);
            }
        }
       event.stop();
    },
    
    showElement: function(el){
        new Effect.SlideDown(el, {
            duration: this.options.transitionTime/2,            
            scaleContent: false,
            scaleFrom: 0,
            scaleTo: 100
        });
    },
    
    hideElement: function(el){
        new Effect.SlideUp(el, {
            duration: this.options.transitionTime/2
        });
    }
};

Event.observe(document, 'dom:loaded', function(){
    ListToggler.isDomLoaded = true;
    var options = {
        item: '.fqa-item',
        toggler: '.question',
        toggleContent: '.answer',
        toggle: true
    }
    $$('.full-articlelist').each(function(list){
        new ListToggler(list, options)
    });
}, false);
