/*****************************************************************
	
	This notice MUST stay intact for legal use

	Advanced JSTable 0.4.7 (GPL).
	Copyright (C) 2004-2007 All-FAQs.INFO All Rights Reserved. 
	http://free-javascript.all-faqs.info/
	IdCode: MteyYPmDwC661cWC2AXb8c0XL895lj8T

	WARNING: This copy is made available to you under the terms of 
	the GNU General Public License and is not suitable for inclusion
	into commercial or internal applications.
	
	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

*****************************************************************/
	
	function sortTable(table, colIndex, compareFunction, order){
			var counter = 0;
			var totalRows = 0;
			if (table.getAttribute('type') == 'sortable'){
				var tbodies = table.getElementsByTagName('TBODY');
				for (var tb=0; tb < tbodies.length; tb++){
					if (tbodies[tb].getAttribute('type') != 'filter'){
						var rows = new Array();
						var rs = tbodies[tb].getElementsByTagName('TR');
						for (var j=0; j < tbodies[tb].getElementsByTagName('TR').length; j++)
							rows[j] = rs[j].cloneNode(true);
						eval("rows.sort("+compareFunction+");");
						ln = tbodies[tb].getElementsByTagName('TR').length; 
						totalRows = totalRows + ln;
						for (var j=0; j <ln; j++){
							counter++;
								window.status = "Sorting table: "+counter+" of "+totalRows+" rows ("+Math.floor(100*counter/totalRows)+"%)";
							rows[j].onmouseover = function() {addClass(this, 'over'); }
							rows[j].onmouseout = function() {removeClass(this, 'over');}
							if (order) {tbodies[tb].replaceChild(rows[j],rs[j]);}
								else {tbodies[tb].replaceChild(rows[j],rs[ln-j-1]);};
						}
					}
				}
				zebrise(table);
				var tds =table.getElementsByTagName('TD');
				ln = tds.length; 
				for (var j=0; j <ln; j++) {
					tds[j].onclick = function() {editCell(this);}
				}
			}

		window.status = "Table sorted";

		function sortTR(trArray, compareFunction){
			dataArray.sort(compareFunction);
		}

		function compareStrings(a, b) {
			var tdsa = a.getElementsByTagName('TD');
			var tdsb = b.getElementsByTagName('TD');
			var nameA = tdsa[colIndex].innerHTML.toLowerCase( );
			var nameB = tdsb[colIndex].innerHTML.toLowerCase( );
			if (nameA < nameB) {return -1}
			if (nameA > nameB) {return 1}
			return 0;

		}

		function compareNumbers(a, b) {
			var tdsa = a.getElementsByTagName('TD');
			var tdsb = b.getElementsByTagName('TD');
			return tdsb[colIndex].innerHTML*1 - tdsa[colIndex].innerHTML*1;
		}

		function compareDates(a, b) {
			var tdsa = a.getElementsByTagName('TD');
			var tdsb = b.getElementsByTagName('TD');
			var dateA = new Date(tdsa[colIndex].innerHTML);
			var dateB = new Date(tdsb[colIndex].innerHTML);
			return dateB - dateA;
		}
	}

function addClass(element, className){
	removeClass(element, className);
	element.className = element.className  + ' ' + className;
}

function addMinorClass(element, className){
	element.className = className  + ' ' + element.className;
}

function removeClass(element, className){
		myregexp = new RegExp(className, 'i');
		newClass = element.className;
		newClass = newClass.replace(myregexp, "");
		element.className = newClass;
}

function changeClass(element, oldClassName, newClassName){
		removeClass(element, oldClassName);
		addClass(element, newClassName);
}

function editCell(td){
	if (td.getAttribute('editable'))
		if (td.getAttribute('editable') == 'true'){
			var val = (td.innerHTML != '&nbsp;') ? td.innerHTML : '';

			td.innerHTML = '<INPUT TYPE="text" style="width: '+(td.offsetWidth-4)+'px;"  VALUE="'+val+'" >';
			addClass(td, 'edit');
			inputs = td.getElementsByTagName('INPUT');
			inputs[0].onblur = function(evt) {
				 this.parentNode.onclick = function() {editCell(this);}; 
				 removeClass(this.parentNode,'edit'); 
				 var tbody = findParent(this,'TBODY'); 
				 addClass(this.parentNode, 'editable');
				 this.parentNode.innerHTML = (this.value != '') ? this.value : '&nbsp;';
				 if (tbody.getAttribute('type')) 
					 if (tbody.getAttribute('type') == 'filter') filterTable(findParent(tbody,'TABLE'));
				 zebrise(findParent(tbody,'TABLE')); 
			}
			inputs[0].onkeypress = function(evt) {
				evt = (evt) ? evt : ((window.event) ? event : null);
				if (evt.keyCode == 13) this.blur();
			}
			inputs[0].select();
			td.onclick = '';
		}
}



