var IE;
var DOM;
// browser detection
IE = (document.all);
DOM = (document.getElementById);

// constants
var downColor = "#CCCCCC";
var upColor   = "#999999";

// global variables
// by default substructure search tab is active
var activeTab = "sss";

// number of data fields in searchform.html
var numDataFields = 20;

// flag for functional groups input layer expansion
var fg_menu_expanded = false;
// flag for occurence input layer expansion
var oc_menu_expanded = false;
// flag for compartment input layer expansion
var cm_menu_expanded = false;
// flag for 3D constraints input layer expansion
var co_menu_expanded = false;


// XXX
// op1, data1, method1 and neg1 are reserved for structure data for FSS/SS/SSS


// Hides given layer by its ID
// Supports only IE and DOM-enabled browsers (Mozilla, NN7+ etc)
function hideLayer(id) {
	// IE
	if(IE) {
		eval('document.all[\"' + id + '\"].style.visibility = "hidden"');
		eval('document.all[\"' + id + '\"].style.display = "none"');
		return;
	}
	// DOM browsers
	if(DOM) {
		eval('document.getElementById(\"' + id + '\").style.visibility = "hidden"');
		eval('document.getElementById(\"' + id + '\").style.display = "none"');
	}
}

// Shows given layer by its ID
// Supports only IE and DOM-enabled browsers (Mozilla, NN7+ etc)
function showLayer(id) {
	// IE
	if(IE) {
		eval('document.all[\"' + id + '\"].style.visibility = "visible"');
		eval('document.all[\"' + id + '\"].style.display = "block"');
		return;
	}
	// DOM browsers
	if(DOM) {
		eval('document.getElementById(\"' + id + '\").style.visibility = "visible"');
		eval('document.getElementById(\"' + id + '\").style.display = "block"');
	}
}

// Pushes down selected layer
function pushById(id) {
	var trigger = null;
	// IE
	if(IE) {
		trigger=eval('document.all[\"' + id + '\"]');
	}
	// DOM browsers
	if(DOM) {
		trigger=eval('document.getElementById(\"' + id + '\")');
	}
	if (trigger != null) {
		push(trigger);
	}
}

// Pops up selected layer
function popById(id) {
	var trigger = null;
	// IE
	if(IE) {
		trigger = eval('document.all[\"' + id + '\"]');
	}
	// DOM browsers
	if(DOM) {
		trigger = eval('document.getElementById(\"' + id + '\")');
	}
	if (trigger != null) {
		pop(trigger);
	}
}

// pushes given layer down visually
function push(trigger) {
	trigger.style.background=downColor;
	trigger.style.margin="0px 0px 2px 0px";
}

// pops up givel layer visually
function pop(trigger) {
	trigger.style.background=upColor;
	trigger.style.margin="2px 0px 0px 0px";
}

// gets a layer by its ID in target window
function getLayerByID(target, layerID) {
	// IE 5.0 +
	if(IE) {
		return target.document.all[layerID];
	}
	// DOM browsers
	if(DOM) {
		return target.document.getElementById(layerID);
	}
}

// Shows "tab" - layer that have send this event becomes "down"
// and the given layer is shown while the rest is hidden
function showTab(show, trigger) {
	// push event sender
	// this works always ok as I pass object itself
	push(trigger);
	// pop other tabs
	if (show == 'exact') {
		popById("TabSSS");
		popById("TabSimSearch");
		popById("TabTrafo");
		// hide other layers
		hideLayer("SSSParam");
		hideLayer("SimSearchParam");
		hideLayer("Trafo");
		// clear simsearch parameters
		document.forms['searchForm'].sim_method.selectedIndex=0;
		// clear neg1 option
		document.forms['searchForm'].neg1.checked = false;
		// clear TRAFO settings
		// alert("TODO Clear Trafo");
		// show my layer
		showLayer("ExactMatchParam");
		activeTab ="fs";
	} else if (show == 'sss') {
		popById("TabExact");
		popById("TabSimSearch");
		popById("TabTrafo");
		// hide other layers
		hideLayer("ExactMatchParam");
		hideLayer("SimSearchParam");
		hideLayer("Trafo");
		// clear TRAFO settings
		// alert("TODO Clear Trafo");
		// clear exact match parameters
		document.forms['searchForm'].fs_method.selectedIndex=0;
		// clear simsearch parameters
		document.forms['searchForm'].sim_method.selectedIndex=0;
		// clear neg1 option
		document.forms['searchForm'].neg1.checked = false;
		// show my layer
		showLayer("SSSParam");
		activeTab ="sss";
	} else if (show == 'simsearch') {
		popById("TabExact");
		popById("TabSSS");
		popById("TabTrafo");
		// hide other layers
		hideLayer("ExactMatchParam");
		hideLayer("Trafo");
		hideLayer("SSSParam");
		// clear exact match parameters
		document.forms['searchForm'].fs_method.selectedIndex=0;
		// clear TRAFO settings
		// clear neg1 option
		document.forms['searchForm'].neg1.checked = false;
		// alert("TODO Clear Trafo");
		// show my layer
		showLayer("SimSearchParam");
		activeTab ="sim";
	} else { // Trafo
		popById("TabExact");
		popById("TabSimSearch");
		popById("TabSSS");
		// hide other layers
		hideLayer("ExactMatchParam");
		hideLayer("SSSParam");
		hideLayer("SimSearchParam");
		// clear exact match parameters
		document.forms['searchForm'].fs_method.selectedIndex=0;
		// clear simsearch parameters
		document.forms['searchForm'].sim_method.selectedIndex=0;
		document.forms['searchForm'].neg1.checked = false;
		// show my layer
		showLayer("Trafo");
		activeTab ="trafo";
	}
}

