From 59e29f3ca84542948cfeb12152fa9a45be17604d Mon Sep 17 00:00:00 2001 From: Kevin Chappell Date: Mon, 10 Apr 2017 16:41:53 +0100 Subject: [PATCH] Fix textarea value not saving when preview changed (#408) --- assets/js/form-builder.min.js | 2 +- assets/js/form-render.min.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/form-builder.min.js b/assets/js/form-builder.min.js index ea4696d8f..704c51860 100644 --- a/assets/js/form-builder.min.js +++ b/assets/js/form-builder.min.js @@ -4,4 +4,4 @@ Version: 1.24.6 Author: Kevin Chappell */ "use strict";function formBuilderHelpersFn(e,t){var a={doCancel:!1},s=fbUtils;return t.events=formBuilderEventsFn(),a.makeClassName=function(e){return e=e.replace(/[^\w\s\-]/gi,""),s.hyphenCase(e)},a.mobileClass=function(){var e="";return function(t){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=" fb-mobile")}(navigator.userAgent||navigator.vendor||window.opera),e},a.startMoving=function(e,t){t.item.show().addClass("moving"),a.startIndex=$("li",this).index(t.item)},a.stopMoving=function(e,t){t.item.removeClass("moving"),a.doCancel&&($(t.sender).sortable("cancel"),$(this).sortable("cancel")),a.save(),a.doCancel=!1},a.beforeStop=function(t,s){var n=document.getElementById(e.formID),r=n.children.length-1,l=[];a.stopIndex=s.placeholder.index()-1,!e.sortableControls&&s.item.parent().hasClass("frmb-control")&&l.push(!0),e.prepend&&l.push(0===a.stopIndex),e.append&&l.push(a.stopIndex+1===r),a.doCancel=l.some(function(e){return e===!0})},a.safename=function(e){return e.replace(/\s/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase()},a.forceNumber=function(e){return e.replace(/[^0-9]/g,"")},a.initTooltip=function(e){var t=e.find(".tooltip");e.mouseenter(function(){t.outerWidth()>200&&t.addClass("max-width"),t.css("left",e.width()+14),t.stop(!0,!0).fadeIn("fast")}).mouseleave(function(){e.find(".tooltip").stop(!0,!0).fadeOut("fast")}),t.hide()},a.getTypes=function(e){var t={type:e.attr("type")},a=$(".fld-subtype",e).val();return a!==t.type&&(t.subtype=a),t},a.fieldOptionData=function(e){var t=[];return $(".sortable-options li",e).each(function(){var e=$(this),a=$(".option-selected",e).is(":checked"),s={label:$(".option-label",e).val(),value:$(".option-value",e).val()};a&&(s.selected=a),t.push(s)}),t},a.xmlSave=function(e){var t=a.prepData(e),n=["\n\t"];return s.forEach(t,function(e,t){var a=null;if(t.type.match(/(select|checkbox-group|radio-group)/)){for(var r=t.values,l=[],o=0;o\n"),n.join("")},a.prepData=function(e){var t=[];return 0!==e.childNodes.length&&s.forEach(e.childNodes,function(e,n){var r=$(n);if(!r.hasClass("disabled")){var l,o;!function(){var e=a.getTypes(r),i=$(".roles-field:checked",n).map(function(){return this.value}).get();$('[class*="fld-"]',n).each(function(){var t=s.camelCase(this.name);e[t]="checkbox"===this.type?this.checked:this.value}),i.length&&(e.role=i.join(",")),e.className=e.className||e["class"],l=/(?:^|\s)btn-(.*?)(?:\s|$)/g.exec(e.className),l&&(e.style=l[1]),e=s.trimObj(e),e=s.escapeAttrs(e),o=e.type.match(/(select|checkbox-group|radio-group)/),o&&(e.values=a.fieldOptionData(r)),t.push(e)}()}}),t},a.jsonSave=function(e){return window.JSON.stringify(a.prepData(e),null,"\t")},a.getData=function(a){var n=a||e.formData;if(!n)return!1;var r={xml:function(e){return s.parseXML(e)},json:function(e){return window.JSON.parse(e)}};return t.formData=r[e.dataType](n)||[],t.formData},a.save=function(){var s=document.getElementById(e.formID),n={xml:a.xmlSave,json:a.jsonSave};return t.formData=n[e.dataType](s),document.dispatchEvent(t.events.formSaved),t.formData},a.incrementId=function(e){var t=e.lastIndexOf("-"),a=parseInt(e.substring(t+1))+1,s=e.substring(0,t);return s+"-"+a},a.updatePreview=function(t){var n=t.attr("class");if(n.indexOf("ui-sortable-handle")===-1){var r,l=$(t).attr("type"),o=$(".prev-holder",t),i={type:l};$('[class*="fld-"]',t).each(function(){var e=s.camelCase(this.name);i[e]="checkbox"===this.type?this.checked:this.value});var c=$(".btn-style",t).val();c&&(i.style=c),l.match(/(select|checkbox-group|radio-group)/)&&(i.values=[],i.multiple=$('[name="multiple"]',t).is(":checked"),$(".sortable-options li",t).each(function(){var e={};e.selected=$(".option-selected",this).is(":checked"),e.value=$(".option-value",this).val(),e.label=$(".option-label",this).val(),i.values.push(e)})),i=s.trimObj(i),i.className=a.classNames(t,i),$(".fld-className",t).val(i.className),t.data("fieldData",i),r=s.fieldRender(i,e,!0),o.html(r),$("input[toggle]",o).kcToggle()}},a.debounce=function(e){var t,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:250,s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(){var n=this,r=arguments,l=function(){t=null,s||e.apply(n,r)},o=s&&!t;clearTimeout(t),t=setTimeout(l,a),o&&e.apply(n,r)}},a.disabledTT={className:"frmb-tt",add:function(t){var n=e.messages.fieldNonEditable;if(n){var r=s.markup("p",n,{className:a.disabledTT.className});t.append(r)}},remove:function(e){$(".frmb-tt",e).remove()}},a.classNames=function(e,t){var a=void 0,n=t.type,r=t.style,l=e[0].querySelector(".fld-className").value,o=l.split(" "),i={button:"btn",submit:"btn"},c=i[n];if(c){if(r){for(a=0;a2&&void 0!==arguments[2]&&arguments[2],l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=a.showOverlay(),i=s.markup("button",e.messages.yes,{className:"yes btn btn-success btn-sm"}),c=s.markup("button",e.messages.no,{className:"no btn btn-danger btn-sm"});c.onclick=function(){a.closeConfirm(o)},i.onclick=function(){n(),a.closeConfirm(o)};var d=s.markup("div",[c,i],{className:"button-wrap"});l="form-builder-dialog "+l;var p=s.markup("div",[t,d],{className:l});return r?p.classList.add("positioned"):(r={pageX:Math.max(document.documentElement.clientWidth,window.innerWidth||0)/2,pageY:Math.max(document.documentElement.clientHeight,window.innerHeight||0)/2},p.style.position="fixed"),p.style.left=r.pageX+"px",p.style.top=r.pageY+"px",document.body.appendChild(p),i.focus(),p},a.dialog=function(e){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";a.showOverlay(),r="form-builder-dialog "+r;var l=s.markup("div",e,{className:r});return n?l.classList.add("positioned"):(n={pageX:Math.max(document.documentElement.clientWidth,window.innerWidth||0)/2,pageY:Math.max(document.documentElement.clientHeight,window.innerHeight||0)/2},l.style.position="fixed"),l.style.left=n.pageX+"px",l.style.top=n.pageY+"px",document.body.appendChild(l),document.dispatchEvent(t.events.modalOpened),r.indexOf("data-dialog")!==-1&&document.dispatchEvent(t.events.viewData),l},a.removeAllfields=function(){var t=document.getElementById(e.formID),s=t.querySelectorAll("li.form-field"),n=$(s),r=[];if(!s.length)return!1;e.prepend&&r.push(!0),e.append&&r.push(!0),r.some(function(e){return e===!0})||(t.parentElement.classList.add("empty"),t.parentElement.dataset.content=e.messages.getStarted),t.classList.add("removing");var l=0;n.each(function(){l+=$(this).outerHeight()+3}),s[0].style.marginTop=-l+"px",setTimeout(function(){n.remove(),document.getElementById(e.formID).classList.remove("removing"),a.save()},400)},a.setFieldOrder=function(t){if(!e.sortableControls)return!1;var a={};t.children().each(function(e,t){a[e]=$(t).data("attrs").type}),window.sessionStorage&&window.sessionStorage.setItem("fieldOrder",window.JSON.stringify(a))},a.orderFields=function(t){var a=!1;if(window.sessionStorage&&(e.sortableControls?a=window.sessionStorage.getItem("fieldOrder"):window.sessionStorage.removeItem("fieldOrder")),a)a=window.JSON.parse(a),a=Object.keys(a).map(function(e){return a[e]});else{var n=e.controlOrder.concat(t.map(function(e){return e.attrs.type}));a=s.unique(n)}var r=[];return a.forEach(function(e){var a=t.filter(function(t){return t.attrs.type===e})[0];r.push(a)}),r.filter(Boolean)},a.closeAllEdit=function(e){var t=$("> li.editing",e),a=$(".toggle-form",e),s=$(".frm-holder",t);a.removeClass("open"),t.removeClass("editing"),s.hide(),$(".prev-holder",t).show()},a.toggleEdit=function(e){var t=document.getElementById(e),a=$(".toggle-form",t),s=$(".frm-holder",t);t.classList.toggle("editing"),a.toggleClass("open"),$(".prev-holder",t).slideToggle(250),s.slideToggle(250)},a.stickyControls=function(e,t){var a=$(t).parent(),s=e.parent(),n=a.width(),r=t.getBoundingClientRect();$(window).scroll(function(){var e=$(this).scrollTop();if(e>s.offset().top){var l={position:"fixed",width:n,top:0,bottom:"auto",right:"auto",left:r.left},o=a.offset(),i=s.offset(),c=o.top+a.height(),d=i.top+s.height();c>d&&o.top!==i.top&&a.css({position:"absolute",top:"auto",bottom:0,right:0,left:"auto"}),(ce)&&a.css(l)}else t.parentElement.removeAttribute("style")})},a.showData=function(){var n=s.escapeHtml(t.formData),r=s.markup("code",n,{className:"formData-"+e.dataType}),l=s.markup("pre",r);a.dialog(l,null,"data-dialog")},a.removeField=function(s){var n=!1,r=document.getElementById(e.formID),l=r.getElementsByClassName("form-field");if(!l.length)return console.warn("No fields to remove"),!1;if(!s){var o=[].slice.call(l).map(function(e){return e.id});console.warn("fieldID required to use `removeField` action."),console.warn("Available IDs: "+o.join(", "))}var i=document.getElementById(s),c=$(i);return i?(c.slideUp(250,function(){if(c.removeClass("deleting"),c.remove(),n=!0,a.save(),!r.childNodes.length){var t=r.parentElement;t.classList.add("empty"),t.dataset.content=e.messages.getStarted}}),document.dispatchEvent(t.events.fieldRemoved),n):(console.warn("Field not found"),!1)},a}function formBuilderEventsFn(){var e={};return e.loaded=new Event("loaded"),e.viewData=new Event("viewData"),e.userDeclined=new Event("userDeclined"),e.modalClosed=new Event("modalClosed"),e.modalOpened=new Event("modalOpened"),e.formSaved=new Event("formSaved"),e.fieldAdded=new Event("fieldAdded"),e.fieldRemoved=new Event("fieldRemoved"),e}"remove"in Element.prototype||(Element.prototype.remove=function(){this.parentNode&&this.parentNode.removeChild(this)}),"function"!=typeof Event&&!function(){window.Event=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!0),t}}(),"function"!=typeof Object.assign&&(Object.assign=function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");e=Object(e);for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=void 0,n=document.createElement(e),r=function(e){return Array.isArray(e)?"array":"undefined"==typeof e?"undefined":_typeof(e)},l={string:function(e){n.innerHTML=e},object:function(e){return n.appendChild(e)},array:function(e){for(var t=0;t":">"};return"string"==typeof e?e.replace(/["&<>]/g,t):e},fbUtils.escapeAttrs=function(e){for(var t in e)e.hasOwnProperty(t)&&(e[t]=fbUtils.escapeAttr(e[t]));return e},fbUtils.forEach=function(e,t,a){for(var s=0;s2&&void 0!==arguments[2]&&arguments[2],s="",n="",r="",l=e.label||"",o=e.description||"",i="",c=e.values;e.name=a?e.name+"-preview":e.name,e.id=e.name,e.name=e.multiple?e.name+"[]":e.name,e.type=e.subtype||e.type,e.required&&(e.required=null,e["aria-required"]="true",i='*'),"hidden"!==e.type&&(o&&(o='?'),n='");var d=e.label;delete e.label,delete e.description;var p=fbUtils.attrString(e);switch(e.type){case"textarea":case"rich-text":delete e.type;var u=e.value||"";s=n+"";break;case"select":var m;if(e.type=e.type.replace("-group",""),c){e.placeholder&&(r+="");for(var f=0;f"+c[f].label+""}s=n+"";break;case"checkbox-group":case"radio-group":var v=void 0;if(e.type=e.type.replace("-group",""),"checkbox"===e.type&&(e.name=e.name+"[]"),c){for(var h=void 0,g=0;g
";if(e.other){var b={id:e.id+"-other",className:e.className+" other-option",onclick:"fbUtils.otherOptionCB('"+e.id+"-other')"};h=fbUtils.attrString(Object.assign({},e,b)),r+=" '}}s=n+'
'+r+"
";break;case"text":case"password":case"email":case"number":case"file":case"hidden":case"date":case"tel":case"autocomplete":s=n+" ";break;case"color":s=n+" "+t.messages.selectColor;break;case"button":case"submit":s="";break;case"checkbox":s=" "+n,e.toggle&&setTimeout(function(){$(document.getElementById(e.id)).kcToggle()},100);break;default:s="<"+e.type+" "+p+">"+d+""}if("hidden"!==e.type){var y=e.id?"fb-"+e.type+" form-group field-"+e.id:"";s=fbUtils.markup("div",s,{className:y})}else s=fbUtils.markup("input",null,e);return s},fbUtils.otherOptionCB=function(e){var t=document.getElementById(e),a=document.getElementById(e+"-value");t.checked?(t.style.display="none",a.style.display="inline-block"):(t.style.display="inline-block",a.style.display="none")},fbUtils.capitalize=function(e){return e.replace(/\b\w/g,function(e){return e.toUpperCase()})},function(e){var t=function(t,a){var s={theme:"fresh",messages:{off:"Off",on:"On"}},n=e.extend(s,a),r=e('
').insertAfter(t).append(t);r.toggleClass("on",t.is(":checked"));var l='
'+n.messages.on+"
",o='
'+n.messages.off+"
",i='
',c='
'+l+i+o+"
";r.append(c),r.click(function(){t.attr("checked",!t.attr("checked")),e(this).toggleClass("on")})};e.fn.kcToggle=function(a){var s=this;return s.each(function(){var s=e(this);if(!s.data("kcToggle")){var n=new t(s,a);s.data("kcToggle",n)}})}}(jQuery),function(e){var t=function(t,a){function s(e,t){var a=[];for(var s in e)if(e.hasOwnProperty(s)){var l=c.messages[s],o=e[s].value;e[s].value=t[s]||e[s].value||"",e[s].label&&(c.messages[s]=e[s].label),e[s].options?a.push(r(s,e[s])):a.push(n(s,e[s])),c.messages[s]=l,e[s].value=o}return a.join("")}function n(e,t){var a={id:e+"-"+m,title:t.description||t.label||e.toUpperCase(),name:e,type:t.type||"text",className:["fld-"+e]},s='";i.inArray(a.type,["checkbox","checkbox-group","radio-group"])||a.className.push("form-control"),a=Object.assign({},t,a);var n="",r='
'+n+"
";return'
'+s+r+"
"}function r(e,t){var a=Object.keys(t.options).map(function(e){var a={value:e};return e===t.value&&(a.selected=null),""}),s={id:e+"-"+m,title:t.description||t.label||e.toUpperCase(),name:e,className:"fld-"+e+" form-control"},n='";Object.keys(t).filter(function(e){return!i.inArray(e,["value","options","label"])}).forEach(function(e){s[e]=t[e]});var r="",l='
'+r+"
";return'
'+n+l+"
"}var l=this,o={controlPosition:"right",controlOrder:["autocomplete","button","checkbox","checkbox-group","date","file","header","hidden","paragraph","number","radio-group","select","text","textarea"],dataType:"xml",disableFields:[],editOnAdd:!1,append:!1,prepend:!1,defaultFields:[],inputSets:[],fieldRemoveWarn:!1,roles:{1:"Administrator"},messages:{addOption:"Add Option +",allFieldsRemoved:"All fields were removed.",allowSelect:"Allow Select",allowMultipleFiles:"Allow users to upload multiple files",autocomplete:"Autocomplete",button:"Button",cannotBeEmpty:"This field cannot be empty",checkboxGroup:"Checkbox Group",checkbox:"Checkbox",checkboxes:"Checkboxes",className:"Class",clearAllMessage:"Are you sure you want to clear all fields?",clearAll:"Clear",close:"Close",content:"Content",copy:"Copy To Clipboard",copyButton:"+",copyButtonTooltip:"Copy",dateField:"Date Field",description:"Help Text",descriptionField:"Description",devMode:"Developer Mode",editNames:"Edit Names",editorTitle:"Form Elements",editXML:"Edit XML",enableOther:"Enable "Other"",enableOtherMsg:"Let users to enter an unlisted option",fieldDeleteWarning:!1,fieldVars:"Field Variables",fieldNonEditable:"This field cannot be edited.",fieldRemoveWarning:"Are you sure you want to remove this field?",fileUpload:"File Upload",formUpdated:"Form Updated",getStarted:"Drag a field from the right to this area",header:"Header",hide:"Edit",hidden:"Hidden Input",label:"Label",labelEmpty:"Field Label cannot be empty",limitRole:"Limit access to one or more of the following roles:",mandatory:"Mandatory",maxlength:"Max Length",minOptionMessage:"This field requires a minimum of 2 options",multipleFiles:"Multiple Files",name:"Name",no:"No",number:"Number",off:"Off",on:"On",option:"Option",optional:"optional",optionLabelPlaceholder:"Label",optionValuePlaceholder:"Value",optionEmpty:"Option value required",other:"Other",paragraph:"Paragraph",placeholder:"Placeholder",placeholders:{value:"Value",label:"Label",text:"",textarea:"",email:"Enter you email",placeholder:"",className:"space separated classes",password:"Enter your password"},preview:"Preview",radioGroup:"Radio Group",radio:"Radio",removeMessage:"Remove Element",removeOption:"Remove Option",remove:"×",required:"Required",richText:"Rich Text Editor",roles:"Access",save:"Save",selectOptions:"Options",select:"Select",selectColor:"Select Color",selectionsMessage:"Allow Multiple Selections",size:"Size",sizes:{xs:"Extra Small",sm:"Small",m:"Default",lg:"Large"},style:"Style",styles:{btn:{"default":"Default",danger:"Danger",info:"Info",primary:"Primary",success:"Success",warning:"Warning"}},subtype:"Type",text:"Text Field",textArea:"Text Area",toggle:"Toggle",warning:"Warning!",value:"Value",viewJSON:"{ }",viewXML:"</>",yes:"Yes"},notify:{error:function(e){return console.error(e)},success:function(e){return console.log(e)},warning:function(e){return console.warn(e)}},sortableControls:!1,stickyControls:!1,showActionButtons:!0,typeUserAttrs:{},typeUserEvents:{},prefix:"form-builder-"},i=fbUtils;o.messages.subtypes=function(){var e=function(e){return{label:e,value:e}};return{text:["text","password","email","color","tel"].map(e),header:["h1","h2","h3"].map(e),button:["button","submit","reset"].map(e),paragraph:["p","address","blockquote","canvas","output"].map(e)}}();var c=Object.assign({},o,t),d="frmb-"+e("ul[id^=frmb-]").length++;t.messages&&(c.messages=Object.assign({},o.messages,t.messages)),c.formID=d,l.element=a;var p=e("
    ").attr("id",d).addClass("frmb"),u=formBuilderHelpersFn(c,l);l.layout=u.editorLayout(c.controlPosition);var m=d+"-fld-1",f=d+"-control-box",v=[{label:c.messages.autocomplete,attrs:{type:"autocomplete",className:"autocomplete",name:"autocomplete"}},{label:c.messages.button,attrs:{type:"button",className:"button-input",name:"button"}},{label:c.messages.checkbox,attrs:{type:"checkbox",className:"checkbox",name:"checkbox"}},{label:c.messages.checkboxGroup,attrs:{type:"checkbox-group",className:"checkbox-group",name:"checkbox-group"}},{label:c.messages.dateField,attrs:{type:"date",className:"calendar",name:"date-input"}},{label:c.messages.fileUpload,attrs:{type:"file",className:"file-input",name:"file-input"}},{label:c.messages.header,attrs:{type:"header",className:"header"}},{label:c.messages.hidden,attrs:{type:"hidden",className:"hidden-input",name:"hidden-input"}},{label:c.messages.number,attrs:{type:"number",className:"number",name:"number"}},{label:c.messages.paragraph,attrs:{type:"paragraph",className:"paragraph"}},{label:c.messages.radioGroup,attrs:{type:"radio-group",className:"radio-group",name:"radio-group"}},{label:c.messages.select,attrs:{type:"select",className:"select",name:"select"}},{label:c.messages.text,attrs:{type:"text",className:"text-input",name:"text-input"}},{label:c.messages.textArea,attrs:{type:"textarea",className:"text-area",name:"textarea"}}];v=u.orderFields(v),c.disableFields&&(v=v.filter(function(e){return!i.inArray(e.attrs.type,c.disableFields)}));var h=i.markup("ul",null,{id:f,className:"frmb-control"});c.sortableControls&&h.classList.add("sort-enabled");var g=e(h);i.forEach(v,function(t){var a=e("
  • ",{"class":"icon-"+v[t].attrs.className,type:v[t].type,name:v[t].className,label:v[t].label});a.data("newFieldData",v[t]);var s=i.markup("span",v[t].label);a.html(s).appendTo(g)}),c.inputSets.length&&(e("
  • ",{"class":"fb-separator"}).html("
    ").appendTo(g),c.inputSets.forEach(function(t){t.name=t.name||u.makeClassName(t.label);var a=e("
  • ",{"class":"input-set-control",type:t.name});a.html(t.label).appendTo(g)})),p.sortable({cursor:"move",opacity:.9,revert:150,beforeStop:u.beforeStop,start:u.startMoving,stop:u.stopMoving,cancel:"input, select, .disabled, .form-group, .btn",placeholder:"frmb-placeholder"}),g.sortable({helper:"clone",opacity:.9,connectWith:p,cancel:".fb-separator",cursor:"move",scroll:!1,placeholder:"ui-state-highlight",start:u.startMoving,stop:u.stopMoving,revert:150,beforeStop:u.beforeStop,distance:3,update:function(e,t){return!u.doCancel&&void(t.item.parent()[0]===p[0]?(b(t.item),u.doCancel=!0):(u.setFieldOrder(g),u.doCancel=!c.sortableControls))}});var b=function(e){if(e[0].classList.contains("input-set-control")){var t=c.inputSets.filter(function(t){return t.name===e[0].type})[0];if(t.showHeader){var a={type:"header",subtype:"h2",id:t.name,label:t.label};S(a,!0)}t.fields.forEach(function(e){S(e,!0)})}else S(e,!0)},y=e("
    ",{id:d+"-form-wrap","class":"form-wrap form-builder"+u.mobileClass()}),w=e("
    ",{id:d+"-stage-wrap","class":"stage-wrap "+l.layout.stage}),k=e("
    ",{id:d+"-cb-wrap","class":"cb-wrap "+l.layout.controls}).append(g[0]);if(c.showActionButtons){var x="xml"===c.dataType?c.messages.viewXML:c.messages.viewJSON,N=i.markup("button",x,{id:d+"-view-data",type:"button",className:"view-data btn btn-default"}),E=i.markup("button",c.messages.clearAll,{id:d+"-clear-all",type:"button",className:"clear-all btn btn-default"}),A=i.markup("button",c.messages.save,{className:"btn btn-primary "+c.prefix+"save",id:d+"-save",type:"button"}),C=i.markup("div",[E,N,A],{className:"form-actions btn-group"});k.append(C)}w.append(p,k),w.before(y),y.append(w,k),e(a).append(y);var O=u.debounce(function(t){if(t&&"keyup"===t.type&&"className"===this.name)return!1;var a=e(this).parents(".form-field:eq(0)");u.updatePreview(a),u.save()});p.on("change blur keyup",".form-elements input, .form-elements select, .form-elements textarea",O),e("li",g).click(function(){u.stopIndex=void 0,b(e(this)),u.save()});var U=function(){var t=[];if(c.prepend&&!e(".disabled.prepend",p).length){var a=i.markup("li",c.prepend,{className:"disabled prepend"});t.push(!0),p.prepend(a)}if(c.append&&!e(".disabled.append",p).length){var s=i.markup("li",c.append,{className:"disabled append"});t.push(!0),p.append(s)}t.some(function(e){return e===!0})&&w.removeClass("empty")},S=function(t){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s={};if(t instanceof jQuery){var n=t.data("newFieldData");if(n)s=n.attrs,s.label=n.label;else{var r=t[0].attributes;a||(s.values=t.children().map(function(t,a){return{label:e(a).text(),value:e(a).attr("value"),selected:Boolean(e(a).attr("selected"))}}));for(var o=r.length-1;o>=0;o--)s[r[o].name]=r[o].value}}else s=Object.assign({},t);s.name=a?D(s):s.name||D(s),a&&i.inArray(s.type,["text","number","file","date","select","textarea"])?s.className="form-control":s.className=s["class"]||s.className;var c=/(?:^|\s)btn-(.*?)(?:\s|$)/g.exec(s.className);c&&(s.style=c[1]),i.escapeAttrs(s),R(s),a&&document.dispatchEvent(l.events.fieldAdded),w.removeClass("empty")},T=function(){var t=l.formData;if(t&&t.length){for(var a=0;a'+c.messages.selectOptions+""],a=e.multiple||"checkbox-group"===e.type;return e.values&&e.values.length?e.values.forEach(function(e){return Object.assign({},{selected:!1},e)}):(e.values=[1,2,3].map(function(e){var t=c.messages.option+" "+e,a={selected:!1,label:t,value:i.hyphenCase(t)};return a}),e.values[0].selected=!0),W.push('
    '),W.push('
      '),i.forEach(e.values,function(t){W.push(P(e.name,e.values[t],a))}),W.push("
    "),W.push(i.markup("div",t,{className:"option-actions"}).outerHTML),W.push("
    "),i.markup("div",W.join(""),{className:"form-group field-options"}).outerHTML},M=function Y(e){var t,Y=[],a=["select","checkbox-group","radio-group"],n=function(){return a.indexOf(e.type)!==-1}(),r=!i.inArray(e.type,["header","paragraph","file"].concat(a)),l=void 0!==e.role?e.role.split(","):[];if(Y.push(q(e)),"checkbox"===e.type&&Y.push(B("toggle",e,{first:c.messages.toggle})),Y.push($("label",e)),e.size=e.size||"m",e.style=e.style||"default",i.inArray(e.type,["header","paragraph","button"])||Y.push($("description",e)),c.messages.subtypes[e.type]){var o=c.messages.subtypes[e.type];Y.push(L("subtype",e,o))}if("button"===e.type&&Y.push(F(e.style,e.type)),"number"===e.type&&(Y.push(I("min",e)),Y.push(I("max",e)),Y.push(I("step",e))),Y.push($("placeholder",e)),"textarea"===e.type&&Y.push(I("rows",e)),Y.push($("className",e)),Y.push($("name",e)),r&&Y.push($("value",e)),"file"===e.type){var d={first:c.messages.multipleFiles,second:c.messages.allowMultipleFiles};Y.push(B("multiple",e,d))}var p=void 0!==e.role?'style="display:block"':"",u=['
    "];for(t in c.roles)if(c.roles.hasOwnProperty(t)){var f=i.inArray(t,l)?"checked":"",v="fld-"+m+"-roles-"+t;u.push('
    "); -}u.push("
    ");var h={first:c.messages.roles,second:c.messages.limitRole,content:u.join("")};return Y.push(B("access",e,h)),"checkbox-group"!==e.type&&"radio-group"!==e.type||Y.push(B("other",e,{first:c.messages.enableOther,second:c.messages.enableOtherMsg})),"select"===e.type&&Y.push(B("multiple",e,{first:" ",second:c.messages.selectionsMessage})),n&&Y.push(j(e)),i.inArray(e.type,["text","textarea"])&&Y.push(I("maxlength",e)),c.typeUserAttrs[e.type]&&Y.push(s(c.typeUserAttrs[e.type],e)),Y.join("")},B=function(e,t,a){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var s=function(t){return'"},n=void 0!==t[e]?"checked":"",r=' ',l=[],o=[r];return a.first&&l.unshift(s(a.first)),a.second&&o.push(s(a.second)),a.content&&o.push(a.content),o.unshift('
    '),o.push("
    "),'
    '+l.concat(o).join("")+"
    "}},F=function(e,t){var a={button:"btn"},s=c.messages.styles[a[t]],n="";if(s){var r="";n+='',n+='
    ',Object.keys(c.messages.styles[a[t]]).forEach(function(s){var r=e===s?"active":"";n+='"}),n+="
    ",n='
    '+r+" "+n+"
    "}return n},I=function G(e,t){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var a=t[e],s=c.messages[e]||e,n=c.messages.placeholders[e],r={type:"number",value:a,name:e,min:"0",placeholder:n,className:"fld-"+e+" form-control",id:e+"-"+m},G="",l='
    '+G+"
    ";return'
    "+l+"
    "}},L=function(e,t,a){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var s=a.map(function(a,s){var n=Object.assign({label:c.messages.option+" "+s,value:void 0},a);return a.value===t[e]&&(n.selected=!0),""}),n={id:e+"-"+m,name:e,className:"fld-"+e+" form-control"},r='",l="",o='
    '+l+"
    ";return'
    '+r+o+"
    "}},$=function(e,t){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var a=["text","textarea","select"],s=["header"],n=["paragraph"],r=t[e]||"",l=c.messages[e];"label"===e&&i.inArray(t.type,n)&&(l=c.messages.content),s=s.concat(c.messages.subtypes.header,n);var o=c.messages.placeholders,d=o[e]||"",p="",u=[];if("placeholder"!==e||i.inArray(t.type,a)||u.push(!0),"name"===e&&i.inArray(t.type,s)&&u.push(!0),!u.some(function(e){return e===!0})){var f={name:e,placeholder:d,className:"fld-"+e+" form-control",id:e+"-"+m},v='";"label"===e&&i.inArray(t.type,n)||"value"===e&&"textarea"===t.type?p+="":(f.value=r,f.type="text",p+="");var h='
    '+p+"
    ";p='
    '+v+" "+h+"
    "}return p}},q=function(e){var t=["header","paragraph","button"],a=[],s="";return i.inArray(e.type,t)&&a.push(!0),a.some(function(e){return e===!0})||(s=B("required",e,{first:c.messages.required})),s},R=function(t){var a=t.type||"text",s=t.label||c.messages[a]||c.messages.label,n=i.markup("a",c.messages.remove,{id:"del_"+m,className:"del-button btn delete-confirm",title:c.messages.removeMessage}),r=i.markup("a",null,{id:m+"-edit",className:"toggle-form btn icon-pencil",title:c.messages.hide}),l=i.markup("a",c.messages.copyButton,{id:m+"-copy",className:"copy-button btn icon-copy",title:c.messages.copyButtonTooltip}),o=i.markup("div",[r,l,n],{className:"field-actions"}).outerHTML;o+='",t.description&&(o+='?');var d=t.required?'style="display:inline"':"";o+=' *",o+=i.markup("div","",{className:"prev-holder"}).outerHTML,o+='
    ',o+='
    ',o+=M(t),o+=i.markup("a",c.messages.close,{className:"close-field"}).outerHTML,o+="
    ",o+="
    ";var f=i.markup("li",o,{"class":a+"-field form-field",type:a,id:m}),v=e(f);v.data("fieldData",{attrs:t}),"undefined"!=typeof u.stopIndex?e("> li",p).eq(u.stopIndex).before(v):p.append(v),e(".sortable-options",v).sortable({update:function(){u.updatePreview(v)}}),u.updatePreview(v),c.editOnAdd&&(u.closeAllEdit(p),u.toggleEdit(m)),c.typeUserEvents[a]&&c.typeUserEvents[a].onadd&&c.typeUserEvents[a].onadd(f),m=u.incrementId(m)},P=function(e,t,a){var s={selected:a?"checkbox":"radio"},n=["value","label","selected"],r=[];t=Object.assign({selected:!1,label:"",value:""},t);for(var l=n.length-1;l>=0;l--){var o=n[l];if(t.hasOwnProperty(o)){var d={type:s[o]||"text","class":"option-"+o,value:t[o],name:e+"-option"};c.messages.placeholders[o]&&(d.placeholder=c.messages.placeholders[o]),"selected"===o&&t.selected===!0&&(d.checked=t.selected),r.push(i.markup("input",null,d))}}var p={className:"remove btn",title:c.messages.removeMessage};r.push(i.markup("a",c.messages.remove,p));var u=i.markup("li",r);return u.outerHTML},H=function(t){var a=t.attr("id"),s=t.attr("type"),n=(new Date).getTime(),r=s+"-"+n,l=t.clone();return l.find("[id]").each(function(){this.id=this.id.replace(a,m)}),l.find("[for]").each(function(){this.setAttribute("for",this.getAttribute("for").replace(a,m))}),l.each(function(){e("e:not(.form-elements)").each(function(){var e=this.getAttribute("name");e=e.substring(0,e.lastIndexOf("-")+1),e+=n.toString(),this.setAttribute("name",e)})}),l.find(".form-elements").find(":input").each(function(){if("name"===this.getAttribute("name")){var e=this.getAttribute("value");e=e.substring(0,e.lastIndexOf("-")+1),e+=n.toString(),this.setAttribute("value",e)}}),l.attr("id",m),l.attr("name",r),l.addClass("cloned"),e(".sortable-options",l).sortable(),c.typeUserEvents[s]&&c.typeUserEvents[s].onclone&&c.typeUserEvents[s].onclone(l[0]),m=u.incrementId(m),l};if(p.on("click touchstart",".remove",function(t){var a=e(this).parents(".form-field:eq(0)");t.preventDefault();var s=e(this).parents(".sortable-options:eq(0)").children("li").length;s<=2?c.notify.error("Error: "+c.messages.minOptionMessage):e(this).parent("li").slideUp("250",function(){e(this).remove(),u.updatePreview(a),u.save()})}),p.on("touchstart","input",function(t){if(t.handled===!0)return!1;if("checkbox"===e(this).attr("type"))e(this).trigger("click");else{e(this).focus();var a=e(this).val();e(this).val(a)}}),p.on("click touchstart",".toggle-form, .close-field",function(t){if(t.stopPropagation(),t.preventDefault(),t.handled===!0)return!1;var a=e(this).parents(".form-field:eq(0)").attr("id");u.toggleEdit(a),t.handled=!0}),p.on("change",".prev-holder input, .prev-holder select",function(t){if(!t.target.classList.contains("other-option")){var a=e(t.target).closest("li.form-field")[0];i.inArray(a.type,["select","checkbox-group","radio-group"])?a.querySelector('[class="option-value"][value="'+t.target.value+'"]').parentElement.childNodes[0].checked=!0:document.getElementById("value-"+a.id).value=t.target.value,u.save()}}),p.on("keyup change",'[name="label"]',function(){e(".field-label",e(this).closest("li")).text(e(this).val())}),p.delegate("input.error","keyup",function(){e(this).removeClass("error")}),p.on("keyup",'input[name="description"]',function(){var t=e(this).parents(".form-field:eq(0)"),a=e(".tooltip-element",t),s=e(this).val();if(""!==s)if(a.length)a.attr("tooltip",s).css("display","inline-block");else{var n='?';e(".field-label",t).after(n)}else a.length&&a.css("display","none")}),p.on("change",".fld-multiple",function(t){var a=t.target.checked?"checkbox":"radio";e(t.target).parents(".form-elements:eq(0)").find(".sortable-options input.option-selected").each(function(){this.type=a})}),p.on("blur","input.fld-name",function(){this.value=u.safename(this.value),""===this.value?e(this).addClass("field-error").attr("placeholder",c.messages.cannotBeEmpty):e(this).removeClass("field-error")}),p.on("blur","input.fld-maxlength",function(){this.value=u.forceNumber(this.value)}),p.on("click touchstart",".icon-copy",function(t){t.preventDefault();var a=e(this).parent().parent("li"),s=H(a);s.insertAfter(a),u.updatePreview(s),u.save()}),p.on("click touchstart",".delete-confirm",function(t){t.preventDefault();var a=this.getBoundingClientRect(),s=document.body.getBoundingClientRect(),n={pageX:a.left+a.width/2,pageY:a.top-s.top-12},r=e(this).parents(".form-field:eq(0)").attr("id"),l=e(document.getElementById(r));if(document.addEventListener("modalClosed",function(){l.removeClass("deleting")},!1),c.fieldRemoveWarn){var o=i.markup("h3",c.messages.warning),d=i.markup("p",c.messages.fieldRemoveWarning);u.confirm([o,d],function(){return u.removeField(r)},n),l.addClass("deleting")}else u.removeField(r)}),p.on("click",".style-wrap button",function(){var t=e(this).val(),a=e(this).parent(),s=a.prev(".btn-style");s.val(t),e(this).siblings(".btn").removeClass("active"),e(this).addClass("active"),O.call(a)}),p.on("click","input.fld-required",function(){var t=e(this).parents("li.form-field").find(".required-asterisk");t.toggle()}),p.on("click","input.fld-access",function(){var t=e(this).parents("li.form-field").find("div.available-roles"),a=e(this);t.slideToggle(250,function(){a.is(":checked")||e('input[type="checkbox"]',t).removeAttr("checked")})}),p.on("click",".add-opt",function(t){t.preventDefault();var a=e(this).parents(".field-options:eq(0)"),s=e('[name="multiple"]',a),n=e(".option-selected:eq(0)",a),r=!1;r=s.length?s.prop("checked"):"checkbox"===n.attr("type");var l=n.attr("name");e(".sortable-options",a).append(P(l,!1,r))}),p.on("mouseover mouseout",".remove, .del-button",function(){e(this).parents("li:eq(0)").toggleClass("delete")}),c.showActionButtons){var z=e(document.getElementById(d+"-view-data"));z.click(function(e){e.preventDefault(),u.showData()});var X=e(document.getElementById(d+"-clear-all"));X.click(function(){var t=e("li.form-field"),a=this.getBoundingClientRect(),s=document.body.getBoundingClientRect(),n={pageX:a.left+a.width/2,pageY:a.top-s.top-12};t.length?u.confirm(c.messages.clearAllMessage,function(){u.removeAllfields(),c.notify.success(c.messages.allFieldsRemoved),u.save()},n):u.dialog("There are no fields to clear",{pageX:n.pageX,pageY:n.pageY})}),e(document.getElementById(d+"-save")).click(function(e){e.preventDefault(),u.save()})}return u.getData(),T(),p.css("min-height",g.height()),c.stickyControls&&u.stickyControls(p,h),document.dispatchEvent(l.events.loaded),l.actions={clearFields:u.removeAllfields,showData:u.showData,save:u.save,addField:function(e,t){u.stopIndex=p[0].children.length?t:void 0,S(e),document.dispatchEvent(l.events.fieldAdded)},removeField:u.removeField,setData:function(e){u.removeAllfields(),u.getData(e),T()}},l};e.fn.formBuilder=function(a){return a=a||{},this.each(function(){var s=new t(a,this);return e(this).data("formBuilder",s),s})}}(jQuery); \ No newline at end of file +}u.push("
    ");var h={first:c.messages.roles,second:c.messages.limitRole,content:u.join("")};return Y.push(B("access",e,h)),"checkbox-group"!==e.type&&"radio-group"!==e.type||Y.push(B("other",e,{first:c.messages.enableOther,second:c.messages.enableOtherMsg})),"select"===e.type&&Y.push(B("multiple",e,{first:" ",second:c.messages.selectionsMessage})),n&&Y.push(j(e)),i.inArray(e.type,["text","textarea"])&&Y.push(I("maxlength",e)),c.typeUserAttrs[e.type]&&Y.push(s(c.typeUserAttrs[e.type],e)),Y.join("")},B=function(e,t,a){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var s=function(t){return'"},n=void 0!==t[e]?"checked":"",r=' ',l=[],o=[r];return a.first&&l.unshift(s(a.first)),a.second&&o.push(s(a.second)),a.content&&o.push(a.content),o.unshift('
    '),o.push("
    "),'
    '+l.concat(o).join("")+"
    "}},F=function(e,t){var a={button:"btn"},s=c.messages.styles[a[t]],n="";if(s){var r="";n+='',n+='
    ',Object.keys(c.messages.styles[a[t]]).forEach(function(s){var r=e===s?"active":"";n+='"}),n+="
    ",n='
    '+r+" "+n+"
    "}return n},I=function G(e,t){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var a=t[e],s=c.messages[e]||e,n=c.messages.placeholders[e],r={type:"number",value:a,name:e,min:"0",placeholder:n,className:"fld-"+e+" form-control",id:e+"-"+m},G="",l='
    '+G+"
    ";return'
    "+l+"
    "}},L=function(e,t,a){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var s=a.map(function(a,s){var n=Object.assign({label:c.messages.option+" "+s,value:void 0},a);return a.value===t[e]&&(n.selected=!0),""}),n={id:e+"-"+m,name:e,className:"fld-"+e+" form-control"},r='",l="",o='
    '+l+"
    ";return'
    '+r+o+"
    "}},$=function(e,t){if(!c.typeUserAttrs[t.type]||!c.typeUserAttrs[t.type][e]){var a=["text","textarea","select"],s=["header"],n=["paragraph"],r=t[e]||"",l=c.messages[e];"label"===e&&i.inArray(t.type,n)&&(l=c.messages.content),s=s.concat(c.messages.subtypes.header,n);var o=c.messages.placeholders,d=o[e]||"",p="",u=[];if("placeholder"!==e||i.inArray(t.type,a)||u.push(!0),"name"===e&&i.inArray(t.type,s)&&u.push(!0),!u.some(function(e){return e===!0})){var f={name:e,placeholder:d,className:"fld-"+e+" form-control",id:e+"-"+m},v='";"label"===e&&i.inArray(t.type,n)||"value"===e&&"textarea"===t.type?p+="":(f.value=r,f.type="text",p+="");var h='
    '+p+"
    ";p='
    '+v+" "+h+"
    "}return p}},q=function(e){var t=["header","paragraph","button"],a=[],s="";return i.inArray(e.type,t)&&a.push(!0),a.some(function(e){return e===!0})||(s=B("required",e,{first:c.messages.required})),s},R=function(t){var a=t.type||"text",s=t.label||c.messages[a]||c.messages.label,n=i.markup("a",c.messages.remove,{id:"del_"+m,className:"del-button btn delete-confirm",title:c.messages.removeMessage}),r=i.markup("a",null,{id:m+"-edit",className:"toggle-form btn icon-pencil",title:c.messages.hide}),l=i.markup("a",c.messages.copyButton,{id:m+"-copy",className:"copy-button btn icon-copy",title:c.messages.copyButtonTooltip}),o=i.markup("div",[r,l,n],{className:"field-actions"}).outerHTML;o+='",t.description&&(o+='?');var d=t.required?'style="display:inline"':"";o+=' *",o+=i.markup("div","",{className:"prev-holder"}).outerHTML,o+='
    ',o+='
    ',o+=M(t),o+=i.markup("a",c.messages.close,{className:"close-field"}).outerHTML,o+="
    ",o+="
    ";var f=i.markup("li",o,{"class":a+"-field form-field",type:a,id:m}),v=e(f);v.data("fieldData",{attrs:t}),"undefined"!=typeof u.stopIndex?e("> li",p).eq(u.stopIndex).before(v):p.append(v),e(".sortable-options",v).sortable({update:function(){u.updatePreview(v)}}),u.updatePreview(v),c.editOnAdd&&(u.closeAllEdit(p),u.toggleEdit(m)),c.typeUserEvents[a]&&c.typeUserEvents[a].onadd&&c.typeUserEvents[a].onadd(f),m=u.incrementId(m)},P=function(e,t,a){var s={selected:a?"checkbox":"radio"},n=["value","label","selected"],r=[];t=Object.assign({selected:!1,label:"",value:""},t);for(var l=n.length-1;l>=0;l--){var o=n[l];if(t.hasOwnProperty(o)){var d={type:s[o]||"text","class":"option-"+o,value:t[o],name:e+"-option"};c.messages.placeholders[o]&&(d.placeholder=c.messages.placeholders[o]),"selected"===o&&t.selected===!0&&(d.checked=t.selected),r.push(i.markup("input",null,d))}}var p={className:"remove btn",title:c.messages.removeMessage};r.push(i.markup("a",c.messages.remove,p));var u=i.markup("li",r);return u.outerHTML},H=function(t){var a=t.attr("id"),s=t.attr("type"),n=(new Date).getTime(),r=s+"-"+n,l=t.clone();return l.find("[id]").each(function(){this.id=this.id.replace(a,m)}),l.find("[for]").each(function(){this.setAttribute("for",this.getAttribute("for").replace(a,m))}),l.each(function(){e("e:not(.form-elements)").each(function(){var e=this.getAttribute("name");e=e.substring(0,e.lastIndexOf("-")+1),e+=n.toString(),this.setAttribute("name",e)})}),l.find(".form-elements").find(":input").each(function(){if("name"===this.getAttribute("name")){var e=this.getAttribute("value");e=e.substring(0,e.lastIndexOf("-")+1),e+=n.toString(),this.setAttribute("value",e)}}),l.attr("id",m),l.attr("name",r),l.addClass("cloned"),e(".sortable-options",l).sortable(),c.typeUserEvents[s]&&c.typeUserEvents[s].onclone&&c.typeUserEvents[s].onclone(l[0]),m=u.incrementId(m),l};if(p.on("click touchstart",".remove",function(t){var a=e(this).parents(".form-field:eq(0)");t.preventDefault();var s=e(this).parents(".sortable-options:eq(0)").children("li").length;s<=2?c.notify.error("Error: "+c.messages.minOptionMessage):e(this).parent("li").slideUp("250",function(){e(this).remove(),u.updatePreview(a),u.save()})}),p.on("touchstart","input",function(t){if(t.handled===!0)return!1;if("checkbox"===e(this).attr("type"))e(this).trigger("click");else{e(this).focus();var a=e(this).val();e(this).val(a)}}),p.on("click touchstart",".toggle-form, .close-field",function(t){if(t.stopPropagation(),t.preventDefault(),t.handled===!0)return!1;var a=e(this).parents(".form-field:eq(0)").attr("id");u.toggleEdit(a),t.handled=!0}),p.on("change",".prev-holder input, .prev-holder select, textarea",function(t){if(!t.target.classList.contains("other-option")){var a=e(t.target).closest("li.form-field")[0];i.inArray(a.type,["select","checkbox-group","radio-group"])?a.querySelector('[class="option-value"][value="'+t.target.value+'"]').parentElement.childNodes[0].checked=!0:document.getElementById("value-"+a.id).value=t.target.value,u.save()}}),p.on("keyup change",'[name="label"]',function(){e(".field-label",e(this).closest("li")).text(e(this).val())}),p.delegate("input.error","keyup",function(){e(this).removeClass("error")}),p.on("keyup",'input[name="description"]',function(){var t=e(this).parents(".form-field:eq(0)"),a=e(".tooltip-element",t),s=e(this).val();if(""!==s)if(a.length)a.attr("tooltip",s).css("display","inline-block");else{var n='?';e(".field-label",t).after(n)}else a.length&&a.css("display","none")}),p.on("change",".fld-multiple",function(t){var a=t.target.checked?"checkbox":"radio";e(t.target).parents(".form-elements:eq(0)").find(".sortable-options input.option-selected").each(function(){this.type=a})}),p.on("blur","input.fld-name",function(){this.value=u.safename(this.value),""===this.value?e(this).addClass("field-error").attr("placeholder",c.messages.cannotBeEmpty):e(this).removeClass("field-error")}),p.on("blur","input.fld-maxlength",function(){this.value=u.forceNumber(this.value)}),p.on("click touchstart",".icon-copy",function(t){t.preventDefault();var a=e(this).parent().parent("li"),s=H(a);s.insertAfter(a),u.updatePreview(s),u.save()}),p.on("click touchstart",".delete-confirm",function(t){t.preventDefault();var a=this.getBoundingClientRect(),s=document.body.getBoundingClientRect(),n={pageX:a.left+a.width/2,pageY:a.top-s.top-12},r=e(this).parents(".form-field:eq(0)").attr("id"),l=e(document.getElementById(r));if(document.addEventListener("modalClosed",function(){l.removeClass("deleting")},!1),c.fieldRemoveWarn){var o=i.markup("h3",c.messages.warning),d=i.markup("p",c.messages.fieldRemoveWarning);u.confirm([o,d],function(){return u.removeField(r)},n),l.addClass("deleting")}else u.removeField(r)}),p.on("click",".style-wrap button",function(){var t=e(this).val(),a=e(this).parent(),s=a.prev(".btn-style");s.val(t),e(this).siblings(".btn").removeClass("active"),e(this).addClass("active"),O.call(a)}),p.on("click","input.fld-required",function(){var t=e(this).parents("li.form-field").find(".required-asterisk");t.toggle()}),p.on("click","input.fld-access",function(){var t=e(this).parents("li.form-field").find("div.available-roles"),a=e(this);t.slideToggle(250,function(){a.is(":checked")||e('input[type="checkbox"]',t).removeAttr("checked")})}),p.on("click",".add-opt",function(t){t.preventDefault();var a=e(this).parents(".field-options:eq(0)"),s=e('[name="multiple"]',a),n=e(".option-selected:eq(0)",a),r=!1;r=s.length?s.prop("checked"):"checkbox"===n.attr("type");var l=n.attr("name");e(".sortable-options",a).append(P(l,!1,r))}),p.on("mouseover mouseout",".remove, .del-button",function(){e(this).parents("li:eq(0)").toggleClass("delete")}),c.showActionButtons){var z=e(document.getElementById(d+"-view-data"));z.click(function(e){e.preventDefault(),u.showData()});var X=e(document.getElementById(d+"-clear-all"));X.click(function(){var t=e("li.form-field"),a=this.getBoundingClientRect(),s=document.body.getBoundingClientRect(),n={pageX:a.left+a.width/2,pageY:a.top-s.top-12};t.length?u.confirm(c.messages.clearAllMessage,function(){u.removeAllfields(),c.notify.success(c.messages.allFieldsRemoved),u.save()},n):u.dialog("There are no fields to clear",{pageX:n.pageX,pageY:n.pageY})}),e(document.getElementById(d+"-save")).click(function(e){e.preventDefault(),u.save()})}return u.getData(),T(),p.css("min-height",g.height()),c.stickyControls&&u.stickyControls(p,h),document.dispatchEvent(l.events.loaded),l.actions={clearFields:u.removeAllfields,showData:u.showData,save:u.save,addField:function(e,t){u.stopIndex=p[0].children.length?t:void 0,S(e),document.dispatchEvent(l.events.fieldAdded)},removeField:u.removeField,setData:function(e){u.removeAllfields(),u.getData(e),T()}},l};e.fn.formBuilder=function(a){return a=a||{},this.each(function(){var s=new t(a,this);return e(this).data("formBuilder",s),s})}}(jQuery); \ No newline at end of file diff --git a/assets/js/form-render.min.js.map b/assets/js/form-render.min.js.map index 3d6ac5f7c..efc9f2d01 100644 --- a/assets/js/form-render.min.js.map +++ b/assets/js/form-render.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["polyfills.js","form-render.js","kc-toggle.js","form-render.min.js","utils.js"],"names":["FormRenderFn","options","element","utils","fbUtils","formRender","this","defaults","destroyTemplate","container","dataType","formData","messages","formRendered","noFormData","other","selectColor","onRender","render","notify","error","message","console","success","log","warning","warn","opts","$","extend","setData","xml","parseXML","json","window","JSON","parse","Element","prototype","appendFormFields","fields","forEach","field","appendChild","emptyContainer","lastChild","removeChild","runCallbacks","santizeField","sanitizedField","Object","assign","className","values","map","option","trimObj","rendered","i","length","push","fieldRender","renderedFormWrap","markup","jQuery","elem","innerHTML","join","noData","remove","parentNode","Event","evt","event","document","createEvent","initEvent","target","TypeError","index","arguments","source","key","hasOwnProperty","call","Toggle","theme","off","on","$kcToggle","insertAfter","append","toggleClass","is","kctOn","kctOff","kctHandle","kctInner","click","attr","fn","kcToggle","toggle","each","data","_typeof","Symbol","iterator","obj","constructor","inArray","needle","haystack","indexOf","attrs","xmlRemove","undefined","Array","isArray","validAttr","invalid","attrString","attributes","safeAttr","name","value","safeAttrName","valString","escapeAttr","toString","replace","trim","hyphenCase","str","$1","toLowerCase","camelCase","m","w","toUpperCase","tag","content","contentType","createElement","getContentType","appendContent","string","object","array","setAttribute","parseAttrs","attrVal","match","parseOptions","getElementsByTagName","optionData","label","textContent","xmlString","parser","DOMParser","parseFromString","fieldData","nodeChildren","children","escapeHtml","html","escapeElement","replaceTag","\"","&","<",">","escapeAttrs","callback","scope","unique","filter","pos","arr","preview","fieldMarkup","fieldLabel","optionsMarkup","fieldLabelText","fieldDesc","description","fieldRequired","fieldOptions","id","multiple","type","subtype","required","fieldLabelVal","fieldDataString","fieldVal","optionAttrsString","placeholder","selected","optionAttrs","checked","otherOptionAttrs","onclick","setTimeout","getElementById","otherOptionCB","otherId","otherInput","otherInputValue","style","display","capitalize"],"mappings":"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","file":"form-render.min.js","sourcesContent":["'use strict';\n\n// Element.remove() polyfill\nif (!('remove' in Element.prototype)) {\n Element.prototype.remove = function() {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n };\n}\n\n// Event polyfill\nif (typeof Event !== 'function') {\n (function() {\n window.Event = function(evt) {\n var event = document.createEvent('Event');\n event.initEvent(evt, true, true);\n return event;\n };\n })();\n}\n\n// Object.assign polyfill\nif (typeof Object.assign != 'function') {\n Object.assign = function(target) {\n 'use strict';\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n target = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source != null) {\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n }\n return target;\n };\n}\n","'use strict';\n\n// render the formBuilder XML into html\nfunction FormRenderFn(options, element) {\n\n var utils = fbUtils;\n\n var formRender = this,\n defaults = {\n destroyTemplate: true, // @todo\n container: false,\n dataType: 'xml',\n formData: false,\n messages: {\n formRendered: 'Form Rendered',\n noFormData: 'No form data.',\n other: 'Other',\n selectColor: 'Select Color'\n },\n onRender: () => {},\n render: true,\n notify: {\n error: function(message) {\n return console.error(message);\n },\n success: function(message) {\n return console.log(message);\n },\n warning: function(message) {\n return console.warn(message);\n }\n }\n };\n\n var opts = $.extend(true, defaults, options);\n\n (function() {\n if (!opts.formData) {\n return false;\n }\n\n let setData = {\n xml: formData => utils.parseXML(formData),\n json: formData => window.JSON.parse(formData)\n };\n\n opts.formData = setData[opts.dataType](opts.formData) || false;\n })();\n\n /**\n * Extend Element prototype to allow us to append fields\n *\n * @param {Object} fields Node elements\n */\n Element.prototype.appendFormFields = function(fields) {\n var element = this;\n fields.forEach(field => element.appendChild(field));\n };\n\n /**\n * Extend Element prototype to remove content\n */\n Element.prototype.emptyContainer = function() {\n var element = this;\n while (element.lastChild) {\n element.removeChild(element.lastChild);\n }\n };\n\n var runCallbacks = function() {\n if (opts.onRender) {\n opts.onRender();\n }\n };\n\n var santizeField = (field) => {\n let sanitizedField = Object.assign({}, field);\n sanitizedField.className = field.className || field.class || null;\n delete sanitizedField.class;\n\n if (field.values) {\n field.values = field.values.map(option => utils.trimObj(option));\n }\n\n return utils.trimObj(sanitizedField);\n };\n\n // Begin the core plugin\n var rendered = [];\n\n // generate field markup if we have fields\n if (opts.formData) {\n for (var i = 0; i < opts.formData.length; i++) {\n let sanitizedField = santizeField(opts.formData[i]);\n rendered.push(utils.fieldRender(sanitizedField, opts));\n }\n\n if (opts.render) {\n if (opts.container) {\n let renderedFormWrap = utils.markup('div', rendered, {className: 'rendered-form'});\n opts.container = (opts.container instanceof jQuery) ? opts.container[0] : opts.container;\n opts.container.emptyContainer();\n opts.container.appendChild(renderedFormWrap);\n } else if (element) {\n element.emptyContainer();\n element.appendFormFields(rendered);\n }\n\n runCallbacks();\n opts.notify.success(opts.messages.formRendered);\n } else {\n formRender.markup = rendered.map(function(elem) {\n return elem.innerHTML;\n }).join('');\n }\n } else {\n let noData = utils.markup('div', opts.messages.noFormData, {\n className: 'no-form-data'\n });\n rendered.push(noData);\n opts.notify.error(opts.messages.noFormData);\n }\n\n return formRender;\n}\n\n(function($) {\n\n $.fn.formRender = function(options) {\n this.each(function() {\n let formRender = new FormRenderFn(options, this);\n return formRender;\n });\n };\n\n})(jQuery);\n","(function($) {\n 'use strict';\n\n var Toggle = function(element, options) {\n\n var defaults = {\n theme: 'fresh',\n messages: {\n off: 'Off',\n on: 'On'\n }\n };\n\n var opts = $.extend(defaults, options),\n $kcToggle = $('
    ').insertAfter(element).append(element);\n\n $kcToggle.toggleClass('on', element.is(':checked'));\n\n var kctOn = `
    ${opts.messages.on}
    `,\n kctOff = `
    ${opts.messages.off}
    `,\n kctHandle = '
    ',\n kctInner = `
    ${kctOn}${kctHandle}${kctOff}
    `;\n\n $kcToggle.append(kctInner);\n\n $kcToggle.click(function() {\n element.attr('checked', !element.attr('checked'));\n $(this).toggleClass('on');\n });\n\n };\n\n $.fn.kcToggle = function(options) {\n var toggle = this;\n return toggle.each(function() {\n var element = $(this);\n if (element.data('kcToggle')) {\n return;\n }\n var kcToggle = new Toggle(element, options);\n element.data('kcToggle', kcToggle);\n });\n };\n\n})(jQuery);\n","'use strict';\n\n// Element.remove() polyfill\n\nif (!('remove' in Element.prototype)) {\n Element.prototype.remove = function () {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n };\n}\n\n// Event polyfill\nif (typeof Event !== 'function') {\n (function () {\n window.Event = function (evt) {\n var event = document.createEvent('Event');\n event.initEvent(evt, true, true);\n return event;\n };\n })();\n}\n\n// Object.assign polyfill\nif (typeof Object.assign != 'function') {\n Object.assign = function (target) {\n 'use strict';\n\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n target = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source != null) {\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n }\n return target;\n };\n}\n'use strict';\n\n(function ($) {\n 'use strict';\n\n var Toggle = function Toggle(element, options) {\n\n var defaults = {\n theme: 'fresh',\n messages: {\n off: 'Off',\n on: 'On'\n }\n };\n\n var opts = $.extend(defaults, options),\n $kcToggle = $('
    ').insertAfter(element).append(element);\n\n $kcToggle.toggleClass('on', element.is(':checked'));\n\n var kctOn = '
    ' + opts.messages.on + '
    ',\n kctOff = '
    ' + opts.messages.off + '
    ',\n kctHandle = '
    ',\n kctInner = '
    ' + kctOn + kctHandle + kctOff + '
    ';\n\n $kcToggle.append(kctInner);\n\n $kcToggle.click(function () {\n element.attr('checked', !element.attr('checked'));\n $(this).toggleClass('on');\n });\n };\n\n $.fn.kcToggle = function (options) {\n var toggle = this;\n return toggle.each(function () {\n var element = $(this);\n if (element.data('kcToggle')) {\n return;\n }\n var kcToggle = new Toggle(element, options);\n element.data('kcToggle', kcToggle);\n });\n };\n})(jQuery);\n'use strict';\n/**\n *\n */\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar fbUtils = {};\n\n// cleaner syntax for testing indexOf element\nfbUtils.inArray = function (needle, haystack) {\n return haystack.indexOf(needle) !== -1;\n};\n\n/**\n * Remove null or undefined values\n * @param {Object} attrs {attrName: attrValue}\n * @return {Object} Object trimmed of null or undefined values\n */\nfbUtils.trimObj = function (attrs) {\n var xmlRemove = [null, undefined, '', false, 'false'];\n for (var attr in attrs) {\n if (fbUtils.inArray(attrs[attr], xmlRemove)) {\n delete attrs[attr];\n } else if (Array.isArray(attrs[attr])) {\n if (!attrs[attr].length) {\n delete attrs[attr];\n }\n }\n }\n\n return attrs;\n};\n\n/**\n * Test if attribute is a valid HTML attribute\n * @param {String} attr\n * @return {Boolean}\n */\nfbUtils.validAttr = function (attr) {\n var invalid = ['values', 'enableOther', 'other', 'label',\n // 'style',\n 'subtype'];\n return !fbUtils.inArray(attr, invalid);\n};\n\n/**\n * Convert an attrs object into a string\n *\n * @param {Object} attrs object of attributes for markup\n * @return {string}\n */\nfbUtils.attrString = function (attrs) {\n var attributes = [];\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr) && fbUtils.validAttr(attr)) {\n attr = fbUtils.safeAttr(attr, attrs[attr]);\n attributes.push(attr.name + attr.value);\n }\n }\n return attributes.join(' ');\n};\n\n/**\n * Convert attributes to markup safe strings\n * @param {String} name attribute name\n * @param {String} value attribute value\n * @return {Object} {attrName: attrValue}\n */\nfbUtils.safeAttr = function (name, value) {\n name = fbUtils.safeAttrName(name);\n var valString = void 0;\n\n if (value) {\n if (Array.isArray(value)) {\n valString = fbUtils.escapeAttr(value.join(' '));\n } else {\n if (typeof value === 'boolean') {\n value = value.toString();\n }\n valString = fbUtils.escapeAttr(value.replace(',', ' ').trim());\n }\n }\n\n value = value ? '=\"' + valString + '\"' : '';\n return {\n name: name,\n value: value\n };\n};\n\nfbUtils.safeAttrName = function (name) {\n var safeAttr = {\n className: 'class'\n };\n\n return safeAttr[name] || fbUtils.hyphenCase(name);\n};\n\n/**\n * Convert strings into lowercase-hyphen\n *\n * @param {String} str\n * @return {String}\n */\nfbUtils.hyphenCase = function (str) {\n str = str.replace(/[^\\w\\s\\-]/gi, '');\n str = str.replace(/([A-Z])/g, function ($1) {\n return '-' + $1.toLowerCase();\n });\n\n return str.replace(/\\s/g, '-').replace(/^-+/g, '');\n};\n\n/**\n * convert a hyphenated string to camelCase\n * @param {String} str\n * @return {String}\n */\nfbUtils.camelCase = function (str) {\n return str.replace(/-([a-z])/g, function (m, w) {\n return w.toUpperCase();\n });\n};\n\n/**\n * Generate markup wrapper where needed\n *\n * @param {string} tag\n * @param {String|Array|Object} content we wrap this\n * @param {Object} attrs\n * @return {String}\n */\nfbUtils.markup = function (tag) {\n var content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var contentType = void 0,\n field = document.createElement(tag),\n getContentType = function getContentType(content) {\n return Array.isArray(content) ? 'array' : typeof content === 'undefined' ? 'undefined' : _typeof(content);\n },\n appendContent = {\n string: function string(content) {\n field.innerHTML = content;\n },\n object: function object(content) {\n return field.appendChild(content);\n },\n array: function array(content) {\n for (var i = 0; i < content.length; i++) {\n contentType = getContentType(content[i]);\n appendContent[contentType](content[i]);\n }\n }\n };\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n var name = fbUtils.safeAttrName(attr);\n field.setAttribute(name, attrs[attr]);\n }\n }\n\n contentType = getContentType(content);\n\n if (content) {\n appendContent[contentType].call(this, content);\n }\n\n return field;\n};\n\n/**\n * Convert html element attributes to key/value object\n * @param {Object} DOM element\n * @return {Object} ex: {attrName: attrValue}\n */\nfbUtils.parseAttrs = function (elem) {\n var attrs = elem.attributes;\n var data = {};\n fbUtils.forEach(attrs, function (attr) {\n var attrVal = attrs[attr].value;\n if (attrVal.match(/false|true/g)) {\n attrVal = attrVal === 'true';\n } else if (attrVal.match(/undefined/g)) {\n attrVal = undefined;\n }\n\n if (attrVal) {\n data[attrs[attr].name] = attrVal;\n }\n });\n\n return data;\n};\n\n/**\n * Convert field options to optionData\n * @param {Object} DOM element\n * @return {Array} optionData array\n */\nfbUtils.parseOptions = function (field) {\n var options = field.getElementsByTagName('option'),\n optionData = {},\n data = [];\n\n if (options.length) {\n for (var i = 0; i < options.length; i++) {\n optionData = fbUtils.parseAttrs(options[i]);\n optionData.label = options[i].textContent;\n data.push(optionData);\n }\n }\n\n return data;\n};\n\n/**\n * Parse XML formData\n * @param {String} xmlString\n * @return {Array} formData array\n */\nfbUtils.parseXML = function (xmlString) {\n var parser = new window.DOMParser();\n var xml = parser.parseFromString(xmlString, 'text/xml'),\n formData = [];\n\n if (xml) {\n var fields = xml.getElementsByTagName('field');\n for (var i = 0; i < fields.length; i++) {\n var fieldData = fbUtils.parseAttrs(fields[i]);\n var nodeChildren = fields[i].children || [];\n\n if (nodeChildren.length) {\n fieldData.values = fbUtils.parseOptions(fields[i]);\n }\n\n formData.push(fieldData);\n }\n }\n\n return formData;\n};\n\n/**\n * Escape markup so it can be displayed rather than rendered\n * @param {String} html markup\n * @return {String} escaped html\n */\nfbUtils.escapeHtml = function (html) {\n var escapeElement = document.createElement('textarea');\n escapeElement.textContent = html;\n return escapeElement.innerHTML;\n};\n\n// Escape an attribute\nfbUtils.escapeAttr = function (str) {\n var match = {\n '\"': '"',\n '&': '&',\n '<': '<',\n '>': '>'\n };\n\n function replaceTag(tag) {\n return match[tag] || tag;\n }\n\n return typeof str === 'string' ? str.replace(/[\"&<>]/g, replaceTag) : str;\n};\n\n// Escape attributes\nfbUtils.escapeAttrs = function (attrs) {\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n attrs[attr] = fbUtils.escapeAttr(attrs[attr]);\n }\n }\n\n return attrs;\n};\n\n// forEach that can be used on nodeList\nfbUtils.forEach = function (array, callback, scope) {\n for (var i = 0; i < array.length; i++) {\n callback.call(scope, i, array[i]); // passes back stuff we need\n }\n};\n\n/**\n * Remove duplicates from an array of elements\n * @param {Array} arrArg array with possible duplicates\n * @return {Array} array with only unique values\n */\nfbUtils.unique = function (array) {\n return array.filter(function (elem, pos, arr) {\n return arr.indexOf(elem) === pos;\n });\n};\n\n/**\n * Generate preview markup\n * @param {object} fieldData\n * @return {string} preview markup for field\n */\nfbUtils.fieldRender = function (fieldData, opts) {\n var preview = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var fieldMarkup = '',\n fieldLabel = '',\n optionsMarkup = '',\n fieldLabelText = fieldData.label || '',\n fieldDesc = fieldData.description || '',\n fieldRequired = '',\n fieldOptions = fieldData.values;\n\n fieldData.name = preview ? fieldData.name + '-preview' : fieldData.name;\n fieldData.id = fieldData.name;\n fieldData.name = fieldData.multiple ? fieldData.name + '[]' : fieldData.name;\n\n fieldData.type = fieldData.subtype || fieldData.type;\n\n if (fieldData.required) {\n fieldData.required = null;\n fieldData['aria-required'] = 'true';\n fieldRequired = '*';\n }\n\n if (fieldData.type !== 'hidden') {\n if (fieldDesc) {\n fieldDesc = '?';\n }\n fieldLabel = '';\n }\n\n var fieldLabelVal = fieldData.label;\n\n delete fieldData.label;\n delete fieldData.description;\n\n var fieldDataString = fbUtils.attrString(fieldData);\n\n switch (fieldData.type) {\n case 'textarea':\n case 'rich-text':\n {\n delete fieldData.type;\n var fieldVal = fieldData.value || '';\n fieldMarkup = fieldLabel + '';\n break;\n }\n case 'select':\n var optionAttrsString;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldOptions) {\n\n if (fieldData.placeholder) {\n optionsMarkup += '';\n }\n\n for (var i = 0; i < fieldOptions.length; i++) {\n if (!fieldOptions[i].selected || fieldData.placeholder) {\n delete fieldOptions[i].selected;\n }\n if (!fieldOptions[i].label) {\n fieldOptions[i].label = '';\n }\n optionAttrsString = fbUtils.attrString(fieldOptions[i]);\n optionsMarkup += '';\n }\n }\n\n fieldMarkup = fieldLabel + '';\n break;\n case 'checkbox-group':\n case 'radio-group':\n {\n var optionAttrs = void 0;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldData.type === 'checkbox') {\n fieldData.name = fieldData.name + '[]';\n }\n\n if (fieldOptions) {\n var _optionAttrsString = void 0;\n\n for (var _i = 0; _i < fieldOptions.length; _i++) {\n optionAttrs = Object.assign({ value: '', label: '' }, fieldData, fieldOptions[_i]);\n\n if (optionAttrs.selected) {\n delete optionAttrs.selected;\n optionAttrs.checked = null;\n }\n\n optionAttrs.id = fieldData.id + '-' + _i;\n _optionAttrsString = fbUtils.attrString(optionAttrs);\n optionsMarkup += '
    ';\n }\n\n if (fieldData.other) {\n var otherOptionAttrs = {\n id: fieldData.id + '-' + 'other',\n className: fieldData.className + ' other-option',\n onclick: 'fbUtils.otherOptionCB(\\'' + fieldData.id + '-other\\')'\n };\n\n _optionAttrsString = fbUtils.attrString(Object.assign({}, fieldData, otherOptionAttrs));\n\n optionsMarkup += ' ';\n }\n }\n fieldMarkup = fieldLabel + '
    ' + optionsMarkup + '
    ';\n break;\n }\n case 'text':\n case 'password':\n case 'email':\n case 'number':\n case 'file':\n case 'hidden':\n case 'date':\n case 'tel':\n case 'autocomplete':\n fieldMarkup = fieldLabel + ' ';\n break;\n case 'color':\n fieldMarkup = fieldLabel + ' ' + opts.messages.selectColor;\n break;\n case 'button':\n case 'submit':\n fieldMarkup = '';\n break;\n case 'checkbox':\n fieldMarkup = ' ' + fieldLabel;\n\n if (fieldData.toggle) {\n setTimeout(function () {\n $(document.getElementById(fieldData.id)).kcToggle();\n }, 100);\n }\n break;\n default:\n fieldMarkup = '<' + fieldData.type + ' ' + fieldDataString + '>' + fieldLabelVal + '';\n }\n\n if (fieldData.type !== 'hidden') {\n var className = fieldData.id ? 'fb-' + fieldData.type + ' form-group field-' + fieldData.id : '';\n fieldMarkup = fbUtils.markup('div', fieldMarkup, {\n className: className\n });\n } else {\n fieldMarkup = fbUtils.markup('input', null, fieldData);\n }\n\n return fieldMarkup;\n};\n\n/**\n * Callback for other option.\n * Toggles the hidden text area for \"other\" option.\n * @param {String} otherId id of the \"other\" option input\n */\nfbUtils.otherOptionCB = function (otherId) {\n var otherInput = document.getElementById(otherId),\n otherInputValue = document.getElementById(otherId + '-value');\n\n if (otherInput.checked) {\n otherInput.style.display = 'none';\n otherInputValue.style.display = 'inline-block';\n } else {\n otherInput.style.display = 'inline-block';\n otherInputValue.style.display = 'none';\n }\n};\n\n/**\n * Capitalizes a string\n * @param {String} str uncapitalized string\n * @return {String} str capitalized string\n */\nfbUtils.capitalize = function (str) {\n return str.replace(/\\b\\w/g, function (m) {\n return m.toUpperCase();\n });\n};\n'use strict';\n\n// render the formBuilder XML into html\n\nfunction FormRenderFn(options, element) {\n\n var utils = fbUtils;\n\n var formRender = this,\n defaults = {\n destroyTemplate: true, // @todo\n container: false,\n dataType: 'xml',\n formData: false,\n messages: {\n formRendered: 'Form Rendered',\n noFormData: 'No form data.',\n other: 'Other',\n selectColor: 'Select Color'\n },\n onRender: function onRender() {},\n render: true,\n notify: {\n error: function error(message) {\n return console.error(message);\n },\n success: function success(message) {\n return console.log(message);\n },\n warning: function warning(message) {\n return console.warn(message);\n }\n }\n };\n\n var opts = $.extend(true, defaults, options);\n\n (function () {\n if (!opts.formData) {\n return false;\n }\n\n var setData = {\n xml: function xml(formData) {\n return utils.parseXML(formData);\n },\n json: function json(formData) {\n return window.JSON.parse(formData);\n }\n };\n\n opts.formData = setData[opts.dataType](opts.formData) || false;\n })();\n\n /**\n * Extend Element prototype to allow us to append fields\n *\n * @param {Object} fields Node elements\n */\n Element.prototype.appendFormFields = function (fields) {\n var element = this;\n fields.forEach(function (field) {\n return element.appendChild(field);\n });\n };\n\n /**\n * Extend Element prototype to remove content\n */\n Element.prototype.emptyContainer = function () {\n var element = this;\n while (element.lastChild) {\n element.removeChild(element.lastChild);\n }\n };\n\n var runCallbacks = function runCallbacks() {\n if (opts.onRender) {\n opts.onRender();\n }\n };\n\n var santizeField = function santizeField(field) {\n var sanitizedField = Object.assign({}, field);\n sanitizedField.className = field.className || field.class || null;\n delete sanitizedField.class;\n\n if (field.values) {\n field.values = field.values.map(function (option) {\n return utils.trimObj(option);\n });\n }\n\n return utils.trimObj(sanitizedField);\n };\n\n // Begin the core plugin\n var rendered = [];\n\n // generate field markup if we have fields\n if (opts.formData) {\n for (var i = 0; i < opts.formData.length; i++) {\n var sanitizedField = santizeField(opts.formData[i]);\n rendered.push(utils.fieldRender(sanitizedField, opts));\n }\n\n if (opts.render) {\n if (opts.container) {\n var renderedFormWrap = utils.markup('div', rendered, { className: 'rendered-form' });\n opts.container = opts.container instanceof jQuery ? opts.container[0] : opts.container;\n opts.container.emptyContainer();\n opts.container.appendChild(renderedFormWrap);\n } else if (element) {\n element.emptyContainer();\n element.appendFormFields(rendered);\n }\n\n runCallbacks();\n opts.notify.success(opts.messages.formRendered);\n } else {\n formRender.markup = rendered.map(function (elem) {\n return elem.innerHTML;\n }).join('');\n }\n } else {\n var noData = utils.markup('div', opts.messages.noFormData, {\n className: 'no-form-data'\n });\n rendered.push(noData);\n opts.notify.error(opts.messages.noFormData);\n }\n\n return formRender;\n}\n\n(function ($) {\n\n $.fn.formRender = function (options) {\n this.each(function () {\n var formRender = new FormRenderFn(options, this);\n return formRender;\n });\n };\n})(jQuery);","'use strict';\n/**\n *\n */\n\nconst fbUtils = {};\n\n// cleaner syntax for testing indexOf element\nfbUtils.inArray = function(needle, haystack) {\n return haystack.indexOf(needle) !== -1;\n};\n\n/**\n * Remove null or undefined values\n * @param {Object} attrs {attrName: attrValue}\n * @return {Object} Object trimmed of null or undefined values\n */\nfbUtils.trimObj = function(attrs) {\n let xmlRemove = [\n null,\n undefined,\n '',\n false,\n 'false'\n ];\n for (var attr in attrs) {\n if (fbUtils.inArray(attrs[attr], xmlRemove)) {\n delete attrs[attr];\n } else if (Array.isArray(attrs[attr])) {\n if (!attrs[attr].length) {\n delete attrs[attr];\n }\n }\n }\n\n return attrs;\n};\n\n/**\n * Test if attribute is a valid HTML attribute\n * @param {String} attr\n * @return {Boolean}\n */\nfbUtils.validAttr = function(attr) {\n let invalid = [\n 'values',\n 'enableOther',\n 'other',\n 'label',\n // 'style',\n 'subtype'\n ];\n return !fbUtils.inArray(attr, invalid);\n};\n\n/**\n * Convert an attrs object into a string\n *\n * @param {Object} attrs object of attributes for markup\n * @return {string}\n */\nfbUtils.attrString = function(attrs) {\n let attributes = [];\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr) && fbUtils.validAttr(attr)) {\n attr = fbUtils.safeAttr(attr, attrs[attr]);\n attributes.push(attr.name + attr.value);\n }\n }\n return attributes.join(' ');\n};\n\n/**\n * Convert attributes to markup safe strings\n * @param {String} name attribute name\n * @param {String} value attribute value\n * @return {Object} {attrName: attrValue}\n */\nfbUtils.safeAttr = function(name, value) {\n name = fbUtils.safeAttrName(name);\n let valString;\n\n if (value) {\n if (Array.isArray(value)) {\n valString = fbUtils.escapeAttr(value.join(' '))\n } else {\n if (typeof(value) === 'boolean') {\n value = value.toString();\n }\n valString = fbUtils.escapeAttr(value.replace(',', ' ').trim());\n }\n }\n\n value = value ? `=\"${valString}\"` : '';\n return {\n name,\n value\n };\n};\n\nfbUtils.safeAttrName = function(name) {\n let safeAttr = {\n className: 'class'\n };\n\n return safeAttr[name] || fbUtils.hyphenCase(name);\n};\n\n/**\n * Convert strings into lowercase-hyphen\n *\n * @param {String} str\n * @return {String}\n */\nfbUtils.hyphenCase = (str) => {\n str = str.replace(/[^\\w\\s\\-]/gi, '');\n str = str.replace(/([A-Z])/g, function($1) {\n return '-' + $1.toLowerCase();\n });\n\n return str.replace(/\\s/g, '-').replace(/^-+/g, '');\n};\n\n/**\n * convert a hyphenated string to camelCase\n * @param {String} str\n * @return {String}\n */\nfbUtils.camelCase = (str) => {\n return str.replace(/-([a-z])/g, function(m, w) {\n return w.toUpperCase();\n });\n};\n\n/**\n * Generate markup wrapper where needed\n *\n * @param {string} tag\n * @param {String|Array|Object} content we wrap this\n * @param {Object} attrs\n * @return {String}\n */\nfbUtils.markup = function(tag, content = '', attrs = {}) {\n let contentType,\n field = document.createElement(tag),\n getContentType = function(content) {\n return Array.isArray(content) ? 'array' : typeof content;\n },\n appendContent = {\n string: function(content) {\n field.innerHTML = content;\n },\n object: function(content) {\n return field.appendChild(content);\n },\n array: function(content) {\n for (var i = 0; i < content.length; i++) {\n contentType = getContentType(content[i]);\n appendContent[contentType](content[i]);\n }\n }\n };\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n let name = fbUtils.safeAttrName(attr);\n field.setAttribute(name, attrs[attr]);\n }\n }\n\n contentType = getContentType(content);\n\n if (content) {\n appendContent[contentType].call(this, content);\n }\n\n return field;\n};\n\n/**\n * Convert html element attributes to key/value object\n * @param {Object} DOM element\n * @return {Object} ex: {attrName: attrValue}\n */\nfbUtils.parseAttrs = function(elem) {\n var attrs = elem.attributes;\n var data = {};\n fbUtils.forEach(attrs, attr => {\n let attrVal = attrs[attr].value;\n if (attrVal.match(/false|true/g)) {\n attrVal = (attrVal === 'true');\n } else if (attrVal.match(/undefined/g)) {\n attrVal = undefined;\n }\n\n if (attrVal) {\n data[attrs[attr].name] = attrVal;\n }\n\n });\n\n return data;\n};\n\n/**\n * Convert field options to optionData\n * @param {Object} DOM element\n * @return {Array} optionData array\n */\nfbUtils.parseOptions = function(field) {\n let options = field.getElementsByTagName('option'),\n optionData = {},\n data = [];\n\n if (options.length) {\n for (var i = 0; i < options.length; i++) {\n optionData = fbUtils.parseAttrs(options[i]);\n optionData.label = options[i].textContent;\n data.push(optionData);\n }\n }\n\n return data;\n};\n\n/**\n * Parse XML formData\n * @param {String} xmlString\n * @return {Array} formData array\n */\nfbUtils.parseXML = function(xmlString) {\n const parser = new window.DOMParser();\n let xml = parser.parseFromString(xmlString, 'text/xml'),\n formData = [];\n\n if (xml) {\n var fields = xml.getElementsByTagName('field');\n for (var i = 0; i < fields.length; i++) {\n let fieldData = fbUtils.parseAttrs(fields[i]);\n let nodeChildren = fields[i].children || [];\n\n if (nodeChildren.length) {\n fieldData.values = fbUtils.parseOptions(fields[i]);\n }\n\n formData.push(fieldData);\n }\n }\n\n return formData;\n};\n\n/**\n * Escape markup so it can be displayed rather than rendered\n * @param {String} html markup\n * @return {String} escaped html\n */\nfbUtils.escapeHtml = function(html) {\n var escapeElement = document.createElement('textarea');\n escapeElement.textContent = html;\n return escapeElement.innerHTML;\n};\n\n// Escape an attribute\nfbUtils.escapeAttr = function(str) {\n var match = {\n '\"': '"',\n '&': '&',\n '<': '<',\n '>': '>'\n };\n\n function replaceTag(tag) {\n return match[tag] || tag;\n }\n\n return (typeof str === 'string') ? str.replace(/[\"&<>]/g, replaceTag) : str;\n};\n\n// Escape attributes\nfbUtils.escapeAttrs = function(attrs) {\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n attrs[attr] = fbUtils.escapeAttr(attrs[attr]);\n }\n }\n\n return attrs;\n};\n\n// forEach that can be used on nodeList\nfbUtils.forEach = function(array, callback, scope) {\n for (var i = 0; i < array.length; i++) {\n callback.call(scope, i, array[i]); // passes back stuff we need\n }\n};\n\n/**\n * Remove duplicates from an array of elements\n * @param {Array} arrArg array with possible duplicates\n * @return {Array} array with only unique values\n */\nfbUtils.unique = function(array) {\n return array.filter((elem, pos, arr) => {\n return arr.indexOf(elem) === pos;\n });\n};\n\n/**\n * Generate preview markup\n * @param {object} fieldData\n * @return {string} preview markup for field\n */\nfbUtils.fieldRender = function(fieldData, opts, preview = false) {\n var fieldMarkup = '',\n fieldLabel = '',\n optionsMarkup = '',\n fieldLabelText = fieldData.label || '',\n fieldDesc = fieldData.description || '',\n fieldRequired = '',\n fieldOptions = fieldData.values;\n\n fieldData.name = preview ? fieldData.name + '-preview' : fieldData.name;\n fieldData.id = fieldData.name;\n fieldData.name = fieldData.multiple ? fieldData.name + '[]' : fieldData.name;\n\n fieldData.type = fieldData.subtype || fieldData.type;\n\n if (fieldData.required) {\n fieldData.required = null;\n fieldData['aria-required'] = 'true';\n fieldRequired = '*';\n }\n\n if (fieldData.type !== 'hidden') {\n if (fieldDesc) {\n fieldDesc = `?`;\n }\n fieldLabel = ``;\n }\n\n var fieldLabelVal = fieldData.label;\n\n delete fieldData.label;\n delete fieldData.description;\n\n var fieldDataString = fbUtils.attrString(fieldData);\n\n switch (fieldData.type) {\n case 'textarea':\n case 'rich-text': {\n delete fieldData.type;\n let fieldVal = fieldData.value || '';\n fieldMarkup = `${fieldLabel}`;\n break;\n }\n case 'select':\n var optionAttrsString;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldOptions) {\n\n if (fieldData.placeholder) {\n optionsMarkup += ``;\n }\n\n for (let i = 0; i < fieldOptions.length; i++) {\n if (!fieldOptions[i].selected || fieldData.placeholder) {\n delete fieldOptions[i].selected;\n }\n if (!fieldOptions[i].label) {\n fieldOptions[i].label = '';\n }\n optionAttrsString = fbUtils.attrString(fieldOptions[i]);\n optionsMarkup += ``;\n }\n }\n\n fieldMarkup = `${fieldLabel}`;\n break;\n case 'checkbox-group':\n case 'radio-group': {\n let optionAttrs;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldData.type === 'checkbox') {\n fieldData.name = fieldData.name + '[]';\n }\n\n if (fieldOptions) {\n let optionAttrsString;\n\n for (let i = 0; i < fieldOptions.length; i++) {\n optionAttrs = Object.assign({value: '', label: ''}, fieldData, fieldOptions[i]);\n\n if (optionAttrs.selected) {\n delete optionAttrs.selected;\n optionAttrs.checked = null;\n }\n\n optionAttrs.id = fieldData.id + '-' + i;\n optionAttrsString = fbUtils.attrString(optionAttrs);\n optionsMarkup += `
    `;\n }\n\n if (fieldData.other) {\n let otherOptionAttrs = {\n id: fieldData.id + '-' + 'other',\n className: fieldData.className + ' other-option',\n onclick: `fbUtils.otherOptionCB('${fieldData.id}-other')`\n };\n\n optionAttrsString = fbUtils.attrString(Object.assign({}, fieldData, otherOptionAttrs));\n\n optionsMarkup += ` `;\n }\n\n }\n fieldMarkup = `${fieldLabel}
    ${optionsMarkup}
    `;\n break;\n }\n case 'text':\n case 'password':\n case 'email':\n case 'number':\n case 'file':\n case 'hidden':\n case 'date':\n case 'tel':\n case 'autocomplete':\n fieldMarkup = `${fieldLabel} `;\n break;\n case 'color':\n fieldMarkup = `${fieldLabel} ${opts.messages.selectColor}`;\n break;\n case 'button':\n case 'submit':\n fieldMarkup = ``;\n break;\n case 'checkbox':\n fieldMarkup = ` ${fieldLabel}`;\n\n if (fieldData.toggle) {\n setTimeout(function() {\n $(document.getElementById(fieldData.id)).kcToggle();\n }, 100);\n }\n break;\n default:\n fieldMarkup = `<${fieldData.type} ${fieldDataString}>${fieldLabelVal}`;\n }\n\n if (fieldData.type !== 'hidden') {\n let className = fieldData.id ? `fb-${fieldData.type} form-group field-${fieldData.id}` : '';\n fieldMarkup = fbUtils.markup('div', fieldMarkup, {\n className: className\n });\n } else {\n fieldMarkup = fbUtils.markup('input', null, fieldData);\n }\n\n return fieldMarkup;\n };\n\n/**\n * Callback for other option.\n * Toggles the hidden text area for \"other\" option.\n * @param {String} otherId id of the \"other\" option input\n */\nfbUtils.otherOptionCB = (otherId) => {\n let otherInput = document.getElementById(otherId),\n otherInputValue = document.getElementById(`${otherId}-value`);\n\n if (otherInput.checked) {\n otherInput.style.display = 'none';\n otherInputValue.style.display = 'inline-block';\n } else {\n otherInput.style.display = 'inline-block';\n otherInputValue.style.display = 'none';\n }\n};\n\n/**\n * Capitalizes a string\n * @param {String} str uncapitalized string\n * @return {String} str capitalized string\n */\nfbUtils.capitalize = (str) => {\n return str.replace(/\\b\\w/g, function(m) {\n return m.toUpperCase();\n });\n};\n"]} \ No newline at end of file +{"version":3,"sources":["polyfills.js","form-render.js","kc-toggle.js","form-render.min.js","utils.js"],"names":["FormRenderFn","options","element","utils","fbUtils","formRender","this","defaults","destroyTemplate","container","dataType","formData","messages","formRendered","noFormData","other","selectColor","onRender","render","notify","error","message","console","success","log","warning","warn","opts","$","extend","setData","xml","parseXML","json","window","JSON","parse","Element","prototype","appendFormFields","fields","forEach","field","appendChild","emptyContainer","lastChild","removeChild","runCallbacks","santizeField","sanitizedField","Object","assign","className","values","map","option","trimObj","rendered","i","length","push","fieldRender","renderedFormWrap","markup","jQuery","elem","innerHTML","join","noData","remove","parentNode","Event","evt","event","document","createEvent","initEvent","target","TypeError","index","arguments","source","key","hasOwnProperty","call","Toggle","theme","off","on","$kcToggle","insertAfter","append","toggleClass","is","kctOn","kctOff","kctHandle","kctInner","click","attr","fn","kcToggle","toggle","each","data","_typeof","Symbol","iterator","obj","constructor","inArray","needle","haystack","indexOf","attrs","xmlRemove","undefined","Array","isArray","validAttr","invalid","attrString","attributes","safeAttr","name","value","safeAttrName","valString","escapeAttr","toString","replace","trim","hyphenCase","str","$1","toLowerCase","camelCase","m","w","toUpperCase","tag","content","contentType","createElement","getContentType","appendContent","string","object","array","setAttribute","parseAttrs","attrVal","match","parseOptions","getElementsByTagName","optionData","label","textContent","xmlString","parser","DOMParser","parseFromString","fieldData","nodeChildren","children","escapeHtml","html","escapeElement","replaceTag","\"","&","<",">","escapeAttrs","callback","scope","unique","filter","pos","arr","preview","fieldMarkup","fieldLabel","optionsMarkup","fieldLabelText","fieldDesc","description","fieldRequired","fieldOptions","id","multiple","type","subtype","required","fieldLabelVal","fieldDataString","fieldVal","optionAttrsString","placeholder","selected","optionAttrs","checked","otherOptionAttrs","onclick","setTimeout","getElementById","otherOptionCB","otherId","otherInput","otherInputValue","style","display","capitalize"],"mappings":"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","file":"form-render.min.js","sourcesContent":["'use strict';\n\n// Element.remove() polyfill\nif (!('remove' in Element.prototype)) {\n Element.prototype.remove = function() {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n };\n}\n\n// Event polyfill\nif (typeof Event !== 'function') {\n (function() {\n window.Event = function(evt) {\n var event = document.createEvent('Event');\n event.initEvent(evt, true, true);\n return event;\n };\n })();\n}\n\n// Object.assign polyfill\nif (typeof Object.assign != 'function') {\n Object.assign = function(target) {\n 'use strict';\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n target = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source != null) {\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n }\n return target;\n };\n}\n","/*global fbUtils*/\n// render the formBuilder XML into html\nfunction FormRenderFn(options, element) {\n 'use strict';\n\n var utils = fbUtils;\n\n var formRender = this,\n defaults = {\n destroyTemplate: true, // @todo\n container: false,\n dataType: 'xml',\n formData: false,\n messages: {\n formRendered: 'Form Rendered',\n noFormData: 'No form data.',\n other: 'Other',\n selectColor: 'Select Color'\n },\n onRender: () => {},\n render: true,\n notify: {\n error: function(message) {\n return console.error(message);\n },\n success: function(message) {\n return console.log(message);\n },\n warning: function(message) {\n return console.warn(message);\n }\n }\n };\n\n var opts = $.extend(true, defaults, options);\n\n (function() {\n if (!opts.formData) {\n return false;\n }\n\n let setData = {\n xml: formData => utils.parseXML(formData),\n json: formData => window.JSON.parse(formData)\n };\n\n opts.formData = setData[opts.dataType](opts.formData) || false;\n })();\n\n /**\n * Extend Element prototype to allow us to append fields\n *\n * @param {Object} fields Node elements\n */\n Element.prototype.appendFormFields = function(fields) {\n var element = this;\n fields.forEach(field => element.appendChild(field));\n };\n\n /**\n * Extend Element prototype to remove content\n */\n Element.prototype.emptyContainer = function() {\n var element = this;\n while (element.lastChild) {\n element.removeChild(element.lastChild);\n }\n };\n\n var runCallbacks = function() {\n if (opts.onRender) {\n opts.onRender();\n }\n };\n\n var santizeField = (field) => {\n let sanitizedField = Object.assign({}, field);\n sanitizedField.className = field.className || field.class || null;\n delete sanitizedField.class;\n\n if (field.values) {\n field.values = field.values.map(option => utils.trimObj(option));\n }\n\n return utils.trimObj(sanitizedField);\n };\n\n // Begin the core plugin\n var rendered = [];\n\n // generate field markup if we have fields\n if (opts.formData) {\n for (var i = 0; i < opts.formData.length; i++) {\n let sanitizedField = santizeField(opts.formData[i]);\n rendered.push(utils.fieldRender(sanitizedField, opts));\n }\n\n if (opts.render) {\n if (opts.container) {\n let renderedFormWrap = utils.markup('div', rendered, {className: 'rendered-form'});\n opts.container = (opts.container instanceof jQuery) ? opts.container[0] : opts.container;\n opts.container.emptyContainer();\n opts.container.appendChild(renderedFormWrap);\n } else if (element) {\n element.emptyContainer();\n element.appendFormFields(rendered);\n }\n\n runCallbacks();\n opts.notify.success(opts.messages.formRendered);\n } else {\n formRender.markup = rendered.map(function(elem) {\n return elem.innerHTML;\n }).join('');\n }\n } else {\n let noData = utils.markup('div', opts.messages.noFormData, {\n className: 'no-form-data'\n });\n rendered.push(noData);\n opts.notify.error(opts.messages.noFormData);\n }\n\n return formRender;\n}\n\n(function($) {\n 'use strict';\n\n $.fn.formRender = function(options) {\n this.each(function() {\n let formRender = new FormRenderFn(options, this);\n return formRender;\n });\n };\n\n})(jQuery);\n","(function($) {\n 'use strict';\n\n var Toggle = function(element, options) {\n\n var defaults = {\n theme: 'fresh',\n messages: {\n off: 'Off',\n on: 'On'\n }\n };\n\n var opts = $.extend(defaults, options),\n $kcToggle = $('
    ').insertAfter(element).append(element);\n\n $kcToggle.toggleClass('on', element.is(':checked'));\n\n var kctOn = `
    ${opts.messages.on}
    `,\n kctOff = `
    ${opts.messages.off}
    `,\n kctHandle = '
    ',\n kctInner = `
    ${kctOn}${kctHandle}${kctOff}
    `;\n\n $kcToggle.append(kctInner);\n\n $kcToggle.click(function() {\n element.attr('checked', !element.attr('checked'));\n $(this).toggleClass('on');\n });\n\n };\n\n $.fn.kcToggle = function(options) {\n var toggle = this;\n return toggle.each(function() {\n var element = $(this);\n if (element.data('kcToggle')) {\n return;\n }\n var kcToggle = new Toggle(element, options);\n element.data('kcToggle', kcToggle);\n });\n };\n\n})(jQuery);\n","'use strict';\n\n// Element.remove() polyfill\n\nif (!('remove' in Element.prototype)) {\n Element.prototype.remove = function () {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n };\n}\n\n// Event polyfill\nif (typeof Event !== 'function') {\n (function () {\n window.Event = function (evt) {\n var event = document.createEvent('Event');\n event.initEvent(evt, true, true);\n return event;\n };\n })();\n}\n\n// Object.assign polyfill\nif (typeof Object.assign != 'function') {\n Object.assign = function (target) {\n 'use strict';\n\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n target = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source != null) {\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n }\n return target;\n };\n}\n'use strict';\n\n(function ($) {\n 'use strict';\n\n var Toggle = function Toggle(element, options) {\n\n var defaults = {\n theme: 'fresh',\n messages: {\n off: 'Off',\n on: 'On'\n }\n };\n\n var opts = $.extend(defaults, options),\n $kcToggle = $('
    ').insertAfter(element).append(element);\n\n $kcToggle.toggleClass('on', element.is(':checked'));\n\n var kctOn = '
    ' + opts.messages.on + '
    ',\n kctOff = '
    ' + opts.messages.off + '
    ',\n kctHandle = '
    ',\n kctInner = '
    ' + kctOn + kctHandle + kctOff + '
    ';\n\n $kcToggle.append(kctInner);\n\n $kcToggle.click(function () {\n element.attr('checked', !element.attr('checked'));\n $(this).toggleClass('on');\n });\n };\n\n $.fn.kcToggle = function (options) {\n var toggle = this;\n return toggle.each(function () {\n var element = $(this);\n if (element.data('kcToggle')) {\n return;\n }\n var kcToggle = new Toggle(element, options);\n element.data('kcToggle', kcToggle);\n });\n };\n})(jQuery);\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar fbUtils = {};\n\n// cleaner syntax for testing indexOf element\nfbUtils.inArray = function (needle, haystack) {\n return haystack.indexOf(needle) !== -1;\n};\n\n/**\n * Remove null or undefined values\n * @param {Object} attrs {attrName: attrValue}\n * @return {Object} Object trimmed of null or undefined values\n */\nfbUtils.trimObj = function (attrs) {\n var xmlRemove = [null, undefined, '', false, 'false'];\n for (var attr in attrs) {\n if (fbUtils.inArray(attrs[attr], xmlRemove)) {\n delete attrs[attr];\n } else if (Array.isArray(attrs[attr])) {\n if (!attrs[attr].length) {\n delete attrs[attr];\n }\n }\n }\n\n return attrs;\n};\n\n/**\n * Test if attribute is a valid HTML attribute\n * @param {String} attr\n * @return {Boolean}\n */\nfbUtils.validAttr = function (attr) {\n var invalid = ['values', 'enableOther', 'other', 'label',\n // 'style',\n 'subtype'];\n return !fbUtils.inArray(attr, invalid);\n};\n\n/**\n * Convert an attrs object into a string\n *\n * @param {Object} attrs object of attributes for markup\n * @return {string}\n */\nfbUtils.attrString = function (attrs) {\n var attributes = [];\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr) && fbUtils.validAttr(attr)) {\n attr = fbUtils.safeAttr(attr, attrs[attr]);\n attributes.push(attr.name + attr.value);\n }\n }\n return attributes.join(' ');\n};\n\n/**\n * Convert attributes to markup safe strings\n * @param {String} name attribute name\n * @param {String} value attribute value\n * @return {Object} {attrName: attrValue}\n */\nfbUtils.safeAttr = function (name, value) {\n name = fbUtils.safeAttrName(name);\n var valString = void 0;\n\n if (value) {\n if (Array.isArray(value)) {\n valString = fbUtils.escapeAttr(value.join(' '));\n } else {\n if (typeof value === 'boolean') {\n value = value.toString();\n }\n valString = fbUtils.escapeAttr(value.replace(',', ' ').trim());\n }\n }\n\n value = value ? '=\"' + valString + '\"' : '';\n return {\n name: name,\n value: value\n };\n};\n\nfbUtils.safeAttrName = function (name) {\n var safeAttr = {\n className: 'class'\n };\n\n return safeAttr[name] || fbUtils.hyphenCase(name);\n};\n\n/**\n * Convert strings into lowercase-hyphen\n *\n * @param {String} str\n * @return {String}\n */\nfbUtils.hyphenCase = function (str) {\n str = str.replace(/[^\\w\\s\\-]/gi, '');\n str = str.replace(/([A-Z])/g, function ($1) {\n return '-' + $1.toLowerCase();\n });\n\n return str.replace(/\\s/g, '-').replace(/^-+/g, '');\n};\n\n/**\n * convert a hyphenated string to camelCase\n * @param {String} str\n * @return {String}\n */\nfbUtils.camelCase = function (str) {\n return str.replace(/-([a-z])/g, function (m, w) {\n return w.toUpperCase();\n });\n};\n\n/**\n * Generate markup wrapper where needed\n *\n * @param {string} tag\n * @param {String|Array|Object} content we wrap this\n * @param {Object} attrs\n * @return {String}\n */\nfbUtils.markup = function (tag) {\n var content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var contentType = void 0,\n field = document.createElement(tag),\n getContentType = function getContentType(content) {\n return Array.isArray(content) ? 'array' : typeof content === 'undefined' ? 'undefined' : _typeof(content);\n },\n appendContent = {\n string: function string(content) {\n field.innerHTML = content;\n },\n object: function object(content) {\n return field.appendChild(content);\n },\n array: function array(content) {\n for (var i = 0; i < content.length; i++) {\n contentType = getContentType(content[i]);\n appendContent[contentType](content[i]);\n }\n }\n };\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n var name = fbUtils.safeAttrName(attr);\n field.setAttribute(name, attrs[attr]);\n }\n }\n\n contentType = getContentType(content);\n\n if (content) {\n appendContent[contentType].call(this, content);\n }\n\n return field;\n};\n\n/**\n * Convert html element attributes to key/value object\n * @param {Object} DOM element\n * @return {Object} ex: {attrName: attrValue}\n */\nfbUtils.parseAttrs = function (elem) {\n var attrs = elem.attributes;\n var data = {};\n fbUtils.forEach(attrs, function (attr) {\n var attrVal = attrs[attr].value;\n if (attrVal.match(/false|true/g)) {\n attrVal = attrVal === 'true';\n } else if (attrVal.match(/undefined/g)) {\n attrVal = undefined;\n }\n\n if (attrVal) {\n data[attrs[attr].name] = attrVal;\n }\n });\n\n return data;\n};\n\n/**\n * Convert field options to optionData\n * @param {Object} DOM element\n * @return {Array} optionData array\n */\nfbUtils.parseOptions = function (field) {\n var options = field.getElementsByTagName('option'),\n optionData = {},\n data = [];\n\n if (options.length) {\n for (var i = 0; i < options.length; i++) {\n optionData = fbUtils.parseAttrs(options[i]);\n optionData.label = options[i].textContent;\n data.push(optionData);\n }\n }\n\n return data;\n};\n\n/**\n * Parse XML formData\n * @param {String} xmlString\n * @return {Array} formData array\n */\nfbUtils.parseXML = function (xmlString) {\n var parser = new window.DOMParser();\n var xml = parser.parseFromString(xmlString, 'text/xml'),\n formData = [];\n\n if (xml) {\n var fields = xml.getElementsByTagName('field');\n for (var i = 0; i < fields.length; i++) {\n var fieldData = fbUtils.parseAttrs(fields[i]);\n var nodeChildren = fields[i].children || [];\n\n if (nodeChildren.length) {\n fieldData.values = fbUtils.parseOptions(fields[i]);\n }\n\n formData.push(fieldData);\n }\n }\n\n return formData;\n};\n\n/**\n * Escape markup so it can be displayed rather than rendered\n * @param {String} html markup\n * @return {String} escaped html\n */\nfbUtils.escapeHtml = function (html) {\n var escapeElement = document.createElement('textarea');\n escapeElement.textContent = html;\n return escapeElement.innerHTML;\n};\n\n// Escape an attribute\nfbUtils.escapeAttr = function (str) {\n var match = {\n '\"': '"',\n '&': '&',\n '<': '<',\n '>': '>'\n };\n\n function replaceTag(tag) {\n return match[tag] || tag;\n }\n\n return typeof str === 'string' ? str.replace(/[\"&<>]/g, replaceTag) : str;\n};\n\n// Escape attributes\nfbUtils.escapeAttrs = function (attrs) {\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n attrs[attr] = fbUtils.escapeAttr(attrs[attr]);\n }\n }\n\n return attrs;\n};\n\n// forEach that can be used on nodeList\nfbUtils.forEach = function (array, callback, scope) {\n for (var i = 0; i < array.length; i++) {\n callback.call(scope, i, array[i]); // passes back stuff we need\n }\n};\n\n/**\n * Remove duplicates from an array of elements\n * @param {Array} arrArg array with possible duplicates\n * @return {Array} array with only unique values\n */\nfbUtils.unique = function (array) {\n return array.filter(function (elem, pos, arr) {\n return arr.indexOf(elem) === pos;\n });\n};\n\n/**\n * Generate preview markup\n * @param {object} fieldData\n * @return {string} preview markup for field\n */\nfbUtils.fieldRender = function (fieldData, opts) {\n var preview = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var fieldMarkup = '',\n fieldLabel = '',\n optionsMarkup = '',\n fieldLabelText = fieldData.label || '',\n fieldDesc = fieldData.description || '',\n fieldRequired = '',\n fieldOptions = fieldData.values;\n\n fieldData.name = preview ? fieldData.name + '-preview' : fieldData.name;\n fieldData.id = fieldData.name;\n fieldData.name = fieldData.multiple ? fieldData.name + '[]' : fieldData.name;\n\n fieldData.type = fieldData.subtype || fieldData.type;\n\n if (fieldData.required) {\n fieldData.required = null;\n fieldData['aria-required'] = 'true';\n fieldRequired = '*';\n }\n\n if (fieldData.type !== 'hidden') {\n if (fieldDesc) {\n fieldDesc = '?';\n }\n fieldLabel = '';\n }\n\n var fieldLabelVal = fieldData.label;\n\n delete fieldData.label;\n delete fieldData.description;\n\n var fieldDataString = fbUtils.attrString(fieldData);\n\n switch (fieldData.type) {\n case 'textarea':\n case 'rich-text':\n {\n delete fieldData.type;\n var fieldVal = fieldData.value || '';\n fieldMarkup = fieldLabel + '';\n break;\n }\n case 'select':\n var optionAttrsString;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldOptions) {\n\n if (fieldData.placeholder) {\n optionsMarkup += '';\n }\n\n for (var i = 0; i < fieldOptions.length; i++) {\n if (!fieldOptions[i].selected || fieldData.placeholder) {\n delete fieldOptions[i].selected;\n }\n if (!fieldOptions[i].label) {\n fieldOptions[i].label = '';\n }\n optionAttrsString = fbUtils.attrString(fieldOptions[i]);\n optionsMarkup += '';\n }\n }\n\n fieldMarkup = fieldLabel + '';\n break;\n case 'checkbox-group':\n case 'radio-group':\n {\n var optionAttrs = void 0;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldData.type === 'checkbox') {\n fieldData.name = fieldData.name + '[]';\n }\n\n if (fieldOptions) {\n var _optionAttrsString = void 0;\n\n for (var _i = 0; _i < fieldOptions.length; _i++) {\n optionAttrs = Object.assign({ value: '', label: '' }, fieldData, fieldOptions[_i]);\n\n if (optionAttrs.selected) {\n delete optionAttrs.selected;\n optionAttrs.checked = null;\n }\n\n optionAttrs.id = fieldData.id + '-' + _i;\n _optionAttrsString = fbUtils.attrString(optionAttrs);\n optionsMarkup += '
    ';\n }\n\n if (fieldData.other) {\n var otherOptionAttrs = {\n id: fieldData.id + '-' + 'other',\n className: fieldData.className + ' other-option',\n onclick: 'fbUtils.otherOptionCB(\\'' + fieldData.id + '-other\\')'\n };\n\n _optionAttrsString = fbUtils.attrString(Object.assign({}, fieldData, otherOptionAttrs));\n\n optionsMarkup += ' ';\n }\n }\n fieldMarkup = fieldLabel + '
    ' + optionsMarkup + '
    ';\n break;\n }\n case 'text':\n case 'password':\n case 'email':\n case 'number':\n case 'file':\n case 'hidden':\n case 'date':\n case 'tel':\n case 'autocomplete':\n fieldMarkup = fieldLabel + ' ';\n break;\n case 'color':\n fieldMarkup = fieldLabel + ' ' + opts.messages.selectColor;\n break;\n case 'button':\n case 'submit':\n fieldMarkup = '';\n break;\n case 'checkbox':\n fieldMarkup = ' ' + fieldLabel;\n\n if (fieldData.toggle) {\n setTimeout(function () {\n $(document.getElementById(fieldData.id)).kcToggle();\n }, 100);\n }\n break;\n default:\n fieldMarkup = '<' + fieldData.type + ' ' + fieldDataString + '>' + fieldLabelVal + '';\n }\n\n if (fieldData.type !== 'hidden') {\n var className = fieldData.id ? 'fb-' + fieldData.type + ' form-group field-' + fieldData.id : '';\n fieldMarkup = fbUtils.markup('div', fieldMarkup, {\n className: className\n });\n } else {\n fieldMarkup = fbUtils.markup('input', null, fieldData);\n }\n\n return fieldMarkup;\n};\n\n/**\n * Callback for other option.\n * Toggles the hidden text area for \"other\" option.\n * @param {String} otherId id of the \"other\" option input\n */\nfbUtils.otherOptionCB = function (otherId) {\n var otherInput = document.getElementById(otherId),\n otherInputValue = document.getElementById(otherId + '-value');\n\n if (otherInput.checked) {\n otherInput.style.display = 'none';\n otherInputValue.style.display = 'inline-block';\n } else {\n otherInput.style.display = 'inline-block';\n otherInputValue.style.display = 'none';\n }\n};\n\n/**\n * Capitalizes a string\n * @param {String} str uncapitalized string\n * @return {String} str capitalized string\n */\nfbUtils.capitalize = function (str) {\n return str.replace(/\\b\\w/g, function (m) {\n return m.toUpperCase();\n });\n};\n'use strict';\n\n/*global fbUtils*/\n// render the formBuilder XML into html\nfunction FormRenderFn(options, element) {\n 'use strict';\n\n var utils = fbUtils;\n\n var formRender = this,\n defaults = {\n destroyTemplate: true, // @todo\n container: false,\n dataType: 'xml',\n formData: false,\n messages: {\n formRendered: 'Form Rendered',\n noFormData: 'No form data.',\n other: 'Other',\n selectColor: 'Select Color'\n },\n onRender: function onRender() {},\n render: true,\n notify: {\n error: function error(message) {\n return console.error(message);\n },\n success: function success(message) {\n return console.log(message);\n },\n warning: function warning(message) {\n return console.warn(message);\n }\n }\n };\n\n var opts = $.extend(true, defaults, options);\n\n (function () {\n if (!opts.formData) {\n return false;\n }\n\n var setData = {\n xml: function xml(formData) {\n return utils.parseXML(formData);\n },\n json: function json(formData) {\n return window.JSON.parse(formData);\n }\n };\n\n opts.formData = setData[opts.dataType](opts.formData) || false;\n })();\n\n /**\n * Extend Element prototype to allow us to append fields\n *\n * @param {Object} fields Node elements\n */\n Element.prototype.appendFormFields = function (fields) {\n var element = this;\n fields.forEach(function (field) {\n return element.appendChild(field);\n });\n };\n\n /**\n * Extend Element prototype to remove content\n */\n Element.prototype.emptyContainer = function () {\n var element = this;\n while (element.lastChild) {\n element.removeChild(element.lastChild);\n }\n };\n\n var runCallbacks = function runCallbacks() {\n if (opts.onRender) {\n opts.onRender();\n }\n };\n\n var santizeField = function santizeField(field) {\n var sanitizedField = Object.assign({}, field);\n sanitizedField.className = field.className || field.class || null;\n delete sanitizedField.class;\n\n if (field.values) {\n field.values = field.values.map(function (option) {\n return utils.trimObj(option);\n });\n }\n\n return utils.trimObj(sanitizedField);\n };\n\n // Begin the core plugin\n var rendered = [];\n\n // generate field markup if we have fields\n if (opts.formData) {\n for (var i = 0; i < opts.formData.length; i++) {\n var sanitizedField = santizeField(opts.formData[i]);\n rendered.push(utils.fieldRender(sanitizedField, opts));\n }\n\n if (opts.render) {\n if (opts.container) {\n var renderedFormWrap = utils.markup('div', rendered, { className: 'rendered-form' });\n opts.container = opts.container instanceof jQuery ? opts.container[0] : opts.container;\n opts.container.emptyContainer();\n opts.container.appendChild(renderedFormWrap);\n } else if (element) {\n element.emptyContainer();\n element.appendFormFields(rendered);\n }\n\n runCallbacks();\n opts.notify.success(opts.messages.formRendered);\n } else {\n formRender.markup = rendered.map(function (elem) {\n return elem.innerHTML;\n }).join('');\n }\n } else {\n var noData = utils.markup('div', opts.messages.noFormData, {\n className: 'no-form-data'\n });\n rendered.push(noData);\n opts.notify.error(opts.messages.noFormData);\n }\n\n return formRender;\n}\n\n(function ($) {\n 'use strict';\n\n $.fn.formRender = function (options) {\n this.each(function () {\n var formRender = new FormRenderFn(options, this);\n return formRender;\n });\n };\n})(jQuery);","'use strict';\n\nconst fbUtils = {};\n\n// cleaner syntax for testing indexOf element\nfbUtils.inArray = function(needle, haystack) {\n return haystack.indexOf(needle) !== -1;\n};\n\n/**\n * Remove null or undefined values\n * @param {Object} attrs {attrName: attrValue}\n * @return {Object} Object trimmed of null or undefined values\n */\nfbUtils.trimObj = function(attrs) {\n let xmlRemove = [\n null,\n undefined,\n '',\n false,\n 'false'\n ];\n for (var attr in attrs) {\n if (fbUtils.inArray(attrs[attr], xmlRemove)) {\n delete attrs[attr];\n } else if (Array.isArray(attrs[attr])) {\n if (!attrs[attr].length) {\n delete attrs[attr];\n }\n }\n }\n\n return attrs;\n};\n\n/**\n * Test if attribute is a valid HTML attribute\n * @param {String} attr\n * @return {Boolean}\n */\nfbUtils.validAttr = function(attr) {\n let invalid = [\n 'values',\n 'enableOther',\n 'other',\n 'label',\n // 'style',\n 'subtype'\n ];\n return !fbUtils.inArray(attr, invalid);\n};\n\n/**\n * Convert an attrs object into a string\n *\n * @param {Object} attrs object of attributes for markup\n * @return {string}\n */\nfbUtils.attrString = function(attrs) {\n let attributes = [];\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr) && fbUtils.validAttr(attr)) {\n attr = fbUtils.safeAttr(attr, attrs[attr]);\n attributes.push(attr.name + attr.value);\n }\n }\n return attributes.join(' ');\n};\n\n/**\n * Convert attributes to markup safe strings\n * @param {String} name attribute name\n * @param {String} value attribute value\n * @return {Object} {attrName: attrValue}\n */\nfbUtils.safeAttr = function(name, value) {\n name = fbUtils.safeAttrName(name);\n let valString;\n\n if (value) {\n if (Array.isArray(value)) {\n valString = fbUtils.escapeAttr(value.join(' '))\n } else {\n if (typeof(value) === 'boolean') {\n value = value.toString();\n }\n valString = fbUtils.escapeAttr(value.replace(',', ' ').trim());\n }\n }\n\n value = value ? `=\"${valString}\"` : '';\n return {\n name,\n value\n };\n};\n\nfbUtils.safeAttrName = function(name) {\n let safeAttr = {\n className: 'class'\n };\n\n return safeAttr[name] || fbUtils.hyphenCase(name);\n};\n\n/**\n * Convert strings into lowercase-hyphen\n *\n * @param {String} str\n * @return {String}\n */\nfbUtils.hyphenCase = (str) => {\n str = str.replace(/[^\\w\\s\\-]/gi, '');\n str = str.replace(/([A-Z])/g, function($1) {\n return '-' + $1.toLowerCase();\n });\n\n return str.replace(/\\s/g, '-').replace(/^-+/g, '');\n};\n\n/**\n * convert a hyphenated string to camelCase\n * @param {String} str\n * @return {String}\n */\nfbUtils.camelCase = (str) => {\n return str.replace(/-([a-z])/g, function(m, w) {\n return w.toUpperCase();\n });\n};\n\n/**\n * Generate markup wrapper where needed\n *\n * @param {string} tag\n * @param {String|Array|Object} content we wrap this\n * @param {Object} attrs\n * @return {String}\n */\nfbUtils.markup = function(tag, content = '', attrs = {}) {\n let contentType,\n field = document.createElement(tag),\n getContentType = function(content) {\n return Array.isArray(content) ? 'array' : typeof content;\n },\n appendContent = {\n string: function(content) {\n field.innerHTML = content;\n },\n object: function(content) {\n return field.appendChild(content);\n },\n array: function(content) {\n for (var i = 0; i < content.length; i++) {\n contentType = getContentType(content[i]);\n appendContent[contentType](content[i]);\n }\n }\n };\n\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n let name = fbUtils.safeAttrName(attr);\n field.setAttribute(name, attrs[attr]);\n }\n }\n\n contentType = getContentType(content);\n\n if (content) {\n appendContent[contentType].call(this, content);\n }\n\n return field;\n};\n\n/**\n * Convert html element attributes to key/value object\n * @param {Object} DOM element\n * @return {Object} ex: {attrName: attrValue}\n */\nfbUtils.parseAttrs = function(elem) {\n var attrs = elem.attributes;\n var data = {};\n fbUtils.forEach(attrs, attr => {\n let attrVal = attrs[attr].value;\n if (attrVal.match(/false|true/g)) {\n attrVal = (attrVal === 'true');\n } else if (attrVal.match(/undefined/g)) {\n attrVal = undefined;\n }\n\n if (attrVal) {\n data[attrs[attr].name] = attrVal;\n }\n\n });\n\n return data;\n};\n\n/**\n * Convert field options to optionData\n * @param {Object} DOM element\n * @return {Array} optionData array\n */\nfbUtils.parseOptions = function(field) {\n let options = field.getElementsByTagName('option'),\n optionData = {},\n data = [];\n\n if (options.length) {\n for (var i = 0; i < options.length; i++) {\n optionData = fbUtils.parseAttrs(options[i]);\n optionData.label = options[i].textContent;\n data.push(optionData);\n }\n }\n\n return data;\n};\n\n/**\n * Parse XML formData\n * @param {String} xmlString\n * @return {Array} formData array\n */\nfbUtils.parseXML = function(xmlString) {\n const parser = new window.DOMParser();\n let xml = parser.parseFromString(xmlString, 'text/xml'),\n formData = [];\n\n if (xml) {\n var fields = xml.getElementsByTagName('field');\n for (var i = 0; i < fields.length; i++) {\n let fieldData = fbUtils.parseAttrs(fields[i]);\n let nodeChildren = fields[i].children || [];\n\n if (nodeChildren.length) {\n fieldData.values = fbUtils.parseOptions(fields[i]);\n }\n\n formData.push(fieldData);\n }\n }\n\n return formData;\n};\n\n/**\n * Escape markup so it can be displayed rather than rendered\n * @param {String} html markup\n * @return {String} escaped html\n */\nfbUtils.escapeHtml = function(html) {\n var escapeElement = document.createElement('textarea');\n escapeElement.textContent = html;\n return escapeElement.innerHTML;\n};\n\n// Escape an attribute\nfbUtils.escapeAttr = function(str) {\n var match = {\n '\"': '"',\n '&': '&',\n '<': '<',\n '>': '>'\n };\n\n function replaceTag(tag) {\n return match[tag] || tag;\n }\n\n return (typeof str === 'string') ? str.replace(/[\"&<>]/g, replaceTag) : str;\n};\n\n// Escape attributes\nfbUtils.escapeAttrs = function(attrs) {\n for (var attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n attrs[attr] = fbUtils.escapeAttr(attrs[attr]);\n }\n }\n\n return attrs;\n};\n\n// forEach that can be used on nodeList\nfbUtils.forEach = function(array, callback, scope) {\n for (var i = 0; i < array.length; i++) {\n callback.call(scope, i, array[i]); // passes back stuff we need\n }\n};\n\n/**\n * Remove duplicates from an array of elements\n * @param {Array} arrArg array with possible duplicates\n * @return {Array} array with only unique values\n */\nfbUtils.unique = function(array) {\n return array.filter((elem, pos, arr) => {\n return arr.indexOf(elem) === pos;\n });\n};\n\n/**\n * Generate preview markup\n * @param {object} fieldData\n * @return {string} preview markup for field\n */\nfbUtils.fieldRender = function(fieldData, opts, preview = false) {\n var fieldMarkup = '',\n fieldLabel = '',\n optionsMarkup = '',\n fieldLabelText = fieldData.label || '',\n fieldDesc = fieldData.description || '',\n fieldRequired = '',\n fieldOptions = fieldData.values;\n\n fieldData.name = preview ? fieldData.name + '-preview' : fieldData.name;\n fieldData.id = fieldData.name;\n fieldData.name = fieldData.multiple ? fieldData.name + '[]' : fieldData.name;\n\n fieldData.type = fieldData.subtype || fieldData.type;\n\n if (fieldData.required) {\n fieldData.required = null;\n fieldData['aria-required'] = 'true';\n fieldRequired = '*';\n }\n\n if (fieldData.type !== 'hidden') {\n if (fieldDesc) {\n fieldDesc = `?`;\n }\n fieldLabel = ``;\n }\n\n var fieldLabelVal = fieldData.label;\n\n delete fieldData.label;\n delete fieldData.description;\n\n var fieldDataString = fbUtils.attrString(fieldData);\n\n switch (fieldData.type) {\n case 'textarea':\n case 'rich-text': {\n delete fieldData.type;\n let fieldVal = fieldData.value || '';\n fieldMarkup = `${fieldLabel}`;\n break;\n }\n case 'select':\n var optionAttrsString;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldOptions) {\n\n if (fieldData.placeholder) {\n optionsMarkup += ``;\n }\n\n for (let i = 0; i < fieldOptions.length; i++) {\n if (!fieldOptions[i].selected || fieldData.placeholder) {\n delete fieldOptions[i].selected;\n }\n if (!fieldOptions[i].label) {\n fieldOptions[i].label = '';\n }\n optionAttrsString = fbUtils.attrString(fieldOptions[i]);\n optionsMarkup += ``;\n }\n }\n\n fieldMarkup = `${fieldLabel}`;\n break;\n case 'checkbox-group':\n case 'radio-group': {\n let optionAttrs;\n fieldData.type = fieldData.type.replace('-group', '');\n\n if (fieldData.type === 'checkbox') {\n fieldData.name = fieldData.name + '[]';\n }\n\n if (fieldOptions) {\n let optionAttrsString;\n\n for (let i = 0; i < fieldOptions.length; i++) {\n optionAttrs = Object.assign({value: '', label: ''}, fieldData, fieldOptions[i]);\n\n if (optionAttrs.selected) {\n delete optionAttrs.selected;\n optionAttrs.checked = null;\n }\n\n optionAttrs.id = fieldData.id + '-' + i;\n optionAttrsString = fbUtils.attrString(optionAttrs);\n optionsMarkup += `
    `;\n }\n\n if (fieldData.other) {\n let otherOptionAttrs = {\n id: fieldData.id + '-' + 'other',\n className: fieldData.className + ' other-option',\n onclick: `fbUtils.otherOptionCB('${fieldData.id}-other')`\n };\n\n optionAttrsString = fbUtils.attrString(Object.assign({}, fieldData, otherOptionAttrs));\n\n optionsMarkup += ` `;\n }\n\n }\n fieldMarkup = `${fieldLabel}
    ${optionsMarkup}
    `;\n break;\n }\n case 'text':\n case 'password':\n case 'email':\n case 'number':\n case 'file':\n case 'hidden':\n case 'date':\n case 'tel':\n case 'autocomplete':\n fieldMarkup = `${fieldLabel} `;\n break;\n case 'color':\n fieldMarkup = `${fieldLabel} ${opts.messages.selectColor}`;\n break;\n case 'button':\n case 'submit':\n fieldMarkup = ``;\n break;\n case 'checkbox':\n fieldMarkup = ` ${fieldLabel}`;\n\n if (fieldData.toggle) {\n setTimeout(function() {\n $(document.getElementById(fieldData.id)).kcToggle();\n }, 100);\n }\n break;\n default:\n fieldMarkup = `<${fieldData.type} ${fieldDataString}>${fieldLabelVal}`;\n }\n\n if (fieldData.type !== 'hidden') {\n let className = fieldData.id ? `fb-${fieldData.type} form-group field-${fieldData.id}` : '';\n fieldMarkup = fbUtils.markup('div', fieldMarkup, {\n className: className\n });\n } else {\n fieldMarkup = fbUtils.markup('input', null, fieldData);\n }\n\n return fieldMarkup;\n };\n\n/**\n * Callback for other option.\n * Toggles the hidden text area for \"other\" option.\n * @param {String} otherId id of the \"other\" option input\n */\nfbUtils.otherOptionCB = (otherId) => {\n let otherInput = document.getElementById(otherId),\n otherInputValue = document.getElementById(`${otherId}-value`);\n\n if (otherInput.checked) {\n otherInput.style.display = 'none';\n otherInputValue.style.display = 'inline-block';\n } else {\n otherInput.style.display = 'inline-block';\n otherInputValue.style.display = 'none';\n }\n};\n\n/**\n * Capitalizes a string\n * @param {String} str uncapitalized string\n * @return {String} str capitalized string\n */\nfbUtils.capitalize = (str) => {\n return str.replace(/\\b\\w/g, function(m) {\n return m.toUpperCase();\n });\n};\n"]} \ No newline at end of file