
///Выделение строки.
///<param name="eThis">Елемент строка (tr) которую необходимо сделать текущей<param>
///<param name="selRowClassName">Стиль который будет использован для выделенной строки<param>
///<param name="storeElementId">Идентификатор элемента в котором будет сохраняться служебная информация при селектировании строки<param>
///<param name="valueId">идентификатор данных (записи) Дополнительный параметр, может использоваться для редактирования/удаления записи общей кнопкой редактирования для всей таблицы<param>
function setCurRow(eThis, selRowClassName, storeElementId, valueId) 
{
	var tbl = eThis.parentNode.parentNode;

	//1. получим информации по текущей выделенной строке для возврата её в не выделенное состояние
	var curRowInfo = getCurrentRowInfo(storeElementId);
	if(curRowInfo != null)
	{
		tbl.firstChild.childNodes[curRowInfo.rowInd].className = curRowInfo.rowClassName;
	}
	
	//2. запомним параметры выделяемой строки
	var newCurRowInfo = new currentRowInfo(eThis.className, eThis.rowIndex, valueId);
	setCurrentRowInfo(storeElementId, newCurRowInfo);

	//3. выделяем строку
	eThis.className = selRowClassName;
}

///Получение информации о выделенной строке из элемента в котором она сохранена
//<returns>Объект класса currentRowInfo </returns>
function getCurrentRowInfo(storeElementId)
{
	//- получим элеиент в котором хранится информация о выделенной строке
	var eStore = document.getElementById(storeElementId);
	if(eStore == null)
	{
		alert("Отсутствует элемент для хранения информации о выделеной строке. " + storeElementId);
		return;
	}

	//- гарантируем наличие текстового элемента
	if (eStore.firstChild == null)
	{
		var textNode = document.createTextNode("");
		eStore.appendChild(textNode);
	}	
	var eStoreVal = eStore.firstChild.nodeValue;
	
	if(eStoreVal == null)
		eStoreVal = new String();
	
	if(eStoreVal.length > 0)
	{
		var storeValues = eStoreVal.split("|");
		if(storeValues.length < 3)
		{
			alert("Отсутствует информация необходимая для функции выделения строки.");
			alert("eStoreVal = " + eStoreVal +  ";  eStoreVal.length = " + eStoreVal.length);
			return(null);
		}
		
		var curRowInfo = new currentRowInfo(storeValues[0], storeValues[1], storeValues[2]);
		
		return(curRowInfo);
	}
	else
		return(null);
}

///Запись информации о выделенной строке в элемент который для этого предназначен
///<param name="curRowInfo">Объект класса currentRowInfo </param>
function setCurrentRowInfo(storeElementId, curRowInfo)
{
	//- получим элеиент в котором хранится информация о выделенной строке
	var eStore = document.getElementById(storeElementId);
	if(eStore == null)
	{
		alert("Отсутствует элемент для хранения информации о выделеной строке.");
		return;
	}
	
	//- гарантируем наличие текстового элемента
	if (eStore.firstChild == null)
	{
		var textNode = document.createTextNode("");
		eStore.appendChild(textNode);
	}	
	
	//-сохраним информацию (!!! любые изменения способа формирования этой информации синхронизировать с формированием такой же информации в модуле table_u.php функция make_body_rows)
	eStore.firstChild.nodeValue = curRowInfo.rowClassName + "|" + curRowInfo.rowInd + "|" + curRowInfo.valueId;
}


///class currentRowInfo (просто record с полями)
function currentRowInfo(rowClassName, rowInd, valueId)
{
	this.rowClassName = rowClassName;
	this.rowInd = rowInd;
	this.valueId = valueId;	
}


// ---------------------------------------------------------------------------
// ------------ tabs ---------------------------------------------------------
// ---------------------------------------------------------------------------

///<param name="uf">name of user function</param>
function switchTab(tabIdBase, activeId, activeStyle, noactiveStyle, uf)
{
	var eStoreId = tabIdBase + "_store";
	
	var eStore = document.getElementById(eStoreId);
	if(eStore == null)
	{
		alert("Сервисная информация для закладок не найдена - " + eStoreId);
		return;
	}

	//- гарантируем наличие текстового элемента
	if (eStore.firstChild == null)
	{
		var textNode = document.createTextNode("");
		eStore.appendChild(textNode);
	}	
	var eStoreVal = eStore.firstChild.nodeValue;
	
	if(eStoreVal == null)
		eStoreVal = new String();
	
	var storeValues = eStoreVal.split("|");

	var prevActiveId = "";
	
	var count = storeValues.length;
	var tabId, eTab, id;
	for(i=0; i<count; i++)
	{
		id = storeValues[i];
		tabId = tabIdBase + "_" + id;
		eTab = document.getElementById(tabId);
		if(eTab == null)
		{
			alert("Закладка не найдена - " + tabId);
			return;
		}
		
		if( (eTab.className == activeStyle) && (id == activeId) )
			return; // табик уже активный, ничего делать не надо

		if(eTab.className == activeStyle)
			prevActiveId = id;
		
		eTab.className = noactiveStyle;
	}
	
	tabId = tabIdBase + "_" + activeId;
	eTab = document.getElementById(tabId);
	if(eTab == null)
	{
		alert("Текущая закладка не найдена - " + tabId);
		return;
	}
	eTab.className = activeStyle;
	
	// event
	if(uf != null)
	{
		eval(uf+"(activeId, prevActiveId);");
	}
}



// ---------------------------------------------------------------------------
// ------------ pages ---------------------------------------------------------
// ---------------------------------------------------------------------------

///<param name="uf">name of user function</param>
function switchPage(curPg, rowPerPage, uf)
{
	// event
	if(uf != null)
	{
		eval(uf+"(curPg, rowPerPage);");
	}
}