// Copyright 2004 Paul Cheffers paul@securecottage.com
// 
//
// this is for key generation process
//
// assume client pulls in applet
//



if(typeof BrowserPersistantStorage == "undefined")
{
  BrowserPersistantStorage = false;
}





var genkeys="";

var m = "1";
var rsacmd="nocmd";
var rsavalue="1";
var rsaflag="1";
var rsathing="";

var IfSecure = "; secure";
//var IfSecure = ""; // if not secure web

var SCJRE = true;  // only on xp and vista





var win = new RegExp("Windows");
var SCIsWindows = false;
if(navigator.appVersion.match(win))
{
  SCIsWindows = true;
}

if(typeof DontUseActiveXControl == "undefined")
{

if(document.all && BrowserPersistantStorage == false)
// instantiate the activex control
document.write(
'<OBJECT ID="nantespersistant" WIDTH=0 HEIGHT=0' +
' CODEBASE="' +
mainurlsecure + 'nantespersistant.ocx"' +
' CLASSID="clsid:95913B35-B6A6-4B24-B68C-02ADA6D46533" MAYSCRIPT>' +
'</OBJECT>');

}
if(!document.all && SCIsWindows && BrowserPersistantStorage == false)
{
// for firefox
document.write(
'<object type="application/SecureCottagePersistant" width=0 height=0 ' +  
' id="SecureCottagePersistant" MAYSCRIPT></OBJECT>');
}
var firefoxpluginissupported = navigator.mimeTypes['application/SecureCottagePersistant'];
var firefoxpluginworking = firefoxpluginissupported &&                firefoxpluginissupported.enabledPlugin;

if(firefoxpluginworking
&& BrowserPersistantStorage == false
)SecureCottagePersistant.SetLocation(top.document.location); // prime plugin so CheckForUrl works


var UseJava = 1;
var IEorNetscape = true;


if(navigator.appName == "Netscape" ||
   navigator.appName == "Mozilla")
     IEorNetscape = false;


	 
	 
// 1 use java applet
// 2 use javascript calling java
// 3 use javascript (encryption only)
var mac = new RegExp("Macintosh");
var safari = new RegExp("Safari");

if(navigator.appVersion.match(mac) ||
   navigator.appVersion.match(safari))
{
   UseJava = 3;  // use javascript for macintosh
   document.write('<script src="extended5.js"></script>');
}
else
if(navigator.javaEnabled())
{
  if(navigator.appName == "Netscape")
  {
     UseJava = 2;
  }
  else
  {
    UseJava = 1;
  }
}
else
{
  document.write('<script src="extended5.js"></script>');
  UseJava = 3;
}
var UseActiveXControl = 0;
// 0 use cookie system (insecure)
// 1 use activex control (less insecure)
// 2 use FireFox plugin (less insecure)
// 3 use IE userdata persistant storage
// 4 use Firefox global storage
if(document.all)
{
if(BrowserPersistantStorage == false)
{
try {
      var ifcrookie = nantespersistant.getcrookie();
      UseActiveXControl = 1;   // use activex control
    }
catch(err)
    {
      UseActiveXControl = 0;
    }// use cookie system
}
else UseActiveXControl = 3;
}
else // firefox
{
if(BrowserPersistantStorage == false
   || !window.globalStorage)
{
try {
      var ifcrookie = new Object; // firefox weirdness 
      ifcrookie.value = "";
      SecureCottagePersistant.GetCrookie(ifcrookie);
      UseActiveXControl = 2;   // use activex control
    }
catch(err)
    {
      UseActiveXControl = 0;
    }// use cookie system
}
else UseActiveXControl = 4;

}

