/**
 * Royalfish FormField class
 */
	function RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.fieldvar = in_fieldvar;
		this.fieldcontainer = document.getElementById(in_fieldcontainer);
		this.fieldcontainer._super = this;
		this.formfield = document.getElementById(in_formfield) ? document.getElementById(in_formfield) : in_formfield;
		this.extendFormField();
		this.setRequired(in_required);
		this.setEnabled(in_enabled);
		this.setValueHint(in_valuehint);
		this.section = null;
		this.regexp = null;
	}
	
	RFFormField.prototype.errorclasstype = 'formfield';	/** Determines which error class type to use. 'firsttable' for the first table object under fieldcontainer or 'formfield' for the form field **/
	
	RFFormField.prototype.extendFormField = function() {
		if(typeof(this.formfield) != 'string') {
			this.formfield._super = this;
		}
	}
	
	RFFormField.prototype.getDescription = function() {
		spans = this.fieldcontainer.getElementsByTagName('SPAN');
		for(var i = 0; i < spans.length; i++) {
			if(spans[i].className == 'fieldDescription') {
				return spans[i].innerHTML.substr(0, spans[i].innerHTML.length-1);
			}
		}
		return 'No description found!';
	}
	
	RFFormField.prototype.setDescription = function(in_description) {
		spans = this.fieldcontainer.getElementsByTagName('SPAN');
		for(var i = 0; i < spans.length; i++) {
			if(spans[i].className == 'fieldDescription') {
				spans[i].innerHTML = in_description + ':';
			}
		}
	}
	
	RFFormField.prototype.getRequired = function() {
		return this.required;
	}
	
	RFFormField.prototype.setRequired = function(in_required) {
		this.required = in_required;
	}
	
	RFFormField.prototype.getEnabled = function() {
		return this.enabled;
	}
	
	RFFormField.prototype.setEnabled = function(in_enabled) {
		this.enabled = in_enabled;
	}
	
	RFFormField.prototype.getVisible = function() {
		return (this.fieldcontainer.style.display != 'none') ? true : false;
	}
	
	RFFormField.prototype.setVisible = function(in_visible) {
		this.fieldcontainer.style.display = (in_visible) ? "" : 'none';
	}
	
	RFFormField.prototype.getValue = function(force_value) {
		if(this.getEnabled() || (!this.getEnabled() && force_value == true)) {
			return this.formfield.value.trim();
		}
		else {
			return false;
		}
	}
	
	RFFormField.prototype.getValuePlain = function() {
		return this.formfield.value;
	}
	
	RFFormField.prototype.setValue = function(in_value) {
		this.formfield.value = in_value;
	}
	
	RFFormField.prototype.getValueHint = function() {
		return this.valuehint;
	}
	
	RFFormField.prototype.setValueHint = function(in_valuehint) {
		this.valuehint = in_valuehint;
	}
	
	RFFormField.prototype.getError = function() {
		if(this.getErrorMessageObject().innerHTML.length > 0) {
			return this.getErrorMessageObject().innerHTML;
		}
		else {
			return false;
		}
	}
	
	RFFormField.prototype.getErrorHtml = function() {
		return this.getError();
	}
	
	RFFormField.prototype.getErrorClassObject = function() {
		if(this.errorclasstype == 'firsttable') {
			tables = this.fieldcontainer.getElementsByTagName('TABLE');
			return tables[0];
		}
		else {
			return this.formfield;
		}
	}
	
	RFFormField.prototype.getErrorMessageObject = function() {
		divs = this.fieldcontainer.getElementsByTagName('DIV');
		for(var i = 0; i < divs.length; i++) {
			if(divs[i].className == 'fieldError') {
				return divs[i];
			}
		}
	}
	
	RFFormField.prototype.setError = function(in_error) {
		if(in_error != false) {
			this.getErrorMessageObject().innerHTML = in_error;
			this.getErrorMessageObject().style.display = "";
			addClassName(this.getErrorClassObject(), 'error');
		}
		else {
			this.getErrorMessageObject().innerHTML = '';
			this.getErrorMessageObject().style.display = "none";
			removeClassName(this.getErrorClassObject(), 'error');
		}
	}
	
	RFFormField.prototype.getMessage = function() {
		if(this.getMessageObject().innerHTML.length > 0) {
			return this.getMessageObject().innerHTML;
		}
		else {
			return false;
		}
	}
	
	RFFormField.prototype.getMessageObject = function() {
		divs = this.fieldcontainer.getElementsByTagName('DIV');
		for(var i = 0; i < divs.length; i++) {
			if(divs[i].className == 'fieldMessage') {
				return divs[i];
			}
		}
	}
	
	RFFormField.prototype.setMessage = function(in_message) {
		if(in_message != false) {
			this.getMessageObject().innerHTML = in_message;
			this.getMessageObject().style.display = "";
		}
		else {
			this.getMessageObject().innerHTML = '';
			this.getMessageObject().style.display = "none";
		}
	}
	
	RFFormField.prototype.setRegExp = function(in_pattern, in_modifier, in_errormsg) {
		this.regexp = new Array();
		this.regexp['pattern'] = in_pattern;
		this.regexp['modifier'] = in_modifier;
		this.regexp['errormsg'] = in_errormsg;
		return true;
	}
	
	RFFormField.prototype.checkValue = function() {
		this.setError(false);
		if(this.section.getRequired() && this.getRequired()) {
			if(this.isEmpty()) {
				this.setError(RFFormhandlerLang.get('fieldtype.incomplete.error'));
				return false;
			}
		}
		if(this.section.getEnabled() && this.getEnabled() && !this.isEmpty()) {
			if(this.regexp) {
				reg = new RegExp(this.regexp['pattern'], this.regexp['modifier']);
				if(!reg.test(this.getValue())) {
					this.setError(this.regexp['errormsg']);
					return false;
				}
			}
		}
	}
	
	RFFormField.prototype.isEmpty = function() {
		return (this.getValue() == '') ? true : false;
	}
	
	RFFormField.prototype.handleChange = function() {
		this.checkValue();
		this.section.form.processConditionalActions(this);
	}
	
	RFFormField.prototype.registerEvents = function() {
		if(typeof(this.formfield) != 'string') {
			this.formfield.onblur = function() { this._super.handleChange(); };
		}
	}
	
	RFFormField.prototype.focus = function() {
		if(typeof(this.formfield) != 'string') {
			if(this.formfield.focus != undefined) {
				this.formfield.focus();
			}
		}
	}
	
