package PdhData;

import java.util.Vector;
//import java.io.FileReader;
//import java.io.BufferedReader;
//import java.io.FileWriter;
//import java.io.BufferedWriter;
//import java.io.IOException;

import java.util.ArrayList;

public class PdhArray 
{
  private String arrayName;
  private ArrayList data;
  
  public PdhArray()
  {
    arrayName = "";
    data = new ArrayList();
  }
  
  public void setArrayName(String name)
  {
    arrayName = name;
  }
  
  public void addElement(Object p0)
  {
    //super.addElement(p0);
    data.add(p0);
  }
  
  public Object get(int index)
  {
    return data.get(index);
  }

  public Object elementAt(int index)
  {
    return data.get(index);
  }

  public void setElementAt(Object obj, int index)
  {
    while(index > data.size())
    {
      data.add(null);
    }    
    
    if (inRange(index))
    {
      data.set(index, obj);
    }

    //super.setElementAt(p0,p1);
  }

  public int getEmptyElement()
  {
    int i = 1;
    while (i < data.size())
    {
      if(data.get(i) == null) return i;
      i++;
    }
    return PdhError.NOT_FOUND;
  }

  public int addData(PdhData d)
  {
    int i = this.getEmptyElement();
    if(i == PdhError.NOT_FOUND)
    {
      i = data.size();
      d.setId(i);
      //this.addElement(d);
      data.add(d);
    }
    else
    {
      d.setId(i);
      //this.setElementAt(d, i);
      data.set(i,d);
    }
    return i;
  }

  public int search(String s)
  {
    if (data.size() > 1)
    {
      for(int i=1; i<data.size(); i++)
      {
        if(data.get(i).toString().startsWith(s))
          return i;
      }
    }
    return PdhError.NOT_FOUND;
  }

  public void deleteItem(int i)
  {
    if (i > data.size() ) return;
    if (data.get(i) == null) return;
    data.set(i, null);
  }
  
  /**
   * count()
   * @return the number of not null elements in this array
   */
  public int count()
  {
    int c = 0;
    for(int i=0; i<data.size(); i++)
    {
      if(data.get(i) != null) c++;
    }
    return c;
  }
  
  public int getFirstId()
  {
    for(int i=0; i<data.size(); i++)
    {
      if(data.get(i) != null) return i;
    }
    return PdhError.NOT_FOUND;
  }

  public int getNextId(int s)
  {
    if((s>=data.size()) || (s<0)) return PdhError.OUT_OF_RANGE;
    for(int i=s+1; i<data.size(); i++)
    {
      if(data.get(i) != null) return i;
    }
    return PdhError.NOT_FOUND;
  }
  
  public int size()
  {
    return data.size();
  }
  
  public boolean inRange(int index)
  {
    return ( index>=0 && index<=data.size());
  }
  
  public Vector toVector()
  {
    Vector vData = new Vector();
    
    for(int i=0; i<data.size(); i++)
    {
      vData.add(data.get(i));
    }
    
    return vData;
  }
  
  public void clear()
  {
    data.clear();
  }
  
  public void remove(int index)
  {
    data.remove(index);
  }
}
