XMLEncoder = new Object;
XMLEncoder.symbolstring = '';
XMLEncoder._entities = new Array (
		{ str: "&lt;",   symbol:'<', len:4 }, 
		{ str:"&gt;",   symbol:'>', len:4 }, 
		{ str:"&amp;",   symbol:'&', len: 5 }, 
		{ str:"&quot;",  symbol:'"', len: 6 }
	);


XMLEncoder.encode = function(str) {
	var lastInd = 0, ind = 0;
	var ret = '';
	if (undefined == str || null == str)
		return '';
	str = String(str);
	if (this.symbolstring.length == 0) {
		for (var i = 0; i < this._entities.length ; i++) {
			this.symbolstring += this._entities[i].symbol;
		}
	}
	for (i = 0; i < str.length; i++) {
		var found = false;
		var ch = str.charAt(i);
		for (var j = 0; j < this.symbolstring.length; j++) {
			if (ch == this.symbolstring.charAt(j)) {
				found = true;
				ret += this._entities[j].str;
			}
			if (found)
				break;
		}
		if (! found) {
			ret += ch;
		}
	}

	return ret;
}

// decode:
// in: string
// out: string
XMLEncoder.decode = function(str) {
	var lastInd = 0, ind = 0;
	var ret = '';
	while ((ind = str.indexOf("&", lastInd)) != -1) {
		ret += str.substring(lastInd, ind);
		var symbol = this.getSymbol(str, ind);
		if (symbol >= 0) {
			var trans = this.translateSymbol(symbol);
			var len = this.getSymbolLength(symbol);
			ret += trans;
			lastInd = ind + len;
		
		}
		else {
			ret += '&';
			lastInd = ind + 1;
		}
	}
	if (lastInd < str.length) {
		ret += str.substring(lastInd, str.length);
	}
	
	return ret;
}

// private methods

XMLEncoder.getSymbol = function(s, ind) {
	for (var i = 0; i <this._entities.length ; i++) {
		var symbol = this._entities[i];
		var str = s.substr(ind, symbol.len);
		if (str == symbol.str)
			return i;
	}
	return -1;
}

XMLEncoder.translateSymbol = function(symbol) {
	var rec = this._entities[symbol];
	return rec.symbol;
}

XMLEncoder.getSymbolLength = function(symbol) {
	var rec = this._entities[symbol];
	return rec.len;
}