function savekeys()
{
   if(UseActiveXControl == 0)
      return;
   if(document.all)
     nantespersistant.savecrookie();
   else SecureCottagePersistant.SaveCrookie();
}
function restorekeys()
{
   if(UseActiveXControl == 0)
      return;
   var i;
   var publics = getcookieVal("publickeys");
   var privates = getcookieVal("privatekeys");
   var publiclist = publics.split(":");
   var privatelist = privates.split(":");

   if(document.all)
     nantespersistant.restorecrookie();  // get old stuff
   else SecureCottagePersistant.RestoreCrookie();

   var oldpublics = getcookieVal("publickeys");
   var oldprivates = getcookieVal("privatekeys");
   var oldpublicslist = oldpublics.split(":");
   var oldprivateslist = oldprivates.split(":");
   
   for(i=0;i<publiclist.length;i++)
   {
      var seen = 0;
      var emaillist = publiclist[i].split("Z");
      for(j=0;j<oldpublicslist.length;j++)
      {
         var emaillistolds = oldpublicslist[j].split("Z");
  //       alert(emaillist[0] + ':' + emaillistolds[0]);
         if(emaillist[0] == emaillistolds[0])
         {
            seen = 1;
         }
      }
      if(seen == 0)setcookieVal("publickeys",publiclist[i]);
      
   }

   for(i=0;i<privatelist.length;i++)
   {
      var seen = 0;
      var emaillist = privatelist[i].split("Z");
      for(j=0;j<oldprivateslist.length;j++)
      {
         var emaillistolds = oldprivateslist[j].split("Z");
    //     alert(emaillist[0] + ':' + emaillistolds[0]);
         if(emaillist[0] == emaillistolds[0])
         {
            seen = 1;
         }
      }
      if(seen == 0)setcookieVal("privatekeys",privatelist[i]);      
   }
   setprivatekeys();

   
}
function generatekeys()
{
	 var primelength = 512;
	 if(typeof rsakeylength != "undefined")
	     primelength = rsakeylength/2;
     
     var rand = new Packages.java.util.Random();
     var retString;
     var certainty=24;
     var bSuccess = 0;
     var p,q,m,tot,temp;
     var one = new Packages.java.math.BigInteger("1");
     var e = new Packages.java.math.BigInteger("23");
   while(bSuccess == 0)
   {

     rand = new Packages.java.util.Random();
     
     p = new Packages.java.math.BigInteger(primelength+2,certainty,rand);
     rand = new Packages.java.util.Random();
     rand = new Packages.java.util.Random();
     q = new Packages.java.math.BigInteger(primelength-2,certainty,rand);
     p = p.abs();
     q = q.abs();
     m = p.multiply(q);
     p = p.subtract(one);
     q = q.subtract(one);
     tot = p.multiply(q);
     tot = tot.abs();
     temp = e.gcd(tot);
     if(temp.equals(one) == true)
     {
       bSuccess = 1;
     }
   }

     d = e.modInverse(tot);

     retString = e.toString(16) + "Z" + d.toString(16) + "Z" +
                 m.toString(16);
     return retString;
     
}
  
  function rsaencrypt(message, e, m)
  {
     var messagebytes;
     var ekey, modulus, plaintext, ciphertext;
     var randomString="";
     var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=:;";
     var i;

     if(message.length == 0)
        return "";

     for(i=0;i<8;i++)
       randomString += alphabet.charAt(Math.floor(Math.random()*78));
    

     ekey = new Packages.java.math.BigInteger(e,16);
     modulus = new Packages.java.math.BigInteger(m,16);
     message = randomString + message;
     messagebytes = new Packages.java.lang.String(message);
     plaintext = new Packages.java.math.BigInteger(messagebytes.getBytes());
     ciphertext = plaintext.modPow(ekey,modulus);
     return ciphertext.toString(16);
  }
  function rsadecrypt(cipher, d, m)
  {
      if(cipher.length == 0)
         return "";
      var plaintextbytes="";
      var plaintexthex;
      var i;
      var dkey, modulus, ciphertext;
     
      dkey = new Packages.java.math.BigInteger(d,16);
      modulus = new Packages.java.math.BigInteger(m,16);
      ciphertext = new Packages.java.math.BigInteger(cipher,16);
      plaintext = ciphertext.modPow(dkey,modulus);
      // Communicator requires the following code, Versions 6 and 7 do not. 
      // remember that plaintexthex is a Java String not a Javascript String.
      plaintexthex = plaintext.toString(16);
      for(i=0;i<plaintexthex.length();i+=2)
      {
         plaintextbytes += fromHex(plaintexthex.substring(i,i+2));
      }
      plaintextbytes = plaintextbytes.substring(8,plaintextbytes.length);
      return plaintextbytes;
  }

  var hexchars="0123456789abcdef";
  // take two ascii hex numbers and convert them to a Javascript character
  function fromHex(str)
  {
    var high=str.substring(0,1);
    var low=str.substring(1,2);
    return String.fromCharCode((16*hexchars.indexOf(high))+hexchars.indexOf(low));
  }


