/*
#===============================================================================
#
#         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($(field_id)) {
      if ($(field_id).type=='textarea'){
        $(field_id).clear();
      }else{
        $(field_id).update("");
      }

  }
}

/*Changes style of element */
function ChangeStyle(el_id, new_style) {
  var myele=$(el_id);
  if (myele){
    var ex_class=myele.classNames();
    myele.removeClassName(ex_class);
    myele.addClassName(new_style);
  }
}
 
function FillField(field_id, value) {
  if($(field_id)) {
    if (($(field_id).type=='textarea') || ($(field_id).type=='text')){
      $(field_id).setValue(value);
    }else{
      $(field_id).update(value);
    }
  }
}


function checkSeq() {
  if ($('queryBySeq')) {
    var form = $('queryBySeq');
    var input=form['seq'];
    var seq= $(input).getValue();
    if (!seq){
      alert('Please enter your query!');
      return false;
    }
    if (seq.toLowerCase()=='please enter your query.'){
          alert('Please enter your query!');
          return false;
    }
    type=determineACType('sequence_input');
    changeMainAction('queryBySeq',type);
    var patt=/(^\s*>.+\n){1}/; //remove leading >...\n from fasta string
    patt.compile(patt);
    var fasta_submitted=seq.match(patt);
    seq=seq.replace(patt,""); 

    if ((seq.trim().length<30)&&fasta_submitted)

    { alert('Please provide a amino acid sequence query with more than 30 amino acids!');return false; }
    return true;
  }else{
    return false;
  }
  //~ 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 check_box(myid) {
  if ($(myid)) {
    $(myid).checked=true;
    return true;
  } else {
    return false;
  }
}

function changeMainAction(myid, type){
  if (!$(myid)){
    return false;
  }else{
    if(type.match('up|refseq|ipi|pdb')){
      $(myid).action='query/'+type+'/'+$('sequence_input').value;
      return true;
    }

  }
}

function determineACType(inp_name){

  var myhit='';
  var input=trim($(inp_name).value).toUpperCase();
  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))) {
    myhit='up';
  }else if (input.match(/^[0-9]{4,}/m)){
    myhit='entrez_gi';
  }else if (input.match(/^IPI[0-9]{8}$/m)){
    myhit='ipi';
  }else if (input.match(/[ANXYZ]P_[0-9]{6,9}(\.[0-9]+)?/m)||
         input.match(/[NX][MR]_[0-9]{6,9}(\.[0-9]+)?/m)){
    myhit='refseq';
  }else if (input.match(/^[0-9][A-Z0-9]{3,4}$/m)){
    myhit='pdb';
  }
  return myhit;
}

function checkAdvQueryInput() {
  var myform=$('queryByAC');
  var sele=$('advQuerySelector').value;
  var hit=determineACType('ac_input');
  var hint='';
  if (hit=='up') {
    hint="\nLooks like you entered a Uniprot Accession code or identifier!";
  }else if (hit=='entrez_gi'){
    hint='\nLooks like you entered a entrez/gi identifier!';
  }else if (hit=='ipi'){
    hint='\nLooks like you entered an IPI identifier!';
  }else if (hit=='refseq'){
    hint='\nLooks like you entered a refseq identifier!';
  }else if (hit=='pdb'){
    hint='\nLooks like you entered an Protein Data Bank identifier!';
  }
  switch (sele) {
    case "up":
      if (hit==sele){
        return true;
      }else {
        alert("Please provide either an UniProt AC or UniProt ID!\n"+hint);
        return false;     
      }
    case "entrez":
      if (hit.match(/(entrez)|(gi)/)) {
        return true; 
      } else {
        alert("Please provide an Entrez identifier!"+hint); return false;
      }
    case "gi":
      if (hit.match(/(entrez)|(gi)/)) {
        return true; 
      } else {
        alert("Please provide an gi identifier!"+hint); return false;
      }
    case "ipi":
      if (hit==sele) {
        return true; 
      } else {
        alert("Please provide an IPI identifier!"+hint); return false;
      }
    case "refseq":
      if (hit==sele) {
        return true; 
      } else {
        alert("Please provide a refseq transcript or protein identifier!"+hint); return false;
      }
    case "pdb":
      if (hit==sele) {
        return true; 
      } else {
        alert("Please provide a Protein Data Bank identifier!"+hint); return false;
      }

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

function CheckControls(myurl){
  if (myurl.match(/summarystructure/i)){
      var model_count=getmodelCount();
      if (model_count.length==2){
        toggleComparisonControls(1?model_count[0]>1:0);
      }
    }
}

function asyncPart(async_url, field, error_field, mytext) {
    if(!mytext){  var mytext = "loading data ...";  }
    var mytext = "<img src=\"images/ajax_working_indicator.gif\" alt=\"Working...\" style=\"vertical-align: middle\" />&nbsp;&nbsp;" + mytext;

    new Ajax.Updater( field,
                      async_url,
                      {
                      method: 'get',
                      //~ insertion: 'top',
                      onCreate: function (){ $(field).update("<div id=\"asyncpart\">" + mytext + "</div>");},
                      on404: function (){ $(error_field).update("<div id=\"asyncpart\">Error encountered while fetching data when querying experimental structures!</div>");CheckControls(async_url);},
                      onComplete: function (){
                          $(error_field).remove();
                          CheckControls(async_url);
                        },
                      evalScripts: true
                      });

}

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"; }
  if(document.select_models){        document.select_models.action           = document.select_models.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: '275px',
            hideOn: { element: "tip, target", event: "mouseleave" },
            hideAfter: '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.show();
    } else {
      myelement.hide();
    }
  }
}

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


function toggleComparisonControls(mystate){
  //~ var re = new RegExp("(queryBy).*");
  //~ var ele_id='';
  //~ var ex="<?php echo $GLOBALS['action']?>";
  //~ var id=re.exec(ex);
  //~ alert(id);
  //~ if (id) {
    //~ if (id[1]){
      if (mystate){
        add_element('deselectArea','button','button_all','Deselect All');
        displayElement('selection1',1);
        displayElement('fast_submit',1);
        displayElement('fast_desel',1);

        displayElement('button_all',1); 

        displayElement('deselectArea',1); 
        displayElement('submit_button',1); 
        displayElement('inputArea',1);
        displayElement('structuralComparisonInfo2',1);
        displayElement('structuralComparisonInfo',1);

      } else {
        displayElement('selection1',0);
        displayElement('fast_submit',0);
        displayElement('fast_desel',0);

        displayElement('button_all',0); 

        displayElement('deselectArea',0); 
        displayElement('submit_button',0); 
        displayElement('inputArea',0);
        displayElement('structuralComparisonInfo2',0);
        displayElement('structuralComparisonInfo',0);

        displayElement('select_title_exp',0); //title of select column in list
        displayElement('analysis',0);
        for (var j = 0; j <document.select_models.length; j++) {
          if (document.forms[0].elements[j].type=="checkbox") {
            document.forms[0].elements[j].hide();
          }
      }
      }
    }
  //~ }
//~ }


/*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;
}else if (namelist.length>30){
  alert("You have selected "+namelist.length+" models/structures. Please select a maximum of 30 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);
            }
        }
    }

}



