      var dnaDecoder = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
      var rowSeparator = "~";

      function DnaEncode(value) {
        // unencoded value is the sequence of allele in the form
        //     allele^allele^...^allele
        // encoded value is sequence of single characters for each allele

        var encodedValue = "";
        var valueArray = value.split("^");
        for (var i=0; i< valueArray.length; i++) {
          var item = valueArray[i];
          if (item == "" || item == "0" || isNaN(parseInt(item)) || parseInt(item) > 62) {

            encodedValue += "_";
          } else {
            encodedValue += dnaDecoder.charAt(item);
          }
        }
        return encodedValue;
      }

      function DnaDecode(value) {
        decodedValue = "";
        for (var i=0; i<value.length; i++) {
          if (decodedValue != "") {
            decodedValue += "^";
          }
          if (value.charAt(i) != "_") {
            decodedValue += dnaDecoder.indexOf(value.charAt(i));
          } else {
            decodedValue += ".";
          }
        }
        return decodedValue;
      }

      function GetDnaCookie(dnaName) {
        var dnaValue = "";
        var cookieValue = GetCookie("DNA");
        var users = cookieValue.split(rowSeparator);
        for (var i=0; i<users.length; i++) {
          var carrot = users[i].indexOf("^");
          if (users[i].substr(0, carrot) == dnaName) {
            dnaValue = users[i].substr(carrot+1);
            break;
          }
        }
        if (dnaName != "-") {
          dnaValue = DnaDecode(dnaValue);
        }
        return dnaValue;
      }

      function SetDnaCookie(dnaName, dnaValue) {
        // cookie format:
        //    cookie name is DNA
        //    cookie value is:  name^values~name^values~ ... ~name^values

        var cookieValue = GetCookie("DNA");
        var bracketedCookieValue = rowSeparator + cookieValue +rowSeparator;
        var valueStart = bracketedCookieValue.indexOf(rowSeparator + dnaName + "^");
        if (valueStart != -1) { // remove existing value
          var valueEnd = bracketedCookieValue.indexOf(rowSeparator, (valueStart+1));
          valueStart--; // convert to a pointer in cookieValue instead of bracketedCookieValue
          valueEnd--;
          cookieValue =
            cookieValue.substr(0,valueStart) + cookieValue.substr(valueEnd);
        }
        if (dnaValue  != "") {
          if (cookieValue != "") {
            cookieValue += rowSeparator
          }
          if (dnaName != "-") {
            dnaValue = DnaEncode(dnaValue);
          }
          cookieValue += dnaName + "^" + dnaValue;
        }
        SetCookie("DNA", cookieValue);        
      }


