(function($){
  window.App = {
    Table: {
      showInfo: function(el, info){
        $(el).addClass('expanded');
        if(!$(info).data('beenLoaded')){
          $(info).trigger('load.info');
        }
        $(info).data('beenLoaded', true);
        $(info).show();
      },
    
      hideInfo: function(el, info){
        $(el).removeClass('expanded');
        $(info).hide();
      },
    
      toggleInfo: function(el, info){
        var type = $(el).hasClass('expanded') ? 'hideInfo' : 'showInfo';
        App.Table[type](el, info);
      },
    
      toggleAllInfo: function(table, hide_text, ev){
        var element = $(ev.target);
        if(!element.data('tableShown')){
          var show = true;
          element.data('tableShown', true);
          element.data('showText', element.innerHTML)
          element.html(hide_text);
        } else {
          var show = false;
          element.data('tableShown', false);
          element.html($(element).data('showText'));
        }
        $(table).find('tr.info').each(function(){
          App.Table[show ? 'showInfo' : 'hideInfo'](null, this);
        });
        return false;
      },
  
      addInfo: function(table){
        $(table).find('tr').each(function(){
          var el = $(this);
          if(el.hasClass('header')) return;
          if(el.hasClass('info')) return;        
          var info = el.next();
          if(!info || !info.hasClass('info')) return;
          el.css({cursor: 'pointer'});
          el.attr('title', 'Click for more information...');
          el.bind('click', info, function(e){
            App.Table.toggleInfo(this, e.data);
          });
          info.addClass(el.attr('class'));
          info.hide();
        });
      },
    
      addOdd: function(table){
        var odd = false;
        $(table).find('tr.row').each(function(){
          if(odd) $(this).addClass('odd');
          odd = !odd;
        });
      }
    },
  
    Form: {
      toggleAdvanced: function(e){
        try {  
          // Doesn't work in IE
          e.preventDefault();
        } catch(e) {}
        var el = $(e.target);
        el.parent().remove();
        $('form .advanced').show();
        return false;
      },
    
      hideAdvanced: function(){
        $('form .advanced').hide();
      },
    
      toggleEnabled: function(element, sel){
        $(element).click(function(){
          $(sel).attr(
            'disabled', 
            $(this).attr('checked') ? '' : 'disabled'
          );
        });
      }
    }
  };

  // Active Record ID
  $.fn.arId = function(){
    return parseInt(this.attr('id').gsub(/\D/, ''))
  }
}(jQuery))