var rsastuff;
var ekey;
var dkey;
var modulus;

var rsakeylength = 1024;
SCnumbersize = rsakeylength/16;

function genrsa()
{
	if(typeof SCnumbersize != "undefined")
	  SCnumbersize = rsakeylength/16;
	  
   if(UseJava == 2) // Netscape or Mozilla with Java support
   {
     document.getElementById("keysmessage").innerHTML="Generating RSA Keys Now!";
     genkeys = generatekeys();
     cmdMsg1();
   }
   else
   {
   m="1";
   genkeys="1";
   rsacmd="genkeys";
   document.getElementById("keysmessage").innerHTML="Generating RSA Keys Now!";

   setTimeout("cmdMsg1()",1000);
   }
}
function cmdMsg1()
{
	var ModInverse = "";
   if(genkeys == "1")
     setTimeout("cmdMsg1()",1000);
   else
   {
   document.getElementById("keysmessage").innerHTML="RSA Keys have been generated";
   document.getElementById("ekeymessage").innerHTML = "ekey: " + genkeys.split("Z")[0];
   document.getElementById("dkeymessage").innerHTML = "dkey: " + genkeys.split("Z")[1];
   document.getElementById("modulusmessage").innerHTML = "modulus: " + genkeys.split("Z")[2];
   
   var numbersize=64;
   
   if(typeof SCnumbersize != "undefined")
      numbersize = SCnumbersize;
   
   // create the inverse of the modulus
   ModInverse = tohex1(modulusinverse(hexnum(genkeys.split("Z")[2]),numbersize),numbersize*2);
   if(ModInverse != "")
      genkeys += "Z" + ModInverse;
	  
   document.getElementById("modulusmessageinverse").innerHTML = "modulus inverse: " + genkeys.split("Z")[3];

    var privatestuff = getcookieVal("privatekeys");
    var emailaddress = document.rsait.emailaddress.value;
    setcookieVal("privatekeys",emailaddress + "Z" + genkeys);
    // add to public key ring too
    var publickey = genkeys.split("Z");
    setcookieVal("publickeys",emailaddress + "Z" + publickey[0] + "Z"
                  + publickey[2]);
    setprivatekeys();
   }
}
function jsrsaenc()
{
//rsastuff = genkeys;
var rsastuff = document.rsait.encryptkey.options[document.rsait.encryptkey.selectedIndex].value;
ekey = rsastuff.split("Z")[1];
modulus = rsastuff.split("Z")[2];
var tempval1 = document.rsait.rsaitem.value;
var tempval2 = "";
var retval = "";
var e = hexnum(ekey);
var m = hexnum(modulus);
var StringLength = 100;
var numbersize = 64;

if(typeof SCnumbersize != "undefined")
	numbersize = SCnumbersize;

var invert = modulusinverse(m,numbersize);

while(tempval1 != "")
{
  if(tempval1.length <= StringLength)
  {
     tempval2 = tempval1;
     tempval1 = "";
  }
  else
  {
     tempval2 = tempval1.substring(0,StringLength);
     tempval1 = tempval1.substring(StringLength);
  }
  var message = intonum(tempval2);
  retval += tohex1(modpowwithinverse(message,e,m,invert,numbersize),numbersize) + "Z";
}
document.rsait.rsaitem.value = retval;
}
// when netscape, mozilla and java support
function netscapersadec(what,dkey,modulus)
{
            var decrypted="";
            var subdecrypted="";
            var newwhat = "";
            var i,j;

            

            // get rid of \n and spaces
            for(i=0;i<what.length;i++)
            {
              if(what.charAt(i) == ' ' ||
                 what.charAt(i) == '\t' ||
                 what.charAt(i) == '\n' ||
                 what.charAt(i) == '\r')
                 continue;
              else newwhat += what.charAt(i);
            }
            what = newwhat;  // stripped of newlines and spaces.
            while(what.length>0)
            {
              j=what.indexOf('Z');
              if(j==-1)
              {
                subdecrypted = what;
                what = "";
              }
              else
              {
                subdecrypted =what.substring(0,j);
                if(j>=what.length)
                   what = "";
                else
                  what = what.substring(j+1);
              }
              
              decrypted += rsadecrypt(subdecrypted,dkey,modulus);
              subdecrypted = "";
            }

            return decrypted;
}
function netscapersaenc(plaintext)
{
//rsastuff = genkeys;
var rsastuff = document.rsait.encryptkey.options[document.rsait.encryptkey.selectedIndex].value;
ekey = rsastuff.split("Z")[1];
modulus = rsastuff.split("Z")[2];
var tempval1 = plaintext; //document.rsait.rsaitem.value;
var tempval2 = "";
var retval = "";
var e = ekey;
var m = modulus
var StringLength = 100;

while(tempval1 != "")
{
  if(tempval1.length <= StringLength)
  {
     tempval2 = tempval1;
     tempval1 = "";
  }
  else
  {
     tempval2 = tempval1.substring(0,StringLength);
     tempval1 = tempval1.substring(StringLength);
  }
  var message = tempval2;
  retval += rsaencrypt(message,e,m) + "Z";
}
//document.rsait.rsaitem.value = retval;
  return retval;
}