function findParent(el, parentTagName){
	var parent = el.parentNode;
	while (parent.tagName != parentTagName){
		parent = parent.parentNode;
		if (parent.tagName == 'BODY') return null;
	}
	return parent;
}


function zebrise(table){
	rs = table.getElementsByTagName('TR');
	ln = rs.length; 
	i = 0;
	for (var j=0; j <ln; j++){
		if (i % 2 == 0) {changeClass(rs[j],"even","odd");} else {changeClass(rs[j],"odd","even");}
		var isRowVisibe = rs[j].currentStyle ? rs[j].currentStyle.display : document.defaultView.getComputedStyle(rs[j], '').getPropertyValue("display");
		if (isRowVisibe != 'none') {i++;}
		rs[j].onclick = function(evt) {
			evt = (evt) ? evt : ((window.event) ? event : null);
			if (evt) {
				if (evt.ctrlKey)
						if (this.getAttribute('selected')) {
							removeClass(this, 'selected');
							this.setAttribute('selected', false);
						}else{
							addClass(this, 'selected');
							this.setAttribute('selected', true);
						}
			}
		}
	}
}

function filterTable(table){
	var counter = 0;
	var totalRows = 0;
	var filteredRows = 0;
	var filtersNum = 0;
	var tbodies = table.getElementsByTagName('TBODY');
	ln =  tbodies.length;
	for (var tb=0; tb < ln; tb++){
		if (tbodies[tb].getAttribute('type'))
			if (tbodies[tb].getAttribute('type') == 'filter'){

				filterRows = tbodies[tb].getElementsByTagName('TR');
				for (var rowIndex=0; rowIndex < filterRows.length; rowIndex++){
					for (var tb2=0; tb2 < ln; tb2++){
						if (tbodies[tb] != tbodies[tb2])
						if (!tbodies[tb2].getAttribute('collapse')){
							rowsToFilter = tbodies[tb2].getElementsByTagName('TR');
							filterTDs = filterRows[rowIndex].getElementsByTagName('TD');
							for (var rowsToFilterIndex =0; rowsToFilterIndex < rowsToFilter.length; rowsToFilterIndex++){
								totalRows++;
							}
						}
					}
				}
				tb = ln;
			}
	}
	ln =  tbodies.length;
	for (var tb=0; tb < ln; tb++){
		if (tbodies[tb].getAttribute('type'))
			if (tbodies[tb].getAttribute('type') == 'filter'){
				filterRows = tbodies[tb].getElementsByTagName('TR');
				for (var rowIndex=0; rowIndex < filterRows.length; rowIndex++){
					for (var tb2=0; tb2 < ln; tb2++){
						if (tbodies[tb] != tbodies[tb2])
						if (!tbodies[tb2].getAttribute('collapse')){
							rowsToFilter = tbodies[tb2].getElementsByTagName('TR');
							filterTDs = filterRows[rowIndex].getElementsByTagName('TD');
							for (var rowsToFilterIndex =0; rowsToFilterIndex < rowsToFilter.length; rowsToFilterIndex++){
								counter++;
								window.status = "Filtering table: "+counter+" of "+totalRows/filterRows.length+" rows ("+Math.floor(100*counter/totalRows)+"%)";
								TDs = rowsToFilter[rowsToFilterIndex].getElementsByTagName('TD');
								for (var TDsIndex = 0 ; TDsIndex < TDs.length; TDsIndex++){
									if (filterTDs[TDsIndex].getAttribute('filter')){
											filtersNum++;
											r = findParent(TDs[TDsIndex], 'TR');
											removeClass(r,filterTDs[TDsIndex].getAttribute('filterClass'));
									}

								}
								for (var TDsIndex = 0 ; TDsIndex < TDs.length; TDsIndex++){
									if (filterTDs[TDsIndex].getAttribute('filter'))
										if (filterTDs[TDsIndex].innerHTML != '&nbsp;'){
											if (eval(filterTDs[TDsIndex].getAttribute('filter')+'("'+TDs[TDsIndex].innerHTML.replace(/\n/g, '').replace(/\"/g, '\\"')+'", "'+filterTDs[TDsIndex].innerHTML+'");')){
												r = findParent(TDs[TDsIndex], 'TR');
												addClass(r,filterTDs[TDsIndex].getAttribute('filterClass'));
												filteredRows++;
											};
											
										}

								}
							}
						}
					}
				}
				tb = ln;
			}
	}
//	progressBar.style.display = 'none';
	window.status = "Filtering table: done! "+filteredRows+" of "+totalRows/filterRows.length+" rows filtered ";


}


function filterEqual(value, filter){
	return (value == filter);
}

function filterInterval(value, filter){
	re = /,/ig;
	filter = filter.replace(re, ') || (');
	re = /(\d+)-(\d+)/ig;
	filter = filter.replace(re, '($1 <= value) & ($2 >= value)');
	filter = '('+filter+')';
	re = /\((\d+)\)/ig;
	filter = filter.replace(re, '($1 == value)');
	re = /&gt;/ig;
	filter = filter.replace(re, 'value > ');
	re = /&lt;/ig;
	filter = filter.replace(re, 'value < ');
	try{
		eval('if ('+filter+') {ret = false;} else {ret = true;};');
		return ret;
	}catch(e){}
	return null;
}

function filterRegExp(value, filter){
	myregexp = new RegExp(filter, 'i');
	return myregexp.test(value);
}

function InitTables(){
	var tables = document.getElementsByTagName('TABLE');
	var cols =  document.getElementsByTagName('COL');
	for (var i=0; i< tables.length; i++)
		if (tables[i].getAttribute('type') == 'sortable'){
			
			filterTable(tables[i]);
			var tds = tables[i].getElementsByTagName('TD');
			ln = tds.length; 
			for (var j=0; j <ln; j++) {
				tds[j].onclick = function() {editCell(this);}
				if (tds[j].getAttribute('editable')) addClass(tds[j], 'editable');
			}
			
			var tbodies = tables[i].getElementsByTagName('TBODY');

				rs = tables[i].getElementsByTagName('TR');
				ln = rs.length; 
				for (var j=0; j <ln; j++){
					if (j % 2 == 0) {changeClass(rs[j],"even","odd");} else {changeClass(rs[j],"odd","even");}
					rs[j].onmousemove = function(evt) {
					    evt = (evt) ? evt : ((window.event) ? event : null);
						if (evt) {
							if (evt.ctrlKey) {this.style.cursor = 'pointer';} 
							else {this.style.cursor = 'default';}
						}
					}

					rs[j].onmouseover = function(evt) {
					    evt = (evt) ? evt : ((window.event) ? event : null);
						if (evt) {
							addClass(this, 'over'); 
							if (evt.ctrlKey) this.style.cursor = 'pointer';
						}
					}
					rs[j].onmouseout = function() {removeClass(this, 'over'); this.style.cursor = 'default';}
					rs[j].onclick = function(evt) {
					    evt = (evt) ? evt : ((window.event) ? event : null);
						if (evt) {
							if (evt.ctrlKey)
							if (this.getAttribute('selected')) {
								removeClass(this, 'selected');
								this.setAttribute('selected', false);
							}else{
								addClass(this, 'selected');
								this.setAttribute('selected', true);
							}
						}
						return false;
					}

				}

			ln = tbodies.length;
			for (var tb=0; tb < ln; tb++)
			 if (tbodies[tb].getAttribute('collapse')){

					if (tbodies[tb].getAttribute('collapsed')){
						if (tbodies[tb].getAttribute('collapsed') != 'false'){
							document.getElementById(tbodies[tb].getAttribute('collapse')).style.display = "none";
							tbodies[tb].setAttribute('collapsed','true');
							tbodies[tb].className = 'collapsed';
						}else{
							document.getElementById(tbodies[tb].getAttribute('collapse')).style.display = "";
							tbodies[tb].setAttribute('collapsed','false');
							tbodies[tb].className = 'expand';
						}
					}else{
							tbodies[tb].setAttribute('collapsed','false');
							tbodies[tb].className = 'expand';
					
					}
				
				tbodies[tb].ondragstart = function() {
					alert('dr');
				}

				tbodies[tb].onclick = function() {
					if (this.getAttribute('collapsed')){
						if (this.getAttribute('collapsed') == 'false'){
							document.getElementById(this.getAttribute('collapse')).style.display = "none";
							this.setAttribute('collapsed','true');
							this.className = 'collapsed';
						}else{
							document.getElementById(this.getAttribute('collapse')).style.display = "";
							this.setAttribute('collapsed','false');
							this.className = 'expand';
						}
					}else{
							document.getElementById(this.getAttribute('collapse')).style.display = "none";
							this.setAttribute('collapsed','true');
							this.className = 'collapsed';
					
					}
				}
			 }


			ths =  tables[i].getElementsByTagName('TH');
			for (var t=0; t< ths.length; t++){
				ths[t].onmouseover = function() {
					addClass(this, 'hover');
				}
				ths[t].onmouseout = function() {
					removeClass(this, 'hover');
				}

				ths[t].onclick = function() {
					var ths = this.parentNode.getElementsByTagName('TH');
					for (var th=0; th < ths.length; th++){
						if (ths[th] != this){
							ths[th].setAttribute('order', 'none');
							ths[th].className ='';
						}
					}
					if (this.getAttribute('order') == 'ascending') {
						this.setAttribute('order', 'descending');
						removeClass(this, 'ascending');
						addClass(this, 'descending');
						sortTable(this.parentNode.parentNode.parentNode, this.cellIndex, this.getAttribute('compare'), false);
					}else{	
						this.setAttribute('order', 'ascending');
						removeClass(this, 'descending');
						addClass(this, 'ascending');
						sortTable(this.parentNode.parentNode.parentNode, this.cellIndex, this.getAttribute('compare'), true);
					}
				}
			}
		}
		createMenus(); initMenu();
}

function hideFilters(table){
	var tbodies = document.getElementById(table).getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') == 'filter'){
			if (tbodies[i].style.display == ''){
				tbodies[i].style.display = 'none';
			}else{
				tbodies[i].style.display = '';
			}
			break;
		}
	}
}

