if (!ws) var ws = {};
if (!ws.cr) ws.cr = {};
if (!ws.cr.stringUtils) ws.cr.stringUtils = {};
if (StringUtils == null) var StringUtils = ws.cr.stringUtils;

StringUtils.EMPTY = "";

// empty string == null string || string with length 0
StringUtils.isEmpty = function (string) {	
	if(typeof string !== 'string') {
		string += "";		
	}	
	return (string === "null") || (string === "undefined") || (string === "") || string.length === 0;
}

StringUtils.splitWords = function (string, limit) {	
	if(StringUtils.isEmpty(string)) {
		return StringUtils.EMPTY;
	}
	if(limit && limit > 0) {
		var regex = new RegExp("(\\S{" + limit + "})", "g");				
		return string.replace(regex, "$1<wbr></wbr>");
	}
	return string;	
}

StringUtils.trim = function (string) {
	if(!StringUtils.isEmpty(string)) {
		return string.replace(/^\s+|\s+$/, StringUtils.EMPTY);
	}
	return string;
}

StringUtils.defaultIfEmpty = function (target, defaultStr) {
	return StringUtils.isEmpty(target) ? defaultStr : target;
}


StringUtils.deleteNewlineChars = function (string) {
	if(!StringUtils.isEmpty(string)) {
		return string.replace(/\r|\n/g, StringUtils.EMPTY);
	}
	return StringUtils.EMPTY;
}

// XSS escape
StringUtils.xssEscape = function (val) {
		
	val = val.replace(/</g, "&lt;");
	val = val.replace(/>/g, "&gt;");		
    return val;
}


// HTML escaping functions

var hex=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');


StringUtils.htmlEscape = function(input)
{
	var preescape = input;
	var escaped = new StringUtils.StringBuffer(); 
	var i=0;
	
	for(i=0;i<preescape.length;i++)
	{  
		escaped.append(StringUtils.escapeChar(preescape.charAt(i)));
	}
	return escaped.toString();
}

StringUtils.StringBuffer = function(){
	
	this.index =-1;
	
	this.buffer= [];
	
	this.length = function (){
		
		return  index+1;
	}
	
	
		
}

StringUtils.StringBuffer.prototype.append = function(addElement){
	
		var newElement = ''+addElement;
		
		if(newElement.length  > 0)
		{
			this.buffer.push(newElement);
			this.index =this.index + 1;
		}
	
}

StringUtils.StringBuffer.prototype.toString = function(){
	
	return this.buffer.join('');
}

StringUtils.removeNonAscii = function (str){
	
		return str.replace(/[^(\x20-\x7F)]*/g,'');
};

