var compBaseStatArray = new Array(
   "No adjustment",
   "Composition-based statistics",
   "Conditional compositional score matrix adjustment",
   "Universal compositional score matrix adjustment");


function UpdateCompositonBasedStat(matr) {
    compMenu = $("compbasedstat").options;
    compMenu.length = compBaseStatArray.length;
    for(i=0; i < compBaseStatArray.length; i++) {
        compMenu[i].text = compBaseStatArray[i];
	  compMenu[i].value = i;
        if (i==1 && matr[matr.selectedIndex].text != "BLOSUM62") {
            compMenu.length = i + 1; 
            break;	
        }      
    }     
}

function UpdateLowComlexityFilter()
{
    if($("program").value == "blastp") {
        var lowCompFilter = false;
        if(this.selectedIndex == 0) {
            lowCompFilter = true;
        }
        SetFilterDefaults("L",lowCompFilter);	
    }
}

//**********SetProgTypeDefaults() and Co*******************************************************

function SetFilterDefaults(filterVal,checkFilter)
{
	filters = document.searchForm.FILTER;
	for(i=0; i < filters.length; i++) {
		if(filters[i].value == filterVal) {
			filters[i].checked = checkFilter;				
			diffFromDefault($(filters[i].id));
		}
	}
}

function SetProteinSuiteDefaults(runPsiBlast,numSeqOption, compbasedOption,psiThreshHold,lowCompFilter)
{
	$("runPSI").value = runPsiBlast;		
	
	$("NUM_SEQ").options[numSeqOption].selected = true;	    
    $("NUM_SEQ").setAttribute("defVal",$("NUM_SEQ").options[numSeqOption].value);    
    diffFromDefault($("NUM_SEQ"));
    
	$("compbasedstat").options[compbasedOption].selected=true;
	diffFromDefault($("compbasedstat"));	
	$("I_THRESH").value = psiThreshHold;	
	//Check Low complexity Regions
	SetFilterDefaults("L",lowCompFilter);	
	if($("selectedProg").value != "phiBlast") $("PHI_PATTERN").value="";
	 clearPSSM();
}

function SetNucSuiteDefaults(program,setMegablast,page,defaultMatchScoresOption,filter,twoHits)
{
	
	$("runMegablast").value = setMegablast;		
	$("page").value = page;
					
	var setDefaults = true;
	var matchScoresIndex = 0;
	//Uncomment this block if want to show user's stcikcing options defaults when change the program
	/*if($("userDefaultprog").value != "" && $("userDefaultprog").value == program) {
	    setDefaults = false;
	    matchScoresOption = $("userDefaultMatchScores").value;
    }
    else {	        
        matchScoresOption = defaultMatchScoresOption;	
    }*/
    matchScoresOption = defaultMatchScoresOption;	
	
	changeOptionList($("wordsize"),program,setDefaults);	
	diffFromDefault($("wordsize"));
	//TO DO: Update that only if  megablast was selected before	
	$("matchscores").options[matchScoresOption].selected = true;
	//$("matchscores").defVal = $("matchscores").options[matchScoresOption].value;	
	$("matchscores").setAttribute("defVal",$("matchscores").options[defaultMatchScoresOption].value);		
	diffFromDefault($("matchscores"));
		
	updateGapcostNuc();					
	//Uncheck Mask for lookup tables
	//SetFilterDefaults("m",filter);
	
	//Set TWO_HITS for discoMegablast	
	$("twoHits").value = twoHits;
	$("templlength").setAttribute("defVal","18");	
	$("templlength").options[2].selected = true;	
	diffFromDefault($("templlength"));			
	diffFromDefault($("templtype"));		
	//Select 1,-2 for megablast
	initFiltersDefaults(true);	
}	

function DisplayCurrProgram(program)
{
	var selectedProg = $(program + "Prog");		
	var selectedDescr = $(program + "Descr");			
	var progInfo = cssQuery("[class='progInfo']");
    for (var i = 0; i < progInfo.length; i++) {
	    progInfo[i].innerHTML = selectedProg.value;
	}
	var progDescr = cssQuery("[class='progDescr']");
    for (var i = 0; i < progDescr.length; i++) {
	    progDescr[i].innerHTML = selectedDescr.value;
	}
}


		
function SetPageDefaultParams(program) 
{
	
	//Set hidden field	
	$("selectedProg").value = program;	
	$("optSection").className =  program;		
	if(program == "blastp") {							
		//Set Max target SEQ=100,Comp based statistics,no PSI, check Low complexity Regions	
		SetProteinSuiteDefaults("",2,2,"",false);
	}	
	if(program == "psiBlast") {	
		//Set Max target SEQ=500,Comp based statistics,PSI balst = on, uncheck Low complexity Regions	
		SetProteinSuiteDefaults("on",4,2,"0.005",false);
	}
	
	else if(program == "phiBlast") {	
		//Set Max target SEQ=500,Comp based statistics,PSI balst = on, uncheck Low complexity Regions	
		SetProteinSuiteDefaults("on",4,2,"0.005",false);		
	}		
	else if(program == "blastn") {
		//Set MEGABLAST.value = on,PAGE.value = "MegaBlast",Check Mask for lookup tables 
	    //Set WORD_SIZE list 7-15 sel= 11 GAPCOSTS 4,4-2,2 sel= 5,2,Match_scores 1,-2 - 1,-1 sel 2,-3,	    
		SetNucSuiteDefaults(program,"","Nucleotides",3,false,"");
	}
	else if(program == "megaBlast") {		
	    //Set MEGABLAST.value = "",PAGE.value = "Nucleotides",Uncheck Mask for lookup tables 
	    //Set WORD_SIZE list 16..64 sel = 28 GAPCOSTS = Linear - 1,1 sel=Linear,Match_scores 1,-2 - 1,-1 sel 1,-2,	    
		SetNucSuiteDefaults(program,"on","MegaBlast",0,false,"");
	}
	else if(program == "discoMegablast") {
		//Set MEGABLAST.value = on,PAGE.value = "MegaBlast",Check Mask for lookup tables 
	    //Set WORD_SIZE list 11,12 sel = 11 GAPCOSTS 4,4-2,2 sel = 5,2,Match_scores 1,-2 - 1,-1 sel=2,-3,	    
	    //Set TWO_HITS for discoMegablast
		SetNucSuiteDefaults(program,"on","MegaBlast",3,true,"on");			
	}
	else {	
		$("runPSI").value = "";
		$("runMegablast").value = "";
	}	
	DisplayCurrProgram(program);
}

