var ajax = createajax();
var cache = new Array();

function confirmation(what) {
	var agree = confirm("Are you sure you want to delete the " + what + "?");
	if (agree)
		return true;
	else
		return false;
}

function gbrowseform() {
	var eurl = document.forms.gbrowse.pre.value;
	var chr = document.forms.gbrowse.chr.value;
	eurl += "&chr=" + chr;
	if (document.forms.gbrowse.genes && document.forms.gbrowse.genes.checked)
		eurl += "&genes";
	if (document.forms.gbrowse.probes && document.forms.gbrowse.probes.checked)
		eurl += "&probes";
	if (document.forms.gbrowse.logratio && document.forms.gbrowse.logratio.checked)
		eurl += "&logratio";
	document.forms.gbrowse.eurl.value = eurl;
	document.forms.gbrowse.q.value = chr;
	return true;
}

function showmessage(element, message) {
	var elem = document.getElementById(element);
	elem.innerHTML = message;
}
// general ajax

function createajax() {
	var ajax;
	try {
		ajax = new XMLHttpRequest();
	} catch (e) {
		try {
			ajax = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
		}
	}
	if (!ajax)
		alert("AJAX Error");
	else
		return ajax;
}

function ajaxsend(cmd) {
	if (ajax)
		if (ajax.readyState == 4 || ajax.readyState == 0) {
			ajax.open("GET", cmd, true);
			ajax.onreadystatechange = ajaxresponse;
			ajax.send(null);
		} else
			cache.push(cmd);
}

function ajaxresponse() {
	if (ajax.readyState == 4 && ajax.status == 200) {
		var response = ajax.responseText;
		if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0) {
			alert("Error handling the AJAX response\n" + response);
			return;
		}
		response = ajax.responseXML.documentElement;
		if (!response) {
			alert("Invalid XML Structure");
			return;
		}
		if (response.nodeName == "parsererror") {
			alert("Invalid XML structure");
			return;
		}
		var command = response.getElementsByTagName("command")[0].firstChild.data;
		if (command == "getontologies")
			getontologyresponse(response);
		else if (command == "expand")
			expandresponse(response);
		else if (command == "uploads")
			uploadresponse(response);
		else if (command == "pubmed")
			pubmedresponse(response);
		if (cache.length > 0) {
			var cmd = cache.shift();
			ajaxsend(cmd);
		}
	}
}

// ontologies

function getontologies(parent) {
	var tmp = parent.name.split("_");
	var mydiv = document.getElementById(tmp[0] + "_" + tmp[1]);
	var child = tmp[0] + "_" + tmp[1] + "_" + (tmp[2] * 1 + 1);
	var myselect = document.getElementById(child)
	for (var i=2; myselect; i++) {
		mydiv.removeChild(myselect);
		myselect = document.getElementById(tmp[0] + "_" + tmp[1] + "_" + (tmp[2] * 1 + i))
	}
	if (parent.value != "null") {
		var cmd = "scripts/getontologies.php?guid=" + parent.value + "&element=" + child;
		ajaxsend(cmd);
	}
}

function getontologyresponse(response) {
	var element = response.getElementsByTagName("element")[0].firstChild.data;
	var tmp = element.split("_");
	var note = response.getElementsByTagName("note")[0].firstChild;
	if (note)
		note = note.data;
	if (note) {
		var parentnote = tmp[0] + "_" + tmp[1] + "_" + (tmp[2] * 1 - 1) + "_note";
		var notespan = document.getElementById(parentnote);
		if (notespan)
			notespan.innerHTML = note;
	}
	var myselect = document.getElementById(element);
	var childguids = response.getElementsByTagName("guid");
	var childtexts = response.getElementsByTagName("text");
	if (childguids.length == 0)
		return;
	if (!myselect) {
		var mydiv = document.getElementById(tmp[0] + "_" + tmp[1]);
		mydiv.appendChild(document.createElement("br"));
		myselect = document.createElement("select");
		myselect.setAttribute("name", element);
		myselect.setAttribute("id", element);
		myselect.setAttribute("onchange", "getontologies(this)");
		mydiv.appendChild(myselect);
		var mynotespan = mydiv.appendChild(document.createElement("span"));
		mynotespan.setAttribute("name", element + "_note");
		mynotespan.setAttribute("id", element + "_note");
	}
	var x = document.createElement("option");
	x.setAttribute("value", "null");
	x.innerHTML = "-- Choose --";
	myselect.appendChild(x);
	for (var i=0; i<childguids.length; i++) {
		x = document.createElement("option");
		x.setAttribute("value", childguids.item(i).firstChild.data);
		x.innerHTML = childtexts.item(i).firstChild.data;
		myselect.appendChild(x);
	}
}