function rsaenc()
{
   if(UseJava == 2) // netscape,mozilla and java support
   {
      document.rsait.rsaitem.value =
            netscapersaenc(document.rsait.rsaitem.value);
      return;
   }

//rsastuff = genkeys;
var rsastuff = document.rsait.encryptkey.options[document.rsait.encryptkey.selectedIndex].value;
ekey = rsastuff.split("Z")[1];
//dkey = rsastuff.split("Z")[1];
modulus = rsastuff.split("Z")[2];
rsaitemform="rsait";
rsaitemelement="rsaitem";
rsacmd="encrypt";
rsaflag="1";
//document.getElementById("rsamessage").innerHTML = "Encrypting message now";
setTimeout("cmdMsg2()",1000);
}
function cmdMsg2()
{
   if(rsaflag == "1")
     setTimeout("cmdMsg2()",1000);
//   else
//     document.getElementById("rsamessage").innerHTML="Hit 'decrypt' to decrypt message";
}

function findtobedecryptedtext(oldfield)
{
var re1 = new RegExp("^[\>]*([a-f0-9ZY!\s]+)$");
var re2 = new RegExp("^.*Z\s*$");
var re3 = /[\r\n]+/;

var i;
var oldfieldlines = oldfield.split(re3);
var indecrypted=0;
var tobedecrypted="";
var possibleend=0;
var foundit=0;

for(i=0;i<oldfieldlines.length&&foundit==0;i++)
{
   
   if(oldfieldlines[i].match(re1))
   {
       indecrypted=1;
       tobedecrypted += RegExp.$1 + "\n";
       if(oldfieldlines[i].match(re2))
       {
          possibleend = 1;
       }
       else
       {
         possibleend = 0;
       }
        
   }
   else if(indecrypted==1)
   {
       indecrypted=0;
       if(possibleend == 1)
       {
         foundit=1;
       }
       else
       {
         tobedecrypted="";
         possibleend = 0;
       }
   }       
}  
    if(possibleend == 1)
        return tobedecrypted;
    else return "";
}