function SetProgTypeDefaults1() 
{
    var program = this.value;
	SetPageDefaultParams(program);	
}

function SetProgTypeDefaults()
{
    var blastProgram = this.value;                
    SetPageDefaultParams(blastProgram);    
}


function addOption(control,value,text)
{		
		//var anOption = document.createElement("OPTION") ;
		var anOption = new Option(value);
		
		if(text == "") {
			text = value;
		}
		anOption.text = text;
		anOption.value = value;
        if(navigator.userAgent.match(/safari/i)) {		
		    control.add(anOption);
		}
		else {
		    control.options.add(anOption);
		}
		//anOption.selected = true;
		return anOption;
}

function createOptionList(optionListName, arrayofOptions)
{
	optionListName.options.length = 0;
	for(i=0; i < arrayofOptions.length; i++) {
		anOption = addOption(optionListName,arrayofOptions[i++],"");		
		if(arrayofOptions[i] == "selected") {
			anOption.selected = true;
		}		
	}	
}


//hiddenField.value = optionListName.innerHTML; <option>djdjfskd</option><option>
//Save original option list data in div with id="savedLists"
//Saved option list id= optionList.name + "_ID
function saveOriginalOptionList(optionList) 
{
	div = $("savedLists");
	div.innerHTML = div.innerHTML + "<select id='" + optionList.name + "_ID'>" + optionList.innerHTML + 		
					"</select>"
}

//This function finds <select> list with id = optionList.id + matchName on the page 
//which is hidden inside div with id =savedLists. This list contains all original <select> WORDSIZE, GAPCOST, etc lists
//optionList is substituted by the new list 
//If item has class="Deflt" this item will be selected if setDefaults)=true
//If item has class only_progname - it wil be added in the new list only for this progname
function changeOptionList(optionList,matchName,setDefaults)
{
    //For gapcosts (example 1,-4) remove comma since it is not permitted in ID     
    matchName  = matchName.replace(/,/g,"");    
	savedListID = optionList.id + "_" + matchName;
	var savedList = $(savedListID);
	var defValue = ""; var j = 0;
	optionList.options.length = 0;
	var indexSelected = -1;
	var indexDefault = -1;;
	
	for(i=0; i < savedList.options.length; i++) {
	    //if there is only megaBlast in class name - add this option only for megablast    
	    if(utils.hasClass(savedList.options[i],"only")) {
            //utils.hasClass(savedList.options[i],"only_megaBlast")
	        if(utils.hasClass(savedList.options[i],$("selectedProg").value)) {
	            optionList.setAttribute("defVal","");
	            indexDefault = 0;	        
	        }
	        else continue;                        	    
	    }
	    
		var currOpt = addOption(optionList,savedList.options[i].value,savedList.options[i].text);
		if(optionList.multiple == true)  currOpt.selected = savedList.options[i].selected;
		       
        if(!setDefaults) {
            if(savedList.options[i].selected) indexSelected = j;  
		}		
		else {
		    if(utils.hasClass(savedList.options[i],"Deflt")  && indexDefault == -1) indexSelected = j;
        }		    
        
		if(utils.hasClass(savedList.options[i],"Deflt") && indexDefault == -1) {		
		    optionList.setAttribute("defVal",savedList.options[i].value);
		    indexDefault = j;
		}		
		j++;		
	}
	if(indexDefault== -1) indexDefault = 0;
	if(indexSelected == -1) indexSelected = indexDefault;
	optionList.options[indexSelected].selected = true;	
}

function updateGapcostNuc()
{
    var setDefaults = true;
    //Uncomment this line if want to show user's stcikcing options defaults when change the program
	//if($("userDefaultprog").value == $("selectedProg").value ) setDefaults = false;
    updateGapcostNucDef(setDefaults);	
}

function updateGapcostProt()
{
    var setDefaults = true;
    //Uncomment this line if want to show user's stcikcing options defaults when change the program
	//if($("userDefaultMatrix").value ==  $("matrixName").selectedIndex) setDefaults = false;
    updateGapcostProtDef(setDefaults);	
}

function updateGapcostNucDef(setDefaults)
{
	list = $("matchscores");  
	if($("selectedProg").value == "megaBlast") {		
		//setDefaults = false;//will default to the first item in the list which is Linear
	}
	changeOptionList($("gapcosts"),
					 list[list.selectedIndex].value,					 
					 setDefaults);    
    diffFromDefault($("gapcosts"));					 
}

function updateGapcostProtDef(setDefaults)
{
	list = $("matrixName");  	
	changeOptionList($("gapcosts"),
					 list[list.selectedIndex].value,					 
					 setDefaults);	
    //Gapcosts will always show as non-default, if matrix is non-default					     
    //if(utils.hasClass($("matrixName_def"),"diff")) {
    /*if(utils.hasClass(utils.getParent($("matrixName")),"nondef")) {    
        $("gapcosts").defVal = "0";        
    }*/					 
    diffFromDefault($("gapcosts"));
    if($("selectedProg").value != "blastx" && $("selectedProg").value != "tblastx") {					 
	    //UpdateCompositonBasedStat(list);
	    diffFromDefault($("compbasedstat"));						 
	}
}


