function getElementsByClassName(root, className, tagName) {
    var classElements = new Array();
    var elems = root.getElementsByTagName(tagName);
    var pattern = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
    for (var i = 0, j = 0; i < elems.length; i++) {
	if (pattern.test(elems[i].className)) {
	    classElements[j++] = elems[i];
	}
    }
    return classElements;
}

function bind_args(func) {
    var args = [];
    for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); }
    return function() { return func.apply(this, args); };
}

function toggle(toggle_id, display_value, this_button, other_button) {
    document.getElementById(toggle_id).style.display = display_value;
    document.getElementById(this_button).style.display = "none";
    document.getElementById(other_button).style.display = "";
}

var uniq_id_counter = 0;
function build_uniq_id() {
    return "uniqid_" + ++uniq_id_counter;
}

function build_toggles(className, toggleName, hideName, showName) {
    var elems = getElementsByClassName(document, className, "div");
    for (var i = 0; i < elems.length; i++) {
	var toggle_id = build_uniq_id();
	var hide_button_id = build_uniq_id();
	var show_button_id = build_uniq_id();
	var toggle_elem = getElementsByClassName(elems[i], toggleName, "*")[0];
	toggle_elem.id = toggle_id;
	toggle_elem.style.display = "none";
	var hide_button = getElementsByClassName(elems[i], hideName, "*")[0];
	hide_button.id = hide_button_id;
	hide_button.onclick = bind_args(toggle, toggle_id, "none", hide_button_id, show_button_id);
	hide_button.style.display = "none";
	var show_button = getElementsByClassName(elems[i], showName, "*")[0];
	show_button.id = show_button_id;
	show_button.onclick = bind_args(toggle, toggle_id, "", show_button_id, hide_button_id);
    }
}

function build_toggle(elem) {
    var tag = elem.id;
    document.getElementById("show" + elems[i].id).onclick = bind_args(show, tag);
    document.getElementById("hide" + elems[i].id).onclick = bind_args(hide, tag);
    hide(tag);
}

function build_headings(itemId) {
    var item = document.getElementById(itemId);
    var h = document.getElementsByTagName(item.innerHTML);
    for (var i = 0; i < h.length; i++) {
	item.parentNode.insertBefore(build_menu_item(h[i], "mi_"+i), item);
	build_back_arrow(h[i]);
    }
    item.style.display = "none";
}

function build_back_arrow(head) {
    var back = document.createElement('a');
    back.href = "#";
    back.className = "back_arrow";
    back.innerHTML = "&uArr;";
    head.innerHTML += " ";
    head.appendChild(back);
}

function build_menu_item(head, id) {
    var li = document.createElement('li');
    var a = document.createElement('a');
    a.href = "#"+id;
    a.appendChild(document.createTextNode(head.innerHTML));
    li.appendChild(a);
    head.id = id;
    return li;
}

function apply_template_to_anchors() {
    var as = document.getElementsByTagName('a');
    for (var i = 0; i < as.length; i++) {
	as[i].href = apply_template(as[i].href);
    }
}

function apply_template(string) {
    var varIds = string.match(/\:\:.*?\:\:/g);
    if (varIds != null) {
	for (var i = 0; i < varIds.length; i++) {
	    string = string.replace(varIds[i], document.getElementById(varIds[i]).innerHTML);
	}
    }
    var directIds = string.match(/\#\#.*?\#\#/g);
    if (directIds != null) {
	for (var i = 0; i < directIds.length; i++) {
	    var direct = directIds[i].replace(/\#/g, "");
	    string = string.replace(directIds[i], eval(direct));
	}
    }
    return string;
}

function link_to_javadoc(className, docURL) {
    var elems = getElementsByClassName(document, className, "span");
    for (var i = 0; i < elems.length; i++) {
	var code = document.createElement('code');
	var a = document.createElement('a');
	if (elems[i].innerHTML.indexOf(".") != -1) {
	    a.href = docURL + "/" + elems[i].innerHTML.replace(".", "#");
	    elems[i].innerHTML = elems[i].innerHTML.substring(elems[i].innerHTML.lastIndexOf(".")+1, elems[i].innerHTML.length);
	} else if (elems[i].innerHTML.indexOf("#") != -1) {
	    a.href = docURL + "/" + elems[i].innerHTML;
	    elems[i].innerHTML = elems[i].innerHTML.substring(elems[i].innerHTML.lastIndexOf("#")+1, elems[i].innerHTML.length);
	} else {
	    a.href = docURL + "/?" + elems[i].innerHTML;
	}
	a.appendChild(elems[i].firstChild);
	elems[i].appendChild(code);
	code.appendChild(a);
    }
}


