String.JSescape = function( s )
{
	s = s.replace( /\\/g, "\\\\" );
	s = s.replace( /\t/g, "\\t" );
	s = s.replace( /\n/g, "\\n" );
	s = s.replace( /\f/g, "\\f" );
	s = s.replace( /\r/g, "\\r" );
	s = s.replace( /\"/g, "\\\"" );
	return s;
};

String.JSunescape = function( s )
{
	s = s.replace( /\\\\/g, "\\" );
	s = s.replace( /\\t/g, "\t" );
	s = s.replace( /\\n/g, "\n" );
	s = s.replace( /\\f/g, "\f" );
	s = s.replace( /\\r/g, "\r" );
	s = s.replace( /\\\"/g, "\"" );
	return s;
};

String.prototype.JSescape = function()
{
	var s = this.valueOf();
	return String.JSescape( s );
};

String.prototype.JSunescape = function()
{
	var s = this.valueOf();
	return String.JSunescape( s );
};

String.linkify = function( s )
{
	s = String( s );
	s = s.replace( /(https?:\/\/([a-z0-9_\-]+\.)+[a-z]{2,}(\/([^#\?\s])+)*(\/)?(\?([^#\s])*)?(#([^\s])*)?)/gi, "<a href=\"$1\">$1</a>" );
	return s;
};

String.prototype.linkify = function()
{
	var s = this.valueOf();
	return String.linkify( s );
};

function XMLHTTP()
{
	// Firefox, Opera 8.0+, Safari
	try
  	{
		return new XMLHttpRequest();
	}
	catch ( e ) {}

	// Internet Explorer (NEW)
	try
	{
		return new ActiveXObject( "Msxml2.XMLHTTP" );
	}
	catch( e ) {}

	// Internet Explorer (OLD)
	try
	{
		return new ActiveXObject( "Microsoft.XMLHTTP" );
	}
	catch( e ) {}

	// No AJAX Support
	err = new Error();
	err.name = "Unsupported Feature";
	err.message = "Your browser does not support AJAX.";
	throw err;
}
