$(
  function() {
    var FAQs = new function() {
	  var settings = {
	    $faq : $('#faqs'),
	    $faqs: $('#faqs > div').not(':last'),
	    $tags: $('.tags > a'),
	    url: $('#logo').attr('href')
	  };	  
	
	  this.init = function() {
	    this.initTags();
	    this.initFAQs();		  
	  };
	  this.initTags = function() {
	    settings.$tags.each(
		  function(i) {
	        new Tag($(this), settings);
	      }
		);		
	  };
	  this.initFAQs = function() {
	    settings.$faqs = $('#faqs > div');
	    settings.$faqs.each(
		  function(i) {
	        new FAQ($(this), settings);
	      }
		);		
	  };
	  this.loading = function(display) {
	    var $loading = $('#loading');

	    if (!$loading.length) {
	      $loading = $('#loading', $('body').append('<div id="loading"><div><img src="' + settings.url + 'public/images/working.gif" /> Loading data...</div></div>'));
	    }
	    if (display) {
	      $loading.fadeIn('fast');
	    } else {
	      $loading.fadeOut('fast');	  
	    }
	  };	
	  this.clean = function(s) {
		return s.replace(/<\/?(div|p|ul|ol|li|hr|h[1-6]|pre|code|blockquote).*?>/gim, '');
	  };
	};
	  
	Tag = function ($tag, settings) {
	  this.$tag = $tag;
	  this.settings = settings;
	  this.tag = this.$tag.attr('href').replace(/.+tag\/([^\/]+)\/?.*/, '$1');
	  this.json = null;
		
	  this.init();
	}
	Tag.prototype = {
	  init : function() {
	    var self = this;
		  
		this.$tag.bind(
		  'click', 
		  function(e) {
		    self.loader();
			return false;
		  }
		);
		  
		return this;
	  },
	  loader : function() {
		var self = this;
		  
		FAQs.loading(true);

		$.getJSON(
		  this.settings.url + 'extensions/com/faqs/FAQAjaxGateway.cfc',
		  'method=init&methodname=get&returntype=json&tag=' + this.tag,
		  function(json) {
 			self.build(json);
			
			FAQs.loading(false);
		  }
		);
		return this;
	  },
	  build : function(json) {
		var self = this;
		  
		this.json = json;
		this.settings.$faq.html('');

		$.each(
		  this.json,
		  function(i, n) {
			self.create(i, n);
		  }
		);
		  
		FAQs.initFAQs();
	  },
	  create : function(index, object) {
		var html = '<div class="' + (index % 2 == 1 ? 'one' : 'two') + '">';
		html += '<div class="question" title="Click to view FAQ"><strong>Q:</strong> ' + FAQs.clean(object.faq_question) + '</div>';
		html += '<div class="answer" style="display:none;"><strong>Q:</strong> ' + object.faq_answer + '</div>';		  
		html += '</div>';
		
		this.settings.$faq.append(html);
	  }
	};
	FAQ = function ($faq) {
	  this.$faq = $faq;
	  this.$q = $('.question', this.$faq);
	  this.$a = $('.answer', this.$faq);
		
	  this.init();
	};
	FAQ.prototype = {
	  init : function() {
	    var self = this;
		  
		this.$a.hide();
		this.hidden = true;	
		 
		this.$q.bind(
		  'click', 
		  function(e) {
		    self.toggle();
		  }
		);
		  
		return this;
	  },
	  toggle : function() {
		if (this.hidden) {
		  this.$q.addClass('question-open');
		  this.$a.show('slow');
		  this.hidden = false;
		} else {	
		  this.$q.removeClass('question-open');
		  this.$a.hide('slow');
		  this.hidden = true;			
		}
		return this;
	  }
	};
	FAQs.init();
  }
);