/*
#===============================================================================
#
#         FILE:  pmp.js
#
#        USAGE:  ---
#
#      PURPOSE:  JavaScript - Routines for Browser
#
#      OPTIONS:  ---
#      RETURNS:  ---
# REQUIREMENTS:  ---
#     COMMENTS:
#
#       AUTHOR:  Konstantin
#      COMPANY:  SIB & Biozentrum University of Basel
#      VERSION:  $version$
#      CREATED:  7:16:08 PM Oct 20, 2007
#     REVISION:  $rev$
#===============================================================================
*/
// collection of java script code loaded by ajax
var scripts = new Array();

function ClearField(field_id) {
  if(document.getElementById(field_id)) {
    if(document.getElementById(field_id).type == "textarea"){
      document.getElementById(field_id).innerHTML = "";
      document.getElementById(field_id).value = "";
    } else {
      document.getElementById(field_id).value = "";
    }
  }
}
function FillField(field_id, value) {
if(document.getElementById(field_id)) {
    if(document.getElementById(field_id).type == "textarea"){
      document.getElementById(field_id).innerHTML = value;
      document.getElementById(field_id).value = value;
    } else {
      document.getElementById(field_id).value = value;
    }
  }
}


function checkSeq() {
  seq = trim(document.queryBySeq.seq.value);
  if (seq.match(/[^[0-9a-zA-z\n\r\ \t]/)){alert('Please enter alpha-numeric characters only!');return false;}
  if (seq.length > 25) { return true; }
  if (seq.match(/^\d...$/)) { return true; }
  if (seq.match(/^[A-Za-z][0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][0-9]$/)) { return true; }
  alert("Please provide a amino acid sequence query > 30 amino acids!"); return false;
}

function checkAdvQueryInput() {
  var myform=$('queryByAC');
  var myinp=$('ac_input');
  var input =myinp.value;
  var sele=$('advQuerySelector').value;
  switch (sele) {
    case "up":
      if ((input.match(/^[A-Za-z][0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][0-9]$/))
          || (input.match(/^([A-N,R-Z][0-9][A-Z][A-Z, 0-9][A-Z, 0-9][0-9]|[O,P,Q][0-9][A-Z, 0-9][A-Z, 0-9][A-Z, 0-9][0-9]|\w{1,5})_\w{1,5}$/m))) {
        return true; 
      } else {
        alert("Please provide either an UniProt AC or UniProt ID!"); return false;     
      }
    case "entrez":
      if (input.match(/^[0-9]+/m)) {
        return true; 
      } else {
        alert("Please provide an Entrez identifier!"); return false;
      }
    case "gi":
      if (input.match(/^[0-9]+/m)) {
        return true; 
      } else {
        alert("Please provide an gi identifier!"); return false;
      }
    case "ipi":
      if (input.match(/^IPI[0-9]{8}$/m)) {
        return true; 
      } else {
        alert("Please provide an IPI identifier!"); return false;
      }
    case "refseq":
      if (input.match(/[ANXYZ]P_[0-9]{6,9}(\.[0-9]+)?/m)||
         input.match(/[NX][MR]_[0-9]{6,9}(\.[0-9]+)?/m)) {
        return true; 
      } else {
        alert("Please provide a refseq transcript or protein identifier!"); return false;
      }

  }
  alert("Input error occurred");return false;
}


function asyncPart(async_url, field, text) {
  if(!text){  var text = "loading data ...";  }
  text = "<img src=\"images/ajax_working_indicator.gif\" alt=\"Working...\" style=\"vertical-align: middle\" />&nbsp;&nbsp;" + text;
  document.getElementById(field).innerHTML = "<div id=\"asyncpart\">" + text + "</div>";
  var xmlHttp;
  try{
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
  }catch (e){
    // Internet Explorer
    try{
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }catch (e){
      try{
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }catch (e){
        alert("Your browser does not support AJAX!");
        return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
      parseScript(xmlHttp.responseText);
      document.getElementById(field).innerHTML = xmlHttp.responseText;
      // Loop through every script collected and eval it
      for(var i=0; i<scripts.length; i++) {
        try {
          eval(scripts[i]);
        }
        catch(ex) { 
          text = "Error encountered while fetching data!";
          document.getElementById(field).innerHTML = "<div id=\"asyncpart\">" + text + "</div>";
          //~ alert(ex.message);
        // do what you want here when a script fails
        }
      }
    }
  }
  xmlHttp.open("GET",async_url,true);
  xmlHttp.send(null);

}

function changeControlVisibility(estr) {
  eval(estr);
  toggleComparisonControls();
}

function changeLinkToAsync(){
  for (var i = 0; i < document.links.length; ++i){
    if(document.links[i].href.search("modelDetai") != -1 ||
       document.links[i].href.search("queryByAC") != -1){
      document.links[i].href = document.links[i].href+"&zid=async";
    }
  }
  if(document.queryByAC){          document.queryByAC.action             = document.queryByAC.action+"&zid=async"; }
  if(document.queryBySeq){         document.queryBySeq.action            = document.queryBySeq.action+"&zid=async"; }
  if(document.statusQueryBySeq){   document.statusQueryBySeq.action      = document.statusQueryBySeq.action+"&zid=async"; }
  if(document.queryByTemplateID){  document.queryByTemplateID.action     = document.queryByTemplateID.action+"&zid=async"; }
  if(document.queryByText){        document.queryByText.action           = document.queryByText.action+"&zid=async"; }
}

function showTipPreview (location, template, seqid, seqstart, seqend, sid){
    new Tip (location, {
            target: $(location),
            ajax:  {
              url: '?aid=template_tooltip&template='+template+'&seqid='+seqid+
                         '&seqstart='+seqstart+'&seqend='+seqend+'&sid='+sid,
              options: {
              method: 'get'
              }
            },
            className: 'ajax',
            width: '250px',
            hideOn: { element: "tip, target", event: "mouseleave" },
            hideAfter: '1'
//            hook: { tip: 'topLeft', mouse: true },
//            hook: { target: 'topLeft', tip: 'topLeft' },
//            viewport: false,
//            offset: { x: -10, y: -10 }, //no neg offsets in FF!!IE7/8 ok
//          hideOn: { element: 'closeButton', event: 'click' },
   //         hideOn: { element: 'target', event: 'mouseout' },
//          hook: { target: 'bottomMiddle', tip: 'topRight' },
//          stem: 'topRight',
//          offset: { x: 1, y: 1 },
          });
  }


function showTipMQE1 (location, seqid, width){
      new Tip (location, {
              target: $(location),
              ajax:  {
                url: '?aid=tooltip_mqe1&seqid='+seqid+'&wide='+width,
                options: {
                method: 'get'
                }
              },
              className: 'ajax',
              width: width+'px',
              hideOn: { element: "tip, target", event: "mouseleave" },
              hideAfter: '1'
            });
    }


function removeLink(){
  var anchor_list=document.getElementsByTagName("a");
  for (var i = 0; i < anchor_list.length; ++i){
    if(anchor_list[i].id.search("href_") != -1) {
      anchor_list[i].removeAttribute("href");
/*        anchor_list[i].parentNode.removeChild(anchor_list[i]);//too harsh, removes all*/
    }
  }
}


function trim (string) {
  return string.replace (/^\s+/, '').replace (/\s+$/, '');
}

function toggleAsyncDiv(async_url, div_id) {
  if(document.getElementById(div_id).innerHTML == "") {
    asyncPart(async_url, div_id);
  } else {
    document.getElementById(div_id).innerHTML = "";
  }
}

function getmodelCount() {
  var model_count=0;
  var idx=0;
  var myform=$('select_models');
  if (myform){
    var max_count=0;
    var all_elements=new Array();
    all_elements=myform.select('input');
    max_count=all_elements.length;
    if (max_count>0){
      for (var i=0;i<max_count;i++) {
        if (all_elements[i].readAttribute('type')=='checkbox') {
          model_count++;
          idx=i;
        }
      }
    } else {
      return [-1,-1];
    }
  } else {
      return [-1,-1];
  }
  return [model_count,idx];
}

function displayElement(elid,showme){
  var myelement = $(elid)
  if (myelement){
    if (showme==1) {
      myelement.style.display='inline';
    } else {
      myelement.style.display='none';
    }
  }
}

function findCheckBox(){
  document.forms[0].elements[0].style.display='none'
}

/*toggles display by element id*/
function toggleDisplay(elid,myswitch) {
  var myelement = $(elid);
  if (myswitch!=''){

    var myswi= $(myswitch);
    if ((myelement) && (myswi)) {
      if (myelement.style.display == 'none'){
        myswi.update('Hide');
        myelement.style.display='';
      } else {
        myelement.style.display='none';
        myswi.update('Show');
      }
    }
  } else {
    if (myelement){
      if (myelement.style.display=='none'){
        myelement.style.display='inline';
      }else{
        myelement.style.display='none';
      } //show things hidden by default which do not have a switch/link etc
    }
  }
}

function toggleHitCluster(hitcluster_name){
  for(var i = 0; i < document.getElementsByName(hitcluster_name).length; i++){
    var e = document.getElementsByName(hitcluster_name)[i];
    if (e.style.display == '') e.style.display = 'none';
    else e.style.display = '';
  }
  if(document.getElementById('button_'+hitcluster_name)) {
    var re = new RegExp('arrow_right');
    if(re.exec(document.getElementById('button_'+hitcluster_name).innerHTML)){
      document.getElementById('button_'+hitcluster_name).innerHTML = '<img alt=" " src="img/arrow_down.gif" />';
    }else{
      document.getElementById('button_'+hitcluster_name).innerHTML = '<img alt=" " src="img/arrow_right.gif" />';
    }
  }
}

/* collapse/expand-effects - fancy editions*/
function collapseElement(element) {
  new Effect.BlindUp(element, { duration: 0.5 });
}
function expandElement(element) {
  new Effect.BlindDown(element, { duration: 0.5 });
}

function parseScript(_source) {
  var source = _source;


  /* Strip out tags*/
  while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
    var s = source.indexOf("<script");
    var s_e = source.indexOf(">", s);
    var e = source.indexOf("</script", s);
    var e_e = source.indexOf(">", e);

    /* Add to scripts array*/
    scripts.push(source.substring(s_e+1, e));
    /* Strip from source*/
    source = source.substring(0, s) + source.substring(e_e+1);
  }

  /* Return the cleaned source*/
  return source;
}

/* this function opens a link in a new window if rel="external" is specified.
 * replaces target="extern"
 * window.onload line is used to activate it*/
function externalLinks() {
  if (!document.getElementsByTagName) return;
  var anchors = document.getElementsByTagName("a");
  for (var i=0; i<anchors.length; i++) {
    var anchor = anchors[i];
    if (anchor.getAttribute("href") &&
      anchor.getAttribute("rel") == "external")
      anchor.target = "_blank";
  }
}
window.onload = externalLinks;

function getElementsByClassName(classname, node) {
  if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
      if(re.test(els[i].className))a.push(els[i]);
        return a;
}

/*more general function to color any element with any class defined in the style sheet*/
function colorElement(el_id, classname) {
//      element = document.getElementById(el_id);
  var myele=$(el_id);
  if (myele) {
    var ex_class=myele.classNames();
    if (ex_class){
      myele.removeClassName(ex_class);
    }
    Element.addClassName(myele, classname);
    //element.className = classname;
  }
}

/*resets the color to its original value(by seqid) or sets it selected*/
function resetColor(el_id, bChecked){
//      element = document.getElementById(el_id);
  var myelement = $(el_id);
  if (myelement){
    var ex_class=myelement.classNames();
    var re = new RegExp("tableRow.*_(.*)");
    var tableDetected=re.exec(el_id);
    if (bChecked) {
      if (tableDetected) {
//            myelement.className='selected';
        Element.removeClassName(myelement,ex_class);
        Element.addClassName(myelement,'selected_table');
      } else {
        Element.removeClassName(myelement,ex_class);
        Element.addClassName(myelement,'selected');
//            myelement.className = 'selected';
      }
    }else{
      if (tableDetected) {
        if (tableDetected[1] % 2 ==0) {
//              myelement.className='table_bg1';
//              if (myelement.hasClassName('table_bg2')){
//                Element.removeClassName(myelement,'table_bg2');
//              }
          Element.removeClassName(myelement,ex_class);
          Element.addClassName(myelement,'table_bg1');
        } else if (tableDetected[1] % 2 ==1) {
//              myelement.className='table_bg2';
          Element.removeClassName(myelement,ex_class);
          Element.addClassName(myelement,'table_bg2');
        }
      } else {
//            myelement.className='model_bar';
//            myelement.style.borderColor=Bordercolors[myelement.id];
        myelement.removeClassName(ex_class);
        Element.addClassName(myelement, 'model_bar');
        if (Bordercolors[myelement.id]){
          Element.setStyle(myelement, {borderColor: Bordercolors[myelement.id]});
        }
        //~ else{
          //~ alert('noborder color');
        //~ }
      }
    }
  }
}

function deselectAll() {
  for (var j = 0; j <document.select_models.length; j++) {
    var mybox;
    if (document.forms[0].elements[j].type=="checkbox") {
      mybox=document.forms[0].elements[j];
//          mybox=document.select_models.elements[j];
      mybox.checked = false;
/*(\d{1,})_\d{1,}");*/
      var re = /[a-z]{3,5}_([a-zA-Z0-9]+)_(\d+)/i;
      var id=re.exec(mybox.identify());
      resetColor("summaryCluster_"+id[1], mybox.checked);
//          resetColor("tableRow_"+id[0], mybox.checked);
      resetColor(mybox.parentNode.parentNode.id, mybox.checked);
      resetColor("summaryStructure_"+id[1]+'_'+id[2]);
    }
  }  
}

function openWin(link){
  newwin=window.open(link, '_blank');
  if (window.focus) {
    newwin.focus()
  }
  return false;
}
/*on submission of the summary page model selection a few checks are done*/
function validate() {
  var namelist = new Array();
  var counter=0;
  with(document.forms[0]) {
    for(var i = 0; i < elements.length; i++){
      if(elements[i].checked) {
        namelist[counter] = elements[i].value;
        counter++;
      }
    }
  }

if(namelist.length < 2) {
  alert("Please select at least two models/structures!");
  return false;
}
return true;
}

function status_msg(stat_message){
/*    window.status=stat_message;*/
  self.status=stat_message;
  return true;
}

/*dynamically add element, e.g. button to deselect checkboxes*/
 function add_element(id,type,name,value) {
/*Create an input type dynamically.  */
  if ($('select_models')) {
    var element = document.createElement('input');

/*Assign different attributes to the element.*/
    element.setAttribute("type", type);
    element.setAttribute("value", value);
    element.setAttribute("name", name);
    //~ element.setAttribute("id", name);
    if (id=="deselectArea") {
      element.setAttribute("onClick", 'deselectAll()');
      element.onclick=function(){deselectAll();};
    }
    var ele =$(id);

/*Append the element in page (in span).*/
    if (ele) {
      ele.appendChild(element);
    }
  }
}


/*remove element by id*/
function remove_element(myid) {
  
  var ele = document.getElementById(myid);
  ele.parentNode.removeChild(ele.parentNode.getchild(0));
  
}
/*updates the color in the modellist and the modelbar, when a checkbox is selected*/
/*counter is needed as second arg to account for checkboxes being numbered with relative numbers cluding cluster members from modbase*/
function clickSelectCheckbox(elid) {
  var box=$(elid);
  if (box) {
    box.checked=!box.checked;
    var re = /[a-z]{3,5}_([a-zA-Z0-9]+)_(\d+)/i;
    var idbox=re.exec(box.identify());
    if (idbox) {
      var prefix="";
      var idbar="";
      if (idbox[1].length>5){
        prefix="summaryCluster_";
        idbar=prefix+idbox[1];
      }else{
        prefix="summaryStructure_"
        idbar=prefix+idbox[1]+'_'+idbox[2];

      }
      var tablrow=box.parentNode.parentNode.id;
      resetColor(idbar, box.checked);
      resetColor(tablrow, box.checked);
    }
  }
}

function dblClick(link) {
  /*wt=window.setTimeout('if (bIsDblClick) {openWin(\"'+link+'\")}',timeout);*/
  if (bIsDblClick) {
    openWin(link)
  }
  bIsDblClick = false;
}

function sglClick(arg,timeout){
  bIsDblClick = false;
  wt=window.setTimeout('if (!bIsDblClick) {'+arg+'}', timeout);
}



function restoreAnchorLinks(){
    var anchors = document.getElementsByTagName("a");
    var basehref = document.getElementsByTagName("base")[0].href;
    var url = window.location.href;
    if(url.indexOf("#") > 0) url = url.substr(0, url.indexOf("#")); //strip hash
    if(basehref) {
        for(var i = 0; i < anchors.length; i++) {
            var anchor = anchors[i];
            poundPos = anchor.href.indexOf("/#");
            if (poundPos > 0) {
                anchor.href = url + anchor.href.substr(poundPos + 1);
            }
        }
    }

}


