function openHelp( url, window_name ) {

   var hostname    = location.hostname;
   var addr = "";

   if( url.match( /^http\:\/\/.*/ ) ) {
      addr = url;
   } else {
      if( hostname.match( /^mrna.*/ ) ) {
         addr = "http://image.hudsonalpha.org/" + url;
      } else if( hostname.match( /^image.*/ ) ) {
         addr = "http://image.hudsonalpha.org/" + url;
      } // end if
   } // end if

	window.open(addr, window_name, 'WIDTH=500,HEIGHT=500,scrollbars');

}//end openHelp()

//see if input parameter is all digits, or number list or range
function numericEntry( s ) {    //see if argument is all digits (an integer)
   for( var i = 0; i < s.length; i++) {
      var c = s.charAt(i);
      if( (c < '0' || c > '9') && c != '-' && c != ',' && c != ' ' ) {
         return false;
      }//end if
   }//end for
   return true;
}//end allDigits()


//This function checks if the given text has non-white spaces
function isBlank( str ) {
   for( var i=0; i<str.length; ++i ) {
      var ch = str.charAt(i);
      if( (ch != " ") && (ch != "\n") && (ch != "\t")  ) {return false;}
   }
   return true;
}//end isBlank()

function validateText( elt_name, elt_value ) {
   var isValid = true;
   if( list[elt_name] ) {
      var tokens = elt_value.split( /\s*,\s*/ );
      for( var i = 0; i < tokens.length; ++i ) {
         isValid = validateToken( elt_name, tokens[i] );
         if( !isValid ) return false; //NOTE:: add more explicit error code here
      }
   } else {
      isValid = validateToken( elt_name, elt_value );
   }
   return isValid;

}//end validateText()

function validateToken( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   
   //check to see if token is null or not null.
   //if allowed, let token pass; if not, error.
   if( token.match( /^null$/i ) && datatype[elt_name] ) {
      if( nullable[elt_name] ) {
         return true;
      } else {
         alert( "Error: NULL values are not allowed in textbox " + pub_name );
         return false;
      }
   } else if( token.match( /^not null$/i ) && datatype[elt_name] ) {
      if( notNullable[elt_name] ) {
         return true;
      } else {
         alert( "Error: NOT NULL values are not allowed in textbox " + pub_name );
         return false;
      }
   } //end if

   //determine data type of text box and call appropriate function
   if( datatype[elt_name] == "int" ) {
      return validateInt( elt_name, token );
   } else if( datatype[elt_name] == "unsigned_int" ) {
      return validateUint( elt_name, token );
   } else if( datatype[elt_name] == "positive_int" ) {
      return validatePint( elt_name, token );
   } else if( datatype[elt_name] == "float" ) {
      return validateFloat( elt_name, token );
   } else if( datatype[elt_name] == "alphanumeric" ) {
      return validateAnumeric( elt_name, token );
//   } else if( datatype[elt_name] == "keyword" ) {
//      return validateKeyword( elt_name, token );
   } else if( datatype[elt_name] == "none" ) {
      return true;
   } else {
      //don't parse
      alert( "There is no defined data type for textbox " + pub_name + ".\nPlease search on other fields." );
      return false;
   }//end if
   
}//end validateToken()
function validateInt( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   if( token.match( /^\-?\d+$/ ) ) {
      return true;
   } else if( token.match( /^\-?\d+\s*\-\s*\-?\d+$/ ) ) {
      if( !range[elt_name] ) { 
         confirm( "Error: Ranges are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^>=?\s*\-?\d+$/ ) ) {
      if( !min[elt_name] ) { 
         confirm( "Error: Minima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^<=?\s*\-?\d+$/ ) ) {
      if( !max[elt_name] ) { 
         confirm( "Error: Maxima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else {
      confirm( "Error: entry '" + token + "' is invalid input for text box "  + pub_name );
      return false;
   }//end if
}
function validateUint( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   if( token.match( /^\d+$/ ) ) {
      return true;
   } else if( token.match( /^(\d+)\s*\-\s*(\d+)$/ ) ) {
      if( !range[elt_name] ) { 
         confirm( "Error: Ranges are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^>=?\s*\d+$/ ) ) {
      if( !min[elt_name] ) { 
         confirm( "Error: Minima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^<=?\s*\d+$/ ) ) {
      if( !max[elt_name] ) { 
         confirm( "Error: Maxima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else {
      confirm( "Error: entry '" + token + "' is invalid input for text box "  + pub_name );
      return false;
   }//end if
}
function validatePint( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   if( token.match( /[1-9]/ ) && token.match( /^\d+$/ ) ) {
      return true;
   } else if( token.match( /[1-9]\d*\s*\-\s*\d*[1-9]/ ) && token.match( /^\d+\s*\-\s*\d+$/ ) ) {
      if( !range[elt_name] ) { 
         confirm( "Error: Ranges are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /[1-9]/ ) && token.match( /^>=?\s*\d+$/ ) ) {
      if( !min[elt_name] ) { 
         confirm( "Error: Minima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /[1-9]/ ) && token.match( /^<=?\s*\d+$/ ) ) {
      if( !max[elt_name] ) { 
         confirm( "Error: Maxima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else {
      confirm( "Error: entry '" + token + "' is invalid input for text box "  + pub_name );
      return false;
   }//end if
}//end validatePint()


function validateFloat( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   if( token.match( /\d/ ) && token.match( /^[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d{1,3})?$/ ) ) {
      return true;
   } else if( token.match( /\d.*\-.*\d/ ) && token.match( /^[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d{1,3})?\s*\-\s*[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d{1,3})?$/ ) ) {
      if( !range[elt_name] ) { 
         confirm( "Error: Ranges are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^<=?\s*[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d{1,3})?$/ ) ) {
      if( !min[elt_name] ) {
         confirm( "Error: Minima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^>=?\s*[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d{1,3})?$/ ) ) {
      if( !max[elt_name] ) {
         confirm( "Error: Maxima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else {
      confirm( "Error: entry '" + token + "' is invalid input for text box "  + pub_name );
      return false;
   }//end if
   
   return false;
}//end validateFloat()

//NOTE:: this function allows "_"!!
function validateAnumeric( elt_name, token ) {
   var pub_name;
   if( publicname[elt_name] ) {
      pub_name = publicname[elt_name];
   } else {
      pub_name = elt_name;
   }
   if( token.match( /^[\w_]+$/ ) ) {
      return true;
   } else if( token.match( /^[\w_]+\s*\-\s*[\w_]+$/ ) ) {
      if( !range[elt_name] ) { 
         confirm( "Error: Ranges are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^>=?\s*[\w_]+$/ ) ) {
      if( !min[elt_name] ) { 
         confirm( "Error: Minima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else if( token.match( /^<=?\s*[\w_]+$/ ) ) {
      if( !max[elt_name] ) { 
         confirm( "Error: Maxima are not allowed in field " + pub_name );
         return false;
      }
      return true;
   } else {
      confirm( "Error: entry '" + token + "' is invalid input for text box "  + pub_name );
      return false;
   }//end if
   return false;
}//end validateAnumeric()

function validateKeyword( elt_name, token ) {
}

