var detailTables = new Vector(2);
var initialHeights = new HashMap();

var use_id = false;

var processedTables = 0;
var initializedTables = 0;

var jumpSize = 10;
var jumpInterval = 20;

var currentlyMoving = new Vector(2);

function initDetailTables(tagName, id, className) {
	var elements = document.getElementsByTagName(tagName);
	
	if(id != null && id != undefined && id != '') {
		use_id = true;
	}
	
	var use_as_regexp = false;
	if(use_id && id.indexOf('*') > -1) {
		var processedPart = id;
		var new_id = '';
		while(processedPart.indexOf('*') > -1) {
			new_id += processedPart.substr(0, processedPart.indexOf('*')) + '[\x21-\x7E]*';
			processedPart = processedPart.substr(processedPart.indexOf('*')+1, processedPart.length);
		}
		if(processedPart.length > 0) {
			new_id += processedPart;
		}
		id = new_id;
		use_as_regexp = true;
	} else if(!use_id && className.indexOf('*') > -1) {
		var _processedPart = className;
		var new_className = '';
		while(_processedPart.indexOf('*') > -1) {
			new_className += _processedPart.substr(0, _processedPart.indexOf('*')) + '[\x21-\x7E]*';
			_processedPart = _processedPart.substr(_processedPart.indexOf('*')+1, _processedPart.length);
		}
		if(_processedPart.length > 0) {
			new_className += _processedPart;
		}
		className = new_className;
		use_as_regexp = true;
	}
	
	for(var i=0; i < elements.length; i++) {
		var elem = elements[i];
		
		if( ( use_id && ( ( use_as_regexp && elem.id.match(id) ) || ( !use_as_regexp && elem.id == id ) ) ) ||
			( !use_id && ( ( use_as_regexp && elem.className.match(className) ) || ( !use_as_regexp && elem.className == className ) ) ) )
		{
			detailTables.addElement(elem);
			
			computeHeight(elem.id);
			
			processedTables++;
		}
	}
	
	alertDone();
}

function computeHeight(id) {
	var elem = document.getElementById(id);
	
	if(elem.clientHeight == 0 && elem.offsetHeight == 0) {
		setTimeout('computeHeight("'+id+'")', 100);
	} else {
		var initHeight = elem.clientHeight;
		if( ( initHeight == undefined || initHeight == 0 ) && elem.offsetHeight > 0) {
			initHeight = elem.offsetHeight;
		}
		
		initialHeights.addItem(elem, initHeight);
		
		initializedTables++;
	}
}

function alertDone() {
	if( processedTables != initializedTables ) {
		setTimeout('alertDone()', 100);
	} else {
		createDinamicDetails();
	}
}

function getInitHeight(elem) {
	return initialHeights.getValueAtIndex(initialHeights.keys.indexOf(elem));
}

function createDinamicDetails() {
	for(var i=0; i < detailTables.getSize(); i++) {
		var elem = detailTables.getElementAt(i);
		
		elem.style.height = 0;
		elem.style.clientHeight = 0;
		elem.style.display = 'none';
	}
}

function checkOpen(id) {
	var elem = document.getElementById(id);
	var maxHeight = getInitHeight(elem);
	
	if(elem.style.clientHeight < maxHeight) {
		elem.style.clientHeight = maxHeight;
		elem.style.height = maxHeight + 'px';
		elem.style.display = '';
	}
	
	currentlyMoving.removeElementAt(currentlyMoving.indexOf(id));
}

function checkClose(id) {
	var elem = document.getElementById(id);
	var maxHeight = getInitHeight(elem);
	
	elem.style.clientHeight = 0;
	elem.style.height = 0 + 'px';
	elem.style.display = 'none';
	
	currentlyMoving.removeElementAt(currentlyMoving.indexOf(id));
}

function closeDetails(id) {
	if(currentlyMoving.contains(id)) {
		return;
	}
	clearTimeout('doOpen("'+id+'", "true")');
	currentlyMoving.addElement(id);
	doClose(id, 'false');
}

function openDetails(id) {
	if(currentlyMoving.contains(id)) {
		return;
	}
	clearTimeout('doClose("'+id+'", "true")');
	currentlyMoving.addElement(id);
	doOpen(id, 'false');
}

function doOpen(id, started) {
	var elem = document.getElementById(id);
	var maxHeight = getInitHeight(elem);
	
	if(elem.style.clientHeight == undefined) {
		elem.style.clientHeight = 0;
	}
	
	if(started == 'false') {
		var checkTime = (maxHeight / jumpSize) * jumpInterval * 5;
		setTimeout('checkOpen("'+id+'")', checkTime);
	}
	
	if(elem.style.clientHeight < maxHeight) {
		// elem.style.overflow = 'hidden';
		elem.style.display = '';
		elem.style.clientHeight = elem.style.clientHeight + jumpSize;
		elem.style.height = elem.style.clientHeight + 'px';
		
		// elem.style.border = '1px solid';
		
		setTimeout('doOpen("'+id+'", "true")', jumpInterval);
	}
}

function doClose(id, started) {
	var elem = document.getElementById(id);
	var maxHeight = getInitHeight(elem);
	
	if(elem.style.clientHeight == undefined) {
		elem.style.clientHeight = maxHeight;
	}
	
	if(started == 'false') {
		var checkTime = (maxHeight / jumpSize) * jumpInterval * 5;
		setTimeout('checkClose("'+id+'")', checkTime);
	}
	
	if(elem.style.clientHeight > 0) {
		// elem.style.overflow = 'hidden';
		elem.style.display = '';
		elem.style.clientHeight = elem.style.clientHeight - jumpSize;
		
		if(elem.style.clientHeight < 0) {
			elem.style.clientHeight = 0;
		}
		
		elem.style.height = elem.style.clientHeight + 'px';
		
		// elem.style.border = '1px solid';
		
		setTimeout('doClose("'+id+'", "true")', jumpInterval);
	} else {
		elem.style.display = 'none';
	}
}

function detail(id) {
	var elem = document.getElementById(id);
	if(elem.style.clientHeight > 0) {
		closeDetails(id);
	} else {
		openDetails(id);
	}
}