StringUtils.escapeChar = function(original)
{
   	var found=true;
   	var thechar=original.charCodeAt(0);
	switch(thechar) {
			case '\n': return "<br/>"; break; //newline
			case '\r': break;
			case 60:return "&lt;"; break; //<
			case 62:return "&gt;"; break; //>
			case 198:return "&AElig;"; break; //Æ
			case 193:return "&Aacute;"; break; //Á
			case 194:return "&Acirc;"; break; //Â
			case 192:return "&Agrave;"; break; //À
			case 197:return "&Aring;"; break; //Å
			case 195:return "&Atilde;"; break; //Ã
			case 196:return "&Auml;"; break; //Ä
			case 199:return "&Ccedil;"; break; //Ç
			case 208:return "&ETH;"; break; //Ð
			case 201:return "&Eacute;"; break; //É
			case 202:return "&Ecirc;"; break; //Ê
			case 200:return "&Egrave;"; break; //È
			case 203:return "&Euml;"; break; //Ë
			case 205:return "&Iacute;"; break; //Í
			case 206:return "&Icirc;"; break; //Î
			case 204:return "&Igrave;"; break; //Ì
			case 207:return "&Iuml;"; break; //Ï
			case 209:return "&Ntilde;"; break; //Ñ
			case 211:return "&Oacute;"; break; //Ó
			case 212:return "&Ocirc;"; break; //Ô
			case 210:return "&Ograve;"; break; //Ò
			case 216:return "&Oslash;"; break; //Ø
			case 213:return "&Otilde;"; break; //Õ
			case 214:return "&Ouml;"; break; //Ö
			case 222:return "&THORN;"; break; //Þ
			case 218:return "&Uacute;"; break; //Ú
			case 219:return "&Ucirc;"; break; //Û
			case 217:return "&Ugrave;"; break; //Ù
			case 220:return "&Uuml;"; break; //Ü
			case 221:return "&Yacute;"; break; //Ý
			case 225:return "&aacute;"; break; //á
			case 226:return "&acirc;"; break; //â
			case 230:return "&aelig;"; break; //æ
			case 224:return "&agrave;"; break; //à
			case 229:return "&aring;"; break; //å
			case 227:return "&atilde;"; break; //ã
			case 228:return "&auml;"; break; //ä
			case 231:return "&ccedil;"; break; //ç
			case 233:return "&eacute;"; break; //é
			case 234:return "&ecirc;"; break; //ê
			case 232:return "&egrave;"; break; //è
			case 240:return "&eth;"; break; //ð
			case 235:return "&euml;"; break; //ë
			case 237:return "&iacute;"; break; //í
			case 238:return "&icirc;"; break; //î
			case 236:return "&igrave;"; break; //ì
			case 239:return "&iuml;"; break; //ï
			case 241:return "&ntilde;"; break; //ñ
			case 243:return "&oacute;"; break; //ó
			case 244:return "&ocirc;"; break; //ô
			case 242:return "&ograve;"; break; //ò
			case 248:return "&oslash;"; break; //ø
			case 245:return "&otilde;"; break; //õ
			case 246:return "&ouml;"; break; //ö
			case 223:return "&szlig;"; break; //ß
			case 254:return "&thorn;"; break; //þ
			case 250:return "&uacute;"; break; //ú
			case 251:return "&ucirc;"; break; //û
			case 249:return "&ugrave;"; break; //ù
			case 252:return "&uuml;"; break; //ü
			case 253:return "&yacute;"; break; //ý
			case 255:return "&yuml;"; break; //ÿ
			case 162:return "&cent;"; break; //¢
			default:
				found=false;
				break;
		}
		if(!found)
		{
			if(thechar>127) {
				var c=thechar;
				var a4=c%16;
				c=Math.floor(c/16); 
				var a3=c%16;
				c=Math.floor(c/16);
				var a2=c%16;
				c=Math.floor(c/16);
				var a1=c%16;
				return "&#x"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+";";		
			}
			else
			{
				return original;
			}
		}

}


/**
 * entitifies an html string
 * @param input html string
 */
StringUtils.entitify = (function(){

	var character ={
			'<' : '&lt;',
			'>' : '&gt;',
			'&' : '&amp;',
			'"' : '&quot;'
	}
	
	return function (input) {
				return input.replace(/[<>&"]/g,function (c){
			                   return character[c];    	
						});
			}
	
})();


/**
 * de-entitifies an html string
 * @param input html string
 */

StringUtils.deentitify = (function(){

	var entity ={
			'lt' : '<',
			'gt' : '>',
			'amp' : '&',
			'quot' : '"',
			'nbsp' : ' '
	}
	
	return function (input) {
				return input.replace(/&([^&;]+);/g,function (a,b){
			                   var r = entity[b];
							   return typeof r === 'string' ? r : a;    	
						});
	}
	
})();

//preserve unicode chars by converting into html
StringUtils.makeUnicode = function (str) {
	if (str.length > 0) {
 		str = str.replace(new RegExp("\u00AE", "g"), "&reg;").replace(
				new RegExp("\u00A9", "g"), "&copy;").replace(
				new RegExp("\u2122", "g"), "&trade;").replace(
				new RegExp("\u002C", "g"), "&#44;").replace(
				new RegExp("\u002D", "g"), "&#45;").replace(
				new RegExp("\u2010", "g"), "&#8208;").replace(
				new RegExp("\u2013", "g"), "&#8211;").replace(
				new RegExp("\u2018", "g"), "&#8216;").replace(
				new RegExp("\u2019", "g"), "&#8217;").replace(
				new RegExp("\u2032", "g"), "&#8242;").replace(
				new RegExp("\u201C", "g"), "&#8220;").replace(
				new RegExp("\u201D", "g"), "&#8221;");
			 
	}
	return str;
}