// idhash.js

function CIdHash( strDelimiter)
{
  if ( strDelimiter == null)
    strDelimiter = ",";
  this.m_strDelimiter = strDelimiter;
  this.m_ar = new CArray();
  this.Init = CHash_Init;
  this.Init();
  this.Mem = function( nId)
  {
    if (this.Item( nId))
    {
    }
    else
    {
      var nIndex = this.m_ar.Push( nId);
      this.Set( nId, nIndex+1);
    }
  }
  this.Remove = function( nId)
  {
    var nIndex = this.Item( nId);
    if (nIndex)
    {
      this.m_ar.Set(0, nIndex-1); // We should not delete index position - other position should not be changed
    }
    this.Del( nId);
  }
  this.Fill = function( str)
  {
    var arIds = str.split( this.m_strDelimiter);
    for ( var i=0; i < arIds.length; i++) 
    {
      this.Mem( arIds[i]);
    }
  }
  this.Cmp = function( a,b)
  {
    //var nRes = a - b;
    var nRes = 0;
    if ( a < b)
      nRes = -1;
    if ( b < a)
      nRes = 1;
    return nRes;
  }

  this.Value = function()
  {
    var strValue = "";
    var bFirst = true;
    var m_ar = new CArray();
    m_ar.CopyNotNullFrom( this.m_ar);
    try
    {
      m_ar.m_arItems.sort( this.Cmp);
    }
    catch ( e)
    {
      // IE 6 SP2 give this exception. This code is only for it.
    }
    for ( var i=0; i < m_ar.Count(); i++) 
    {
      if (m_ar.Item(i))
      {
        if ( bFirst)
        {
        }
        else
        {
          strValue = strValue + this.m_strDelimiter;
        }
        strValue = strValue + m_ar.Item(i);
        bFirst = false;
      }
    }
    return strValue;
  }
  this.Count = function()
  {
    var nCount = 0;
    for ( var i=0; i < this.m_ar.Count(); i++) 
    {
      if (this.m_ar.Item(i))
        nCount++;
    }
    return nCount;
  }
}

function FillMultiNameIdHash( strNameList, strDelimiter)
{
  if ( strDelimiter == null)
    strDelimiter = ' ';
  var idHash = new CIdHash( strDelimiter);
  idHash.Fill( strNameList);
  return idHash;
}

function AddNameToMultiNameValue( strName, strNameList, strDelimiter)
{
  var idHash = FillMultiNameIdHash( strNameList, strDelimiter)
  idHash.Mem( strName);
  return idHash.Value();
}

function RemoveNameFromMultiNameValue( strName, strNameList, strDelimiter)
{
  var idHash = FillMultiNameIdHash( strNameList, strDelimiter)
  idHash.Remove( strName);
  return idHash.Value();
}

// Use access.js functions !!!
function ReplaceClassName( item, strClassNameOld, strClassNameNew)
{
  var bIs = false;
  if ( item)
  {
    bIs = true;
    var strClassName = GetClassName( item);

    if ( !IsStringEmpty( strClassNameOld))
      strClassName = RemoveNameFromMultiNameValue( strClassNameOld, strClassName);
    if ( !IsStringEmpty( strClassNameNew))
      strClassName = AddNameToMultiNameValue( strClassNameNew, strClassName);

    SetClassName( item, strClassName);
  }
  return bIs;
}

// Use access.js functions !!!
function AddRemoveClassName( item, strClassName, bAdd)
{
  var strClassNameNew = '';
  var strClassNameOld = '';
  if ( bAdd)
    strClassNameNew = strClassName;
  else
    strClassNameOld = strClassName;

  return ReplaceClassName( item, strClassNameOld, strClassNameNew);
}

function CountOfUniqueValues( strValue)
{
  var idHash = new CIdHash();
  idHash.Fill( strValue);
  return idHash.Count();
}
