/*===========================================================================
*
*                            PUBLIC DOMAIN NOTICE
*               National Center for Biotechnology Information
*
*  This software/database is a "United States Government Work" under the
*  terms of the United States Coyright Act.  It was written as part of
*  the author's official duties as a United States Government employee and
*  thus cannot be copyrighted.  This software/database is freely available
*  to the public for use. The National Library of Medicine and the U.S.
*  Government have not placed any restriction on its use or reproduction.
*
*  Although all reasonable efforts have been taken to ensure the accuracy
*  and reliability of the software and data, the NLM and the U.S.
*  Government do not and cannot warrant the performance or results that
*  may be obtained by using this software or data. The NLM and the U.S.
*  Government disclaim all warranties, express or implied, including
*  warranties of performance, merchantability or fitness for any particular
*  purpose.
*
*  Please cite the author in any work or product based on this material.
*
* ===========================================================================
*
* Author: Ron Edgar
*
* file : gds.js
* JavaScript code for GEO DataSet Record viewer
* this is rather old and primitive code
**********************************************************/
//var host = "http://graceland.ncbi.nlm.nih.gov:6224";
var host = "";
var webdir = "/geo/";
var imghome = "http://www.ncbi.nlm.nih.gov/geo/img/";
var eQuery = "http://www.ncbi.nlm.nih.gov/sites/entrez?db=geo&term=";
var RequesterURL = host + "/Service/cgi_tunnel2grid/cgi_tunnel2grid.cgi?ctg_project=gds_ab&" +
"ctg_error_url=" + host + "/geo/gds/gds_browse.cgi?gds=";

var eSearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi";

//var eQuery = "http://pmdb2.ncbi.nlm.nih.gov:2441/edgar/query.fcgi?db=geo&term=";
var ca1=new Image();ca1.src = imghome + 'checkall1.gif';
var ca2=new Image();ca2.src = imghome + 'checkall2.gif';
var ua1=new Image();ua1.src = imghome + 'uncheckall1.gif';
var ua2=new Image();ua2.src = imghome + 'uncheckall2.gif';
var dl1=new Image();dl1.src = imghome + 'download1.gif';
var dl2=new Image();dl2.src = imghome + 'download2.gif';
var gr1=new Image();gr1.src = imghome + 'graphit1.gif';
var gr2=new Image();gr2.src = imghome + 'graphit2.gif';
var tg1=new Image();tg1.src = imghome + 'toggle1.gif';
var tg2=new Image();tg2.src = imghome + 'toggle2.gif';
//var cw1=new Image();cw1.src = imghome + 'closewin1.gif';
//var cw2=new Image();cw2.src = imghome + 'closewin2.gif';
//var op1=new Image();op1.src = imghome + 'opts1.gif';
//var op2=new Image();op2.src = imghome + 'opts2.gif';
function is_unix() {
    var agt=navigator.userAgent.toLowerCase();
    return  (agt.indexOf("unix")!=-1);
}
function is_win() {
    var agt=navigator.userAgent.toLowerCase();
    return  (agt.indexOf("win")!=-1);
}
function is_mac() {
    var agt=navigator.userAgent.toLowerCase();
    return  (agt.indexOf("mac")!=-1);
}
function uncheck_all(name) {
  var gsms = name.gsms;
  var ssets = name.allsubnames;
  for(i=0;i<gsms.length;++i)
    gsms[i].checked = false;
  for(i=0;i<ssets.length;++i) {
    var ssboxname = "csub" + ssets[i].value;
    var ssbox = eval("document.gsm_form." + ssboxname);
    ssbox.checked = false;
  }
}

function check_all(name) {
  var gsms = name.gsms;
  var ssets = name.allsubnames;
  for(i=0;i<gsms.length;++i)
    gsms[i].checked = true;
  for(i=0;i<ssets.length;++i) {
    var ssboxname = "csub" + ssets[i].value;
    var ssbox = eval("document.gsm_form." + ssboxname);
    ssbox.checked = true;
  }
}
      