/**
 * The extensions of the classes.
 */
	function RFFormFieldHidden(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldHidden.inherit(RFFormField);
	
	function RFFormFieldDate(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldDate.inherit(RFFormField);
	RFFormFieldDate.prototype.errorclasstype = 'firsttable';
	
	RFFormFieldDate.prototype._extendFormField = RFFormField.prototype.extendFormField;
	RFFormFieldDate.prototype.extendFormField = function () {
		this.formfield = document.getElementById(this.formfield+'year');
		this.formfield._super = this;
	}
	
	RFFormFieldDate.prototype._getValue = RFFormField.prototype.getValue;
	RFFormFieldDate.prototype.getValue = function (force_value) {
		if(this.getEnabled() || (!this.getEnabled() && force_value == true)) {
			inputs = this.fieldcontainer.getElementsByTagName('INPUT');
			daynum = inputs[0].value.trim();
			monthnum = inputs[1].value.trim();
			yearnum = inputs[2].value.trim();
			
			if(daynum == '' && monthnum == '' && yearnum == '' && !this.getRequired()) {
				return false;
			}
			else if(daynum == '' || monthnum == '' || yearnum == '') {
				return '--';
			}
			else {
				return yearnum+'-'+monthnum+'-'+daynum;
			}
		}
		else {
			return false;
		}
	}
	
	RFFormFieldDate.prototype._checkValue = RFFormField.prototype.checkValue;
	RFFormFieldDate.prototype.checkValue = function () {
		this._checkValue();
		if(this.getValue()) {
			date_parts = this.getValue().split('-');
			date_test = new Date(date_parts[0], date_parts[1]-1,date_parts[2]);
			if ((date_parts[0] != date_test.getFullYear()) || (date_parts[1] != date_test.getMonth() + 1) || (date_parts[2] != date_test.getDate())) {
				this.setError(RFFormhandlerLang.get('date.invalid.error'));
				return false
			}
		}
	}
	
	function RFFormFieldDateTime(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldDateTime.inherit(RFFormField);
	RFFormFieldDateTime.prototype.errorclasstype = 'firsttable';
	
	function RFFormFieldDateNew(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldDateNew.inherit(RFFormField);
	RFFormFieldDateNew.prototype.errorclasstype = 'firsttable';
	
	function RFFormFieldString(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldString.inherit(RFFormField);
	
	function RFFormFieldEuro(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldEuro.inherit(RFFormField);
	RFFormFieldEuro.prototype._checkValue = RFFormField.prototype.checkValue;
	RFFormFieldEuro.prototype.checkValue = function() {
		if(this._checkValue() == false) {
			return false;
		}
		else {
			new_value = this.getValue();
			new_value = new_value.replace(',', '.');
			new_value = parseFloat(new_value);
			new_value = Math.round(new_value*100).toString();
			if(new_value.length == 1) {
				new_value = "0,0"+new_value;
			}
			else if(new_value.length == 2) {
				new_value = "0,"+new_value;
			}
			else {
				new_value = new_value.substring(0, new_value.length -2) + ',' + new_value.substring(new_value.length-2);
			}
			this.setValue(new_value);
		}
	}
	RFFormFieldEuro.prototype._getValue = RFFormField.prototype.getValue;
	RFFormFieldEuro.prototype.getValue = function(force_value) {
		test_value = this._getValue(force_value);
		if(test_value != false) {
			reg = new RegExp('^[0]{1,}[,.]{0,}[0]{0,}$', 'i');
			if(reg.test(test_value)) {
				return false;
			}
			else {
				return test_value;
			}
		}
		return false;
	}
	
	function RFFormFieldCaptcha(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldCaptcha.inherit(RFFormField);
	
	function RFFormFieldPassword(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldPassword.inherit(RFFormField);
	
	function RFFormFieldLongString(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldLongString.inherit(RFFormField);
	
	function RFFormFieldOption(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldOption.inherit(RFFormField);
	RFFormFieldOption.prototype.errorclasstype = 'firsttable';
	
	RFFormFieldOption.prototype._registerEvents = RFFormField.prototype.registerEvents;
	RFFormFieldOption.prototype.registerEvents = function() {
		this.formfield.onchange = function() { this._super.handleChange(); };
		this.formfield.onblur = function() { this._super.handleChange(); };
	}
	
	
	function RFFormFieldRadio(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldRadio.inherit(RFFormField);
	RFFormFieldRadio.prototype.errorclasstype = 'firsttable';
	
	RFFormFieldRadio.prototype._extendFormField = RFFormField.prototype.extendFormField;
	RFFormFieldRadio.prototype.extendFormField = function() {
		inputs = this.fieldcontainer.getElementsByTagName('INPUT');
		for(var i = 0; i < inputs.length; i++) {
			if(inputs[i].getAttribute('type') == 'radio') {
				inputs[i]._super = this;
			}
		}
	}
	RFFormFieldRadio.prototype._getValue = RFFormField.prototype.getValue;
	RFFormFieldRadio.prototype.getValue = function() {
		if(this.getEnabled() || (!this.getEnabled() && force_value == true)) {
			inputs = this.fieldcontainer.getElementsByTagName('INPUT');
			for(var i = 0; i < inputs.length; i++) {
				if(inputs[i].getAttribute('type') == 'radio') {
					if(inputs[i].checked) {
						return inputs[i].value;
					}
				}
			}
		}
		return false;
	}
	RFFormFieldRadio.prototype._setValue = RFFormField.prototype.setValue;
	RFFormFieldRadio.prototype.setValue = function(in_value) {
		inputs = this.fieldcontainer.getElementsByTagName('INPUT');
		for(var i = 0; i < inputs.length; i++) {
			if(inputs[i].getAttribute('type') == 'radio') {
				if(inputs[i].checked) {
					inputs[i].checked = false;
				}
				if(inputs[i].getAttribute('value') == in_value) {
					inputs[i].checked = true;
				}
			}
		}
	}
	RFFormFieldRadio.prototype._registerEvents = RFFormField.prototype.registerEvents;
	RFFormFieldRadio.prototype.registerEvents = function() {
		inputs = this.fieldcontainer.getElementsByTagName('INPUT');
		for(var i = 0; i < inputs.length; i++) {
			if(inputs[i].getAttribute('type') == 'radio') {
				this.extendFormField(inputs[i]);
				inputs[i].onclick = function () { this._super.handleChange();};
				inputs[i].onblur = function () { this._super.handleChange();};
			}
		}
	}
	
	function RFFormFieldCheckbox(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldCheckbox.inherit(RFFormField);
	RFFormFieldCheckbox.prototype.getValue = function(force_value) {
		if(this.getEnabled() || (!this.getEnabled() && force_value == true)) {
			return this.formfield.checked;
		}
		else {
			return false;
		}
	}
	
	function RFFormFieldHTML(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldHTML.inherit(RFFormField);
	RFFormFieldHTML.prototype.errorclasstype = 'firsttable';
	
	function RFFormFieldLongHTML(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldLongHTML.inherit(RFFormField);
	RFFormFieldLongHTML.prototype.errorclasstype = 'firsttable';
	RFFormFieldLongHTML.prototype._getValue = RFFormField.prototype.getValue;
	RFFormFieldLongHTML.prototype.getValue = function(force_value) {
		if(this.getEnabled() || (!this.getEnabled() && force_value == true)) {
			editor_value = eval(this.formfield.id+'Editor.getXHTMLBody()');
			this.formfield.value = editor_value;
			return editor_value;
		}
		else {
			return false;
		}
	}
	RFFormFieldLongHTML.prototype._setValue = RFFormField.prototype.setValue;
	RFFormFieldLongHTML.prototype.setValue = function(force_value) {
		alert(force_value);
	}
	
	function RFFormFieldPagePosition(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldPagePosition.inherit(RFFormField);
	RFFormFieldPagePosition.prototype.errorclasstype = 'firsttable';
	
	function RFFormFieldFile(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldFile.inherit(RFFormField);
	
	function RFFormFieldAccessControl(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint) {
		this.RFFormField(in_fieldvar, in_formfield, in_fieldcontainer, in_required, in_enabled, in_valuehint);
	}
	RFFormFieldAccessControl.inherit(RFFormField);
