// Copyright DOVICO Software (C)2008
function CStringObject()
{
	this.m_sString = "";
}

function CStringBuilder()
{
	
	this.m_llStrings = new CLinkedList();
	this.m_llStrings.AddItem(new CStringObject());
	
	this.m_iBufferSize = 10240; 
	this.m_sFinalString = "";
	
	
	
	
	
	
	this.Append = function Append(sString)
	{
		
		if (sString == "") {return;}
		
		m_sFinalString = "";  
		
		
		var sStringObject = this.m_llStrings.GetLastObject();
		
		
		var iCurrentLength = sStringObject.m_sString.length;
		var iStringToAppendLength = sString.length;
		
		
		if (iCurrentLength + iStringToAppendLength > this.m_iBufferSize)
		{
			
			var iLengthToCopy = this.m_iBufferSize - iCurrentLength;
			sStringObject.m_sString += sString.substr(0, iLengthToCopy);
			
			
			var sNewStringObject = new CStringObject();
			sNewStringObject.m_sString = sString.substr(iLengthToCopy);
			
			
			this.m_llStrings.AddItem(sNewStringObject);
		}
		
		else
		{
			sStringObject.m_sString += sString;
		}
	}
	
	
	this.ToString = function ToString()
	{
		
		if (this.m_sFinalString != "") {return this.m_sFinalString;}
		
		
		var enumStrings = this.m_llStrings.GetFirst();
		var sStringObject;
		while ((sStringObject = this.m_llStrings.GetNext(enumStrings)) != null)
		{
			
			this.m_sFinalString += sStringObject.m_sString;	
		}
		
		return this.m_sFinalString;
	}
	
	
	this.Clear = function Clear()
	{
		this.m_sFinalString = "";  
		
		
		this.m_llStrings.RemoveAll();
		
		
		this.m_llStrings.AddItem(new CStringObject());
	}
	
	
	this.FreeMemory = function FreeMemory()
	{
		this.m_llStrings.FreeMemory();
	}
}



var grexAmp = new RegExp("&", "g");
var grexApos = new RegExp("'", "g");
var grexQuot = new RegExp("\"", "g");
var grexLT = new RegExp("<", "g");
var grexGT = new RegExp(">", "g");




function EncodeHtml(sText)
{
	var sReturnValue = sText.replace(grexAmp, "&amp;");
	sReturnValue = sReturnValue.replace(grexQuot, "&quot;");
	sReturnValue = sReturnValue.replace(grexLT, "&lt;");
	sReturnValue = sReturnValue.replace(grexGT, "&gt;");
	
	return sReturnValue;
}




function EncodeTextForElement(sName)
{	
	var sReturnValue = sName.replace(grexAmp, "&amp;");
	sReturnValue = sReturnValue.replace(grexLT, "&lt;");
	sReturnValue = sReturnValue.replace(grexGT, "&gt;");

	return sReturnValue;	
}






function EncodeTextForAttribute(sName)
{
	return sName.replace(grexQuot, "&quot;");
}


function CStringBuilderHtml()
{
	this.m_sbHtml = new CStringBuilder();
	
	
	this.Clear = function Clear()
	{
		
		this.m_sbHtml.Clear();
	} 
	
	
	this.Append = function Append(sXml)
	{
		this.m_sbHtml.Append(sXml);
	}
	
	
	this.AppendStartTag = function AppendStartTag(sTag)
	{
		this.m_sbHtml.Append("<" + sTag + ">");
	}
	
	
	this.AppendStartTagNoClose = function AppendStartTagNoClose(sTag)
	{
		this.m_sbHtml.Append("<" + sTag);
	}
	
	
	this.AppendEndTag = function AppendEndTag(sTag)
	{
		this.m_sbHtml.Append("</" + sTag + ">");
	}
	
	
	this.AppendString = function AppendString(sHtml, sHtmlToEncode)
	{
		this.m_sbHtml.Append(sHtml + EncodeHtml(sHtmlToEncode));
	}
	
	
	this.ToString = function ToString()
	{
		return this.m_sbHtml.ToString();
	}
	
	
	this.FreeMemory = function FreeMemory()
	{
		this.m_sbHtml.FreeMemory();
	}
}



function EncodeXml(sText)
{
	var sReturnValue = sText.replace(grexAmp, "&amp;");
	sReturnValue = sReturnValue.replace(grexApos, "&apos;");
	sReturnValue = sReturnValue.replace(grexQuot, "&quot;");
	sReturnValue = sReturnValue.replace(grexLT, "&lt;");
	sReturnValue = sReturnValue.replace(grexGT, "&gt;");
	
	return sReturnValue;
}








function CStringBuilderXml(bAppendHeader)
{
	
	this.XML_HEADER="<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
	this.m_bAppendHeader=bAppendHeader;
	this.m_sbXml = new CStringBuilder();
	
	
	if(bAppendHeader == true)
	{
		this.m_sbXml.Append(this.XML_HEADER);
	}
	
	
	this.Clear = function Clear()
	{
		
		this.m_sbXml.Clear();
		
		
		
		this.m_sbXml.Append(this.m_bAppendHeader == true ? this.XML_HEADER : "");
	} 
	
	
	this.Append = function Append(sXml)
	{
		this.m_sbXml.Append(sXml);
	}
	
	
	this.AppendStartTag = function AppendStartTag(sTag)
	{
		this.m_sbXml.Append("<" + sTag + ">");
	}
	
	
	this.AppendStartTagNoClose = function AppendStartTagNoClose(sTag)
	{
		this.m_sbXml.Append("<" + sTag);
	}
	
	
	this.AppendEndTag = function AppendEndTag(sTag)
	{
		this.m_sbXml.Append("</" + sTag + ">");
	}
	
	
	this.AppendString = function AppendString(sXml, sXmlToEncode)
	{
		this.m_sbXml.Append(sXml + EncodeXml(sXmlToEncode));
	}
	
	
	this.AppendNumber = function AppendNumber(sXml, nNumber)
	{
		this.m_sbXml.Append(sXml + GetXmlNumber(nNumber)); 
	}
	
	
	this.AppendDate = function AppendDate(sXml, dDate)
	{	
		this.m_sbXml.Append(sXml + this.GetXmlDate(dDate));
	}
	
	this.AppendBool = function AppendBool(sXml, bBoolean)
	{
		this.m_sbXml.Append(sXml + BoolToString(bBoolean));
	}
	
	
	this.GetXmlDate = function(dDate)
	{
		return DateToXmlString(dDate)
	}
	
	
	
	this.GetXml = function GetXml()
	{
		return this.m_sbXml.ToString();
	}
	
	
	
	this.ToString = function ToString()
	{
		return this.m_sbXml.ToString();
	}
	
	
	this.FreeMemory = function FreeMemory()
	{
		this.m_sbXml.FreeMemory();
	}
}


function GetXmlNumber(iNumber)
{
	return iNumber.toString();  
}
	
function DateToXmlString(dDate)
{
	var sDate = dDate.getFullYear().toString();
	sDate += "-";
	sDate += PadDateValue(dDate.getMonth() + 1);
	sDate += "-";
	sDate += PadDateValue(dDate.getDate());
	sDate += "T";
	sDate += PadDateValue(dDate.getHours());
	sDate += ":";
	sDate += PadDateValue(dDate.getMinutes());
	sDate += ":";
	sDate += PadDateValue(dDate.getSeconds());
	
	return sDate;
}

function PadDateValue(iDateValue)
{
	var sDateValue = iDateValue.toString();
	if (sDateValue.length == 1)
	{
		sDateValue = "0" + sDateValue;
	}
	
	return sDateValue;
}
