/**
 * Register a FormRule for a Decision_tree style form
 * 
 * @param base_elements_var_name String Element which the rule depends on (the decision)
 * @param elements_var_name String Element which the rule applies to
 * @param rule_type Number (0 or 1) Is it a string or a number situation
 * @param value String/Number The value that creates the decision
 * @param equasion String (= or < or > or <>) optional, the mathmatical equasion type
 */
function registerFormRule( base_elements_var_name , elements_elements_var_name , rule_type , value ,equasion , elements_formelement_id , base_formelement_id ){
	rules.push({
		base_elements_var_name:base_elements_var_name,
		elements_var_name:elements_elements_var_name,
		rule_type:rule_type,
		value:value,
		equasion:equasion,
		elements_formelement_id:elements_formelement_id,
		base_formelement_id:base_formelement_id
	});
}

function applyRulesAtStart( fObj ){
//	for ( var i = fObj.elements.length -1 ; i >= 0  ; i-- ) {
//		var obj = fObj.elements[i];
		_applyRules( fObj );
//	}
}

/**
 * On every 'onblur' an element fires 'applyRules' to apply the form rules in 
 * the Decision_tree 
 * 
 * @param element HTMLInputElement
 */
var tmp;
function applyRules( element ){
	if ( document.all ) { // IE needs a break for 200 milliseconds because he needs to process the form changes
		tmp = element;
		setTimeout(applyRulesIE,200);
	}else{
		_applyRules(element , false );
	}
}

function applyRulesIE(){
	_applyRules(tmp);
}

function isPartOfRule( name ) {
	report("[isPartOfRule] "+name);
	for ( var i = 0 ; i < rules.length ;i ++ ) {
		if ( rules[i].elements_var_name == name ) {
			return true;
		}
	}
	return false;
}

function _applyRules ( felement  ) {
	var fObj = felement;
	if ( felement.form != null ) {
		fObj = felement.form;
	}
	
	for ( var i = 0 ; i < rules.length ;i ++ ) {
		var rule = rules[i];
		if( document.getElementById("li-"+rule.elements_var_name) != null ) {
			document.getElementById("li-"+rule.elements_var_name).style.display = "none";
		}
	}
	
	var radios = collectRadios(fObj);
	for ( var u = 0 ; u < fObj.elements.length  ; u++ ) {
		var element = fObj.elements[u];
		var id = element.id;
		if ( element.type == 'radio' || element.type == 'checkbox' ) {
			id = element.name;
		}

		
		for ( var i = 0 ; i < rules.length ;i ++ ) {
			var rule = rules[i];
			report(rule.base_elements_var_name);
			if ( rule.base_elements_var_name == id ) {
				var cont = true;
				var changed = false;
				var display = "none";
				
				if ( document.getElementById("li-"+rule.base_elements_var_name).style.display == "none") {
					cont = false;
				}
				if ( element.type == 'radio' ) {
					var collection = radios[element.name];
					var found = false;
					for ( var p = 0 ; p < collection.length ;p ++ ) {
						if  ( collection[p].checked) {
							found = true;
							element = collection[p];
						}
					}
					if ( ! found ) {
						cont = false;
					}
				}
				
				
				
				if ( cont ) {
					
					report("[applyrule] element_id:"+id+":"+ element.type
								+":"+element.value+"-"+rule.value+" -> "+element.checked+" - "+rule.elements_var_name);
					if ( rule.rule_type == 0 ) {
						if ( element.value == rule.value ) {
							display = "block";
						}
					}else{
						var input_value = parseFloat(element.value);
						var rule_value = parseFloat(rule.value);
						switch( rule.equasion ) {
							case "=":
								if ( input_value == rule_value ) {
									display = "block";
								}
								break;
							case ">":
								if ( input_value > rule_value) {
									display = "block";
								}
								break;
							case "<":
								if ( input_value < rule_value ) {
									display = "block";
								}
								break;
							case "!=":
								if ( input_value != rule_value ) {
									display = "block";
								}
								break;
							case ">=":
								if ( input_value >= rule_value ) {
									display = "block";
								}
								break;
							case "<=":
								if ( input_value <= rule_value ) {
									display = "block";
								}
								break;
						}
					}
				}
					
				if( document.getElementById("li-"+rule.elements_var_name) != null ) {
					report ("li-"+rule.elements_var_name+": "+ document.getElementById("li-"+rule.elements_var_name).style.display +" vs "+ display );
					if( document.getElementById("li-"+rule.elements_var_name).style.display != "block" ){
						document.getElementById("li-"+rule.elements_var_name).style.display = display;
						changed = true;
					}
				}
				if( document.getElementById("li-"+rule.elements_formelement_id) != null ) {
					report ("li-"+rule.elements_var_name+": "+ document.getElementById("li-"+rule.elements_var_name).style.display +" vs "+ display );
					if( document.getElementById("li-"+rule.elements_formelement_id).style.display != "block" ){
						document.getElementById("li-"+rule.elements_formelement_id).style.display = display;
						changed = true;
					}
				}
				
				report("[applyrule] li-"+rule.elements_var_name+" -> "+display + " - "+changed);
			}
		}
	}
}

