function replace ( string, text, by ) {
    var strLength = string.length, txtLength = text.length;
    if ((strLength == 0) || (txtLength == 0)) return string;

    var i = string.indexOf(text);
    if ((!i) && (text != string.substring(0,txtLength))) return string;
    if (i == -1) return string;

    var newstr = string.substring(0,i) + by;

    if (i+txtLength < strLength)
        newstr += replace(string.substring(i+txtLength,strLength),text,by);

    return newstr;
}

function upperString ( tString ) {
	var i, tReturn='';
	
	for ( i=0; i < tString.length; i ++ )
		tReturn += upperChar ( tString.charAt ( i ));

	return ( tReturn );
}

function lowerString ( tString ) {
	var i, tReturn='';
	
	for ( i=0; i < tString.length; i ++ )
		tReturn += lowerChar ( tString.charAt ( i ));

	return ( tReturn );
}

function digits_only ( tString ) {
	var i, c, tReturn="";
	
	for ( i=0; i < tString.length; i ++ ) {
		c=tString.charAt ( i );
		if ( isDigit ( c ))
			tReturn += c;
	}
	
	return ( tReturn );
}

function strip_chars ( tString, tStripChars ) {
	var i, c, tReturn = "";

    for ( i=0; i < tString.length; i ++ ) {
        c=tString.charAt ( i );
        if ( tStripChars.indexOf ( c ) == -1 )
			tReturn += c;
    }

    return tReturn;
}

function reformat ( tString ) {
	var arg, i, sPos=0, tReturn="";

	for ( i=1; i < reformat.arguments.length; i ++ ) {
		arg = reformat.arguments [ i ];
		if ( i % 2 == 1 )
			tReturn += arg;
		else {
			tReturn += tString.substring ( sPos, sPos + arg );
			sPos += arg;
		}
	}

	return tReturn;
}

// removes leading and trailing spaces from a string

function trim ( tString, tChar ) {
	var i, j, tReturn=tString + "";

	if ( typeof tChar == 'undefined' )
		var tChar=' ';

	for ( i = 0; i < tReturn.length; i ++ ) {
		j=tReturn.charCodeAt ( i );
		if ( j != 32 && j != 13 && j != 10 && j != 9 && j != asc(tChar))
			break;
	}

	if ( i < tReturn.length )
		tReturn = tReturn.substring ( i );
	else
		tReturn = '';
	
	for ( i = tReturn.length - 1; i >= 0; i -- ) {
		j=tReturn.charCodeAt ( i );
		if ( j != 32 && j != 13 && j != 10 && j != 9 && j != asc(tChar))
			break;
	}

	if ( i == -1 )
		tReturn = '';
	else
		tReturn = tReturn.substring ( 0, i + 1 );
	
	return tReturn;
}

function readline ( tString, nOffset ) {
	var tReturn="", nEnd, tSearch="", i;
	nEnd=tString.indexOf ( chr(10), nOffset );
//	alert ( "noffset=" + nOffset + ", nEnd=" + nEnd );
	return ( nEnd + chr(9) + tString.substring ( nOffset, nEnd ));
}
