// 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();
}