function restoreHiddenFilters(table){
	var table = document.getElementById(table);
	var tbodies = table.getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') == 'filter'){
			var tds = tbodies[i].getElementsByTagName('TD');
			for (var k=0; k<tds.length; k++){
				if (tds[k].getAttribute('value'))
					tds[k].innerHTML = tds[k].getAttribute('value');
			}
			break;
		}
	}
	filterTable(table);
	zebrise(table);

}

function clearFilters(table, clearHidden){
	var table = document.getElementById(table);
	var tbodies = table.getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') == 'filter'){
			var trs = tbodies[i].getElementsByTagName('TR');
			for (var j=0; j<trs.length; j++) {
				if (trs[j].style.display == ''){
					var tds = trs[j].getElementsByTagName('TD');
					for (var k=0; k<tds.length; k++)
						tds[k].innerHTML = '&nbsp;';
				}
				if (clearHidden){
					var tds = trs[j].getElementsByTagName('TD');
					for (var k=0; k<tds.length; k++){
						tds[k].setAttribute('value',tds[k].innerHTML);
						tds[k].innerHTML = '&nbsp;';
					}
				}
			}
			break;
		}
	}
	filterTable(table);
	zebrise(table);
}

function selectionRows(table, select){
	var tbodies = table.getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') != 'filter')
				var rows = tbodies[i].getElementsByTagName('TR');
				if (rows)
				for (var j=0; j<rows.length; j++){
					rows[j].setAttribute('selected', select);
					if (select) {addClass(rows[j], 'selected');}else { removeClass(rows[j], 'selected');}
				}
	}
}

