// REQUIRES: ozLib.js

String.prototype.isWhiteSpaceAt = function ( n ) {
	return this.charAt( n ) == ' ' || this.charAt( n ) == '\t' || this.charAt( n ) == '\n'; 
};

String.prototype.ltrim = function () {
	var i = -1;
	while( this.isWhiteSpaceAt( ++i ) );
	return this.substr( i );
};

String.prototype.rtrim = function () {
	var i = this.length;
	while( this.isWhiteSpaceAt( --i ) );
	return this.substr( 0, i + 1 );
};

String.prototype.trim = function () {
	return this.rtrim().ltrim();
};

String.prototype.capitalize = function () {
	return this.charAt( 0 ).toUpperCase() + this.substr( 1 );
};

String.prototype.capitalizeAll = function () {
	var s = "";
	var wasSpace = true;
	for( var i = 0; i < this.length; i++ ) {
		if( !this.isWhiteSpaceAt( i ) && wasSpace )
			s += this.charAt( i ).toUpperCase();
		else
			s += this.charAt( i );
		wasSpace = this.isWhiteSpaceAt( i );
	}
	return s;
};

// optional 2nd arg true means print elipse
// optional 3rd arg true means word boundaries
String.prototype.truncate = function ( len ) {
	var s = this.valueOf();
	if( this.length > len ) {
		if( arguments.length == 3 && arguments[2] ) {
			var i = s.lastIndexOf( " ", len );
			while( i > 0 && !s.isWhiteSpaceAt( i ) ) i--;
			s = s.substr( 0, i );
		}
		if( arguments.length > 1 && arguments[1] )
			return s.substr( 0, len ) + "...";
		else
			return s.substr( 0, len );
	}
	return s;
};

String.prototype.isNumericAt = function ( n ) {
	return "0123456789".indexOf( this.charAt( n ) ) > -1;
};

String.prototype.isNumeric = function () {
	return !isNaN( this );
};

String.prototype.repeat = function ( n ) {
	var temp = "";
	for( var i = 0; i < n; i++ ) temp += this;
	return temp;
};

String.prototype.htmlEntities = function () {
	return this.replace( /&/g, "&amp;" ).replace( /</g, "&lt;" ).replace( />/g, "&gt;" );
};

String.prototype.quotify = function () {
	var c, i, l = this.length, o = '"';
	for( i = 0; i < l; i += 1 ) {
		c = this.charAt( i );
		if( c >= ' ' ) {
			if( c == '\\' || c == '"' ) o += '\\';
			o += c;
		} else {
			switch( c ) {
				case '\b':
					o += '\\b';
					break;
				case '\f':
					o += '\\f';
					break;
				case '\n':
					o += '\\n';
					break;
				case '\r':
					o += '\\r';
					break;
				case '\t':
					o += '\\t';
					break;
				default:
					c = c.charCodeAt();
					o += '\\u00' + Math.floor( c / 16 ).toString( 16 ) + ( c % 16 ).toString( 16 );
			}
		}
	}
	return o + '"';
};

// Sample usage:
//   param = { domain: 'valvion.com', media: 'http://media.{domain}/' };
//   url = "{media}logo.gif".varReplace( param );
// Results: "http://media.valvion.com/logo.gif"
String.prototype.varReplace = function ( o ) {
	var i, j, s = this, v;
	for( ; ; ) {
		i = s.lastIndexOf( '{' );
		if( i < 0 ) break;
		j = s.indexOf( '}', i );
		if( i + 1 >= j ) break;
		v = o[s.substring( i + 1, j )];
		if( typeof( v ) != "string" && !( typeof( v ) == "number" && isFinite( v ) ) ) break;
		s = s.substring( 0, i ) + v + s.substring( j + 1 );
	}
	return s;
};

