var Text={
	html:function (sStr,bBR,bJS) {
		if (typeof (sStr)=="string") {
			sStr=sStr.replace(/</g,"&lt;").replace(/>/g,"&gt;");
			if (!bJS) {
				sStr=sStr.replace(/\"/g,"&quot;").replace(/\'/g,"&#39;");
				sStr=sStr.replace(/\r?\n/g,bBR ? "\n" : "<br />");
			}
			else sStr=this.js(sStr);
		}
		return sStr;
	},

	js:function (sStr) {
		if (typeof (sStr)=="string") {
			sStr=sStr
				.replace(/\\/g,"\\\\")
				.replace(/\'/g,"\\\'")
				.replace(/\"/g,"\\\"")
				.replace(/\//g,"\/")
				//.replace(/(?:\n|\r)/g,"<br />")
				.replace(/\t/g,"\\t")
				.replace(/\r?\n/g,"\\n");
		}
		return sStr;
	},

	is:function (vVar,sType) {
		return {
			num:/^\d*$/,
			fullnum:/^[0-9]\d*$/,
			"float":/^\d+(\.\d+)?$/,
			userpass:/^[\w\-\., ]+$/,
			email:/^[\w\-\.]+@([a-z0-9\-]+\.)+[a-z]{2,4}$/,
			name:/^[a-z ]+$/,
			url:/^(https?|ftp):\/\/([a-z0-9\-]+\.)+\w{2,5}\/?\S*$/i,
			date:/^(((0?[13578]|1[02])\/([0-2]?\d|3[01])|(0?[469]|11)\/([0-2]?\d|30)|0?2\/([01]?\d|2[0-8]))\/(19|20)?\d{2}|0?2\/([01]?\d|2[0-9])\/(19|20)?([024568][048]|[13579][26]))$/,
			time:/^([01]?\d|2[0-3])(\:[0-5]\d){1,2}$/
		}[sType].test(vVar);
	},

	pad:function (sStr,iPad,sChar) {
		sChar=sChar || "0";
		while (sStr.length<iPad) sStr=sChar+sStr;
		return sStr;
	},

	encode:function (sStr) {
		/*
		 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
		 * Digest Algorithm, as defined in RFC 1321.
		 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
		 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
		 * Distributed under the BSD License
		 * See http://pajhome.org.uk/crypt/md5 for more info.
		 */

		var hexcase=0,
			b64pad="",
			chrsz=16;

		function core_md5(x,len) {
			/* append padding */
			x[len>>5] |=0x80<<((len)%32);
			x[(((len+64)>>>9)<<4)+14]=len;
			
			var a=1732584193,
				b=-271733879,
				c=-1732584194,
				d=271733878;

			for (var i=0;i<x.length;i+=16) {
				var olda=a,
					oldb=b,
					oldc=c,
					oldd=d;
			 
				a=md5_ff(a,b,c,d,x[i+0],7,-680876936);
				d=md5_ff(d,a,b,c,x[i+1],12,-389564586);
				c=md5_ff(c,d,a,b,x[i+2],17,606105819);
				b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);
				a=md5_ff(a,b,c,d,x[i+4],7,-176418897);
				d=md5_ff(d,a,b,c,x[i+5],12,1200080426);
				c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);
				b=md5_ff(b,c,d,a,x[i+7],22,-45705983);
				a=md5_ff(a,b,c,d,x[i+8],7,1770035416);
				d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);
				c=md5_ff(c,d,a,b,x[i+10],17,-42063);
				b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);
				a=md5_ff(a,b,c,d,x[i+12],7,1804603682);
				d=md5_ff(d,a,b,c,x[i+13],12,-40341101);
				c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);
				b=md5_ff(b,c,d,a,x[i+15],22,1236535329);

				a=md5_gg(a,b,c,d,x[i+1],5,-165796510);
				d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);
				c=md5_gg(c,d,a,b,x[i+11],14,643717713);
				b=md5_gg(b,c,d,a,x[i+0],20,-373897302);
				a=md5_gg(a,b,c,d,x[i+5],5,-701558691);
				d=md5_gg(d,a,b,c,x[i+10],9,38016083);
				c=md5_gg(c,d,a,b,x[i+15],14,-660478335);
				b=md5_gg(b,c,d,a,x[i+4],20,-405537848);
				a=md5_gg(a,b,c,d,x[i+9],5,568446438);
				d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);
				c=md5_gg(c,d,a,b,x[i+3],14,-187363961);
				b=md5_gg(b,c,d,a,x[i+8],20,1163531501);
				a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);
				d=md5_gg(d,a,b,c,x[i+2],9,-51403784);
				c=md5_gg(c,d,a,b,x[i+7],14,1735328473);
				b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);

				a=md5_hh(a,b,c,d,x[i+5],4,-378558);
				d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);
				c=md5_hh(c,d,a,b,x[i+11],16,1839030562);
				b=md5_hh(b,c,d,a,x[i+14],23,-35309556);
				a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);
				d=md5_hh(d,a,b,c,x[i+4],11,1272893353);
				c=md5_hh(c,d,a,b,x[i+7],16,-155497632);
				b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);
				a=md5_hh(a,b,c,d,x[i+13],4,681279174);
				d=md5_hh(d,a,b,c,x[i+0],11,-358537222);
				c=md5_hh(c,d,a,b,x[i+3],16,-722521979);
				b=md5_hh(b,c,d,a,x[i+6],23,76029189);
				a=md5_hh(a,b,c,d,x[i+9],4,-640364487);
				d=md5_hh(d,a,b,c,x[i+12],11,-421815835);
				c=md5_hh(c,d,a,b,x[i+15],16,530742520);
				b=md5_hh(b,c,d,a,x[i+2],23,-995338651);

				a=md5_ii(a,b,c,d,x[i+0],6,-198630844);
				d=md5_ii(d,a,b,c,x[i+7],10,1126891415);
				c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);
				b=md5_ii(b,c,d,a,x[i+5],21,-57434055);
				a=md5_ii(a,b,c,d,x[i+12],6,1700485571);
				d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);
				c=md5_ii(c,d,a,b,x[i+10],15,-1051523);
				b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);
				a=md5_ii(a,b,c,d,x[i+8],6,1873313359);
				d=md5_ii(d,a,b,c,x[i+15],10,-30611744);
				c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);
				b=md5_ii(b,c,d,a,x[i+13],21,1309151649);
				a=md5_ii(a,b,c,d,x[i+4],6,-145523070);
				d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);
				c=md5_ii(c,d,a,b,x[i+2],15,718787259);
				b=md5_ii(b,c,d,a,x[i+9],21,-343485551);

				a=safe_add(a,olda);
				b=safe_add(b,oldb);
				c=safe_add(c,oldc);
				d=safe_add(d,oldd);
			}
			return Array(a,b,c,d);
		}

		function md5_cmn(q,a,b,x,s,t) {
			return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);
		}
		function md5_ff(a,b,c,d,x,s,t) {
			return md5_cmn((b&c)|((~b)&d),a,b,x,s,t);
		}
		function md5_gg(a,b,c,d,x,s,t) {
			return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t);
		}
		function md5_hh(a,b,c,d,x,s,t) {
			return md5_cmn(b^c^d,a,b,x,s,t);
		}
		function md5_ii(a,b,c,d,x,s,t) {
			return md5_cmn(c^(b|(~d)),a,b,x,s,t);
		}
		function core_hmac_md5(key,data) {
			var bkey=str2binl(key);
			if (bkey.length>16) bkey=core_md5(bkey,key.length*chrsz);

			var ipad=Array(16),opad=Array(16);
			for (var i=0;i<16;i++) {
				ipad[i]=bkey[i]^0x36363636;
				opad[i]=bkey[i]^0x5C5C5C5C;
			}

			var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);
			return core_md5(opad.concat(hash),512+128);
		}

		function safe_add(x,y) {
			var lsw=(x&0xFFFF)+(y&0xFFFF),
				msw=(x>>16)+(y>>16)+(lsw>>16);

			return (msw<<16)|(lsw&0xFFFF);
		}

		function bit_rol(num,cnt) {
			return (num<<cnt)|(num>>>(32-cnt));
		}

		function str2binl(str) {
			var bin=Array();
			var mask=(1<<chrsz)-1;
			for (var i=0;i<str.length*chrsz;i+=chrsz) bin[i>>5] |=(str.charCodeAt(i/chrsz)&mask)<<(i%32);
			return bin;
		}

		function binl2b64(binarray) {
			var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
			var str="";
			for (var i=0;i<binarray.length*4;i+=3) {
				var triplet=(((binarray[i>>2]>>8*(i%4))&0xFF)<<16)
							|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8 )
							|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);
				for (var j=0;j<4;j++) {
					if (i*8+j*6>binarray.length*32) str+=b64pad;
					else str+=tab.charAt((triplet>>6*(3-j))&0x3F);
				}
			}
			return str;
		}

		return binl2b64(core_md5(str2binl(sStr),sStr.length*chrsz));
	}
}

