// === Сервисы для таблиц ===
// (c) Corelogic, 2006-2007

var table_global = new Object;
table_global.version = '1.7.0';
table_global.releaseDate = '2008.01.15';

// подключение
var documentLoaded = false;
table();
main_addEvent(window, 'load', new Function('documentLoaded = true;'));

// основная функция
function table(cnt)
{
	var cnt = cnt || 0;
	cnt++;
	table_tblsrch();
	var p_loaded = false;
	try
	{
		if (project_global) {p_loaded=project_global.documentLoaded};
	}
	catch(e){};
	if (!(documentLoaded || p_loaded))
	{
		setTimeout('table('+cnt+');', cnt*1000);
	};
}

// ищем таблицы
function table_tblsrch()
{
	var tables = main_$T('TABLE');
	for (var i=0, imax=tables.length; i<imax; i++)
	{
		var cn = tables[i].className;
		if (/(^| )fragmented( |$)/i.test(cn))
		{table_fragmented(tables[i])};
		if (/(^| )selectable( |$)/i.test(cn))
		{table_setselevent(tables[i])};
		if (/(^| )activateable( |$)/i.test(cn))
		{table_setselevent(tables[i], true)};
		if (!/(^| )nosort( |$)/i.test(cn))
		{
			if (/(^| )sortable( |$)/i.test(cn) && !/(^| )nsortable( |$)/i.test(cn))
			{table_setsortevent(tables[i], 'sortable')};
			if (/(^| )nsortable( |$)/i.test(cn))
			{table_setsortevent(tables[i], 'nsortable')};
			var trs = tables[i].rows;
			var isdefsort = false;
			for (var k=0, kmax=trs.length; k<kmax; k++)
			{
				var ths = main_$T('TH', trs[k].cells)
				for (var j=0, jmax=ths.length; j<jmax; j++)
				{
					var thel = ths[j];
					if (!isdefsort && /(^| )defaultsort( |$)/i.test(thel.className)) {isdefsort = true};
					if (/(^| )n?sortable( |$)/i.test(thel.className) && thel.title!="Нажмите для сортировки")
					{
						if (!/(^| )sortable( |$)/i.test(thel.className)) {thel.className+=' sortable'};
						if (!/(^| )nsortable( |$)/i.test(thel.className))
						{
							if (table_sort(thel, '', true))
							{thel.className+=' nsortable'};
						};
						thel.title = "Нажмите для сортировки";
						thel.onclick = new Function('table_sort(this, "inverse")');
						thel.innerHTML = '<div>'+thel.innerHTML+'</div>';
					}
				}
			}
			if (isdefsort)
			{
				for (var k=0, kmax=trs.length; k<kmax; k++)
				{
					var ths = main_$T('TH', trs[k].cells);
					for (var j=0, jmax=ths.length; j<jmax; j++)
					{
						var thel = ths[j];
						if (/(^| )defaultsort( |$)/i.test(thel.className) && !/(^| )(sortdirect|sortinverse)( |$)/i.test(thel.firstChild.className))
						{table_sort(thel, "inverse");};
					}
				}
			}
		}
	}
}

// расставляем классы для сортировочных ячеек
function table_setsortevent(tblel, cls)
{
	var trs = tblel.rows;
	for (var k=0, kmax=trs.length; k<kmax; k++)
	{
		var ths = main_$T('TH', trs[k].cells)
		for (var i=0, imax=ths.length; i<imax; i++)
		{
			var cn = String(ths[i].className);
			if (!/(^| )nosort( |$)/i.test(cn))
			{
				if (!/(^| )sortable( |$)/i.test(cn))
				{ths[i].className+=' sortable'};
				if (cls=='nsortable' && !/(^| )nsortable( |$)/i.test(cn))
				{ths[i].className+=' nsortable'};
			}
		}
	}
}

// расставляем обработчики выделения строк
function table_setselevent(tblel, foract)
{
	var trs = tblel.rows;
	for (var i=0, imax=trs.length; i<imax; i++)
	{
		if (main_$T('TH', trs[i].cells).length==0)
		{
			if (foract)
			{
				main_removeEvent(trs[i], 'mouseup', table_selevt);
				main_addEvent(trs[i], 'mouseup', table_selevt);
			}
			else
			{
				main_removeEvent(trs[i], 'mouseover', table_selevt);
				main_addEvent(trs[i], 'mouseover', table_selevt);
				main_removeEvent(trs[i], 'mouseout', table_selevt);
				main_addEvent(trs[i], 'mouseout', table_selevt);
			}
		}
	}
}

// обработка события выделения под курсором
function table_selevt(evt)
{
	var evt = evt || window.event;
	var el = window.event ? window.event.srcElement : evt.target;
	while (el.tagName!='TR') {el=el.parentNode};
	if (evt.type=='mouseup')
	{
		if (/(^| )activated( |$)/i.test(el.className))
		{main_removeClass(el, 'activated')}
		else {el.className+=' activated'};
	}
	else
	{
		if (evt.type=='mouseover') {el.className+=' selected'};
		if (evt.type=='mouseout') {main_removeClass(el, 'selected')};
	}
}

