var VDW_UNDEFINED_STATE = -1;
var VDW_GETTING_STATE = 1;
var VDW_BUFFER_STATE = 2;
var VDW_DISPLAYED_STATE = 3;

function ActivatedCell(id,state,value)
{
   this.name = id;
   this.state = state;
   this.oldvalue = value;

   this._typeName = "ActivatedCell";
}

/**
 * datablock collection (scroll)
 **/
function VDWDataBlock(start,stop,data,state)
{
   this._start = start;
   this._stop = stop;
   this._data = data;
   this._state = state;

   this._typeName = "VDWDataBlock";
}

VDWDataBlock.prototype.AdjustBlock = function(datagridname)
{
   if(this._state != VDW_BUFFER_STATE)
      return 0;
   //alert('hier1');

   if(!this._data || !this._data.childNodes)
      return 0;
   //alert('hier2');

   var leftside = null,middleside = null,rightside = null;

   for(i=0;i<this._data.childNodes.length;i++)
   {
      if(this._data.childNodes[i].tagName != "DIV")
         continue;

      if(this._data.childNodes[i].id == "datagrid_content_left_"+datagridname)
      {
         leftside = this._data.childNodes[i];
         continue;
      }

      if(this._data.childNodes[i].id == "datagrid_content_middle_"+datagridname)
      {
         middleside = this._data.childNodes[i];
         break;
      }

      if(this._data.childNodes[i].id == "datagrid_content_right_"+datagridname)
      {
         rightside = this._data.childNodes[i];
         continue;
      }
   }

   if(!middleside && !leftside && !rightside)
   {
      return ;
   }
   //alert('hier3');
   
   var table = ((middleside)?middleside.childNodes[nrChild]:((leftside)?leftside.childNodes[nrChild]:((rightside)?rightside.childNodes[nrChild]:null)));
   //alert('table :'+table+'table.rows'+table.rows.length);

   if(!table || table.rows.length <= 0)
   {
      this._stop = this._start;
      return 0;
   }
   //alert("nrResult rows : "+(table.rows.length-1));
   this._start = parseInt(table.rows[0].id.substring(table.rows[0].id.lastIndexOf("_")+1));
   this._stop = parseInt(table.rows[table.rows.length-1].id.substring(table.rows[table.rows.length-1].id.lastIndexOf("_")+1));
   return table.rows.length;
}

VDWDataBlock.prototype.SetData = function(html)
{
   var reg1 = new RegExp("^datagrid_tmp_content_","i")
   var reg2 = new RegExp("^datagrid_tmp_content_(left_|middle_|right_){1}.*","i");

   //alert(html);
   
   if(!document.getElementById('buffer') || document.getElementById('buffer').tagName!="DIV")
   {
      oDiv = document.createElement('DIV');
      oDiv.setAttribute('id','buffer');
      oDiv.style.display = 'none';
      oDiv.innerHTML = html;
      document.body.appendChild(oDiv);
   }
   else
   {
      oDiv = document.getElementById('buffer');
      oDiv.innerHTML = html;
   }
   
   if(oDiv.childNodes.length > 0)
   {
      for(i=0;i<oDiv.childNodes.length;i++)
      {
         if(oDiv.childNodes[i].tagName != "DIV")
            continue;
         
         if(reg1.test(oDiv.childNodes[i].id) && !reg2.test(oDiv.childNodes[i].id))
         {
            //alert(oDiv.childNodes[i].id);
            this._data = oDiv.childNodes[i].cloneNode(true);
            break;
         }
         
      }
   }

   oDiv.innerHTML = "";
}

function VDWDataBlockArray()
{
   this._array = new Array();
   this._typeName = "VDWDataBlockArray";   
}   

VDWDataBlockArray.prototype.FindBlock = function(nr)
{
   var index = -1;
   for(i=0;i<this._array.length;i++)
   {
      if((this._array[i]._start <=  nr) && (this._array[i]._stop >= nr))
      {
         index = i;
         break;
      }
   }

   return index;
}

VDWDataBlockArray.prototype.FindLastBlock = function()
{
   var index = 0;
   for(i=0;i<this._array.length;i++)
   {
      if((this._array[i]._start < this._array[index]._stop))
      {
         continue;
      }

      index = i;
   }

   return index;
}


VDWDataBlockArray.prototype.FindClosedNextBlock = function(nr)
{
   var index = -1;
   
   if(nr<0 || nr>=this._array.length)
      return index;
   
   var fl_found = false;
   var stop    = this._array[nr]._stop;

   var dum_start = -1;
   var dum_index = -1;   
   
   for(i=0;i<this._array.length;i++)
   {

      /* is not interessant */
      if(this._array[i]._start < stop)
         continue;
      
      /* block found */
      if(this._array[i]._start == (stop+1))
      {
         fl_found = true;
         index = i;
         break;
      }
      
      /* the closed next block founded */
      if(dum_start < stop || dum_start > this._array[i]._start)
      {
         dum_start = this._array[i]._start;
         dum_index = i;
      }
   }
   
   return (fl_found)?index:dum_index;
}


VDWDataBlockArray.prototype.FindClosedPrevBlock = function(nr)
{
   var index = -1;
   
   if(nr<0 || nr>=this._array.length)
      return index;
   
   var fl_found = false;
   var start   = this._array[nr]._start;
   var prevblockstop = (this._array[nr]._start-1)
   
   /* is first */
   if(prevblockstop < 0)
      return index;
   
   var dum_stop = (this._array.length * 1000);
   var dum_index = -1;
   
   for(i=0;i<this._array.length;i++)
   {
      /* is not interessant */
      if(this._array[i]._stop > start)
         continue;
      
      /* block found */
      if(this._array[i]._stop == prevblockstop)
      {
         fl_found = true;
         index = i;
         break;
      }
      
      /* the closed next block founded */
      if(dum_stop > start || dum_stop < this._array[i]._stop)
      {
         dum_stop = this._array[i]._stop;
         dum_index = i;
      }
   }
   
   return (fl_found)?index:dum_index;
}

VDWDataBlockArray.prototype.FindNextBlock = function(nr)
{
   var index = -1;
   
   if(nr<0 || nr>=this._array.length)
      return index;
   
   var stop    = this._array[nr]._stop;
   var nextblockstart  = stop + 1;

   for(i=0;i<this._array.length;i++)
   {
      /* block found */
      if(this._array[i]._start != nextblockstart) 
         continue;
      
      index = i;
      break;
   }
   
   return index;
}

VDWDataBlockArray.prototype.FindPrevBlock = function(nr)
{
   var index = -1;
   
   if(nr<0 || nr>=this._array.length)
      return index;
   
   var start    = this._array[nr]._start;
   var prevblockstop  = start - 1;

   /* is first block */
   if(prevblockstop<0)
      return index;
   
   for(i=0;i<this._array.length;i++)
   {
      /* block found */
      //alert(this._array[i]._stop+" != "+prevblockstop);
      if(this._array[i]._stop != prevblockstop) 
         continue;
      
      index = i;
      break;
   }
   
   return index;
}


VDWDataBlockArray.prototype.Add = function(start,stop,data,state)
{
   this._array.push(new VDWDataBlock(parseInt(start),parseInt(stop),data,((!state)?VDW_UNDEFINED_STATE:state)));
   return  ( this._array.length - 1 );
}
