//##########################
//#### BINDER functions ####
//##########################

function compareBinders() {
	var binder_ids = new Array();
	var binders = document.getElementsByName('binder_id');
	for (var i=0; i<binders.length; i++) {
		if (binders[i].checked) binder_ids.push(binders[i].value);
	}
	if (binder_ids.length < 2) {
		alertation('', 'Select at least two binders.', 'Binder comparison');
		return false;
	}
	document.location.href='binder_compare.php?binder_id=' + binder_ids.join(',');
}

function toggleSection(section, lnk) {
	var trs = getElement(section).getElementsByTagName('tr');
	for (var i=0; i<trs.length; i++) {
		if (trs[i].attributes && trs[i].attributes['hide']) trs[i].style.display = (trs[i].style.display)? '' : 'none';
	}
	lnk.innerHTML = (lnk.innerHTML.indexOf('More') != -1)? 'Less info' : 'More info';
}

function selectBinder(new_binder_id, expand_supplier) {
	//if (binder_id == new_binder_id) return;
	if (el = getElement('antibody_loading')) el.style.visibility = 'visible';
	loadAntibodies(new_binder_id, expand_supplier);
	loadApplications(new_binder_id);
	loadValidations(new_binder_id);
	binder_id = new_binder_id;
}

function loadAntibodies(binder_id, expand_supplier) {
	if (expand_supplier != -1) expand_supplier = '&expand_supplier='+expand_supplier;
	else expand_supplier = '';
	connection = new AjaxConnection('include_antibody.php?binder_id='+binder_id+expand_supplier);
	connection.ajaxConnect(null, 'antibody_div');
}
function loadApplications(binder_id) {
	connection = new AjaxConnection('include_application.php?binder_id='+binder_id);
	connection.ajaxConnect(null, 'application_div');
}
function loadValidations(binder_id) {
	if (el = getElement('validation_loading')) el.style.visibility = 'visible';
	connection = new AjaxConnection('include_validation.php?binder_id='+binder_id);
	connection.ajaxConnect(null, 'validation_div');
}

function getTr(geneId, nr, supplierId) {
	connection = new AjaxConnection('binders_tr.php?gene_id='+geneId+'&nr='+nr+'&expand_supplier='+supplierId);
	connection.ajaxConnect('swapTr', 'tr_'+nr);
}
function swapTr(response, targetId) {
	var tbl = getElement('binder_list');
	var tbody = getElement(targetId);
	var div = document.createElement("DIV");
	div.innerHTML = "<table><tbody id=\""+targetId+"\">" + response + "</tbody></table>";
	var newTbody = div.getElementsByTagName("TBODY")[0];
	tbl.replaceChild(newTbody, tbody);
}

//############################
//#### CSV FILE functions ####
//############################
function addPair() {
	var features = getElement('feature_id');
	var columns = getElement('column_id');
	var pairs = getElement('pairs');
	if (features.selectedIndex == -1) {
		alertation('', 'No Antibodypedia feature selected!', 'Error');
		return;
	}
	else if (columns.selectedIndex == -1) {
		alertation('', 'No File header selected!', 'Error');
		return;
	}
	var opt = document.createElement('option');
  opt.setAttribute('value',features.options[features.selectedIndex].value+'='+columns.options[columns.selectedIndex].value);
  opt.innerHTML = features.options[features.selectedIndex].innerHTML+' = '+columns.options[columns.selectedIndex].innerHTML;
  pairs.appendChild(opt);
	features.removeChild(features.options[features.selectedIndex]);
	columns.removeChild(columns.options[columns.selectedIndex]);
}

function removePair() {
	var features = getElement('feature_id');
	var columns = getElement('column_id');
	var pairs = getElement('pairs');
	if (pairs.selectedIndex == -1) {
		alertation('', 'No pair selected!', 'Error');
		return;
	}
	var txts = pairs.options[pairs.selectedIndex].innerHTML.split(' = ');
	var vals = pairs.options[pairs.selectedIndex].value.split('=');
	var f_opt = document.createElement('option');
  f_opt.setAttribute('value', vals[0]);
  f_opt.innerHTML = txts[0];
  features.appendChild(f_opt);
	var c_opt = document.createElement('option');
  c_opt.setAttribute('value', vals[1]);
  c_opt.innerHTML = txts[1];
  columns.appendChild(c_opt);
	pairs.removeChild(pairs.options[pairs.selectedIndex]);
}

function postPairs() {
	var pairs;
	if (pairs = getElement('pairs')) {
		pairs = pairs.options
		var post_pairs = new Array();
		for (var i=0; i< pairs.length; i++) {
			post_pairs.push(pairs[i].value);
		}
		getElement('post_pairs').value = post_pairs.join(';');
	}
}

