/*
originally written by paul sowden <paul@idontsmoke.co.uk> | http://idontsmoke.co.uk
modified and localized by alexander shurkayev <alshur@narod.ru> | http://htmlcoder.visions.ru
last modified by Antip for Amadeus
*/
var DEFSORT=1;			  // Указываем столбец сортировки
var MAXTABLES=0;
var DBLDEFSORT=0;		  // Порядок сортировки
var sort_case_sensitive = false; // вид сортировки (регистрозависимый или нет)
var prefix='';
var SELECTEDNUM=0;
var SELECTED='#DDDDDF';		// Цвет выделенного элемента
var SEMISELECTED='#EEEEEF';		// Цвет выделенного элемента
var SELECTEDNONE='WHITE';	// Цвет не выделенного элемента
var constnonesort=0;

// Ф-я необходима если надо подсвечивать строку под курсором
function netie(net, ie,a)
{
	if ((navigator.appVersion.substring(0,3) >= net && navigator.appName == 'Netscape' && net != -1) ||
		(navigator.appVersion.substring(0,3) >= ie && navigator.appName.substring(0,9) == 'Microsoft' && ie != -1))
	{
		if (a) 
			return SELECTED; 
		else 
			return SELECTEDNONE;
	}
	else
		return null;
}
// ф-ция, определяющая алгоритм сортировки
function _sort(a, b)
{
	var a = a[0];
	var b = b[0];
	if (Number(a) && Number(b))
		return sort_numbers(a, b);
	else
		if (!sort_case_sensitive)
			return sort_insensitive(a, b);
		else
			return sort_sensitive(a, b);
}

// ф-ция сортировки чисел
function sort_numbers(a, b)
{
	return a - b;
}

// ф-ция регистронезависимой сортировки
function sort_insensitive(a, b)
{
	var anew = a.toLowerCase();
	var bnew = b.toLowerCase();
	return sort_sensitive(anew, bnew);
}

// ф-ция регистрозависимой сортировки
function sort_sensitive(a, b)
{
	if (a < b)
		return -1;
	if (a > b)
		return 1;
	return 0;
}

// вспомогательная ф-ция, выдирающая из дочерних узлов весь текст
function getConcatenedTextContent(node)
{
	if (node == null)
		return "";
	var _result = "";
	var childrens = node.childNodes;
	var i = 0;
	while (i < childrens.length)
	{
		var child = childrens.item(i);
		switch (child.nodeType)
		{
		case 1: // ELEMENT_NODE
		case 5: // ENTITY_REFERENCE_NODE
			_result += getConcatenedTextContent(child);
			break;
		case 3: // TEXT_NODE
		case 2: // ATTRIBUTE_NODE
		case 4: // CDATA_SECTION_NODE
			_result += child.nodeValue;
			break;
		case 6: // ENTITY_NODE
		case 7: // PROCESSING_INSTRUCTION_NODE
		case 8: // COMMENT_NODE
		case 9: // DOCUMENT_NODE
		case 10: // DOCUMENT_TYPE_NODE
		case 11: // DOCUMENT_FRAGMENT_NODE
		case 12: // NOTATION_NODE
			// skip
			break;
		}
		i++;
	}
	return _result;
}

