var DynaFaqs = Class.create();
DynaFaqs.prototype = {
	initialize: function() {
		this.curr_q = null;
		this.curr_q_status = 'closed';
		this.faqs = [];
		
		var data = $A(arguments);
		var options = (data[0]) ? data[0] : {};
		this.faq_id = (options.faq_id) ? options.faq_id : 'faqs';
		this.type = (options.type) ? options.type : 'reveal';
			// reveal: click question/title to reveal answer/details
			// next: show single next question/title and answer/details
		this.focus_index = (options.focus_index) ? options.focus_index * 1 : -1;
		
		this.initFaqs();
	},
	
	initFaqs:function() {
		var faq_el = $(this.faq_id);
		var faq_list_el = $(this.faq_id).down('dl');
		
		var self = this;
		faq_list_el.getElementsBySelector('dt').each(function(question_el,index) {
			self.faqs[index] = {'q_el':question_el,'a_el':'','q_status':'open','a_status':'open'};
			if (index != self.focus_index) {
				question_el.hide();
				self.faqs[index].q_status = 'close';
			}
		});
		faq_list_el.getElementsBySelector('dd').each(function(answer_el,index) {
			self.faqs[index].a_el = answer_el;
			if (index != self.focus_index) {
				answer_el.hide();
				self.faqs[index].a_status = 'close';
			}
		});
		
		
		switch (this.type) {
		case 'reveal' :
			
			break;
		case 'next' :
			if (this.faqs.length > 1) {
				new Insertion.Bottom(faq_el,'<div class="link more">more</div>');
			}
			break;
		}
		
		
		Event.observe(faq_el,"mouseover",self.overEvent.bindAsEventListener(self));
		Event.observe(faq_el,"mouseout",self.outEvent.bindAsEventListener(self));
		Event.observe(faq_el,"click",self.clickEvent.bindAsEventListener(self));
	},

	clickEvent:function(e) {
		var target_el = Event.element(e);
		switch (target_el.tagName) {
		case 'DT' :
			switch (this.type) {
			case 'reveal' :
				this.clickQuestion(target_el);
				break;
			case 'next' :
				
				break;
			}
			break;
		case 'DIV' :
			if (target_el.hasClassName('link')) {
				this.showNext();
			}
			break;
		}
	},
	
	overEvent:function(e) {
		var target_el = Event.element(e);
		switch (target_el.tagName) {
		case 'DT' :
			switch (this.type) {
			case 'reveal' :
				this.overQuestion(target_el);
				break;
			case 'next' :
				
				break;
			}
			
			break;
		case 'DIV' :
			switch (this.type) {
			case 'reveal' :
				
				break;
			case 'next' :
				if (target_el.hasClassName('link')) { target_el.addClassName('hover'); }
				break;
			}
			break;
		}
	},
	
	outEvent:function(e) {
		var target_el = Event.element(e);
		var related_el = e.relatedTarget || e.toElement;
			while (related_el != target_el && related_el.nodeName != 'BODY') {
				related_el = related_el.parentNode;
			}
			if (related_el == target_el) return;
			
		switch (target_el.tagName) {
		case 'DT' :
			switch (this.type) {
			case 'reveal' :
				this.outQuestion(target_el);
				break;
			case 'next' :
				
				break;
			}
			
			break;
		case 'DIV' :
			switch (this.type) {
			case 'reveal' :
				
				break;
			case 'next' :
				if (target_el.hasClassName('link')) { target_el.removeClassName('hover'); }
				break;
			}
			break;
		}
	},
	
	showNext:function() {
		var next_faq_index = (this.focus_index == this.faqs.length-1) ? 0 : this.focus_index + 1;
		
		this.faqs[this.focus_index].q_el.hide();
		this.faqs[this.focus_index].a_el.hide();
		this.faqs[this.focus_index].q_status = 'close';
		this.faqs[this.focus_index].a_status = 'close';
		
		this.faqs[next_faq_index].q_el.show();
		this.faqs[next_faq_index].a_el.show();
		this.faqs[next_faq_index].q_status = 'open';
		this.faqs[next_faq_index].a_status = 'open';
		
		this.focus_index = next_faq_index;
	},
	
	overQuestion:function(question_el) {
		question_el.addClassName('hover');
	},
	
	outQuestion:function(question_el) {
		question_el.removeClassName('hover');
	},
	
	clickQuestion:function(question_el) {
		var answer_el = question_el.next(0);
		if (question_el != this.curr_q) {
			if (this.curr_q != null) {
				var curr_answer_el = this.curr_q.next(0);
				curr_answer_el.hide();
			}
			answer_el.show();
			this.curr_q = question_el;
		} else {
			if (answer_el.visible()) { answer_el.hide(); } else { answer_el.show(); }
		}
	}
}