String.prototype.toRX=function () {
	return this.replace(/(\(|\)|\{|\}|\[|\]|\:|\^|\$|\!|\=|\+|\*|\/|\,|\-|\||\?)/g,"\\$1");
}

String.prototype.addLinks=function () {
	return this.replace(/(^|\b)(http:\/\/|(www\.))([^\s,]+)/g,"<a href=\"http://$3$4\" target=\"_blank\">$2$4</a>");
}

if (!Array.prototype.push) {
	Array.prototype.push=function () {
		for (var iArg=0;iArg<arguments.length;iArg++) this[this.length]=arguments[iArg];
		return this.length;
	}
}

Array.prototype.indexOf=function (vVar,sProp) {
	var iItem=0;

	while (iItem<this.length && this[iItem]!=vVar) iItem++;

	return iItem==this.length ? -1 : iItem;
}

Array.prototype.remove=function (iIndex) {
	if (iIndex<0 || iIndex>=this.length) return;
	for (var iItem=iIndex+1;iItem<this.length;iItem++) this[iItem-1]=this[iItem];
	this.length--;

	return this;
}

Array.prototype.joinEx=function (sBefore,sAfter,sBetween) {
	return sBefore+this.join(sAfter+sBetween+sBefore)+sAfter;
}

Object.prototype.props=function () {
	var sPrps="",iPrp=0;

	for (var sPrp in this) {
		if (typeof (this[sPrp])!="function") sPrps+=Text.pad(iPrp++,2)+": "+sPrp+"\t\t\t"+this[sPrp]+"\n";
	}

	return sPrps;
}

