/* -------------------------------------------------------------------------- */
/*                              String  Methods                               */
/* -------------------------------------------------------------------------- */

String.prototype.isEmpty = _isEmpty;
function _isEmpty() {
    return JSV_isEmpty(this);
}

String.prototype.isWhitespace = _isWhitespace;
function _isWhitespace() {
    return JSV_isWhitespace(this);
}

String.prototype.isAlphabetic = _isAlphabetic;
function _isAlphabetic() {
	return JSV_isAlphabetic(this);
}

String.prototype.stripString = _stripString;
function _stripString(expS) {
	return JSV_stripString(this, expS);
}

String.prototype.replace = _replace;
function _replace(expS1, expS2) {
	return JSV_replace(this, expS1, expS2);
}

String.prototype.occurs = _occurs;
function _occurs(expS) {
	return JSV_occurs(this, expS);
}

String.prototype.replicate = _replicate;
function _replicate(expN) {
	return JSV_replicate(this, expN);
}

String.prototype.splitString = _splitString;
function _splitString(expD) {
	return JSV_splitString(this, expD);
}

String.prototype.stripCharacters = _stripCharacters;
function _stripCharacters(expS) {
	return JSV_stripCharacters(this, expS);
}

String.prototype.allowInString = _allowInString;
function _allowInString(expS) {
	return JSV_allowInString(this, expS);
}

String.prototype.trimL = _trimL;
function _trimL(expT) {
	return JSV_trimL(this, expT);
}

String.prototype.trimR = _trimR;
function _trimR(expT) {
	return JSV_trimR(this, expT);
}

String.prototype.trimAll = _trimAll;
function _trimAll(expT) {
	return JSV_trimAll(this, expT);
}

String.prototype.padL = _padL;
function _padL(expN, padChar) {
	return JSV_padL(this, expN, padChar);
}

String.prototype.padR = _padR;
function _padR(expN, padChar) {
	return JSV_padR(this, expN, padChar);
}

String.prototype.padC = _padC;
function _padC(expN, padChar) {
	return JSV_padC(this, expN, padChar);
}

String.prototype.parseString = _parseString;
function _parseString(delimiters, keepDelimiters) {
	return JSV_parseString(this, delimiters, keepDelimiters);
}

String.prototype.reverse = _reverse;
function _reverse() {
	return JSV_reverse(this);
}

String.prototype.toCharacterEntity = _toCharacterEntity;
function _toCharacterEntity() {
	return JSV_toCharacterEntity(this);
}

String.prototype.capitalize = _capitalize;
function _capitalize() {
	return JSV_capitalize(this);
}

function JSV_toString(exp) {
	return exp + '';
}

function JSV_toBoolean(expV) {
	var booleanValue = true;
	if (JSV_toBoolean.arguments[0] == null) {
		booleanValue = false;
	}
	else {
		var sValue = JSV_toString(expV).toLowerCase();
		if ( sValue == '0' || sValue == "no" || sValue == "false" || sValue.length == 0) {
			booleanValue = false;
		}
	}
	return booleanValue;
}

function JSV_isEmpty(expS) {
    return (expS == null || JSV_toString(expS).length == 0) ? true : false;
}

function JSV_isWhitespace(expS) {
	var allWhitespace = true;
    if ( JSV_isWhitespace.arguments[0] != null ) {
		if (typeof expS != "string") expS = expS.toString();
		if (expS.length != 0) {
			var i = 0;
			var whitespace = " \t\n\r";
	    	for (i=0; i<expS.length; i++) {
		        if (whitespace.indexOf( expS.charAt(i) ) == -1) {
					allWhitespace = false;
					break;
				}
		    }
		}
	}
    return allWhitespace;
}

function JSV_isAlphabetic(expS) {
	var allAlpha = false;

	if ( !JSV_isEmpty(JSV_isAlphabetic.arguments[0]) ) {
		var remainingCharacters = JSV_stripCharacters(expS.toLowerCase(), jsvLowercaseLetters);
		allAlpha = ( remainingCharacters.length == 0 ? true : false );
	}

	return allAlpha;
}

function JSV_stripString(expS1, expS2) {
	var newString = expS1;

	if ( !JSV_isEmpty(JSV_stripString.arguments[0]) && 
			!JSV_isEmpty(JSV_stripString.arguments[1]) ) {
		var tmpString = expS1,
			indexLocation = tmpString.indexOf(expS2);

		newString = '';
		while(indexLocation != -1) {
			newString += tmpString.substring(0,indexLocation);
			tmpString = tmpString.substring(indexLocation+expS2.length,tmpString.length);
			indexLocation = tmpString.indexOf(expS2);
		}
		newString += tmpString;
	}

	return newString;
}

function JSV_replace(expS1, expS2, expS3) {
	var	newString = new String(expS1);

	if ( JSV_replace.arguments.length > 1 &&
			!JSV_isEmpty(JSV_replace.arguments[0]) &&
			!JSV_isEmpty(JSV_replace.arguments[1]) ) {

		if ( !JSV_isEmpty(JSV_replace.arguments[2]) ) {
			var	tmpString = expS1,
				indexLocation = tmpString.indexOf(expS2);

			newString = '';

			while(indexLocation != -1) {
				newString += ( tmpString.substring(0,indexLocation) + expS3 );
				tmpString = tmpString.substring(indexLocation+expS2.length,tmpString.length);
				indexLocation = tmpString.indexOf(expS2);
			}
			newString += tmpString;

		}
		else {
			newString = JSV_stripString(newString,expS2);
		}
	}

	return newString;
}