function inverseSelectionRows(table){
	var tbodies = table.getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') != 'filter')
				var rows = tbodies[i].getElementsByTagName('TR');
				if (rows)
				for (var j=0; j<rows.length; j++){
					if (!rows[j].getAttribute('selected')) {
						addClass(rows[j], 'selected');
						rows[j].setAttribute('selected', true);
					}else { 
						removeClass(rows[j], 'selected');
						rows[j].setAttribute('selected', false);
					}
				}
	}
}

function hideSelectionRows(table, select){
	var tbodies = table.getElementsByTagName('TBODY');
	for (var i=0; i<tbodies.length; i++){
		if (tbodies[i].getAttribute('type') != 'filter')
				var rows = tbodies[i].getElementsByTagName('TR');
				if (rows)
				for (var j=0; j<rows.length; j++){
					if (!rows[j].getAttribute('selected') != select) {
						addClass(rows[j], 'hideselected');
					}
				}
	}
}

function createMenus(){
	var tables = document.getElementsByTagName('TABLE');
	for (var i=0; i< tables.length; i++)
		if (tables[i].getAttribute('type') == 'sortable'){
			var rnd = Math.floor(Math.random( )*10000000);

			if (!tables[i].id) tables[i].id = 'table_'+rnd;
			var mainMenu = document.createElement('MENU');
			mainMenu.id = 'main_menu_'+rnd;
			mainMenu.innerHTML = '<div onClick="copyTable(\''+'table_'+rnd+'\');">Copy</div><div menu="col_menu_'+rnd+'"><img src="" width=0 height=0>Columns </div><div menu="select_menu_'+rnd+'">Selection</div><div menu="filters_menu_'+rnd+'">Filters</div>';
			var colMenu = document.createElement('MENU');
			colMenu.id = 'col_menu_'+rnd;
			colMenu.innerHTML = "<i>Hide</i><br>";
			var colgroups = tables[i].getElementsByTagName('COLGROUP');
			var cols = colgroups[0].getElementsByTagName('COL');
			
			var theads = tables[i].getElementsByTagName('THEAD');
			var trs = theads[0].getElementsByTagName('TR');
			var ths = trs[0].getElementsByTagName('TH');
			for (var j=0; j < ths.length; j++){
				var rnd2 = Math.floor(Math.random( )*10000000);
				colMenu.innerHTML = colMenu.innerHTML + '<div onclick="chkb = this.getElementsByTagName(\'INPUT\'); if (!chkb[0].disabled) {chkb[0].checked = !chkb[0].checked; hide_col(\''+tables[i].id+"','"+j+'\', chkb[0] );}"><INPUT TYPE="checkbox" NAME="" onclick="hide_col(\''+tables[i].id+"','"+j+'\', this );  stopEventPropagation(event);">'+ths[j].innerHTML+'</div>';
				ths[j].id = rnd;
				cols[j].id = 'col_'+rnd2;
				ths[j].oncontextmenu = function (evt){
					    evt = (evt) ? evt : ((window.event) ? event : null);
						if (evt) {
							var menuStyle = document.getElementById('main_menu_'+this.id).style;
							menuStyle.display=''; 
							var coords = getPageEventCoords(evt); 
							menuStyle.left = coords.left; 
							menuStyle.top = coords.top; 
							return false;
						}
				}
			}


			var selectMenu = document.createElement('MENU');
			selectMenu.id = 'select_menu_'+rnd;
			selectMenu.innerHTML = '<div onClick="selectionRows(document.getElementById(\''+tables[i].id+'\'), false);">Unselect all</div><div onClick="selectionRows(document.getElementById(\''+tables[i].id+'\'), true);">Select all</div><div onClick="inverseSelectionRows(document.getElementById(\''+tables[i].id+'\'));">Inverse selection</div><div onClick="hideSelectionRows(document.getElementById(\''+tables[i].id+'\'), true);">Hide selected</div><div onClick="hideSelectionRows(document.getElementById(\''+tables[i].id+'\'), false);">Hide not selected</div>';

			var filterMenu = document.createElement('MENU');
			filterMenu.id = 'filters_menu_'+rnd;
			filterMenu.innerHTML = '<div onclick="clearFilters(\''+tables[i].id+'\', false);">Clear Filters</div><div onclick="clearFilters(\''+tables[i].id+'\', true);">Clear All Filters</div><div onclick="hideFilters(\''+tables[i].id+'\');">Hide/Show Filters</div><div onclick="restoreHiddenFilters(\''+tables[i].id+'\');">Restore Hidden Filters</div>';


			document.body.appendChild(filterMenu);
			document.body.appendChild(mainMenu);
			document.body.appendChild(colMenu);
			document.body.appendChild(selectMenu);
		}
}

