/**
 * $Id:$
 *
 * extended prototypes for mootools.v1.11
 */


/**
 * methods for base64 encoding and decoding 
 */
String.extend ({
	/*
		Property: _B64Map
			Private Base64 characters string 
	*/
	_B64Map : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
 
	/*
		Property: toB64
			Encode the string into a Base64 standard ones.
	*/
	toB64 : function () {
		var length = this.length;
		var b64 = new String ();
		var i, b1, b2, b3;
		for (i=0; i < length; i+=3) {
			b1 = this.charCodeAt(i);
			b2 = this.charCodeAt(i+1);
			b3 = this.charCodeAt(i+2);
 
			b64 += ( this._B64Map.charAt(b1 >> 2) ) 
				+ ( this._B64Map.charAt( ( (b1 & 3 ) << 4) | ( (i+1 < length) ? ( b2 >> 4) : 0 ) ) ) 	
				+ ( (i+1 < length) ? this._B64Map.charAt(  ( (b2 & 15 ) << 2) | ( (i+2 < length) ? ( b3 >> 6) : 0 ) ) : "=" )
				+ ( (i+2 < length) ? this._B64Map.charAt( b3 & 63 ) : "=" );
		}
		return b64;
	},
 
	/*
		Property: fromB64
			Decode the string from a Base64 standard ones.
	*/
	fromB64: function () {
		var ret = new String ();
		var length = this.length;
		var i, n1, n2, n3, n4;
 
		if ((length % 4) != 0) { return null; }
 
		for (i = 0; i < length; i+=4) {
			n1 = this._B64Map.indexOf ( this.charAt(i) );
			n2 = this._B64Map.indexOf ( this.charAt(i+1) );
			n3 = (this.charAt(i+2) != "=") ? this._B64Map.indexOf ( this.charAt(i+2) ) : 0;
			n4 = (this.charAt(i+3) != "=") ? this._B64Map.indexOf ( this.charAt(i+3) ) : 0;
 
			ret += String.fromCharCode( (n1 << 2) | ( (n2 & 48) >> 4) ) 
				+ String.fromCharCode( ( (n2 & 15) << 4) | ( (n3 & 60 ) >> 2 ) )
				+ String.fromCharCode( ( (n3 & 3) << 6 ) | n4);
		}
		return ret;
	}
});