function toggle_check(name) {
  var gsms = name.gsms;
  var ssets = name.allsubnames;
  for(i=0;i<gsms.length;++i)
    gsms[i].checked = !gsms[i].checked;
  for(i=0;i<ssets.length;++i) {
    var ssboxname = "csub" + ssets[i].value;
    var ssbox = eval("document.gsm_form." + ssboxname);
    ssbox.checked = !ssbox.checked;
  }
}

function whatisAB(ffname) {
  var tocgi = ffname + ".html";
  var open_cmd = '"width=530,height=600,resizable,scrollbars"'
    var w = window.open(tocgi,"whatis",eval(open_cmd)); 
  w.focus();
}
 

function validate(name) {
    for(i=0;i<name.length;++i) 
        if(name[i].checked) 
	    return true;
    alert("you must select one or more Samples");
    return false;
}

function exgCk1(name) {
    var boxname1 = "exgA" + name;
    var boxname2 = "exgB" + name;
    var thebox1 = eval("document.gsm_form." + boxname1);
    if(!thebox1.checked)
      return;
    var thebox2 = eval("document.gsm_form." + boxname2);
    thebox2.checked = !thebox1.checked;
}

function exgCk2(name) {
    var boxname1 = "exgA" + name;
    var boxname2 = "exgB" + name;
    var thebox1 = eval("document.gsm_form." + boxname1);
    var thebox2 = eval("document.gsm_form." + boxname2);
    if(!thebox2.checked)
      return;
    thebox1.checked = !thebox2.checked;
}

function clearArray(arr) {
  for(var i=0; i<arr.length; ++i) {
    arr[i] = null;
  }
}

function makeOption(text) {
  this.text = text;
}

function meansOrTtest() {
  var daform = document.gsm_form;
  var operObj = daform.oper;
  var foldObj = daform.fold;
  var optAr = new Array();
  optAr[0] = new Array();
  // options for two-tail
  optAr[0][0] = new makeOption("0.100 significance level"); 
  optAr[0][1] = new makeOption("0.050 significance level"); 
  optAr[0][2] = new makeOption("0.010 significance level");
  // options for one tail (both <>)
  optAr[1] = new Array();
  optAr[1][0] = new makeOption("0.100 significance level"); 
  optAr[1][1] = new makeOption("0.050 significance level"); 
  optAr[1][2] = new makeOption("0.025 significance level");
  optAr[1][3] = new makeOption("0.010 significance level");
  optAr[1][4] = new makeOption("0.005 significance level"); 
  optAr[1][5] = new makeOption("0.001 significance level"); 
  // options for one tail <
  optAr[3] = new Array();
  optAr[3][0] = new makeOption("2+ fold"); 
  optAr[3][1] = new makeOption("3+ fold"); 
  optAr[3][2] = new makeOption("4+ fold");
  optAr[3][3] = new makeOption("6+ fold");
  optAr[3][4] = new makeOption("8+ fold");
  // options for operator
  optAr[4] = new Array();
  optAr[4][0] = new makeOption("higher"); 
  optAr[4][1] = new makeOption("lower"); 
  optAr[4][2] = new makeOption("either");

  var selected = daform.rankval.selectedIndex;
  selected = selected == null ? 0 : selected;
  if(selected < 3) {		// t-test
    //<select size="1" id="id_oper" name="oper" class="hidden"/>
    document.getElementById('id_oper').style.display = 'none';
    selected = selected == 2 ? 1 : selected;
  }
  else {			// A vs B mean
    document.getElementById('id_oper').style.display = '';
    selected = selected == 4 ? 3 : selected;
    var operOptions = operObj.options;
    var curAr = optAr[4];
    clearArray(operOptions);
    for (var j = 0; j < curAr.length; j++) {
      operOptions[j] = new Option(curAr[j].text);
    }
  }
  
  var options = foldObj.options;
  var curAr = optAr[selected];
  clearArray(options);

  for (var j = 0; j < curAr.length; j++) {
    options[j] = new Option(curAr[j].text);
  }
  foldObj.selectedIndex = 1;
}

