document.fingerprints = new Array();

function make_visible(id){
	if (document.getElementById(id)){
		var vis_obj = document.getElementById(id);
		vis_obj.style.display = '';
		}
	}
	
function make_invisible(id){
	if (document.getElementById(id)){
		var invis_obj = document.getElementById(id);
		invis_obj.style.display = 'none';
		}
	}

function makeGroupVisible(pre){
	var ElementIds = collectElements(pre);
	for (i=0;i<ElementIds.length;i++){
			ElementIds[i].style.display = '';
		}
	}
	
function makeGroupInvisible(pre){
	var ElementIds = collectElements(pre);
	for (i=0;i<ElementIds.length;i++){
			ElementIds[i].style.display = 'none';
		}
	}

function toggleVisibility(id){
	obj = document.getElementById(id);
	if (obj.style.display == 'none')
		obj.style.display = '';
	else obj.style.display = 'none';
	}


function goTo (page) {
/* This function is called from the navigation menu
   to jump to the designated URL. Empty values
   are ignored and "--" indicates a menu seperator    */
   
	if (page != "" ) {
		if (page == "--" ) {
			resetMenu();
		} else {
			document.location.href = page;
		}
	}
	return false;
}




//tree.php	
function collapseTD(id){
	obj = document.getElementById(id);
	obj.style.visibility = 'collapse';	
}

//tree.php
function expandTD(id){
	obj = document.getElementById(id);
	obj.style.visibility = 'visible';
}

//results,blast results
function countIds(theElements,theName){
	var N = 0;
        for(i=0; i<theElements.length; i++){
                if(theElements[i].type == "checkbox" && theElements[i].checked == true){
                	var Name = new String(theElements[i].name);
                	if(Name == theName){
                    		 N++
	        	}
        	}
	}
	return N;
}
//many
function changeTab(set,tabName){
	//get a list of tabs
	switch(set){
		case "cluster":
			tabs = new Array ("summary","analyze","find","options","getSeq");
			break;
		case "display":
			tabs = new Array ("clusterGenes","functionalAnalysis","MSA");
			break;
		case "graphics":
			break;
		case "search":
			tabs = new Array ("text","blast");
			break;
		case 'results':
			tabs = new Array ("summary","analyze","display","ontologies");
			break;
		case 'blast':
			tabs = new Array ("graphic","analyze");
			break;
		default: 
			break;
	}	
	// unset all tabs and hide all boxes
	for(i=0; i<tabs.length;i++){
		tab = document.getElementById("tab_"+tabs[i]);
		tab.className = "";
		box = document.getElementById("box_"+tabs[i]);
		box.style.display = "none";
		}
	//then set current tab and make box visible
	setTab = document.getElementById("tab_"+tabName);
	setTab.className = "current";
	setBox = document.getElementById("box_"+tabName);
	setBox.style.display = "";	
}


//many
function collectElements(preface){	
	var i=0;
	var customcollect=new Array();
	while (document.getElementById(preface + "_" + i)!=null){
		customcollect[i]= document.getElementById(preface + "_" + i);
		i++;
		}
	return customcollect;	
	}


//search
function checkFormState(){
	if(document.getElementById('radioDNA').checked){
//		window.alert('dna checked');
		makeGroupInvisible('proteinBlast');
		makeGroupVisible('dnaBlast');		
	}
	if(document.getElementById('radioOnt').checked){
		make_visible('ontology_list');
	}
	if(document.getElementById('activeForm').value == 'blast'){
		changeTab('search','blast');
	}
	else if(document.getElementById('activeForm').value == 'text'){
		changeTab('search','text');
	}
}

//search
function validateBlast(form){
	for (var i = 0; i<form.elements.length;i++){
		form.elements[i].value = form.elements[i].value.replace(/^\s+|\s+$/g, '');
		switch (form.elements[i].name){
			case "sequence":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "program":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "database":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "output":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "matrix":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "wordlength":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "ethr":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			case "showal":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			default:
				break;
			}
		}
	return true;
	}

