var naxo_cache={};
var naxo_load_in_progress={};

function naxo_load_callback(containerobject,loadingobject,replace,name,url,t)
{
	//naxo_dump(t);
	//naxo_debug('removing loading object');
	if (loadingobject)
	{
		try
		{
			containerobject.removeChild(loadingobject);
		}
		catch(e)
		{
			//naxo_debug(e);
			//naxo_debug(loadingobject);
		}
	}
	if (replace)
	{
		for (var i=0;i<t.length;i++)
		{
			//naxo_debug(name);
			//naxo_debug('inserting element '+i+' to '+containerobject+' '+containerobject.id);
			try
			{
				containerobject.parentNode.insertBefore(naxo_build(t[i]),containerobject);
			}
			catch(e)
			{
				//naxo_debug(e);
				//naxo_dump(containerobject.parentNode);
				//naxo_dump(t[i]);
			}
		}
		containerobject.parentNode.removeChild(containerobject);
	}
	else
	{
		for (var i=0;i<t.length;i++)
		{
			//naxo_debug(name);
			//naxo_debug('adding element '+i+' to '+containerobject+' '+containerobject.id);
			containerobject.appendChild(naxo_build(t[i]));
		}
	}
	delete naxo_load_in_progress[name];
	naxo_loaded[name]=url;
	//naxo_debug('going for update of '+name);
	naxo_field_update(name);
}

function naxo_load(url,container,loading,name,list,replace)
{
	for (var i=0; i<list.length; i++)
	{
		var match	=	list[i].match(/^(.*)\\(([0-9]+)\\)/);
		var field	=	match?match[1]:list[i];
		//naxo_debug(list[i]+'->'+field);
		try
		{
			var v	=	naxo_get_value(field);
			if (typeof(v) == "undefined")
				v	=	'';
			if (match)
			{
				var l	=	match[2];
				if (v.length < l)
					v	=	'';
				else
					v	=	v.substr(0,l);
			}
			url	+=	'&'+field+'='+encodeURIComponent(v);
		}
		catch(e)
		{
			// XXX what was all this for originally?
			if (e == 'input_not_found')
			{
				//naxo_debug('input_not_found '+i+'='+list[i]);
				//delete naxo_load_in_progress[name];
				//return;
			}
		}
	}
	//naxo_debug(name);
	//naxo_debug('loaded: '+naxo_loaded[name]);
	//naxo_debug('wanted: '+url);
	if (typeof(naxo_loaded[name]) != "undefined" && naxo_loaded[name] == url)
	{
		//naxo_debug("not loading "+url);
		delete naxo_load_in_progress[name];
		return;
	}
	if (naxo_cache[name] && naxo_cache[name][url])
	{
		//naxo_debug('found '+name+','+url+' in cache');
		naxo_load_callback(container,undefined,replace,name,url,naxo_cache[name][url]);
		return;
	}
	while (container.firstChild)
	{
		container.removeChild(container.firstChild);
	}
	container.appendChild(loading);
	//naxo_debug("loading "+url);
	var x = new XMLHttpRequest;
	x.open("GET",url,true);
	x.send(null);
	x.containerobject	=	container;
	x.loadingobject		=	loading;
	x.replace		=	replace;
	x.name			=	name;
	x.url			=	url;
	x.onreadystatechange = function()
	{
		if (this.readyState == 4)
		{
			if (this.status == 200)
			{
				var t;
				try
				{
					t = eval("("+this.responseText+")");
				}
				catch(e)
				{
					//naxo_debug(e);
					//naxo_debug(this.responseText);
				}
				if (!naxo_cache[this.name])
					naxo_cache[this.name]	=	{};
				//naxo_debug('storing '+name+','+url+' in cache');
				naxo_cache[this.name][this.url]	=	t;
				naxo_load_callback(this.containerobject,this.loadingobject,this.replace,this.name,this.url,t)
			}
		}
	}
}

function naxo_get_value(name)
{
	var obj	=	document.getElementById(name);
	if (obj)
	{
		if (obj.tagName == 'SELECT' || (obj.tagName == 'INPUT' && (obj.type == "text" || obj.type == "password" || obj.type == "hidden")))
			return obj.value;
		if (obj.tagName == 'INPUT' && obj.type == 'checkbox')
			return obj.checked?1:0;
	}
	var list	=	document.getElementsByTagName('INPUT');
	var found	=	0;
	for (var i=0; i<list.length; i++)
	{
		var input = list[i];
		if (input.type != "radio" || input.name != name)
			continue;
		found	=	1;
		if (input.checked)
			return input.value;
	}
	if (!found)
		throw 'input_not_found';

}

// prefix is the prefix for all subforms
// list is the list of subform suffixes
// value is the current value (will be tested against the suffixes)
// list2 is a list of fields which should be sent to the server