function allAB(name) {
    var ssets = document.gsm_form.allsubnames;
    for(i=0;i<ssets.length;++i) {
      var ssboxname1 = "exgA" + ssets[i].value;
      var ssboxname2 = "exgB" + ssets[i].value;
      var ssbox1 = eval("document.gsm_form." + ssboxname1);
      var ssbox2 = eval("document.gsm_form." + ssboxname2);
      if(name == 'allA') {
	ssbox1.checked = true;
	ssbox2.checked = !ssbox1.checked;
      }
      else if(name == 'allB') {
	ssbox2.checked = true;
	ssbox1.checked = !ssbox2.checked;
      }
    }
}

function subCk(name) {
    var boxname = "csub" + name;
    var subname = "sub" + name;
    var thebox = eval("document.gsm_form." + boxname);
    var arr = eval("document.gsm_form." + subname);
    var gsms = document.gsm_form.gsms;
    if(thebox.checked) {
        for(j=0;j<arr.length;++j) {
	    var gsm = arr[j].value;
	    if(gsm == 0)
		continue;
	    for(k=0; k<gsms.length; ++k)
		if(gsms[k].value == gsm)
		    gsms[k].checked = true;
        }
    }
    else {
        for(j=0;j<arr.length;++j) {
	    var gsm = arr[j].value;
	    if(gsm == 0)
		continue;
	    for(k=0; k<gsms.length; ++k)
		if(gsms[k].value == gsm)
		    gsms[k].checked = false;
        }
    }
}  

function ss_effect(gds) {
  var obj = document.gsm_form;
  var ss_typesArr = obj.ss_check; 
  
  // sanity checks
  var gdsOnly = obj.gdsonly.checked;
  var ssranks = obj.ssranks.checked;
  var ssvals = obj.ssvals.checked;
  var has_effects = (obj.has_effects[0].value == "true");
  if(gdsOnly && !has_effects) {
    alert("DataSet has no flagged effects - uncheck the 'GDS only' box to search any GDS");
    return 1;
  }
  if(!ssvals && !ssranks) {
    alert("please check 'ranks' and/or 'values' boxes");
    return 1;
  }
  
  var qstring = "(";
  
  // check if array or single value
  var first = true;
  if(!ss_typesArr.value) {	// array of values passed
    for(i=0; i<ss_typesArr.length; ++i) {
      if(ss_typesArr[i].checked) {
	if(!first) {
	  qstring += " OR ";
	}
	else {
	  first = false;
	}
	qstring += '"' + ss_typesArr[i].value + '"[FINF]';
      }
    }
    if(first) {			// no buttons were checked
      alert("please select subset type/s to search (Type column)");
      return 1;
    }
    qstring += ")";
  }
  else {
    qstring += '"' + ss_typesArr.value + '"[FINF])';
  }
  if(gdsOnly) {
    qstring += " AND GDS" + gds + "[ACCN]";
  }
  if(ssranks && !ssvals)
    qstring += ' AND "rank subset effect"[FTYP]';
  else if(ssvals && !ssranks)
        qstring += ' AND "value subset effect"[FTYP]';
  var url = eQuery + qstring;
  //alert(qstring);
  window.location.href=url;  
}

function findGene() {
  var gds = document.gsm_form.gds.value;
  var gene = document.gsm_form.genetext.value;
  //alert("findGene called with " + gene);

  if(gene.length == 0) {
    alert("please enter a search term");
    return;
  }
  var qstring = '"GDS' + gds + '"[ACCN]+' + gene;  
  var url = eQuery + qstring;
  window.location.href=url;  
}

function doEvent(e) {
  if (e.type == "click" || (e.type == "keypress" && (e.keyCode == 13))) {
    e.preventDefault();
    findGene();
  }   
}

function makeUniqueArr(nu_array) {
  //alert("non unique array " + nu_array.join(";") );
  u_array = new Array();
  while(da_element = nu_array.shift() ) {
    var exists = false;
    for(i = 0; i < u_array.length; ++i) {
      if(u_array[i] == da_element) { // element already in array
	exists = true;
	break;
      }
    }
    if(!exists) {
      u_array.push(da_element);
    }
  }
  //alert("unique array " + u_array.join(";") );
  return u_array;
}