//search
function validateKeyword(form){
	for (var i = 0; i<form.elements.length;i++){
		form.elements[i].value = form.elements[i].value.replace(/^\s+|\s+$/g, '');
		switch (form.elements[i].name){
			case "searchText":
				if (form.elements[i].value == ''){
					window.alert('Missing parameter: '+form.elements[i].name);
					return false;
					}
				break;
			default:
				break;
			}
		}
	return true;
	}

//search
function DisableButton(id) {
	b = document.getElementById(id);
	b.disabled = true;
	b.value = 'Submitting';
//	b.form.submit();
	}

//cluster (use for results too?)	
function uncheckAll(c){
	inputs = document.getElementsByTagName('input');
	for(var i=0; i < inputs.length; i++) {
		if (inputs[i].name == c && inputs[i].checked){
			checkChange(i);
		}
	}
}


/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
*/
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects
	 for(var item in arr) {
	  var value = arr[item];
	 
	  if(typeof(value) == 'object') { //If it is an array,
	   dumped_text += level_padding + "'" + item + "' ...\n";
	   dumped_text += dump(value,level+1);
	  } else {
	   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
	  }
	 }
	} else { //Stings/Chars/Numbers etc.
	 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
} 


//results
function loadSpecies(){
	for (i in document.show){
		cookie = readCookie(document.db+'_species'+i);
		if (cookie=="hide") sendSpeciesToOther(i);
		}
	}

//results
function clusterFuct(form){
	window.alert('must change');
}

//blast
function clusterFuctB(form){
	window.alert('must change');
}


function clusterJoin(form){
	var sT = document.getElementById('searchText');
	sT.value = '';
	for (var i=0; i<form.elements.length;i++){
		if (form.elements[i].name == 'cluster'){
			if(form.elements[i].checked){ 
				sT.value += ' clusterid:'+form.elements[i].value;
			}
		}
	}
	document.multiCluster.submit();
}

//blast
function clusterJoinB(form){
	var sT='';
	for (var i=0; i<form.elements.length;i++){
		if (form.elements[i].name == 'cluster'){
			if(form.elements[i].checked){ 
				sT += ' clusterid:'+form.elements[i].value;
			}
		}
	}
	goTo('show_cluster.php?method=0&search=1&searchText='+sT+'&detail=1');
}



//results, cluster
function sendSpeciesToOther(species){
	var i=0;
	var SPcells = new Array();
	var OTHcells = new Array();
	title = document.getElementById("title_"+species);
	title.style.display = "none";
	while (document.getElementById("row_"+i)!=null){
		SPcells[i] = document.getElementById("row_" + i +"_proteome_" +species);
		SPcells[i].style.display = "none";
		document.others[i] = document.others[i] + document.members[species][i];		
		OTHcells[i] = document.getElementById("row_" + i +"_other");
		OTHcells[i].innerHTML = document.others[i];
		i++;
		}
	make_invisible('hide'+species);
	make_visible('show'+species);
	document.show[species] = 0;
}


//results, cluster
function getSpeciesFromOther(species){
	var i=0;
	var SPcells = new Array();
	var OTHcells = new Array();
	
	title = document.getElementById("title_"+species);
	title.style.display = "";
	
	while (document.getElementById("row_"+i)!=null){
		SPcells[i] = document.getElementById("row_" + i +"_proteome_" +species);
		SPcells[i].style.display = "";

		document.others[i] = document.others[i] - document.members[species][i];
		
		
		OTHcells[i] = document.getElementById("row_" + i +"_other");
		if (document.others[i] == 0){
			OTHcells[i].innerHTML = "x";
			}			
		else OTHcells[i].innerHTML = document.others[i];

		i++;
		}
	make_visible('hide'+species);
	make_invisible('show'+species);
	document.show[species] = 1;
}

