/*
 * Utilidades KWJAX.
 */
function KWJAXUtil() {

	/*
	 * Obtém um elemento.
	 */
	this.getElement = function(pElement) {

		// Verifica elemento
		if (new String(typeof(pElement)).toLowerCase() == 'object') {
			return pElement;
		}

		// Busca elemento
		var lElement = document.getElementById(pElement);
		if (!lElement) {
			lElement = document.getElementsByName(pElement);
			if (lElement.length > 0) {
				lElement = lElement[0];
			} else {
				if (document.all) {
					lElement = document.all[pElement];
					if (!lElement) {
						lElement = null;
					}
				} else {
					lElement = null;
				}
			}
		}
		return lElement;
	}

	/*
	 * Substitui todas as ocorrências de uma string em outra.
	 */
	this.cmdReplaceAll = function(stString, stFind, stReplace) {
		var inSearch = 0;
		var stResult = '';
		while (stString.indexOf(stFind, inSearch) != -1) {
			stResult += stString.substring(inSearch, stString.indexOf(stFind, inSearch));
			stResult += stReplace;
			inSearch = (stString.indexOf(stFind, inSearch) + stFind.length);
		}
		stResult += stString.substring(inSearch, stString.length);
		return stResult;
	}

	/*
	 * Obtém elemento raiz de um XML.
	 */
	this.cmdParseXML = function(pXML) {
		var XMLParser = false;
		if ((typeof ActiveXObject) != 'undefined') {
			try {
				XMLParser = new ActiveXObject("Microsoft.XMLDOM");
				XMLParser.async="false";
				XMLParser.loadXML(pXML);
				return XMLParser.documentElement;
			} catch(e) {
				return null;
			}
		} else if ((typeof DOMParser) != 'undefined') {
			try {
				XMLParser = new DOMParser();
				XMLParser = XMLParser.parseFromString(pXML, "text/xml");
				return XMLParser.documentElement;
			} catch(e) {
				return null;
			}
		} else {
			return null;
		}
	}

	/*
	 * Método de obtenção da largura disponível da janela.
	 */
	this.getClientWidth = function() {
		if(typeof(window.innerWidth) == 'number') {
			return window.innerWidth;
		} else if(document.documentElement && document.documentElement.clientWidth) {
			return document.documentElement.clientWidth;
		} else if(document.body && document.body.clientWidth) {
			return document.body.clientWidth;
		}
		return null;
	}

	/*
	 * Método de obtenção da altura disponível da janela.
	 */
	this.getClientHeight = function() {
		if(typeof(window.innerHeight) == 'number') {
			return window.innerHeight;
		} else if(document.documentElement && document.documentElement.clientHeight) {
			return document.documentElement.clientHeight;
		} else if(document.body && document.body.clientHeight) {
			return document.body.clientHeight;
		}
		return null;
	}

	/*
	 * Método de obtenção da posição da rolagem X.
	 */
	this.getXScroll = function() {
		return document.body.scrollLeft;
	}

	/*
	 * Método de obtenção da posição da rolagem Y.
	 */
	this.getYScroll = function() {
		return document.body.scrollTop;
	}

	/*
	 * Método de obtenção de informações sobre o navegador.
	 */
	this.getNavigator = function() {

		// Instancia retorno
		var lNavigator = new Object();

		// Obtém informações sobre o browser
		var lAgent = navigator.userAgent;
		var lBrowser = navigator.appName;
		var lVersion = navigator.appVersion.substring(0, navigator.appVersion.indexOf(' '));
		var lVersionNumber = parseFloat(lVersion, 10);

		/*
		 * Método de verificação de navegador Firefox.
		 */
		lNavigator.isFirefox = function() {
			return ((lAgent.indexOf('Firefox') >= 0) && (lBrowser.indexOf('Netscape') >= 0));
		}

		/*
		 * Método de verificação de navegador Opera.
		 */
		lNavigator.isOpera = function() {
			return ((lAgent.indexOf('Opera') >= 0) && (lBrowser.indexOf('Opera') >= 0));
		}

		/*
		 * Método de verificação de navegador Internet Explorer.
		 */
		lNavigator.isIE = function() {
			return ((lAgent.indexOf('MSIE') >= 0) && (lBrowser.indexOf("Internet Explorer") >= 0));
		}

		/*
		 * Método de obtenção da versão do navegador.
		 */
		lNavigator.getVersion = function() {
			return lVersionNumber;
		}
		return lNavigator;
	}

	/*
	 * Instancia objeto de requisição HTTP XML.
	 */
	this.getXMLHTTPRequest = function() {
		var XMLHTTPRequest = null;
		if ((typeof XMLHttpRequest) != 'undefined') {
			XMLHTTPRequest = new XMLHttpRequest();
		} else {
			if ((typeof ActiveXObject) != 'undefined') {
				try {
					XMLHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						XMLHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e2) {
						try {
							XMLHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP.4.0");
						} catch (e3) {
							return null;
						}
					}
				}
			} else {
				return null;
			}
		}
		return XMLHTTPRequest;
	}
}

/*
 * Entidades XML.
 */
function XMLEntities() {

	// KWJAXUtil
	var utKWJAXUtil = new KWJAXUtil();

	/*
	 * Método de conversão de string para XML.
	 */
	this.cmdEscape = function(pString) {

		// String
		var lString = '';

		// Percorre string
		for (var i = 0; i < pString.length; i++) {

			// Obtém caracter
			var inCharCode = pString.charCodeAt(i);

			// Elimina caracteres inválidos
			if (inCharCode <= 31) {
				if ((inCharCode != 9) && (inCharCode != 10) && (inCharCode != 13)) {
					inCharCode = 63;
				}
			} else if ((inCharCode >= 55296) && (inCharCode <= 57343)) {
				inCharCode = 63;
			} else if (inCharCode > 65533) {
				inCharCode = 63;
			}

			// Concatena caracter
			lString = lString + String.fromCharCode(inCharCode);
		}

		// Efetua escape
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&", "&amp;");
		lString = utKWJAXUtil.cmdReplaceAll(lString, ">", "&gt;");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "<", "&lt;");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "\"", "&quot;");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "'", "&apos;");
		return lString;
	}

	/*
	 * Método de conversão de XML para string.
	 */
	this.cmdUnescape = function(pString) {

		// Prepara string
		var lString = new String(pString);

		// Efetua conversão
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&gt;", ">");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&lt;", "<");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&quot;", "\"");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&apos;", "'");
		lString = utKWJAXUtil.cmdReplaceAll(lString, "&amp;", "&");
		return lString;
	}
}

/*
 * Utilidades para caracteres.
 */
function CharacterUtil() {

	/*
	 * Método de obtenção de string em determinado conjunto de caracteres.
	 */
	this.getString = function(pString, pCharset) {

		// ISO-8859-1
		if (pCharset == 'ISO-8859-1') {

			// Buffer
			var lString = '';

			// Percorre string
			for (var i = 0; i < pString.length; i++) {

				// Obtém caracter
				var inCharCode = pString.charCodeAt(i);

				// Verifica caracter
				if (inCharCode > 255) {
					inCharCode = 63;
				}

				// Concatena caracter
				lString += String.fromCharCode(inCharCode);
			}

			// Atribui string
			pString = lString;
		}
		return pString;
	}
}