function existsInArray(arr, element) {
  // non invasive function
  for(var i = 0; i<arr.length; ++i) {
    if(arr[i] == element) 
      return true;
  }
  return false;
}
  
function makeIntersectOrAll(arr) {
  var interArr = new Array();
  var allArr = new Array();
    while(elem = arr.shift()) {
      if(elem == 0)
	continue;
      allArr.push(elem);
      if(existsInArray(arr, elem) ) {
	interArr.push(elem);
      }
    }
    return interArr.length > 0 ? interArr : allArr;
}
    
function AvsB(gds) {
  //alert("temporarily unavailable");
  //return;
  // collect subset sample list of A and B.
  // each group samples are separately pooled.
  // if the elements contain intersecting elements, only those will be used,
  // otherwise, use the pool (the cat of all subsets in that group).
  // group A and B must not contain common elements, if they do exits with error msg
  // for t-test group size must be >1
  var daform = document.gsm_form;
  var ssets = document.gsm_form.allsubnames;
  ssArrA = new Array();		// subsets for group A
  ssArrB = new Array();		// subsets for group B
  
  for(var i=0;i<ssets.length;++i) {	// iterate all subsets
    var ssboxname1 = "exgA" + ssets[i].value;
    var ssboxname2 = "exgB" + ssets[i].value;
    var ssbox1 = eval("document.gsm_form." + ssboxname1);
    var ssbox2 = eval("document.gsm_form." + ssboxname2);
    if(ssbox1.checked) {
      ssArrA.push(ssets[i].value);	// which subsets are in group A
    }
    else if(ssbox2.checked) {
      ssArrB.push(ssets[i].value);	// which subsets are in group B
    }
  }
  if(ssArrB.length < 1 || ssArrA.length < 1) {
    alert("You must check boxes for subsets in each group (A and B) for comparison");
    return;
  }
  
  // iterate each group of subsets and collect samples
  allSampGroupA = new Array();
  allSampGroupB = new Array();  
  for(var i=0;i<ssArrA.length;++i) {
    var subname = "sub" + ssArrA[i];
    var gsms = eval("document.gsm_form." + subname); // the sample from the sub name
    for(var j=0;j<gsms.length;++j) {
      var gsm = gsms[j].value;	
      if(gsm == 0)
	continue;
      allSampGroupA.push(gsm);
    }
  }
  for(var i=0;i<ssArrB.length;++i) {
    var subname = "sub" + ssArrB[i];
    var gsms = eval("document.gsm_form." + subname); // the sample from the sub name
    for(var j=0;j<gsms.length;++j) {
      var gsm = gsms[j].value;	
      if(gsm == 0)
	continue;
      allSampGroupB.push(gsm);
    }
  }
  
  // if a set has intersecting elements - extract and use only them
  // if a set has no intersecting elements - use all elements in that set
  
  var sampGroupA = allSampGroupA.length == 1 ? allSampGroupA : makeIntersectOrAll(allSampGroupA);
  var sampGroupB = allSampGroupB.length == 1 ? allSampGroupB : makeIntersectOrAll(allSampGroupB);

  // verify no samples are common to both groups
  for(var j=0; j<sampGroupA.length; ++j) {
    var elem = sampGroupA[j];
    if(existsInArray(sampGroupB, elem) ) {
       	alert("Groups A and B cannot share common samples");
	return;
    }
  }
  
  // check each group against checkbox-checked samples
  // if any samples in the group are checked, use only these
  // if none are checked ALL are used 
  
  // create an array of checked samples
  var allgsms = daform.gsms;
  var checkedSamples = new Array();
  for(var k=0; k<allgsms.length; ++k) {
    if(allgsms[k].checked) {
      checkedSamples.push(allgsms[k].value);
    }
  }
  
  useCheckedSamples = true;
  if(checkedSamples.length == 0) {
    alert("All Samples are unchecked - ignoring"); 
    useCheckedSamples = false;
  }

  var finalA = new Array();
  var finalB = new Array();

  
  for(var i=0; i<sampGroupA.length; ++i) {
    var elem = sampGroupA[i];
    if(useCheckedSamples && existsInArray(checkedSamples, elem) ) {
      finalA.push(elem);
    }
  }
  
  for(var i=0; i<sampGroupB.length; ++i) {
    var elem = sampGroupB[i];
    if(useCheckedSamples && existsInArray(checkedSamples, elem) ) {
      finalB.push(elem);
    }
  }
  
  if(useCheckedSamples && finalA.length == 0)
    alert("Group A has no checked samples, using all");
  if(useCheckedSamples && finalB.length == 0)
    alert("Group B has no checked samples, using all");

  finalA = finalA.length > 0 ? finalA : sampGroupA;
  finalB = finalB.length > 0 ? finalB : sampGroupB;
  
  //---------------------------------
  // End sample/group assignments
  //---------------------------------
  var gds = daform.gds.value;
  var fold = document.getElementById('id_fold'); 

  var foldText = fold.options[fold.selectedIndex].text;
  var operText = "";

  var selectedQ = daform.rankval.selectedIndex;

  var code = "TTEXP";		// code sent for t-test to query
  if(selectedQ == 3)
    code = "VGEXP";		// value means
  else if(selectedQ == 4)
    code = "RGEXP";		// rank means
  else {			
    if(finalA.length < 2 || finalB.length < 2) {
      alert("group size(s) too small for t-test");
      return;
    }
  }

  if(selectedQ == 0) {		// t-test two tailed
    operText = 'EQ';
    foldText = foldText.substr(0,5);
  }
  else if(selectedQ == 1) {	// t-test A>B
    operText = 'SGT';
    foldText = foldText.substr(0,5);
  }
  else if(selectedQ == 2) {	// t-test A<B
    operText = 'SLT';
    foldText = foldText.substr(0,5);
  }
  else {
    var oper = document.getElementById('id_oper');
    operText = oper.options[oper.selectedIndex].text;
    if(operText == 'lower') {
      operText = 'SLT';
      foldText = foldText.charAt(0);
    }
    else if(operText == 'higher') {
      operText = 'SGT';
      foldText = foldText.charAt(0);
    }
    else if(operText == 'either') {
      operText = 'SGTLT';
      foldText = foldText.charAt(0);
    }
  }
  //var foldText =  escape(document.gsm_form.fold.value);
  //var qstring = "{" + "TTEXP;" + gds + ";" + finalA.join(",") + ";" + "T2T" + ";" + 
  var qstring = "{" + code + ";" + gds + ";" + finalA.join(",") + ";" + operText + ";" + 
    foldText + ";" + finalB.join(",") + "}";
  //alert(qstring);
  var url = RequesterURL + gds + "&ctg_input=" + qstring;
  //alert(url);
  //return;
  window.location.href=url;
}

