ShadowForm = function ()
{
	if (arguments.length)
	{
		this.src = arguments[0];
		this.tgt = arguments[1];
		var i, c, els = this.src.elements, n, visto = {}, el, shadow = this, t, tgtEl;

		for (i = 0, c = els.length; i < c; i++)
		{
			el = els[i];
			if (!visto[n = this.getName(el)] && n.length)
			{
				switch(t = this.getType(el))
				{
					default:
						jQuery(el).blur(this.anonCopyToTgt(shadow));
						if (t.match(/^(submit|image)$/))
						{
							jQuery(el).click(this.anonSubmitClick(shadow));
						}
						break;
				}

				if (tgtEl = this.getElByName(n, this.tgt))
				{
					this.setElVal(el, this.getElVal(tgtEl));
				}

				visto[n] = true;
			}
		}

		if (arguments[2])
		{
			arguments[2](this);
		}
	}
}
new ShadowForm();
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 "";
		}
	},
	"getElByName": function(name, form)
	{
		var el = form[name];
		if (!el)
		{
			el = jQuery("*[name='"+name+"']", form).get();
		}
		return el;
	},
	"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 : "";
	},
	"copyToTgt": function(elSrc)
	{
		var n = this.getName(elSrc);
		var tgtEl = this.getElByName(n, this.tgt);
		var srcEl = this.getElByName(n, this.src);
		if (tgtEl && srcEl)
		{	
			this.setElVal(tgtEl, this.getElVal(srcEl));
		}
	},
	"anonCopyToTgt": function(shadow)
	{
		var f = function()
		{
			shadow.copyToTgt(this);
		};
		return f;
	},
	"submitClick": function(elSrc)
	{
		var tgtEl = this.getElByName(this.getName(elSrc), this.tgt);
		
		if (tgtEl)
		{	
			jQuery(tgtEl).trigger("click");
		}
	},
	"anonSubmitClick": function(shadow)
	{
		var f = function()
		{
			shadow.submitClick(this);
			return false;
		};
		return f;
	}
};