function showFeatureDescription(id) {
	getElement('featureDescription').innerHTML = getElement('featureDescription_' + id).innerHTML;
}

//###########################
//#### TOOLTIP functions ####
//###########################

var offsetx = 12;
var offsety = 15;
var div_tooltip = false;

function exit() {	// Hides tooltips and guidelines
	if (div_tooltip) {
		div_tooltip.style.display = 'none';
	}
}

function newElement(newid, parentEl, zI) {	// Creates a new div element
	if (document.createElement) {
		var el = document.createElement('div');
		el.id = newid;
		with (el.style) {
			display = 'none';
			position = 'absolute';
			textAlign = 'left';
			zIndex = zI;
			padding = '2px';
		  background = '#d5daff';
		  border = '1px solid #000';
		  fontSize = '10px';
			fontFamily = 'verdana, sans serif';
		}
		el.innerHTML = '&nbsp;';
		parentEl.appendChild(el);
	}
	return el;
}

function getmouseposition(e) {	// Moves tooltip and guideline when mouse moves
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) {
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) {
		posx = e.clientX + getPageScroll()[0];
		posy = e.clientY + getPageScroll()[1];
	}
	if (div_tooltip) {
		div_tooltip.style.left = (posx+offsetx) + 'px';
		div_tooltip.style.top = (posy+offsety) + 'px';
	}
}

function tooltip(tip, breaker) {	// Shows tooltip
	if (!div_tooltip) {
		div_tooltip = newElement('tooltip', document.body, 7);
	}
	if (breaker>0) {
		div_tooltip.style.width = breaker+'px';
	} else {
		div_tooltip.style.width = '';
	}
	div_tooltip.innerHTML = tip;
	div_tooltip.style.display = 'block';
	document.onmousemove = getmouseposition;
}


//##################################
//#### PROMPT / POPUP functions ####
//##################################

function confirmation(form_id, text, header, yesText, noText) {
	promptShow(text, header);
	getElement('confirmForm').value = form_id;
	if (yesText) getElement('confirmYes').value = yesText;
	if (noText) getElement('confirmNo').value = noText;
	getElement('confirmYes').style.display = 'inline';
	getElement('confirmNo').style.display = 'inline';
	getElement('confirmNo').focus();
}
function confirmSubmit() {
	var form_id = getElement('confirmForm').value;
	if (getElement(form_id)) getElement(form_id).submit();
	else document.location.href = form_id;
	promptHide();
}

function alertation(page, text, header) {
	promptShow(text, header);
	getElement('alertPage').value = page;
	getElement('alertOk').style.display = 'inline';
	getElement('alertOk').focus();
}
function alertSubmit() {
	var page = getElement('alertPage').value;
	if (page)	document.location.href = page;
	else promptHide();
}

function promptShow(text, header) {
	getElement('promptText').innerHTML = text;
	getElement('promptHead').innerHTML = header;
	var viewSize = getViewSize();
	getElement('promptPrompt').style.top = (viewSize[1] / 7) + 'px';
	promptMove();
	getElement('promptDiv').style.display = 'block';
	getElement('promptPrompt').style.marginLeft = - getElement('promptPrompt').offsetWidth/2 + 'px';
	addListener('scroll', promptMove, window);
	addListener('keydown', promptKey, document);
}
function promptHide() {
	getElement('promptDiv').style.display = 'none';
	getElement('promptText').innerHTML = '';
	removeListener('scroll', promptMove, window);
	removeListener('keydown', promptKey, document);
}
function promptMove() {
	var pageScroll = getPageScroll();
	getElement('promptDiv').style.left = pageScroll[0] + 'px';
	getElement('promptDiv').style.top = pageScroll[1] + 'px';
}
function promptKey(e) {
	var kCode = window.event? window.event.keyCode : e.which;
	// Hide on escape
	if (kCode == 27) promptHide();
}

function imageShow(imgSrc) {
	getElement('imageDiv').style.display = 'block';
	var img = new ImageObj();
	img.loadImage(imgSrc);
	imageMove();
	addListener('scroll', imageMove, window);
	addListener('keydown', imageKey, document);
}
function imageHide() {
	getElement('imageDiv').style.display = 'none';
	var img = new ImageObj();
	img.loadImage('static_images/loading.gif');
	removeListener('scroll', imageMove, window);
	removeListener('keydown', imageKey, document);
}
function imageMove() {
	var pageScroll = getPageScroll();
	getElement('imageDiv').style.left = pageScroll[0] + 'px';
	getElement('imageDiv').style.top = pageScroll[1] + 'px';
}
function imageKey(e) {
	var kCode = window.event? window.event.keyCode : e.which;
	// Hide on escape
	if (kCode == 27) imageHide();
}