function img_fwd(iname) {
    var i2 = iname + "2";
    var nsrc = eval(i2).src;
    if(nsrc != document.images[iname].src)
	document.images[iname].src = nsrc;
}

function img_bkwd(iname) {
    var i1 = iname + "1";
    var nsrc = eval(i1).src;
    if(nsrc != document.images[iname].src)
	document.images[iname].src = nsrc;
}

function show_type(type, relpath, fname, attach) {
  var tocgi = webdir + "gds/floader.cgi?type=" + type + "&relpath=gds/" + relpath + "&fname=" + fname + "&attach=" + attach;
  var open_cmd = '"width=680,height=500,resizable,scrollbars"';
  var w = window.open(tocgi, type, eval(open_cmd)); 
  w.focus();
}

function show_dist(gds) {
  var tocgi = "/geo/gds/profileGraph.cgi?gds=" + gds;
  //var open_cmd = '"width=800,height=500,resizable,scrollbars"';
  //var w = window.open(tocgi, "gif",  eval(open_cmd)); 
  //w.focus();
  window.location.href=tocgi;
}

function kMeans(gds) {
	//alert("tool is temporarily unavailable");
	//return;
    var url = "/geo/gds/analyze/kmeans.cgi?ID=GDS" + gds;
    window.location.href=url;
}

