function Widget(id, location, active_tab) 
{
  if (!$(id)) return false;
  if (!location) return false;

  this.id = id;
  this.widget = $(id);
  this.location = location;

  Element.extend(this.widget);

  this.head = this.widget.getElementsByClassName('widget-head')[0];
  this.body = this.widget.getElementsByClassName('widget-body')[0];

  this.body.id = this.id + "-body";
  this.body_id = this.id + "-body";

  this.tabs = this.head.getElementsByTagName('li');

  var active_tab_split = new Array();
  
  if (active_tab) {
    active_tab_split = active_tab.split('_');
  }
  
  if (active_tab_split[1] && this.id.search(active_tab_split[0]) > -1) {
    this.default_tab = this.get_tab(active_tab_split[1]);  
    this.default_tab_title = active_tab_split[1];    
  } else {
    this.default_tab = this.tabs[0].getElementsByTagName('a')[0];  
    this.default_tab_title = this.tabs[0].getElementsByTagName('a')[0].innerHTML.replace(/ /g, "_").toLowerCase();
  } 
    
  this.bind();

  this.update_tab(this, this.default_tab, this.default_tab_title);
}

Widget.prototype.bind = function() 
{
  var o = this;
  for(var i = 0; i < this.tabs.length; i++) {
    var tab = this.tabs[i];
    var tab_anchor = tab.getElementsByTagName('a')[0];
    tab_anchor.onclick = function() { 
      var tab_title = this.innerHTML.replace(/ /g, "_").toLowerCase();
      o.update_tab(o, this, tab_title);
      return false;
    }
  }
}
Widget.prototype.update_tab = function(o, tab, tab_title)
{
  new Ajax.Updater(o.body_id, o.location + "?tab=" + tab_title, {
    onLoading: function() {
      o.head.getElementsByTagName('h2')[0].addClassName('loading');
      o.activate_tab(tab);
    },
    onComplete: function() {
      o.head.getElementsByTagName('h2')[0].removeClassName('loading');
      o.bind_to_pills();
    }
  }); 
  return false;
}
Widget.prototype.activate_tab = function(tab) {
  for(var i = 0; i < this.tabs.length; i++) {
    this.tabs[i].getElementsByTagName('a')[0] == tab ? this.tabs[i].addClassName('active') : this.tabs[i].removeClassName('active');
  }
}
Widget.prototype.get_tab = function(tab_title) {
  for(var i = 0; i < this.tabs.length; i++) {
    if (this.tabs[i].getElementsByTagName('a')[0].innerHTML.toLowerCase() == tab_title)
      return this.tabs[i].getElementsByTagName('a')[0];
  }  
}
Widget.prototype.bind_to_pills = function() 
{
  var o = this;
  var pills = this.body.getElementsByClassName('widget-pills')[0].getElementsByTagName('li');

  for(var i = 0; i < pills.length; i++) {
    var pill = pills[i];
    var pill_anchor = pill.getElementsByTagName('a')[0];
    pill_anchor.onclick = function() { 
      o.change_pane(this);
      return false;
    }
  }
}
Widget.prototype.change_pane = function(pill) 
{
  var pills = this.body.getElementsByClassName('widget-pills')[0].getElementsByTagName('li');
  var panes = this.body.getElementsByClassName('widget-pane');
  var index = 0;

  for(var i = 0; i < pills.length; i++) {
    var pill_anchor = pills[i].getElementsByTagName('a')[0];
    if (pill_anchor == pill) {
      pills[i].addClassName('active');
      index = i;
    }
    else {
      pills[i].removeClassName('active');
    }
  }

  for(var i = 0; i < panes.length; i++) {
    i == index ? panes[i].addClassName('active') : panes[i].removeClassName('active');
  }	

  findGraphs();
}