
var tailCorrect = function( s ) {
  return null != s.match( /[autw]$/ )
}

var headCorrect = function( s ) {
  return null != s.match( /^..[cgs]/ )
}

var auRich = function( s ) {
  verdict = 0
  for ( j = 14; j < s.length; j++ ) {
    if ( 'a' == s[j] ) verdict++
    if ( 'u' == s[j] ) verdict++
    if ( 't' == s[j] ) verdict++
    if ( 'w' == s[j] ) verdict++
    if ( 'c' == s[j] ) verdict --
    if ( 'g' == s[j] ) verdict --
    if ( 's' == s[j] ) verdict --
  }
  return ( 0 < verdict )
}

var matchesValue = function ( s ) {
  return s.match( this.value );
}

var cgNot = function( s ) {
  return null == s.match( /[cgs]{10}/ )
}

allwaysTrue = function( s ) {
  return true
}

var tn = document.createTextNode( "" )

function spaces( n ) {
  answer = ""
  dgts = new String( n ).length
  for ( k = 0; k < n+1 - dgts; k++ ) { answer += " "; }
  return answer
}

var analyzer = {
  "ok": [],
  "mRNA": "",
  "criteria": {},
  "analysis": function( s ) {
    this.mRNA = s
    this.ok = []
    for ( i = 0; i < this.mRNA.length-21; i++ ) {
      this.ok[i] = true
    }
    for ( var f in this.criteria ) {
      for ( i = 0; i < this.ok.length; i++ ) {
        testStrip = this.mRNA.slice( i, i+21 );
        this.ok[i] = ( this.ok[i] && this.criteria[f]( testStrip ) )
      }
    }
    var e = document.getElementById( "results" )
    if ( null != e ) {
      var ourAnswer = ""
      for ( i = 0; i < this.ok.length; i++ ) {
        if ( this.ok[i] ) {
          oneLine = ( i + ": " +  spaces( i ) + this.mRNA.slice( i, i+21 ) + "\n" )
          ourAnswer += oneLine
        }
      }
      try {
        e.removeChild( tn )
      }
      catch (excpt) {
        // ignore node not found
      }
      tn = document.createTextNode( ourAnswer )
      e.appendChild( tn )
    }
  }
}

var ourCriteria = [];
ourCriteria["one"] = tailCorrect;
ourCriteria["two"] = headCorrect;
ourCriteria["three"] = auRich;
ourCriteria["four"] = cgNot;

analyzer.criteria["one"]   = tailCorrect
analyzer.criteria["two"]   = headCorrect
analyzer.criteria["three"] = auRich
analyzer.criteria["four"]  = allwaysTrue // cgNot

function toggle() {
  cname = this.value;
  analyzer.criteria[cname] = this.checked? ourCriteria[cname]: allwaysTrue;
}

window.onload = function() {
  if ( !document.getElementById || !document.createTextNode ) {
    alert( 'No DOM' );
    return;
  }
  var btn = document.getElementById( 'submit_button' );
  if ( null != btn ) {
    btn.onclick = function() {
      rawSeq = document.forms[0].mRNASeq.value;
      filteredSeq = rawSeq.toLowerCase().replace( /\s+/g, '' );
      analyzer.analysis( filteredSeq );
      return false; // Set to false to use only Javascript. Set to true to use CGI.
    }
  }
  var options = document.forms[0].criteria;
  for ( var i = 0; i < options.length; i++ ) {
    options[i].onchange = toggle;
    if ( !ourCriteria[options[i].value] ) {
      optionId = options[i].value;
      pattern = optionId.replace( /n/g, '.' );
      re = new RegExp( pattern );
      fun = function( s ) {
        return s.match( re );
      }
      ourCriteria[optionId] = fun;
      analyzer.criteria[optionId] = options[i].checked? ourCriteria[optionId]: allwaysTrue;
    }
  }
}
