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;
				}
				else
				{
					el.checked = false;
				}
				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;
			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;
		if (!src)
		{
			src = jQuery("*[name='"+nameSrc+"']", this.src).get(0);
		}
		if (!tgt)
		{
			tgt = jQuery("*[name='"+nameTgt+"']", this.tgt).get(0);
		}
		if (!src || !tgt)
		{
			return;
		}
		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;
		if (!src)
		{
			src = jQuery("*[name='"+nameSrc+"']", this.src).get(0);
		}
		if (!tgt)
		{
			tgt = jQuery("*[name='"+nameTgt+"']", this.tgt).get(0);
		}
		if (!src || !tgt)
		{
			return;
		}
		handlersSrc = handlersSrc ? handlersSrc : [];
		this.setElVal(src, this.getElVal(tgt));
		for (i = 0, c = handlersSrc.length; i < c; i++)
		{
			tgt[handlersSrc[i]]();
		}
	},
	"copyAll": function()
	{
		var i, c, els = this.src.elements, n, visto = {};
		for (i = 0, c = els.length; i < c; i++)
		{
			if (!visto[n = this.getName(els[i])] && n.length)
			{
				this.copy(n, n);
				visto[n] = true;
			}
		}
	},
	"revertAll": function()
	{
		var i, c, els = this.tgt.elements, n, visto = {};
		for (i = 0, c = els.length; i < c; i++)
		{
			if (!visto[n = this.getName(els[i])] && n.length)
			{
				this.revert(n, n);
				visto[n] = true;
			}
		}
	},
	"copySelectOpts": function(src, tgt)
	{
		var i, c, opts = src.options, opt, html = "";
		for (i = 0, c = opts.length; i < c; i++)
		{
			opt = opts[i];
			html +=
				'<option value="'+opt.value+'"'+(opt.selected ? ' selected="selected"' : '')+'>'+opt.innerHTML+'<'+'/option>';
		}
		jQuery(tgt).html(html);
	}
};

