%PDF- %PDF-
Direktori : /home/bitrix/www/local/templates/landing24/assets/js/helpers/ |
Current File : //home/bitrix/www/local/templates/landing24/assets/js/helpers/form_init.js |
;(function () { "use strict"; BX.addCustomEvent("BX.Landing.Block:init", function (event) { var selector = event.makeRelativeSelector(".bitrix24forms"); if (event.block.querySelectorAll(selector).length > 0) { if (typeof(window["landingForms"]) == 'undefined') { window["landingForms"] = {}; } window["landingForms"][event.block.id] = new LandingForm(selector, event.block); window["landingForms"][event.block.id].initForm(); } }); // reinit form with new style - if it needed BX.addCustomEvent("BX.Landing.Block:updateStyle", function (event) { var selector = event.makeRelativeSelector(".bitrix24forms"); if (event.block.querySelectorAll(selector).length > 0) { var currentForm = window["landingForms"][event.block.id]; if (typeof(event.node) != 'undefined' && typeof(event.data) != 'undefined' && typeof(currentForm) != 'undefined') { // recreate styles if needed, Use just first node if(currentForm.readFormStylesFromNode(event.node[0])) { currentForm.createFormOptions(); currentForm.onFormReloadWithDebounce(); } } } }); // If change form - remove old, create new. If change settings - ewinit form with new view BX.addCustomEvent("BX.Landing.Block:Node:updateAttr", function (event) { var selector = event.makeRelativeSelector(".bitrix24forms"); //if change form - clear form params, but save form options. Use options of prev form if (event.block.querySelectorAll(selector).length > 0) { var currentForm = window["landingForms"][event.block.id]; if (typeof(event.data) != 'undefined' && typeof(currentForm) != 'undefined') { for (var attr in event.data) { attr = attr.replace('data-', ''); // CHANGE form if (attr == currentForm.dataFormId) { currentForm.onFormRemove(); currentForm.initForm(); } // show or not HEADER else if (attr == currentForm.dataAttributeShowHeader) { if ( Object.keys(currentForm.formOptions).length > 0 ) { currentForm.formOptions.css.content = currentForm.matchShowHeader(currentForm.formOptions.css.content); } currentForm.onFormReload(); } // use CUSTOM STYLE of FORM STYLE else if (attr == currentForm.dataAttributeUseStyle) { currentForm.createFormOptions(); currentForm.onFormReload(); } } } } }); // on REMOVE we must remove form from array BX.addCustomEvent("BX.Landing.Block:remove", function (event) { var selector = event.makeRelativeSelector(".bitrix24forms"); if (document.querySelectorAll(selector).length > 0) { var currentForm = window["landingForms"][event.block.id]; if (typeof(currentForm) != 'undefined') { currentForm.onFormRemove(); } delete(window["landingForms"][event.block.id]); } }); var LandingForm = function (selector, block) { this.dataFormId = "b24form"; this.dataAttributeDomain = "b24form-original-domain"; this.dataAttributePrefix = "data-form-style-"; this.dataAttributeUseStyle = "b24form-use-style"; this.dataAttributeShowHeader = "b24form-show-header"; this.dataAttributeIsConnector = "b24form-connector"; this.hideHeaderString = ".crm-webform-header-container{display:none;}"; this.hideBitrixLogoString = ".crm-webform-bottom-link{display:none}.crm-webform-bottom-logo-container{height:0;margin:0;}"; this.paddingFixesString = ".content{min-height:170px;}" + ".crm-webform-fieldset-footer{padding-bottom:0;}" + ".crm-webform-body{padding-bottom:0;padding-top:0;}" + ".content-wrap{padding-bottom:0;}" + ".crm-webform-block.crm-webform-default{margin-bottom:0;}"; this.block = block; this.selector = selector; this.iframe = null; //will be determinate when frame initialized // initialize form loader only in first run var domainNode = BX.findChild(this.block, {'attribute': 'data-' + this.dataAttributeDomain}, true, false); if (domainNode && this.isFormChosen()) { this.domain = BX.data(domainNode, this.dataAttributeDomain); this.initFormLoader(window, document, this.createFullDomain() + '/bitrix/js/crm/form_loader.js', 'b24form'); } // what style may find in block // format data-attribute: param: style name in BX.style this.styleParams = { 'wrapper-padding': {'params': ['padding-top']}, 'bg': {'params': ['background-color', 'background-image']}, 'bg-content': {'params': ['background-color']}, 'bg-block': {'params': ['background-color']}, 'main-bg': {'params': ['background-color']}, 'main-border-color': {'params': ['border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color']}, 'main-font-family': {'params': ['font-family']}, 'main-font-color': {'params': ['color']}, 'main-font-color-hover': {'params': ['color']}, 'main-font-weight': {'params': ['font-weight']}, 'second-font-color': {'params': ['color']}, 'icon-font-color': {'params': ['color']}, 'button-font-color': {'params': ['color']}, 'header-font-size': {'params': ['font-size']}, 'header-font-weight': {'params': ['font-weight']}, 'header-text-font-size': {'params': ['font-size']}, 'label-font-size': {'params': ['font-size']}, 'border-block': { 'params': [ 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color', 'border-top-style', 'border-bottom-style', 'border-left-style', 'border-right-style', 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width' ] }, 'input-bg': {'params': ['background-color']}, 'input-box-shadow': {'params': ['box-shadow']}, 'input-select-bg': {'params': ['background-color']}, 'input-border': { 'params': [ 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color', 'border-top-style', 'border-bottom-style', 'border-left-style', 'border-right-style', 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width', 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius' ] }, 'input-border-radius': { 'params': ['border-top-left-radius', 'border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'] }, 'input-border-color': { 'params': ['border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color'] }, 'input-border-hover': { 'params': [ 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color', 'border-top-style', 'border-bottom-style', 'border-left-style', 'border-right-style', 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width' ] }, 'agreement-label-font-size': {'params': ['font-size']} }; // computed styles this.styles = {}; // what class in form may be modify // format class: keys from styles object, they must be attach to class this.selectors = { '.crm-webform-wrapper, .content-wrap': ['wrapper-padding'], 'body.crm-webform-iframe': ['bg'], '.content, .page-theme-transparent .content': ['bg-content'], '.crm-webform-block, .page-theme-transparent .crm-webform-block': ['bg-block', 'border-block'], '.crm-webform-header-container': ['bg-block', 'border-block', 'main-font-family', 'main-font-color', 'main-font-weight', 'header-text-font-size'], '.crm-webform-header-container h2': ['main-font-color', 'bg-block'], '.crm-webform-inner-header': ['main-font-color', 'main-font-family'], '.crm-webform-mini-cart-title, .crm-webform-mini-cart-services-container': ['main-font-color', 'main-font-family'], '.crm-webform-header': ['main-font-family', 'header-font-weight', 'header-font-size'], '.crm-webform-label': ['main-font-family', 'label-font-weight', 'label-font-size', 'second-font-color'], 'button.crm-webform-submit-button, .crm-webform-file-upload .crm-webform-file-button': ['main-bg', 'main-font-family', 'button-font-color', 'input-border-radius'], '.crm-webform-label-content, .crm-webform-file-text-field': ['input-bg'], '.crm-webform-input-label': ['input-box-shadow'], '.crm-webform-input, .crm-webform-file-text-field': ['main-font-family', 'main-font-weight', 'input-border', 'main-font-color'], '.crm-webform-icon': ['input-border-color', 'second-font-color', 'icon-font-color'], '.crm-webform-desktop-font-style a': ['second-font-color'], '.crm-webform-desktop-font-style a:hover': ['main-font-color'], '.crm-webform-input option': ['main-font-family', 'input-select-bg', 'main-font-color'], '.crm-webform-active .crm-webform-input, .crm-webform-active mark, .crm-webform-input:hover': ['input-border-hover'], '.crm-webform-checkbox-container:hover i': ['main-border-color'], '.crm-webform-checkbox-name': ['main-font-family'], '.crm-webform-input+i:after': ['main-font-color-hover'], '.crm-webform-agreement-modifier .crm-webform-checkbox-name': ['agreement-label-font-size'] }; this.formParams = {}; this.formOptions = {}; }; LandingForm.prototype = { // if not set form id - return false isFormChosen: function () { var b24Forms = document.querySelectorAll(this.selector); if (b24Forms.length > 0) { for (var i = 0, c = b24Forms.length; i < c; i++) { if (BX.data(b24Forms[i], this.dataFormId)) { return true; } } } return false; }, initFormLoader: function (w, d, u, b) { // if first run - init form loader if (typeof(w["Bitrix24FormLoaderInitialised"]) == 'undefined' || w["Bitrix24FormLoaderInitialised"] != true) { w['Bitrix24FormObject'] = b; w[b] = w[b] || function () { arguments[0].ref = u; (w[b].forms = w[b].forms || []).push(arguments[0]) }; if (w[b]['forms']) return; var s = d.createElement('script'); var r = 1 * new Date(); s.async = 1; s.src = u + '?' + r; var h = d.getElementsByTagName('script')[0]; h.parentNode.insertBefore(s, h); // check init flag w["Bitrix24FormLoaderInitialised"] = true; } }, initForm: function () { // do nothing if form not chosen if (!this.isFormChosen()) { this.createNoFormMessage(); return; } this.createFormParams(); // apply form options only after frame creating BX.addCustomEvent('onFormFrameLoad', BX.proxy(this.onFormFrameLoad, this)); this.addFormInLoader(); if (typeof(Bitrix24FormLoader) != 'undefined') { // init Bitrix24FormLoader only once! if (typeof(Bitrix24FormLoader.forms) == 'undefined' || Object.keys(Bitrix24FormLoader.forms).length == 0) { Bitrix24FormLoader.init(); } // if Bitrix24FormLoader already init - just load new form else { Bitrix24FormLoader.preLoad(this.formParams); } } }, createNoFormMessage: function () { // show alert only in edit mode if (BX.Landing.getMode() == "view") { return; } var formContainer = document.querySelector(this.selector); if (formContainer) { var alertHtml = '<h2 class="u-form-alert-title">' + '<i class="fa fa-exclamation-triangle g-mr-15"></i>' + BX.message('LANDING_BLOCK_WEBFORM_NO_FORM') + '</h2><hr class="u-form-alert-divider">'; // todo: need correctly check bus or cp, without flag if ( typeof(BX.data(formContainer, this.dataAttributeIsConnector)) != 'undefined' && BX.data(formContainer, this.dataAttributeIsConnector) == 'Y' ) { alertHtml += '<p class="u-form-alert-text">' + BX.message('LANDING_BLOCK_WEBFORM_NO_FORM_BUS') + '</p>' } else { alertHtml += '<p class="u-form-alert-text">' + BX.message('LANDING_BLOCK_WEBFORM_NO_FORM_CP') + '</p>' } var messageNode = BX.create({ tag: 'div', props: {className: 'u-form-alert'}, html: alertHtml }); BX.adjust(formContainer, {children: [messageNode]}); } }, createFormParams: function () { var b24Forms = document.querySelectorAll(this.selector); if (b24Forms.length > 0) { for (var i = 0, c = b24Forms.length; i < c; i++) { var formCode = BX.data(b24Forms[i], this.dataFormId); var formParts = formCode.split('|'); // find lang param from url if exist var formLang = window.location.search.match(new RegExp('user_lang' + '=([^&=]+)')); if (formParts.length === 2) { this.formParams = { id: formParts[0], lang: formLang ? formLang[1] : BX.message('LANGUAGE_ID'), sec: formParts[1], type: 'inline' + '_' + this.block.id, node: b24Forms[i] }; this.createFormOptions(); } } } }, addFormInLoader: function () { if (Object.keys(this.formParams).length != 0) { b24form(this.formParams); } }, removeFormFromLoader: function () { // remove from loader if (!window.Bitrix24FormObject || !window[window.Bitrix24FormObject]) return; if (!window[window.Bitrix24FormObject].forms) return; window[window.Bitrix24FormObject].forms.forEach(function (form, i) { if ( form.id == this.formParams.id && form.node == this.formParams.node && form.sec == this.formParams.sec ) { delete window[window.Bitrix24FormObject].forms[i]; } }, this); }, sendFrameMessage: function (params, uniqueLoadId) { // frame not init yet if (!this.iframe) { return; } var ie = 0 /*@cc_on + @_jscript_version @*/; if (typeof window.postMessage === 'function' && !ie) { // prepare PARAMS if (typeof(params) != 'object') { params = {}; } var messageDomain = (this.createFullDomain() + '/').match(/((http|https):\/\/[^\/]+?)\//)[1]; params.domain = messageDomain; // get id default or from params if (uniqueLoadId === undefined) { uniqueLoadId = this.type + '_' + this.id; } params.uniqueLoadId = uniqueLoadId; //init postMessage this.iframe.contentWindow.postMessage( JSON.stringify(params), messageDomain ); } }, onFormFrameLoad: function (form, uniqueLoadId) { if (form.id == this.formParams.id && form.sec == this.formParams.sec && form.type == this.formParams.type) { // save iframe this.iframe = form.iframe; this.sendFrameMessage({'options': this.formOptions}, uniqueLoadId); } }, onFormRemove: function () { if (typeof(Bitrix24FormLoader) != 'undefined') { Bitrix24FormLoader.unload(this.formParams); } this.removeFormFromLoader(); }, onFormReload: function () { // not need reload duplicate form if (typeof(Bitrix24FormLoader) != 'undefined') { Bitrix24FormLoader.unload(this.formParams); Bitrix24FormLoader.preLoad(this.formParams); } }, /** * To preserve overreloading when style changes * @returns {*} */ onFormReloadWithDebounce: function() { return BX.debounce(this.onFormReload(), 1000, this); }, // if not exist protocol - add default createFullDomain: function () { var fullDomain = this.domain; if (!(this.domain).match(/(http|https):/)) { fullDomain = 'https://' + this.domain; } return fullDomain; }, // may create other options for form, but now - only css createFormOptions: function () { // create options only if need customization if (this.isUsingCustomStyle()) { var cssContent = this.createFormOptionsCss(); var cssFiles = this.createFormOptionsCssFiles(); if (cssContent.length > 0 || cssFiles.length > 0) { this.formOptions.css = { 'content': cssContent, 'file': cssFiles }; } } // clear options else { this.formOptions.css = {content: ''}; } // ALWAYS // show/hide HEADER this.formOptions.css.content = this.matchShowHeader(this.formOptions.css.content); // hide bitrix LABEL this.formOptions.css.content = this.createHideBitrixLabelCss(this.formOptions.css.content); // fixes to form HEIGHT this.formOptions.css.content = this.createPaddingFixesCss(this.formOptions.css.content); }, // dbg need correct font load!!! createFormOptionsCssFiles: function () { var files = []; files.push("https://fonts.googleapis.com/css?family=Ek+Mukta:400,600,700"); files.push("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700"); return files; }, createFormOptionsCss: function () { if (Object.keys(this.styles).length == 0) this.readFormStyles(); var cssString = ""; for (var selector in this.selectors) { var cssStringCurrent = ""; this.selectors[selector].forEach(function (style) { if (typeof(this.styles[style]) != 'undefined') { for (var styleValue in this.styles[style]) { cssStringCurrent += this.styles[style][styleValue].param + ":" + this.styles[style][styleValue].value + ";"; } } }, this); if (cssStringCurrent.length > 0) { cssString += selector + "{" + cssStringCurrent + "}"; } } return cssString; }, // hide "zaryazheno Bitriks 24" createHideBitrixLabelCss: function (string) { string = (typeof(string) == 'undefined') ? '' : string; return string + this.hideBitrixLogoString; }, createPaddingFixesCss: function (string) { string = (typeof(string) == 'undefined') ? '' : string; return string + this.paddingFixesString; }, isUsingCustomStyle: function () { var node = BX.findChild(this.block, {'attribute': 'data-' + this.dataAttributeUseStyle}, true, false); if ( node && typeof(BX.data(node, this.dataAttributeUseStyle)) != 'undefined' && BX.data(node, this.dataAttributeUseStyle) == 'N' ) { return false; } else { return true; } }, matchShowHeader: function (string) { string = (typeof(string) == 'undefined') ? '' : string; var node = BX.findChild(this.block, {'attribute': 'data-' + this.dataAttributeShowHeader}, true, false); if ( node && typeof(BX.data(node, this.dataAttributeShowHeader)) != 'undefined' && BX.data(node, this.dataAttributeShowHeader) == 'N' ) { string += this.hideHeaderString; } else { string = string.replace(this.hideHeaderString, ""); } return string; }, /** * Get computed style from one node by params. Save in styles array * @param node * @param style */ readNodeStyles: function(node, style) { this.styleParams[style].params.forEach(BX.delegate(function (param) { var value = BX.style(node, param); if (value) { if (typeof(this.styles[style]) == 'undefined') { this.styles[style] = {}; } this.styles[style][param] = {param: param, value: value}; } }), this); }, readFormStyles: function () { // dbg: need bx dom write // BX.DOM.read(BX.delegate(function () // { for (var style in this.styleParams) { var node = BX.findChild(this.block, {'attribute': this.dataAttributePrefix + style}, true, false); if (node) { this.readNodeStyles(node, style); } } // }), this); }, /** * return false if styles was changed, or false if not * @param node * @returns {boolean} */ readFormStylesFromNode: function(node) { // check if node have style attrs var change = false; var attrs = node.attributes; for (var i = 0; i < attrs.length; i++) { var attr = attrs[i].name.replace(this.dataAttributePrefix, ''); if(typeof(this.styleParams[attr]) !== 'undefined') { change = true; this.readNodeStyles(node, attr); } } return change; } } })();