

function sha1login() {

  document.forms.login.login_hash.value = sha1sum( document.forms.login.login_password.value );
  document.forms.login.login_password.value = '';

}


function add( a, b, c, d, e ) {

  return ((a | 0) + (b | 0) + (c | 0) + (d | 0) + (e | 0)) & 0xFFFFFFFF;

}


function sha1sum( Data ) {

  HexString = "0123456789abcdef";
  Result = "";
  W = Array( 80 );
  Hash = Array( 5 );
  x = Array();
  working = true;
  DataPos = 0;
  DataSize = Data.length;
  BytesLeft = DataSize;

  Hash[ 0 ] = 0x67452301;
  Hash[ 1 ] = 0xEFCDAB89;
  Hash[ 2 ] = 0x98BADCFE;
  Hash[ 3 ] = 0x10325476;
  Hash[ 4 ] = 0xC3D2E1F0;

  while( working ) {
    if( BytesLeft < 64 ) {
      M = Array( 64 );
      if( BytesLeft >= 0 ) {
        for( i = 0; i < BytesLeft; i++ ) {
          M[ i ] = Data.charCodeAt( DataPos + i );
        }
        M[ BytesLeft ] = 0x80;
        BytesLeft++;
      }
      if( BytesLeft <= 56 ) {
        size_low = DataSize << 3;
        M[ 63 ] = (size_low >>  0) & 0xFF;
        M[ 62 ] = (size_low >>  8) & 0xFF;
        M[ 61 ] = (size_low >> 16) & 0xFF;
        M[ 60 ] = (size_low >> 24) & 0xFF;
        size_high = DataSize >> 29;
        M[ 59 ] = (size_high >>  0) & 0xFF;
        M[ 58 ] = (size_high >>  8) & 0xFF;
        M[ 57 ] = (size_high >> 16) & 0xFF;
        M[ 56 ] = (size_high >> 24) & 0xFF;
        working = false;
      }
      BytesLeft = -1;
      for( t = 0; t < 16; t++ ) {
        W[ t ] = (M[ t * 4 + 0 ] << 24) | (M[ t * 4 + 1 ] << 16) | (M[ t * 4 + 2 ] << 8) | (M[ t * 4 + 3 ] << 0);
        DataPos += 4;
      }
    } else {
      for( t = 0; t < 16; t++ ) {
        W[ t ] = (Data.charCodeAt( DataPos + 0 ) << 24) | (Data.charCodeAt( DataPos + 1 ) << 16) | (Data.charCodeAt( DataPos + 2 ) << 8) | (Data.charCodeAt( DataPos + 3 ) << 0);
        DataPos += 4;
      }
      BytesLeft -= 64;
    }

    for( ; t < 80; t++ ) {
      TEMP = W[ t - 3 ] ^ W[ t - 8 ] ^ W[ t - 14 ] ^ W[ t - 16 ];
      W[ t ] = (TEMP << 1) | (TEMP >>> 31);
    }

    A = Hash[ 0 ];
    B = Hash[ 1 ];
    C = Hash[ 2 ];
    D = Hash[ 3 ];
    E = Hash[ 4 ];

    for( t = 0; t < 20; t++ ) {
      TEMP = ((A << 5) | (A >>> 27)) + ((B & C) | ((~B) & D)) + E + W[ t ] + 0x5A827999;
      E = D;
      D = C;
      C = (B << 30 ) | (B >>> 2);
      B = A;
      A = TEMP & 0xFFFFFFFF;
    }

    for( ; t < 40; t++ ) {
      TEMP = ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + E + W[ t ] + 0x6ED9EBA1;
      E = D;
      D = C;
      C = (B << 30 ) | (B >>> 2);
      B = A;
      A = TEMP & 0xFFFFFFFF;
    }

    for( ; t < 60; t++ ) {
      TEMP = ((A << 5) | (A >>> 27)) + ((B & C) | (B & D) | (C & D)) + E + W[ t ] + 0x8F1BBCDC;
      E = D;
      D = C;
      C = (B << 30 ) | (B >>> 2);
      B = A;
      A = TEMP & 0xFFFFFFFF;
    }

    for( ; t < 80; t++ ) {
      TEMP = ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + E + W[ t ] + 0xCA62C1D6;
      E = D;
      D = C;
      C = (B << 30 ) | (B >>> 2);
      B = A;
      A = TEMP & 0xFFFFFFFF;
    }

    Hash[ 0 ] = ((A | 0) + (Hash[ 0 ] | 0)) & 0xFFFFFFFF;
    Hash[ 1 ] = ((B | 0) + (Hash[ 1 ] | 0)) & 0xFFFFFFFF;
    Hash[ 2 ] = ((C | 0) + (Hash[ 2 ] | 0)) & 0xFFFFFFFF;
    Hash[ 3 ] = ((D | 0) + (Hash[ 3 ] | 0)) & 0xFFFFFFFF;
    Hash[ 4 ] = ((E | 0) + (Hash[ 4 ] | 0)) & 0xFFFFFFFF;
  }

  for( i = 0; i < 5; i++ ) {
    Result += HexString.charAt( (Hash[ i ] >> 28) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >> 24) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >> 20) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >> 16) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >> 12) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >>  8) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >>  4) & 0xF );
    Result += HexString.charAt( (Hash[ i ] >>  0) & 0xF );
  }

  return Result;

}