// красим таблицу фрагментирующими полосками
function table_fragmented(tblel)
{
	var rows = tblel.rows;
	var even = true;
	for (var i=0, imax=rows.length; i<imax; i++)
	{
		if (main_$T('TD', rows[i].cells).length>0)
		{
			rows[i].className = rows[i].className.replace(/(?:^| )(?:odd|even)(?: |$)/ig, ' ');
			if (even)
			{
				even = false;
				rows[i].className += ' even';
			}
			else
			{
				even = true;
				rows[i].className += ' odd';
			}
		}
	}
}

// сортировка
function table_sort(causeel, mode, nsortTest)
{
	// ищем положение заголовочной ячейки и количество сортируемых строк
	var isnsort = /(^| )nsortable( |$)/i.test(causeel.className) ? true : false;
	var trels = main_$T('TH', causeel.parentNode.cells);
	var colidx = 0;
	for (var i=0, imax=trels.length; i<imax; i++)
	{
		if (trels[i] == causeel)
		{break;}
		else
		{
			var colspan;
			if (!(colspan = trels[i].getAttribute('colspan')))
			{colspan = 1};
			colidx += Number(colspan);
		}
	}
	var tbl = causeel.parentNode;
	while (tbl.tagName != "TABLE") {tbl = tbl.parentNode} ;
	var rows = tbl.rows;
	var rowidx = -1;
	var rowcnt = -1;
	var causepar = causeel.parentNode;
	for (var i=0, imax=rows.length; i<imax; i++)
	{
		if (rowidx>-1 && main_$T('TH', rows[i].cells).length>0) {rowcnt = i-rowidx-1; break};
		if (rowidx>-1 && i==imax-1) {rowcnt = i-rowidx; break};
		if (rows[i]==causepar) {rowidx = i};
	};
	if (rowcnt<1) {return false};
	// заполняем сортировочный и общий массивы 
	var sortarr = [];
	var trarr = [];
	for (var i=0; i<rowcnt; i++)
	{
		var idx = 0;
		var tds = main_$T('TD', rows[i+rowidx+1].cells);
		var colspan;
		for (var j=0, jmax=tds.length; j<jmax; j++)
		{
			if (!(colspan = tds[j].getAttribute('colspan')))
			{colspan = 1};
			if (idx==colidx)
			{
				var sortval = tds[j].getAttribute('sortvalue') || String(tds[j].innerHTML.replace(/<.*?>/g, ''));
				if (!nsortTest)
				{
					if (isnsort)
					{
						sortval = sortval.replace(/[^-\d\.\,]/g, '').replace(/\.|\,/, 'a').replace(/\.|\,/g, '').replace(/a/g, '.');
						sortval =  parseFloat(sortval) + 9E9;
					}
					sortarr[i] = [String(sortval), i];
				}
				else
				{
					if (isNaN(sortval)) {return false};
				};
			};
			idx += Number(colspan);
		}
		if (!nsortTest) {trarr[i] = rows[i+rowidx+1]};
	}
	if (nsortTest) {return true};
	// убираем спец. классы и правим функции
	var ths = main_$T('TH', rows[rowidx].cells);
	for (var i=0, imax=ths.length; i<imax; i++)
	{
		if (ths[i]!=causeel && /(^| )n?sortable($| )/i.test(ths[i].className))
		{
			
			ths[i].firstChild.className = '';
			ths[i].onclick = new Function('table_sort(this, "inverse")');
		};
	}
	// сортируем
	sortarr = sortarr.sort();
	if (mode=="direct")
	{
		causeel.onclick = new Function('table_sort(this, "inverse")');
		causeel.firstChild.className = 'sortdirect';
	}
	else
	{
		sortarr = sortarr.reverse();
		causeel.onclick = new Function('table_sort(this, "direct")');
		causeel.firstChild.className = 'sortinverse';
	}
	// удаляем старые строки и вставляем новые
	var par = rows[rowidx+1].parentNode;
	var blankrow = document.createElement('TR');
	par.insertBefore(blankrow, rows[rowidx+1]);
	for (var i=0; i<rowcnt; i++)
	{
		var idx=sortarr[i][1];
		par.insertBefore(trarr[idx], blankrow);
		
	}
	par.removeChild(blankrow);
	// перекрашиваем, если нужно
	if (/(^| )fragmented($| )/i.test(tbl.className))
	{table_fragmented(tbl)};
	if (/(^| )selectable($| )/i.test(tbl.className))
	{table_setselevent(tbl)};
	if (/(^| )activateable($| )/i.test(tbl.className))
	{table_setselevent(tbl, true)};
}