if (typeof reddjs == "undefined")
	reddjs = {};

reddjs.images = {};

//
//	image management	

reddjs.images.load = function (src, width, height, alt, onload) {
	var img = new Image(width?width:null, height?height:null);
	
	if (src)
		img.src = src;
	
	if (alt)
	{
		img.setAttribute("alt", alt);
		img.setAttribute("title", alt);
	}
	
	if (typeof onload == "function")
	{
		if (typeof dojo == "object")
		{
			dojo.require("dojo.event.*");
			dojo.event.connect(img, "onload", onload);
		}
		else
			img.onload = onload;
	}
	
	return img;
};

//
//	DOM manipulation shortcuts

reddjs.d = {
	ce: function (t,c) { var n = document.createElement(t); if (c) { n.className = c; } return n; },
	ct: function (t) { return document.createTextNode(t); },
	ac: function (p,n) { p.appendChild(n); return n; },
	ceac: function (p,t,c) { var n = reddjs.d.ce(t,c); reddjs.d.ac(p,n); return n; },
	ctac: function (p,t) { var n = reddjs.d.ct(t); reddjs.d.ac(p,n); return n; },
	oblit: function (n,t) {
		//	use dojo to destroy node n's children (and their children, etc.) and optionally node n itself (if bool t is true)
		//	dojo.dom.destroyNode prevents memory leaks in IE when removing nodes that are no longer needed
		for (var i = n.childNodes.length; i--;) { reddjs.d.oblit(n.childNodes[i],true); }	// destroy children
		if (t) { dojo.dom.destroyNode(n); }	// destroy self
	},
	ent: function (str, mode) {
		//	http://blog.skyzyx.com/2006/02/25/document-createtextnode-and-entities/
		var str = (str) ? str : "";
		var mode = (mode) ? mode : "string";

		var e = document.createElement("div");
		e.innerHTML = str;

		if (mode == "numeric") {
			return "&#" + e.innerHTML.charCodeAt(0) + ";";
		}
		else if (mode == "utf16") {
			var un = e.innerHTML.charCodeAt(0).toString(16);
			while (un.length < 4) un = "0" + un;
			return "\\u" + un;
		}
		else return e.innerHTML;
	}
};

//
//	Forms support (using Dojo)

reddjs.forms = {};

reddjs.forms.defaultAction = "submit.asp";

reddjs.forms.bind = function (node, handler) {
	if (typeof handler == "undefined")
		var handler = reddjs.forms.defaultResponseHandler;
	
	node.action = reddjs.forms.defaultAction;
	var x = new dojo.io.FormBind
	({
		formNode: node,
		handle: handler,
		mimetype: "text/json",
		sendTransport: true
	});
	
	x.onSubmit = reddjs.forms.defaultSubmitHandler;
};

reddjs.forms.submitDisableForm = function (form) {
	var e;
	for (var i = form.elements.length; i--;)
	{
		e = form.elements[i];

		switch (e.type)
		{
			case "hidden":
				break;

			default:
				if (!e.disabled)
				{
					e._reddjs_forms_enableme = true;
					e.disabled = true;
				}
				break;
		}
	}
};

reddjs.forms.defaultSubmitHandler = function (form) {
	window.setTimeout((function () { reddjs.forms.submitDisableForm(form); }), 1);
	return true;
};

reddjs.forms.responseEnableForm  = function (form) {
	var e;
	for (var i = form.elements.length; i--;)
	{
		e = form.elements[i];

		switch (e.type)
		{
			case "hidden":
				break;

			default:
				if (e.disabled && e._reddjs_forms_enableme)
				{
					e._reddjs_forms_enableme = false;
					e.disabled = false;
				}
				break;
		}
	}
};

reddjs.forms.defaultIframeIOResponseHandler = function (type, result, request) { reddjs.forms.defaultResponseHandler(type, result, null, request); };

reddjs.forms.defaultResponseHandler = function (type, result, evt, request) {
	switch (type)
	{
		case "load":

			if (result.alert)
				alert(result.alert);	// show an alert using the browser's built-in dialog
			else if (result.message)
				alert(result.message);	// alternative for backwards compat.

			if (request.formNode)
				reddjs.forms.responseEnableForm(request.formNode);	// if this response is bound to a form, re-enable the form elements

			if (result.reset && request.formNode)
				request.formNode.reset();

			if (result.windowOpen)
			{
				switch (typeof result.windowOpen)
				{
					case "array":
						var w = window.open(result.windowOpen[0], result.windowOpen[1], result.windowOpen[2], result.windowOpen[3]);
						break;

					default:
						var w = window.open(result.windowOpen)
						break;
				}
			}

			if (result.eval)
				eval(result.eval);

			if (result.redirect)
			{
				window.location.href = result.redirect;
				break;
			}

			if (result.reload)
			{
				window.setTimeout(function(){window.location.href = window.location;},redd.standardFadeDuration*1.5);
				break;
			}

			break;

		case "error":
			alert("An error occurred when attempting to perform this action. Please try again later.");
			if (request.formNode)
				reddjs.forms.responseEnableForm(request.formNode);
			break;

		default:
			alert("Unhandled form result type: "+ type);
			if (request.formNode)
				reddjs.forms.responseEnableForm(request.formNode);
			break;
	}
};