function JSV_occurs(expS1, expS2) {
	var numberOfOccurrences = 0;

    if ( !JSV_isEmpty(JSV_occurs.arguments[0]) && !JSV_isEmpty(JSV_occurs.arguments[1])) {
		if (expS1 == expS2) {
			numberOfOccurrences = 1;
		}
		else {
			var tmpString = JSV_replace(expS1, expS2);

			if (tmpString != expS1) {
				if (tmpString.length == 0)
					numberOfOccurrences = expS1.length/expS2.length;
				else
					numberOfOccurrences = (expS1.length - tmpString.length)/expS2.length;
			}
		}
	}

    return numberOfOccurrences;
}

function JSV_replicate(expS, expN) {
	var repeatedString = expS;

	if ( !JSV_isEmpty(JSV_replicate.arguments[0]) && 
			!JSV_isEmpty(JSV_replicate.arguments[1]) ) {
		if (expN > 1) {
			var i = 0; repeatedString = '';
			for (i=0; i<expN; i++) repeatedString += expS;
		}
	}

	return repeatedString;
}

function JSV_splitString(expS, delimiter) {
	var parsedElements = new Array();

	parsedElements[0] = '';
	if (JSV_splitString.arguments[1] == null) delimiter = jsvCommaDelimiter;

	if ( !JSV_isEmpty(JSV_splitString.arguments[0]) ) {
		var numberOfSeparators = 0,
			tmpString = expS;

		parsedElements[0] = tmpString;
		numberOfSeparators = JSV_occurs(tmpString,delimiter);

		if (numberOfSeparators != 0) {
			var i = 0, j = 0, parseMark = 0;
			for (i=0; i<numberOfSeparators; i++) {
				parseMark = tmpString.indexOf(delimiter);
				if (tmpString.substring(0,parseMark).length != 0) {
					parsedElements[j] = tmpString.substring(0,parseMark);
					j++;
				}
				tmpString = tmpString.substring(parseMark+1,tmpString.length);
			}
			if (tmpString.length != 0) parsedElements[j] = tmpString;
		}
	}

	return parsedElements;
}

function JSV_stripCharacters(expS1, expS2) {
	var	strippedString = expS1;

	if( !JSV_isEmpty(JSV_stripCharacters.arguments[0]) && 
			!JSV_isEmpty(JSV_stripCharacters.arguments[1])) {
		var	i = 0, j = 0,
			strip = false,
			oneChar = '';

		strippedString = '';

		for (i=0; i < expS1.length; i++)  {
			strip = false;
			oneChar = expS1.substring(i, i+1);
			for (j=0; j<expS2.length; j++) {
	            if (oneChar == expS2.charAt(j)) {
					strip = true;
					break;
				}
			}
	
			if (!strip) strippedString += oneChar;
		}
	}

	return strippedString;
}

function JSV_allowInString(expS1, expS2)  {
	var allowed = false;

	if ( !JSV_isEmpty(JSV_allowInString.arguments[0]) &&
			!JSV_isEmpty(JSV_allowInString.arguments[1]) ) {
		if (JSV_stripCharacters(expS1,expS2).length == 0) allowed = true;
	}

	return allowed;
}

function JSV_trimL(expS, expT) {
	var trimChar = (JSV_trimL.arguments[1] == null) ? " " : expT;
	if ( !JSV_isEmpty(JSV_trimL.arguments[0]) ) {
		var startPosition = 0;
		while (startPosition<=expS.length && expS.charAt(startPosition) == trimChar)
			startPosition++;
		expS = expS.substring(startPosition,expS.length)
	}
	return expS;
}

function JSV_trimR(expS, expT) {
	var trimChar = (JSV_trimR.arguments[1] == null) ? " " : expT;
	if ( !JSV_isEmpty(JSV_trimR.arguments[0]) ) {
		var endPosition = expS.length - 1;
		while (endPosition >= 0 && expS.charAt(endPosition) == trimChar)
			endPosition--;
		expS = expS.substring(0,endPosition+1);
	}
	return expS;
}

function JSV_trimAll(expS, expT){
	if ( !JSV_isEmpty(expS) ) {
		var trimChar = (JSV_trimAll.arguments[1] == null) ? " " : expT;
		return JSV_trimR( JSV_trimL(expS, trimChar), trimChar );
	}
	else {
		return expS;
	}
}

function JSV_padL(expS, expN, expP) {
	var paddedString = expS;
	var padChar = ( JSV_isEmpty(JSV_padL.arguments[2]) ? " " : JSV_toString(expP) );
	if ( !JSV_isEmpty(JSV_padL.arguments[0]) && 
			!JSV_isEmpty(JSV_padL.arguments[1]) && 
			parseInt(expN) > 0 ) {
		expS = JSV_toString(expS);
		if (expS.length < parseInt(expN))
			paddedString = JSV_replicate(padChar, parseInt(expN) - expS.length) + expS;
	}

	return paddedString;
}

