// get input based on element type
function elemTextValue(elem)
{
	if (!elem) {
		return;
	}
	switch (elem.type) {
		case 'hidden':
			return;
			break;

		case 'text': case 'textarea': case 'password':
			return elem.value;
			break;

		case 'checkbox': case 'radio':
			if (elem.checked) {
				return elem.value;
			}
			break;

		// FIXME returns just the first
		case 'select-one': case 'select-multiple':
			return elem.options[elem.selectedIndex].value ? elem.options[elem.selectedIndex].text : '';
			break;
	}
}

// returns a list of form elements that have been changed
function Form_changeReport()
{
	var changeList = new Object();
	var str = '';
	for (var ctr=0; ctr<this.formElement.elements.length; ctr++) {
		var name = this.formElement.elements[ctr].name;
		if (this.formElementOriginalValue[ctr] != this.textValue(this.formElement.elements[ctr])) {
			changeList[name] = 1;
		}
	}
	for (var name in changeList) {
		var shortName = name;
		shortName = shortName.replace(/^__/g, '');
		shortName = shortName.replace(/__/g, ': ');
		shortName = shortName.replace(/_/g, ' ');

		var oldVal = new Array();
		for (var octr=0; octr<this.formElement.elements.length; octr++) {
			var val = this.formElementOriginalValue[octr];
			if (name == this.formElementNames[octr] && val) {
				oldVal.push(val);
			}
		}

		var newVal = new Array();
		var elem = this.formElement[name];
		if (elem.length && !elem.name) {
			for (var ectr=0; ectr<elem.length; ectr++) {
				var val = this.textValue(elem[ectr]);
				if (val) {
					newVal.push(val);
				}
			}
		} else {
			var val = this.textValue(elem);
			if (val) {
				newVal.push(val);
			}
		}

		if (shortName.match(/receiver/)) {
			str += "Changed preferred providers\n";
		} else if (shortName.match(/notes/)) {
			str = str;
		} else if (shortName.match(/label/)) {
			str += "New Attachment :" + newVal.toString() + "\n";
		} else if (shortName.match(/delete attachment/)) {
			str += "Removed Attachment";
		} else {
			str += shortName + " "
				+ (oldVal.length ? oldVal.toString() : '[new]')
				+ " => "
				+ (newVal.length ? newVal.toString() : '[clear]')
				+ "\n";
		}
	}
	return str;
}

// create a new Form based on some data, fixed by some stylesheet
function Form(formElement)
{
	this.textValue = elemTextValue;
	this.changeReport = Form_changeReport;

	this.formElement = formElement;
 	this.formElementOriginalValue = new Array(this.formElement.elements.length);
 	this.formElementNames = new Array(this.formElement.elements.length);

	var str = "";
	for (var ctr=0; ctr<this.formElement.elements.length; ctr++) {
		var name = this.formElement.elements[ctr].name;
		this.formElementOriginalValue[ctr] = this.textValue(this.formElement.elements[ctr]);
		this.formElementNames[ctr] = name;
		str += this.formElementOriginalValue[ctr] + "\n";
	}
}