function setAllDefaultVals()
{
    var defValNodes = cssQuery(".reset");
	var count = 0;	
	for(i=0; i < defValNodes.length; i++) {	  
	  var par = utils.getParent(defValNodes[i]);	  	  
	  //alert(defValNodes[i].id + " " + par.className + " " + $("selectedProg").value);
	  if(utils.hasClass(par,"all") || utils.hasClass(par,$("selectedProg").value)) { 	    	  
	    setDefalValue(defValNodes[i]); 
	    //alert(defValNodes[i].id + " " + par.className + " " + $("selectedProg").value);	    
	  }
	}	
	if($("page").value == "Proteins" || $("page").value == "Translations") updateGapcostProt() 
	    else  updateGapcostNuc();	        
	$("diffMes").style.display = "none";
	$("NUM_DIFFS").value = 0; 
	$("NUM_OPTS_DIFFS").value = 0;
}	


function ResetGen()
{
    RadioGroup.groups["BLAST_PROGRAMS"].onreset();    
    //First reset current program defaults    
    if($("defaultProg") != null) {//This is set for blastn and blastp
        blastProgram = $("defaultProg").value;
    }
    else {       
        blastProgram = $("program").value;            
    }    
    if($(blastProgram)) {                
        $(blastProgram).checked = true;
        SetPageDefaultParams(blastProgram);        
    }
    //sendClick($(blastProgram)); - does not work    
    if($("DATABASE") && $("DATABASE").type == "select-one") {
        $("DATABASE")[0].selected = true;                    
    }
    if($("bl2seq")) {
        $("bl2seq").checked = false;
        utils.removeClass($("type-a"), "blast2seq");
        $("blastSpec").value = "";  
    }
    setupDBDisplayParams();    
    setAllDefaultVals();     
    document.searchForm.EQ_MENU.value = "";
    utils.replaceInHtml("",$("orgs"));    
    if($("numOrg")) $("numOrg").value = 1;
    //The next line does not work in Safari for some reason
    //$("qorganism").value = "";
    $("savedSearch").value == "false";
    $("userDefaultprog").value = "";
    if($("userDefaultMatrix")) $("userDefaultMatrix").value = "";    
    var msgNodes = cssQuery(".msg");
    for (var i = 0; i < msgNodes.length; i++) {      
        utils.removeClass(msgNodes[i],"error");
    }
    document.searchForm.action = "Blast.cgi";
    if($("subgroup")) {	    
	    ShowDbSubGroup(false);	    
	}	
	if($("exclSeqUncult")) $("exclSeqUncult").checked = false;
	if($("exclModels")) $("exclModels").checked = false;
}


function ResetForm()
{
    if($("blastSpec").value == "SRA") {
        ResetSpec();
    }
    else {
        ResetGen();
    }
}

function ResetSpec()
{
    var url = "Blast.cgi?PAGE=" + $("page").value + "&PROGRAM=" + $("program").value + "&BLAST_PROGRAMS=" + $("selectedProg").value + "&PAGE_TYPE=BlastSearch";    
    //TO DO: uncomment this when implement db_group
    //url     +="&BLAST_SPEC="  + $("blastSpec").value + "&DB_GROUP=Transcript";
    url     +="&BLAST_SPEC="  + $("blastSpec").value;
            
    location.href = url;    
}        


function linksInit() {
   var links = cssQuery("[class='resetlink']");
   for (var i = 0; i < links.length; i++) {
      var l = links[i];      
      utils.addEvent(l, "click",  ResetForm, false);              
   }
   links = cssQuery("[name='getURL']");
   for (var i = 0; i < links.length; i++) {      
      utils.addEvent(links[i], "click",  GetURL, false);              
   }
   clearQueryInit();
   
   var links = cssQuery("[class='progLinks']");
   for (var i = 0; i < links.length; i++) {      
      utils.addEvent(links[i], "click",  InitLogParams, false);              
   }
   
}


function clearQuery() {
    var f = this.getAttribute("fieldToClear");    
    f = f ? $(f) : null;
    if(f) f.value="";
}

function clearQueryInit() {
   var links = cssQuery("[class='clearlink']");
   for (var i = 0; i < links.length; i++) {
      var l = links[i];      
      utils.addEvent(l, "click", clearQuery, false);     
  }       
}



function clearPSSM()
{
    var pssmCtrl = $("promptPSSM");    
    utils.addClass(pssmCtrl, "hide");
    diffFromDefault($("savedPSSM"));
    
    pssmCtrl = $("uplPSSM");    
    if(utils.hasClass(pssmCtrl, "hide")) {
        utils.removeClass(pssmCtrl, "hide");
    }
    $("dpssm").value = "";                
}

function setupPssm()
{
   var idForPssm = $("dpssm"); //Hidden fiedl tha contains rid or Cubby ID for blastObj to get pssm
   if(idForPssm) {
      if(idForPssm.value == "") {
        utils.addClass($("promptPSSM"), "hide");        
      }
      else {
        utils.addClass($("uplPSSM"), "hide");
      }
   }    
   
   var clPssmm = $("cpssm");
   if (clPssmm) {
      utils.addEvent(clPssmm, "click", clearPSSM, false);
   }      
}

