<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
* +-------------------------------------------------------------------------+
* | jsPro - String Test Page |
* +-------------------------------------------------------------------------+
* | Copyright (C) 2001-2003 Stuart Wigley |
* +-------------------------------------------------------------------------+
* | This library is free software; you can redistribute it and/or modify it |
* | under the terms of the GNU Lesser General Public License as published by|
* | the Free Software Foundation; either version 2.1 of the License, or (at |
* | your option) any later version. |
* | |
* | This library is distributed in the hope that it will be useful, but |
* | WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
* | General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License|
* | along with this library; if not, write to the Free Software Foundation, |
* | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* +-------------------------------------------------------------------------+
* | Authors: Stuart Wigley <stuartwigley@yahoo.co.uk> |
* +-------------------------------------------------------------------------+
* $Id: string.html,v 1.6 2003/09/23 14:48:15 wigleys Exp $
-->
<html>
<head>
<title>jsPro - String</title>
<!-- error.js -->
<script type="text/javascript">
/**
* +-------------------------------------------------------------------------+
* | jsPro - Error |
* +-------------------------------------------------------------------------+
* | Copyright (C) 2001-2003 Stuart Wigley |
* +-------------------------------------------------------------------------+
* | This library is free software; you can redistribute it and/or modify it |
* | under the terms of the GNU Lesser General Public License as published by|
* | the Free Software Foundation; either version 2.1 of the License, or (at |
* | your option) any later version. |
* | |
* | This library is distributed in the hope that it will be useful, but |
* | WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
* | General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License|
* | along with this library; if not, write to the Free Software Foundation, |
* | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* +-------------------------------------------------------------------------+
* | Authors: Stuart Wigley <stuartwigley@yahoo.co.uk> |
* | Randolph Fielding <gator4life@cinci.rr.com> |
* +-------------------------------------------------------------------------+
* $Id: error.js,v 1.15 2003/09/22 04:41:10 gator4life Exp $
*/
/**
* Property used in <code>Error.handleError</code> to specify how errors are
* reported. Permissable values are:
*
* 0 No errors are reported.
* 1 Report the error name and error message using the status bar of the
* active browser window.
* 2 Report the error name and error message using an alert box.
* 3 Report the error name, error message and debug message using an alert
* box.
* 4 Report the error name, error message and debug message using a debug
* window. An instance of the Debug() class must be available.
*/
Error.prototype.debugLevel = 4;
/**
* Uses <code>Error.debugLevel</code> to control how errors are reported. If
* <code>Error.debugLevel</code> is set to 4, you must substitute the name of
* your <code>Debug()</code> instance for <code>oDebug</code> in the line
* <code>var jsProDebugWindow = oDebug</code>.
*
* @summary handles thrown exceptions
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.2, 09/03/03
* @interface <code>Error.handleError()</code>
* @requires <code>Debug.print(vMixedValue, sMessageType)</code>
* @see <code>Debug()</code>
* @see <code>Debug.print()</code>
*/
Error.prototype.handleError = function() {
var sDebugMessage = this.debug;
var sErrorMessage = (sDebugMessage) ? sDebugMessage : '';
switch (this.debugLevel) {
case 0 :
break;
case 1 :
window.status = this.name + ': ' + this.message;
break;
case 2 :
window.alert(this.name + '\n\n' + this.message);
break;
case 3 :
window.alert(this.name + '\n\n' + this.message + '\n\n' + sErrorMessage);
break;
case 4 :
var jsProDebugWindow = oDebug;
if (jsProDebugWindow) {
var oDebugWindow = jsProDebugWindow.debugWindow;
if (oDebugWindow && !oDebugWindow.closed) {
jsProDebugWindow.print(this.name + ' ' + this.message + ' ' + sErrorMessage, 1);
}
}
}
}
/**
* Creates an object that is a subclass of Error for handling
* ArrayIndexOutOfBounds exceptions.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 06/27/03
* @interface <code>new ArrayIndexOutOfBoundsException(sMethodName,
* iIndex, iArrayLength)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param iIndex the index of a hypothetical array member attempting to
* be accessed
* @param iArrayLength the length of the array
*/
function ArrayIndexOutOfBoundsException(sMethodName, iIndex, iArrayLength) {
this.name = 'ArrayIndexOutOfBoundsException';
this.message = sMethodName + ' has been accessed with an illegal index that is either negative or greater than the size of the array.';
this.debug = 'Attempting to access index ' + iIndex.toString() + ', but array has an index range of 0 to ' + (iArrayLength - 1).toString() + '.';
}
ArrayIndexOutOfBoundsException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling IllegalArgument
* exceptions.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.2, 07/24/03
* @interface <code>new IllegalArgumentException(sMethodName,
* vExpectedArgs, iActualArgs)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param vExpectedArgs the number of arguments expected
* @param iActualArgs the number of arguments received
*/
function IllegalArgumentException(sMethodName, vExpectedArgs, iActualArgs) {
this.name = 'IllegalArgumentException';
this.message = sMethodName + ' has been passed an illegal number of arguments.';
this.debug = 'Expected ' + vExpectedArgs.toString() + ' argument(s), but received ' + iActualArgs.toString() + ' argument(s).';
}
IllegalArgumentException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling IllegalValue
* exceptions.
*
* @author Randolph Fielding
* @version 1.0, 09/22/03
* @interface <code>new IllegalValueException(sMethodName,
* sVariableName, vExpectedVal, vActualVal)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param sVariableName the name of the variable containing the illegal value
* @param vExpectedVal the value expected in the variable containing the
* illegal value
* @param vActualVal the value currently in the variable containing the
* illegal value
*/
function IllegalValueException(sMethodName, sVariableName, vExpectedVal, vActualVal) {
this.name = 'IllegalValueException';
this.message = sMethodName + ' has encountered an illegal value in variable ' + sVariableName + '.'
this.debug = 'Expected a value of ' + vExpectedVal.toString() + ', but contains a value of ' + vActualVal.toString() + '.'
}
IllegalValueException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling
* MethodNotAvailable exceptions.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 06/27/03
* @interface <code>new MethodNotAvailableException(sMethodName,
* sMethodNameNA)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param sMethodNameNA the name of the method that was not available
*/
function MethodNotAvailableException(sMethodName, sMethodNameNA) {
this.name = 'MethodNotAvailableException';
this.message = 'A method has been called that is not available.';
this.debug = sMethodName + ' attempted to call ' + sMethodNameNA + '.';
}
MethodNotAvailableException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling
* PropertyNotAvailable exceptions.
*
* @author Randolph Fielding
* @version 1.1, 08/01/03
* @interface <code>new PropertyNotAvailableException(sMethodName,
* sPropNameNA)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param sPropNameNA the name of the property that was not available
*/
function PropertyNotAvailableException(sMethodName, sPropNameNA) {
this.name = 'PropertyNotAvailableException';
this.message = 'A property has been accessed that is not available.';
this.debug = sMethodName + ' attempted to access ' + sPropNameNA + '.';
}
PropertyNotAvailableException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling TypeMismatch
* exceptions.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.2, 07/24/03
* @interface <code>new TypeMismatchException(sMethodName,
* sExpectedType, sActualType)</code>
* @param sMethodName the name of the method where the exception was thrown
* @param sExpectedType the name of the expected type of an argument
* @param sActualType the name of the actual type of an argument
*/
function TypeMismatchException(sMethodName, sExpectedType, sActualType) {
this.name = 'TypeMismatchException';
this.message = sMethodName + ' has been passed an argument with an illegal or inappropriate type.';
this.debug = 'Expected an argument with a type of ' + sExpectedType + ', but received an argument with a type of ' + sActualType + '.';
}
TypeMismatchException.prototype = new Error();
/**
* Creates an object that is a subclass of Error for handling Unknown
* exceptions.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 06/27/03
* @interface <code>new UnknownException(sMethodName)</code>
* @param sMethodName the name of the method where the exception was thrown
*/
function UnknownException(sMethodName) {
this.name = 'UnknownException';
this.message = 'An unknown error has occurred in ' + sMethodName + '.';
}
UnknownException.prototype = new Error();
</script>
<!-- debug.js -->
<script type="text/javascript">
/**
* +-------------------------------------------------------------------------+
* | jsPro - Debug |
* +-------------------------------------------------------------------------+
* | Copyright (C) 2001-2003 Stuart Wigley |
* +-------------------------------------------------------------------------+
* | This library is free software; you can redistribute it and/or modify it |
* | under the terms of the GNU Lesser General Public License as published by|
* | the Free Software Foundation; either version 2.1 of the License, or (at |
* | your option) any later version. |
* | |
* | This library is distributed in the hope that it will be useful, but |
* | WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
* | General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License|
* | along with this library; if not, write to the Free Software Foundation, |
* | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* +-------------------------------------------------------------------------+
* | Authors: Stuart Wigley <stuartwigley@yahoo.co.uk> |
* | Randolph Fielding <gator4life@cinci.rr.com> |
* +-------------------------------------------------------------------------+
* $Id: debug.js,v 1.6 2003/09/22 05:07:41 gator4life Exp $
*/
/**
* Creates an object that opens a window for debugging.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/05/03
* @interface <code>new Debug()</code>
*/
function Debug() {
this.debugWindow = window.open('../debug/debug.html', 'debug', 'width=400,height=600,resizable=yes,scrollbars=yes');
}
/**
* Clears the contents of the debug window.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/05/03
* @interface <code>Debug.clear()</code>
* @return <code>true</code> if no exceptions are encountered
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws UnknownException
*/
Debug.prototype.clear = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments != 0) {
throw vError = new IllegalArgumentException('Debug.clear', 0, iNumArguments);
}
var oMessageContainer = document.getElementById('messageContainer');
if (!oMessageContainer) {
throw vError = new UnknownException('Debug.clear');
}
while (oMessageContainer.hasChildNodes()) {
oMessageContainer.removeChild(oMessageContainer.firstChild);
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : true;
}
}
/**
* Displays content within the debug window.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.2, 09/05/03
* @interface <code>Debug.print(vMixedValue)</code>
* @interface <code>Debug.print(vMixedValue, iMessageType)</code>
* @param vMixedValue content to be displayed within the debug window
* @param iMessageType an integer representing the type of content to display
* within the debug window (information: 0; error: 1)
* (optional)
* @return <code>true</code> if no exceptions are encountered
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
* @throws UnknownException
*/
Debug.prototype.print = function(vMixedValue) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iMessageType = 0;
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('Debug.print', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iMessageType = arguments[1];
}
if ((typeof iMessageType != 'number') || (iMessageType.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('Debug.print', 'integer', typeof iMessageType);
}
if ((iMessageType != 0) && (iMessageType != 1)) {
throw vError = new IllegalValueException('Debug.print', 'iMessageType', '0 or 1', iMessageType);
}
var oDebugWindow = this.debugWindow;
if (!oDebugWindow || oDebugWindow.closed) {
throw vError = new UnknownException('Debug.print');
}
var oDocument = oDebugWindow.document;
if (!oDocument) {
throw vError = new UnknownException('Debug.print');
}
var oMessageContainer = oDocument.getElementById('messageContainer');
if (!oMessageContainer) {
throw vError = new UnknownException('Debug.print');
}
var oTitleRow = oDocument.createElement('tr');
var oTitleCell = oDocument.createElement('td');
var oBodyRow = oDocument.createElement('tr');
var oBodyCell = oDocument.createElement('td');
if (!oTitleRow || !oTitleCell || !oBodyRow || !oBodyCell) {
throw vError = new UnknownException('Debug.print');
}
var oTitleRowStyle = oTitleRow.style;
if (oTitleRowStyle) {
oTitleRowStyle.backgroundColor = '#EEE';
oTitleRowStyle.fontWeight = 700;
}
var sOutputString = vMixedValue.toString();
var sTitle = 'info';
var sBody = sOutputString;
if (iMessageType == 1) {
sTitle = sOutputString.match(/\w+/);
sBody = sOutputString.replace(/\w+/, '');
var oBodyCellStyle = oBodyCell.style;
if (oBodyCellStyle) {
oBodyCell.style.backgroundColor = '#FCC';
}
}
oMessageContainer.appendChild(oTitleRow);
oTitleRow.appendChild(oTitleCell);
oTitleCell.appendChild(oDocument.createTextNode(sTitle));
oMessageContainer.appendChild(oBodyRow);
oBodyRow.appendChild(oBodyCell);
oBodyCell.appendChild(oDocument.createTextNode(sBody));
oDebugWindow.focus();
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : true;
}
}
</script>
<!-- test.js -->
<script type="text/javascript">
/**
* +-------------------------------------------------------------------------+
* | jsPro - Test |
* +-------------------------------------------------------------------------+
* | Copyright (C) 2001-2003 Stuart Wigley |
* +-------------------------------------------------------------------------+
* | This library is free software; you can redistribute it and/or modify it |
* | under the terms of the GNU Lesser General Public License as published by|
* | the Free Software Foundation; either version 2.1 of the License, or (at |
* | your option) any later version. |
* | |
* | This library is distributed in the hope that it will be useful, but |
* | WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
* | General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License|
* | along with this library; if not, write to the Free Software Foundation, |
* | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* +-------------------------------------------------------------------------+
* | Authors: Stuart Wigley <stuartwigley@yahoo.co.uk> |
* | Randolph Fielding <gator4life@cinci.rr.com> |
* +-------------------------------------------------------------------------+
* $Id: test.js,v 1.6 2003/09/15 05:07:09 gator4life Exp $
*/
/**
* Creates an object that provides methods for testing all jsPro libraries.
*
* @author Stuart Wigley
* @version 1.0, 07/24/03
* @interface <code>new Test()</code>
*/
function Test() { }
/**
* Evaluates and returns the result of a jsPro method using assumptions about
* the structure and ids of HTML elements in the jsPro HTML test files.
*
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/20/03
* @interface <code>Test.evaluateMethod(oButton, sClass)</code>
* @param oButton the HTML input-button element that is clicked
* @param sClass the name of the jsPro class instance being tested
* @return the result of attempting to evaluate a jsPro method
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
Test.prototype.evaluateMethod = function(oButton, sClass) {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments != 2) {
throw vError = new IllegalArgumentException('Error.evaluateMethod', 2, iNumArguments);
}
if (typeof oButton != 'object') {
throw vError = new TypeMismatchException('Error.evaluateMethod', 'object', typeof oButton);
}
if (typeof sClass != 'string') {
throw vError = new TypeMismatchException('Error.evaluateMethod', 'string', typeof sClass);
}
var sMethodName = oButton.id;
var oInput1 = document.getElementById(sMethodName + '1');
var oInput2 = document.getElementById(sMethodName + '2');
var oInput3 = document.getElementById(sMethodName + '3');
var oOutput = document.getElementById(sMethodName + 'Result');
var sArguments = '';
if (oInput1) {
var sInput1Value = oInput1.value;
if (sInput1Value != '') {
var fInput1Value = parseFloat(sInput1Value);
sArguments += (isNaN(fInput1Value)) ? '\'' + sInput1Value + '\'' : fInput1Value;
}
}
if (oInput2) {
var sInput2Value = oInput2.value;
if (sInput2Value != '') {
var fInput2Value = parseFloat(sInput2Value);
sArguments += (isNaN(fInput2Value)) ? ', \'' + sInput2Value + '\'' : ', ' + fInput2Value;
}
}
if (oInput3) {
var sInput3Value = oInput3.value;
if (sInput3Value != '') {
var fInput3Value = parseFloat(sInput3Value);
sArguments += (isNaN(fInput3Value)) ? ', \'' + sInput3Value + '\'' : ', ' + fInput3Value;
}
}
var vResult = eval(sClass + '.' + sMethodName + '(' + sArguments + ')');
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
if (oOutput) {
oOutput.value = vResult;
}
}
}
</script>
<!-- string.js -->
<script type="text/javascript">
/**
* +-------------------------------------------------------------------------+
* | jsPro - String |
* +-------------------------------------------------------------------------+
* | Copyright (C) 2001-2003 Stuart Wigley |
* +-------------------------------------------------------------------------+
* | This library is free software; you can redistribute it and/or modify it |
* | under the terms of the GNU Lesser General Public License as published by|
* | the Free Software Foundation; either version 2.1 of the License, or (at |
* | your option) any later version. |
* | |
* | This library is distributed in the hope that it will be useful, but |
* | WITHOUT ANY WARRANTY; without even the implied warranty of |
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
* | General Public License for more details. |
* | |
* | You should have received a copy of the GNU Lesser General Public License|
* | along with this library; if not, write to the Free Software Foundation, |
* | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* +-------------------------------------------------------------------------+
* | Authors: Stuart Wigley <stuartwigley@yahoo.co.uk> |
* | Randolph Fielding <gator4life@cinci.rr.com> |
* +-------------------------------------------------------------------------+
* $Id: string.js,v 1.23 2003/09/25 05:03:01 gator4life Exp $
*/
/**
* Escapes null bytes, quotation marks (double quotes), apostrophes (single
* quotes), and reverse solidi (backslashes) in this string with backslashes.
*
* @summary escape certain characters with backslashes
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 07/05/03
* @interface <code>String.addSlashes()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.addSlashes = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.addSlashes', 0, iNumArguments);
}
var iStringLength = this.length;
var sEscapedString = '';
for (var i = 0; i < iStringLength; i++) {
var iCharCode = this.charCodeAt(i);
var sChar = this.charAt(i);
sEscapedString += ((iCharCode == 0) || (iCharCode == 34) || (iCharCode == 39) || (iCharCode == 92)) ? '\\' + sChar : sChar;
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sEscapedString;
}
}
/**
* Concatenate the string representation of the specified value to the end of
* this string. An end-of-line terminator specific to a certain document type
* will be inserted between the string and the specified value if a document
* type is specified.
*
* @summary concatenate
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.3, 09/25/03
* @interface <code>String.cat(vValue)</code>
* @interface <code>String.cat(vValue, iDocType)</code>
* @param vValue the value to be concatenated to the end of this string
* @param iDocType an integer representing the document type that the
* end-of-line terminator between the string and
* <code>vValue</code> conforms to (HTML: 0; XHTML: 1;
* Windows text: 2; UNIX text: 3; Macintosh text: 4)
* (optional)
* @return a concatenated string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.cat = function(vValue) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iDocType = null;
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.cat', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iDocType = arguments[1];
}
var sEolTerminator = '';
if (iDocType) {
if ((typeof iDocType != 'number') || (iDocType.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.cat', 'integer', typeof iDocType);
}
if ((iDocType != 0) && (iDocType != 1) && (iDocType != 2) && (iDocType != 3) && (iDocType != 4)) {
throw vError = new IllegalValueException('String.cat', 'iDocType', '0, 1, 2, 3 or 4', iDocType);
}
switch (iDocType) {
case 0 : sEolTerminator = '<BR>'; break;
case 1 : sEolTerminator = '<br />'; break;
case 2 : sEolTerminator = '\r\n'; break;
case 3 : sEolTerminator = '\n'; break;
case 4 : sEolTerminator = '\r'; break;
}
}
var sCatString = this + sEolTerminator + vValue.toString();
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sCatString;
}
}
/**
* Replaces all UNIX, Windows and Macintosh newline characters, tabs and
* repeated spaces in this string with single spaces.
*
* @summary compress whitespace to single spaces
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.compress()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.compress = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.compress', 0, iNumArguments);
}
var sModifiedString = this.replace(/(\r\n)|(\r)|(\n)|(\t)|(\s+)/g, ' ');
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Returns an associative array keyed on the characters of this string. Each
* member of the associative array contains an integer value representing the
* number of occurrences of that member's key in this string.
*
* @summary count occurrence of characters
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 07/05/03
* @interface <code>String.count()</code>
* @return an associative array of counted characters
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.count = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.count', 0, iNumArguments);
}
var iStringLength = this.length;
var aCountedArray = new Array();
for (var i = 0; i < iStringLength; i++) {
var sChar = this.charAt(i);
aCountedArray[sChar] = (aCountedArray[sChar] == undefined) ? 1 : ++aCountedArray[sChar];
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : aCountedArray;
}
}
/**
* Replaces all characters in this string defined in the XHTML 1.0 Entity Sets
* (Latin-1 Characters, Special Characters, and Symbols) with their Numeric
* Entity References.
*
* @summary encode XHTML 1.0 entities
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/03/03
* @interface <code>String.htmlEntities()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.htmlEntities = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.htmlEntities', 0, iNumArguments);
}
var iStringLength = this.length;
var sModifiedString = '';
for (var i = 0; i < iStringLength; i++) {
var iCharCode = this.charCodeAt(i);
if (iCharCode == 34 || iCharCode == 38 || iCharCode == 39 || iCharCode == 60 ||
iCharCode == 62 || (iCharCode >= 160 && iCharCode <= 255) || iCharCode == 338 ||
iCharCode == 339 || iCharCode == 352 || iCharCode == 353 || iCharCode == 376 ||
iCharCode == 402 || iCharCode == 710 || iCharCode == 732 || (iCharCode >= 913 &&
iCharCode <= 929) || (iCharCode >= 931 && iCharCode <= 937) || (iCharCode >= 945 &&
iCharCode <= 969) || iCharCode == 977 || iCharCode == 978 || iCharCode == 982 ||
iCharCode == 8194 || iCharCode == 8195 || iCharCode == 8201 || (iCharCode >= 8204 &&
iCharCode <= 8207) || iCharCode == 8211 || iCharCode == 8212 || (iCharCode >= 8216 &&
iCharCode <= 8218) || (iCharCode >= 8220 && iCharCode <= 8222) || (iCharCode >= 8224 &&
iCharCode <= 8226) || iCharCode == 8230 || iCharCode == 8240 || iCharCode == 8242 ||
iCharCode == 8243 || iCharCode == 8249 || iCharCode == 8250 || iCharCode == 8254 ||
iCharCode == 8260 || iCharCode == 8364 || iCharCode == 8465 || iCharCode == 8472 ||
iCharCode == 8476 || iCharCode == 8482 || iCharCode == 8501 || (iCharCode >= 8592 &&
iCharCode <= 8596) || iCharCode == 8629 || (iCharCode >= 8656 && iCharCode <= 8660) ||
iCharCode == 8704 || iCharCode == 8706 || iCharCode == 8707 || iCharCode == 8709 ||
(iCharCode >= 8711 && iCharCode <= 8713) || iCharCode == 8715 || iCharCode == 8719 ||
iCharCode == 8721 || iCharCode == 8722 || iCharCode == 8727 || iCharCode == 8730 ||
iCharCode == 8733 || iCharCode == 8734 || iCharCode == 8736 || (iCharCode >= 8743 &&
iCharCode <= 8747) || iCharCode == 8756 || iCharCode == 8764 || iCharCode == 8773 ||
iCharCode == 8776 || iCharCode == 8800 || iCharCode == 8801 || iCharCode == 8804 ||
iCharCode == 8805 || (iCharCode >= 8834 && iCharCode <= 8836) || iCharCode == 8838 ||
iCharCode == 8839 || iCharCode == 8853 || iCharCode == 8855 || iCharCode == 8869 ||
iCharCode == 8901 || (iCharCode >= 8968 && iCharCode <= 8971) || iCharCode == 9001 ||
iCharCode == 9002 || iCharCode == 9674 || iCharCode == 9824 || iCharCode == 9827 ||
iCharCode == 9829 || iCharCode == 9830) {
sModifiedString += '&#' + iCharCode + ';';
} else {
sModifiedString += this.charAt(i);
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Replaces a small group of characters in this string defined in the HTML
* 4.01 Special Characters Set with their Character Entity References.
*
* @summary encode subset of HTML special characters
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/04/03
* @interface <code>String.htmlSpecialChars()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.htmlSpecialChars = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.htmlSpecialChars', 0, iNumArguments);
}
var iStringLength = this.length;
var sModifiedString = '';
for (var i = 0; i < iStringLength; i++) {
switch (this.charCodeAt(i)) {
case 34 : sModifiedString += '"'; break;
case 38 : sModifiedString += '&' ; break;
case 39 : sModifiedString += ''' ; break;
case 60 : sModifiedString += '<' ; break;
case 62 : sModifiedString += '>' ; break;
default : sModifiedString += this.charAt(i);
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Inserts the string representation of the specified value at the beginning
* of this string or at a given position within this string (if the optional
* start argument is specified).
*
* @summary insert one string into another
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.insert(vValue)</code>
* @interface <code>String.insert(vValue, iStart)</code>
* @param vValue the value to be inserted into this string
* @param iStart the index of the character to start at (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws ArrayIndexOutOfBoundsException
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.insert = function(vValue) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iStart = 0;
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.insert', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iStart = arguments[1];
}
if ((typeof iStart != 'number') || (iStart.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.insert', 'integer', typeof iStart);
}
var iStringLength = this.length;
if ((iStart < 0) || (iStart >= iStringLength)) {
throw vError = new ArrayIndexOutOfBoundsException('String.insert', iStart, iStringLength);
}
var sModifiedString = '';
for (var i = 0; i < iStringLength; i++) {
if (i == iStart) {
sModifiedString += vValue.toString();
}
sModifiedString += this.charAt(i);
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Tests this string with a regular expression for standard email address
* compliance.
*
* @summary is email address?
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/04/03
* @interface <code>String.isEmailAddress()</code>
* @return <code>true</code> if this string is a standard email
* address
* @return <code>false</code> if this string is not a standard
* email address
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.isEmailAddress = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.isEmailAddress', 0, iNumArguments);
}
var xEmailAddress = /^[-.\w]+@(((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(([-a-zA-Z0-9]+\.)+[a-zA-Z]{2,4}))$/;
var bIsEmailAddress = xEmailAddress.test(this);
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : bIsEmailAddress;
}
}
/**
* Calculates the Levenshtein distance between this string (the source string)
* and a target string. The Levenshtein distance is an integer that represents
* the minimum number of characters you have to replace, insert or delete to
* convert a source string into a target string.
*
* @summary Levenshtein distance
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/10/03
* @interface <code>String.levenshtein(sTarget)</code>
* @param sTarget the target string
* @return the Levenshtein distance between this string and
* <code>sTarget</code>
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.levenshtein = function(sTarget) {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments != 1) {
throw vError = new IllegalArgumentException('String.levenshtein', 1, iNumArguments);
}
if (typeof sTarget != 'string') {
throw vError = new TypeMismatchException('String.levenshtein', 'string', typeof sTarget);
}
var sUpCaseSource = this.toUpperCase();
var sUpCaseTarget = sTarget.toUpperCase();
var iSourceLength = sUpCaseSource.length;
var iTargetLength = sUpCaseTarget.length;
if (iSourceLength == 0) {
var iLevenshteinDistance = iTargetLength;
} else if (iTargetLength == 0) {
var iLevenshteinDistance = iSourceLength;
} else {
var aMatrix = new Array();
for (var n = 0; n <= iSourceLength; n++) {
aMatrix[n] = new Array();
aMatrix[n][0] = n;
}
for (var m = 0; m <= iTargetLength; m++) {
aMatrix[0][m] = m;
}
for (var i = 1; i <= iSourceLength; i++) {
var sSourceChar = sUpCaseSource.charAt(i - 1);
for (var j = 1; j <= iTargetLength; j++) {
var sTargetChar = sUpCaseTarget.charAt(j - 1);
var iCost = (sSourceChar == sTargetChar) ? 0 : 1;
var iNum1 = aMatrix[i - 1][j] + 1;
var iNum2 = aMatrix[i][j - 1] + 1;
var iNum3 = aMatrix[i - 1][j - 1] + iCost;
aMatrix[i][j] = ((iNum1 < iNum2) && (iNum1 < iNum3)) ? iNum1 : (iNum2 < iNum3) ? iNum2 : iNum3;
}
}
var iLevenshteinDistance = aMatrix[iSourceLength][iTargetLength];
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : iLevenshteinDistance;
}
}
/**
* Pads the left side of this string with another string for a specified
* number of times.
*
* @summary pad left side
* @author Randolph Fielding
* @version 1.0, 08/07/03
* @interface <code>String.lpad(sPadString)</code>
* @interface <code>String.lpad(sPadString, iMultiplier)</code>
* @requires <code>String.pad(sPadString, iMultiplier, iSide)</code>
* @param sPadString the string used for padding
* @param iMultiplier the number of times to repeat <code>sPadString</code>
* (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws MethodNotAvailableException
* @throws TypeMismatchException
* @throws UnknownException
* @see <code>String.pad()</code>
*/
String.prototype.lpad = function(sPadString) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iMultiplier = 1;
if (!('pad' in this)) {
throw vError = new MethodNotAvailableException('String.lpad', 'String.pad');
}
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.lpad', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iMultiplier = arguments[1];
}
if (typeof sPadString != 'string') {
throw vError = new TypeMismatchException('String.lpad', 'string', typeof sPadString);
}
if ((typeof iMultiplier != 'number') || (iMultiplier.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.lpad', 'integer', typeof iMultiplier);
}
if (iMultiplier < 0) {
throw vError = new IllegalValueException('String.lpad', 'iMultiplier', '0 or greater', iMultiplier);
}
var sPaddedString = this.pad(sPadString, iMultiplier, -1);
if (!sPaddedString) {
throw vError = new UnknownException('String.lpad');
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sPaddedString;
}
}
/**
* Trims whitespace characters from the left side of this string.
*
* @summary trim left side
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/03/03
* @interface <code>String.ltrim()</code>
* @requires <code>String.trim(iSide)</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws MethodNotAvailableException
* @throws UnknownException
* @see <code>String.trim()</code>
*/
String.prototype.ltrim = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (!('trim' in this)) {
throw vError = new MethodNotAvailableException('String.ltrim', 'String.trim');
}
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.ltrim', 0, iNumArguments);
}
var sTrimmedString = this.trim(-1);
if (!sTrimmedString) {
throw vError = new UnknownException('String.ltrim');
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sTrimmedString;
}
}
/**
* Replaces all UNIX, Windows and Macintosh newline characters in this string
* with either HTML <BR> elements or XHTML <br /> elements.
*
* @summary newline to <br> conversion
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/04/03
* @interface <code>String.nl2br()</code>
* @interface <code>String.nl2br(iDocType)</code>
* @param iDocType an integer representing the document type to convert
* newline characters into (HTML: 0; XHTML: 1) (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.nl2br = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
var iDocType = 1;
if (iNumArguments > 1) {
throw vError = new IllegalArgumentException('String.nl2br', '0 or 1', iNumArguments);
} else if (iNumArguments == 1) {
iDocType = arguments[0];
}
if ((typeof iDocType != 'number') || (iDocType.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.nl2br', 'integer', typeof iDocType);
}
if ((iDocType != 0) && (iDocType != 1)) {
throw vError = new IllegalValueException('String.nl2br', 'iDocType', '0 or 1', iDocType);
}
switch (iDocType) {
case 0 : var sBrElement = '<BR>'; break;
case 1 :
default : var sBrElement = '<br />';
}
var sModifiedString = this.replace(/(\r\n)|(\r)|(\n)/g, sBrElement);
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Overlays the string representation of the specified value over the beginning
* of this string or over a later portion of this string (if the optional start
* argument is specified).
*
* @summary overlay one string over another
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.overlay(vValue)</code>
* @interface <code>String.overlay(vValue, iStart)</code>
* @param vValue the value to be overlayed over this string
* @param iStart the index of the character to start at (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws ArrayIndexOutOfBoundsException
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.overlay = function(vValue) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iStart = 0;
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.overlay', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iStart = arguments[1];
}
if ((typeof iStart != 'number') || (iStart.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.overlay', 'integer', typeof iStart);
}
var iStringLength = this.length;
if ((iStart < 0) || (iStart >= iStringLength)) {
throw vError = new ArrayIndexOutOfBoundsException('String.overlay', iStart, iStringLength);
}
var sModifiedString = '';
for (var i = 0; i < iStringLength; i++) {
if (i == iStart) {
var sValue = vValue.toString();
sModifiedString += sValue;
i += sValue.length;
if (i >= iStringLength) {
break;
}
}
sModifiedString += this.charAt(i);
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Pads either both sides, the left side, or the right side of this string
* with another string for a specified number of times.
*
* @summary pad
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/07/03
* @interface <code>String.pad(sPadString)</code>
* @interface <code>String.pad(sPadString, iMultiplier)</code>
* @interface <code>String.pad(sPadString, iMultiplier, iSide)</code>
* @param sPadString the string used for padding
* @param iMultiplier the number of times to repeat <code>sPadString</code>
* (optional)
* @param iSide an integer representing the side(s) of the string to
* pad (left: -1; both: 0; right: 1) (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.pad = function(sPadString) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iMultiplier = 1;
var iSide = 1;
if ((iNumArguments == 0) || (iNumArguments > 3)) {
throw vError = new IllegalArgumentException('String.pad', '1, 2 or 3', iNumArguments);
} else if (iNumArguments == 3) {
iMultiplier = arguments[1];
iSide = arguments[2];
} else if (iNumArguments == 2) {
iMultiplier = arguments[1];
}
if (typeof sPadString != 'string') {
throw vError = new TypeMismatchException('String.pad', 'string', typeof sPadString);
}
if ((typeof iMultiplier != 'number') || (iMultiplier.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.pad', 'integer', typeof iMultiplier);
}
if (iMultiplier < 0) {
throw vError = new IllegalValueException('String.pad', 'iMultiplier', '0 or greater', iMultiplier);
}
if ((typeof iSide != 'number') || (iSide.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.pad', 'integer', typeof iSide);
}
if ((iSide != -1) && (iSide != 0) && (iSide != 1)) {
throw vError = new IllegalValueException('String.pad', 'iSide', '-1, 0 or 1', iSide);
}
var sRepeatedPadString = '';
for (var i = 0; i < iMultiplier; i++) {
sRepeatedPadString += sPadString;
}
switch (iSide) {
case -1 : var sPaddedString = sRepeatedPadString + this; break;
case 0 : var sPaddedString = sRepeatedPadString + this + sRepeatedPadString; break;
case 1 :
default : var sPaddedString = this + sRepeatedPadString;
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sPaddedString;
}
}
/**
* Removes all characters from this string or a subset of characters from this
* string (if the optional start and length arguments are specified).
*
* @summary remove characters
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.remove()</code>
* @interface <code>String.remove(iStart)</code>
* @interface <code>String.remove(iStart, iLength)</code>
* @param iStart the index of the character to start at (optional)
* @param iLength the number of characters to remove beginning at
* <code>iStart</code> (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws ArrayIndexOutOfBoundsException
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.remove = function() {
try {
var vError = null;
var iStringLength = this.length;
var iNumArguments = arguments.length;
var iStart = 0;
var iLength = iStringLength;
if (iNumArguments > 2) {
throw vError = new IllegalArgumentException('String.remove', '0, 1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iStart = arguments[0];
iLength = arguments[1];
} else if (iNumArguments == 1) {
iStart = arguments[0];
iLength -= iStart;
}
if ((typeof iStart != 'number') || (iStart.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.remove', 'integer', typeof iStart);
}
if ((typeof iLength != 'number') || (iLength.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.remove', 'integer', typeof iLength);
}
var iEnd = iStart + iLength;
if (iStart < 0) {
throw vError = new ArrayIndexOutOfBoundsException('String.remove', iStart, iStringLength);
}
if (iLength <= 0) {
throw vError = new ArrayIndexOutOfBoundsException('String.remove', iLength, iStringLength);
}
if (iEnd > iStringLength) {
throw vError = new ArrayIndexOutOfBoundsException('String.remove', iEnd, iStringLength);
}
var sModifiedString = this.replace(new RegExp(this.slice(iStart, iEnd)), '');
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Repeats this string a specified number of times.
*
* @summary repeat
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/04/03
* @interface <code>String.repeat(iMultiplier)</code>
* @param iMultiplier the number of times to repeat this string
* @return a new string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.repeat = function(iMultiplier) {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments != 1) {
throw vError = new IllegalArgumentException('String.repeat', 1, iNumArguments);
}
if ((typeof iMultiplier != 'number') || (iMultiplier.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.repeat', 'integer', typeof iMultiplier);
}
if (iMultiplier < 0) {
throw vError = new IllegalValueException('String.repeat', 'iMultiplier', '0 or greater', iMultiplier);
}
var sRepeatedString = '';
for (var i = 0; i < iMultiplier; i++) {
sRepeatedString += this;
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sRepeatedString;
}
}
/**
* Repeats each character in this string, in succession, a specified number of
* times.
*
* @summary repeat characters
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.repeatChars(iMultiplier)</code>
* @param iMultiplier the number of times to repeat each character in this
* string
* @return a new string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.repeatChars = function(iMultiplier) {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments != 1) {
throw vError = new IllegalArgumentException('String.repeatChars', 1, iNumArguments);
}
if ((typeof iMultiplier != 'number') || (iMultiplier.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.repeatChars', 'integer', typeof iMultiplier);
}
if (iMultiplier < 0) {
throw vError = new IllegalValueException('String.repeatChars', 'iMultiplier', '0 or greater', iMultiplier);
}
var iStringLength = this.length;
var sRepeatedString = '';
for (var i = 0; i < iStringLength; i++) {
for (var j = 0; j < iMultiplier; j++) {
sRepeatedString += this.charAt(i);
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sRepeatedString;
}
}
/**
* Reverses the order of all characters within this string or a subset of
* characters within this string (if the optional start and length arguments
* are specified).
*
* @summary reverse
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/03/03
* @interface <code>String.reverse()</code>
* @interface <code>String.reverse(iStart)</code>
* @interface <code>String.reverse(iStart, iLength)</code>
* @param iStart the index of the character to start at (optional)
* @param iLength the number of characters to reverse the order of
* beginning at <code>iStart</code> (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws ArrayIndexOutOfBoundsException
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.reverse = function() {
try {
var vError = null;
var iStringLength = this.length;
var iNumArguments = arguments.length;
var iStart = 0;
var iLength = iStringLength;
if (iNumArguments > 2) {
throw vError = new IllegalArgumentException('String.reverse', '0, 1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iStart = arguments[0];
iLength = arguments[1];
} else if (iNumArguments == 1) {
iStart = arguments[0];
iLength -= iStart;
}
if ((typeof iStart != 'number') || (iStart.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.reverse', 'integer', typeof iStart);
}
if ((typeof iLength != 'number') || (iLength.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.reverse', 'integer', typeof iLength);
}
var iEnd = iStart + iLength;
if (iStart < 0) {
throw vError = new ArrayIndexOutOfBoundsException('String.reverse', iStart, iStringLength);
}
if (iLength <= 0) {
throw vError = new ArrayIndexOutOfBoundsException('String.reverse', iLength, iStringLength);
}
if (iEnd > iStringLength) {
throw vError = new ArrayIndexOutOfBoundsException('String.reverse', iEnd, iStringLength);
}
var sStringBeginning = this.substr(0, iStart);
var sStringEnd = this.substr(iEnd);
var sReversedString = '';
for (var i = iEnd - 1; i >= iStart; i--) {
sReversedString += this.charAt(i);
}
var sModifiedString = sStringBeginning + sReversedString + sStringEnd;
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Performs rot13 encoding on this string, which shifts every letter in this
* string by 13 places of the alphabet and leaves numbers or other characters
* unchanged.
*
* @summary rotate 13 encoding
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/09/03
* @interface <code>String.rot13()</code>
* @return an encoded string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.rot13 = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.rot13', 0, iNumArguments);
}
var sLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var iStringLength = this.length;
var sEncodedString = '';
for (var i = 0; i < iStringLength; i++) {
var iCharCode = this.charCodeAt(i);
var sChar = this.charAt(i);
if ((iCharCode < 65) || ((iCharCode > 90) && (iCharCode < 97)) || (iCharCode > 122)) {
sEncodedString += sChar;
} else {
var iCharIndex = sLetters.search(new RegExp(sChar));
if (iCharIndex != -1) {
if (((iCharIndex >= 0) && (iCharIndex <= 12)) || ((iCharIndex >= 26) && (iCharIndex <= 38))) {
sEncodedString += sLetters.charAt(iCharIndex + 13);
} else{
sEncodedString += sLetters.charAt(iCharIndex - 13);
}
} else {
sEncodedString += sChar;
}
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sEncodedString;
}
}
/**
* Pads the right side of this string with another string for a specified
* number of times.
*
* @summary pad right side
* @author Randolph Fielding
* @version 1.0, 08/07/03
* @interface <code>String.rpad(sPadString)</code>
* @interface <code>String.rpad(sPadString, iMultiplier)</code>
* @requires <code>String.pad(sPadString, iMultiplier, iSide)</code>
* @param sPadString the string used for padding
* @param iMultiplier the number of times to repeat <code>sPadString</code>
* (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws MethodNotAvailableException
* @throws TypeMismatchException
* @throws UnknownException
* @see <code>String.pad()</code>
*/
String.prototype.rpad = function(sPadString) {
try {
var vError = null;
var iNumArguments = arguments.length;
var iMultiplier = 1;
if (!('pad' in this)) {
throw vError = new MethodNotAvailableException('String.rpad', 'String.pad');
}
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.rpad', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
iMultiplier = arguments[1];
}
if (typeof sPadString != 'string') {
throw vError = new TypeMismatchException('String.rpad', 'string', typeof sPadString);
}
if ((typeof iMultiplier != 'number') || (iMultiplier.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.rpad', 'integer', typeof iMultiplier);
}
if (iMultiplier < 0) {
throw vError = new IllegalValueException('String.rpad', 'iMultiplier', '0 or greater', iMultiplier);
}
var sPaddedString = this.pad(sPadString, iMultiplier, 1);
if (!sPaddedString) {
throw vError = new UnknownException('String.rpad');
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sPaddedString;
}
}
/**
* Trims whitespace characters from the right side of this string.
*
* @summary trim right side
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/03/03
* @interface <code>String.rtrim()</code>
* @requires <code>String.trim(iSide)</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws MethodNotAvailableException
* @throws UnknownException
* @see <code>String.trim()</code>
*/
String.prototype.rtrim = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (!('trim' in this)) {
throw vError = new MethodNotAvailableException('String.rtrim', 'String.trim');
}
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.rtrim', 0, iNumArguments);
}
var sTrimmedString = this.trim(1);
if (!sTrimmedString) {
throw vError = new UnknownException('String.rtrim');
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sTrimmedString;
}
}
/**
* Swaps every second character in this string with the character immediately
* preceding it.
*
* @summary swap characters
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.swap()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.swap = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.swap', 0, iNumArguments);
}
var iStringLength = this.length;
var sModifiedString = '';
for (var i = 0; i < iStringLength; i += 2) {
if ((i + 1) < iStringLength) {
sModifiedString += this.charAt(i + 1);
}
sModifiedString += this.charAt(i);
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Trims whitespace characters from either both sides, the left side, or the
* right side of this string.
*
* @summary trim
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/03/03
* @interface <code>String.trim()</code>
* @interface <code>String.trim(iSide)</code>
* @param iSide an integer representing the side(s) of the string to
* trim whitespace from (left: -1; both: 0; right: 1)
* (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.trim = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
var iSide = 0;
if (iNumArguments > 1) {
throw vError = new IllegalArgumentException('String.trim', '0 or 1', iNumArguments);
} else if (iNumArguments == 1) {
iSide = arguments[0];
}
if ((typeof iSide != 'number') || (iSide.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.trim', 'integer', typeof iSide);
}
if ((iSide != -1) && (iSide != 0) && (iSide != 1)) {
throw vError = new IllegalValueException('String.trim', 'iSide', '-1, 0 or 1', iSide);
}
switch (iSide) {
case -1 : var sTrimmedString = this.replace(/^\s*/, ''); break;
case 1 : var sTrimmedString = this.replace(/\s*$/, ''); break;
case 0 :
default : var sTrimmedString = this.replace(/^\s*/, '').replace(/\s*$/, '');
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sTrimmedString;
}
}
/**
* Truncates this string to the specified length. If specified, the final three
* characters of the truncated string are replaced with an ellipsis.
*
* @summary truncate
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 09/21/03
* @interface <code>String.truncate(iLength)</code>
* @interface <code>String.truncate(iLength, bUseEllipsis)</code>
* @param iLength the index of the character to truncate at
* @param bUseEllipsis a boolean value representing whether the final three
* characters should be replaced with an ellipsis or not
* (optional)
* @return the original string if (1) <code>iLength</code> is
* greater than or equal to the length of the original
* string or (2) <code>iLength <= 3</code> and
* <code>bUseEllipsis = true</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws ArrayIndexOutOfBoundsException
* @throws IllegalArgumentException
* @throws TypeMismatchException
*/
String.prototype.truncate = function(iLength) {
try {
var vError = null;
var iNumArguments = arguments.length;
var bUseEllipsis = false;
if ((iNumArguments < 1) || (iNumArguments > 2)) {
throw vError = new IllegalArgumentException('String.truncate', '1 or 2', iNumArguments);
} else if (iNumArguments == 2) {
bUseEllipsis = arguments[1];
}
if ((typeof iLength != 'number') || (iLength.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.truncate', 'integer', typeof iLength);
}
if (typeof bUseEllipsis != 'boolean') {
throw vError = new TypeMismatchException('String.truncate', 'boolean', typeof bUseEllipsis);
}
var iStringLength = this.length;
if (iLength < 0) {
throw vError = new ArrayIndexOutOfBoundsException('String.truncate', iLength, iStringLength);
}
var sTruncatedString = '';
if ((iLength >= iStringLength) || (bUseEllipsis && (iLength <= 3))) {
sTruncatedString = this;
} else {
for (var i = 0; i < iLength; i++) {
sTruncatedString += (bUseEllipsis && ((iLength - i) <= 3)) ? '.' : this.charAt(i);
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sTruncatedString;
}
}
/**
* Converts the first character of this string to uppercase.
*
* @summary uppercase first character
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 07/05/03
* @interface <code>String.ucFirst()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.ucFirst = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.ucFirst', 0, iNumArguments);
}
var sModifiedString = this.charAt(0).toUpperCase() + this.substr(1);
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Converts the first character of each word in this string to uppercase.
*
* @summary uppercase words
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/07/03
* @interface <code>String.ucWords()</code>
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
*/
String.prototype.ucWords = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
if (iNumArguments > 0) {
throw vError = new IllegalArgumentException('String.ucWords', 0, iNumArguments);
}
var iStringLength = this.length;
var sModifiedString = '';
var bUpperCase = false;
for (var i = 0; i < iStringLength; i++) {
var iCharCode = this.charCodeAt(i);
var sChar = this.charAt(i);
var sUpperChar = sChar.toUpperCase();
if ((iCharCode == 9) || (iCharCode == 10) || (iCharCode == 11) || (iCharCode == 13) || (iCharCode == 14) || (iCharCode == 32)) {
sModifiedString += sChar;
bUpperCase = true;
} else if (i == 0) {
sModifiedString += sUpperChar;
} else {
if (bUpperCase) {
sModifiedString += sUpperChar;
bUpperCase = false;
} else {
sModifiedString += sChar;
}
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
/**
* Wraps this string at a specified column width with a specified end-of-line
* terminator designated by the document type. Words can also be split during
* the wrap if specified.
*
* @summary word wrap
* @author Stuart Wigley
* @author Randolph Fielding
* @version 1.1, 08/10/03
* @interface <code>String.wordWrap()</code>
* @interface <code>String.wordWrap(iColumnNum)</code>
* @interface <code>String.wordWrap(iColumnNum, iDocType)</code>
* @interface <code>String.wordWrap(iColumnNum, iDocType,
* bSplitWords)</code>
* @param iColumnNum the column number where wrapping should occur
* (optional)
* @param iDocType an integer representing the document type that
* end-of-line terminators conform to (HTML: 0; XHTML: 1;
* Windows text: 2; UNIX text: 3; Macintosh text: 4)
* (optional)
* @param bSplitWords designates whether words should be split during the
* wrap (optional)
* @return a modified string
* @return <code>null</code> if an exception is encountered
* @throws IllegalArgumentException
* @throws IllegalValueException
* @throws TypeMismatchException
*/
String.prototype.wordWrap = function() {
try {
var vError = null;
var iNumArguments = arguments.length;
var iColumnNum = 80;
var iDocType = 1;
var bSplitWords = false;
if (iNumArguments > 3) {
throw vError = new IllegalArgumentException('String.wordWrap', '0, 1, 2 or 3', iNumArguments);
} else if (iNumArguments == 3) {
iColumnNum = arguments[0];
iDocType = arguments[1];
bSplitWords = arguments[2];
} else if (iNumArguments == 2) {
iColumnNum = arguments[0];
iDocType = arguments[1];
} else if (iNumArguments == 1) {
iColumnNum = arguments[0];
}
if ((typeof iColumnNum != 'number') || (iColumnNum.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.wordWrap', 'integer', typeof iColumnNum);
}
if (iColumnNum < 1) {
throw vError = new IllegalValueException('String.wordWrap', 'iColumnNum', '1 or greater', iColumnNum);
}
if ((typeof iDocType != 'number') || (iDocType.toString().indexOf('.') != -1)) {
throw vError = new TypeMismatchException('String.wordWrap', 'integer', typeof iDocType);
}
if ((iDocType != 0) && (iDocType != 1) && (iDocType != 2) && (iDocType != 3) && (iDocType != 4)) {
throw vError = new IllegalValueException('String.wordWrap', 'iDocType', '0, 1, 2, 3 or 4', iDocType);
}
if (typeof bSplitWords != 'boolean') {
throw vError = new TypeMismatchException('String.wordWrap', 'boolean', typeof bSplitWords);
}
switch (iDocType) {
case 0 : var sEolTerminator = '<BR>'; break;
case 2 : var sEolTerminator = '\r\n'; break;
case 3 : var sEolTerminator = '\n'; break;
case 4 : var sEolTerminator = '\r'; break;
case 1 :
default : var sEolTerminator = '<br />';
}
var sModifiedString = '';
if (bSplitWords) {
var iStringLength = this.length;
for (var i = 0; i < iStringLength; i++) {
var sChar = this.charAt(i);
if (((i % iColumnNum) == 0) && (i != 0)) {
sModifiedString += sEolTerminator + sChar;
} else {
sModifiedString += sChar;
}
}
} else {
var aWords = this.split(' ');
var iNumWords = aWords.length;
var iLineLength = 0;
for (var j = 0; j < iNumWords; j++) {
var iWordLength = aWords[j].length;
var iTempLineLength = iWordLength + iLineLength;
if (iTempLineLength > iColumnNum) {
sModifiedString += sEolTerminator + aWords[j] + ((j == (iNumWords - 1)) ? '' : ' ');
iLineLength = iWordLength + 1;
} else if (iTempLineLength == iColumnNum) {
sModifiedString += aWords[j] + ((j == (iNumWords - 1)) ? '' : sEolTerminator);
iLineLength = 0;
} else {
sModifiedString += aWords[j] + ((j == (iNumWords - 1)) ? '' : ' ');
iLineLength += iWordLength + 1;
}
}
}
}
catch (vError) {
if (vError instanceof Error) {
vError.handleError();
}
}
finally {
return vError ? null : sModifiedString;
}
}
</script>
<script type="text/javascript">
var oDebug = new Debug();
var oTest = new Test();
</script>
</head>
<body>
<table>
<tbody>
<tr>
<td colspan="4"><input id="inputString" name="inputString" type="text" size="50" /></td>
</tr>
<tr>
<td>String.addSlashes()</td>
<td> </td>
<td><input id="addSlashes" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="addSlashesResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.cat()</td>
<td>
<input id="cat1" name="input" type="text" size="5" />
<input id="cat2" name="input" type="text" size="5" />
</td>
<td><input id="cat" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="catResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.compress()</td>
<td> </td>
<td><input id="compress" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="compressResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.count()</td>
<td> </td>
<td><input id="count" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="countResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.htmlEntities()</td>
<td> </td>
<td><input id="htmlEntities" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="htmlEntitiesResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.htmlSpecialChars()</td>
<td> </td>
<td><input id="htmlSpecialChars" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="htmlSpecialCharsResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.insert()</td>
<td>
<input id="insert1" name="input" type="text" size="5" />
<input id="insert2" name="input" type="text" size="5" />
</td>
<td><input id="insert" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="insertResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.isEmailAddress()</td>
<td> </td>
<td><input id="isEmailAddress" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="isEmailAddressResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.levenshtein()</td>
<td><input id="levenshtein1" name="input" type="text" size="5" /></td>
<td><input id="levenshtein" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="levenshteinResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.lpad()</td>
<td>
<input id="lpad1" name="input" type="text" size="5" />
<input id="lpad2" name="input" type="text" size="5" />
</td>
<td><input id="lpad" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="lpadResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.ltrim()</td>
<td> </td>
<td><input id="ltrim" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="ltrimResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.nl2br()</td>
<td><input id="nl2br1" name="input" type="text" size="5" /></td>
<td><input id="nl2br" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="nl2brResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.overlay()</td>
<td>
<input id="overlay1" name="input" type="text" size="5" />
<input id="overlay2" name="input" type="text" size="5" />
</td>
<td><input id="overlay" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="overlayResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.pad()</td>
<td>
<input id="pad1" name="input" type="text" size="5" />
<input id="pad2" name="input" type="text" size="5" />
<input id="pad3" name="input" type="text" size="5" />
</td>
<td><input id="pad" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="padResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.remove()</td>
<td>
<input id="remove1" name="input" type="text" size="5" />
<input id="remove2" name="input" type="text" size="5" />
</td>
<td><input id="remove" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="removeResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.repeat()</td>
<td><input id="repeat1" name="input" type="text" size="5" /></td>
<td><input id="repeat" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="repeatResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.repeatChars()</td>
<td><input id="repeatChars1" name="input" type="text" size="5" /></td>
<td><input id="repeatChars" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="repeatCharsResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.reverse()</td>
<td>
<input id="reverse1" name="input" type="text" size="5" />
<input id="reverse2" name="input" type="text" size="5" />
</td>
<td><input id="reverse" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="reverseResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.rot13()</td>
<td> </td>
<td><input id="rot13" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="rot13Result" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.rpad()</td>
<td>
<input id="rpad1" name="input" type="text" size="5" />
<input id="rpad2" name="input" type="text" size="5" />
</td>
<td><input id="rpad" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="rpadResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.rtrim()</td>
<td> </td>
<td><input id="rtrim" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="rtrimResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.swap()</td>
<td> </td>
<td><input id="swap" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="swapResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.trim()</td>
<td><input id="trim1" name="input" type="text" size="5" /></td>
<td><input id="trim" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="trimResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.truncate()</td>
<td>
<input id="truncate1" name="input" type="text" size="5" />
<input id="truncate2" name="input" type="text" size="5" />
</td>
<td><input id="truncate" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="truncateResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.ucFirst()</td>
<td> </td>
<td><input id="ucFirst" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="ucFirstResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.ucWords()</td>
<td> </td>
<td><input id="ucWords" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="ucWordsResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
<tr>
<td>String.wordWrap()</td>
<td>
<input id="wordWrap1" name="input" type="text" size="5" />
<input id="wordWrap2" name="input" type="text" size="5" />
<input id="wordWrap3" name="input" type="text" size="5" />
</td>
<td><input id="wordWrap" type="button" value="Calculate >" onclick="oTest.evaluateMethod(this, '\'' + document.getElementById('inputString').value + '\'')" /></td>
<td><input id="wordWrapResult" name="output" type="text" size="30" readonly="readonly" /></td>
</tr>
</tbody>
</table>
</body>
</html>
|