function getStyle(elem, IEStyleProp, CSSStyleProp) {
    if (elem.currentStyle) {
        return elem.currentStyle[IEStyleProp];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(elem, "");
        return compStyle.getPropertyValue(CSSStyleProp);
    }
    return "";
}


function copyToClipboard(s)
{
	if (window.clipboardData){
		window.clipboardData.setData("Text", s);
	}
		else if (window.netscape) 
	{ 
			try
			{
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
				if (!clip) return;
				var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
				if (!trans) return;
				trans.addDataFlavor('text/unicode');
				var str = new Object();
				var len = new Object();
				var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
				var copytext=s;
				str.data=copytext;
				trans.setTransferData("text/unicode",str,copytext.length*2);
				var clipid=Components.interfaces.nsIClipboard;
				if (!clip) return false;
				clip.setData(trans,null,clipid.kGlobalClipboard);
			}
			catch (e)
			{
				alert("Access denied!\nTo enable 'Copy' on your browser:\n1) Type 'about:config' in the Location Bar and press Enter.\n2) Enter 'signed' in the Filter field.\n3) Set value fo 'signed.applets.codebase_principal_support' to 'true'.");
				return false;
			}
	}

	return true;
}

function copyTable(tableId){
	var result = '';
	var table = document.getElementById(tableId);
	var tbs = table.getElementsByTagName('TBODY');
	for ( k = 0; k < tbs.length; k++ )	{
		if (tbs[k].getAttribute('type') != 'filter'){
			rows = tbs[k].getElementsByTagName('TR');
			for ( i = 0; i < rows.length; i++ )	{
				if (getStyle(rows[i], 'display', 'display') != 'none'){
					cells = rows[i].getElementsByTagName('TD');
					for ( j = 0; j < cells.length; j++ )	{
						result = result +cells[j].innerHTML.replace(/&nbsp;/g, '')+ "\t";

					};
					result = result + "\n";
				};


			}
		}
	}
	if (copyToClipboard(result)) alert('Table was copied to clipboard!');

}

