function strTrim(value) {
  var rslt = value ? value.replace(/^\s+|\s+$/g,'') : '';
  while (rslt.indexOf('  ') >= 0)
    rslt = rslt.replace(/  /g, ' ');
  return rslt;
}

function strToBoolean(value, defaultValue) {
  var rslt = value;
	if (!value)
	  return defaultValue ? true : false;
  if (typeof(value) == 'string')
    rslt = value.toLowerCase() == 'true';
  else
    if (typeof(value) == 'undefined')
      rslt = false;     
  return rslt ? true : false;
}

function strLPad(value, requiredLength, addChar) {
	var rslt = value.toString();
	while (rslt.length < requiredLength)
		rslt = addChar + rslt;
	return rslt;
}

function strRPad(value, requiredLength, addChar) {
	var rslt = value.toString();
	while (rslt.length < requiredLength)
		rslt += addChar;
	return rslt;
}

function strAddString(sourceString, addString) {
  var rslt = sourceString ? sourceString.toString() : '';
  if (rslt.indexOf(addString) < 0)
	  rslt += ' ' + addString;
  return strTrim(rslt);
}

function strRemoveString(sourceString, removeString) {
  var rslt = sourceString ? sourceString.toString() : '';
	rslt = rslt.replace(removeString, '');
	return strTrim(rslt);
}

