function addEvent(elm,evType,fn,useCapture){
	if(elm.addEventListener){
		elm.addEventListener(evType,fn,useCapture);
		return true;
	}else if(elm.attachEvent){
		var r=elm.attachEvent("on"+evType,fn);
		return r;
	}else alert("Handler could not be removed");
}
//Берем найближч батька з тегом pTagName
function getParent(el,pTagName){
	if(el==null) return null;
	else if(el.nodeType==1 && el.tagName.toLowerCase()==pTagName.toLowerCase()) return el;
	else return getParent(el.parentNode,pTagName);
}
//сорт тбл
var SORT_COLUMN_INDEX;
//Проходимо всі тбл, виклик ts_makeSortable для тбл із класом sortable
function sortables_init(){
	if(!document.getElementsByTagName) return;
	tbls=document.getElementsByTagName("table");
	for(ti=0;ti<tbls.length;ti++){
		thisTbl=tbls[ti];
		if(((' '+thisTbl.className+' ').indexOf("sortable")!=-1)&&(thisTbl.id)) ts_makeSortable(thisTbl);
	}
}
//Додаєм події+стилі для сорт мишею
function ts_makeSortable(table){
	if(table.rows && table.rows.length>0) var firstRow=table.rows[0];
	if(!firstRow) return;
	// Перший ряд: припуск, що це заголовок, робим його клікабельним
	for(var i=0;i<firstRow.cells.length;i++){
		var cell=firstRow.cells[i];
		if(cell.className.indexOf("sortable")<0) continue;
		var txt=ts_getInnerText(cell);
		cell.innerHTML='<a href="#" class="sortheader" '+'onclick="ts_resortTable(this,'+i+');stripe();return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
	}
}
//берем текст елемента
function ts_getInnerText(el){
	if(typeof el=="string") return el;
	if(typeof el=="undefined") return el;
	if(el.innerText) return el.innerText;//Не треба, але так швидше
	var str='';var cs=el.childNodes;var l=cs.length;
	for(var i=0;i<l;i++){
		switch (cs[i].nodeType){
			case 1://ELEMENT_NODE
				str+=ts_getInnerText(cs[i]);break;
			case 3://TEXT_NODE
				str+=cs[i].nodeValue;break;
		}
	}
	return str;
}
//Запуск сорт. функ. по колонці тбл для кожної тбл
function ts_resortTable(lnk,clid){// берем span
	var span;
	for(var ci=0;ci<lnk.childNodes.length;ci++) if(lnk.childNodes[ci].tagName&&lnk.childNodes[ci].tagName.toLowerCase()=='span') span=lnk.childNodes[ci];
	var spantext=ts_getInnerText(span);
	var td=lnk.parentNode;
	var column=clid||td.cellIndex;
	var table=getParent(td,'table');
	if(table.rows.length<=1) return;
	var itm=ts_getInnerText(table.rows[1].cells[column]);
	sortfn=ts_sort_caseinsensitive;
	if(itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn=ts_sort_date;
	if(itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn=ts_sort_date;
	if(itm.match(/^[Ј$]/)) sortfn=ts_sort_currency;
	if(itm.match(/^[\d\.]+$/)) sortfn=ts_sort_numeric;
	if(itm.match(/^(-)?[\d\.]+$/)) sortfn=ts_sort_numeric;
	SORT_COLUMN_INDEX=column;
	var tbodies=table.getElementsByTagName("tbody");
	for(var h=0;h<tbodies.length;h++){
		var tableBody=tbodies[h];
		var newRows=new Array();
		var trs=tableBody.getElementsByTagName("tr");
		for(var i=0;i<trs.length;i++) newRows[i]=trs[i];
		newRows.sort(sortfn);
		if(span.getAttribute("sortdir")=='down') newRows.reverse();
		for(var i=0;i<newRows.length;i++) if(!newRows[i].className||(newRows[i].className&&(newRows[i].className.indexOf('sortbottom')==-1))) tableBody.appendChild(newRows[i]);
		for(var i=0;i<newRows.length;i++) if(newRows[i].className&&(newRows[i].className.indexOf('sortbottom')!=-1)) tableBody.appendChild(newRows[i]);
	}
	if(span.getAttribute("sortdir")=='down'){
		ARROW='&nbsp;&nbsp;&uarr;';
		span.setAttribute('sortdir','up');
	}else{
		ARROW='&nbsp;&nbsp;&darr;';
		span.setAttribute('sortdir','down');
	}

	// Витираємо всі інші ряди що можуть показатись
	var allspans=document.getElementsByTagName("span");
	for(var ci=0;ci<allspans.length;ci++) if(allspans[ci].className=='sortarrow') if(getParent(allspans[ci],"table")==getParent(lnk,"table")) allspans[ci].innerHTML='&nbsp;&nbsp;&nbsp;';
	span.innerHTML=ARROW;
}
//Сортуєм ряди як дати
function ts_sort_date(a,b){//y2k: 2 цифри<50 берем як 20хх,>50 берем як 19хх
	aa=ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb=ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if(aa.length==10){
		dt1=aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
	}else{
		yr=aa.substr(6,2);
		if(parseInt(yr)<50) yr='20'+yr;else yr='19'+yr;
		dt1=yr+aa.substr(3,2)+aa.substr(0,2);
	}
	if(bb.length==10){
		dt2=bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
	}else{
		yr=bb.substr(6,2);
		if(parseInt(yr)<50) yr='20'+yr;else yr='19'+yr;
		dt2=yr+bb.substr(3,2)+bb.substr(0,2);
	}
	if(dt1==dt2) return 0;
	if(dt1<dt2) return -1;
	return 1;
}
//Сорт ряди як гроші
function ts_sort_currency(a,b){
	aa=ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	bb=ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	return parseFloat(aa)-parseFloat(bb);
}
//Сортуємо як числа
function ts_sort_numeric(a,b){
	aa=parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
	if(isNaN(aa)) aa=0;
	bb=parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
	if(isNaN(bb)) bb=0;
	return aa-bb;
}
//Сорт. без поділу на великі/малі
function ts_sort_caseinsensitive(a,b){
	aa=ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
	bb=ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
	if(aa==bb) return 0;
	if(aa<bb) return -1;
	return 1;
}
//Сорт. ряди стандартно
function ts_sort_default(a,b){
	aa=ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb=ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if(aa==bb) return 0;
	if(aa<bb) return -1;
	return 1;
}
//Смугасто+вибір/підтвердж, Смуги на тбл із класом striped
var stripe=function(){
	var tables=document.getElementsByTagName("table");
	for(var x=0;x!=tables.length;x++){
		var table=tables[x];
		if(!table){return;}
		if(table.className.indexOf("striped")<0){continue;}
		var tbodies=table.getElementsByTagName("tbody");
		var even=true;
		for(var h=0;h<tbodies.length;h++){
			var trs=tbodies[h].getElementsByTagName("tr");
			for(var i=0;i<trs.length;i++){
				if(even){
					if(trs[i].className.indexOf("even")<0){trs[i].className+=" even";}
				}else{
					trs[i].className=trs[i].className.replace("even","");
				}
				even=!even;
			}
		}
	}
}
//Берем всі тбл з класом selectable і дозв. вибір. Вони підсвіч на mouseover і вибир. кліком
//makeTableSubmittable(table);
var makeSelectable=function(){
	var tables=document.getElementsByTagName("table");
	for(var x=0;x!=tables.length;x++){
		var table=tables[x];
		if(!table) return;
		hideElements(table.getElementsByTagName("td"));
		if(table.className.indexOf("selectable")<0) continue;
		var tbodies=table.getElementsByTagName("tbody");
		for(var h=0;h<tbodies.length;h++){
			var trs=tbodies[h].getElementsByTagName("tr");
			for(var i=0;i<trs.length;i++){
				if(trs[i].className.indexOf("disabled")>=0) continue;
				if(isChecked(trs[i])){
					if(trs[i].className.indexOf("selected")<0) trs[i].className+=" selected";
				}
				trs[i].onmouseover=function(){this.className+=" ruled";return false}
				trs[i].onmouseout=function(){this.className=this.className.replace("ruled","");return false}
				trs[i].onclick=function(){
					if(this.className.indexOf("selected")<0){
						this.className+=" selected";
						checkChildCheckboxes(this,true);
						return true;
					}else{
						this.className=this.className.replace("selected","");
						checkChildCheckboxes(this,false);
						return true;
					}
				}
			}
		}
		makeTableSubmittable(table);
	}
}
//Берем список елем і опційне поле вводу (для елем 'input') і не показуєм їх
//Якщо є парам inputType, перевір на співпад типів
var hideElements=function(els,inputType){
	for(var i=0;i<els.length;i++){
		var isRightType=true;
		if(inputType!='undefined'&&els[i].type!=inputType) isRightType=false;
		if(isRightType&&els[i].className.indexOf("hideme")>=0) els[i].style.display='none';
	}
}
//Шукаєм елем (tr у нас) для всіх дитячих елем вводу що є чекбоксами. Якщо найде позначений, вертає true
var isChecked=function(el){
	var inpts=el.getElementsByTagName("input");
	for(var n=0;n<inpts.length;n++) if(inpts[n].getAttribute("type")=="checkbox") return (inpts[n].checked);
	return false;
}
//Берем всі чекбокси що є дітьми елем і ставим їхнє значення "checked" в парам chk
var checkChildCheckboxes=function(el,chk){
	var inpts=el.getElementsByTagName("input");
	for(var n=0;n<inpts.length;n++) if(inpts[n].getAttribute("type")=="checkbox") inpts[n].checked=chk;
}
//Берем форми, робим кнопу клас select_all з підсвіт всіх рядів,Робим кнопу клас select_none з вимкн рядів
//selectAllRows(table,highlight);
var makeTableSubmittable=function(table){
	var inputs=table.getElementsByTagName("input");
	for(var h=0;h<inputs.length;h++){
		if(inputs[h].type=="button"){
			if(inputs[h].className.indexOf("select_all")>=0){inputs[h].onclick=function(){selectAllRows(table,true);}}
			if(inputs[h].className.indexOf("select_none")>=0){inputs[h].onclick=function(){selectAllRows(table,false);}}
		}
	}
}
//Вибираєм/знімаєм вибір всіх рядів тбл
var selectAllRows=function(table,highlight){
	if(!table) return;
	if(table.className.indexOf("striped")<0) return;
	var tbodies=table.getElementsByTagName("tbody");
	for(var h=0;h<tbodies.length;h++){
		var trs=tbodies[h].getElementsByTagName("tr");
		for(var i=0;i<trs.length;i++){
			if(trs[i].className.indexOf("disabled")>=0) continue;
			if(highlight){
				if(trs[i].className.indexOf("selected")<0) trs[i].onclick();
			}else{
				if(trs[i].className.indexOf("selected")>=0) trs[i].onclick();
			}
		}
	}
}
addEvent(window,"load",sortables_init);
addEvent(window,"load",stripe);
addEvent(window,"load",makeSelectable);