function rsadec()
{
//var genkeys = getcookieVal("privatekeys");
var genkeys = document.rsait.privatekeyring.options[
        document.rsait.privatekeyring.selectedIndex ].value;

var oldfield = document.rsait.rsaitem.value;

//var re1 = /([^a-f0-9ZY!\s]+)/;
//re1.exec(oldfield);
//if(RegExp.$1 != "")
//{
//   alert("You must only have the hexidecimal number with the 'Z'\n" +
//         "in the field.  The following is invalid: \n\n" +
//          RegExp.$1);
//   return;
//}


var tobedecrypted = findtobedecryptedtext(oldfield);

if(tobedecrypted == "")
{
   alert("There is nothing to be decrypted!");
   return;
}

document.rsait.rsaitem.value = tobedecrypted;

rsastuff = genkeys;
ekey = rsastuff.split("Z")[1];
dkey = rsastuff.split("Z")[2];
modulus = rsastuff.split("Z")[3];

if(UseJava == 2)  // netscape and mozilla with java support
{
  document.rsait.rsaitem.value =
     netscapersadec(document.rsait.rsaitem.value,dkey,modulus);
  return;
}



rsaitemform="rsait";
rsaitemelement="rsaitem";
rsaflag="1";
//document.getElementById("rsamessage").innerHTML="Decrypting message Now";
rsacmd="decrypt";
setTimeout("cmdMsg3()",1000);
}
function cmdMsg3()
{
   if(rsaflag == "1")
     setTimeout("cmdMsg3()",1000);
//   else
//     document.getElementById("rsamessage").innerHTML="Hit 'encrypt' to encrypt message";
}
function publishpublickey()
{
    setTimeout("publishpublickey1()",500);
}
function publishpublickey1()
{
   var genkeys;
   var apassword="";
   if(document.rsait.thepassword)
     apassword = document.rsait.thepassword.value;

   genkeys = document.rsait.privatekeyring.options[
       document.rsait.privatekeyring.selectedIndex].value;
   var genkeys1 = genkeys.split("Z");

   //document.location.href =
//   window.open("https://www.securecottage.com/cgi-bin/logpublickeys1.cgi?name=" +
//   (document.rsait.privatekeyring.options[
//            document.rsait.privatekeyring.selectedIndex].value).split("Z")[0]
//
//   + '&' +
//   "publickey=" + genkeys.split("Z")[0] + "Z" +
//                  genkeys.split("Z")[2],"newwindow","height=300,width=300");
   var newhtml =
         mainurlsecure + 'cgi-bin/logpublickeys1.cgi?name=' +
   genkeys1[0] + '&password=' + apassword 
   + '&' +
   "publickey=" + genkeys1[1] + "Z" +
                  genkeys1[3];
	
	if(genkeys1.length >= 5)
	{
	    newhtml += "Z" + genkeys1[4];
	}
   
   document.location.href = newhtml;
  // window.open(newhtml,"newwindow","height=300,width=300");

   
}
function getcookieVal(cookieName)
{
  
  var aCookie = "";
  var thisCookie;
  if(UseActiveXControl == 0)
      aCookie = document.cookie;
  else if(UseActiveXControl == 1)
  {
    try {
        aCookie = nantespersistant.getcrookie();
    } catch(err) { alert("nantespersistant method call failed");}
  }
  else if(UseActiveXControl == 2)
  {
    try { var bCookie = new Object; // mozilla weirdness
          bCookie.value = "";
          SecureCottagePersistant.GetCrookie(bCookie);
          aCookie = bCookie.value;
        }
    catch(err) { alert("SecureCottagePersistant method call failed");}
  }
  else if(UseActiveXControl == 3)  // ie userdata
  {
     aCookie = UserDataLoad("crookie");
  }
  else if(UseActiveXControl == 4) // globalStorage
  {
     aCookie = GlobalStorageLoad("crookie");
  }

  thisCookie = aCookie.split("; ");

//  var thisCookie = document.cookie.split("; ");
  var i;
  var retCookie = "";
  for(i=0;i<thisCookie.length;i++)
  {
     if(cookieName == thisCookie[i].split("=")[0].substring(0,cookieName.length))
     {
       if(retCookie == "")
           retCookie = thisCookie[i].split("=")[1];
       else
           retCookie += ":" + thisCookie[i].split("=")[1];
     }
  }
  return retCookie;

}