// cluster, results
function setCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "; expires=Thu, 31-Dec-2020 00:00:00 GMT";
	document.cookie = name+"="+value+expires+"; path=/";
}
// cluster,results
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


//cluster,results
function setSpeciesCookies(){
	for (i in document.show){
		if (document.show[i]) 
			setCookie(document.db+'_species'+i,"show",365);
		else setCookie(document.db+'_species'+i,"hide",365);
		}	
	window.alert('Species settings have been saved');
	}
//cluster,results
function readSpeciesCookies(){
	for (i in document.show){
		cookie = readCookie(document.db+'_species'+i);
		if (cookie=="hide") hideSpecies(i);
		}
	}





//cluster
function getSeqVal(form){
	var orgs = "";
	for (var i = 0; i<form.elements.length;i++){
		if (form.elements[i].name == 'exclude')
		excluded = form.elements[i];
	}
	for (i in document.show){
		if (!document.show[i])
		orgs = orgs+ "," + i ;	
	}
	orgs = orgs.substring(1);
	if (orgs.length>0){
		excluded.value = orgs;
		window.alert('Please note that not all organisms will be included');
	}
	else excluded.value = -1;
	

	return true;
	}
	
//cluster
function typeNuc(action){
	nbut = document.getElementById('radioNuc');
	if (action=='disable'){
		radioChange(document.pepInpId);
		nbut.disabled = true;
		make_invisible(document.nucButId);
		make_visible('radioNucInactive');
	}
	else if (action=='enable'){
		nbut.disabled= false;
		make_visible(document.nucButId);
		make_invisible('radioNucInactive');
	}
}
//cluster
function getOnts(){
	var ont = new String("");
	for(i=0; i<document.ont_search.elements.length; i++){
		if(document.ont_search.elements[i].type == "checkbox" && document.ont_search.elements[i].checked == true){
		var N = new String(document.ont_search.elements[i].name);
		if(N=="ontId"){
			ont = ont + " " +  
			document.ont_search.elements[i].value;
			}
		}
	}
	document.search2.searchText.value = ont;
	if (ont.length<1){
		window.alert('No ontologies selected');
		return false;
		}
	else return true;
	}
	
//cluster
function hideSpecies(proteomeID){
	pacids = document.genes[proteomeID];
	for(i=0;i<pacids.length;i++){
		// cluster gene table
		a = document.getElementById("row"+pacids[i]);
		a.style.display = "none";
		// MSA
		if(b = document.getElementById("msa_label"+pacids[i]))
		b.style.display = "none";
		if(c = document.getElementById("msa_line"+pacids[i]))
		c.style.display = "none";
		}
	sendSpeciesToOther(proteomeID);
	make_invisible('hide'+proteomeID);
	make_visible('show'+proteomeID);
	document.show[proteomeID] = 0;
	}

//cluster
function showSpecies(proteomeID){
	pacids = document.genes[proteomeID];
	for(i=0;i<pacids.length;i++){
		a = document.getElementById("row"+pacids[i]);
		a.style.display = "table-row";
		if(b = document.getElementById("msa_label"+pacids[i]))
		b.style.display = "table-row";
		if(c = document.getElementById("msa_line"+pacids[i]))
		c.style.display = "table-row";
		}
	getSpeciesFromOther(proteomeID);	
	make_invisible('show'+proteomeID);
	make_visible('hide'+proteomeID);	
	document.show[proteomeID] = 1;
	}