function getPageEventCoords(evt) {
    var coords = {left:0, top:0};
    if (evt.pageX) {
        coords.left = evt.pageX;
        coords.top = evt.pageY;
    } else if (evt.clientX) {
        coords.left = 
            evt.clientX + document.body.scrollLeft - document.body.clientLeft;
        coords.top = 
            evt.clientY + document.body.scrollTop - document.body.clientTop;
        if (document.body.parentElement && document.body.parentElement.clientLeft) {
            var bodParent = document.body.parentElement;
            coords.left += bodParent.scrollLeft - bodParent.clientLeft;
            coords.top += bodParent.scrollTop - bodParent.clientTop;
        }
    }
    return coords;

}


function stopEventPropagation(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}


function hide_col(tableId, col_no, checkbox){
	var checkboxes = checkbox.parentNode.parentNode.getElementsByTagName('INPUT');
	var notCheckedNumber = 0;
	for (var chb=0; chb < checkboxes.length ; chb++)
		if (!checkboxes[chb].checked) notCheckedNumber++;
	if(notCheckedNumber == 1){
		for (var chb=0; chb < checkboxes.length ; chb++)
			if (!checkboxes[chb].checked) checkboxes[chb].disabled = true;
	}else{
		for (var chb=0; chb < checkboxes.length ; chb++)
			checkboxes[chb].disabled = false;
	};
    var stl;
    if (!checkbox.checked) stl = ''
    else         stl = 'none';

    var tbl  = document.getElementById(tableId);
    var rows = tbl.getElementsByTagName('tr');
    for (var row=0; row<rows.length;row++) {
      var cels = rows[row].getElementsByTagName('td');
	  if (cels.length == 0) cels = rows[row].getElementsByTagName('th');
      if (cels.length == 1)  {
           if (checkbox.checked) {
			  if (cels[0].colSpan > 1) cels[0].colSpan = cels[0].colSpan - 1;
		   }else{
			   cels[0].colSpan = cels[0].colSpan + 1;
		   }
     }else{
		  if (cels.length > col_no)
			  if (cels[0].colSpan == 1) cels[col_no].style.display=stl;
	 }
    }
}