function ImageObj() {
	this.loadImage = loadImage;
}
function loadImage(imgSrc) {
	var self = this;
	this.newImg = new Image();
	this.newImg.onload = function() {
		setImage(self.newImg);
	}
	this.newImg.src = imgSrc;
}
function setImage(newImg) {
	var imgElem = getElement('imageImage');
	var imgSize = [newImg.width, newImg.height];
	var viewSize = getViewSize();
	var margin = 50;
	if (viewSize[0] - margin < imgSize[0]) {
		var ratio = (viewSize[0] - margin) / imgSize[0];
		imgSize[0] = viewSize[0] - margin;
		imgSize[1] = ratio * imgSize[1];
	}
	if (viewSize[1] - margin < imgSize[1]) {
		var ratio = (viewSize[1] - margin) / imgSize[1];
		imgSize[1] = viewSize[1] - margin;
		imgSize[0] = ratio * imgSize[0];
	}
	imgElem.src = newImg.src;
	imgElem.style.top = ((viewSize[1]-imgSize[1])/2) + 'px';
	imgElem.style.height = imgSize[1]+'px';
	imgElem.style.width = imgSize[0]+'px';
	imgElem.style.marginLeft = -(imgSize[0]/2)+'px';
}


//########################
//#### MENU functions ####
//########################

var activeMenu = readCookie('menu');
function toggleMenu(id) {
	if (id == null || !getElement('menu_'+id)) {
		activeMenu = null;
		return;
	}
	if (activeMenu != null) {
		menu = getElement('menu_'+activeMenu);
		submenu = getElement('submenu_'+activeMenu);
		menuImg = getElement('menuImg_'+activeMenu);
		menuImg.src = 'static_images/right.gif';
		with (menu.style) {
			background = '';
			border = '';
		}
		with (submenu.style) {
			display = 'none';
		}
	}
	activeMenu = id;
	createCookie('menu', id, 1);
	menu = getElement('menu_'+id);
	submenu = getElement('submenu_'+id);
	menuImg = getElement('menuImg_'+id);
	menuImg.src = 'static_images/down.gif';
	with (menu.style) {
		background = '#fff';
		borderTop = '1px dashed #000';
		borderLeft = '1px dashed #000';
		borderRight = '1px dashed #000';
		borderBottom = '1px solid #fff';
	}
	with (submenu.style) {
		display = 'inline';
	}
	if (submenu.innerHTML.toLowerCase().indexOf('a') == -1) {
		with (getElement('submenu_container').style) {
			border = '1px solid #fff';
			borderTop = '1px dashed #000';
		}
	}
	else {
		with (getElement('submenu_container').style) {
			border = '1px dashed #000';
		}
	}
}


//##########################
//#### SEARCH functions ####
//##########################

var selectedItem = null;
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };
function addQuery() {
	if (getElement('searchTerm').value == '') return;
	var val = getElement('searchQuery').value.trim() + ' ';
	val += getElement('searchAnd').value + ' ';
	if (getElement('searchFiled').value) val += getElement('searchFiled').value + ':';
	/*if (getElement('searchTerm').value.indexOf(' ') != -1) val += '"' + getElement('searchTerm').value.trim() + '"';
	else val += getElement('searchTerm').value.trim();*/
	val += getElement('searchTerm').value.trim();
	getElement('searchQuery').value = val.trim();
	hideFields();
	setTimeout("getElement('searchQuery').focus();", 500);
}
function showFileds() {
	var val = '';
	if (getElement('searchQuery').value) val = 'AND';
	getElement('searchAnd').options[0].value = val;
	getElement('searchAnd').options[0].text = val;
	
	toggleForm(getElement('searchForm'), true);
	getElement('fieldsTR1').style.display = '';
	getElement('fieldsTR2').style.display = '';
	getElement('fieldsLink').style.display = 'none';
	getElement('searchAnd').focus();
	toggleSearchHelp(false);
}
function hideFields() {
	getElement('fieldsTR1').style.display = 'none';
	getElement('fieldsTR2').style.display = 'none';
	getElement('fieldsForm').reset();
	getElement('fieldsLink').style.display = '';
	toggleForm(getElement('searchForm'), false);
	//toggleSearchHelp(true);
}
function toggleForm(oForm, bDisabled) {
	for (var i=0; i<oForm.elements.length; i++) oForm.elements[i].disabled = bDisabled;
}
function toggleSearchHelp(show) {
	if (getElement('searchHelp')) getElement('searchHelp').style.display = (show)? '' : 'none';
}