function setvisiblekeys()
{
if(document.cookie != "")
{
  //genkeys = document.cookie.split("=")[1];
  genkeys = getcookieVal("privatekeys");
 if(genkeys != "")
 { 
  document.getElementById("ekeymessage").innerHTML = "ekey: " + genkeys.split("Z")[0];
  document.getElementById("dkeymessage").innerHTML = "dkey: " + genkeys.split("Z")[1].substring(0,20);
  document.getElementById("modulusmessage").innerHTML = "modulus: " + genkeys.split("Z")[2].substring(0,20);
 }
}
}

function donothing()
{
}

function setpublickeys()
{
   var publick = getcookieVal("publickeys");
   var publicarray = publick.split(":");
   var i;
   var newoption;
   if(publick == "")
     return;
   for(i=0;i<publicarray.length;i++)
   {
      var publica = publicarray[i].split("Z");
      newoption = new Option(publica[0],publicarray[i]);
      document.rsait.encryptkey.options[i] = newoption;
   }
   document.rsait.encryptkey.selectedIndex = 0;
}
function setprivatekeys()
{
   var publick = getcookieVal("privatekeys");
   var publicarray = publick.split(":");
   var i;
   var newoption;
   for(i=0;i<publicarray.length;i++)
   {
      var publica = publicarray[i].split("Z");
      newoption = new Option(publica[0],publicarray[i]);
      document.rsait.privatekeyring.options[i] = newoption;
   }
   document.rsait.privatekeyring.selectedIndex = 0;
}

function copyText(theSel) {
   if (!document.all) return; // IE only
  //var theForm = theSel.form;
  //theForm.rsaitem.value=theSel.value;
  var r=document.rsait.rsaitem.createTextRange();
 
  r.select();
  r.execCommand('copy');
}
function constructdata(data)
{
        var rsathing="";
        var i,j;
        var paramlength=500;
        var tempmessage = "";

        for(j=1,i=0;i<data.length;i+=paramlength)
        {
          if(i+paramlength < data.length)
            tempmessage = 'data' + j + '=' + data.substring(i,i+paramlength) + '&';
          else
            tempmessage = 'data' + j + '=' + data.substring(i);

          rsathing += tempmessage 
          j++

        }
        return rsathing;
}
var theemailaddress="";
var thedata="";

