String.prototype.trim = function () {
	a = this.replace (/^\s+/, '');
	return a.replace (/\s+$/, '');
};

var $ = YAHOO.util.Dom.get;

ajax = {
	jsonDecode : function (obj) {
		data = eval ('(' + obj + ')');
		return data;
	},
	failure : function (o) {
		alert ("failure"); //todo more descriptive i18n-enabled error
	},
	onSubmitCb : function (form, urlCb) {
		pd = "";
		for (var i = 0; i < $(form).elements.length; i++) {
			f = $(form).elements[i];
			value = (f.type == "checkbox") ? f.checked : escape (f.value);
			pd += f.name + '=' + value + '&';
			if (f.type == "submit") {
				f.disabled = true;	
			}
		}
		if (pd == "") pd = "args=null";
		YAHOO.util.Connect.asyncRequest ("POST", urlCb, formCb, pd); 
		return false;
	},
	onEventCb : function (urlCb, args, _confirm) {
		if (_confirm != "") if (!confirm (_confirm)) return;
		pd = "";
		keys = args.split(",");
		for (var i = 0; i < keys.length; i++) {
			try {
				var f = $(keys[i]);
				if (f.type == "checkbox") {
					value = f.checked;
				} else if (f.tagName == "INPUT") {
					value = f.value;
				} else {
					value = escape (f.value);
				}
				pd += keys[i] + '=' + value + '&';
			} catch (e) {}
		}
		if (pd == "") pd = "args=null";
		YAHOO.util.Connect.asyncRequest ("POST", urlCb, asyncCb, pd); 
	},
	setElem : function (id, val) {
		var tagName = $ (id).tagName;
		if (tagName == "INPUT") {
			$(id).value = val;
			$(id).checked = val; // or checkbox
		} else {
			$(id).textContent = val;	
		}
	},
	removeElem : function (id) {
		$(id).parentNode.removeChild ($(id));
	}
}

formCb = {
	failure : function (o) {
		this.handler (o);
	},
	success : function (o) {
		this.handler (o);
	},
	handler : function (o) {
		var res = ajax.jsonDecode (o.responseText);
		form = $(res.formId);
		for (var i = 0; i < form.elements.length; i++) {
			if ($(form).elements[i].type == "submit") {
				$(form).elements[i].disabled = false;	
			} 
		}
		eval (res.js);
	}
}

asyncCb = {
	failure : function (o) { /* because apache sometime send valid json as 404 page */
		this.handler (o);
	},
	success : function (o) {
		this.handler (o);
	},
	handler : function (o) {
		var mt = o.getResponseHeader["Content-Type"].trim (); //stupid IE
		if (mt == "application/x-javascript") {
			var res = ajax.jsonDecode (o.responseText);
			eval (res.js);	
		} else if (mt == "text/xml") {
			var xml = o.responseXML;
			var nodes = xml.getElementsByTagName ("node");
			for (var i = 0; i < nodes.length; i++) {
				var tagId = nodes[i].getAttribute ("id");
				try { // case null cdata
					$(tagId).innerHTML = nodes[i].firstChild.nodeValue;
				} catch (e) {
					$(tagId).innerHTML = "";
				}
			}
		}
	}
}

