// Two-way data binding library. // https://github.com/ahabra/data-bind // Copyright 2020 (C) Abdul Habra !function(){const e=e=>"checkbox"===e.type,t=e=>"radio"===e.type,o=e=>"select"===e.nodeName.toLowerCase(),r=e=>"input-field"===e.nodeName.toLowerCase(),n=e=>"value"in e,i=e=>new Set(Array.isArray(e)?e:[e]);function u(e,t){const o=e.querySelectorAll(t);return 0===o.length&&console.warn(`No elements found matching selector ${t}`),[...o]}window.bind=function({obj:l={},prop:a,sel:c,attr:f,root:s=document,getter:d,setter:p,onChange:h}){!function(e){if("string"!=typeof e||0===e.length)throw"'prop' argument must be a String defining the name a property."}(a),function(e,t){const o=e[t];void 0!==o&&(console.info(`Property '${t}' already exists in object. Will override previous definition but retain old value of ${o}.`),e[t]=o)}(l,a);const v={};return d||(d=()=>function({prop:i,root:l,sel:a,attr:c,objNotBound:f}){return a?function(i,l,a){const c=u(i,l);if(0===c.length)return null;let f=c[0];if(a)return f.getAttribute(a);if(!n(f))return f.innerHTML;if(e(f))return c.filter(t=>e(t)&&t.checked).map(e=>"on"===e.value?e.name:e.value);if(o(f)){return[...f.querySelectorAll("option")].filter(e=>e.selected).map(e=>e.value)}if(t(f)&&(f=c.filter(t).find(e=>e.checked),!f))return;if(r(f))return f.getAttribute("value");return f.value}(l,a,c):f[i]}({prop:a,sel:c,attr:f,root:s,objNotBound:v})),p||(p=l=>function({prop:l,value:a,root:c,sel:f,attr:s,objNotBound:d}){if(f)return void function(l,a,c,f){const s=u(l,a);if(0===s.length)return;const d=s[0];if(e(d)){const t=i(c);return void s.filter(e).forEach(e=>e.checked=t.has(e.value)||t.has(e.name))}if(o(d)){const e=i(c);return void d.querySelectorAll("option").forEach(t=>t.selected=e.has(t.value))}if(t(d))return void s.filter(t).forEach(e=>e.checked=e.value===c);s.forEach(e=>function(e,t,o){o?e.setAttribute(o,t):n(e)?e.value=t:r(e)?e.setAttribute("value",t):e.innerHTML=t}(e,c,f))}(c,f,a,s);d[l]=a}({prop:a,value:l,root:s,sel:c,attr:f,objNotBound:v})),function({obj:e,prop:t,getter:o,setter:r,onChange:n}){const i={get:()=>o(),set:e=>{if(n){const r=o(t);r!==e&&n(r,e)}r(e)},configurable:!0,enumerable:!0};return Object.defineProperty(e,t,i),e}({obj:l,prop:a,getter:d,setter:p,onChange:h})}}();