function chromoLoc(gds) {
	//alert("tool is temporarily unavailable");
	//return;
  var clustUrl = "/geo/gds/analyze/analyze.cgi?datadir=Chromo&myType=2";
  clustUrl += "&ID=GDS" + gds;
  window.location.href=clustUrl;
}


function download(frm, quantity) {
    var samps = frm.gsms;
    var gsms = '';
    var n_selected = 0;
    for(i=0;i<samps.length;++i) {
	if(samps[i].checked) {
	    if(n_selected++)
		gsms += ",";
	    gsms += samps[i].value;
        }
    }
    if(quantity == "compl") {
      var gdsval = "GDS" + frm.gds.value + ".soft";
      show_type("txt", "soft", gdsval , gdsval);
      return;
    }
    if(quantity == "annot") {
      var gdsval = "GPL" + frm.gpl.value + ".annot";
      show_type("txt", "annot", gdsval , gdsval);
      return;
    }      
    
    if(n_selected<2) {
        alert("You must select 2 or more Samples");
        return;
    }
    var plat = "unix";
    if(is_win())
      plat = "win";
    else if(is_mac())
      plat = "mac";
    plat = "&plat=" + plat;
    var tocgi = webdir + "/gds/gdsSoftReader.cgi?&gds=" + frm.gds.value + plat + "&gsms=" + gsms + "&view=" + quantity;
    
    if(quantity == "quick") {
      var open_cmd = '"width=650,height=500,resizable,scrollbars"';
      var w = window.open(tocgi, quantity, eval(open_cmd)); 
      w.focus();
    }
    else {
      var note = '';
      //alert(tocgi);
      if(frm.sage.value == 1) {
	tocgi += "&SAGE=yeap";
	note = "<SPAN CLASS=warn>NOTE: SAGE values are in Tags Per Million (TPM)</SPAN>";
      }
      w = window.open("", "download", "width=280,height=80"); 
      w.document.write("<html><title>Download notice</title>");
      w.document.write("<BODY bgcolor='white'>");
      w.document.write('<style type="text/css"> .note { font-size:10pt; font-family: ariel,helvetica,sans-serif; color:#2200FF;} .warn { font-size:10pt; font-family: ariel,helvetica,sans-serif; color:#FF2222;} </style>');
      
      w.document.write("<CENTER><SPAN CLASS=\"note\">preparing data... one moment please</SPAN><BR>");
      w.document.write(note);
      w.document.write("<BR><SPAN CLASS=\"note\"><input type=\"button\" value=\"abort/close\" onClick=\"window.close();\")></SPAN></CENTER></body></html>");
      w.location.href = tocgi;
    }
}

function goToCluster(dist, method, gds) {
  var clustUrl = "/geo/gds/analyze/analyze.cgi?myStatus=0&";
  clustUrl += "dist=" + dist + "&method=" + method + "&ID=GDS" + gds;
  window.location.href=clustUrl;
}


function activateSupFileLink(gse) {
  //alert(document.getElementById('el3'));
  var esearchQuery = eSearch + "db=gds&retmax=0&term=any[SFIL]+GSE[ETYP]";

  
  document.getElementById('el3').style.display = 'none';
  
}


function ftpFile(accession, type) {
  var filesuf = '';
  var reloc = '';
  if(type == "soft_s") { 
    reloc = "SOFT/by_series/GSE";
  }
  else if(type == "miniml_s") { 
    reloc = "MINiML/by_series/GSE";
  }
  else if(type == "gds") { 
    reloc = "SOFT/GDS/GDS";
    filesuf = ".soft.gz";
  }
  else if(type == "supp_s") { 
    reloc = "supplementary/series/GSE";
    activateSupFileLink();
    //filesuf = ".soft.gz";
  }
  if(type == "annot_p") { 
    reloc = "annotation/platforms/GPL";
    filesuf = ".annot.gz";
  }
  var ftpUrl = "ftp://ftp.ncbi.nih.gov/pub/geo/DATA/" + reloc + accession + filesuf;
  //alert(ftpUrl);
  window.location.href=ftpUrl;
}

