/******************************************************************************
* ajaxUtil.js
*******************************************************************************

*******************************************************************************
*                                                                             *
* Copyright 2008
*                                                                             *
******************************************************************************/

var ajax;
if (YAHOO.lang.isUndefined(ajax))
	ajax = {};
if (YAHOO.lang.isUndefined(ajax.util))
	ajax.util = {};
YAHOO.lang.augmentObject(ajax.util, {
strToHTML:function(str)
{
	if (str == null)
		str = "";
	if (typeof(str) != "string")
		str = ""+str;
    return str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br/>");
},
trimRight:function(str)
{
	if (str == null)
		str = "";
	if (typeof(str) != "string")
		str = ""+str;
	return str.replace(/(\s)+$/,"");
},
trimLeft:function(str)
{
	if (str == null)
		str = "";
	if (typeof(str) != "string")
		str = ""+str;
	return str.replace(/^(\s)+/,"");
},
trim:function(str)
{
	return this.trimLeft(this.trimRight(str));
},
parseDataXMLElement:function(el)
{
	function DataObject(el)
	{
		var oid = el.getAttribute("oid");
		var fields = {};
		for (var i=0;i<el.childNodes.length;i++)
		{
			var element = el.childNodes[i];
			if (element.nodeType != 1) continue;
			var textNode = element.firstChild;
			var value = textNode!=null?textNode.nodeValue:"";
			value = ajax.util.trim(value);
			switch (element.getAttribute("type"))
			{
			case "integer":
			case "double":
				fields[element.nodeName] = parseInt(value,10);
				break;
			default:
				fields[element.nodeName] = value;
				break;
			}
		}
		this.getOid = function () { return oid; };
		this.getField = function (name) { return fields[name]; };
		this.eachField = function (fn, scope) { YAHOO.util.Dom.batch(fields, fn, scope, true); };	
	}
	return new DataObject(el);
},
readResponse:function(response,elementReaders,onError,onEnd)
{
	YAHOO.log("read response","info","ajax.util");
	elementReaders = elementReaders || {};
	YAHOO.lang.augmentObject(elementReaders, {
		"ajax":{
			"trace": function(xmlElement, onError) {
				var textNode = xmlElement.firstChild;
				YAHOO.log((textNode?textNode.nodeValue:""),"error","ajax.util");
				return true;
			},
			"error": function(xmlElement, onError) {
				var textNode = xmlElement.firstChild;
				YAHOO.log((textNode?textNode.nodeValue:""),"error","ajax.util");
				onError("ajax.errors.appError",textNode?textNode.nodeValue:"");
				return false;
			}
		}
	});
	onError = onError || function(code, params) { YAHOO.log("error : "+code,"error","ajax.util"); };
	var ok = true;
	var root = response.responseXML.documentElement;
	if (root == null)
	{
		YAHOO.log("Response isn't XML","error","ajax.util");
		onError("ajax.errors.xml.responseNotXML");
		ok = false;
	}
	else
	{
		var rootNspace = root.getAttribute("namespace");
		var rootNodeName = root.nodeName;
		if (rootNodeName != "root" || rootNspace != "ajax")
		{
			YAHOO.log("Invalid root element : <"+rootNspace+":"+rootNodeName+">","error","ajax.util");
			onError("ajax.errors.xml.invalidRootElement",{"namespace":rootNspace,"nodeName":rootNodeName});
			ok = false;
		}
		else
		{
			for (var i=0;i<root.childNodes.length;i++)
			{
				var xmlElement = root.childNodes[i];
				if (xmlElement.nodeType != 1) continue;
				var nspace = xmlElement.getAttribute("namespace");
				var nodeName = xmlElement.nodeName;
				var p = elementReaders[nspace];
				if (p != null && typeof(p) == 'object')
					p = p[nodeName];
				if (p == null || typeof(p) != 'function')
				{
					YAHOO.log("unknown element <"+nspace+":"+nodeName+">","error","ajax.util");
					onError("ajax.errors.xml.unknownElement",{"namespace":nspace,"nodeName":nodeName});
					ok = false;
				}
				else
					ok = p(xmlElement,onError);	
			}
		}
	}
	if (ok && onEnd)
		onEnd();
}});