//cluster
function setLists(){
	inputs = document.getElementsByTagName('input');
	for(var i=0; i < inputs.length; i++) {
		if (inputs[i].checked ){
			boxID = inputs[i].id;
			boxName = inputs[i].name;
			if (boxName == 'geneId'){
				var re = new RegExp("geneBox(.*)");
				boxID.match(re);
				var listId = "geneSpan"+ RegExp.$1;
				make_visible(listId);
			}
			else if (boxName == 'ontId'){
				var re = new RegExp("ontBox(.*)");
				boxID.match(re);
				var listId = "ontSpan"+RegExp.$1;
				make_visible(listId);				
			}

		}		
	}	
}
//cluster
// images for use in synteny view
var geneL = "images/genes/gene_l.gif";
var geneR = "images/genes/gene_r.gif";
var highlightedGeneL = "images/genes/gene_l_red.gif";
var highlightedGeneR = "images/genes/gene_r_red.gif";
var whiteGeneL = "images/genes/gene_l_white.gif";
var whiteGeneR = "images/genes/gene_r_white.gif";
var highlightedWhiteGeneL = "images/genes/gene_l_red_white.gif";
var highlightedWhiteGeneR = "images/genes/gene_r_red_white.gif";

var anchorGeneL = "images/genes/anchorL.gif";
var anchorGeneR = "images/genes/anchorR.gif";
var highlightedAnchorL = "images/genes/anchorL_red.gif";
var highlightedAnchorR = "images/genes/anchorR_red.gif";


//cluster
function expand(geneId){
	make_visible('xtra'+geneId+'_xid');
	make_visible('xtra'+geneId+'_symbol');
	make_visible('xtra'+geneId+'_defline');
	make_visible('minus'+geneId);
	make_invisible('plus'+geneId);
	make_invisible('3dot'+geneId);
//	window.alert('expanded '+geneId);
	row = document.getElementById('row'+geneId);
	row.style.lineHeight = "16px"; // doesn't have any effect, but forces browser to rerender table row
	}
//cluster
function contract(geneId){
	make_invisible('xtra'+geneId+'_xid');
	make_invisible('xtra'+geneId+'_symbol');
	make_invisible('xtra'+geneId+'_defline');
	make_invisible('minus'+geneId);
	make_visible('plus'+geneId);
	make_visible('3dot'+geneId);

	row = document.getElementById('row'+geneId);
	row.style.lineHeight = "";

	}
//cluster
function getIds(){
	var id = new String("");
	for(i=0; i<document.gene_search.elements.length; i++){
		if(document.gene_search.elements[i].type == "checkbox" && document.gene_search.elements[i].checked == true){
			var N = new String(document.gene_search.elements[i].name);
			if(N=="geneId"){
				id = id + 
					document.gene_search.elements[i].value;
			}
		}
	}
	document.search1.searchText.value = id;
	if (id.length<1){
		window.alert('No genes selected');
		return false;
		}
	else return true;
}
//cluster
function setGraphicsTab(tabName){
	searchTabs = new Array ("domain","synteny");
	//first clear
	for(i=0; i<searchTabs.length;i++){
		tab = document.getElementById("tab_"+searchTabs[i]);
		tab.style.borderColor = '#FFFFFF';
		hideColumn(searchTabs[i]);
		}
	//then set current tab and make box visible
	setTab = document.getElementById("tab_"+tabName);
	setTab.style.borderColor = "#31557F";
	showColumn(tabName);
	}
//cluster
function highlightCluster(cluster){
	clearActiveEntity();
	var clusterElementIds = collectElements("cluster" + cluster);
	for (i=0;i<clusterElementIds.length;i++){
		if (clusterElementIds[i].src.match(geneL))
			clusterElementIds[i].src = highlightedGeneL;
		else if (clusterElementIds[i].src.match(whiteGeneL))
			clusterElementIds[i].src = highlightedWhiteGeneL;
		else if (clusterElementIds[i].src.match(geneR))
			clusterElementIds[i].src = highlightedGeneR;
		else if (clusterElementIds[i].src.match(whiteGeneR))
			clusterElementIds[i].src = highlightedWhiteGeneR;
		else if (clusterElementIds[i].src.match(anchorGeneL))
			clusterElementIds[i].src = highlightedAnchorL;
		else if (clusterElementIds[i].src.match(anchorGeneR))
			clusterElementIds[i].src = highlightedAnchorR;
		}	

	var boxId = 'cluster_' + cluster + '_infobox';
	document.active_entity = "cluster_" + cluster;
	make_visible(boxId);
	}