// Expands/collapses a layer
function toggleExpand(hostLayerObj, layerId, flagVar) {
	eval(flagVar + " = ! " + flagVar + ";");
	if (eval(flagVar)) {
		// expand layer
		hostLayerObj.className="exp_input_open";
		showLayer(layerId);
	} else {
		// collapse layer
		hostLayerObj.className="exp_input_closed";
		hideLayer(layerId);
	}
}

// Collapse given layer
function collapse(hostLayerId, layerId, flagVar) {
	var layerObj =  null;
	// IE 5.0 +
	if(IE) {
		layerObj = document.all[hostLayerId];
	}
	// DOM browsers
	if(DOM) {
		layerObj = document.getElementById(hostLayerId);
	}
	// first see if the layer is expanded
	if (eval(flagVar) && (layerObj != null)) {
		// collapse layer
		layerObj.className="exp_input_closed";
		hideLayer(layerId);
	}
	// mark flag variable - the layer is collapsed
	eval(flagVar + " = false;");
}

// Shows "page" - layer that have sent this event becomes "down"
// and the given layer is shown while the rest is hidden
function showPage(show, trigger) {
	// push event sender
	// this works always ok since I pass layer object itself
	push(trigger);
	// pop other tabs
	if (show == 'QueryProps') {
		popById("TabBasic");
		// hide other layers
		hideLayer("BasicProps");
	} else {
		popById("TabQuery");
		// hide other layers
		hideLayer("QueryProps");
	}
	// show page
	showLayer(show);
}

// Ensures that if no name entered, the option selector is unselected
function checkNotEmpty(field, selectorName) {
	if (field.value == "") {
		// reset selector to not selected state
		eval("document.forms['searchForm']." + selectorName + ".selectedIndex = 0");
	}
}

// Sets the desired formula search option
// The field variable names are constructre dynamically
function setFieldOption(fieldNum, valueIfChecked, valueIfUnchecked) {
	field = eval("document.forms['searchForm'].op" + fieldNum);
	checkbox = eval("document.forms['searchForm'].substring" + fieldNum);
	if (checkbox.checked) {
		field.value = valueIfChecked;
	} else {
		field.value = valueIfUnchecked;
	}
}

// Sets on/off value
function setValue(checkbox, on, off) {
	if (checkbox.value) { // object exist?
		checkbox.value = checkbox.checked ? on : off;
	} else { // get it by name
		obj = eval("document.forms['searchForm']."+checkbox);
		if (obj.value) {
			// object found
			checkbox.value = checkbox.checked ? on : off;
		} else {
			alert("Could not find object named "  + checkbox);
		}
	}
}

function changeTrafo() {
	//var core = getRadio(document.forms['searchForm'].core);
	//var lig = getRadio(document.forms['searchForm'].lig);
	//var oxo = getRadio(document.forms['searchForm'].oxo);
	var coreSel = document.forms['searchForm'].core;
	var ligSel  = document.forms['searchForm'].lig;
	var oxoSel  = document.forms['searchForm'].oxo;

	var core = coreSel.options[coreSel.selectedIndex].value;
	var lig  = ligSel.options[ligSel.selectedIndex].value;
	var oxo  = oxoSel.options[oxoSel.selectedIndex].value;
	if (core=="full") {
		//setRadio(document.forms['searchForm'].lig,"none");
		for (var i=0; i<ligSel.options.length; i++) {
			if (ligSel.options[i].value=='none') {
				ligSel.selectedIndex=i;
			}
		}
	} else {
		if (lig!="alpha") {
			//setRadio(document.forms['searchForm'].oxo,"0");
			for (var i=0; i<oxoSel.options.length; i++) {
				if (oxoSel.options[i].value=='0') {
					oxoSel.selectedIndex=i;
				}
			}
		}
	}
}