function JSV_padR(expS, expN, expP) {
	var paddedString = expS;
	var padChar = ( JSV_isEmpty(JSV_padR.arguments[2]) ? " " : JSV_toString(expP) );
	if ( !JSV_isEmpty(JSV_padR.arguments[0]) && 
			!JSV_isEmpty(JSV_padR.arguments[1]) && 
			parseInt(expN) > 0 ) {
		expS = JSV_toString(expS);
		if (expS.length < parseInt(expN))
			paddedString = expS + JSV_replicate(padChar, parseInt(expN) - expS.length);
	}

	return paddedString;
}

function JSV_padC(expS, expN, expP) {
	var paddedString = expS;
	var padChar = ( JSV_isEmpty(JSV_padC.arguments[2]) ? " " : JSV_toString(expP) );
	if ( !JSV_isEmpty(JSV_padC.arguments[0]) && 
			!JSV_isEmpty(JSV_padC.arguments[1]) && 
			parseInt(expN) > 0 ) {
		expS = JSV_toString(expS);
		if (expS.length < parseInt(expN)) {
			var leftPad = Math.ceil( (parseInt(expN) - expS.length)/2 ),
				rightPad = Math.floor( (parseInt(expN) - expS.length)/2 );
			paddedString = JSV_replicate(padChar, leftPad) + expS + JSV_replicate(padChar, rightPad);
		}
	}
	return paddedString;
}

function JSV_parseString(expS, delimiters, keepDelimiters) {
	var elementNo = 0,
		parsedElements = new Array();

	parsedElements[elementNo] = expS;
	if (JSV_parseString.arguments[2] == null) keepDelimiters = true;

	if ( !JSV_isEmpty(JSV_parseString.arguments[0]) && !JSV_isEmpty(JSV_parseString.arguments[1]) ) {
		var i = 0, StartParse = 0, EndParse = 0;

		for(i=0; i<expS.length; i++) {
			if (delimiters.indexOf( expS.charAt(i) ) != -1) {
				if (i == 0)
					StartParse = 1;
				else {
					EndParse = i;
					parsedElements[elementNo] = expS.substring(StartParse,EndParse);
					elementNo++;
					StartParse = EndParse+1;
				}

				if (keepDelimiters) {
					parsedElements[elementNo] = expS.charAt(i);
					elementNo++;
				}
			}
		}

		if (elementNo > 0) {
			StartParse = EndParse+1; EndParse = expS.length;
			if (StartParse < EndParse)
				parsedElements[elementNo] = expS.substring(StartParse,EndParse);
		}
	}

	return parsedElements;
}

function JSV_reverse(expS) {
	var i = 0, t = expS, N = expS.length;
	if (N > 1) {
		t = '';
		for (i=0; i<N; i++)
			t += expS.substring(N-i-1, N-i);
	}
	return t;
}

// Required operation for JSV_toCharacterEntity
function _ec(ac, ec) {
	this.ansi = ac;
	this.extended = ec;
}

function JSV_toCharacterEntity(expS) {
	var internalString = expS;
	if ( !JSV_isWhitespace(expS) ) {
		var extendedCharacters = new Array();
		extendedCharacters[0] = new _ec('&', '&amp;');	// This MUST be first
		extendedCharacters[1] = new _ec('<', '&lt;');
		extendedCharacters[2] = new _ec('>', '&gt;');
		extendedCharacters[3] = new _ec('\"', '&quot;');

		var i = 0;
		for (i=0; i<extendedCharacters.length; i++) {
			internalString = 
				JSV_replace(internalString, extendedCharacters[i].ansi, extendedCharacters[i].extended);
		}
	}
	return internalString;
}

var RESETCASE = 1;
var TITLECASE = 2;
var CAPITALIZEHYPHENATEDWORDS = 4;
var PROPERNAMES = 8;
var ACP = "to,into,across,toward,at,in,on,under,over,beside,among,by," +
          "between,through,before,after,during,until,since,for,against," +
		  "with,above,across,below,from,onto,off,of,and,a,the";

function nameCapitalization_(name, nameSeparator) {
	var capitalizedName = name;
	if (nameSeparator == "'") {
		capitalizedName = 
			JSV_capitalizeFirstCharacter( name.substring(0,1) ) + 
			"'" +
			JSV_capitalizeFirstCharacter( name.substring(name.indexOf(nameSeparator)+1,name.length) );
	}
	else {
		// Mc or other string
		var nsLength = nameSeparator.length;
		capitalizedName = 
			JSV_capitalizeFirstCharacter( name.substring(0,nsLength) ) + 
			JSV_capitalizeFirstCharacter( name.substring(nsLength,name.length) );
	}
	return capitalizedName;
}

function JSV_capitalizeFirstCharacter(expS) {
	return ( JSV_isWhitespace(expS) ? 
	         expS : 
			 expS.charAt(0).toUpperCase() + expS.substring(1,expS.length) );
}

