if (!window.liltype)
{
	liltype = {};
}

liltype.ShadowForm = function ()
{
	if (arguments.length)
	{
		this.src = arguments[0];
		this.tgt = arguments[1];
	}
}
new liltype.ShadowForm();
liltype.ShadowForm.prototype = 
{
	"src": null,
	"tgt": null,
	"getName": function(el)
	{
		var n;
		if (n = el.name)
		{
			return n;
		}
		else if (el.length && el[0])
		{
			return el[0].name;
		}
		else
		{
			return "";
		}
	},
	"getType": function(el)
	{
		var t;
		if (t = el.type)
		{
			return t;
		}
		else if (el.length && el[0])
		{
			return el[0].type;
		}
		else
		{
			return "";
		}
	},
	"setElVal": function(el, value)
	{
		var i, c, opts;
	
		switch (this.getType(el))
		{
			case 'radio':
				for (i = 0, c = el.length; i < c; i++)
				{
					if (el[i].value == value)
					{
						el[i].checked = true;
						break;
					}
				}
				break;
			case 'checkbox':
				if (el.value == value)
				{
					el.checked = true;
					break;
				}
				break;
			case 'select-one':
				opts = el.options;
				for (i = 0, c = opts.length; i < c; i++)
				{
					if (opts[i].value == value)
					{
						opts[i].selected = true;
						break;
					}
				}
				break;
			default:
				el.value = value;
				break;
		}
	},
	"getElVal": function(el)
	{
		var i, c, opts, value = "";

		switch (this.getType(el))
		{
			case 'radio':
				for (i = 0, c = el.length; i < c; i++)
				{
					if (el[i].checked)
					{
						value = el[i].value;
						break;
					}
				}
				break;
			case 'checkbox':
				if (el.checked)
				{
					value = el.value;
					break;
				}
				break;
			case 'select-one':
				value = el.options[el.selectedIndex].value;
				break;
			default:
				value = el.value;
				break;
		}
		return value ? value : "";
	},
	"setTgtVal": function(k, v, handlersTgt)
	{
		var el = this.tgt[k], i, c;
		this.setElVal(el, v);
		handlersTgt = handlersTgt ? handlersTgt : [];
		for (i = 0, c = handlersTgt.length; i < c; i++)
		{
			tgt[handlersTgt[i]]();
		}
	},
	"setSrcVal": function(k, v, handlersSrc)
	{
		var el = this.src[k], i, c;
		this.setElVal(el, v);
		handlersSrc = handlersSrc ? handlersSrc : [];
		for (i = 0, c = handlersSrc.length; i < c; i++)
		{
			tgt[handlersSrc[i]]();
		}
	},
	"getTgtVal": function(k)
	{
		return this.getElVal(this.tgt[k]);
	},
	"getSrcVal": function(k)
	{
		return this.getElVal(this.src[k]);
	},
	"copy": function(nameSrc, nameTgt, handlersTgt)
	{
		var src = this.src[nameSrc], tgt = this.tgt[nameTgt], i, c;
		handlersTgt = handlersTgt ? handlersTgt : [];
		this.setElVal(tgt, this.getElVal(src));
		for (i = 0, c = handlersTgt.length; i < c; i++)
		{
			tgt[handlersTgt[i]]();
		}
	},
	"revert": function(nameSrc, nameTgt, handlersSrc)
	{
		var src = this.src[nameSrc], tgt = this.tgt[nameTgt], i, c;
		handlersSrc = handlersSrc ? handlersSrc : [];
		this.setElVal(src, this.getElVal(tgt));
		for (i = 0, c = handlersSrc.length; i < c; i++)
		{
			tgt[handlersSrc[i]]();
		}
	}
};