function strToXml(src) {
  if (!src)
	  return '';
  var rslt = '';
	if (src.constructor.toString() == Date.toString()) 
	  rslt = dateToString(src, true);
  else
	  rslt = src.toString();  
  rslt = rslt.toString().replace(/\&/g, '&amp;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;').replace(/\"/g, '&quot;');
	return rslt.replace(/\@/g, '@@').replace(/\+/g, '@p');
}

function dateFromString(src) {
  if (src == '0' || !src)
	  return new Date();  
  if (src.constructor.toString() == Date.toString())
	  return src;  	
	src = strTrim(src);
	var op = src.substring(0, 1);
	if (op == '-' || op == '+') {
		var rslt = new Date();
		var delta = src * 1;
		if (!delta)
			return null;
		rslt.setDate(rslt.getDate() + delta);
		return rslt;
  }
  src = src ? src.replace(/\./g, '/') : '';
  src = src ? src.replace(/\\/g, '/') : '';
	if (!src)
	  return null;
	var rslt = new Date(0);
	rslt.setHours(0);
	rslt.setMinutes(0);
	rslt.setSeconds(0);
	rslt.setMilliseconds(0);
	rslt.setDate(1);
	rslt.setMonth(0);
	if (!src|| !src.length)
		return null;
	var args = src.split(' ');
	if (args.length > 2)
		return null;
	if (args.length == 2) {
		var timeString = strTrim(args[1]);
		src = args[0];
		var timeParams = timeString.split(':');
		if (timeParams.length < 2 || timeString.indexOf(':') == -1)
			return null;
	  if (!timeParams[0] || isNaN(timeParams[0]) || timeParams[0] * 1 < 0 || timeParams[0] * 1 > 23)
		  return null;
		if (!timeParams[1] || isNaN(timeParams[1]) || timeParams[1] * 1 < 0 || timeParams[1] * 1 > 59)
		  return null;
  	rslt.setHours(timeParams[0] * 1);
		rslt.setMinutes(timeParams[1] * 1);
	}	
	var params = src.split('/');
  if (params.length == 1)
    params[1] = (new Date().getMonth() + 1) + '';
  if (params.length == 2)
    params[2] = new Date().getYear() + '';
	if (params.length < 3) {
		return null;
	}
	if (params[2].length < 3 && parseInt(params[2]) > 30)
		rslt.setYear(parseInt(params[2]) + 1900);
	else
		if (params[2].length < 3)
			rslt.setYear(parseInt(params[2]) + 2000);
		else
			rslt.setYear(parseInt(params[2]));
	rslt.setMonth((params[1] * 1) - 1);
	if (params[0] * 1 < 0)
	  return null;
	if (params[1] * 1 < 0 || params[1] > 12)
	  return null;
	rslt.setDate(params[0] * 1);
	if (rslt.getDate() != params[0] * 1)
	  return null;
	if (isNaN(rslt))
		return null;
	return rslt;
}

function dateToString(date, includeTime) {
  if (!date)
	  return '';
	if (date.constructor != Date)
	  date = dateFromString(date);
	if (!date)
	  return '';
	var rslt = strLPad(date.getDate(), 2, '0') + '/' + strLPad(date.getMonth() + 1, 2, '0') + '/' + date.getFullYear();
	if (includeTime) 
	  rslt += ' ' + strLPad(date.getHours(), 2, '0') + ':' + strLPad(date.getMinutes(), 2, '0');
	return rslt;
}

function timeToString(date) {
  if (!date)
	  return '';
	if (date.constructor != Date)
	  date = dateFromString(date);
	if (!date)
	  return '';
	return strLPad(date.getHours(), 2, '0') + ':' + strLPad(date.getMinutes(), 2, '0');	
}

function replaceImagePath(imgElement, newSrc) {   
  try {
		var fileName = imgElement.src;
		var newFileName = newSrc;
		fileName = fileName.substring(fileName.lastIndexOf('/') + 1);
		newFileName = newFileName.substring(newFileName.lastIndexOf('/') + 1);
		if (fileName != newSrc) 
			imgElement.src = newSrc; 
  } catch (e) {
	}
}

/*function getPageName(pageUrl, includeQueryString) {
	if (!pageUrl)
		return '';
  var list = pageUrl.split('?');	
	if (list[0].indexOf('/') >= 0)
	  rslt = list[0].substr(list[0].lastIndexOf('/') + 1, list[0].length);
	else
		rslt = list[0];
  if (includeQueryString && list[1])
	  rslt += '?' + list[1];
  return rslt;
}*/

function getQueryStringArguments(pageUrl) {
	var i = pageUrl.indexOf('?');
	if (i < 0)
		return null;
	var arguments = pageUrl.substr(i + 1);
	var list = arguments.split('&');
	var rslt = [];
	for (var i=0;i<list.length;i++) {
		var argument = list[i].split('=');
		rslt[rslt.length] = {name:argument[0], value:argument[1] };
	}
	return rslt;
}

function fixPrecision(src, digits) {  
  	for (var i=0,m=1;i<digits;i++,m*=10);
    var v = Math.round(src * 1 * m) / m;
    v = v.toString();
    if (v.indexOf('.') >= 0) {
      a = v.length - v.indexOf('.') - 1;
      for (var i=a;i<digits;v += '0',i++);
    } else {
      v += '.';
      for (var i=0;i<digits;i++)
        v += '0';
    }
    v = formatNumber(v);
  	return v;
  }

function formatNumber(src) { 
  var RgX = /^(.* )?([-+\u00A3\u20AC]?\d+)(\d{3}\b)/;
  src = String(src);
  return (src == (src=src.replace(RgX, "$1$2,$3"))) ? src : formatNumber(src);
} 

function escapeString(src) {
	return escape(src.toString().replace(/\@/g, '@@').replace(/\+/g, '@p'));
}

function strIsNumeric(str) 
{
  var RegExp = /^[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?$/; 
  var result = str.match(RegExp);
  return result;
}

function strGetXmlString(node, defaultValue) {
  if (!node)
	  return defaultValue ? defaultValue : '';
	if (node.text)
    return strTrim(node.text);
  else if (node.nodeValue)
    return strTrim(node.nodeValue);
  else if (node.nodeType == _cXmlNodeTypeElement && node.childNodes.length > 0) //if nodeType = Element
    return node.firstChild.data;
  else
    return defaultValue ? defaultValue : '';
}