Array.prototype.joinEx=function(sBefore,sAfter,sBetween) {
	return sBefore+this.join(sAfter+sBetween+sBefore)+sAfter;
}

String.prototype.trim=function () {
	return this.replace(/^[\s\n]+|[\s\n]+$/g,"");
}

/*
String.prototype.reverse=function () {
	return this.split("").reverse().join("");
}

String.prototype.firstCap=function () {
	return this.length ? this.charAt(0).toUpperCase()+this.substr(1) : "";
}
*/

String.prototype.format=function (iStyle) {
	if (!this) return "";

	if (Text.is(this,"date")) return new Date(this).format(iStyle);
}

Date.prototype.format=function (iStyle,bLong) {
/*
				bLong
1: mm/dd		mm/dd/yyyy
2: hh:mm		hh:mm:ss
3: mm/dd hh:mm	mm/dd/yyyy hh:mm:ss
4: ddd			dddd
5: mmm			mmmm
*/
	if (!this || isNaN(this)) return "";

	var oDate={
		all:"",
		day:this.getDay()+1,
		month:this.getMonth()+1,
		date:this.getDate(),
		year:this.getFullYear(),
		hour:this.getHours(),
		minute:this.getMinutes(),
		second:this.getSeconds()
	};

	for (var iItem in oDate) {
		if (oDate[iItem]<10) oDate[iItem]="0"+oDate[iItem];
	}

	switch (iStyle) {
		case 1:
			oDate.all=oDate.month+"/"+oDate.date+(bLong ? "/"+oDate.year : "");
			break;

		case 2:
			oDate.all=oDate.hour+":"+oDate.minute+(bLong ? ":"+oDate.second : "");
			break;

		case 3:
			oDate.all=this.format(1,bLong)+" "+this.format(2,bLong);
			break;

		case 4:
			oDate.all=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][oDate.day-1];
			if (!bLong) oDate.all=oDate.all.substr(0,3);
			break;

		case 5:
			oDate.all=["January","February","March","April","May","June","July","August","September","October","November","December"][oDate.month-1];
			if (!bLong) oDate.all=oDate.all.substr(0,3);
			break;
	}

	return oDate.all;
}

/*
Date.prototype.dateDiff=function (dDate,iStyle,bFloor) {
// {1:seconds,2:minutes; 3:hours,4:days,5:weeks}
	iStyle=iStyle || 1;

	var aDiff=[1000,60,60,24,7],
		iDiffMS=dDate-this, iDiff=1;

	for (curDiff=0; curDiff<iStyle; curDiff++) iDiff*=aDiff[curDiff];

	return bFloor? Math.floor(iDiffMS/iDiff) : iDiffMS/iDiff;
}

Object.prototype.sort=function (fCompare) {
	var aIndexes=[],
		iItem,
		oNew={},
		vVal;

	for (iItem in this) {
		if (typeof (this[iItem])!="function") aIndexes.push(iItem);
	}

	aIndexes.sort(fCompare || null);

	for (iItem=0;iItem<aIndexes.length;iItem++) {
		oNew[aIndexes[iItem]]=this[aIndexes[iItem]];
		delete this[aIndexes[iItem]];
	}

	return oNew;
}

Object.prototype.concat=function () {
	var oNew={};

	for (var iItem in this) {
		if (typeof (this[iItem])!="function") oNew[iItem]=this[iItem];
	}

	return oNew;
}

Object.prototype.hash=function (iTo) {
	var iInd=0, oCopy=this.concat();
	for (var iItem in oCopy) {
		if (typeof (oCopy[iItem])!="function") {
			this[iInd]=iItem;
			if (iInd==iTo) return this;
			iInd++;
		}
	}

	return this;
}

Object.prototype.getLength=function () {
	var iLen=0;

	for (var iItem in this) {
		if (typeof (this[iItem])!="function") iLen++;
	}

 	this.length==function () { return iLen; };
}

String.prototype.toHN=function () {
	return this.replace(
		/\W(\w)/g,
		=function (sMatch) {
			return sMatch.substr(1).toUpperCase();
		}
	);
}
*/
