var modifiers_changed = new Event("modifiers:changed", {"bubbles":true, "cancelable":false}); $(document).ready(function() { var timer; $(document).on('input','#modifiers div.additional input, #modifiers div.additional textarea, #modifiers div.additional [contenteditable]',function(e){ clearTimeout(timer); timer = setTimeout(function(){ do_mod_save(e.target) }, 5000); }); $(document).on('change','#modifiers div.additional select',function(e){ clearTimeout(timer); do_mod_save(e.target); }); $(document).on('blur','#modifiers div.additional input, #modifiers div.additional textarea, #modifiers div.additional [contenteditable]',function(e){ clearTimeout(timer); do_mod_save(e.target); }); $(document).on('keypress','#modifiers div.additional input',function(e){ if (e.keyCode == 13) { clearTimeout(timer); do_mod_save(e.target); } }); $(document).on('keypress','#modifiers div.additional [contenteditable]',function(e){ if (e.keyCode == 13) { document.execCommand('insertText', false, '\n'); return false; } }); $(document).on('relaxngui_remove', '#modifiers div.additional', function(e){ clearTimeout(timer); do_mod_save(e.target); }); $(document).on('relaxngui_move', '#modifiers div.additional', function(e){ clearTimeout(timer); do_mod_save(e.target); }); }); function do_mod_save(target) { let div = $(target).parents('div[data-resource]'); let top = div.attr('data-resource'); let doc = save['modifiers_additional'][top].save(); let rep = $('body').attr('current-resources'); let now = encodeURIComponent($('div.select select',div).val()); var tset = $X('<testset xmlns="http://cpee.org/ns/properties/2.0"/>'); tset.append(doc.documentElement); set_testset(tset,false); document.dispatchEvent(modifiers_changed); } async function modifiers_display() { let promises = []; let rep = $('body').attr('current-resources'); $('#modifiers > div').remove(); promises.push( $.ajax({ url: rep + 'modifiers/' }).then(async function(res) { let ipromises = []; $('resource',res).each(function(_,r) { ipromises.push( $.ajax({ url: rep + 'modifiers/' + $(r).text() }).then(async function(ses){ let clone = document.importNode(document.querySelector('#modifiers template').content,true); let t = $(r).text(); $('> div',clone).attr('data-resource',t); $('div.title *',clone).text(decodeURIComponent(t)); let cpromises = []; $('resource',ses).each(function(_,s) { let opt = $('<option/>'); opt.text(decodeURIComponent($(s).text())); $('div.select select',clone).append(opt); cpromises.push( $.ajax({ url: rep + 'modifiers/' + $(r).text() + '/' + $(s).text() + '/condition.json' }).then(function(tes){ save['modifiers'][$(r).text() + '/' + $(s).text()] = tes; }) ); }); $(clone).insertBefore($('#modifiers template')); await Promise.all(cpromises); }) ); }); await Promise.all(ipromises); }) ); await Promise.all(promises); } function modifiers_display_ui(url,top,it,notchanged) { if (notchanged) { if (save['modifiers_additional'][top]) { let attr = save['attributes'].save(); save['modifiers_additional'][top].content(attr); } } else { $('#modifiers div[data-resource]').each(function(_,r){ if ($(r).attr('data-resource') == top) { $('div.additional',r).empty(); } }); $.ajax({ url: url + top + '/' + it + '/ui.rng', success: function(rng) { $('#modifiers div[data-resource]').each(function(_,r){ if ($(r).attr('data-resource') == top) { save['modifiers_additional'][top] = new RelaxNGui(rng, $('div.additional',r)); let attr = save['attributes'].save(); save['modifiers_additional'][top].content(attr); } }); } }); } } function modifiers_select() { let atts = {} let attr = save['attributes'].save(); let rep = $('body').attr('current-resources'); $('> attributes > *',attr).each(function(_,s){ atts[s.nodeName] = $(s).text(); }); $('#modifiers div[data-resource]').each(function(_,r){ $('select option',r).each(function(_,s){ let where = $(r).attr('data-resource') + '/' + encodeURIComponent($(s).text()); let cond = save['modifiers'][where]; let success = true; for (x in cond) { if (cond[x] != atts[x]) { success = false; } } if (success) { let top = $(r).attr('data-resource'); let it = encodeURIComponent($(s).text()); $('select',r).val($(s).text()); modifiers_display_ui(rep + 'modifiers/',top,it,save['modifiers_active'][top] == it); save['modifiers_active'][top] = it; } }); }); } function modifiers_update_patch(url,top,now) { $.ajax({ url: url + top + '/' + now + '/patch.xml', success: function(res) { set_testset(res,false); document.dispatchEvent(modifiers_changed); } }); } function modifiers_update_unpatch(url,top,last,now) { $.ajax({ url: url + top + '/' + last + '/unpatch.xml', success: function(res) { set_testset(res,false).then(function() { modifiers_update_patch(url,top,now); }); }, error: function() { modifiers_update_patch(url,top,now); } }); } function modifiers_update(e) { let rep = $('body').attr('current-resources'); let top = $(e.target).parents('div[data-resource]').attr('data-resource'); let last = save['modifiers_active'][top]; let now = $(e.target).val(); if (last) { modifiers_update_unpatch(rep + 'modifiers/',top,last,now); } else { modifiers_update_patch(rep + 'modifiers/',top,now); } }