// ****** variables specific to this js

var min_hl_len=3;
var letter_array=new Array();
var digit_array=new Array();

var layer_width=new Array();
var layer_height=new Array();
var nwin=null;

var word_sep_array=new Array();

var olcnt=0;
var abc_str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
var inhibit_mo_popup=false;

var ml_timer;

var itemsource_id_sym_hash=new Array();

// *****

function removeTags(msg) {
 var rmsg="";

 var tag=false;
 
 for(var i=0; i<msg.length; i++) {
  var c=msg.charAt(i);
  
  if(i>160) { rmsg+="..."; break; }
  
  if(c=="<") {
   tag=true;
  } 
  
  if(!tag) rmsg+=c;

  if(c==">") tag=false;
 }

 return rmsg;
}

// *******

     if(letter_array.length==0) {
      var letter_str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      
      for(var i=0; i<letter_str.length; i++) {
       var c=String(letter_str.charAt(i));
       
       letter_array["_"+c]=1;
       letter_array["_"+c.toLowerCase()]=1;
      }
     }

     if(digit_array.length==0) {
      var letter_str="0123456789";
      
      for(var i=0; i<letter_str.length; i++) {
       var c=String(letter_str.charAt(i));
       digit_array["_"+c]=1;
      }
     }

function isLetter(c) {
 if(letter_array["_"+c]) return true; 
 return false;
}

function isDigit(c) {
 if(digit_array["_"+c]) return true; 
 return false;
}

// ******* unipub general **********

// * hard-code to be backwards-compatible with old xml files
new_org_id_name_array["_-1"]="";
new_org_id_name_array["_1"]="Homo sapiens";
new_org_id_name_array["_2"]="Mus musculus";
new_org_id_name_array["_141"]="Danio rerio";
new_org_id_name_array["_4"]="Caenorhabditis elegans";
new_org_id_name_array["_3"]="Drosophila melanogaster";
new_org_id_name_array["_6"]="Saccharomyces cerevisiae";
new_org_id_name_array["_7"]="Escherichia coli";
new_org_id_name_array["_5"]="Arabidopsis thaliana";
new_org_id_name_array["_60956"]="Escherichia coli K12";
//

//
function getXMLHTTP(){
  var A=null;

  try{
    A=new ActiveXObject("Msxml2.XMLHTTP")
		}catch(e){
    try{
      A=new ActiveXObject("Microsoft.XMLHTTP")
    } catch(oc){
					 A=null;
    }
  }

  if(!A && typeof XMLHttpRequest != "undefined") {
    A=new XMLHttpRequest();
  }

  if(!A && window.createRequest) {
   try {
    A=window.createRequest(); 
   } catch(e) {
    A=null;  
   }
  }

  return A;
}

//
function valert(msg) {
 if(!msg || msg.length==0) return;

 try {

 var umsg="A"+msg.replace(/ /g, "_");
 if(alert_msg_array[umsg]) { return; }
 alert_msg_array[umsg]=1;

  if(debug) {
   alert(msg);
			return;
		}	
		
	 var xh=getXMLHTTP();
  if(xh!=null) {
 		xh.open("POST", "/UniPub/error_log.html", true);
			xh.setRequestHeader("Content-Type", "text/xml")
	  xh.onreadystatechange=function() {
    if (xh.readyState==4) {}
			}
			
			var ext_msg="";
			ext_msg+="<HREF>"+window.location.href+"</HREF>";
			ext_msg+="<MSG>"+msg+"</MSG>";
			ext_msg+="<NNAME>"+navigator.appName+"</NNAME>";
			ext_msg+="<NVS>"+navigator.userAgent+"</NVS>";
						
  	xh.send(ext_msg);
		}	
	} catch(error) {}
}

if(debug) valert("Debug mode!");

function is_close(timed) {
/*
 if(window.history.length>1) {
  return;
 }
  */
 if(timed) { 
  window.setTimeout("is_close(false);", 5000);
  window.setTimeout("is_close(false);", 1500);
 } else {

  window.close();
 } 
}

function is_print() {
 window.print();
}

function updateDate() {
 var today=new Date();

 var y=today.getYear();
 var m=today.getMonth();
 var d=today.getDate()-14;

 if(d<=0) { d=30+d; m=m-1; }
 if(m<0) { m=12+m; y=y-1; }

 var d=Math.floor(d/10)+1;

 if(y<1000) { y=y+1900; }
 //
 var ndate = new Date(y, m, d);

 var weekday=new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
 m=m+1;
 document.write("This page was last updated on "+weekday[ndate.getDay()]+", "+d+"/"+m+"/"+y+".");
}

function popitup(win, url, winname, options) {
 
 // the target window is this window
 if(winname==window.name) {

  window.nwin=window;
  window.location.href=url;

 } else {
  // this window is not the target window

  if(win && !win.closed && win.location) {

   window.nwin=win;

   if(url && window.nwin) window.nwin.location.href=url;

  } else {

   window.nwin=window;

   if(options) {
    window.nwin=window.open(url, winname, options);
   } else {
    window.nwin=window.open(url, winname);
   }
  }

  window.setTimeout("if(window.nwin) window.nwin.focus(); ", 1);
  window.setTimeout("if(window.nwin) window.nwin.focus(); ", 500);
  window.setTimeout("if(window.nwin) window.nwin.focus(); ", 1000);  
 }

 return nwin;
}

function rpopitup(win, url, winname, options, percent_width, percent_height, nr) {
 var maxnr=10;
 if(nr<0) nr=maxnr;
 if(nr>maxnr) nr=maxnr;

 var w=screen.width*percent_width/100;
 var h=screen.height*percent_height/100;

 w=Math.round(w);
 h=Math.round(h);

 var x=(screen.width-w)/maxnr*nr;
 var y=(screen.height-h)/maxnr*nr;

 if(nr==0) {
  x=10;
  y=10;

  w=w-20;
  h=h-20;  
 }

 //limit width to real
 if(w>1280) w=1280;
  
 options+=",top="+x+",left="+y+",width="+w+",height="+h;

 return popitup(win, url, winname, options);
}

