ASong2U_Web/wp-content/plugins/gravityforms/js/conditional_logic.js

279 lines
8.8 KiB
JavaScript
Raw Normal View History

var __gf_timeout_handle;
function gf_apply_rules(formId, fields, isInit){
var rule_applied = 0;
for(var i=0; i < fields.length; i++){
gf_apply_field_rule(formId, fields[i], isInit, function(){
rule_applied++;
if(rule_applied == fields.length){
jQuery(document).trigger('gform_post_conditional_logic', [formId, fields, isInit]);
if(window["gformCalculateTotalPrice"])
window["gformCalculateTotalPrice"](formId);
}
});
}
}
function gf_check_field_rule(formId, fieldId, isInit, callback){
//if conditional logic is not specified for that field, it is supposed to be displayed
if(!window["gf_form_conditional_logic"][formId] || !window["gf_form_conditional_logic"][formId]["logic"][fieldId])
return "show";
var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId];
var action = gf_get_field_action(formId, conditionalLogic["section"]);
//If section is hidden, always hide field. If section is displayed, see if field is supposed to be displayed or hidden
if(action != "hide")
action = gf_get_field_action(formId, conditionalLogic["field"]);
return action;
}
function gf_apply_field_rule(formId, fieldId, isInit, callback){
action = gf_check_field_rule(formId, fieldId, isInit, callback);
gf_do_field_action(formId, action, fieldId, isInit, callback);
var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId];
//perform conditional logic for the next button
if(conditionalLogic["nextButton"]){
action = gf_get_field_action(formId, conditionalLogic["nextButton"]);
gf_do_next_button_action(formId, action, fieldId, isInit);
}
}
function gf_get_field_action(formId, conditionalLogic){
if(!conditionalLogic)
return "show";
var matches = 0;
for(var i = 0; i < conditionalLogic["rules"].length; i++){
var rule = conditionalLogic["rules"][i];
if(gf_is_match(formId, rule))
matches++;
}
var action;
if( (conditionalLogic["logicType"] == "all" && matches == conditionalLogic["rules"].length) || (conditionalLogic["logicType"] == "any" && matches > 0) )
action = conditionalLogic["actionType"];
else
action = conditionalLogic["actionType"] == "show" ? "hide" : "show";
return action;
}
function gf_is_match(formId, rule){
var inputs = jQuery("#input_" + formId + "_" + rule["fieldId"] + " input");
if(inputs.length > 0){
//handling checkboxes
for(var i=0; i< inputs.length; i++){
var fieldValue = gf_get_value(jQuery(inputs[i]).val());
//find specific checkbox item
if(fieldValue != rule["value"])
continue;
//blank value if item isn't checked
if(!jQuery(inputs[i]).is(":checked"))
fieldValue = "";
if(gf_matches_operation(fieldValue, rule["value"], rule["operator"]))
return true;
}
}
else{
//handling all other fields (non-checkboxes)
var val = jQuery("#input_" + formId + "_" + rule["fieldId"]).val();
//transform regular value into array to support multi-select (which returns an array of selected items)
var values = (val instanceof Array) ? val : [val];
for(var i=0; i < values.length; i++){
var fieldValue = gf_get_value(values[i]);
if(gf_matches_operation(fieldValue, rule["value"], rule["operator"]))
return true;
}
}
return false;
}
function gf_try_convert_float(text){
var format = window["gf_number_format"] == "decimal_comma" ? "decimal_comma" : "decimal_dot";
if(gformIsNumeric(text, format)){
var decimal_separator = format == "decimal_comma" ? "," : ".";
return gformCleanNumber(text, "", "", decimal_separator);
}
return text;
}
function gf_matches_operation(val1, val2, operation){
val1 = val1 ? val1.toLowerCase() : "";
val2 = val2 ? val2.toLowerCase() : "";
switch(operation){
case "is" :
return val1 == val2;
break;
case "isnot" :
return val1 != val2;
break;
case ">" :
val1 = gf_try_convert_float(val1);
val2 = gf_try_convert_float(val2);
return val1 > val2;
break;
case "<" :
val1 = gf_try_convert_float(val1);
val2 = gf_try_convert_float(val2);
return val1 < val2;
break;
case "contains" :
return val1.indexOf(val2) >=0;
break;
case "starts_with" :
return val1.indexOf(val2) ==0;
break;
case "ends_with" :
var start = val1.length - val2.length;
if(start < 0)
return false;
var tail = val1.substring(start);
return val2 == tail;
break;
}
return false;
}
function gf_get_value(val){
if(!val)
return "";
val = val.split("|");
return val[0];
}
function gf_do_field_action(formId, action, fieldId, isInit, callback){
var conditional_logic = window["gf_form_conditional_logic"][formId];
var dependent_fields = conditional_logic["dependents"][fieldId];
for(var i=0; i < dependent_fields.length; i++){
var targetId = fieldId == 0 ? "#gform_submit_button_" + formId : "#field_" + formId + "_" + dependent_fields[i];
//calling callback function on the last dependent field, to make sure it is only called once
do_callback = (i+1) == dependent_fields.length ? callback : null;
gf_do_action(action, targetId, conditional_logic["animation"], conditional_logic["defaults"][dependent_fields[i]], isInit, do_callback);
}
}
function gf_do_next_button_action(formId, action, fieldId, isInit){
var conditional_logic = window["gf_form_conditional_logic"][formId];
var targetId = "#gform_next_button_" + formId + "_" + fieldId;
gf_do_action(action, targetId, conditional_logic["animation"], null, isInit);
}
function gf_do_action(action, targetId, useAnimation, defaultValues, isInit, callback){
if(action == "show"){
if(useAnimation && !isInit){
if(jQuery(targetId).length > 0)
jQuery(targetId).slideDown(callback);
else if(callback)
callback();
}
else{
jQuery(targetId).show();
if(callback){
callback();
}
}
}
else{
//if field is not already hidden, reset its values to the default
var child = jQuery(targetId).children().first();
if(!gformIsHidden(child)){
gf_reset_to_default(targetId, defaultValues);
}
if(useAnimation && !isInit){
if(jQuery(targetId).length > 0)
jQuery(targetId).slideUp(callback);
else if(callback)
callback();
}
else{
jQuery(targetId).hide();
if(callback)
callback();
}
}
}
function gf_reset_to_default(targetId, defaultValue){
//cascading down conditional logic to children to suppport nested conditions
//text fields and drop downs
var target = jQuery(targetId).find('select, input[type="text"], input[type="number"], textarea');
var target_index = 0;
target.each(function(){
var val = "";
if(jQuery.isArray(defaultValue)){
val = defaultValue[target_index];
}
else if(jQuery.isPlainObject(defaultValue)){
val = defaultValue[jQuery(this).attr("name")];
}
else if(defaultValue){
val = defaultValue;
}
jQuery(this).val(val).trigger('change');
target_index++;
});
//checkboxes and radio buttons
var elements = jQuery(targetId).find('input[type="radio"], input[type="checkbox"]');
elements.each(function(){
//is input currently checked?
var isChecked = jQuery(this).is(':checked') ? true : false;
//does input need to be marked as checked or unchecked?
var doCheck = defaultValue ? jQuery.inArray(jQuery(this).attr('id'), defaultValue) > -1 : false;
//if value changed, trigger click event
if(isChecked != doCheck){
//setting input as checked or unchecked appropriately
jQuery(this).prop("checked", doCheck);
//need to set the prop again after the click is triggered
jQuery(this).trigger('click').prop('checked', doCheck);
}
});
}