/**
 * Royalfish Condition classes
 */
	function RFCondition(in_source_field, in_check_value) {
		this.source_field = in_source_field;
		this.check_value = in_check_value;
	}
	
	RFCondition.prototype.isTrue = function() {
		return true;
	}
	
/**
 * The extended objects.
 */
	function RFConditionEquals(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionEquals.inherit(RFCondition);
	RFConditionEquals.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionEquals.prototype.isTrue = function() {
		return this.source_field.getValue() == this.check_value;
	}
	
	function RFConditionContains(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionContains.inherit(RFCondition);
	RFConditionContains.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionContains.prototype.isTrue = function() {
		reg = new RegExp(this.check_value, "i");
		return reg.test(this.source_field.getValue());
	}
	
	function RFConditionStartsWith(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionStartsWith.inherit(RFCondition);
	RFConditionStartsWith.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionStartsWith.prototype.isTrue = function() {
		reg = new RegExp("^"+this.check_value, "i");
		return reg.test(this.source_field.getValue());
	}
	
	function RFConditionEndsWith(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionEndsWith.inherit(RFCondition);
	RFConditionEndsWith.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionEndsWith.prototype.isTrue = function() {
		reg = new RegExp(this.check_value+"$", "i");
		return reg.test(this.source_field.getValue());
	}
	
	function RFConditionGreaterThan(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionGreaterThan.inherit(RFCondition);
	
	function RFConditionLessThan(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionLessThan.inherit(RFCondition);
	
	function RFConditionGreaterThanOrEquals(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionGreaterThanOrEquals.inherit(RFCondition);
	
	function RFConditionLessThanOrEquals(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionLessThanOrEquals.inherit(RFCondition);
	
	function RFConditionIsChecked(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionIsChecked.inherit(RFCondition);
	RFConditionIsChecked.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionIsChecked.prototype.isTrue = function() {
		return this.source_field.getValue() ? true : false;
	}
	
	function RFConditionIsNotChecked(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionIsNotChecked.inherit(RFCondition);
	RFConditionIsNotChecked.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionIsNotChecked.prototype.isTrue = function() {
		return this.source_field.getValue() ? false : true;
	}
	
	function RFConditionIsEmpty(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionIsEmpty.inherit(RFCondition);
	RFConditionIsEmpty.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionIsEmpty.prototype.isTrue = function() {
		return this.source_field.isEmpty();
	}
	
	function RFConditionIsNotEmpty(in_source_field, in_check_value) {
		this.RFCondition(in_source_field, in_check_value);
	}
	RFConditionIsNotEmpty.inherit(RFCondition);
	RFConditionIsNotEmpty.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionIsNotEmpty.prototype.isTrue = function() {
		return this.source_field.isEmpty() ? false : true;
	}
	
	function RFConditionIsCompleted(in_source_section, in_check_value) {
		this.RFCondition(in_source_section, in_check_value);
	}
	RFConditionIsCompleted.inherit(RFCondition);
	RFConditionIsCompleted.prototype._isTrue = RFCondition.prototype.isTrue;
	RFConditionIsCompleted.prototype.isTrue = function() {
		return this.source_field.isCompleted();
	}
	
	
	
/**
 * Conditional action class
 */
	function RFConditionalAction(in_test_type, in_object, in_option) {
		this.test_type = in_test_type;
		this.object = in_object;
		this.option = in_option;
		this.process_only_related_field = true;
		this.conditions = new Array();
	}
	
	RFConditionalAction.prototype.addCondition = function(in_condition) {
		this.conditions.push(in_condition);
	}
	
	RFConditionalAction.prototype.isRelatedField = function(in_field) {
		return in_field.getName() == this.object.getName();
	}
	
	RFConditionalAction.prototype.process = function(in_field) {
		if((this.process_only_if_related_field && this.isRelatedField(in_field)) || !this.process_only_if_related_field) {
			if(this.conditions.length == 1) {
				if(this.conditions[0].isTrue()){
					this.doAction();
					return true;
				}
				else {
					this.undoAction();
					return true;
				}
			}
			else {
				xor_found_true = false;
				for(var i = 0; i < this.conditions.length; i++) {
					if(this.test_type == 'OR') {
						if(this.conditions[i].isTrue()) {
							this.doAction();
							return true;
						}
						if(i == this.conditions.length-1) { // there is no next condition to check!
							this.undoAction();
							return true;
						}
					}
					else if(this.test_type == 'AND') {
						if(!this.conditions[i].isTrue()) {
							this.undoAction();
							return true;
						}
						if(i == this.conditions.length-1) { // there is no next condition to check!
							this.doAction();
							return true;
						}
					}
					else if(this.test_type == 'XOR') {
						if(this.conditions[i].isTrue()) {
							if(xor_found_true == false) {
								this.undoAction();
								return true;
							}
							else {
								xor_found_true = true;
							}
							
						}
						
						if(i == this.conditions.length-1) { // there is no next condition to check!
							if(xor_found_true == false) {
								this.doAction();
							}
							else {
								this.undoAction();
							}
							return true;
						}
					}
				}
			}
		}
	}
	
	RFConditionalAction.prototype.doAction = function() {
		
	}
	
	RFConditionalAction.prototype.undoAction = function() {
		
	}
	

/**
 * The extended classes
 */
	function RFConditionalActionSetVisible(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetVisible.inherit(RFConditionalAction);
	RFConditionalActionSetVisible.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetVisible.prototype.doAction = function() {
		this.object.setVisible(true);
	}
	RFConditionalActionSetVisible.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetVisible.prototype.undoAction = function() {
		this.object.setVisible(false);
	}
	
	function RFConditionalActionSetNotVisible(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetNotVisible.inherit(RFConditionalAction);
	RFConditionalActionSetNotVisible.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetNotVisible.prototype.doAction = function() {
		this.object.setVisible(false);
	}
	RFConditionalActionSetNotVisible.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetNotVisible.prototype.undoAction = function() {
		this.object.setVisible(true);
	}
	
	function RFConditionalActionSetRequired(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetRequired.inherit(RFConditionalAction);
	RFConditionalActionSetRequired.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetRequired.prototype.doAction = function() {
		this.object.setRequired(true);
	}
	RFConditionalActionSetRequired.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetRequired.prototype.undoAction = function() {
		this.object.setRequired(false);
	}
	
	function RFConditionalActionSetNotRequired(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetNotRequired.inherit(RFConditionalAction);
	RFConditionalActionSetNotRequired.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetNotRequired.prototype.doAction = function() {
		this.object.setRequired(false);
	}
	RFConditionalActionSetNotRequired.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetNotRequired.prototype.undoAction = function() {
		this.object.setRequired(true);
	}
	
	function RFConditionalActionSetEnabled(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetEnabled.inherit(RFConditionalAction);
	RFConditionalActionSetEnabled.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetEnabled.prototype.doAction = function() {
		this.object.setEnabled(true);
	}
	RFConditionalActionSetEnabled.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetEnabled.prototype.undoAction = function() {
		this.object.setEnabled(false);
	}
	
	function RFConditionalActionSetNotEnabled(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetNotEnabled.inherit(RFConditionalAction);
	RFConditionalActionSetNotEnabled.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetNotEnabled.prototype.doAction = function() {
		this.object.setEnabled(false);
	}
	RFConditionalActionSetNotEnabled.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetNotEnabled.prototype.undoAction = function() {
		this.object.setEnabled(true);
	}
	
	function RFConditionalActionSetRequiredEnabledVisible(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetRequiredEnabledVisible.inherit(RFConditionalAction);
	RFConditionalActionSetRequiredEnabledVisible.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetRequiredEnabledVisible.prototype.doAction = function() {
		this.object.setRequired(true);
		this.object.setEnabled(true);
		this.object.setVisible(true);
	}
	RFConditionalActionSetRequiredEnabledVisible.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetRequiredEnabledVisible.prototype.undoAction = function() {
		this.object.setRequired(false);
		this.object.setEnabled(false);
		this.object.setVisible(false);
	}
	
	function RFConditionalActionSetValue(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetValue.inherit(RFConditionalAction);
	RFConditionalActionSetValue.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetValue.prototype.doAction = function() {
		this.object.setValue(this.option);
	}
	RFConditionalActionSetValue.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetValue.prototype.undoAction = function() {
		this.object.setValue(false);
	}
	
	function RFConditionalActionSetMessage(in_test_type, in_object, in_option) {
		this.RFConditionalAction(in_test_type, in_object, in_option);
	}
	RFConditionalActionSetMessage.inherit(RFConditionalAction);
	RFConditionalActionSetMessage.prototype._doAction - RFConditionalAction.prototype.doAction;
	RFConditionalActionSetMessage.prototype.doAction = function() {
		this.object.setMessage(this.option);
	}
	RFConditionalActionSetMessage.prototype._undoAction - RFConditionalAction.prototype.undoAction;
	RFConditionalActionSetMessage.prototype.undoAction = function() {
		this.object.setMessage(false);
	}
