/*  Dynamic table control, version 1.0.1
 *
 *  (c) 2007 Sven Rymenants - Byteworks - www.byteworks.be
 *
/*--------------------------------------------------------------------------*/
var dynamicTableCtrl = Class.create();

dynamicTableCtrl.prototype = {
  initialize: function(element, rowsPerPage)
  {
    var options = Object.extend({
      onSelect: null,
      onSelectRun: null,
      onDblClick: null,
      onDblClickRun: null,
      onGotoIndex: null,
      onDeselect: null,
      onDeselectRun: null,
      showCharIndex: false
    }, arguments[2] || {});

    this._options      = options;

    this._elementName  = element;
    this._element      = null;
    this._selectedRow  = null;
    this._selected     = -1;
    this._rows         = Array();
    this._cols         = Array();
    this._rowsPerPage  = rowsPerPage;
    this._page         = 0;
    this._rowIdOffset  = element.length + 4;
    this._disabled     = false;
    this._indexList    = Array();
    this._element      = $(this._elementName);
    this._element.ctrl = this;
    this._registerEventHandlers();
  },

  destroy: function()
  {
    Event.stopObserving(this._element, 'click'   , this.eventMouseClick);
    Event.stopObserving(this._element, 'dblclick', this.eventMouseDblClick);
  },

  _registerEventHandlers: function()
  {
    this.eventMouseClick    = this._handleClick.bindAsEventListener(this);
    this.eventMouseDblClick = this._handleDoubleClick.bindAsEventListener(this);

    Event.observe(this._element, 'click'    , this.eventMouseClick, false);
    Event.observe(this._element, 'dblclick' , this.eventMouseDblClick, false);
    
    this._element.onclick = function(){return false;};
  },  

  _handleClick: function(event)
  {
    if (this._elementName == null)
    {
      eTable = Event.findElement(event, 'div');
      
      this._elementName = eTable.ctrl._elementName;
      this._selectedRow = eTable.ctrl._selectedRow;
      this._page        = eTable.ctrl._page;
      this._rowsPerPage = eTable.ctrl._rowsPerPage;
      this._rows        = eTable.ctrl._rows;
      this._options     = eTable.ctrl._options;
      this._rowIdOffset = eTable.ctrl._rowIdOffset;
      this._disabled    = eTable.ctrl._disabled;
    }
    if (this._disabled)
      return;
     
    var eRow = Event.element(event);
    
    if (eRow && eRow.id == this._elementName + 'Next')
    {
      if ((this._page+1) * this._rowsPerPage < this._rows.length)
      {
        this._page++;
        this._selectedRow = null;
        this.refresh();
      }    
      Event.stop(event);
      return;
    }
    
    if (eRow && eRow.id == this._elementName + 'Previous')
    {
      if (this._page > 0)
      {
        this._page--;
        this._selectedRow = null;
        this.refresh();
      }

      Event.stop(event);
      return;
    }

    //while (eRow && eRow.tagName && eRow.tagName.toLowerCase() != 'tr')
    //  eRow = eRow.parentNode;
    eRow = Event.findElement(event, 'tr');
    if (!eRow || !eRow.id || eRow.id.substr(0, 3) != 'row')
    {
      Event.stop(event);
      return;
    }

    if (this._selectedRow != eRow)
    {
      if ((this._selectedRow != null) && (this._options.onDeselect != null))
        eval(this._options.onDeselect + '(' + this._selected + ')');
  
      if ((this._selectedRow != null) && (this._options.onDeselectRun != null))
        eval(this._options.onDeselectRun);

      if (this._selectedRow)
        this._selectedRow.className = '';
      this._selectedRow = eRow;
      this._selected = eRow.id.substr(this._rowIdOffset);
      
      
      eRow.className = 'selected';
  
      if (this._options.onSelect != null)
        eval(this._options.onSelect + '(' + eRow.id.substr(this._rowIdOffset) + ')');
  
      if (this._options.onSelectRun != null)
        eval(this._options.onSelectRun);
    }
  },

  _handleDoubleClick: function(event)
  {
    if (this._disabled)
      return;

    var eRow = Event.element(event);
    Event.stop(event);
  },
  
  addColumn: function(name, width)
  {
    var hlp = new Array(width, name);
    this._cols.push(hlp);
  },
  
  addRow: function(id, aValues)
  {
    var hlp = new Array();
    hlp.push(id);
    for(var i=0; i<aValues.length; ++i)
      hlp.push(aValues[i]);

    this._rows.push(hlp);
  },

  removeAll: function()
  {
    this._rows.clear();
    this._page = 0;
    this._selectedRow = null;
  },
  
  _createHeader: function()
  {
    var html = '<tr>';
    
    for(var i=0; i<this._cols.length; i++)
    {
      html += '<td width="' + this._cols[i][0] + '">';
      html += this._cols[i][1];
      html += '</td>';
    }    
   
    return html;
  },

  _createFooter: function()
  {
    var html  = '<tr>';
    if (this._options.showCharIndex)
    {
      html += '<td class="last" colspan="' + this._cols.length + '" style="text-align: center">';
      var alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      for (var i=0; i<=26; i++)
      {
        if (this._indexList[i]==undefined)
          html += alpha.charAt(i) + '&nbsp;';
        else
          html += '<a href="#" onclick="javascript:$(\'' + this._elementName + '\').ctrl.gotoIndex(\'' + this._indexList[i] + '\'); return false;">' + this._indexList[i] + '</a>&nbsp;';
      }
      html += '</td>';
      html += '</tr>';
    }
    html += '<tr>';
    html += '<td class="last" colspan="' + this._cols.length + '">';
    html += '<div id="' + this._elementName + 'Previous" class="last-left"';
    if (this._page == 0)
      html += 'style="display: none"';
    html += '>&lt;&lt;Vorige</div>';
    html += '<div id="' + this._elementName + 'Next" class="last-right"'
    if ((this._page+1) * this._rowsPerPage > this._rows.length-1)
      html += 'style="display: none"';
    html += '>Volgende&gt;&gt;</div>';
    html += '</td>';
    html += '</tr>';
  
    return html;
  },

  _createRow: function(idx)
  {
    if (idx >= this._rows.length)
      return;

    var html = '<tr id="row_' + this._elementName + this._rows[idx][0] + '">';
    for(var i=0; i<this._cols.length; i++)
    {
      html += '<td>' + this._rows[idx][i+1];
      html += '</td>';
    }
    html += '</tr>';
    return html;
  },
  
  gotoIndex: function(code)
  {
    for(var i=0; i<this._rows.length; i++)
      if (this._rows[i][1].substring(0,1) == code)
      {
        this._page = Math.floor(i / this._rowsPerPage);
        this.refresh();
        return;
      }
  },
  
  setSelection: function(id)
  {
    var newRow = $('row_' + this._elementName + id);
    
    if (this._selectedRow != newRow)
    {
      if (this._options.onDeselect != null)
        eval(this._options.onDeselect + '(' + this._selectedRow.id.substr(this._rowIdOffset) + ')');
  
      if (this._options.onDeselectRun != null)
        eval(this._options.onDeselectRun);

      this._selectedRow.className = '';
      this._selectedRow = null;
      this._selected    = -1;
    }

    this._selectedRow = newRow;
    if (this._selectedRow == null)
      return;

    this._selectedRow.className = 'selected';
    this._selected = id;

    if (this._options.onSelect != null)
      eval(this._options.onSelect + '(' + id + ')');

    if (this._options.onSelectRun != null)
      eval(this._options.onSelectRun);
  },
  
  disable: function(disablectrl)
  {
    this._disabled = (!arguments[0] ||(arguments[0] == false));
  },
  
  setRow: function(id, aValues)
  {
    var idx = -1;
    for(var i=0; (i<this._rows.length) && (idx == -1); ++i)
      if (this._rows[i][0] == id)
        idx = i;
    if (idx == -1)
      return;

    for(var i=0; i<aValues.length; ++i)
      this._rows[idx][i+1] = aValues[i];

    var html = '';
    for(var i=0; i<this._cols.length; i++)
    {
      html += '<td>' + aValues[i];
      html += '</td>';
    }
    $('row_' + this._elementName + id).innerHTML = html
    
    return html;
  },
  
  refresh: function()
  {
    var html = new Array();

    this._indexList.length = 0;
    this._indexList = [];
    if (this._options.showCharIndex)
      for(var i=0; i<this._rows.length; i++)
      {
        charidx = this._rows[i][1].substr(0,1).toUpperCase().charCodeAt(0) - 65;
        this._indexList[charidx] = this._rows[i][1].substr(0,1).toUpperCase().charAt(0);
      }
    html.push('<table cellspacing="0">');
    html.push(this._createHeader());

    var start = this._page * this._rowsPerPage;
    var end   = start + this._rowsPerPage;
    for(var i=start; i<end; i++)
      html.push(this._createRow(i));

    html.push(this._createFooter());
    html.push('</table>');
    
    this._element.innerHTML = html.join('');
  },
  
  getSelected: function()
  {
    return this._selected;
  },
    
  setloading: function()
  {
    this._element.innerHTML = '<div style="text-align: center; width: 100%"><img src="images/ajax_loading.gif" /></div>';
  }
};