function naxo_set_visibility_2(prefix,list,value,list2,delete_not_visible)
{
	//naxo_debug('naxo_set_visibility_called, prefix: '+prefix+', value: '+value);
	for (var i=0;i<list.length;i++)
	{
		name=list[i];
		//naxo_debug('name='+name);
		var fullname	=	prefix+'_'+name;
		var o1 = naxo_getobj('tr_'+fullname);
		var o2 = naxo_getobj('tbody_'+fullname);
		if (!o1 || !o2)
		{
			continue;
		}
		if (typeof(value) != "undefined" && name == value)
		{
			//naxo_debug('handling selection of '+fullname);

			//naxo_debug(naxo_load_in_progress[fullname]);
			var o3	=	o2.firstChild;
			while (o3 && o3.nodeType!=1)
			{
				o3	=	o3.nextSibling;
			}
			//naxo_dump(o3);
			if (!o3 && !naxo_load_in_progress[fullname])
			{
				naxo_load_in_progress[fullname]	=	1;

				//naxo_debug('adding loading icon for '+fullname);
				// XXX make pic customizable + add customizable text
				var tr = naxo_build({type:'TR',contents:[{type:'TD'},{type:'TD',contents:[{type:'IMG',attrs:{SRC:'/common/img/loading.gif',WIDTH:16,HEIGHT:16,BORDER:0}}]},{type:'TD'}]});

				//naxo_debug('trace 1');
				naxo_load("?getform="+fullname,o2,tr,fullname,list2);
			}
			o1.style.display = '';
		}
		else
		{
			if (delete_not_visible)
			{
				while (o2.firstChild)
				{
					o2.removeChild(o2.firstChild);
				}
				delete naxo_loaded[fullname];
			}
			o1.style.display = 'none';
		}
	}
	return 0;
}

function naxo_set_visibility(name,list,list2,delete_not_visible)
{
	naxo_set_visibility_2(name,list,naxo_get_value(name),list2,delete_not_visible);
}

function naxo_dynamic_content(base_url,dest,list,replace)
{
	var obj	=	document.getElementById(dest);

	if (!obj)
	{
		//naxo_debug("ndc:"+dest+" not found");
		return;
	}
	//naxo_debug("ndc:"+dest);
	if (naxo_load_in_progress[dest])
	{
		//naxo_debug('setting timeout');
		var l	=	'';
		if (list.length)
			l	=	"'"+list.join("','")+"'";
		setTimeout("naxo_dynamic_content('"+base_url+"','"+dest+"',["+l+"],"+replace+")",1000);
		return;
	}

	naxo_load_in_progress[dest]=1;
	var loading = (dest.search(/^tr_/)!=-1)?naxo_build({type:'TD',contents:[{type:'IMG',attrs:{SRC:'/common/img/loading.gif',WIDTH:16,HEIGHT:16,BORDER:0}}]}):naxo_build({type:'IMG',attrs:{SRC:'/common/img/loading.gif',WIDTH:16,HEIGHT:16,BORDER:0}});
	//naxo_dump(loading);
	naxo_load(base_url,obj,loading,dest,list,replace);
}

// field is the field that just changed
function naxo_field_update(field)
{
	//naxo_debug('**** '+field);
	var deplist	=	naxo_dependencies[field];
	if (!deplist)
		return;
	for (var i=0;i<deplist.length;i++)
	{
		var dep	=	deplist[i];
		//naxo_debug('->'+dep);
		var o	=	document.getElementById(dep);
		if (!o)
			continue;
		if (naxo_static_requirements[dep])
		{
			// requirements are static, so the data must already be there, just show/hide as necessary
			//naxo_debug('static');
			var r = naxo_static_requirements[dep];
			var d = '';
			for (var j in r)
			{
				//naxo_debug(j);
				if (typeof(r[j]) == "object")
				{
					//naxo_debug("hash");
					if (!r[j][naxo_get_value(j)])
					{
						//naxo_debug("not found");
						d = 'none';
						break;
					}
				}
				else if (naxo_get_value(j) != r[j])
				{
					d = 'none';
					break;
				}
			}
			o.style.display = d;
			if (d == 'none' && naxo_requirements[dep])
			{
				//naxo_debug('skipping dynamic requirements');
				continue;
			}
		}
		if (naxo_requirements[dep])
		{
			//naxo_debug('dynamic');
			// There are dynamic requirements, load from server
			o.style.display = '';
			naxo_dynamic_content("?getfield="+dep,dep,naxo_requirements[dep],1);
		}
		else
		{
			naxo_field_update(dep);
		}

	}
}

function naxo_dynamic_help(field,list)
{
	// XXX should find a way to use this to "validate" input (and disable submit button if invalid, re-enable it when all input valid <- that is the hard part)
	list.push(field);
	naxo_dynamic_content("?onchangefield="+field,'help_'+field,list);
}