function setupDiffEvents()
{
    utils.addEvent($("DATABASE"), "change", function() { diffFromDefault($("DATABASE"));  }, false); 
    utils.addEvent($("NUM_SEQ"), "change", function() { diffFromDefault($("NUM_SEQ"));  }, false); 
    utils.addEvent($("expect"), "change", function() { diffFromDefault($("expect"));  }, false); 
    utils.addEvent($("wordsize"), "change", function() { diffFromDefault($("wordsize"));  }, false); 
    if($("matchscores")) {
        utils.addEvent($("matchscores"), "change", function() { diffFromDefault($("matchscores"));  }, false);
    }     
    utils.addEvent($("gapcosts"), "change", function() { diffFromDefault($("gapcosts"));  }, false);
    utils.addEvent($("matrixName"), "change", function() { diffFromDefault($("matrixName"));  }, false);    
    utils.addEvent($("compbasedstat"), "change", function() { diffFromDefault($("compbasedstat"));  }, false);        
    utils.addEvent($("fil_l"), "click", function() { diffFromDefault($("fil_l"));  }, false); 	
    utils.addEvent($("fil_m"), "click", function() { diffFromDefault($("fil_m"));  }, false); 	
    utils.addEvent($("fil_r"), "click", function() { diffFromDefault($("fil_r"));  }, false); 	
    utils.addEvent($("lcm"), "click", function() { diffFromDefault($("lcm"));  }, false); 	    
    utils.addEvent($("templlength"), "change", function() { diffFromDefault($("templlength"));  }, false);            
    utils.addEvent($("templtype"), "change", function() { diffFromDefault($("templtype"));  }, false);            
}

function checkAll(className,check)
{
    //var elements = cssQuery("[class='newwin']");  
    var elements = cssQuery("[class='" + className + "']");      
    for (var j = 0; j < elements.length; j++) {    
      elements[j].checked = check;      
    }
}

function initSubmit()
{
    var l = cssQuery("[name='NEWWIN']");
    for (var i = 0; i < l.length; i++) {
        if(l[i].checked) $("searchForm").target = "Blast_Results_for_" + Math.floor(Math.pow(10,10) *Math.random());
    }
    if(utils.hasClass($("searchForm").EQ_MENU,"orgHint"))  $("searchForm").EQ_MENU.value = "";                    
    if($("numOrg")) {        
        for(i=1; i < $("numOrg").value; i++) {              
            if( $("qorganism" + i) && utils.hasClass($("qorganism" + i),"orgHint")) {
                $("qorganism" + i).value="";                
            }
        } 		
    }
    if($("bl2seq") && !$("bl2seq").checked && $("subj")) $("subj").value = "";
}

function SetEvents()
{
   var radioButtons = cssQuery("[name='BLAST_PROGRAMS']");    
   for (var i = 0; i < radioButtons.length; i++) {
      var l = radioButtons[i];
      utils.addEvent(l, "click", SetProgTypeDefaults, false);          
   }

   var list = $("matrixName");
   if (list) {
      utils.addEvent(list, "change", updateGapcostProt, false);
   }
   list = $("matchscores");
   if (list) {
      utils.addEvent(list, "change", updateGapcostNuc, false);
   }
   /*list = $("DATABASE");
   if (list) {
      utils.addEvent(list, "change", DisplayCurrDatabase, false);
   }*/
   list = $("compbasedstat");
   if (list) {
      utils.addEvent(list, "change", UpdateLowComlexityFilter, false);
   }
   utils.addEvent($("searchForm"), "submit", initSubmit,false);
   var imgButtons = cssQuery("[class='blastbutton']");
   for (var i = 0; i < imgButtons.length; i++) {
      var l = imgButtons[i];            
        utils.addEvent(imgButtons[i], "click", function() {
                    initSubmit();                    
                    $("searchForm").submit();}, false);          
      utils.addEvent(imgButtons[i], "mouseover", function() {this.src = this.getAttribute("mouseovImg");}, false);
      utils.addEvent(imgButtons[i], "mouseout", function() {this.src = this.getAttribute("mouseoutImg");}, false);
      utils.addEvent(imgButtons[i], "mousedown", function() {l.src = this.getAttribute("mousedownImg");}, false);
      utils.addEvent(imgButtons[i], "mouseup", function() {l.src = this.getAttribute("mouseupImg");}, false);
   }  
   
   var newwins = cssQuery("[class='newwin']");  
   for (var i = 0; i < newwins.length; i++) {    
      utils.addEvent(newwins[i], "click", function() {checkAll("newwin",this.checked);}, false);
   }
   
   setupPssm();
   linksInit();   
   setupDiffEvents();
   new AccnLookup($('seq'), $('qtitle'), $('db'));   
   if($("bl2seq")) {
    utils.addEvent($("bl2seq"), "click", bl2SeqInit, false);
   }
   else if($("blastSpec").value == "blast2seq") {
   //remove this after adding bl2seq
        $("blastSpec").value = "";  
   }
   var dbGrouplinks = cssQuery("[class='dbgroup']");   
   for (var i = 0; i < dbGrouplinks.length; i++) {
        utils.addEvent(dbGrouplinks[i], "click", dbGroupInit, false);    
   }         
}

function checkFormDefaultDiff()
{
    var defValNodes = cssQuery(".checkDef");
	var count = 0;
	for(i=0; i < defValNodes.length; i++) {	  
	  var par = utils.getParent(defValNodes[i]);	  
	  //if(par.HasclassName.indexOf("all") != -1 || par.className.indexOf($("selectedProg").value) != -1) {	  	    
	  if(utils.hasClass(par,"all") || utils.hasClass(par,$("selectedProg").value)) { 	    
	    count += diffFromDefault(defValNodes[i]); 
	    //alert(defValNodes[i].id + " " + par.className + " " + $("selectedProg").value + "count=" + count);
	  }
	}
	if(count > 0) {
	    $("diffMes").style.display = "inline";
	    $("NUM_DIFFS").value = count; 
	}	
}	

//if($("program").value != "blastn" || $("blastSpec").value != ""){
function HasGenomeNucDatabases() 
{
    var ret = false;    
    if($("program").value == "blastn" && ($("blastSpec").value == "" || $("blastSpec").value == "blast2seq")){
        ret = true;
    }
    return ret;
}


function resetOrganism() 
{    
    if($("blastSpec").value == "") {
	resetOrganismSuggest($("searchForm").EQ_MENU);
    }
}    

        
        

utils.addEvent(window,"load", SetEvents,false);