function dynPopitupType(winname, url) {
 // ??? if this works everywhere (checked by foreign key-links in ihop) then it could replace all win=popitup codes!
 eval("window."+winname+"_win=popitupType('"+winname+"_win', '"+url+"', '"+winname+"');");
}

function helpme(main, chapter, topic) {

 var helpfile=null;

 if(main.toUpperCase()=="HCAD") {
  helpfile="/UniPub/HCAD/help.html";
 }

 if(main.toUpperCase()=="HOP") {
  helpfile="/UniPub/iHOP/help.html";
 }

 if(main.toUpperCase()=="GIS") {
  helpfile="/UniPub/GIS/html/manual.html";
 }

 if(helpfile) {

  var helpadr="";

  if(chapter && chapter.length>0) {
   helpadr=helpadr+"#"+chapter;
  }

  if(topic && topic.length>0) helpadr=helpadr+"_"+topic;

  window.helpwin=rpopitup(window.helpwin, helpfile+helpadr, 'HelpWin','toolbar=yes,location=no,menubar=no,status=no,directories=no,scrollbars=yes, resizeable=yes',80,65,1);

 } else {
  valert("undefined");
 }
}

function pm_open(pmid, type) {
 var url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&dopt=Abstract&list_uids="+pmid;
	if(type && type==1) url="http://www.ncbi.nlm.nih.gov/entrez/eutils/elink.fcgi?cmd=prlinks&dbfrom=pubmed&id="+pmid+"&retmode=ref";
	if(type && type==2) url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?itool=pubmed_Abstract&db=pubmed&cmd=Display&dopt=pubmed_pubmed&from_uid="+pmid+"&retmode=ref";
	if(type && type==3) url="http://www.ncbi.nlm.nih.gov/sites/entrez?dopt=MEDLINE&EntrezSystem2.PEntrez.DbConnector.Cmd=File&EntrezSystem2.PEntrez.DbConnector.Db=pubmed&list_uids="+pmid;

 window.pubmed_win=popitupType(window.pubmed_win, url, "PubMed");
}

var pm_search_array=new Array();

function add_pm_search(str) {
 if(!str) return -1;
 	
 var snr=pm_search_array.length;
 pm_search_array[snr]=str;
 
 return snr;
}

function pm_cmb_search(snr) {

 var str="";
 if(main_QUERY) str=main_QUERY;
 
 if(snr>=0) {
  if(str.length>0) str+="|{[AND]}|";
  str+=pm_search_array[snr];
 } 

 pm_str_search(str);
}

function pm_search(snr) {
 if(snr>=0) return;
 
 pm_str_search(pm_search_array[snr]);
}

