/* ****************************************************************************
Copyright 2007,
Todos los derechos Reservados
CM.COM E.U.
cmhenao@epm.met.co

El uso sin solicitud espresa a la compañia de esta libreria es una clara
violación a la propiedad intelectual y los derechos de autor.
Prohibida su distribucion y/o uso sin el permiso explicito de cm.com
**************************************************************************** */

/* ****************************************************************************
Autor: Jhon Alejandro Ramirez Velez
       Desarrollador
       Progress - WebSpeed
       jhalrave@epm.net.co
**************************************************************************** */

function cTableDataBrowser(){
  var self = this;
  
  this.cObject                 = cObject;
  this.cObject();
    
  this.current          = null;
  this.headerIndex      = 0;
  this.headers          = {};
  this.indexes          = {};
  this.indexes['rid']   = {};
  this.selectable       = true;
  
  this.SELECTION_MODES  = {};
  this.SELECTION_MODES['SINGLE']   = 0;
  this.SELECTION_MODES['MULTIPLE'] = 1;
  
  this.selection_list   = {};
  
  this.selection_mode   = this.SELECTION_MODES['SINGLE'];
    
  this.display          = _display;
  this.select_single    = _select_single;
  this.select_multiple  = _select_multiple;  
  this.show             = _show;
  this.hide             = _hide;
  this.clear            = _clear;
  this.disable          = _disable;
  this.enable           = _enable;
  this.reposition       = _reposition;
  this.setSelectionMode = _setSelectionMode;
  this.getSelection     = _getSelection;

  for(var iRows = 0; iRows < this.rows.length; iRows++){
    var oRow = this.rows[iRows];
    oRow.name = oRow.getAttribute('name');
    if(oRow.name != undefined && oRow.name != null && oRow.name == "fields"){
      this.headerIndex = iRows;
      this.headerRow   = oRow;
      oRow.rowclass    = oRow.getAttribute('rowclass');
      this.classes     = oRow.rowclass.split(',');
      for(var iCells = 0; iCells < oRow.cells.length; iCells++){
        var oHeader = {};
        var oCell = oRow.cells[iCells];
        var sfncDisp = window[this.id.replace(/\./g,'_') + "_" + oCell.getAttribute('name') + "_display"];
        if(sfncDisp){
          oHeader.type = "display";
          oCell.name = oCell.getAttribute('name');
          oHeader.name = oCell.name;
          self.headers[oCell.name] = oHeader;           
          oHeader.display = sfncDisp;
          continue;
        }

        if(oCell.displayHandler != undefined){
          oHeader.type = "display";
          oCell.name = oCell.getAttribute('name');
          oHeader.name = oCell.name;
          self.headers[oCell.name] = oHeader;           
          oHeader.display = eval(oCell.displayHandler); 
          continue;
        }
        
        if(oCell.counter != undefined){
          oHeader.type = "counter";
          oCell.name = oCell.getAttribute('counter');
          oHeader.name = oCell.name;
          self.headers[oCell.name] = oHeader;           
          continue;
        }

        if(oCell.expression != undefined){
          oHeader.type = "expression";
          oCell.name = oCell.getAttribute('name');
          oHeader.name = oCell.name;
          self.headers[oCell.name] = oHeader;           
          continue;
        }
        if(oCell.name != undefined){
          oHeader.type = "data";
          oHeader.name = oCell.name;          
          self.headers[oCell.name] = oHeader;
          continue;           
        }
        oHeader.type = "empty";
        oHeader.name = 'cell' + iCells;
        self.headers[oHeader.name] = oHeader;           
      }          
    } 
  }
  
  self.setSelectionMode(self.selection_mode);
  
  
  function _setSelectionMode(iMode){
    self.selection_mode = iMode;
    switch(self.selection_mode){
      case self.SELECTION_MODES['SINGLE']:
        this.detachEvent('onclick', self.select_multiple);
        this.attachEvent('onclick', self.select_single);  
      break;
      case self.SELECTION_MODES['MULTIPLE']:
        this.detachEvent('onclick', self.select_single);
        this.attachEvent('onclick', self.select_multiple);  
      break;
    }
  }
  
  
  function _clear(){
    for(var iRows = self.rows.length - 1; iRows > self.headerIndex; iRows--){
      self.deleteRow(iRows);
    }
  }
  
  function _show(){
    self.style.display = 'block';
  }
  
  function _hide(){
    self.style.display = 'none';
  }
  
  function _display(aDatos){
    self.current        = null;
    self.selection_list = {};
    self.indexes['rid'] = {};
    for(var iDatos = 0; iDatos < aDatos.length; iDatos++){
      oRow                  = document.createElement("TR"); //self.insertRow(self.rows.length);
      oRow.dataIndex        = iDatos;
      oRow.displayed        = aDatos[iDatos];
      oRow.className        = self.classes[iDatos % self.classes.length];
      oRow.defaultClass     = oRow.className;
      oRow.style.cursor     = "hand";
      oRow.over             = _over;
      oRow.out              = _out;
      oRow.attachEvent('onmouseover', oRow.over);
      oRow.attachEvent('onmouseout',  oRow.out);
      
      if(aDatos[iDatos]['rid'] != undefined && aDatos[iDatos]['rid'] != null){
        var oIndex = self.indexes['rid'][aDatos[iDatos]['rid']];
        if(oIndex == null && oIndex == undefined){
          self.indexes['rid'][aDatos[iDatos]['rid']] = [];
          oIndex = self.indexes['rid'][aDatos[iDatos]['rid']];           
        }        
        oIndex.push(oRow);
      }
      
      
      for(var sDato in self.headers){
        if(self.headers[sDato] instanceof Function){
          continue;
        }
        if(self.headers[sDato] instanceof Array){
          continue;
        }
        var oHeader = self.headers[sDato]; 
        var oCell = document.createElement('TD'); //oRow.insertCell(oRow.cells.length);
        
        switch(oHeader.type){
          case 'data':
            if(aDatos[iDatos][sDato] != undefined && aDatos[iDatos][sDato] != null){
              oCell.innerHTML = aDatos[iDatos][sDato];
            }
          break;
          case 'counter':
            oCell.className = "r_sel";
            if(aDatos[iDatos][sDato] != undefined && aDatos[iDatos][sDato] != null){
              oCell.innerHTML = aDatos[iDatos][sDato];
            }
            oCell.title = "Resultado Nro. " + oCell.innerHTML;          
          break;
          case 'display':
            oCell.className = "r_sel";
            if(aDatos[iDatos][sDato] != undefined && aDatos[iDatos][sDato] != null){
              oCell.innerHTML = aDatos[iDatos][sDato];
            }
            oHeader.display(oCell, aDatos[iDatos]);                      
          break;
        }

        oRow.appendChild(oCell);
        oCell = null;        
      }
      self.children(0).appendChild(oRow);
      oRow = null;
    }
  }
  
  function _reposition(sRid){
    var oRow = self.indexes['rid'][sRid];
    if(oRow == undefined || oRow == null){return;}
    oRow[0].click();
  }
  
  function _select_multiple(){
    if(!self.selectable){return;}
    
    if(self.disabled){
      return;
    }
    var oTr = window.event.srcElement;
    for(;oTr.tagName != "TR";){
      oTr = oTr.parentElement;
    }
    
    if(oTr.displayed == undefined || oTr.displayed == null){
      return;
    }
    
    if(oTr.selection_state == undefined || oTr.selection_state == null){
      oTr.selection_state = false;
    }
    
    oTr.selection_state = !oTr.selection_state;
    
    switch(oTr.selection_state){
      case true:
        self.selection_list[oTr.rowIndex] = true; 
      break;
      case false:
        self.selection_list[oTr.rowIndex] = false;      
      break;
    }    
    
    var oEvent = {};
    oEvent.name      = "onitemselect";
    oEvent.action    = "selection";
    oEvent.state     = oTr.selection_state;
    oEvent.object    = oTr.displayed;
    oEvent.widget    = oTr;
    oEvent.selection = self.getSelection;
    self.dispatch(oEvent);

    self.current = oTr;
    
    switch(oTr.selection_state){
      case true:
        self.current.className = 'r_sel'; 
      break;
      case false:
        self.current.className = self.current.defaultClass;      
      break;
    }    
  }

  function _select_single(){
    if(!self.selectable){return;}
    
    if(self.disabled){
      return;
    }
    
    var oTr = window.event.srcElement;
    for(;oTr.tagName != "TR";){
      oTr = oTr.parentElement;
    } 
    
    if(oTr.displayed == undefined || oTr.displayed == null){
      return;
    }
    
    if(self.current != null){
      self.current.className = self.current.defaultClass; 
    }
    
    var oEvent = {};
    oEvent.name     = "onitemselect";
    oEvent.action   = "selection";
    oEvent.object   = oTr.displayed;
    oEvent.widget   = oTr;
    self.dispatch(oEvent);

    self.current = oTr;
    self.current.className = 'r_sel';
  }

  function _getSelection(){
    var aSelection = new Array();
    for(var i in self.selection_list){
      var oObj = self.selection_list[i];
      if(oObj instanceof Array){continue;}
      if(oObj instanceof Object){continue;}
      if(oObj == null || oObj == undefined){continue;}
      if(oObj == false){continue;}
      aSelection.push(self.rows[i].displayed);      
    }
    return aSelection;
  }
  
  function _disable(){
    self.disabled = true;
  }
  
  function _enable(){
    self.disabled = false;
  }
  
  function _over(){
    if(!self.selectable){return;}
    var oTr = window.event.srcElement;
    for(;oTr.defaultClass == undefined;){
      oTr = oTr.parentElement;
    }
    if(oTr.className != "r_sel" && oTr.className != "r_sel_1"){
      oTr.className = "r_over";
    }    
  }
  
  function _out(){
    if(!self.selectable){return;}
    var oTr = window.event.srcElement;
    for(;oTr.defaultClass == undefined;){
      oTr = oTr.parentElement;
    }
    if(oTr.className != "r_sel" && oTr.className != "r_sel_1"){
      oTr.className = oTr.defaultClass;
    }
  }
  
  
}

