var gsARR_INSERT_WITHSHIFT   = "gsARR_INSERT_WITHSHIFT";


//--------------------------------------------------------------

function is_array(aArray)
{
  return (typeof(aArray) == "object");
}

//--------------------------------------------------------------

function arr_Init(aArray)
{
  if (!is_array(aArray)) 
  {
    aArray = new Array();
  }
  return aArray;
}
//--------------------------------------------------------------

function arr_ValueExists(aArray, sValue)
{
  if (!is_array(aArray)) {return false;}
  
  for (key in aArray)
  {
    if (aArray[key] == sValue) {return true;}
  }
  return false;
  
}

//--------------------------------------------------------------

function arr_GetKey(aArray, sKey)
{
  sKey = s_Init(sKey, "");
  if (sKey != "") 
  {
    return sKey;
  }
  else
  {
    return aArray.length;
  }
}

//--------------------------------------------------------------

function arr_AddNewValue(aArray, sValue, sKey)
{
  aArray = arr_Init(aArray);
  if (arr_ValueExists(aArray, sValue) ) {return aArray;}
  
  sKey = arr_GetKey(aArray, sKey);
  aArray[sKey] = sValue;
  return aArray;
}

//--------------------------------------------------------------

function arr_RemoveValue(aArray, sValue)
{
  aArray = arr_Init(aArray);
  if (!arr_ValueExists(aArray, sValue) ) {return aArray;}
  
  var aResArr = new Array();
  
  for (key in aArray)
  {
    if (aArray[key] != sValue) {aResArr[key] = sValue;}
  }
  return aResArr;
}

/*---------------------------------------------------------*/

function arr_RemoveItem(aArray, iKey)
{
  aRes = new Array();
  var i = 0;
  for (key in aArray)
  {
    if (key != iKey) 
    {
      aRes [i] =  aArray[key];
      i++;
    }
  }
  return aRes;
}

//--------------------------------------------------------------

function arr(aArray, sKey, sEmptyValue)
{
  sEmptyValue = s_Init(sEmptyValue, "");
  if (!is_array(aArray)) {return sEmptyValue;}
  
  for (key in aArray)
  {
    if (key == sKey) {return aArray[key];}
  }
  return sEmptyValue;
}

/*---------------------------------------------------------*/

function arr_Equal(aArrayTo)
{
  var aArrayWhat = new Array();

  if (aArrayTo.length == 0) {return aArrayWhat;}
  var i;
  for (i = 0; i < aArrayTo.length; i++)
  {
    aArrayWhat[i] = aArrayTo[i];
  }
//alert(aArrayWhat.length);
  return aArrayWhat;
}

/*---------------------------------------------------------*/

function arr_InsertItem(aArray, sValue, iKey)
{
  var bShift = false;
  
  if (!s_IsNumeric(iKey)) 
  {
    bShift = s_GetPrefix (iKey, gsARR_INSERT_WITHSHIFT);
    if (bShift) 
    {
      iKey = s_CutPrefix(iKey, gsARR_INSERT_WITHSHIFT); 
      iKey = parseInt(iKey);
    }
  }
  
  var aRes = new Array();
  var iFrom = 0;
  var iTo = 0;

//alert(iKey + "," +aArray.length);  

  if (iKey >= aArray.length - 1) 
  {
    aRes = aArray;
    aRes [ aRes.length ] = sValue;
    return aRes;
  }
  
  for (iFrom = 0; iFrom < aArray.length; iFrom++)
  {
    if ( iTo == iKey ) 
    {
      aRes[iTo] = sValue;
      if (bShift) 
      {
        iTo ++;
        aRes[iTo] = aArray[ iFrom ];
      }
    }
    else
    {
      aRes[iTo] = aArray[ iFrom ];
    }
    iTo ++;
    
  }
  
  return aRes;
}

/*---------------------------------------------------------*/

function arr_MoveItem(aArray, iFrom, iTo)
{
  var vMovedValue = aArray[iFrom];
  var aRes = new Array();
  aRes = arr_InsertItem (aArray, vMovedValue, gsARR_INSERT_WITHSHIFT + iTo);
  if (iFrom > iTo) { iFrom ++; }
  aRes = arr_RemoveItem (aRes, iFrom);
  return aRes;
}