function OnLoadHandler() {	
    // Set up database radios and dropdown to update each other
    setupDBDisplayParams();
    setupOrganismSuggest($("searchForm").EQ_MENU);		
    // Hook up radio buttons to select the appropriate thing        
    //if($("program").value == "blastn" && ($("blastSpec").value == "" || $("blastSpec").value == "blast2seq")){
    if(HasGenomeNucDatabases()) {
           utils.addEvent($('Rhc'), 'click', function() {
                            setDbDefaults($('Rhc'),true);       
            }, false);
        
            utils.addEvent($('Rmc'), 'click', function() {      
                            setDbDefaults($('Rmc'),true);      
            }, false);
        
            utils.addEvent($('Rgen'), 'click', function() {      
                            setDbDefaults($('Rgen'),true);       
            }, false);
        
            // Automatically check the appropriate radiobutton when datbase is seleceted
            // radio button is clicked.
            utils.addEvent($('DATABASE'), 'change', function() {
                autoCheck(this.selectedIndex);
            }, false);                      
    }
    utils.addEvent($("DATABASE"), "change", DisplayCurrDatabase, false);        

	
	if($("page").value == "Proteins" || $("page").value == "Translations") updateGapcostProtDef(false) 
	else  updateGapcostNucDef(false);	        
	
	if($("program").value == "blastn") $("userDefaultMatchScores").value = $("matchscores").selectedIndex;
	if($("program").value == "blastp") $("userDefaultMatrix").value = $("matrixName").selectedIndex;
	
	//initRepeatFilter(); //only for organism pages
	checkFormDefaultDiff();
	//alert($("NUM_DIFFS").value);	
	if($("NUM_OPTS_DIFFS").value != "0") {  
	    //alert("Change toggle options");
        utils.addClass($("toggleOptions"), "showing");
        utils.removeClass($("toggleOptions"), "hiding");
        utils.addClass($("moreopts"), "shown");
        utils.removeClass($("moreopts"), "hidden");
	}
	ValidateUserParams();
	if($("addOrg"))utils.addEvent($("addOrg"), "click", AddOrgField, false);
	if($("subgroup")) {
	    var isSubgroup = $("DATABASE")[$("DATABASE").selectedIndex].getAttribute("subgroup");    
	    if(isSubgroup) ShowDbSubGroup(false);	    
	    utils.addEvent($("DATABASE"), "change", function() {      
            ShowDbSubGroup(true);       
        }, false); 		    
	}
}
     

utils.addEvent(window, 'load', OnLoadHandler, false);

sendClick = function (elem) {
   if (document.createEvent) {
      var e = document.createEvent("MouseEvents");
      e.initEvent("click", true, false);
      elem.dispatchEvent(e);      
   } else if( document.createEventObject ) {
        //var evObj = document.createEventObject();        	    
        elem.fireEvent('onclick');                
   } else {      
      elem.click();
   }
}

signInMyNCBI = function() {
   for (var i = 0; i < document.links.length; i++) {
      var l = document.links[i];
      var h = l.getAttribute("href");
      var t;
      if (l.textContent) {
        t = l.textContent;
      } else {          
        t = l.innerText;
      }
      if (t) { t = t.toLowerCase(); }
//      var t = ((l.textContent>'') ? l.textContent : l.innerText).toLowerCase();
      // Find link to JS
      if (h && t == "[sign in]" && h.search('login') > 0) {
          if (document.createEvent) {
             var e = document.createEvent("MouseEvents");
             e.initEvent("click", true, false);
             l.dispatchEvent(e); 
          } else {
             l.click();
          }
      }
   }
   return false;
}

function getUrlCompForCheckedField(elem)
{
    var url = "";
	if(elem.checked) {		    
	    url = "&" + elem.name + "=" + elem.value;
	}
	return url;
	
}

function getUrlCompForRadioCheckboxField(elementArr)
{
    var url = "";
    for(i = 0; i < elementArr.length; i++) {	    
        url += getUrlCompForCheckedField(elementArr[i]);	    
	}
	return url;
	
}


function getUrlCompForEntryField(ID)
{
    var url = "";
    if($(ID).value != "") {
        url = "&" + $(ID).name + "=" + escape($(ID).value);
    }
    return url;
}

function getUrlCompForOptionsField(ID)
{
    var url = "&" + $(ID).name + "=" + $(ID)[$(ID).selectedIndex].value;    
    return url;
}		

function getUrlForFormattingOptions() {  
    var url = getUrlCompForEntryField("SHOW_OVERVIEW");
    url += getUrlCompForEntryField("SHOW_LINKOUT");
    url += getUrlCompForEntryField("ALIGNMENT_VIEW");
    url += getUrlCompForEntryField("MASK_CHAR");
    url += getUrlCompForEntryField("MASK_COLOR");    
    url += getUrlCompForEntryField("GET_SEQUENCE");        
    url += getUrlCompForEntryField("NEW_VIEW"); 
    url += getUrlCompForEntryField("NCBI_GI");
    url += getUrlCompForEntryField("FORMAT_ORGANISM"); 
    url += getUrlCompForEntryField("FORMAT_EQ_TEXT");     
    url += getUrlCompForEntryField("NUM_OVERVIEW"); 
    url += getUrlCompForEntryField("DESCRIPTIONS");
    url += getUrlCompForEntryField("ALIGNMENTS"); 
    url += getUrlCompForEntryField("FORMAT_OBJECT");
    url += getUrlCompForEntryField("FORMAT_TYPE");
    url += getUrlCompForEntryField("SHOW_CDS_FEATURE");    
    url += getUrlCompForEntryField("EXPECT_HIGH"); 
    url += getUrlCompForEntryField("EXPECT_LOW"); 
    url += getUrlCompForEntryField("OLD_BLAST");
    //QUERY_INDEX
    return url;    
}
    
