/* A JavaScript implementation of the SHA-1, as defined in FIPS PUB 180-2
 * Version 1.11 Copyright Brian Turek 2008
 * Distributed under the BSD License
 * See http://jssha.sourceforge.net/ for more information
 *
 * Several functions taken from Paul Johnson
 */

function jsSHA(srcString){jsSHA.charSize=8;jsSHA.b64pad ="";jsSHA.hexCase=0;var sha1=null;var str2binb=function(str){var bin=[];var mask =(1 << jsSHA.charSize)- 1;var length=str.length*jsSHA.charSize;for(var i=0;i<length;i += jsSHA.charSize){bin[i >> 5] |=(str.charCodeAt(i/jsSHA.charSize)& mask)<<(32-jsSHA.charSize-i%32);}return bin;};var strBinLen=srcString.length*jsSHA.charSize;var strToHash=str2binb(srcString);var binb2hex=function(binarray){var hex_tab=jsSHA.hexCase?"0123456789ABCDEF":"0123456789abcdef";var str="";var length=binarray.length*4;for(var i=0;i<length;i++){str += hex_tab.charAt((binarray[i >> 2] >>((3-i%4)* 8+4))& 0xF)+ hex_tab.charAt((binarray[i >> 2] >>((3-i%4)* 8))& 0xF);}return str;};var binb2b64=function(binarray){var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";var length=binarray.length*4;for(var i=0;i<length;i += 3){var triplet =(((binarray[i >> 2] >> 8 *(3-i%4))& 0xFF)<< 16)|(((binarray[i+1 >> 2] >> 8 *(3 -(i+1)% 4))& 0xFF)<< 8)|((binarray[i+2 >> 2] >> 8 *(3 -(i+2)% 4))& 0xFF);for(var j=0;j<4;j++){if(i*8+j*6>binarray.length*32){str += jsSHA.b64pad;}else{str += tab.charAt((triplet >> 6 *(3-j))& 0x3F);}}}return str;};var rotl=function(x,n){if(n<32){return(x <<  n)|(x >>>(32-n));}else{return x;}};var parity=function(x,y,z){return x ^ y ^ z;};var ch=function(x,y,z){return(x & y)^(~x & z);};var maj=function(x,y,z){return(x & y)^(x & z)^(y & z);};var safeAdd=function(x,y){var lsw =(x & 0xFFFF)+(y & 0xFFFF);var msw =(x >>> 16)+(y >>> 16)+(lsw >>> 16);return((msw & 0xFFFF)<< 16)|(lsw & 0xFFFF);};var coreSHA1=function(){var W=[];var a,b,c,d,e;var T;var H=[0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0];var K=[0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x5a827999,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6];var message=strToHash.slice();message[strBinLen >> 5] |= 0x80 <<(24-strBinLen%32);message[((strBinLen+1+64 >> 9)<< 4)+ 15]=strBinLen;var appendedMessageLength=message.length;for(var i=0;i<appendedMessageLength;i += 16){a=H[0];b=H[1];c=H[2];d=H[3];e=H[4];for(var t=0;t<80;t++){if(t<16){W[t]=message[t+i];}else{W[t]=rotl(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16],1);}if(t<20){T=safeAdd(safeAdd(safeAdd(safeAdd(rotl(a,5),ch(b,c,d)),e),K[t]),W[t]);}else if(t<40){T=safeAdd(safeAdd(safeAdd(safeAdd(rotl(a,5),parity(b,c,d)),e),K[t]),W[t]);}else if(t<60){T=safeAdd(safeAdd(safeAdd(safeAdd(rotl(a,5),maj(b,c,d)),e),K[t]),W[t]);}else{T=safeAdd(safeAdd(safeAdd(safeAdd(rotl(a,5),parity(b,c,d)),e),K[t]),W[t]);}e=d;d=c;c=rotl(b,30);b=a;a=T;}H[0]=safeAdd(a,H[0]);H[1]=safeAdd(b,H[1]);H[2]=safeAdd(c,H[2]);H[3]=safeAdd(d,H[3]);H[4]=safeAdd(e,H[4]);}return H;};this.getHash=function(format){var formatFunc=null;if(sha1===null){sha1=sha1=coreSHA1();}switch(format){case "HEX":formatFunc=binb2hex;break;case "B64":formatFunc=binb2b64;break;default:return "FORMAT NOT RECOGNIZED";}return formatFunc(sha1);};}