function sendemail(emailaddress)
{
   var emailaddress = document.rsait.encryptkey.options[document.rsait.encryptkey.selectedIndex].text;
   theemailaddress = emailaddress;
   thedata = document.rsait.rsaitem.value;
//   window.open('https://www.securecottage.com/cgi-bin/sendemail.cgi?name=' + emailaddress 
// //  + '&data=' + document.rsait.rsaitem.value,'emailwindow','height=300,width=300,scrollbars=yes');
//     + '&' + constructdata(document.rsait.rsaitem.value) ,'emailwindow','height=300,width=300,scrollbars=yes');
   window.open('https://www.securecottage.com/sendemail.html',
               'emailwindow','height=300,width=300,scrollbars=yes');


}
function setcookieVal(name,value)
{
   var thisCookie = getcookieVal(name);
   var i;
   if(thisCookie == "")
       thisCookie = value;
   else
   {
       thisCookie = value  + ":" + thisCookie;
   } 
   var newCookie = insertcookie(name,thisCookie); 
   var ExpireDate = new Date();
   ExpireDate.setYear(ExpireDate.getYear() + 1910);
   
   if(UseActiveXControl == 0)
   {
   
     var differentCookies = newCookie.split("; ");
     for(i=0;i<differentCookies.length;i++)
     {
       document.cookie =  differentCookies[i] + 
          "; path=/; expires=" + ExpireDate.toGMTString() + IfSecure;
     }
   }
   else if(UseActiveXControl == 1)
   {
     try { 
           nantespersistant.setcrookie(newCookie)
         }
     catch(err)
     { alert("error in setcrookie method for nantespersistant activex control");}
   }
   else if(UseActiveXControl == 2)
   {
     try { 
           SecureCottagePersistant.SetCrookie(newCookie);
         }
     catch(err)
     { alert("error in SetCrookie method for SecureCottagePersistant activex control");}
   }
   else if(UseActiveXControl == 3) // IE USERDATA
   {
      UserDataSave("crookie",newCookie);
   }
   else if(UseActiveXControl == 4) // globalStorage
   {
      GlobalStorageSave("crookie",newCookie);
   }

}
function deletecookie(cooke)
{
     var ExpireDate = new Date();
     ExpireDate.setTime(ExpireDate.getTime()-1);
     document.cookie =  cooke + 
          "; path=/; expires=" + ExpireDate.toGMTString() + IfSecure;
}
function insertcookie(name,value)
{
//  var thisCookie = document.cookie.split("; ");
  var thisCookie;
  
  var aCookie = "";
  if(UseActiveXControl == 0)
     aCookie = document.cookie;
  else if(UseActiveXControl == 1)
  {
    try { 
        aCookie = nantespersistant.getcrookie();
    } catch(err) { alert("error in activex method call");}
  }
   else if(UseActiveXControl == 2)
   {
     try { 
           var bCookie = new Object;
           bCookie.value = "";
           SecureCottagePersistant.GetCrookie(bCookie);
           aCookie = bCookie.value;
         }
     catch(err)
     { alert("error in SetCrookie method for SecureCottagePersistant activex control");}
   }
   else if(UseActiveXControl == 3)
   {
      aCookie = UserDataLoad("crookie");
   }
   else if(UseActiveXControl == 4) // globalStorage
   {
     aCookie = GlobalStorageLoad("crookie");
   }


  thisCookie = aCookie.split("; ");
  var i;
  var newCookie = "";
  var bSeenName = 0;

  for(i=0;i<thisCookie.length;i++)
  {
     if(thisCookie[i] == "")
       continue;
     if(name == thisCookie[i].split("=")[0].substring(0,name.length))
     {
       //newCookie += name + "=" + value + "; ";
       // delete the cookie, we already have the cookie in value
//       deletecookie(thisCookie[i]);
       bSeenName = 1;
     }
     else
       newCookie += thisCookie[i] + "; ";
     
  }
  if(bSeenName == 0)
  {
       newCookie += name + "1" + "=" + value + "; ";
  }
  else
  {
     var cookiearray = value.split(":");
     var i,j,k;
     var cookieLength = 3000;
     var acookie = "";
     for(i=0,j=0,k=1;i<cookiearray.length;i++)
     {
        j += cookiearray[i].length;
        if(acookie == "")
           acookie = cookiearray[i];
        else
           acookie += ":" + cookiearray[i]; 
        if(j > cookieLength || i+1 == cookiearray.length)
        {
           newCookie += name + k + "=" + acookie + "; ";
           j = 0;
           k++;
           acookie = "";
        }
     }
  }
  
  return newCookie;
}
function cookieVal(cookieName)
{
  var thisCookie = document.cookie.split("; ");
  var i;
  for(i=0;i<thisCookie.length;i++)
  {
     if(cookieName == thisCookie[i].split("=")[0])
     {
       return thisCookie[i].split("=")[1];   
     }
  }
  return "";
  
}
// ecommerce functions
function gatherform()
{
  var i,j;
  var formstuff="";
  customer = emailaddress;
  for(j=0;j<document.forms.length;j++)
  {
  for(i=0;i<document.forms[j].elements.length;i++)
  {
     if(document.forms[j].elements[i].type != "submit" &&
        document.forms[j].elements[i].type != "reset")
     formstuff = formstuff + document.forms[j].elements[i].name +
     ":" + document.forms[j].elements[i].value + "\n";
  }
  }
   if(UseJava == 1) // use applet
   {
     rsathing=formstuff;
     rsaflag="1";
     rsacmd="encryptelement";
     
     setTimeout("cmd1()",500);
   }
   else if(UseJava == 2) // netscape,mozilla and java support
   {
      formstuff = netscapersaenc(formstuff);
      rsaflag = 2;
      cmd1();
   }
   
   else
   {
        var tempmessage;
        var i;
        var e = hexnum(ekey);
        var m = hexnum(modulus);
		
		var numbersize = 64;
		if(typeof SCnumbersize == "undefined")
		  numbersize = SCnumbersize;

        rsathing="";

        for(i=0;i<formstuff.length;i+=100)
        {
          if(i+100 < formstuff.length)
            tempmessage = formstuff.substring(i,i+100);
          else
            tempmessage = formstuff.substring(i);

          var message = intonum(tempmessage);
          var power = modpow(message,e,m,numbersize);
          rsathing += tohex(power) + "Z";

        }
     
        rsaflag = 2;
        cmd1();
     
   }
}