function loadTerms(oEvent, sField, sTerm, processFunc) {
	switch (oEvent.keyCode) {
		case 13:	//enter
		case 9:		//tab
		case 27:	//esc
		case 40:	//down arrow
		case 38:	//up arrow
			return;
	}
	connection = new AjaxConnection('search_terms.php?field='+sField+'&term='+sTerm);
	connection.ajaxConnect(processFunc, 'searchTerms');
}
function processTerms(content, target) {
	getElement(target).innerHTML = content;
	showTerms();
}
function navigateTerms(oEvent) {
	switch (oEvent.keyCode) {
		case 13:	//enter
		case 9:		//tab
			if (selectedItem) termSelect(selectedItem);
		return;
		case 40:	//down arrow
			if (!selectedItem) {
				selectedItem = getElement('searchTerms').getElementsByTagName('DIV')[0];
				termOver(selectedItem);
			}
			else {
				var item = selectedItem;
				while (item.nextSibling && (item.nextSibling.tagName != 'DIV')) item = item.nextSibling;
				if (item.nextSibling) {
					termOver(item.nextSibling);
				}
			}
		return;
		case 38:	//up arrow
			if (selectedItem) {
				var item = selectedItem;
				while (item.previousSibling && (item.previousSibling.tagName != 'DIV')) item = item.previousSibling;
				if (item.previousSibling) {
					termOver(item.previousSibling);
				}
			}
		return;
		case 27:	//esc
			hideTerms();
		return;
	}
}
function showTerms() {
	selectedItem = null;
	if (getElement('searchTerms').innerHTML) getElement('searchTerms').style.display = '';
}
function hideTerms() {
	getElement('searchTerms').style.display = 'none';
}

function termOver(oItem) {
	oItem.className = 'comboHover';
	if (selectedItem && selectedItem != oItem) termOut(selectedItem);
	selectedItem = oItem;
}
function termOut(oItem) {
	oItem.className = 'combo';
	selectedItem = null;
}
function termClick(oItem) {
	termSelect(oItem);
	hideTerms(oItem.parentNode.id);
}
function termSelect(oItem) {
	getElement('searchTerm').value = oItem.innerHTML;
}


//############################
//#### CHILDREN functions ####
//############################

function initFeatures() {
	var tables = document.getElementsByTagName('table');
	for (var i=0; i<tables.length; i++) {
		if (tables[i].className.indexOf('input_table') != -1) toggleAllChildren(tables[i]);
	}
}

function toggleChildren(parentEl) {
	var table = parentEl;
	while (table = table.parentNode) {
		if (table.tagName.toLowerCase() == 'table') break;
	}
	toggleAllChildren(table);
}
// Toggle the entire input table
function toggleAllChildren(table) {
	var children = table.getElementsByTagName('tr');
	for (var i=0; i<children.length; i++) {
		// Only consider the feature table rows having the parent attribute set
		if (!children[i].attributes || !children[i].attributes['parent'] || !children[i].attributes['parent'].nodeValue) continue;
		var childParents = children[i].attributes['parent'].nodeValue.split(',');
		var display = false;
		for (var j=0; j<childParents.length; j++) {
			var parentID = childParents[j].split('|')[0];
			var parentValue = childParents[j].split('|')[1];
			var parent = getInput(parentID);
			if (!parent.disabled && inArray(parentValue, getInputValue(parent))) display = true;
		}
		toggleInput(children[i], display);
	}
	paintRows(table);
}
// Get one input / text /select element from the tr-block
function getInput(trID) {
	var trEl = getElement(trID);
	var inputs = trEl.getElementsByTagName('input');
	if (inputs.length >= 1) return inputs[inputs.length - 1];
	var selects = trEl.getElementsByTagName('select');
	if (selects.length >= 1) return selects[selects.length - 1];
	var texts = trEl.getElementsByTagName('textarea');
	if (texts.length >= 1) return texts[texts.length - 1];
}
// Get an array with the values of the input fields within the tr-block
function getInputValue(elem) {
	var inputValue = new Array();
	if (elem.type == 'radio' || elem.type == 'checkbox') {
		var inputs = document.getElementsByName(elem.name);
		for (var k=0; k<inputs.length; k++) {
			if (inputs[k].checked) inputValue.push(inputs[k].value);
		}
	}
	else inputValue.push(elem.value);
	return inputValue;
}
// Turn on or off all inputs and textareas under the specified parent
function toggleInput(parentND, display) {
	parentND.style.display = (display)? '' : 'none';
	var inputs = parentND.getElementsByTagName('input');
	for (var i=0; i<inputs.length; i++) inputs[i].disabled = !display;
	var selects = parentND.getElementsByTagName('select');
	for (var i=0; i<selects.length; i++) selects[i].disabled = !display;
	var texts = parentND.getElementsByTagName('textarea');
	for (var i=0; i<texts.length; i++) texts[i].disabled = !display;
}

