H5PEditor.ShowWhen = (function ($) { // Handler for the 'select' semantics type function SelectHandler(field, equals) { this.satisfied = function () { return (equals.indexOf(field.value) !== -1); }; } // Handler for the 'library' semantics type function LibraryHandler(field, equals) { this.satisfied = function () { var value; if (field.currentLibrary !== undefined) { value = field.currentLibrary.split(' ')[0]; } return (equals.indexOf(value) !== -1); }; } function BooleanHandler(field, equals) { this.satisfied = function () { return field.value === equals; }; } // Factory method for creating handlers // "library", "select" and "boolean" semantics types supported so far function createFieldHandler(field, equals) { if (field.field.type === 'library') { return new LibraryHandler(field, equals); } else if (field.field.type === 'select') { return new SelectHandler(field, equals); } else if (field.field.type === 'boolean') { return new BooleanHandler(field, equals); } } // Handling rules function RuleHandler(type) { var TYPE_AND = 'and'; var TYPE_OR = 'or'; var handlers = []; type = type || TYPE_OR; this.add = function (handler) { handlers.push(handler); }; // Check if rules are satisfied this.rulesSatisfied = function () { for (var i = 0; i < handlers.length; i++) { // check if rule was hit var ruleHit = handlers[i].satisfied(); if (ruleHit && type === TYPE_OR) { return true; } else if (type === TYPE_AND && !ruleHit) { return false; } } return false; }; } // Main widget class constructor function ShowWhen(parent, field, params, setValue) { var self = this; self.field = field; // Outsource readies self.passReadies = true; self.value = params; // Create the wrapper: var $wrapper = $('