function GetURL ()
{
    
    var getUrl = "Blast.cgi?PAGE_TYPE=BlastSearch&SET_SAVED_SEARCH=on&USER_FORMAT_DEFAULTS=on";                    
                    
    getUrl += getUrlCompForEntryField("page");//PAGE
    getUrl += getUrlCompForEntryField("program");//PROGRAM
    
    getUrl += getUrlCompForEntryField("seq");//QUERY
    getUrl += getUrlCompForEntryField("QUERY_TO");
    getUrl += getUrlCompForEntryField("QUERY_FROM");    
    getUrl += getUrlCompForEntryField("qorganism");//EQ_MENU
    getUrl += getUrlCompForEntryField("qquery");//EQ_TEXT
    if($("DATABASE").type == "select-one") {
        getUrl += getUrlCompForOptionsField("DATABASE");//DATABASE
    }
    else {
       getUrl += getUrlCompForEntryField("DATABASE");//DATABASE
    }
    getUrl += getUrlCompForEntryField("qtitle");//JOB_TITLE
    getUrl += getUrlCompForRadioCheckboxField( $("searchForm").BLAST_PROGRAMS);    
    getUrl += getUrlCompForCheckedField($("nw1"));//NEWWIN
    getUrl += getUrlCompForCheckedField($("nw2"));//NEWWIN
    getUrl += getUrlCompForOptionsField("NUM_SEQ");//MAX_NUM_SEQ
    getUrl += getUrlCompForCheckedField($("adjparam"));//SHORT_QUERY_ADJUST
    getUrl += getUrlCompForEntryField("expect");//EXPECT
    getUrl += getUrlCompForOptionsField("wordsize");//WORD_SIZE
    getUrl += getUrlCompForOptionsField("gapcosts");//GAPCOSTS
        
    if($("program").value == "blastn") {
        getUrl += getUrlCompForOptionsField("matchscores");//MATCH_SCORES 
        getUrl += getUrlCompForOptionsField("repeats");//REPEATS
        getUrl += getUrlCompForOptionsField("templtype");//TEMPLATE_TYPE
        getUrl += getUrlCompForOptionsField("templlength");//TEMPLATE_LENGTH
    }
    else if($("program").value != "blastn") {
        getUrl += getUrlCompForOptionsField("matrixName");//MATRIX_NAME   
        getUrl += getUrlCompForOptionsField("compbasedstat");//COMPOSITION_BASED_STATISTICS  
    }
    else if($("program").value == "tblastx" || $("program").value == "blastx") {
        getUrl += getUrlCompForOptionsField("GENETIC_CODE");//GENETIC_CODE
    }
    
    var blastProg = $("selectedProg").value;    
    if(blastProg == "phiBlast") {     
        getUrl += getUrlCompForEntryField("PHI_PATTERN");//PHI_PATTERN
    }
    if(blastProg == "phiBlast" || blastProg == "psiBlast") {             
        getUrl += getUrlCompForEntryField("I_THRESH");//I_THRESH
    }
    
    getUrl += getUrlCompForRadioCheckboxField($("searchForm").FILTER);
    getUrl += getUrlCompForCheckedField($("lcm"));//LCASE_MASK
    //PSSM??
    if($("program").value == "blastn" || blastProg == "discoMegablast" || blastProg == "megaBlast") {
        getUrl += getUrlCompForEntryField("blastType");//WWW_BLAST_TYPE
    }
    getUrl += getUrlCompForEntryField("blastSpec");//BLAST_SPEC
    
    
    if(blastProg == "tblastx" || blastProg == "tblastn" || blastProg == "blastx") {
        getUrl += "&BLAST_PROGRAMS=" + blastProg;
    }
    getUrl += getUrlForFormattingOptions();
    alert("Please bookmark the next page in your browser");
    location.href = getUrl;                       
                    
                    
}

  sendClick = function (elem) {
   if (document.createEvent) {
      var e = document.createEvent("MouseEvents");
      e.initEvent("click", true, false);
      elem.dispatchEvent(e); 
   } else {
      elem.click();
   }
}
    
function hideOrganisms(hide)
{
        
    if(hide) {
	    utils.addClass($('orgInfo'), "hidden");	    
	    //cssQuery("[name='EQ_MENU.']").value = "";
	    document.searchForm.EQ_MENU.value = "";	    
	    //The next line does not work in Safari for some reason	    
	    //$('qorganism').value = "";
	}
	else {
	    utils.removeClass($('orgInfo'), "hidden");
	    resetOrganism(); 
	}	
}	

function setDbDefaults(cRadio,setFilters) 
{
    cRadio.checked = true;        
    if(cRadio == $('Rhc') ) {
        if(!$('Ohc').selected) $('Ohc').selected = 'true';         
        //$('fil_l').setAttribute('defVal','unchecked');
        $('blastType').value = 'mapview';
        $('dbAbbr').value = $('OhcAbbr').value;
        hideOrganisms(true);        
    }
    else if(cRadio == $('Rmc') ) {
        if(!$('Omc').selected) $('Omc').selected = 'true';                
        //$('fil_l').setAttribute('defVal','unchecked');       
        $('blastType').value = 'mapview';
        $('dbAbbr').value = $('OmcAbbr').value;
        hideOrganisms(true);
    }
    else {
        if($('Ohc').selected || $('Omc').selected) $('Ogen').selected = 'true';        
        //$('fil_l').setAttribute('defVal','checked');       
        $('blastType').value = '';
        $('dbAbbr').value = "";
        hideOrganisms(false);        
    }
    if($("bl2seq") && $("bl2seq").checked == true) {
        //Overwrite some settings    
        $('blastType').value = '';
        $('dbAbbr').value = "";
    }
    
    //Low complexity and repeats
    initFiltersDefaults(setFilters);
    
    diffFromDefault($("DATABASE"));
    //diffFromDefault($("fil_r"));
    //diffFromDefault($("fil_l"));
    DisplayCurrDatabase();     
}
    