function pm_str_search(str) {
 if(!str) return;

 str=str.replace(/\\\'/g, "'"); 
 str=str.replace(/\\'/g, "'");
 str=str.replace(/&quot;/g, "%22");
 str=str.replace(/\"/g, "%22");
 str=str.replace(/"/g, "%22");

// alert(str);
 window.pubmed_win=popitupType(window.pubmed_win, "/UniPub/iHOP/pmquery.html?s="+str, "PubMed");
}

function evalPhrase(pnr, s, count) {

 var parts=s.split("[)}");

 var ns="";

 for(var i=0; i<parts.length; i++) {
  var p=parts[i];

  idx=p.indexOf("[(}");

  if(idx>=0) {
   var com=p.substring(0, idx);

   var param=getParameters(com);
   ns+=execSentenceCom(pnr, param, count);

   //   
   p=p.substring(idx+3, p.length);
  }
  
  // highlight search words!
  p=hl_query(pnr, p);

  ns+=p;
 }

 return ns;
}

function hl_query(pnr, str) {
 if(!str || str.length==0) return "";
 
 if(window.rf_query && rf_query.length>0) {  

  str=hl_query_internal(pnr, str, rf_query, "<SPAN class=\"highlight\" >", "</SPAN>", false, min_hl_len);
 }
 
 return str;
}

stopw["to"]=1;
stopw["is"]=1;
stopw["how"]=1;
stopw["for"]=1;
stopw["and"]=1;
stopw["in"]=1;
stopw["with"]=1;
stopw["of"]=1;

word_sep_array["_."]=1;
word_sep_array["_?"]=1;
word_sep_array["_!"]=1;
word_sep_array["_:"]=1;
word_sep_array["_;"]=1;
word_sep_array["_,"]=1;

function hl_query_internal(pnr, str, rf_query, left, right, case_sensitive, min_ch) {
 var ostr=str;
 
 var ustr=str; 
 
 if(!case_sensitive) {
  ustr=ustr.toUpperCase();
 }

 //
 var nstr="";

 var start=true;

 var safety=0;

 do {

 var i=-1;
 var s=null;
 
 for(var qp=0; qp<rf_query.length; qp++) {     
  s=rf_query[qp];
  if(s.length==0) continue;
  if(stopw[s]==1) continue; 
  if(!case_sensitive) s=s.toUpperCase();
  
  i=ustr.indexOf(s);
    
  //
  if(i>=0) break;
 } 
  
 if(i>=0) {    
  //
  var reject=false; 
   
  //
  if(s.length<=min_ch) {
   var lc="-";
   var rc="-";    
   if(i>0) { 
    lc=str.slice(i-1, i);
   } else {
    if(!start) {
     lc=nstr.slice(nstr.length-1, nstr.length);
    }
   }
   
   if(i+s.length<str.length) rc=str.slice(i+s.length, i+s.length+1);

   if(word_sep_array["_"+lc]==1) lc=" ";
   if(word_sep_array["_"+rc]==1) rc=" ";
   
   if((lc!=" " && lc!="-") || (rc!=" " && rc!="-")) reject=true;
   
   //if(reject) valert("lc=>"+lc+"<, rc=>"+rc+"<");
   
   //
   start=false;
  }
    
  // 
  nstr+=str.slice(0, i);
  if(!reject) nstr+=left;
  nstr+=str.slice(i, i+s.length);
  if(!reject) nstr+=right;
    
  str=str.slice(i+s.length, str.length);
  
  //
  ustr=str;
  if(!case_sensitive) ustr=str.toUpperCase();
  
 } else {
  
  return nstr+str;
 }
 
  safety++;
  if(safety==200) {
   //valert("safety exit: "+ostr);
   return ostr;
  }
 } while(1==1);

}

function trim(str) {
 var i=0;
 var j=str.length-1;

 for(; i<str.length; i++) {
  if(str.charAt(i)!=" ") break;
 }

 for(; j>=0; j--) {
  if(str.charAt(j)!=" ") break;
 }
 
 return str.substring(i, j+1);
}

function getParameters(str) {

 var rp=str.split(",");

 var p=new Array();
 var j=0;

 var np="";

 for(var i=0; i<rp.length; i++) {
  np+=rp[i];

  var tp=trim(np);

  var fc=tp.charAt(0);
  var lc=tp.charAt(tp.length-1);

  var ok=true;

  if((fc=="'" || fc=="\"") && fc!=lc) ok=false;

  if(ok) {

   np=trim(np);

   var nfc=np.charAt(0);

   if(nfc=="'" || nfc=="\"") {
    var ncontent=np.substring(1, np.length-1);

    np="\""+ncontent+"\"";
   }

   p[j]=eval(np);

   j++;

   np="";
  } else {

   np+=",";
  }
 }

 return p;
}

if (document.all) { // Internet Explorer
  document.onmousemove = captureMousePosition;
} else if (document.getElementById) { // Netcsape 6
  document.onmousemove = captureMousePosition;
}

function captureMousePosition(e) {
 
 if(last_xMousePos>=0) d_xMousePos=last_xMousePos-xMousePos;
 if(d_xMousePos<0) d_xMousePos*=-1;

 if(last_yMousePos>=0) d_yMousePos=last_yMousePos-yMousePos;
 if(d_yMousePos<0) d_yMousePos*=-1;
 
 // 
 last_xMousePos=xMousePos;
 last_yMousePos=yMousePos;
 
 //
 if (document.all) {
  xMouseWinPos=window.event.x;
  yMouseWinPos=window.event.y;
  
   // 
	xMousePos = window.event.x+document.body.scrollLeft;
        yMousePos = window.event.y+document.body.scrollTop;
    } else if (document.getElementById) {
     
        xMouseWinPos=e.pageX-scrollLeft();
       yMouseWinPos=e.pageY-scrollTop();
     //   
        xMousePos = e.pageX;
        yMousePos = e.pageY;
    }

        xMousePosMax = bodyWidth()+scrollLeft()-10;
        yMousePosMax = bodyHeight()+scrollTop()-10;


 if(window.captureMousePosition_plus) window.captureMousePosition_plus(e);
}

// MM Image functions

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

// Layers

function refreshLayer(capa) {
 if(!existLayer(capa)) { valert("refreshLayer: Undefined layer: "+capa); return; }
 
 showLayer(capa, false);
 showLayer(capa, true);
}

function showLayer(capa, show) {
 if(!existLayer(capa)) { valert("showLayer: Undefined layer: "+capa); return; }
 
 //
 if (document.all) {

  if(!document.all[capa]) {
   return;
  }

   if(show)
    document.all[capa].style.visibility = 'visible';
     else
    document.all[capa].style.visibility = 'hidden';

  } else {

   if (document.getElementById) {

    if(!document.getElementById(capa)) return;

    if(show)
     document.getElementById(capa).style.visibility = 'visible';
      else
     document.getElementById(capa).style.visibility = 'hidden';
   }
  }
 }

function getNumber(pixel) {
 var n=""+pixel;

 var i=n.indexOf("px");
 if(i>=0) n=n.substring(0, i);

 return n*1;
}

function initLayer(capa) {
 if(!existLayer(capa)) { valert("initLayer: Undefined layer: "+capa); return; }
 
 if (document.all) {
 
  layer_height[capa]=document.all[capa].offsetHeight;
  layer_width[capa]=document.all[capa].offsetWidth;  
 } 
 
 if (document.getElementById) {

  layer_height[capa]=document.getElementById(capa).offsetHeight;
  layer_width[capa]=document.getElementById(capa).offsetWidth;   
 } 
}

function layerContentWidth(capa) {
 initLayer(capa);

 return layer_width[capa];
}

function layerContentHeight(capa) {
 initLayer(capa);

 return layer_height[capa];
}

function layerTop(capa, value) {
 if(!existLayer(capa)) { valert("layerTop: Undefined layer: "+capa); return; }

 if (document.all) {
  if(value==null) return document.all[capa].style.top; else document.all[capa].style.top=value;
 }

 if (document.getElementById) {
  if(value==null) return getNumber(document.getElementById(capa).style.top); else document.getElementById(capa).style.top=value;
 }

 return null;
}

function layerLeft(capa, value) {
 if(!existLayer(capa)) { valert("layerLeft: Undefined layer: "+capa); return; }

 if (document.all) {
  if(value==null) return document.all[capa].style.left; else document.all[capa].style.left=value;
 }

 if (document.getElementById) {
  if(value==null) return getNumber(document.getElementById(capa).style.left); else document.getElementById(capa).style.left=value;
 }

 return null;
}

function waitOnLoad(param) {

 if(!onload_flag) {
  
  // safety
  olcnt++;
  if(olcnt>=10*60) return;
  
  //
  window.setTimeout("waitOnLoad('"+param+"');", 100);
  
  return;
 }

 if(window.onLoadExec) window.onLoadExec(param);
}

function existLayer(capa) {
 if(!onload_flag) return;
 
 if (document.all) {

  if(!document.all[capa]) return false; else return true;
 }

 if (document.getElementById) {

  if(!document.getElementById(capa)) return false; else return true;
 }

 return false;
}

function bodyHeight() {


 if (document.all) {

  return document.body.clientHeight;
 }

 if (document.getElementById) {
    
  return window.innerHeight;
 }

 return null;
}

function documentHeight() {
 if (document.all) {
  return document.body.offsetHeight;
 }

 if (document.getElementById) {

  return window.outerHeight;
 }

 return null;
}

function documentWidth() {
 if (document.all) {
  return document.body.offsetWidth;
 }

 if (document.getElementById) {

  return window.outerWidth;
 }

 return null;
}

function bodyWidth() {
 if (document.all) {
  return document.body.clientWidth;
 }

 if (document.getElementById) {

  return window.innerWidth;
 }

 return null;
}

function scrollTop() {
 if (document.all) {
  return document.body.scrollTop;
 }

 if (document.getElementById) {
  return window.pageYOffset;
 }

 return null;
}

function scrollLeft() {
 if (document.all) {
  return document.body.scrollLeft;
 }

 if (document.getElementById) {
  return window.pageXOffset;
 }

 return null;
}

function positionLayer(capa, mop_x, mop_y, mop_w, mop_h, offset_x, offset_y) {
  if(!existLayer(capa)) { valert("positionLayer: Undefined layer: "+capa); return; }
  
  // 
  if(layer_width[capa]==null) { valert("Layer ("+capa+") not initialized."); return; }

    if(offset_x==null) offset_x=0;
    if(offset_y==null) offset_y=0;

    if(mop_w==null) mop_w=layerContentWidth(capa);
    if(mop_h==null) mop_h=layerContentHeight(capa);

    layerLeft(capa, mop_x-offset_x);
    layerTop(capa, mop_y-offset_y);

   var body_w=bodyWidth();
   var body_h=bodyHeight();

   var body_sx=scrollLeft();
   var body_sy=scrollTop();

   //??? layerWidth(capa, mop_w+offset_x);
   //??? layerHeight(capa, mop_h+offset_y);

   layerClip(capa, offset_x, offset_y, mop_w, mop_h);

   showLayer(capa, true);
 }

function layerClip(capa, left, top, width, height) {
 if(!existLayer(capa)) { valert("layerClip: Undefined layer: "+capa); return; }
 
 var r="rect("+top+","+(left+width)+","+(top+height)+","+left+")";

 if (document.all) {
  document.all[capa].style.left.clip=r;
 }

 if (document.getElementById) {

  document.getElementById(capa).style.clip=r;
 }
}

function layerInnerHTML(capa, msg) {
  if(!existLayer(capa)) { valert("layerInnerHTML: not existing layer: "+capa); return; }

  if (document.all) {
   var obj=document.all[capa];

   if(obj!=null) obj.innerHTML=msg;
   
   return;
  }

  if (document.getElementById) {
   var obj=document.getElementById(capa);
   
   if(obj!=null) obj.innerHTML=msg;

   return;
  }

  return null;
 }

 function redirectOldBrowser(url) {
  if (!document.all && !document.getElementById) {
   window.location.href=url;
  }
 }

 function getRandomString(len) {
  var str="";

  for(var i=0; i<len; i++) {

   var n=Math.random()*abc_str.length%abc_str.length;

   str+=""+abc_str.charAt(n);
  }

  return str;
 }

function closeDialog() {

 try { 
  if(document.forms["nouser"]) document.forms["nouser"].elements["nouser"].focus();
 }catch(e){}
 
 var capa='dialog';

 if(existLayer(capa)) { 
  // set new content must be before hiding! (otherwise bug crash in safari)
  layerInnerHTML(capa, "<B>&#160;</B>");  
  showLayer(capa, false);   
 } 

}

function keyDown(e) {
 
 if(!e) e=window.event;
  
 var key_ascii=-1;
 var metaKey=false;
 var ctrlKey=false;
 
 if(e.which) {
  key_ascii=e.which;
  
 } else {
  
  if(e.keyCode) {
   key_ascii=e.keyCode;
  }
 }

//
 if(e.metaKey) metaKey=e.metaKey;
 if(e.ctrlKey) ctrlKey=e.ctrlKey;
 
 //
 if(key_ascii==27) {

  closeDialog();
  close_ml();
 }
 
 // 
 var ret=true;

 if(window.keyDown_plus) ret=window.keyDown_plus(key_ascii, metaKey, ctrlKey);
 
 if(!ret) {

  if(e.stopPropagation) { e.stopPropagation(); }
   else e.cancelBubble=true;
   
  if(e.preventDefault) { e.preventDefault(); }
   else e.returnValue=false;
 
  return false;
 }

 return true;
}

document.onkeydown = keyDown;

var mop_timer=null;
var mop_show_timer=null;
var last_msg="";
var mop_msg="";

var mop_xMousePos=-1;
var mop_yMousePos=-1;

function mo_popup(msg) {
  
 // inhibited 
 if(inhibit_mo_popup) {
  if(mop_show_timer!=null) window.clearTimeout(mop_show_timer); 
  smo_popup(false);
  return;
 }

 //if(ml_timer) window.clearTimeout(ml_timer);

 // no msg... remove popup 
 if(!msg || msg.length==0) {
  if(!mop_timer) mop_timer=window.setTimeout("last_msg=''; if(mop_show_timer!=null) window.clearTimeout(mop_show_timer); smo_popup(false)", 100); 
 } else {

  if(mop_timer!=null) window.clearTimeout(mop_timer); 
  mop_timer=null;

  var dx=-1;
  if(mop_xMousePos>=0) {
   dx=mop_xMousePos-xMousePos;
   if(dx<0) dx*=-1;
  }

  var dy=-1;
  if(mop_yMousePos>=0) {
   dy=mop_yMousePos-yMousePos;
   if(dy<0) dy*=-1;
  }
  
  if(last_msg!=msg || (dx>20 || dy>10)) {
     
   smo_popup(false);
   
   mop_xMousePos=xMousePos;  
   mop_yMousePos=yMousePos;  

   if(mop_show_timer!=null) window.clearTimeout(mop_show_timer); 

   mop_msg=msg;
   mop_show_timer=window.setTimeout("smo_popup(true)", 100);
  } 
  last_msg=msg;
 }
}

function smo_popup(show) {
   var msg=mop_msg;

   var capa="mo_popup";        
   if(!existLayer(capa)) return;

   //  
   var mop_x=xMousePos;
   var mop_y=yMousePos;

   var max_w=200;

   //
   if(show) {    

    //
    var msg_fontsize=8;

    var limit_width="";
    if((msg.length*msg_fontsize)>max_w) limit_width="width=\""+max_w+"\"";

    //    
    msg="<TABLE "+limit_width+" align=\"left\" cellspacing=\"0\" cellpadding=\"2\" border=\"0\" style=\"border: solid 1px #cccccc; border-right: solid 1px #818181; border-bottom: solid 1px #818181; \"><TR><TD style=\"background:#FFFF99; font-size:"+msg_fontsize+"pt\"><B>"+msg+"</B></TD></TR></TABLE>";
        
    //
    initLayer(capa);
    layerInnerHTML(capa, "&#160;");
    
    layerLeft(capa, -500);
    layerTop(capa, 10);

    layerInnerHTML(capa, msg);

    if(mop_x+layerContentWidth(capa)>=xMousePosMax)  mop_x=xMousePosMax-layerContentWidth(capa)-15; else mop_x+=15;    
    if(mop_y+layerContentHeight(capa)>=yMousePosMax) mop_y=yMousePosMax-layerContentHeight(capa)-10; else mop_y+=10;

    layerLeft(capa, mop_x);
    layerTop(capa, mop_y);
    
    return;
   }
  
  // * hide
  layerInnerHTML(capa, "&#160;");
 
  return;
}

function countItems(pnr, items) {
 var parts=items.split(",");

 for(var i=0; i<parts.length; i+=2) {
  var item_source=parts[i];
  var item_id=parts[i+1];
  
  if(get_type_id!=null && get_type_id[item_source]==1) {
   phrase_array[pnr][item_source]["_"+item_id]=1;
  } 
  
  if(cnt_item_flag!=null && cnt_item_flag[item_source]==1) {
   var vis=getItemsourceIdAttribute(item_source, item_id, "nr_vis");
   if(!vis) vis=0;
   
   vis++;
   setItemsourceIdAttribute(item_source, item_id, "nr_vis", vis);
  }
 }
}

function getDefaultMultiLinkAttr(item_source, item_id) {

 if(item_source=="GENE") {
  
  return "gene";
 }

 if(item_source=="MeSH") {
  
  return "mesh";
 }
 
 return "";
}

function execSentenceCom(pnr, param, count) {
 var str=param[0];
 str=trim(str);
 
 //
 var single_link="";
 var official_syns_for_multilink="";
 var max_idc=-1;
 var main_idc=-1;
 //
 
 var item_source="";
 var item_id="";

 var link_array=new Array();

 var ml_class_attr="";
 var default_ml_class_attr="";

 for(var i=1; i<param.length; i++) { 
  item_source=param[i];
  i++;
  item_id=param[i];
  i++;
 
  if(window.getMultiLinkAttr && ml_class_attr.length==0) {
   var new_ml_class=getMultiLinkAttr(item_source, item_id);
   if(new_ml_class.length>0) ml_class_attr=new_ml_class;
  }

  if(window.getDefaultMultiLinkAttr && default_ml_class_attr.length==0) {
   var new_ml_class=getDefaultMultiLinkAttr(item_source, item_id);
   if(new_ml_class.length>0) default_ml_class_attr=new_ml_class;
  }
    
  if(count) {
   if(pnr>=0) {
    if(get_type_id && get_type_id[item_source]==1) {
     phrase_array[pnr][item_source]["_"+item_id]=1;
    }  
    
    if(cnt_item_flag!=null && cnt_item_flag[item_source]==1) {
     var vis=getItemsourceIdAttribute(item_source, item_id, "nr_vis");
     if(!vis) vis=0;
   
     setItemsourceIdAttribute(item_source, item_id, "nr_vis", vis+1);
    }   
   }
  }
   
  //
  
  var pairs=new Array();

  var iskey=true;
  
  var key="";
  
  for(; i<param.length; i++) {   
   var signal=param[i];
      
   // get at least one single-link   
   if(signal=="|") {
    var link=getLink(pnr, str, item_source, item_id, pairs);
    
    if(link!=null) {
    
    // get idc
    if(item_source=="GENE") {
      // main idc
      if(window.main_ID && main_ID==item_id) { 
       main_idc=pairs["z"]; 
      }

      // get min idc
      var idc=pairs["z"];
      if(idc>0 && idc>max_idc) max_idc=idc;
    }

    // collect official symbols for the multilink
    if(link[2]!=null && link[2].length>0) {
     if(official_syns_for_multilink.length>0) official_syns_for_multilink+=" / ";
     official_syns_for_multilink+=link[2];
    }	
	
    if(single_link.length==0) {

     if(link[0].length>0) single_link=link[0];   
    }

    // get mulitlink    
    if(link[1].length>0) {
     link_array[link_array.length]=link[1]; 
    }
    }
	 
    //
    break;
   }
   
   if(iskey) {
    key=signal;
    iskey=false;    
   } else {

    pairs[key]=signal;    
    iskey=true;
    
    //
    if(pnr>=0) {

     var only_one=false;
    
     if(cnt_link_attr[key]==1) {
      if(only_one) valert("Cannot do 'cnt_link_attr' for signal: '"+signal+"' (conflicting counter).");
      only_one=true;
     
      //
      if(!phrase_array[pnr][key]) phrase_array[pnr][key]=new Array();
     
      if(!phrase_array[pnr][key][""+signal]) phrase_array[pnr][key][""+signal]=0;
      phrase_array[pnr][key][""+signal]++;
     
      //valert("cnt("+pnr+"): "+key+", "+signal);
     }
    
     //
     if(cnt_different_link_attr[key]==1) {
      if(only_one) valert("Cannot do 'cnt_different_link_attr' for signal: '"+signal+"' (conflicting counter).");
      only_one=true;
   
      //
      if(!phrase_array[pnr][key]) phrase_array[pnr][key]=new Array();

      // ??? should w change signal to _signal EVERYWHERE (only if number!)
      phrase_array[pnr][key][""+signal]=1;     
     }
    } 
    
    //
   }
  }
 }

 //
 if(link_array.length<2) {
  if(single_link.length==0) return str;

  return single_link;
 }

 if(ml_class_attr.length==0) {
  
  if(default_ml_class_attr.length==0) default_ml_class_attr="gene"; 
  
  ml_class_attr="class=\""+default_ml_class_attr+"\" onmouseout=\"return ps();\" onmouseover=\"return ps('MultiLink - This term could not be unambiguously identified. Please click to select.'); \"";
 }
 
 //
 if(official_syns_for_multilink.length==0) official_syns_for_multilink="?";

 // the following has to be a SPAN to work with IE (if href it jumps to the href)
 var link="<A href=\"javascript:if(window.name=='') {{ window.location.href='./nil'; }} else {{ ml('";
 for(var i=0; i<link_array.length; i++) {
  var ln=item_link_array.length;
  item_link_array[ln]=link_array[i];

  if(i>0) link+=",";
  link+=ln;
 }
 
 var rid_msg="iHOP confidence value ("+max_idc+").";

 if(main_idc>=0) {
  if(max_idc>main_idc) {
   rid_msg="iHOP confidence value ("+main_idc+"). Note there are genes matching to this specific site with higher confidence.";
  } else {
   rid_msg="iHOP confidence value of the best gene in this multi-link ("+main_idc+"). Best match at this site.";
  } 
  
  max_idc=main_idc;
 }
 link+="'); }} \""+ml_class_attr+">"+str+" ["+official_syns_for_multilink+"]"+"</A>"+getGeneAttrText_idc(max_idc, 0, rid_msg);
 return link;
}

function shdw_dlg(content) {

//??? preload images!
   var msg="";
   msg+="<TABLE class=\"border_white\" width=\"100px\" cellpadding=\"0\" border=\"0\" cellspacing='0' >";

   msg+="<TR><TD bgcolor=\"#FFFFFF\" >";  
   msg+=content;
   msg+="</TD><TD valign=\"top\" style=\"background-image:url('/UniPub/html/img/dlg/sw_r.png'); background-repeat: repeat-y;\" ><img width=\"5\" height=\"15\" src=\"/UniPub/html/img/dlg/sw_tr.png\" border=\"0\" /></TD></TR>";
   
   msg+="<TR><TD align=\"left\" background=\"/UniPub/html/img/dlg/sw_b.png\"><img  width=\"15\" height=\"6\" src=\"/UniPub/html/img/dlg/sw_bl.png\" border=\"0\" /></TD><TD valign=\"bottom\" style=\"background-image:url('/UniPub/html/img/dlg/sw_r.png'); background-repeat: repeat-y;\" ><img  width=\"5\" height=\"6\" src=\"/UniPub/html/img/dlg/sw_br.png\" border=\"0\" /></TD></TR>";

   msg+="</TABLE>";

 return msg;
}

function multilink(content, header) {
 var capa="ml_popup";
 if(!existLayer(capa)) {
  valert("Layer: "+capa+" is undefined. ");

  return;
 }


 // hide help-layer
 if(!content) {
  showLayer(capa, false);
  ml_in=false;

  return;
 }
 
 // hide mouse-over-msg 
 smo_popup(false);

  //
   if(!header || header.length==0) header="Multilink";

   var msg="";
   msg+="<TABLE class=\"border_dialog\" width=\"100px\" cellpadding=\"2\" border=\"0\" cellspacing='0' >";
   msg+="<TR><TD nowrap=\"1\" class='col_bg_middle'><B>"+header+"</B>";
   msg+="</TD></TR>";
   msg+="<TR><TD bgcolor=\"#FFFFFF\">";
   
   msg+=content;

   msg+="</TD></TR>";
   msg+="</TABLE>";
   
   msg=shdw_dlg(msg);
   
   var mop_x=xMousePos+10;
   var mop_y=yMousePos+10;

    if(!existLayer(capa)) return;

    layerLeft(capa, 0);
    layerTop(capa, 0);

    //
    initLayer(capa);
    showLayer(capa, false);

    //
    layerLeft(capa, -500);
    layerTop(capa, 10);

    layerInnerHTML(capa, msg);

    if(mop_x+layerContentWidth(capa)+2>=xMousePosMax) mop_x=xMousePosMax-layerContentWidth(capa)-5;
    if(mop_y+layerContentHeight(capa)>=yMousePosMax) mop_y=yMousePosMax-layerContentHeight(capa)-5;

    //
    layerLeft(capa, mop_x);
    layerTop(capa, mop_y);

    showLayer(capa, true);
    
  ml_timer=window.setTimeout("ml_in=true;", 1000); 
}

function close_ml() {
 if(ml_timer) window.clearTimeout(ml_timer);
	ps();
 ml();
}

function ml(linknr_str) {
 
 if(!linknr_str) {
  multilink();
  return;
 }


//
   var linknr_array=new Array();

   var link_nrs=linknr_str.split(",");

   var msg="";

   msg+="<TABLE width=\"100%\" cellpadding=\"2\" style=\"background:#FFFFFF;\">";
   for(var i=0; i<link_nrs.length; i++) {
    var linknr=link_nrs[i];
    msg+="<TR>"+item_link_array[linknr]+"</TR>";
   } 
   msg+="</TABLE>";
    
 multilink(msg);
}

function setP(items, str, unipub_id, nr, pmid, ipf, year) {
	
 phrase_index++;

 //
 phrase_array[phrase_index]=new Array();

 for(t in get_type_id) {
  phrase_array[phrase_index][t]=new Array();
 }

 //
 if(items && items.length>0) {
  countItems(phrase_index, items); 
 } else {
  phrase_array[phrase_index]["str"]=evalPhrase(phrase_index, str, true);
 }
    
 phrase_array[phrase_index]["ostr"]=str; 
 phrase_array[phrase_index]["unipub_id"]=unipub_id;
 phrase_array[phrase_index]["pmid"]=pmid;
 phrase_array[phrase_index]["nr"]=nr;
 
 if(year && year>0) {
  phrase_array[phrase_index]["year"]=year;
 }

 if(ipf==null) ipf=-1;
 phrase_array[phrase_index]["ipf"]=ipf;

 // score phrases
 if(window.rf_query && rf_query.length>0) {  
  var score=scorePhrase(str); 
  phrase_array[phrase_index]["sc"]=score;
  if(score>0) noScorePhrase=false;
 }
}

function scorePhrase(str) {
 var cnt=0;
 
 str=str.toLowerCase();
 str=str.replace(/"/g, " "); 
 str=" "+str+" ";
  
 for(var qp=0; qp<rf_query.length; qp++) {     
  var s=rf_query[qp];
  if(s.length==0) continue;
  if(stopw[s]==1) continue; 

   var local_score=0;

  if(s.length<=min_hl_len) {

   if(str.indexOf(" "+s+" ")>=0) local_score=4; 

  } else {

   if(str.indexOf(" "+s+" ")>=0){
    local_score=5; 		
   } else { 

    if(local_score==0 && str.indexOf(" "+s)>=0) local_score=3; 		
    if(local_score==0 && str.indexOf(s+" ")>=0) local_score=2; 		
    if(local_score==0 && str.indexOf(s)>=0) local_score=1;
   }			
						
  }

  //
  if(local_score>0) {
   if(!searchRS["_"+s]) searchRS["_"+s]=0;
   searchRS["_"+s]++;
  }
  
  cnt+=local_score;  		
 }
 
 return cnt;
}

function show_line(pnr) {
 if(!phrase_array[pnr]["str"]) {
  phrase_array[pnr]["str"]=evalPhrase(pnr, phrase_array[pnr]["ostr"], false);
 }
          
 return local_show_line(pnr);
} 

function globalPopitupType(win, url, winname) {
  
 var w=80;
 var h=70;
 var nr=3;

 var style="toolbar=yes,location=no,menubar=yes,status=yes,directories=no,scrollbars=yes,resizable=yes";
 
 return rpopitup(win, url, winname, style, w, h, nr);
}

function Numsort(a,b) { 
 return a-b; 
}

function getKeysSortedByValue(a, value_name, value_is_a_number, ascending) {

 var b=new Array();
  
 var sv=new Array();
  
 for(i in a) {
   
  var value=a[i];
  if(value_name) value=a[i][value_name];
  
  var ar=null;
  
  if(!b[value]) {
   ar=new Array(); 
   
   b[value]=ar;
   
   sv[sv.length]=value;

  } else {
   ar=b[value];
  }
  
  ar[ar.length]=i;   
  b[value]=ar;
    
  //valert(value+": "+ar.join(","));
 }

 if(value_is_a_number) { 
  sv=sv.sort(Numsort);
 } else {
  sv=sv.sort();
 }
 
 //
 var c=new Array();

 var start_i=0;
 var end_i=sv.length;
 var incr_i=1;
  
 if(!ascending) {
  start_i=sv.length-1;
  end_i=-1;
  incr_i=-1;
 } 
   
 for(var i=start_i; i!=end_i; i+=incr_i) {
  
  var ar=b[sv[i]];
  
  //valert(ar.join(","));
  
  for(var j=0; j<ar.length; j++) {
   c[c.length]=ar[j];
  }
 }

 return c;
}

// make string wrapable

  function wrapable(str, max_len, force) {
   if(!max_len || max_len<1) return null;

   var pstr=str.split(" ");
   
   nstr="";
   
   for(var i=0; i<pstr.length; i++) {
    if(i>0) nstr+=" ";

    if(pstr[i].length>max_len) {
     if(!force) {
      return null;
      
     } else {
      
      nstr+=pstr[i].substring(0, max_len)+" "+pstr[i].substring(max_len, pstr[i].length);
     }
    } else {
     nstr+=pstr[i];
    } 
   }
   
   return nstr;
  }
   
  function makeStringWrapable(str, max_len) {
   if(!str || str.length==0) return "";
   
   if(!max_len || max_len<1) return str; 
   if(str.length<max_len) return str;

   var nstr=str;

   var scnt=0;
     
   var ok=true;   
   while(!wrapable(nstr, max_len, false)) {
    
    if(nstr.indexOf("-")>=0) {

     var pstr=nstr.split("-");
   
     nstr="";
    
     for(var i=0; i<pstr.length; i++) {
      if(i>0) {
       var m=Math.round(pstr.length/2);
       if(m==0) m=1;
       if(pstr.length<=2 || i==m) nstr+=" "; else nstr+="-";
      }
     
      nstr+=pstr[i];
     }    
    } else {
     ok=false;
     break;     
    }
        
    scnt++;
    if(scnt==10) break;
    //valert("ba: "+nstr);
   }
   
   scnt=0;
   
   if(!ok) {
    while(!(nstr=wrapable(nstr, max_len, true))) {
     scnt++;
     if(scnt==10) {
      
						valert("force: Could not be wrapped: "+nstr);						
						nstr=nstr.substring(0, max_len);

      break;    
     } 
    }    
   }

   return nstr;       
  }

    function gothispage(exchange_param_array) {     
     if(!clean_url || !param_array) {
      valert("gothispage: clean_url or param_array not defined!");
     }

     if(exchange_param_array!=null && param_array!=null) {
      for(var i=0; i<exchange_param_array.length; i+=2) {
       param_array[""+exchange_param_array[i]]=""+exchange_param_array[i+1];
      }
     }
     
     var params="";
     if(param_array!=null) {
     for(param in param_array) {
      if(params.length==0) params+="?"; else params+="&";
     
      params+=param+"="+param_array[""+param];
     }
     }
     
     window.location.href=clean_url+params;
    }

function getLengthOfAssociativeArray(a) {
 var aic=0;
 
 for(ai in a) {
  aic++;
 }
 
 return aic;
}

//

function getItemsourceIdAttribute(item_source, item_id, key) {
  
 if(new String(item_id).charAt(0)=="_") item_id=item_id.substring(1, item_id.length);

 if(!itemsource_id_sym_hash[item_source]) return null;
 if(!itemsource_id_sym_hash[item_source]["_"+item_id]) return null;
 if(!itemsource_id_sym_hash[item_source]["_"+item_id][key]) return null;

 return itemsource_id_sym_hash[item_source]["_"+item_id][key];
}

function setItemsourceIdAttribute(item_source, item_id, key, value) {
 if(!itemsource_id_sym_hash[item_source]) {
  itemsource_id_sym_hash[item_source]=new Array(); 
 }
 
 if(!itemsource_id_sym_hash[item_source]["_"+item_id]) {
  itemsource_id_sym_hash[item_source]["_"+item_id]=new Array();
 }
 
 itemsource_id_sym_hash[item_source]["_"+item_id][key]=value;  
}

function convertListArrayIntoAssociativeArray(list_array) {
 var a_array=new Array();

 if(list_array.length % 2 !=0) {
  valert("convertListArrayIntoAssociativeArray: Odd length of array: "+list_array);
  return a_array;
 }
 
 for(var i=0; i<list_array.length-1; i+=2) {
  //??? check if styarts with num!
  a_array[list_array[i]]=list_array[i+1];
 }
 
 return a_array;
}

//
function ihop_host() {
 document.write("www.ihop-net.org");
/*
  var host="www.pdg.cnb.uam.es";
	if(window.location.href.indexOf("www.ihop-net.org")>=0) host="www.ihop-net.org";
	document.write(host);
	*/
}

function dn() {
}

// *** menu

// ****** var sspecific to this js

var menu_layer_name=null;

var menu_button_layer_name=null;
var credit_layer_name="credit"; 

var scroll_menu_y=0;

var menu_timer=null;
var scroll_menu_timer=null;

var old_scroll_y=-1;

// **************

function initMenu() {
 
 initLayer(menu_layer_name);
 initLayer(menu_button_layer_name);
 initLayer(credit_layer_name);

 positionMenu();
}

function positionMenu() {

 var scroll_y=scrollTop();
 var body_h=bodyHeight();

 var delay=1;

 if(old_scroll_y>=0 && old_scroll_y!=scroll_y) {
  menu_offset_y=0;

  onStartScroll();

  delay=3;
 } else {

  var unseen_height=layerContentHeight(menu_layer_name)+layerContentHeight(credit_layer_name)+layerContentHeight(menu_button_layer_name)-body_h;

  if(scroll_menu_y!=0) {

   var step=body_h*scroll_menu_y;

   menu_offset_y+=step/4;

   var click_in=50;

   if(scroll_menu_y>0 && menu_offset_y>unseen_height-click_in) {
    menu_offset_y=unseen_height;
    scrollMenuY(0);
   }

   if(scroll_menu_y<0 && menu_offset_y<click_in) {
    menu_offset_y=0;
    scrollMenuY(0);
   }

   //

  }

  positionLayer(menu_layer_name, 0, scroll_y, null, body_h, 0, menu_offset_y);

  var button_layer_y=scroll_y+body_h-layerContentHeight(credit_layer_name);

  positionLayer(credit_layer_name, 0, button_layer_y,null,null,0 ,0);

  if(unseen_height>0) {
   button_layer_y-=layerContentHeight(menu_button_layer_name);
   
   positionLayer(menu_button_layer_name, 0, button_layer_y,null,null,0 ,0);
  } else {

   showLayer(menu_button_layer_name, false);
  }
 }

 old_scroll_y=scroll_y;

 menu_timer=window.setTimeout('positionMenu()', 500*delay);
}

function onStartScroll() {	
	// 
	if(!onload_flag) return true;

	//
 showLayer(menu_layer_name, false); 
	showLayer(credit_layer_name, false);
	showLayer(menu_button_layer_name, false);

}

function scrollMenuY(dir) {
 scroll_menu_y=dir;

 if(dir==0) {
  clearTimeout(scroll_menu_timer);

 } else {

  scroll_menu_timer=setTimeout("scrollMenuY("+dir+");", 100);

  clearTimeout(menu_timer);
  positionMenu();
 }
}

function setMenuLayerName(name) {
 menu_layer_name=name;
}

function setMenuControlLayerName(name) {
 menu_button_layer_name=name;
}