function addmore(what) {
	var mydiv = document.getElementById(what);
	var num = mydiv.getElementsByTagName("div").length;
	var newdivname = what + "_" + (num * 1 + 1);
	var newdiv = document.createElement("div");
	newdiv.setAttribute("name", newdivname);
	newdiv.setAttribute("id", newdivname);
	if (num % 2)
		newdiv.setAttribute("class", "even");
	else
		newdiv.setAttribute("class", "odd");
	var newselectname = newdivname + "_1";
	var newselect = document.createElement("select");
	newselect.setAttribute("name", newselectname);
	newselect.setAttribute("id", newselectname);
	newselect.setAttribute("onchange", "getontologies(this)");
	var oldselectname = what + "_1_1";
	var oldselect = document.getElementById(oldselectname);
	newselect.innerHTML = oldselect.innerHTML;
	newselect.selectedIndex = 0;
	newdiv.appendChild(newselect);
	mydiv.appendChild(newdiv);
}

function remove(what) {
	var mydiv = document.getElementById(what);
	var num = mydiv.getElementsByTagName("div").length;
	var lastdiv = document.getElementById(what + "_" + num);
	mydiv.removeChild(lastdiv);
}

// expanding lists

function expand(link) {
	var id = link.id.substring(4, 41);
	var guid = "{" + id + "}";
	var parent = document.getElementById("div" + id);
	var children = document.getElementById("div" + id + "children");
	if (link.innerHTML == "[+]") {
		if (children) {
			link.innerHTML = "[-]";
			children.style.display = "block";
		} else {
			link.innerHTML = "...";
			ajaxsend("scripts/expand.php?guid=" + guid);
		}
	} else if (link.innerHTML == "[-]") {
		link.innerHTML = "[+]";
		if (children)
			children.style.display = "none";
	}
	return false;
}

function expandresponse(response) {
	var id = response.getElementsByTagName("element")[0].firstChild.data;
	var div = document.getElementById("div" + id);
	children = document.createElement("div");
	children.setAttribute("id", "div" + id + "children");
	children.setAttribute("class", "children");
	div.appendChild(children);
	var childclasses = response.getElementsByTagName("class");
	var childtitles = response.getElementsByTagName("title");
	var childguids = response.getElementsByTagName("guid");
	var childnames = response.getElementsByTagName("name");
	var childcgids = response.getElementsByTagName("id");
	if (childguids.length == 0)
		children.innerHTML = "Empty";
	else {
		var html = "<div id=\"div" + id + "\">\n";
		for (var i=0; i<childguids.length; i++) {
			var classname = childclasses.item(i).firstChild.data;
			var title = childtitles.item(i).firstChild.data;
			var guid = childguids.item(i).firstChild.data;
			var name = childnames.item(i).firstChild.data;
			var cgid = childcgids.item(i).firstChild.data;
			var childid = guid.substring(1, 37);
			if (classname != "sample" && classname != "datafile") {
				html += "<div id=\"div" + childid + "\">\n";
				html += "<a href=\"#\" onclick=\"return expand(this)\" id=\"link" + childid + "\" class=\"expand\">[+]</a> ";
			}
			if (classname == "datafile")
				html += title + ": <a href=\"download.php?file=" + guid + "\">" + name +
					"</a><span style=\"float: right; font-size: smaller;\">" + cgid + "</span><br/>\n";
			else
				html += title + ": <a href=\"index.php?" + classname + "=" + guid + "\">" + name +
					"</a><span style=\"float: right; font-size: smaller;\">" + cgid + "</span><br/>\n";
			if (classname != "sample")
				html += "</div>\n";
		}
		html += "</div>\n";
		children.innerHTML = html;
	}
	var expandedlink = document.getElementById("link" + id);
	expandedlink.innerHTML = "[-]";
}

// choosing from lists

function choosemylist() {
	document.forms.cangemform.add.disabled = true;
	document.forms.cangemform.del.disabled = false;
	document.forms.cangemform.longlist.selectedIndex = -1;
}
function chooselonglist() {
	document.forms.cangemform.add.disabled = false;
	document.forms.cangemform.del.disabled = true;
	document.forms.cangemform.mylist.selectedIndex = -1;
}
function moveitem(fromlist, tolist) {
	tolist.options[tolist.options.length] = new Option(fromlist[fromlist.selectedIndex].text, fromlist.value, false, false);
	fromlist.remove(fromlist.selectedIndex);
	document.forms.cangemform.add.disabled = true;
	document.forms.cangemform.del.disabled = true;
	var mylist = document.forms.cangemform.mylist.options;
	var myguids = "";
	for (i=0; i<mylist.length; i++)
		myguids += " " + mylist[i].value;
	document.forms.cangemform.myguids.value = myguids;
}

// uploads

function uploads(element) {
	var cmd = "scripts/uploads.php?element=" + element;
	ajaxsend(cmd);
	return false;
}

