/**
 * John Wästerlund
 * http://www.grunka.se
 *
 * Innehållet får användas fritt med ordentlig källhänvisning.
 * The content may be used freely when properly attributed.
 *
 * Mer information / More information:
 * http://www.grunka.se/articles/Licens
 */
 
function sha1(message){

    var bits = new Array();
    for(var i=0;i<message.length;i++){
        var w = Math.floor(8*i/32);
        var c = message.charCodeAt(i);
        bits[w] |= c << 24-(i*8-w*32);
    }

    var len = message.length*8;

    var w = Math.floor(len/32);
    bits[w] |= 0x1 << 31-(len-w*32);

    while(bits.length*32 % 512 != 448){
        bits[bits.length] = 0;
    }

    bits[bits.length] = (len & 0xffffffff00000000) >>> 32;
    bits[bits.length] = len & 0xffffffff;

    var h = new Array(5);
    h[0] = 0x67452301;
    h[1] = 0xefcdab89;
    h[2] = 0x98badcfe;
    h[3] = 0x10325476;
    h[4] = 0xc3d2e1f0;
    
    for(var i=0;i<bits.length;i+=16){

        var w = new Array(80);
        
        var a = h[0];
        var b = h[1];
        var c = h[2];
        var d = h[3];
        var e = h[4];
        var f = 0;
        
        for(var j=0;j<80;j++){
            if(j<16)
                w[j] = bits[j+i];
            else
                w[j] = leftrotate(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
                
            if(j<20){
                f = (b & c) | ((~b) & d);
                k = 0x5a827999
            }
            else if(j<40){
                f = b ^ c ^ d;
                k = 0x6ed9eba1;
            }
            else if(j<60){
                f = (b & c) | (b & d) | (c & d);
                k = 0x8f1bbcdc;
            }
            else if(j<80){
                f = b ^ c ^ d;
                k = 0xca62c1d6;
            }
            
            var temp = leftrotate(a,5) + f + e + k + w[j];
            e = d;
            d = c;
            c = leftrotate(b,30);
            b = a;
            a = temp;
        }
        
        h[0] += a;
        h[1] += b;
        h[2] += c;
        h[3] += d;
        h[4] += e;
        
    }
    
    var hex = "0123456789abcdef";
    var hash = "";
    
    for(var i=0;i<h.length;i++){
        for(var j=0;j<8;j++){
            hash += hex.charAt((h[i] >> (7-j)*4) & 0xf);
        }
    }
    
    return hash;
}

function leftrotate(x,n){
    return (x << n) | (x >>> (32 - n));
}