// суть скрипта
function sort(e,myNode)
{
	var el = myNode ? myNode : window.event ? window.event.srcElement : e.currentTarget;
	while (el.tagName.toLowerCase() != "td")
		el = el.parentNode;
	// var a = new Array();
	var name = el.lastChild.nodeValue;
	var dad = el.parentNode;
	var table = dad.parentNode.parentNode;
	var up = table.up;
	var node, arrow, curcol;
	for (var i = 0; (node = dad.getElementsByTagName("td").item(i)); i++) 
	{
		if ((typeof(node.lastChild) == 'object') && (node.lastChild.nodeValue == name))
		{
			curcol = i;
			DEFSORT=i;
			if (node.className == "curcol")
			{
				table.up = Number(!up);
				if (table.up)
					node.style.textDecoration='overline';
				else 
					node.style.textDecoration='underline';
			}
			else
			{
				node.className = "curcol";
				arrow = node.insertBefore(document.createElement("b"),node.firstChild);
				table.up = 0;
			}
			//DBLDEFSORT=table.up;
		}
		else
		{
			if (node.className == "curcol")
			{
				node.className = "";
				node.style.textDecoration='underline';
				if (node.firstChild)
					node.removeChild(node.firstChild);
			}
		}
	}

	var prewtbody=0;
	var a = new Array();
	var flag=0;
	var tbody = table.getElementsByTagName("tbody").item(0);
	for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) 
	{
		if (getConcatenedTextContent(node.getElementsByTagName("td").item(0))!='99Z')
		// если в первом столбце указано 99Z то эта строка должна быть последней
		{
			a[i] = new Array();
			a[i][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(curcol));
			a[i][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));
			a[i][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0));
			a[i][3] = node;
		}
		else
		{
			x = new Array();
			x[0] = getConcatenedTextContent(node.getElementsByTagName("td").item(curcol));
			x[1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));
			x[2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0));
			x[3] = node;
			flag=1;
		}
	}
	a.sort(_sort);
	if (table.up)
		a.reverse(); //Если надо то обратная сортировка

	for (var i = 0; i < a.length; i++) 
		tbody.appendChild(a[i][3]);
	if (flag)
		tbody.appendChild(x[3]);
	if (window.fform && typeof(fform.tabel_selected_value)=="object")
		fform.tabel_selected_value.value=curcol+','+table.up;	//"Номер столбца для сортировки","порядок сортировки"
}

function nonesort(e)
{
	var el = window.event ? window.event.srcElement : e.currentTarget;
	while (el.tagName.toLowerCase() != "td")
		el = el.parentNode;
	var name = el.lastChild.nodeValue;
	var dad = el.parentNode;
	var table = dad.parentNode.parentNode;
	var up = table.up;
	var node, arrow, curcol;
	for (var i = 0; (node = dad.getElementsByTagName("td").item(i)); i++) 
	{
		if (node.lastChild.nodeValue == name)
		{
			curcol = i;
			DEFSORT=i;
			if (node.className == "curcol")
			{
				table.up = Number(!up);
				if (table.up)
					node.style.textDecoration='overline';
				else 
					node.style.textDecoration='underline';
			}
			else
			{
				node.className = "curcol";
				node.style.textDecoration='underline';
				table.up = 0;
			}
			//DBLDEFSORT=table.up;
		}//if
		else
		{
			if (node.className == "curcol")
			{
				node.className = "";
				node.style.textDecoration='underline';
			}
		}
	}
	onChangeSort(curcol,table.up);
}
//-----------------------------------------------------
// ф-ция инициализации всего процесса
function init(e)
{
	if (!document.getElementsByTagName)
		return;
	for (var j = 0; (thead = document.getElementsByTagName("thead").item(j)); j++) 
	{
		var node;
		if (thead.className=='sort')
		{
			thead.parentNode.up = (DBLDEFSORT)? 1 : 0;
			for (var i = 0; (node = thead.getElementsByTagName("td").item(i)); i++) 
			{
				if (node.value!='nne')
				{
					if (constnonesort)
					{
						if (node.addEventListener)
							node.addEventListener("click", nonesort, false);
						else
							if (node.attachEvent)
								node.attachEvent("onclick", nonesort);
					}
					else
					{
						if (node.addEventListener)
							node.addEventListener("click", sort, false);
						else
							if (node.attachEvent)
								node.attachEvent("onclick", sort);
					}
					node.title = "Нажмите на заголовок, чтобы отсортировать колонку"; // задаём подсказку у заголовка таблицы
					node.style.textDecoration='underline';
					if (!constnonesort)
						if (i==DEFSORT)  // Если указан текущий столбец для сортировки то кликнем на нем
						{
							if (DBLDEFSORT)
								node.click(); // Если порядок , то еще раз
							node.click();
						}
					if (node.value=='UP')
						node.click();
				}
				else
				{
					node.style.textDecoration='none';
					node.style.cursor='default';
				}
			}
		}
		if (thead.className=='quotasort')
		{
			for (var i = 0; (node = thead.getElementsByTagName("td").item(i)); i++) 
			{
				if (node.value!='nne')
				{
					if (node.addEventListener)
						node.addEventListener("click", nonesort, false);
					else
						if (node.attachEvent)
							node.attachEvent("onclick", nonesort);
					node.title = "Нажмите на заголовок, чтобы отсортировать колонку"; // задаём подсказку у заголовка таблицы
					node.style.textDecoration='underline';
					if (node.value=='DN')
					{
						node.style.textDecoration='underline';
						node.className = "curcol";
						thead.parentNode.up=0;
					}
					if (node.value=='UP')
					{
						node.style.textDecoration='overline';
						thead.parentNode.up=1;
						node.className = "curcol";
					}
				}
				else
				{
					node.style.textDecoration='underline';
					node.style.cursor='default';
				}
			}
		}
	}
}

