;(function($, yl) { yl.forwardHandlerRegistry = yl.forwardHandlerRegistry || {}; yl.registerForwardHandler = function(name, handler) { yl.forwardHandlerRegistry[name] = handler; }; yl.getForwardHandler = function(name) { return yl.forwardHandlerRegistry[name]; }; function getForwardStrategy(element) { var checkForCheckboxes = function() { var all = true; $.each(element, function(ix, e) { if ($(e).attr("type") !== "checkbox") { all = false; } }); return all; }; if (element.length === 1 && element.attr("type") === "checkbox" && element.attr("value") === undefined) { // Single checkbox without 'value' attribute // Boolean field return "exists"; } else if (element.length === 1 && element.attr("multiple") !== undefined) { // Multiple by HTML semantics. E. g. multiple select // Multiple choice field return "multiple"; } else if (checkForCheckboxes()) { // Multiple checkboxes or one checkbox with 'value' attribute. // Multiple choice field represented by checkboxes return "multiple"; } else { // Other cases return "single"; } } /** * Get fields with name `name` relative to `element` with considering form * prefixes. * @param element the element * @param name name of the field * @returns jQuery object with found fields or empty jQuery object if no * field was found */ yl.getFieldRelativeTo = function(element, name) { var prefixes = $(element).getFormPrefixes(); for (var i = 0; i < prefixes.length; i++) { var fieldSelector = "[name=" + prefixes[i] + name + "]"; var field = $(fieldSelector); if (field.length) { return field; } } return $(); }; /** * Get field value which is put to forwarded dictionary * @param field the field * @returns forwarded value */ yl.getValueFromField = function(field) { var strategy = getForwardStrategy(field); var serializedField = $(field).serializeArray(); if ((serializedField == false) && ($(field).prop('disabled'))) { $(field).prop('disabled', false); serializedField = $(field).serializeArray(); $(field).prop('disabled', true); } var getSerializedFieldElementAt = function (index) { // Return serializedField[index] // or null if something went wrong if (serializedField.length > index) { return serializedField[index]; } else { return null; } }; var getValueOf = function (elem) { // Return elem.value // or null if something went wrong if (elem.hasOwnProperty("value") && elem.value !== undefined ) { return elem.value; } else { return null; } }; var getSerializedFieldValueAt = function (index) { // Return serializedField[index].value // or null if something went wrong var elem = getSerializedFieldElementAt(index); if (elem !== null) { return getValueOf(elem); } else { return null; } }; if (strategy === "multiple") { return serializedField.map( function (item) { return getValueOf(item); } ); } else if (strategy === "exists") { return serializedField.length > 0; } else { return getSerializedFieldValueAt(0); } }; yl.getForwards = function(element) { var forwardElem, forwardList, forwardedData, divSelector, form; divSelector = "div.dal-forward-conf#dal-forward-conf-for-" + element.attr("id") + ", " + "div.dal-forward-conf#dal-forward-conf-for_" + element.attr("id"); form = element.length > 0 ? $(element[0].form) : $(); forwardElem = form.find(divSelector).find('script'); if (forwardElem.length === 0) { return; } try { forwardList = JSON.parse(forwardElem.text()); } catch (e) { return; } if (!Array.isArray(forwardList)) { return; } forwardedData = {}; $.each(forwardList, function(ix, field) { var srcName, dstName; if (field.type === "const") { forwardedData[field.dst] = field.val; } else if (field.type === "self") { if (field.hasOwnProperty("dst")) { dstName = field.dst; } else { dstName = "self"; } forwardedData[dstName] = yl.getValueFromField(element); } else if (field.type === "field") { srcName = field.src; if (field.hasOwnProperty("dst")) { dstName = field.dst; } else { dstName = srcName; } var forwardedField = yl.getFieldRelativeTo(element, srcName); if (!forwardedField.length) { return; } forwardedData[dstName] = yl.getValueFromField(forwardedField); } else if (field.type === "javascript") { var handler = yl.getForwardHandler(field.handler); forwardedData[field.dst || field.handler] = handler(element); } }); return JSON.stringify(forwardedData); }; })(yl.jQuery, yl);