
// A global variabl that can be used when testing client browser for IE
var isIE = ((navigator.userAgent.toLowerCase().indexOf("msie") != -1) && (navigator.userAgent.toLowerCase().indexOf("opera") == -1));

//******************************************** Zoom Viewer section (Begin) ******************************************************
var zoomViewerLoaded;
		
//This is to be used whenever a zoom viewer window is required
function openZoomViewer(id, name, serialNo, windowParams, numTries) {
	if(!numTries) {
		numTries = 0;
		zoomViewerLoaded = false;
   		if (!windowParams)
   			windowParams = "toolbar=no,menubar=no,directories=no,resizable=yes,scrollbars=yes";
		if (windowParams.indexOf('width') < 0) {
			var width = 1150;
			if(isIE) {
				width = 1174;
			}
			windowParams += ', width=' + width;
		}
		if (windowParams.indexOf('height') < 0){
			windowParams += ', height=' + 835;
		}
		if(windowParams.indexOf('top') < 0) {
			windowParams += ', top=' + 50;
		}
		
		if(windowParams.indexOf('left') < 0) {
			windowParams += ', left=' + 50;
		}
				
	}
	
	var url = 'zoom_viewer.html?id=' + id + '&serialNo=' + serialNo;
	zoomViewerWindow = window.open(url, name, windowParams);
	if (!isIE) //This is a fix only for IE - when page fails to load it retry to load the page again for up to 5 times
		return;
				
	zoomViewerId = id;						//this for the following setTimeout to pass the parameter to the function
	zoomViewerName = name;					//this for the following setTimeout 
	zoomViewerSerialNo = serialNo;			//this for the following setTimeout
   	zoomViewerWindowParams = windowParams;  //this for the following setTimeout 
   	zoomViewerNumTries = numTries;			//this for the following setTimeout
	setTimeout('reloadZoomViewerIfNotLoaded();', 250);
}	
				
function reloadZoomViewerIfNotLoaded() {
	if(zoomViewerLoaded || zoomViewerNumTries>5) {
		return;
	}	
	openZoomViewer(zoomViewerId, zoomViewerName, zoomViewerSerialNo, zoomViewerWindowParams, zoomViewerNumTries+1);
}	

function setZoomViewerLoaded() { // This is called by zoom_viewer onload funtion
	zoomViewerLoaded = true;
}
//******************************************** Zoom Viewer section (End) ********************************************************
  
//******************************************** Login Panel section (Begin) ********************************************************
// This is to prevent Autocomplete displayes login info. autocomplete attribute can be set to 'off' for forms 
// but this is not stanmdard an hence not available in JSF form. This way it is gonna work for any browser that support javascript
function resetLoginForm() {   
	getById('loginForm:userName').value=''; 
	getById('loginForm:password').value='';; 
	getById('loginForm').style.visibility = 'visible';
	getById('loginForm:userName').focus();
}

function findTableSubViewId(doc) {
	var forms = doc.forms;
	for (var i=0; i<forms.length; i++) {
		var formId = forms[i].id;
		if (formId.indexOf('browseTableForm') >=0 ) 
			return formId.substring(0, formId.indexOf(':'));
	}
	return "";
}

//** This section is only for lgoin in a frame implementation
function onLoginClicked() {
	var loginPanel = getById('loginPanel');
	if ( loginPanel.style.visibility == 'visible' )
		loginPanel.style.visibility = 'hidden';
	else 
		loginPanel.style.visibility = 'visible';
}
    
function hideLoginPanel(parent) {
	if (parent)
		parent.document.getElementById('loginPanel').style.visibility = 'hidden';
	else
		getById('loginPanel').style.visibility = 'hidden';
}

function adjustLoginPanelPosition() {
	var displayLoginPanel = getById('headersubview:loginLinkForm:displayLoginPanel').value;
	var loginPanel = getById('loginPanel');
	if (displayLoginPanel == 'false') 
		loginPanel.style.visibility = 'hidden';
	else		
		loginPanel.style.visibility = 'visible';
		
	var loginLink = getById('headersubview:loginLinkForm:loginLink');
	if (loginLink) {
		var pos = findPos(loginLink);
		loginPanel.style.left = pos[0] - 270;  //align left
		loginPanel.style.top = pos[1] + loginLink.offsetHeight;
	}
}