// this (called by highlight cluster and domain)
function clearActiveEntity(){
	if (document.active_entity){
		var re1 = new RegExp("cluster_(.*)");
		var re2 = new RegExp("domain_(.*)");
		if (document.active_entity.match(re1)){
//			clearClusters();
			var cluster = RegExp.$1;
			var clusterElementIds = collectElements("cluster" + cluster);
			for (i=0;i<clusterElementIds.length;i++){
				if (clusterElementIds[i].src.match(highlightedGeneL))
					clusterElementIds[i].src = geneL;
				else if (clusterElementIds[i].src.match(highlightedGeneR))
					clusterElementIds[i].src = geneR;
				else if (clusterElementIds[i].src.match(highlightedWhiteGeneL))
					clusterElementIds[i].src = whiteGeneL;
				else if (clusterElementIds[i].src.match(highlightedWhiteGeneR))
					clusterElementIds[i].src = whiteGeneR;
				else if (clusterElementIds[i].src.match(highlightedAnchorL))
					clusterElementIds[i].src = anchorGeneL;
				else if (clusterElementIds[i].src.match(highlightedAnchorR))
					clusterElementIds[i].src = anchorGeneR;
				}				
			}
		else if (document.active_entity.match(re2)){ 
			var domain = RegExp.$1;
			var domainElementIds = collectElements(domain);
			for (i=0;i<domainElementIds.length;i++){
				domainElementIds[i].style.borderStyle = "none";
				domainElementIds[i].style.zIndex = "0";
				}				
			}
		infoboxId = document.active_entity + "_infobox";
		make_invisible(infoboxId);
		document.active_entity = undefined;			
		}
	else {
		make_invisible('infobox_intro');
		make_invisible('infobox_introSyn');
		make_invisible('infobox_introDom');		
		}
	}
//cluster
function highlightDomain(domain){
	if (document.getElementById(domain+'_300')){
		window.alert('I\m sorry. I can\'t do it. There\'s just too many of them.');
		return;
	}
	clearActiveEntity();
	var domainElementIds = collectElements(domain);
	for (i=0;i<domainElementIds.length;i++){
		domainElementIds[i].style.borderStyle = "solid";
		domainElementIds[i].style.zIndex = "1";
		}	
	var boxId = 'domain_' + domain + '_infobox';
	make_visible(boxId);
//	changeTab('cluster','info');
	document.active_entity = "domain_" + domain;
	}
//cluster
function syntenyUp(){
	if (document.synteny < document.max_match){
		document.synteny++;
		re = /match(\d+)/;
		var all = document.getElementsByTagName('img');
		for (var e = 0; e < all.length; e++){
			if (all[e].className.match(re)){
				re.exec(all[e].className);
				if (RegExp.$1<document.synteny){
					if (all[e].src.match(highlightedGeneL))
						all[e].src = highlightedWhiteGeneL;
					else if (all[e].src.match(geneL))
						all[e].src = whiteGeneL;
					else if (all[e].src.match(highlightedGeneR))
						all[e].src = highlightedWhiteGeneR;
					else if (all[e].src.match(geneR))
						all[e].src = whiteGeneR;
					}
				
				}
			}
		for (f=2;f<=document.max_match; f++){
			make_invisible('SN'+f);
		}
		make_visible('SN'+document.synteny);
		}
	else{
		window.alert("#matches can't go higher");	
		}
	}
