// Read the name, id, type, and value of one form control element
// as requested by form2ArrayString()
function formObj2String(obj) {
	var output = "{";
	if (obj.name) {
		output += "name:'" + obj.name + "',";
	}
	if (obj.id) {
		output += "id:'" + obj.id + "',";
	}
	output += "type:'" + obj.type + "',";
	switch (obj.type) {
		case "radio":
			if (obj.name) {
				obj = document.forms[0].elements[obj.name];
				var radioVal = "value:false,index:-1";
				for (var i = 0; i < obj.length; i++) {
					if (obj[i].checked) {
						radioVal = "value:true,index:" + i;
						i = obj.length;
					} 
				}
				output += radioVal;
			} else {
				output += "value:" + obj.checked;
			}
			break;
		case "checkbox":
			output += "value:" + obj.checked;
			break;
		case "select-one":
			output += "value:" + obj.selectedIndex;
			break;
		case "select-multiple":
			output += "value:" + obj.selectedIndex;
			break;
		case "text":
			output += "value:'" + escape(obj.value) + "'";
			break;
		case "textarea":
			output += "value:'" + escape(obj.value) + "'";
			break;
		case "password":
			output += "value:'" + escape(obj.value) + "'";
			break;
		case "hidden":
			output += "value:'" + escape(obj.value) + "'";
			break;
		default:
			output += "";
	}
	output += "}"
	return output;
}

// Convert a passed form reference to a string formatted like
// a JavaScript array of objects
function form2ArrayString(form) {
	var elem, lastName = "";
	var output = "[";
	for (var i = 0; i < form.elements.length; i++) {
		elem = form.elements[i];
		//if (elem.name && (elem.name != lastName)) {
		//	output += formObj2String(form.elements[i]) + ",";
		//	lastName = elem.name;
		//}
    if (elem.name) {
      if (elem.name != lastName) {
        output += formObj2String(form.elements[i]) + ",";
        lastName = elem.name;
      }
    }
	}
	output = output.substring(0, output.length-1) + "]";
	return output;
}

// Distribute form control values from another source to the
// controls in this page's form, whose names/ids match those
// of the original form controls
function string2FormObj(form, str) {
	var elem, objArray = eval(str);
	for (var i = 0; i < objArray.length; i++) {
		//elem = (objArray[i].name) ? form.elements[objArray[i].name] : document.getElementById(objArray[i].id);
    if (objArray[i].name) { elem = form.elements[objArray[i].name]         }
    if (objArray[i].id  ) { elem = document.getElementById(objArray[i].id) }
    if (!elem) { continue }
		switch (objArray[i].type) {
			case "radio":
				if (objArray[i].name && objArray[i].value && objArray[i].index >= 0) {
					elem = elem[objArray[i].index];
				}
				elem.checked = objArray[i].value;
				break;
			case "checkbox":
				elem.checked = objArray[i].value;
				break;
			case "select-one":
				elem.selectedIndex = objArray[i].value;
				break;
			case "select-multiple":
				elem.selectedIndex = objArray[i].value;
				break;
			default:
				elem.value = unescape(objArray[i].value);
		}
	}
}