function autoSelect(cRadio) {
   utils.addEvent(cRadio, 'click', function() {      
      setDbDefaults(cRadio,true);       
   }, false);
}

function autoCheck(idx) {
   switch (idx) {
      case $('Ohc').index: sendClick($('Rhc')); break;      
      case $('Omc').index: sendClick($('Rmc')); break;
      default: sendClick($('Rgen')); break;
   }      
}

function setDbType(idx) {
   var updateFilters = false;
   if($("savedSearch").value != "true") updateFilters = true;
   switch (idx) {
      case $('Ohc').index: setDbDefaults($('Rhc'), updateFilters); break;
      case $('Omc').index: setDbDefaults($('Rmc'),updateFilters);  break;
      default: setDbDefaults($('Rgen'),updateFilters); break;
      
   }      
}




function setDBBasedOpts(repeatsOption,filterVal)
{
    $(repeatsOption).selected = true;
    //$('blastType').value = blastType;
    $('fil_r').checked = filterVal;    
}
 
function DisplayCurrDatabase()
{
	var dbinfo = cssQuery("[class='dbInfo']");
	var dbInfo;
	
    var dbelem = $("DATABASE");
    var dbName;
    if(dbelem && dbelem.type == "select-one") { 
        dbName = $("DATABASE")[$("DATABASE").selectedIndex].text;
        /*var blastType = $("DATABASE")[$("DATABASE").selectedIndex].getAttribute("blasttype");            
        if(blastType && $("blastType")) {
            alert(blastType);
            $("blastType").value = blastType;
        }*/        
    }
    else {
        dbName = $("DATABASE").value;
    }
    for (var i = 0; i < dbinfo.length; i++) {
        if($("bl2seq") && $("bl2seq").checked == true) {
            dbInfo = $("stype").value + " sequence";
        }
        else if($('dbAbbr') && $('dbAbbr').value != "") {            
            dbInfo = "database " + $('dbAbbr').value;
        }
        else {
            
            dbInfo = "database " + dbName;
            
        }
	    dbinfo[i].innerHTML = dbInfo;	    
	}
}


function setupDBDisplayParams()
{
    //if($("program").value != "blastn" || $("blastSpec").value != ""){
    if(!HasGenomeNucDatabases()) {
        diffFromDefault($("DATABASE"));
        DisplayCurrDatabase();
    }
    else {        
        //Check radiobutton based on selected database
        setDbType($('DATABASE').selectedIndex);               

    }
}        



function initFiltersDefaults(setFilters)
{
  var rVal, lVal; 
  var rValDef,lValDef;
  var repeatsOption = "";
   
  var db = 'Ogen';
  if(HasGenomeNucDatabases()) {    
       var dbindex = $('DATABASE').selectedIndex;
       if($('bl2seq') && $('bl2seq').checked) {
            dbindex = $('Ogen').index;       
       }
       if(dbindex ==  $('Ohc').index) {
            db = 'Ohc';
            repeatsOption = "rhf";        
       }
       else if (dbindex == $('Omc').index) {       
            db = 'Omc';
            repeatsOption = "rmf";
       }
       else {
            db = 'Ogen';
       }       
   }       
   
   if(db == 'Ogen') {
        repeatsOption = "rhf";
        rVal = false; 
        lVal = true;
        rValDef = "unchecked";
        lValDef = "checked";  
   }        
   else {
        if($("selectedProg").value == "megaBlast") {            
            rVal = false; 
            lVal = false;
            rValDef = "unchecked";
            lValDef = "unchecked";            
        }    
        else {            
            rVal = true; 
            lVal = true;
            rValDef = "checked";
            lValDef = "checked";                  
        }   
  }   
   
  if(setFilters) {
    $('fil_l').checked = lVal;
    $('fil_r').checked = rVal;    
    $(repeatsOption).selected = true;    
  }
  $('fil_l').setAttribute('defVal',lValDef);       
  $('fil_r').setAttribute('defVal',rValDef);    
  diffFromDefault($("fil_r"));
  diffFromDefault($("fil_l"));
}    


    
function initRepeatFilter()
{
    if($("txid") && $("txid").value != "" && $("savedSearch").value != "true") {
        var taxid = $("txid").value;
        var repeatList = $("repeats");
    
        //Check R filter if taxid for the page corresponds to one of the values in the repeat list 
        //and it is not saved search
        for(i=0; i < repeatList.options.length; i++) {
            if(repeatList[i].value.indexOf(taxid) != -1 ||
                        i > 0 && repeatList[i].selected == true) {
                $("fil_r").checked = true;                
                break;
            }
        }
    }
}
  
function bl2SeqInit()
{
    var useBl2seq = this;
    var blastProgram;
    if($("defaultProg") != null) {//This is set for blastn and blastp
        blastProgram = $("defaultProg").value;
    }
    else {       
        blastProgram = $("program").value;            
    }    
    var url = "Blast.cgi?PAGE=" + $("page").value + "&PROGRAM=" + $("program").value + "&BLAST_PROGRAMS=" + blastProgram + "&PAGE_TYPE=BlastSearch&SHOW_DEFAULTS=on";
    
    if(useBl2seq.checked == true) {
        url+="&BLAST_SPEC=blast2seq";        
    }
    else {
        url+="&DBSEARCH=true";
    }
    
    if($("seq").value.length + $("subj").value.length <=1500) {
        url+="&QUERY=" + escape($("seq").value) + "&SUBJECTS=" + escape($("subj").value);
    }
    location.href = url;
    /*
	if(useBl2seq.checked == true) {
	    utils.addClass($("type-a"), "blast2seq"); 	    
	    if($("program").value == "blastp") {	    
            $("blastp").checked = true;
            SetPageDefaultParams("blastp");        
        }
    
	    $("blastSpec").value = "blast2seq";	 
	    $("qquery").value = "";
	    $("OLD_BLAST").value = "false";	   	    
	}
	else {
	    utils.removeClass($("type-a"), "blast2seq");
	    $("blastSpec").value = "";	    
	}	    
	if($("program").value == "blastn") {
	    setDbDefaults($('Rhc'), true);	
	}
	if($("UNIQ_DEFAULTS_NAME")) {
	    $("UNIQ_DEFAULTS_NAME").value = "";
	}
	*/
}        