function loginFrameOnload() {
	var loginPanel = parent.document.getElementById('loginPanel');
	
	var loginOperation = getById('loginOperation').value;
	if (loginOperation=='cancelled') {
		loginPanel.style.visibility = 'hidden';
		getById('loginPanelConnectorForm:refreshLoginPanelLink').onclick();
		return;
	}
	
	var userLoggedIn = getById('loginPanelConnectorForm:userLoggedIn').value;
	if (userLoggedIn == 'true' && loginPanel.style.visibility == 'visible') {
		loginPanel.style.visibility = 'hidden';
		var tableReloadActionLink = parent.document.getElementById(findTableSubViewId(parent.document) + ':browseTableForm:reloadActionLink');
		if (tableReloadActionLink == null)  // Check to see if there is a table in the page (current mechanisim only able to keep status of the first table if there are multiple tables in the same page)
			parent.location.href = parent.location.href; //Reload the page 
		else 
			tableReloadActionLink.onclick();
	}
}

function logoutClicked() {
	var tableSubViewId = findTableSubViewId(document);
	if (tableSubViewId != "")	//this is only useful if after logout staying in the same page
		getById(tableSubViewId + ':browseTableForm:logoutLink').onclick();
	else
		getById('headersubview:loginLinkForm:logoutLink').onclick();
		
	return false;
}
//** end of - This section is only for lgoin in a frame implementation

//******************************************** Login Panel section (End) ********************************************************


//*********************************************** Database Homepage (Begin) *****************************************************
function processEnterKey(event) {
	if( !event ) 
	    if( window.event ) {
	      //Internet Explorer
	      event = window.event;
	    } else {
	      //total failure, we have no way of referencing the event
	      return;
	    }
	if (event.keyCode == 13  || event.which == 13 || event.charCode == 13) {
	    //DOM || NS 4 compatible || also NS 6+, Mozilla 0.9+
		if (searchLinkId!=null) {
			var searchLink = getById(document.forms['mainForm'].id+":"+searchLinkId);
			searchLinkId=null;
			searchLink.onclick();
		}
	}
}		
   
function showGeneOptionsPanels(e) {
	var top = findPos(getById(document.forms[2].id+":optionlink"))[1];
	var left = findPos(getById(document.forms[2].id+":optionlink"))[0];
	var geneOptionsPanel = getById(document.forms['mainForm'].id+":genePanel");
	geneOptionsPanel.style.top = top+20;
	geneOptionsPanel.style.left = left;
	geneOptionsPanel.style.visibility = 'visible';
	top = findPos(geneOptionsPanel)[1];
	left = findPos(geneOptionsPanel)[0];
	
	var genesUploadPanel = getById(document.forms['uploadForm'].id+":uploadPanel");
	genesUploadPanel.style.top = top+110;
	genesUploadPanel.style.left = left;
	genesUploadPanel.style.visibility = 'visible';
}

function hideGeneOptionsPanels(e) {
	getById(document.forms['mainForm'].id+":genePanel").style.visibility = 'hidden';
	getById(document.forms['uploadForm'].id+":uploadPanel").style.visibility = 'hidden';
}

function showGeneFunctionOptionsPanel(e) {
	var top = findPos(getById(document.forms[2].id+":fnOptionlink"))[1];
	var left = findPos(getById(document.forms[2].id+":fnOptionlink"))[0];
	var geneFnOptionsPanel = getById(document.forms['mainForm'].id+":genePanel");
	geneFnOptionsPanel.style.top = top+20;
	geneFnOptionsPanel.style.left = left;
	geneFnOptionsPanel.style.visibility = 'visible';
	top = findPos(geneFnOptionsPanel)[1];
	left = findPos(geneFnOptionsPanel)[0];
}
//************************************************ Database Homepage (End) ******************************************************

//************************************* Access table selections from external form (Begin) **************************************
function getSelectionsFromTable(viewId) {
	var form = getById(viewId + ':browseTableForm');
	var selectionsNum = 0;
	var selections = "";
	for (var i=0; i<form.elements.length; i++) 
		if (form.elements[i].type=='checkbox' && form.elements[i].name.indexOf('genericTable')>-1)
			if(form.elements[i].checked) {
				selections += '1';
				selectionsNum++;
			} else 
				selections += '0';
	return [selections, selectionsNum];
}

