function find_publication(element) {
    while(element.className != "publication")
        element = element.parentNode;
    return element;
}

function show_abstract(element) {
    modify_abstract(find_publication(element), true);
}

function hide_abstract(element) {
    modify_abstract(find_publication(element), false);
}

function modify_abstract(publication, do_show) {
    set_child_display(publication, "div", "abstract", do_show);
    set_child_display(publication, "a", "show-abstract", !do_show);
    set_child_display(publication, "a", "hide-abstract", do_show);
}

function set_child_display(parent, tag_name, class_name, do_show) {
    var elements = parent.getElementsByTagName(tag_name);
    for(var i = 0; i < elements.length; i++)
        if(elements[i].className == class_name)
            elements[i].style.display = do_show ? "": "none";
}

function show_all_abstracts() {
    forall_publications(show_abstract);
}

function hide_all_abstracts() {
    forall_publications(hide_abstract);
}

function forall_publications(callback) {
    var elements = document.getElementsByTagName("li");
    for(var i = 0; i < elements.length; i++)
        if(elements[i].className == "publication")
            callback(elements[i]);
}

window.onload = function() { initialize(); }

function VisibilityToggler(element) {
    var show_text = "";
    var hide_text = "";
    var toggles = new Array();   // the elements whose visibility is
				 // toggled by clicking this
    var visible = true;          // current visibility stat
    var toggler = element;       // the class name of the toggled elements
    var tname = "";

    init();

    function init() {
	// something like the constructor
	tname = get_tname(); 
	toggler.style.display = "inline";
	toggler.onclick = function () { 
	    toggle(); 
	    return false; 
	}
	collect_toggles();
	show_text = get_text(tname + "_show");
	hide_text = get_text(tname + "_hide");
	if (visible) {
	    toggler.innerHTML = hide_text;
	} else {
	    toggler.innerHTML = show_text;
	}
    }

    function get_text(var_name) {
	try { return eval(var_name); }
	catch (err) { return ""; }
    }

    function get_style(element, property) {
	// returns the computed style property for the given element
	if (element.currentStyle) { // IEs only  
	    return element.currentStyle[property];
	} else if (window.getComputedStyle) { // Opera, Firefox, ...
	    return document.defaultView.getComputedStyle(element, null).getPropertyValue(property);
	}
	return "";	
    }

    function collect_toggles() {
	var elements = document.getElementsByClassName(tname);
	for (var i = 0; i < elements.length; i++) {
	    if (elements[i] != toggler) {
		toggles.push(elements[i]);		
		visible = get_style(elements[i], "display") != "none";
	    }
	}	
    }

    function get_tname() {
	// returns the class name for the to toggle elements
	var names = toggler.className.split(' ');
	for (var i = 0; i < names.length; i++) {
	    if (names[i] != "toggle") {
		return names[i];
	    }
	}
	return "";
    }

    function show() {
	toggler.innerHTML = hide_text;
	for (var i = 0; i < toggles.length; i++) {
	    if (toggles[i].localName == "li") {
	    	toggles[i].style.display = 'list-item';
	    } else {
	    	toggles[i].style.display = 'block';
	    }
	}	
    }

    function hide() {
	toggler.innerHTML = show_text;
	for (var i = 0; i < toggles.length; i++) {
	    toggles[i].style.display = 'none';
	}	    
    }

    function toggle() {
	if (visible) {
	    hide();
	} else {
	    show();
	}
	visible = !visible;
    }    
}

function initialize() {
    var elements = document.getElementsByClassName("toggle");
    for (var i = 0; i < elements.length; i++) {	
	new VisibilityToggler(elements[i]);
    }
}