// запускаем ф-цию init() при возникновении события load
var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
if (root)
{
    if (root.addEventListener)
		root.addEventListener("load", init, false);
    else
		if (root.attachEvent)
			root.attachEvent("onload", init);
}
// При клике на строку происходит событие, val - текст в первом столбце
function selclick(val)	//,idTable)
{
	result_node=-1;
	var node;	
	// В цикле пробегаем по всем таблицам и узнаем, какая строка выделенна
	for (var j = 0; (tbody = document.getElementsByTagName("tbody").item(j)); j++)
	{
		var First=true;
		if (tbody.className=='sort' || tbody.className=='quotasort' ) 
			for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) 
			{
				p=node.getElementsByTagName("td").item(0);
				if (p.value==val)
				{
					result_node=node;
					node.style.background=SELECTED;
				}
				else
					node.style.background=SELECTEDNONE;
			}
		if (tbody.className=='FlatTable')
			for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) 
				if (node.value==val)
				{
					node.style.background=SELECTED;
					if (First && (CnFlexTables > 1 || val != 0))
					{
						First=false;
						node.parentElement.parentElement.parentElement.scrollTop =
							node.offsetTop - node.parentElement.firstChild.offsetHeight;
					}
				}
				else
					node.style.background=SELECTEDNONE;
	}
	return result_node;
}

var myRow,myVal;
function scrollSel(num)	//выделение цветом в таблице и скроллинг
{
	var myRows=divs[ndivs[num]].getElementsByTagName('TBODY')[0].rows;
	var myValue;
	var notYet=(goOut(myRow,'DIV').value!=num);
	for(var i=0; i<myRows.length; i++)
	{
		myValue=(window['Synchro'])? myRows[i].cells[Synchro[num]].innerText : myRows[i].value;
		if(myValue==myVal)
		{
			myRows[i].style.background=SEMISELECTED;	//слабо
			if(notYet)
			{
				notYet=false;
				divs[ndivs[num]].scrollTop=myRows[i].offsetTop-myRows[i].style.height-myRows[0].offsetTop-4;
			}
		}
		else
			myRows[i].style.background=SELECTEDNONE;	//никак
	}
}
function myClick()	//определить строку и искомое значение
{
	myRow=goOut(this.event.srcElement,'TR');	//текущая строка
	if(window['Synchro'])	//массив Synchro на странице определён - надо синхронизировать
	{
		myVal=myRow.cells[Synchro[goOut(myRow,'DIV').value]].innerText;	//искомое значение
		for(var i=0; i<CnFlexTables; i++)
		{
			if(goOut(myRow,'DIV').value!=i)	//кликнутую таблицу не сортируем
			{
				myTable = divs[ndivs[i]].getElementsByTagName('TABLE')[0];
				if (myTable.className=="sort")	//сортируем только с классом sort
				{
					myTable.up = true;	//всегда в прямом порядке
					sort(false,myTable.cells[Synchro[i]]);	//по интересующему столбцу
				}
			}
			scrollSel(i);	//выделяем
		}
	}
	else
	{
		myVal=myRow.value;	//искомое значение
		scrollSel(goOut(myRow,'DIV').value);	//выделяем
	}
	myRow.style.background=SELECTED;	//сильно выделяем кликнутую строку
}
function goOut(node,tag)	//из node лезть наружу, пока не окажемся в tag
{
	while (node && (node.tagName != tag))
		node=node.parentElement;
	return node;
}