function processSelectionsForAction(e, subviewId) {
	var selections = getSelectionsFromTable(subviewId);
	var tableViewName = getById(subviewId + ':browseTableForm')['tableViewName'].value;
	var formId = getFormId(e);
	appendHiddenInput(document.forms[formId], 'selectionsString', selections[0]);
	appendHiddenInput(document.forms[formId], 'tableViewName', tableViewName);
	if (selections[1]==0) {
//		alert('No item is selected!');
		return false;
	}
	return true;
}

function processSelectionsForLink(e, subviewId) {
	if (subviewId==null)
		subviewId = getViewId(e);
	var selections = getSelectionsFromTable(subviewId);
	if (selections[1]==0) {
		alert("Please make a selection from the list of entries");
		return false;
	}
	var tableViewName = getById(subviewId + ':browseTableForm')['tableViewName'].value;
	var evnt = e;
	if (!evnt)
		evnt = window.event;
	var node;
	if (evnt.target)
		node = evnt.target;
	else if (evnt.srcElement)
		node = evnt.srcElement;
	node.href = removeRequestParams(node.href, ['selectionsString', 'tableViewName']);
	if(node.href.indexOf('?')<0)
		node.href += '?';
	else 
		node.href += '&';
	
	node.href += 'selectionsString=' + selections[0] + '&tableViewName=' + tableViewName;
	return true;
}	

function removeRequestParams(url, params) { //used locally 
	var paramsIndex = url.indexOf('?');
	if (paramsIndex<0) 
		return;
	var allParams = url.substr(paramsIndex+1).split('&');
	var newParams = '';
	for (var i=0; i<allParams.length; i++) {
		var remove = false;
		for(var j=0; j<params.length; j++)
			if (allParams[i].indexOf(params[j]+'=') == 0) {
				remove = true; 
				break;
			}			
		if (!remove)
			newParams += ((i>0)?'&':'') + allParams[i];
	}
	return url.substring(0, paramsIndex+1) + newParams;
}

function passTableViewName(e, subviewId) {
	var tableViewName = getById(subviewId + ':browseTableForm')['tableViewName'].value;
	var formId = getFormId(e);
	appendHiddenInput(document.forms[formId], 'tableViewName', tableViewName);
}

//************************************** Access table selections from external form (End) ***************************************


//***************************************************** Misselaneous **********************************************************
function getPageURI() {
	return document.URL.substr(document.URL.indexOf('/pages/')+7);
}

function clickLink (id) {
	var link = getById(id);
	if (document.createEvent) {
		var evObj = document.createEvent('MouseEvents');
		evObj.initEvent('click', true, false);
		link.dispatchEvent(evObj);
	}
	else 
		if (document.createEventObject) 
			link.click();
//			link.fireEvent('onclick');	//Despite the spec this is not yet implemented even in IE7!!
}

function getById(id){
	var x=null;
	if (document.getElementById) {
		x = document.getElementById(id);	
	}
	else if (document.all) {
		x = document.all[id];
	}
	else if (document.layers)	{
		x = document.layers[id];
	}
	return x;
}
		
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

// Clears JSF hidden variables associated with actionMethos. It is called to fix problem with ajax4jsf when browser back button is pressed
function clearActionMethodsHistory() {
	for (var i=0; i<document.forms.length; i++) {
		var formElements = document.forms[i].elements;
		for (var j=0; j<formElements.length; j++) {
			if (formElements[j].type == 'hidden' && formElements[j].name.indexOf(':_idcl')>=0) 
				formElements[j].value='';
		}	
	}
}

function appendHiddenInput(form, id, value) {
	var input = getByIdInForm(form, id);
	if (!input) {
		input = document.createElement('input');
		if (input) {
			input.type = 'hidden';
			input.id = id;
			input.name = id;
			input.value = value;
			form.appendChild(input);
		}
	}
	else 
		input.value = value;
		
	return input;
}

function getByIdInForm(form, id) {
	for (var i=0; i<form.elements.length; i++) 
		if (form.elements[i].id==id)
			return form.elements[i];
	return null;
}

// this is to enable all items before submitting a form to make sure that input values are submitted in the request
function enableInputComponents(form) {	
	for (var i=0; i<form.elements.length; i++) 
		if (form.elements[i].disabled == true)
			form.elements[i].disabled = false;
}