//cluster
function syntenyDown(){
	if (document.synteny >= 3){
		document.synteny--;
		re = /match(\d+)/;
		var all = document.getElementsByTagName('img');
		for (var e = 0; e < all.length; e++){
			if (all[e].className.match(re)){
				re.exec(all[e].className);
				if (RegExp.$1>=document.synteny){
					if (all[e].src.match(highlightedWhiteGeneL))
						all[e].src = highlightedGeneL;
					if (all[e].src.match(whiteGeneL))
						all[e].src = geneL;
					if (all[e].src.match(highlightedWhiteGeneR))
						all[e].src = highlightedGeneR;
					if (all[e].src.match(whiteGeneR))
						all[e].src = geneR;
					}
				
				}
			}
		for (f=2;f<=document.max_match; f++){
			make_invisible('SN'+f);
		}
		make_visible('SN'+document.synteny);
		}
	else{
		window.alert("#matches can't go lower");	
		}
	}

//cluster
function showGeneID(gene,cluster,text){
	if (document.active_entity == "cluster_" + cluster){
		return overlib(text);
		}
	}






//cluster
function showInfo(active,boxID){
	if (document.active_entity == undefined){
		fadeIn(boxID,0);
		}
	else if (document.active_entity.match(active)){
		fadeIn(boxID,0);
		}
	}


function fadeIn(objectID){
	if (document.oID != undefined){
		clearTimeout(document.to);
		if (document.oID != objectID){
			make_invisible(document.oID);
			}
	}
	
	if (document.oID != objectID){
		document.oID = objectID;
		document.opac = 0;
		
		obj= document.getElementById(objectID);
		obj.style.opacity = document.opac;
		obj.style.display = '';
		
		fade();
		}
	}

function fade(){
	objectID = document.oID;
	document.opac = 1;
//	document.opac += 0.1;
	obj= document.getElementById(objectID);
	obj.style.opacity = document.opac;
	if(document.opac<1){
		setTimeout('fade()',50);
	}
}


//cluster
function fadeInfo(boxID){
	if (document.oID == boxID){
//		document.to = setTimeout('fadeOut()',2000);	
//		fadeOut();	
	}
}

function fadeOut(){
	make_invisible(document.oID);
	document.oID = undefined;
	clearActiveEntity();
//	if (document.mo != undefined){
//		fadeIn(document.mo);
//		}
}






//cluster
function hideGeneID(gene){
	var boxId = 'gene_' + gene + '_info';
	return nd();
	}
//cluster
function showSpanInfo (domain,text){
	if (document.active_entity == "domain_" + domain){
		return overlib(text);
		}
	}
//cluster
function hideSpanInfo (span){
	return nd();
	}
//cluster
function loadColumns(){
	var columns = new Array("location","xid","symbol","defline","graphics");
	var defaults = new Array("show","show","show","show","show");
	for(i=0;i<columns.length;i++){
		cookie = readCookie(columns[i]);
		if (cookie){
			if (cookie == "show"){
				showColumn(columns[i]);
				}
			}
		else{
			if (defaults[i] == "show"){
				showColumn(columns[i]);
				}
			}
		}
	}
//cluster
function setColumnCookies(){
	for (i in document.columnShow){
		if (document.columnShow[i]) 
			setCookie(i,"show");
		else setCookie(i,"hide");;
		}	
	window.alert('Gene display settings have been saved');
}
//cluster
function showColumn(columnName){
	showImg = "show_" + columnName;
	hideImg = "hide_" + columnName;
	columnClass = "g_" + columnName;
	var columnCells = collectElements(columnClass);
	for (j=0;j<columnCells.length;j++){
		columnCells[j].style.display = "";
		}
	make_invisible(showImg);
	make_visible(hideImg);
	document.columnShow[columnName] = true;	
	}

//cluster
function hideColumn(columnName){
	showImg = "show_" + columnName;
	hideImg = "hide_" + columnName;
	columnClass = "g_" + columnName;
	var columnCells = collectElements(columnClass);
	for (j=0;j<columnCells.length;j++){
		columnCells[j].style.display = "none";
		}	
	make_invisible(hideImg);
	make_visible(showImg);
	document.columnShow[columnName] = false;	
	}
