1 /*jslint 
  2 bitwise: false,
  3 browser: true,
  4 nomen: false,
  5 debug: true,
  6 eqeqeq: false,
  7 forin: true,
  8 laxbreak: true,
  9 plusplus: false,
 10 newcap: false,
 11 undef: false,
 12 white: false,
 13 onevar: false 
 14  */
 15 var sc;
 16  
 17 /*
 18 	We're more lax with JSLint here because this is almost all not our code
 19 */
 20 
 21 /**
 22  * Licence
 23  * As long as you leave the copyright notice of the original script, or link
 24  * back to this website, you can use any of the content published on this
 25  * website free of charge for any use: commercial or noncommercial.
 26  * http://www.webtoolkit.info/licence.html
 27  */
 28 
 29 
 30 /**
 31 *
 32 *  Base64 encode / decode
 33 *  http://www.webtoolkit.info/
 34 * @namespace
 35 **/
 36 sc.helpers.Base64 = {
 37 
 38 	// private property
 39 	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 40 
 41 	/**
 42 	* public method for encoding
 43 	* @function
 44 	* @name sc.helpers.Base64.encode
 45 	*/
 46 	encode : function (input) {
 47 		var output = "";
 48 		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
 49 		var i = 0;
 50 
 51 		input = sc.helpers.Base64._utf8_encode(input);
 52 
 53 		while (i < input.length) {
 54 
 55 			chr1 = input.charCodeAt(i++);
 56 			chr2 = input.charCodeAt(i++);
 57 			chr3 = input.charCodeAt(i++);
 58 
 59 			enc1 = chr1 >> 2;
 60 			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
 61 			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
 62 			enc4 = chr3 & 63;
 63 
 64 			if (isNaN(chr2)) {
 65 				enc3 = enc4 = 64;
 66 			} else if (isNaN(chr3)) {
 67 				enc4 = 64;
 68 			}
 69 
 70 			output = output +
 71 			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
 72 			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 73 
 74 		}
 75 
 76 		return output;
 77 	},
 78 
 79 	/**
 80 	* public method for decoding
 81 	* @function
 82 	* @name sc.helpers.Base64.decode
 83 	*/
 84 	decode : function (input) {
 85 		var output = "";
 86 		var chr1, chr2, chr3;
 87 		var enc1, enc2, enc3, enc4;
 88 		var i = 0;
 89 
 90 		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 91 
 92 		while (i < input.length) {
 93 
 94 			enc1 = this._keyStr.indexOf(input.charAt(i++));
 95 			enc2 = this._keyStr.indexOf(input.charAt(i++));
 96 			enc3 = this._keyStr.indexOf(input.charAt(i++));
 97 			enc4 = this._keyStr.indexOf(input.charAt(i++));
 98 
 99 			chr1 = (enc1 << 2) | (enc2 >> 4);
100 			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
101 			chr3 = ((enc3 & 3) << 6) | enc4;
102 
103 			output = output + String.fromCharCode(chr1);
104 
105 			if (enc3 != 64) {
106 				output = output + String.fromCharCode(chr2);
107 			}
108 			if (enc4 != 64) {
109 				output = output + String.fromCharCode(chr3);
110 			}
111 
112 		}
113 
114 		output = sc.helpers.Base64._utf8_decode(output);
115 
116 		return output;
117 
118 	},
119 
120 	// private method for UTF-8 encoding
121 	_utf8_encode : function (string) {
122 		string = string.replace(/\r\n/g,"\n");
123 		var utftext = "";
124 
125 		for (var n = 0; n < string.length; n++) {
126 
127 			var c = string.charCodeAt(n);
128 
129 			if (c < 128) {
130 				utftext += String.fromCharCode(c);
131 			}
132 			else if((c > 127) && (c < 2048)) {
133 				utftext += String.fromCharCode((c >> 6) | 192);
134 				utftext += String.fromCharCode((c & 63) | 128);
135 			}
136 			else {
137 				utftext += String.fromCharCode((c >> 12) | 224);
138 				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
139 				utftext += String.fromCharCode((c & 63) | 128);
140 			}
141 
142 		}
143 
144 		return utftext;
145 	},
146 
147 	// private method for UTF-8 decoding
148 	_utf8_decode : function (utftext) {
149 		var string = "";
150 		var i = 0;
151 		var c = 0, c1 = 0, c2 = 0, c3 = 0;
152 
153 		while ( i < utftext.length ) {
154 
155 			c = utftext.charCodeAt(i);
156 
157 			if (c < 128) {
158 				string += String.fromCharCode(c);
159 				i++;
160 			}
161 			else if((c > 191) && (c < 224)) {
162 				c2 = utftext.charCodeAt(i+1);
163 				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
164 				i += 2;
165 			}
166 			else {
167 				c2 = utftext.charCodeAt(i+1);
168 				c3 = utftext.charCodeAt(i+2);
169 				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
170 				i += 3;
171 			}
172 
173 		}
174 
175 		return string;
176 	}
177 
178 };
179 
180 
181 
182 /**
183 *
184 *  Javascript crc32
185 *  http://www.webtoolkit.info/
186 * @function
187 **/
188 sc.helpers.crc32 = function (str) {
189  
190 	function Utf8Encode(string) {
191 		string = string.replace(/\r\n/g,"\n");
192 		var utftext = "";
193  
194 		for (var n = 0; n < string.length; n++) {
195  
196 			var c = string.charCodeAt(n);
197  
198 			if (c < 128) {
199 				utftext += String.fromCharCode(c);
200 			}
201 			else if((c > 127) && (c < 2048)) {
202 				utftext += String.fromCharCode((c >> 6) | 192);
203 				utftext += String.fromCharCode((c & 63) | 128);
204 			}
205 			else {
206 				utftext += String.fromCharCode((c >> 12) | 224);
207 				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
208 				utftext += String.fromCharCode((c & 63) | 128);
209 			}
210  
211 		}
212  
213 		return utftext;
214 	}
215  
216 	str = Utf8Encode(str);
217  
218 	var table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";
219  
220 	if (typeof(crc) == "undefined") { crc = 0; }
221 	var x = 0;
222 	var y = 0;
223  
224 	crc = crc ^ (-1);
225 	for( var i = 0, iTop = str.length; i < iTop; i++ ) {
226 		y = ( crc ^ str.charCodeAt( i ) ) & 0xFF;
227 		x = "0x" + table.substr( y * 9, 8 );
228 		crc = ( crc >>> 8 ) ^ x;
229 	}
230  
231 	return crc ^ (-1);
232  
233 };
234 
235 
236 /**
237 *
238 *  MD5 (Message-Digest Algorithm)
239 *  http://www.webtoolkit.info/
240 * @function
241 **/
242 sc.helpers.MD5 = function (string) {
243  
244 	function RotateLeft(lValue, iShiftBits) {
245 		return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
246 	}
247  
248 	function AddUnsigned(lX,lY) {
249 		var lX4,lY4,lX8,lY8,lResult;
250 		lX8 = (lX & 0x80000000);
251 		lY8 = (lY & 0x80000000);
252 		lX4 = (lX & 0x40000000);
253 		lY4 = (lY & 0x40000000);
254 		lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
255 		if (lX4 & lY4) {
256 			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
257 		}
258 		if (lX4 | lY4) {
259 			if (lResult & 0x40000000) {
260 				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
261 			} else {
262 				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
263 			}
264 		} else {
265 			return (lResult ^ lX8 ^ lY8);
266 		}
267  	}
268  
269  	function F(x,y,z) { return (x & y) | ((~x) & z); }
270  	function G(x,y,z) { return (x & z) | (y & (~z)); }
271  	function H(x,y,z) { return (x ^ y ^ z); }
272 	function I(x,y,z) { return (y ^ (x | (~z))); }
273  
274 	function FF(a,b,c,d,x,s,ac) {
275 		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
276 		return AddUnsigned(RotateLeft(a, s), b);
277 	}
278  
279 	function GG(a,b,c,d,x,s,ac) {
280 		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
281 		return AddUnsigned(RotateLeft(a, s), b);
282 	}
283  
284 	function HH(a,b,c,d,x,s,ac) {
285 		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
286 		return AddUnsigned(RotateLeft(a, s), b);
287 	}
288  
289 	function II(a,b,c,d,x,s,ac) {
290 		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
291 		return AddUnsigned(RotateLeft(a, s), b);
292 	}
293  
294 	function ConvertToWordArray(string) {
295 		var lWordCount;
296 		var lMessageLength = string.length;
297 		var lNumberOfWords_temp1=lMessageLength + 8;
298 		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
299 		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
300 		var lWordArray=Array(lNumberOfWords-1);
301 		var lBytePosition = 0;
302 		var lByteCount = 0;
303 		while ( lByteCount < lMessageLength ) {
304 			lWordCount = (lByteCount-(lByteCount % 4))/4;
305 			lBytePosition = (lByteCount % 4)*8;
306 			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
307 			lByteCount++;
308 		}
309 		lWordCount = (lByteCount-(lByteCount % 4))/4;
310 		lBytePosition = (lByteCount % 4)*8;
311 		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
312 		lWordArray[lNumberOfWords-2] = lMessageLength<<3;
313 		lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
314 		return lWordArray;
315 	}
316  
317 	function WordToHex(lValue) {
318 		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
319 		for (lCount = 0;lCount<=3;lCount++) {
320 			lByte = (lValue>>>(lCount*8)) & 255;
321 			WordToHexValue_temp = "0" + lByte.toString(16);
322 			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
323 		}
324 		return WordToHexValue;
325 	}
326  
327 	function Utf8Encode(string) {
328 		string = string.replace(/\r\n/g,"\n");
329 		var utftext = "";
330  
331 		for (var n = 0; n < string.length; n++) {
332  
333 			var c = string.charCodeAt(n);
334  
335 			if (c < 128) {
336 				utftext += String.fromCharCode(c);
337 			}
338 			else if((c > 127) && (c < 2048)) {
339 				utftext += String.fromCharCode((c >> 6) | 192);
340 				utftext += String.fromCharCode((c & 63) | 128);
341 			}
342 			else {
343 				utftext += String.fromCharCode((c >> 12) | 224);
344 				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
345 				utftext += String.fromCharCode((c & 63) | 128);
346 			}
347  
348 		}
349  
350 		return utftext;
351 	}
352  
353 	var x=Array();
354 	var k,AA,BB,CC,DD,a,b,c,d;
355 	var S11=7, S12=12, S13=17, S14=22;
356 	var S21=5, S22=9 , S23=14, S24=20;
357 	var S31=4, S32=11, S33=16, S34=23;
358 	var S41=6, S42=10, S43=15, S44=21;
359  
360 	string = Utf8Encode(string);
361  
362 	x = ConvertToWordArray(string);
363  
364 	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
365  
366 	for (k=0;k<x.length;k+=16) {
367 		AA=a; BB=b; CC=c; DD=d;
368 		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
369 		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
370 		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
371 		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
372 		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
373 		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
374 		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
375 		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
376 		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
377 		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
378 		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
379 		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
380 		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
381 		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
382 		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
383 		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
384 		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
385 		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
386 		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
387 		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
388 		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
389 		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
390 		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
391 		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
392 		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
393 		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
394 		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
395 		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
396 		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
397 		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
398 		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
399 		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
400 		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
401 		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
402 		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
403 		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
404 		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
405 		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
406 		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
407 		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
408 		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
409 		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
410 		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
411 		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
412 		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
413 		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
414 		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
415 		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
416 		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
417 		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
418 		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
419 		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
420 		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
421 		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
422 		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
423 		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
424 		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
425 		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
426 		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
427 		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
428 		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
429 		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
430 		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
431 		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
432 		a=AddUnsigned(a,AA);
433 		b=AddUnsigned(b,BB);
434 		c=AddUnsigned(c,CC);
435 		d=AddUnsigned(d,DD);
436 	}
437  
438 	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
439  
440 	return temp.toLowerCase();
441 };
442 
443 /**
444 *
445 *  Secure Hash Algorithm (SHA1)
446 *  http://www.webtoolkit.info/
447 * @function
448 **/
449 sc.helpers.SHA1 = function (msg) {
450  
451 	function rotate_left(n,s) {
452 		var t4 = ( n<<s ) | (n>>>(32-s));
453 		return t4;
454 	}
455  
456 	function lsb_hex(val) {
457 		var str="";
458 		var i;
459 		var vh;
460 		var vl;
461  
462 		for( i=0; i<=6; i+=2 ) {
463 			vh = (val>>>(i*4+4))&0x0f;
464 			vl = (val>>>(i*4))&0x0f;
465 			str += vh.toString(16) + vl.toString(16);
466 		}
467 		return str;
468 	}
469  
470 	function cvt_hex(val) {
471 		var str="";
472 		var i;
473 		var v;
474  
475 		for( i=7; i>=0; i-- ) {
476 			v = (val>>>(i*4))&0x0f;
477 			str += v.toString(16);
478 		}
479 		return str;
480 	}
481  
482  
483 	function Utf8Encode(string) {
484 		string = string.replace(/\r\n/g,"\n");
485 		var utftext = "";
486  
487 		for (var n = 0; n < string.length; n++) {
488  
489 			var c = string.charCodeAt(n);
490  
491 			if (c < 128) {
492 				utftext += String.fromCharCode(c);
493 			}
494 			else if((c > 127) && (c < 2048)) {
495 				utftext += String.fromCharCode((c >> 6) | 192);
496 				utftext += String.fromCharCode((c & 63) | 128);
497 			}
498 			else {
499 				utftext += String.fromCharCode((c >> 12) | 224);
500 				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
501 				utftext += String.fromCharCode((c & 63) | 128);
502 			}
503  
504 		}
505  
506 		return utftext;
507 	}
508  
509 	var blockstart;
510 	var i, j;
511 	var W = new Array(80);
512 	var H0 = 0x67452301;
513 	var H1 = 0xEFCDAB89;
514 	var H2 = 0x98BADCFE;
515 	var H3 = 0x10325476;
516 	var H4 = 0xC3D2E1F0;
517 	var A, B, C, D, E;
518 	var temp;
519  
520 	msg = Utf8Encode(msg);
521  
522 	var msg_len = msg.length;
523  
524 	var word_array = [];
525 	for( i=0; i<msg_len-3; i+=4 ) {
526 		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
527 		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
528 		word_array.push( j );
529 	}
530  
531 	switch( msg_len % 4 ) {
532 		case 0:
533 			i = 0x080000000;
534 		break;
535 		case 1:
536 			i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
537 		break;
538  
539 		case 2:
540 			i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
541 		break;
542  
543 		case 3:
544 			i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8	| 0x80;
545 		break;
546 	}
547  
548 	word_array.push( i );
549  
550 	while( (word_array.length % 16) != 14 ) {word_array.push( 0 );}
551  
552 	word_array.push( msg_len>>>29 );
553 	word_array.push( (msg_len<<3)&0x0ffffffff );
554  
555  
556 	for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
557  
558 		for( i=0; i<16; i++ ) {W[i] = word_array[blockstart+i];}
559 		for( i=16; i<=79; i++ ) {W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);}
560  
561 		A = H0;
562 		B = H1;
563 		C = H2;
564 		D = H3;
565 		E = H4;
566  
567 		for( i= 0; i<=19; i++ ) {
568 			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
569 			E = D;
570 			D = C;
571 			C = rotate_left(B,30);
572 			B = A;
573 			A = temp;
574 		}
575  
576 		for( i=20; i<=39; i++ ) {
577 			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
578 			E = D;
579 			D = C;
580 			C = rotate_left(B,30);
581 			B = A;
582 			A = temp;
583 		}
584  
585 		for( i=40; i<=59; i++ ) {
586 			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
587 			E = D;
588 			D = C;
589 			C = rotate_left(B,30);
590 			B = A;
591 			A = temp;
592 		}
593  
594 		for( i=60; i<=79; i++ ) {
595 			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
596 			E = D;
597 			D = C;
598 			C = rotate_left(B,30);
599 			B = A;
600 			A = temp;
601 		}
602  
603 		H0 = (H0 + A) & 0x0ffffffff;
604 		H1 = (H1 + B) & 0x0ffffffff;
605 		H2 = (H2 + C) & 0x0ffffffff;
606 		H3 = (H3 + D) & 0x0ffffffff;
607 		H4 = (H4 + E) & 0x0ffffffff;
608  
609 	}
610  
611 	temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
612  
613 	return temp.toLowerCase();
614  
615 };
616 
617 
618 
619 /**
620 *
621 *  Secure Hash Algorithm (SHA256)
622 *  http://www.webtoolkit.info/
623 *
624 *  Original code by Angel Marin, Paul Johnston.
625 * @function
626 **/
627 sc.helpers.SHA256 = function (s){
628  
629 	var chrsz   = 8;
630 	var hexcase = 0;
631  
632 	function safe_add (x, y) {
633 		var lsw = (x & 0xFFFF) + (y & 0xFFFF);
634 		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
635 		return (msw << 16) | (lsw & 0xFFFF);
636 	}
637  
638 	function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
639 	function R (X, n) { return ( X >>> n ); }
640 	function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
641 	function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
642 	function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
643 	function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
644 	function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
645 	function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
646  
647 	function core_sha256 (m, l) {
648 		var K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2];
649 		var HASH = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19];
650 		var W = [64];
651 		var a, b, c, d, e, f, g, h, i, j;
652 		var T1, T2;
653  
654 		m[l >> 5] |= 0x80 << (24 - l % 32);
655 		m[((l + 64 >> 9) << 4) + 15] = l;
656  
657 		for ( i = 0; i<m.length; i+=16 ) {
658 			a = HASH[0];
659 			b = HASH[1];
660 			c = HASH[2];
661 			d = HASH[3];
662 			e = HASH[4];
663 			f = HASH[5];
664 			g = HASH[6];
665 			h = HASH[7];
666  
667 			for ( j = 0; j<64; j++) {
668 				if (j < 16) {W[j] = m[j + i];}
669 				else {W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);}
670  
671 				T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
672 				T2 = safe_add(Sigma0256(a), Maj(a, b, c));
673  
674 				h = g;
675 				g = f;
676 				f = e;
677 				e = safe_add(d, T1);
678 				d = c;
679 				c = b;
680 				b = a;
681 				a = safe_add(T1, T2);
682 			}
683  
684 			HASH[0] = safe_add(a, HASH[0]);
685 			HASH[1] = safe_add(b, HASH[1]);
686 			HASH[2] = safe_add(c, HASH[2]);
687 			HASH[3] = safe_add(d, HASH[3]);
688 			HASH[4] = safe_add(e, HASH[4]);
689 			HASH[5] = safe_add(f, HASH[5]);
690 			HASH[6] = safe_add(g, HASH[6]);
691 			HASH[7] = safe_add(h, HASH[7]);
692 		}
693 		return HASH;
694 	}
695  
696 	function str2binb (str) {
697 		var bin = Array();
698 		var mask = (1 << chrsz) - 1;
699 		for(var i = 0; i < str.length * chrsz; i += chrsz) {
700 			bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
701 		}
702 		return bin;
703 	}
704  
705 	function Utf8Encode(string) {
706 		string = string.replace(/\r\n/g,"\n");
707 		var utftext = "";
708  
709 		for (var n = 0; n < string.length; n++) {
710  
711 			var c = string.charCodeAt(n);
712  
713 			if (c < 128) {
714 				utftext += String.fromCharCode(c);
715 			}
716 			else if((c > 127) && (c < 2048)) {
717 				utftext += String.fromCharCode((c >> 6) | 192);
718 				utftext += String.fromCharCode((c & 63) | 128);
719 			}
720 			else {
721 				utftext += String.fromCharCode((c >> 12) | 224);
722 				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
723 				utftext += String.fromCharCode((c & 63) | 128);
724 			}
725  
726 		}
727  
728 		return utftext;
729 	}
730  
731 	function binb2hex (binarray) {
732 		var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
733 		var str = "";
734 		for(var i = 0; i < binarray.length * 4; i++) {
735 			str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
736 			hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
737 		}
738 		return str;
739 	}
740 
741 	s = Utf8Encode(s);
742 	return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
743  
744 };
745 
746 
747 
748 /*
749 File: Math.uuid.js
750 Version: 1.3
751 Change History:
752   v1.0 - first release
753   v1.1 - less code and 2x performance boost (by minimizing calls to Math.random())
754   v1.2 - Add support for generating non-standard uuids of arbitrary length
755   v1.3 - Fixed IE7 bug (can't use []'s to access string chars.  Thanks, Brian R.)
756   v1.4 - Changed method to be "Math.uuid". Added support for radix argument.  Use module pattern for better encapsulation.
757 
758 Latest version:   http://www.broofa.com/Tools/Math.uuid.js
759 Information:      http://www.broofa.com/blog/?p=151
760 Contact:          robert@broofa.com
761 ----
762 Copyright (c) 2008, Robert Kieffer
763 All rights reserved.
764 
765 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
766 
767     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
768     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
769     * Neither the name of Robert Kieffer nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
770 
771 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
772 */
773 
774 /**
775  * Generate a random uuid.
776  *
777  * USAGE: Math.uuid(length, radix)
778  *   length - the desired number of characters
779  *   radix  - the number of allowable values for each character.
780  *
781  * EXAMPLES:
782  *   // No arguments  - returns RFC4122, version 4 ID
783  *   >>> Math.uuid()
784  *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
785  * 
786  *   // One argument - returns ID of the specified length
787  *   >>> Math.uuid(15)     // 15 character ID (default base=62)
788  *   "VcydxgltxrVZSTV"
789  *
790  *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
791  *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
792  *   "01001010"
793  *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
794  *   "47473046"
795  *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
796  *   "098F4D35"
797  * @member sc.helpers
798  * @function
799 
*/
800 sc.helpers.UUID = (function() {
801   // Private array of chars to use
802   var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); 
803 
804   return function (len, radix) {
805     var chars = CHARS, uuid = [], rnd = Math.random;
806     radix = radix || chars.length;
807 
808     if (len) {
809       // Compact form
810       for (var i = 0; i < len; i++) uuid[i] = chars[0 | rnd()*radix];
811     } else {
812       // rfc4122, version 4 form
813       var r;
814 
815       // rfc4122 requires these characters
816       uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
817       uuid[14] = '4';
818 
819       // Fill in random data.  At i==19 set the high bits of clock sequence as
820       // per rfc4122, sec. 4.1.5
821       for (var i = 0; i < 36; i++) {
822         if (!uuid[i]) {
823           r = 0 | rnd()*16;
824           uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
825         }
826       }
827     }
828 
829     return uuid.join('');
830   };
831 })();
832 
833 /**
834  * Checks if the given value is an RFC 4122 UUID 
835  * @member sc.helpers
836 
*/
837 sc.helpers.isUUID = function(val) {
838 	return val.match(/^[0-9A-Z]{8}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{12}$/);
839 };
840