function cmd1()
{
   if(rsaflag=="1")
      setTimeout("cmd1()",500);
   else
   {
   document.location.href =
   mainurlsecure + 'cgi-bin/creditcard.cgi?name="' + emailaddress + '&' + 
   "data=" + rsathing;
   }
}


function checkforpublickey(emailaddress)
{
  return checkforapublickey(document.rsait.encryptkey,emailaddress);
}
function checkforapublickey(publickeys,emailaddress)
{
   var retString = "";
   var i;
   var aemailaddress; 
   for(i=0;i<publickeys.length;i++)
   {
      aemailaddress = publickeys.options[i].value;
      
      if(aemailaddress == emailaddress)
      {
        retString = aemailaddress;
        break;
      }
     
   }
   return retString;
}
function checkforprivatekey(privatekeys,emailaddress)
{
   var retString = "";
   var i;
   var aemailaddress; 
   for(i=0;i<privatekeys.length;i++)
   {
      aemailaddress = privatekeys.options[i].text;
      if(aemailaddress == emailaddress)
      {
        retString = aemailaddress;
        break;
      }
     
   }
   return retString;
}
  
function GlobalStorageSave(key,value)
{
  if(localStorage)
  {
     localStorage.setItem(key,value);
  }
  if(1==0 && globalStorage)
  {
    eval ("globalStorage['www.securecottage.com']." +
          key + "='" + value + "'");
  }
}
function GlobalStorageLoad(key)
{
  var retc = "";
  if(localStorage)
  {
     return localStorage.getItem(key);
  }

  if(1==0 && globalStorage)
  {
     retc =     eval ("globalStorage['www.securecottage.com']." +
          key );
     if (retc == null)
        retc.value = "";
     
     return retc.value;
     
  }
  return "";
}
function UserDataSave(key,value)
{
  PersistElement.setAttribute(key,value);
  PersistElement.save("oXMLStore");
}
function UserDataLoad(key)
{
  PersistElement.load("oXMLStore");
  var retc = PersistElement.getAttribute(key);
  if(retc == null)
    retc = "";
  return retc;
}
