(function($){
  $.fn.collapsable = function(options) {
    return this.each(function() {
      var scope = this;

      var defaults = {
        open: false
      };
      
      scope.settings = $.extend({}, defaults, options);
        
      var list = $(this).find('>ul');

      var arrow = $('<div></div>').addClass('arrow').click(function() { collapsable.toggle(scope);});
      
      collapsable.init(scope);
      $(this).prepend(arrow);
    });
  };
  
  var collapsable = {
    init: function(elem) {
      var list = $(elem).find('>ul');
      var name = $(elem).hasClass('menu') ? 'collapsable_menu' : $(elem).find('h3').text();
      
      if(this.getState(name) == 'open' || (!this.getState($(elem).find('h3').text()) && elem.settings['open']) || $(elem).find('>ul').hasClass('open') ){
      		this.open(elem);
      }
      else {
        this.collapse(list);
      }
      
    },
    toggle: function(elem) {
      var list = $(elem).find('>ul');
      $(elem).toggleClass('open');
      $(elem).hasClass('open') ? this.open(list) : this.collapse(list);
    },
    collapse: function(elem) {
      var name = $(elem).parents('div.module').hasClass('menu') ? 'collapsable_menu' : $(elem).prev().text();
      $(elem).slideUp();
      this.setState(name,'closed');
    },
    open: function(elem) {
      var name = $(elem).parents('div.module').hasClass('menu') ? 'collapsable_menu' : $(elem).prev().text();
      $(elem).slideDown();
      this.setState(name,'open');
    },
    getState: function(name) {
      return $.cookies.get(name.replace(/ /, ''));
    },
    setState: function(name,value) {
      var date = new Date();
      date.setTime(date.getTime() + 365*24*60*60*1000);
      
      $.cookies.set(name.replace(/ /, ''), value, {
        expiresAt: date
      });
      
    }
  }; 
  
})(jQuery);