// Paint the rows in the table with alternating colors
function paintRows(table) {
	if (table.className.indexOf('feature_') == -1) return;
	// Find all table rows in the table
	var trs = table.getElementsByTagName('tr');
	var j = 0;
	for (var i=0; i<trs.length; i++) {
		// Only consider the shown table rows
		if (trs[i].style.display == '') {
			var odd = (j++ % 2 == 0)? ' odd' : '';
			trs[i].className = 'feature' + odd;
		}
	}
}


//########################
//#### AJAX functions ####
//########################

function AjaxConnection(url) {
	this.ajaxConnect = ajaxConnect;
	this.uri = url;
}
function ajaxConnect(returnFunc, target) {
	this.x = ajaxInitObject();
	this.x.open("GET", this.uri,true);
	var self = this;
	this.x.onreadystatechange = function() {
		if (self.x.readyState != 4) return;
		if (self.x.status == 200) {
			if (!returnFunc) returnFunc = 'ajaxCallBack';
			if (target) eval(returnFunc+"(self.x.responseText, '"+target+"')");
			else eval(returnFunc+"(self.x.responseText)");
		}
		delete self.x;
	}
	this.x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	this.x.send('');
}
function ajaxInitObject() {
	if (typeof XMLHttpRequest != 'undefined') return new XMLHttpRequest();
	else if (window.ActiveXObject) {
		var avers = ["Microsoft.XmlHttp", "MSXML2.XmlHttp", "MSXML2.XmlHttp.3.0",  "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.5.0"];
		for (var i = avers.length -1; i >= 0; i--) {
			try {
				httpObj = new ActiveXObject(avers[i]);
				return httpObj;
			}
			catch(e) {}
		}
	}
	throw new Error('XMLHttp (AJAX) not supported');
}
function ajaxCallBack(content, target) {
	getElement(target).innerHTML = content;
}


//##################################
//#### GENERAL / HELP functions ####
//##################################

function getPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function getPageScroll() {
	var xScroll = 0;
	var yScroll = 0;
	if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
	}
	else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) {
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
	}
	else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
	}
	arrayPageScroll = new Array(xScroll, yScroll);
	return arrayPageScroll;
}

function getViewSize() {
	var windowWidth, windowHeight;
	if (self.innerHeight) {
			/*if (document.documentElement.clientWidth) {
					windowWidth = document.documentElement.clientWidth;
			} else {
			}*/
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight) {
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
	}
	else if (document.body) {
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
	}
	return [windowWidth, windowHeight];
}

function getPageSize() {
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY) {
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	}
	else if (document.body.scrollHeight > document.body.offsetHeight) {
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	}
	else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	var viewSize = getViewSize();
	if (yScroll < viewSize[1]) {
		pageHeight = viewSize[1];
	}
	else {
		pageHeight = yScroll;
	}
	if (xScroll > viewSize[0]) {
		pageWidth = xScroll;
	}
	else {
		pageWidth = viewSize[0];
	}
	arrayPageSize = new Array(pageWidth, pageHeight, viewSize[0], viewSize[1]);
	return arrayPageSize;
}

function createCookie(name, value, create) {
	if (create) {
		var date = new Date();
		date.setTime(date.getTime()*100); //dont expire
		var expires = "; expires=" + date.toGMTString();
	}
	else {
		var expires = "";
	}
	document.cookie = name + "=" + value + expires + ";";
}

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);
}

function addListener(evt, func, node) {
	if (!node) node = document;
	if (node.addEventListener) {
		node.addEventListener(evt, func, true);
	}
	else {
		node.attachEvent("on"+evt, func);
	}
}
function removeListener(evt, func, node) {
	if (!node) node = document;
	if (node.removeEventListener) {
    node.removeEventListener(evt, func, true);
  }
	else {
    node.detachEvent("on"+evt, func);
  }
}

function getElement(psID) {
	if (document.getElementById) {
		return document.getElementById(psID);
	}
	else {
		return document.all[psID];
	}
}

function inArray(needle, haystack) {
	for (var i in haystack) {
		if (needle == haystack[i]) return true;
	}
	return false;
}