function uploadresponse(response) {
	var elementname = response.getElementsByTagName("element")[0].firstChild.data
	var element = document.getElementById(elementname);
	if (!element)
		return;
	var current = element.value;
	var guids = response.getElementsByTagName("guid");
	var names = response.getElementsByTagName("name");
	var html = "<option value=\"null\">-- Choose --</option>\n";
	for (var i=0; i<guids.length; i++) {
		html += "<option value=\"" + guids.item(i).firstChild.data + "\"";
		if (guids.item(i).firstChild.data == current)
			html += " selected";
		html +=">" + names.item(i).firstChild.data + "</option>\n";
	}
	element.innerHTML = html;
}

// top 10

function top10(element) {
	if (element.value == "loss") {
		document.getElementById('top10gains').style.display = "none";
		document.getElementById('top10losses').style.display = "block";
	} else {
		document.getElementById('top10gains').style.display = "block";
		document.getElementById('top10losses').style.display = "none";
	}
}

// dataset type

function datasettype(element) {
	if (element.value == "Regular") {
		document.getElementById('smart').style.display = "none";
		document.getElementById('regular').style.display = "block";
	} else {
		document.getElementById('smart').style.display = "block";
		document.getElementById('regular').style.display = "none";
	}
}

// change the type when editing access rights

function rightstype(element) {
	var tmp = element.name.split("_");
	var myselect = document.getElementById("who_" + tmp[1]);
	if (element.value == "null")
		var mycontents = "";
	else
		var mycontents = document.getElementById("hidden_" + element.value).innerHTML;
	myselect.innerHTML = mycontents;
}

// fetching article information from PubMed

function pubmed() {
	var pmid = document.forms.cangemform.PubMedID.value;
	if (pmid) {
		var cmd = "scripts/pubmed.php?uid=" + pmid;
		ajaxsend(cmd);
	}
}

function pubmedresponse(response) {
	var error = response.getElementsByTagName("error")[0].firstChild;
	if (error) {
		alert(error.data);
		return;
	}
	document.cangemform.Name.value = response.getElementsByTagName("title").item(0).firstChild.data;
	document.cangemform.Authors.value = response.getElementsByTagName("authors").item(0).firstChild.data;
	document.cangemform.Description.value = response.getElementsByTagName("abstract").item(0).firstChild.data;
}

// cghpower

function cghpowersource(element) {
	if (element.value == 'CanGEM') {
		document.getElementById('upload').style.display = 'none';
		document.getElementById('group1upload').style.display = 'none';
		document.getElementById('group2upload').style.display = 'none';
		document.getElementById('group1cangem').style.display = 'block';
		document.getElementById('group2cangem').style.display = 'block';
	} else {
		document.getElementById('upload').style.display = 'block';
		document.getElementById('group1upload').style.display = 'block';
		document.getElementById('group2upload').style.display = 'block';
		document.getElementById('group1cangem').style.display = 'none';
		document.getElementById('group2cangem').style.display = 'none';
	}
}

function cghpowerdatatype(element) {
	var tmp = element.name.split('_');
	var myselect = document.getElementById(tmp[0] + '_selection');
	if (element.value == 'null') {
		myselect.innerHTML = '';
		myselect.disabled = true;
	} else {
		myselect.innerHTML = document.getElementById('hidden_' + element.value).innerHTML;
		myselect.disabled = false;
	}
}

function cghpowervalidate() {
	showmessage('message', '');
	if (document.forms.cghpower.name.value == '') {
		showmessage('message', 'Please fill in the dataset name.');
		return false;
	}
	if (document.forms.cghpower.group1name.value == '') {
		showmessage('message', 'Please fill in the name for group A.');
		return false;
	}
	if (document.forms.cghpower.group2name.value == '') {
		showmessage('message', 'Please fill in the name for group B.');
		return false;
	}
	if (document.forms.cghpower.datasource.value == 'CanGEM') {
		if (document.forms.cghpower.group1_selection.value == '' || document.forms.cghpower.group1_selection.value == 'null') {
			showmessage('message', 'Please select data for group A.');
			return false;
		}
		if (document.forms.cghpower.group2_selection.value == '' || document.forms.cghpower.group2_selection.value == 'null') {
			showmessage('message', 'Please select data for group B.');
			return false;
		}
		if (document.forms.cghpower.group1_selection.value == document.forms.cghpower.group2_selection.value) {
			showmessage('message', 'The selections for group A and group B cannot be the same.');
			return false;
		}
	} else {
		if (document.forms.cghpower.file.value == '') {
			showmessage('message', 'Please choose the file to upload.');
			return false;
		}
		if (document.forms.cghpower.group1contents.value == '') {
			showmessage('message', 'Please define contents of group A.');
			return false;
		}
		if (document.forms.cghpower.group2contents.value == '') {
			showmessage('message', 'Please define contents of group B.');
			return false;
		}
	}
	if (document.forms.cghpower.email.value == '') {
		showmessage('message', 'Please enter your email address.');
		return false;
	}
	// showmessage('message', 'The program is unavailable at the moment.');
	// return false;
	return true;
}