//Not used now - will be used when stratages download/upload will go in production
function ValidateUserParams()
{
    if(!$("bl2seq") || $("bl2seq").checked == false) {
        ValidateOneUserParam($("DATABASE"),$("USER_DATABASE"),"database");    
    }
    ValidateOneUserParam($("wordsize"),$("USER_WORD_SIZE"),"wordsize");    
    ValidateOneUserParam($("matchscores"),$("USER_MATCH_SCORES"),"match/mismatch scores");    
    //TO DO: Add other lists validations
}

//Validates if param supplied by the user is in select box options
function ValidateOneUserParam(listElem, userParamElem,paramName)
{
    var valid = true;    
    if(listElem.options && userParamElem && userParamElem.value != "") {
        valid = false;
        for(i=0; i < listElem.options.length; i++) {
            if(listElem[i].value == userParamElem.value) {
                valid = true;
                break;
            }            
        }     
    }     
    if(!valid) {
        alert("Invalid " + paramName + " " + userParamElem.value);
    }
}

function InitLogParams()
{
    this.href += "&LAST_PAGE=" + $("program").value;  
    if($("blastInit")) {
        this.href += "&BLAST_INIT=" + $("blastInit").value;
    }  
    if($("subj") && $("subj").value !="") {
        if($("seq").value.length + $("subj").value.length <=1500) {
            this.href +="&QUERY=" + escape($("seq").value) + "&SUBJECTS=" + escape($("subj").value);
        }
    }
    else {
        if($("seq").value != "" && $("seq").value.length <= 1500) {
            //alert($("seq").value);
            this.href +="&QUERY=" + escape($("seq").value);
        }
    }
    if($("QUERY_FROM").value != "") {
        this.href += "&QUERY_FROM=" + $("QUERY_FROM").value;
    }
    if($("QUERY_TO").value != "") {
        this.href += "&QUERY_TO=" + $("QUERY_TO").value;
    }
    if($("subj")) {
        if($("SUBJECTS_FROM").value != "") {
            this.href += "&SUBJECTS_FROM=" + $("SUBJECTS_FROM").value;
        }
        if($("SUBJECTS_TO").value != "") {
            this.href += "&SUBJECTS_TO=" + $("SUBJECTS_TO").value;
        }
    }    
}

function AddOrgField()
{
    var checkedExclude = new Array();
    //Add onfocus inside html as opposed to setupOrganismSuggest due to problem in IE
    var newOrgField = " <div><input name=\"EQ_MENU" + $("numOrg").value + "\" class=\"multiOrg\" size=\"55\" id=\"qorganism" + $("numOrg").value +
                       "\" sgDict=\"taxids_sg\" sgStyle=\"SG_green\" onfocus=\"clearOrgSuggest(this);\" />" +
                       "<input type=\"checkbox\" name=\"ORG_EXCLUDE" + $("numOrg").value + "\" class=\"oExcl\" id=\"orgExcl" + $("numOrg").value + "\" />" +        
                       "<label for=\"orgExcl" + $("numOrg").value + "\" class=\"right oExclRl\">Exclude</label></div>";
                       
    if (navigator.userAgent.match(/ie/i)) {                       
        for(i=1; i < $("numOrg").value; i++) {    
            checkedExclude[i] = $("orgExcl" + i).checked;            
        } 
    }
                          
    utils.insertInHtml(newOrgField,$("orgs"));    
    
    if (navigator.userAgent.match(/ie/i)) {                       
        for(i=1; i < $("numOrg").value; i++) {    
            $("orgExcl" + i).checked = checkedExclude[i];                
        } 
    }
    resetOrganismSuggest($("qorganism" + $("numOrg").value));    
    $("numOrg").value++;    
    NSuggest_init();    
    
}


function dbGroupInit()
{
    var url = "Blast.cgi?PAGE=" + $("page").value + "&PROGRAM=" + $("program").value + "&BLAST_PROGRAMS=" + $("selectedProg").value + "&PAGE_TYPE=BlastSearch";
    
    //PROGRAM=blastn&BLAST_PROGRAMS=megaBlast&PAGE_TYPE=BlastSearch&BLAST_SPEC=SRA&DB_GROUP=Transcript    
    
    url+="&BLAST_SPEC="  + $("blastSpec").value + "&DB_GROUP=" + this.value;
    
            
    location.href = url;    
}        

function ShowDbSubGroup(selectAll)
{
    var subgroup = $("DATABASE")[$("DATABASE").selectedIndex].getAttribute("subgroup");    
    if(subgroup) {
        changeOptionList($("subgroup"),subgroup,false);        
        //if($("savedSearch").value != "true") {
        if(selectAll) {
            for(i = 0; i < $("subgroup").options.length; i++) {
                $("subgroup").options[i].selected = true;
            }
        }
        
        $("sbName").value = subgroup;
        utils.removeClass($("subgroupDv"), "hidden");        
        utils.removeClass($("subgroupLb"), "hidden");        
    } 
    else{
        $("subgroup").options.length = 0;
        $("sbName").value = "";
        utils.addClass($("subgroupDv"), "hidden");        
        utils.addClass($("subgroupLb"), "hidden");
    }
}

if (navigator.userAgent.match(/safari/i)) {
    document.write("<link rel='stylesheet' type='text/css' href='css/safari-blastn.css'  media='screen'/>");
}
if (navigator.userAgent.match(/opera/i)) {
document.write("<link rel='stylesheet' type='text/css' href='css/opera-blastn.css'  media='screen'/>");
}