function getTrafo() {
	// var core = getRadio(document.forms['searchForm'].core);
	// var lig = getRadio(document.forms['searchForm'].lig);
	// var oxo = getRadio(document.forms['searchForm'].oxo);
	var coreSel = document.forms['searchForm'].core;
	var ligSel  = document.forms['searchForm'].lig;
	var oxoSel  = document.forms['searchForm'].oxo;

	var core = coreSel.options[coreSel.selectedIndex].value;
	var lig  = ligSel.options[ligSel.selectedIndex].value;
	var oxo  = oxoSel.options[oxoSel.selectedIndex].value;

	if (core=="full") {
		if (oxo=="1") {
			hash = "E_TRAFO_OXIDATION";
		} else {
			hash = "E_HASHY"
		}
	} else {
		hash = "E_TRAFO_" + core.toUpperCase();
		if (lig!="none") {
			hash += "_" + lig.toUpperCase();
		}
		if (oxo=="1") {
			hash += "_OXO";
		}
	}
	// alert('TRAFO code ' + hash);
	document.forms['searchForm'].method1.value = hash;
	document.forms['searchForm'].op1.value     ="trafo";
}

// Copy settings from SS, SSS, exact or precursors search
// to the actual data to be submitted
// XXX fields op1, method1 and neg1 are hardcoded
// and pre-destined to be used for (sub)structure search
function copySettings(fieldName) {
	document.forms['searchForm'].op1.value =
		eval("document.forms['searchForm']." + fieldName + "_option.value");
	document.forms['searchForm'].method1.value =
		eval("document.forms['searchForm']." + fieldName + "_method.value");
	document.forms['searchForm'].neg1.checked =
		(eval("document.forms['searchForm']." + fieldName + "_neg1.value") == "on") ? true : false;
}

// SMILES entry field and JME editor are used in XOR mode -
// either one enters SMILES code or draws the structure.
// Together they are not allowed
function xorFields(field1, field2) {
	return (field1.value != "" && field2.value != "");
}

// Check the submission content and allows/denies submission
function checkAndSubmit() {
	var i;
	var selector;
	var selIdx;
	var atoms;
	var range;
	var conField;
	var temp;
	// detect which tab is active
	if (activeTab == "trafo") {
		// copy transformation settings
		getTrafo();
	} else { // fs, sss, sim
		// copy search settings
		copySettings(activeTab);
	}
	// try reading SMILES from editor
	document.forms['searchForm'].data1.value = document.JME.smiles();
	// check if there is at least one data field filled with data
	var bIsData = false;
	for (i = 1; i < (numDataFields+1); i++) {
		temp = eval("document.forms['searchForm'].data" + i + ".value");
		if (temp != "") {
			bIsData = true;
			break; // it is enough to have one field
		}
	}
	if (!bIsData) {
		alert("You have to specify at least one search criteria!");
		// make the Form button active
		top.selectButton("Form");
		return false;
	}
	return true;
}

// resets all the input fields
function resetForm() {
	document.JME.reset();
	document.forms['searchForm'].reset();
	document.forms['searchForm'].op1.value     = ""
	document.forms['searchForm'].data1.value   = ""
	document.forms['searchForm'].method1.value = "";
	document.forms['searchForm'].neg1.checked  = false;
	document.forms['searchForm'].neg1.value    = "";
	return true;
}

// read selection state for currently loaded data from
// the selectionStore applet
// in case there is form named "list" present,
// updates its content accordingly
function restoreSelection() {
	var store = top.frames["navbar"].document.selectionStore;
	// if the selection store was reset, then exit, thus the first
	// time the hitlist is shown, the data is correct
	if (!store.isReset()) {
		var myForm = document.forms["list"];
		if (myForm!=null) {
			// gets space-separated string of selected IDs
			var selState = store.getSelected();
			// split it by space to get selected IDs
			var selected = selState.split(' ');
			// now select all checkboxes that are in array and deselect the rest
			for (var i=0;i<myForm.elements.length;i++) {
				if (myForm.elements[i].type!="checkbox") continue;
				// else - it is a checkbox, get its ID
				var id = myForm.elements[i].name.substring(2);
				var check = false;
				for (var j = 0; j < selected.length; j++) {
					if (id==selected[j]) {
						check = true;
						break;
					}
				}
				myForm.elements[i].checked = check;
			}
		}
	} else {
		// read data from the document
		var myForm = document.forms["download"];
		if (myForm!=null) {
			store.load(myForm.data1.value);
		}
	}
}
