(function (window, document, svgCreatorConfig) { var svgCreator = svgCreator || {}; svgCreatorConfig.callbacksTemplate = function () { return { before: [], response: { success: [], error: [] }, ajax: { done: [], fail: [], always: [] } } }; svgCreator.setup = function () { this.btn; this.$doc = $(document); this.$body = this.$doc.find('body'); this.ajaxProgress = false; this.response; this.container = '#sc_container'; this.statuses = { available: 'Свободно', reserved: 'Забронировано', rental: 'Занято', }; this.sendData = { $form: null, action: null, formData: null }; }; svgCreator.load = { config: {}, script: function (url, callback) { var script = document.createElement('script'); if (typeof callback !== 'undefined'){ if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == 'loaded' || script.readyState == 'complete'){ script.onreadystatechange = null; callback(); } }; } else { //Others script.onload = function(){ callback(); }; } } script.src = url + '?v=' + svgCreator.Utils.uniqueid(); document.body.appendChild(script); }, style: function (url) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css' link.href = url + '?v=' + svgCreator.Utils.uniqueid(); document.getElementsByTagName('head')[0].appendChild(link); }, scripts: function () { this.isLoad = true; for (let library in this.config.scripts){ let libdata = this.config.scripts[library]; if (libdata.depend && typeof window[libdata.depend] === 'undefined') continue; let check = typeof (libdata.depend === 'jQuery' ? jQuery.fn[library] : window[library]); if (check === 'undefined'){ this.isLoad = false; if (libdata.loading !== true) { libdata.loading = true; if (libdata.style) this.style(libdata.style); this.script(libdata.url); } } } if (this.isLoad){ svgCreator.initialize(); } else { setTimeout(function() { svgCreator.load.scripts(); }, 50); } }, styles: function () { for (let library in this.config.styles){ this.style(this.config.styles[library]); } }, svg: function (url, event) { svgCreator.Loader.create(); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status !== 200) console.error(xhr.statusText); svgCreator.loadData = xhr.responseXML.querySelector('svg').outerHTML; if (event) event(); svgCreator.Loader.destroy(); } }; xhr.onerror = function (e) { svgCreator.Message.log(xhr.statusText); }; xhr.send(null); }, } svgCreator.initialize = function () { svgCreator.setup(); svgCreator.$container = $(svgCreator.container); if (svgCreator.$container.length < 1) return svgCreator.Message.log('Container is not exist.'); svgCreator.$doc .on('click', ':submit', function (e) { svgCreator.btn = $(this); svgCreator.Form.validate(svgCreator.btn.closest('form'), e) }); svgCreator.Svg.getData() svgCreator.Sms.initialize(); } svgCreator.Svg = { config: { svgContainerId: 'sc_svg_container', svgId: 'sc_svg', svgZoomPanelId: 'sc_svg_zoom', scaleStep: 0.3, maxScale: 5, sensitive: { desktop: 10, mobile: 50, }, }, getData: function () { var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { svgCreator.data = response.data; svgCreator.Block.buildingTabs(response.data.buildings); } svgCreator.Request.toSystem({action: 'getScheme'}, callbacks); }, initialize: function (floor) { this.floor = floor; if (floor.svg === '') return svgCreator.Message.log('SVG file is not isset.'); svgCreator.load.svg(floor.svg, this.onLoadSvg.bind(this)); }, onLoadSvg: function () { this.svgContainer = $('
', {id: this.config.svgContainerId}).appendTo(svgCreator.Block.panel).html(svgCreator.loadData); this.svg = SVG('#' + this.config.svgContainerId + ' svg').attr('id', this.config.svgId); this.h = this.svg.viewbox().h; this.w = this.svg.viewbox().w; this.addPan(); this.addLayers(this.floor.layers); this.addRooms(this.floor.rooms); this.addZoomPanel(); this.scale = this.gestureScale = 1; this.events(); }, addPan: function () { let children = this.svg.children(); this.draw = this.svg.group().addClass('pan'); for (let i of children){ i.addTo(this.draw); } }, addLayers: function (layers) { if (!layers) return; var group = this.draw.group().addClass(this.config.svgId + '_layers'); for (let i of layers){ group.node.innerHTML += i.code; } }, addRooms: function (rooms) { if (!rooms) return; var group = this.draw.group().addClass(this.config.svgId + '_rooms'); for (let i of rooms){ if (!i.code) continue; let container = this.draw.group().addClass(this.config.svgId + '_room').addTo(group); if (typeof i.code === 'string') i.code = [i.code]; for (let code of i.code){ let polygon = this.draw.polygon(code).addTo(container); polygon.attr({class: i.active ? i.status : 'unactive', 'data-id': i.id}); polygon.click(function(){ if (i.status === 'rental' || !i.active) return; svgCreator.Svg.currentRoom = i.id; svgCreator.popup.create(svgCreator.Block.roomInfo(i)); }); } if (i.square !== '' && i.active) { let fs = i.square_fs || 180; let x; let y; let anchor = 'start'; let bl = 'auto'; let lines = 0; let text = this.draw.text(function(add) { if (i.commercial_number){ add.tspan(i.commercial_number); lines++; } add.tspan(i.square + ' м²').newLine() }); let margin = fs * text.leading(); let dy = -1 * margin * lines; switch (i.square_pos){ case 'tr': x = container.x() + container.width() - margin/3; y = container.y() + margin/2; dy = 0; anchor = 'end'; bl = 'hanging'; break; case 'bl': x = container.x() + margin/3; y = container.y() + container.height() - margin/2; break; case 'br': x = container.x() + container.width() - margin/3; y = container.y() + container.height() - margin/2; anchor = 'end'; break; case 'c': x = container.x() + container.width() / 2; y = container.y() + container.height() / 2; dy = dy / 2; anchor = 'middle'; bl = 'central'; break; default: x = container.x() + margin/3; y = container.y() + margin/2; dy = 0; bl = 'hanging'; } text.move(x, y).dy(dy).addTo(container); text.font({'font-size': fs, 'text-anchor': anchor, 'dominant-baseline': bl}); } } }, addZoomPanel: function () { let panel = this.svgContainer.find('#' + this.config.svgZoomPanelId); if (panel.length > 0) return; panel = $('
', {id: this.config.svgZoomPanelId}).appendTo(this.svgContainer); $('', {class: this.config.svgZoomPanelId + '_in'}).appendTo(panel).on('click', () => this.zoomIn()); $('', {class: this.config.svgZoomPanelId + '_out'}).appendTo(panel).on('click', () => this.zoomOut()); }, zoom: function (scale) { if (this.zooming) return; this.zooming = true; this.draw.transform({scale: scale}); this.scale = scale; this.zooming = false; }, zoomIn: function (step = 0) { if (this.scale === this.config.maxScale) return; step = step || this.config.scaleStep; this.zoom(this.scale + step); }, zoomOut: function (step = 0) { if (this.scale <= 1) return; step = step || this.config.scaleStep; this.zoom(this.scale - step); }, scrollLock: function (e, lock) { this.scroll = (typeof lock !== 'undefined') ? lock : !this.scroll; svgCreator.Utils.lockScroll(this.scroll); }, move: function (e) { if (!this.movement) return; e.preventDefault(); e.stopPropagation(); if (e.scale && e.scale !== 1) return this.gesture(e); let viewbox = this.svg.viewbox(); let currentXY = this.getCoordCursor(e); let sensitive = svgCreator.Utils.isMobile() ? this.config.sensitive.mobile : this.config.sensitive.desktop; let cx = viewbox.x - sensitive * (currentXY.x - this.cursor.x); let cy = viewbox.y - sensitive * (currentXY.y - this.cursor.y); this.svg.viewbox(cx, cy, viewbox.w, viewbox.h); this.cursor = this.getCoordCursor(e); }, moveStart: function (e) { if (e.type !== 'mousedown') this.scrollLock(e, true); e.stopPropagation(); this.movement = true; this.cursor = this.getCoordCursor(e); this.svg.addClass('move'); }, moveEnd: function (e) { this.movement = false; this.cursor = null; this.svg.removeClass('move'); if (e.type !== 'mouseup') this.scrollLock(e, false); this.gestureScale = 1; }, gesture: function (e) { let step = 0.05; e.scale > this.gestureScale ? this.zoomIn(step) : this.zoomOut(step); this.gestureScale = e.scale; }, events: function () { this.svg .on('mousedown touchstart', (e) => this.moveStart(e)) .on('mouseup touchend touchcancel', (e) => this.moveEnd(e)) .on('mousemove touchmove', (e) => this.move(e)); }, getCoordCursor: function (e) { return { x: e.touches ? e.touches[0].clientX : e.clientX, y: e.touches ? e.touches[0].clientY : e.clientY, } }, } svgCreator.Block = { config: { active: 'active', panelId: 'sc_panel', roomId: 'sc_popup_room', }, buildingTabs: function (data) { if (!data.length) svgCreator.Message.error('No building data'); let i = data.shift(); let html = `

${i.name}

${svgCreator.Icon.geo}${i.description}

`; if (typeof svgCreatorConfig.buildings !== 'undefined' && svgCreatorConfig.buildings.length){ html += `` } html += `

${svgCreator.Icon.geo}${i.address}

${svgCreator.Icon.class}класс ${i.class}

`; if (i.square) html += `

${svgCreator.Icon.size}S: ${i.square}

`; html += `
`; svgCreator.$container.append(html); this.floorTabs(i.floors); }, floorTabs: function (data) { var tabContainer = $('
', {class: 'sc_floor_tabs'}).appendTo(svgCreator.$container); for (const [idx, i] of Object.entries(data)){ let tab = $('
', {class: 'sc_floor_tab', 'data-id': i.id}).appendTo(tabContainer) .on('click', function (e) { let curr = $(this); let active = svgCreator.Block.config.active; if (curr.hasClass(active)) return; curr.siblings().removeClass(active); curr.addClass(active); svgCreator.Block.contentPanel(i); }); if (idx == 0) { tab.addClass(this.config.active); this.contentPanel(i); } let name = $('

', {class: 'sc_floor_tab_name'}).html(i.name).appendTo(tab); for (let st in svgCreator.statuses) { if (!i.counter || !i.counter[st]) continue; name.attr('data-status', st); break; } $('

', {class: 'sc_floor_tab_status'}).html('Свободно: ' + ((i.counter && i.counter.available) || 0)).appendTo(tab); } tabContainer.before(tabContainer.clone().addClass('clone')); svgCreator.$container.append(` `); }, contentPanel: function (data) { if (typeof this.panel === 'undefined') { this.panel = $('

', {id: this.config.panelId}).appendTo(svgCreator.$container); } else { this.panel.html(''); } this.contentPanelHead(data); svgCreator.Svg.initialize(data); this.contentPanelFoot(data); }, contentPanelHead: function (floor) { let html = `

${floor.name}

    `; if (floor.counter){ for (let i in svgCreator.statuses) { html += `
  • ${svgCreator.statuses[i]}`; if (i !== 'rental') html += `: ${floor.counter[i] ? floor.counter[i] : 0}`; html += '
  • '; } } html += `
`; this.panel.append(html); }, contentPanelFoot: function (floor) { if (!svgCreator.data.manager) return; let footer = $('
', {class: this.config.panelId + '_footer'}).appendTo(this.panel); let btnContainer = $('
', {class: 'sc_buttons'}).appendTo(footer); let result = $('
', {class: this.config.panelId + '_footer_result'}).appendTo(footer); if (floor.rooms) this.floorTable(floor.rooms, result); }, roomInfo: function (room) { let id = this.config.roomId; let html = `

${room.name} ${room.commercial_number ? ' (' + room.commercial_number + ')' : ''}

  • ${svgCreator.Utils.getRuStatus(room.status)}
  • ${svgCreator.Icon.size}${room.square} м²
  • ${svgCreator.Icon.eye}Сейчас смотрят: ${svgCreator.Utils.getRand(2, 4)}
`; if (room.images || room.video) { html += ` `; } let table = ''; let characters = { square: { name: 'Площадь, кв.м' }, type: { name: 'Назначение', }, rate: { name: 'Арендная ставка р./год/кв.м. (без НДС)', hook: svgCreator.Utils.formatPrice, }, rate_mounth: { name: 'Арендная ставка р./мес. (без НДС)', hook: svgCreator.Utils.roundHundred, }, equipment: { name: 'Оборудование', }, furniture: { name: 'Мебель', }, ceiling_height: { name: 'Высота потолков, м', }, plan: { name: 'План помещения', }, decoration: { name: 'Отделка', }, electricity: { name: 'Мощность электричества, кВт', }, margin: { name: 'Обеспечитальный взнос', }, communal_fees: { name: 'Коммунальные платежи', type: 'bool', variants: { 0: 'Не включены', 1: 'Включены' }, }, exp_lease: { name: 'Дата окночания договора аренды', }, description: { name: 'Описание', }, }; for (let field in characters){ var i = characters[field]; if (!room[field] && i.type !== 'bool') continue; let value = i.hook ? i.hook(room[field]) : room[field]; switch (i.type) { case 'bool': value = i.variants[Number(room[field])]; break; } table += `${i.name}:${value}`; } html += `${svgCreator.Actions.buttons()}

Параметры помещения

${table}
`; return html; }, floorTable: function (rooms, container) { html = `
`; for (let i of rooms){ html += ``; } html += `
ID Коммерческий номер Наименование Статус Тип помещения Площадь Арендная ставка
${i.id} ${i.commercial_number || ''} ${i.name} ${svgCreator.statuses[i.status]} ${i.type} ${i.square} ${svgCreator.Utils.formatPrice(i.rate)}
`; container.html(html); this.floorTableEvent(); }, floorTableEvent: function (){ if (this.floorTableEventInit) return; this.floorTableEventInit = true; svgCreator.$body.on('change', '#sc_form_floor_svg input[type=checkbox]', function () { let $inp = $(this); let cls = 'selected'; let method = $inp.prop('checked') ? 'addClass' : 'removeClass'; $('.' + svgCreator.Svg.config.svgId + `_rooms [data-id=${$inp.val()}]`)[method](cls); }); svgCreator.$body.on('submit', '#sc_form_floor_svg', function (e) { e.preventDefault(); var parent = $(this).parent(); let action = svgCreator.btn.val(); var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { parent.html('
Ваш запрос отправлен на почту, которую вы указали.
'); } let data = svgCreator.Request.addList({action: action}, $(this).serialize()); svgCreator.Request.toSystem(data, callbacks); }); }, } svgCreator.Actions = { config: { container: 'sc_actions', forms: 'sc_actions_forms', formRent: 'sc_form_rent', personData: 'sc_person_data', }, buttons: function () { this.initialize(); return `
Арендовать Заказать звонок
`; }, forms: function (html = '') { svgCreator.Utils.scroll('#' + this.config.forms, '#' + svgCreator.popup.config.windowId); $('#' + this.config.forms).html(html); }, rentForm: function () { let html = `

Арендовать

` + svgCreator.Sms.form(this.rentFormFull); this.forms(html); }, rentFormFull: function () { let edo = ''; for (let i of svgCreator.data.edo_user){ edo += ``; } let html = `

Арендовать

Подтвержденный телефон для связи: ${svgCreator.Sms.data.phone}

Ваш статус

Далее

Данные ИНН

Проверить

Данные ЭДО

Если у вас нет ЭДО, нажмите Далее

Далее

Подтверждение данных

Подтверждаю данные Данные неверны
`; svgCreator.Actions.forms(html); }, rentFormStatus: function (data, button, block) { let blockInn = block.next(); let blockEdo = blockInn.next(); let blockLast = blockEdo.next(); let kppInp = blockInn.find('input[name=kpp]'); let innInp = blockInn.find('input[name=inn]'); this.checkInn = false; switch (data.status){ case 'Юр.лицо': blockInn.find('input').prop('disabled', false); kppInp.prop('disabled', false); innInp.data('length', 10); kppInp.show(); break; case 'ИП': blockInn.find('input').prop('disabled', false); kppInp.prop('disabled', true); innInp.data('length', 12); kppInp.hide(); break; case 'Физ.лицо': block.addClass('checked'); blockInn.find('input').prop('disabled', true); blockInn.addClass('checked').removeClass('open'); blockEdo.addClass('checked').removeClass('open'); blockLast.addClass('open'); svgCreator.Utils.scroll(blockLast, '#' + svgCreator.popup.config.windowId); this.checkInn = true; return false; break; } return true; }, rentFormInnBefore: function (data, button, block) { let length = block.find('input[name=inn]').data('length'); if (data.inn.length != length) return svgCreator.Message.error(`Длина поля ИНН должна быть равна ${length} символов`); var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { svgCreator.Actions.rentFormInnAfter(response.data.result, block); } svgCreator.Request.add('action', 'getCompanyByDaData', data); svgCreator.Request.toSystem(data, callbacks); return true; }, rentFormInnAfter: function (result, block) { let html = ''; let blockSuccess = block.next().next(); let options = { 'name|short_with_opf': 'Наименование организации', 'inn': 'ИНН', 'kpp': 'КПП', 'ogrn': 'ОГРН', 'management|name': 'В лице', 'address|value': 'Юридический адрес', 'address|value': 'Фактический адрес', 'emails': 'Эл. почта', }; if (result.length) { html += '
    '; let item = svgCreator.dadata = result[0].data; for (let path in options){ let value = svgCreator.Utils.getValueByPath(path.split('|'), item); if (value === null) continue; html += `
  • ${options[path]}${value}
  • `; } html += '
'; } else { html += '

По указанному ИНН данные не найдены, возможно указан не корректный ИНН или КПП!

'; } svgCreator.$body.find('#' + this.config.personData).html(html); blockSuccess.removeClass('open'); block.closest('form').find('button.button-callback').remove(); blockSuccess.find('.sc_form-attention').hide(); blockSuccess.find('.sc_buttons').show(); this.checkInn = true; }, rentFormSuccess: function (data, button, block) { let d = data.rent_start.split('.'); let rent_start = new Date(d[2] + '/' + d[1] + '/' + d[0]); console.log(rent_start); rent_start.setHours(0, 0, 0, 0); let date_future = new Date(); date_future.setDate(date_future.getDate() + 3); date_future.setHours(0, 0, 0, 0); if (date_future > rent_start) return svgCreator.Message.error(`Дата начала аренды должна быть не раньше 3х дней от текущей даты.`); let success = button.data('success'); let submit = block.closest('form').find('button[type=submit]'); if (success === true) { submit.prop('disabled', false); return true; } submit.prop('disabled', true); block.removeClass('checked'); submit.before(''); block.find('.sc_form-attention').show(); block.find('.sc_buttons').hide(); return false; }, callSend: function () { let data = svgCreator.Sms.data; svgCreator.Request.addList({action: 'callBack', rooms: svgCreator.Svg.currentRoom}, data); var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { svgCreator.Actions.forms('
Ваш запрос отправлен в службу аренды. В ближайшее время с Вами свяжутся.
'); } svgCreator.Request.toSystem(data, callbacks); }, callForm: function () { let html = `

Заказать звонок

` + svgCreator.Sms.form(this.callSend); this.forms(html); }, initialize: function () { if (this.initialized) return; this.initialized = true; svgCreator.$body.on('click', '#' + this.config.container + ' .button', function () { svgCreator.Actions.forms(); let action = $(this).data('action'); if (!action || !svgCreator.Actions[action]) return; this.current = action; svgCreator.Actions[action](); }); svgCreator.$body.on('click', '#' + this.config.formRent + ' span.button', function () { let block = $(this).closest('.sc_form-block'); if (!block.length || !svgCreator.Form.validate(block)) return; let action = block.data('action'); let result = action ? svgCreator.Actions[action](svgCreator.Utils.serializeBlockToObject(block), $(this), block) : true; if (result) { block.addClass('checked'); block.next().addClass('open'); svgCreator.Utils.scroll(block.next(), '#' + svgCreator.popup.config.windowId); } }); svgCreator.$body.on('submit', '#' + this.config.formRent, function (e) { e.preventDefault(); if (!svgCreator.Actions.checkInn) return svgCreator.Message.error('Необходимо проверить введенный ИНН.'); svgCreator.Message.create('Данные формы получены. Дождитесь завершения отправки формы.'); let action = svgCreator.btn.val(); var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { svgCreator.Actions.forms('
Ваш запрос отправлен в службу аренды. В ближайшее время с Вами свяжутся.
') } let data = svgCreator.Utils.serializeFormToObject($(this).closest('form')); svgCreator.Request.addList(svgCreator.Sms.data, data); svgCreator.Request.addList({action: action, rooms: svgCreator.Svg.currentRoom, dadata: JSON.stringify(svgCreator.dadata)}, data); svgCreator.Request.toSystem(data, callbacks); }); svgCreator.$body.on('change', '#' + this.config.formRent + ' input[name=inn]', function () { svgCreator.Actions.checkInn = false; }); }, } svgCreator.popup = { config: { popupId: 'sc_popup', windowId: 'sc_popup_content', }, create : function (html) { if (svgCreator.Svg.movement) return; this.popup = $('
', {id: this.config.popupId}).on('mousedown touchstart', function (e) { svgCreator.popup.close(e); }); this.content = $('
', {id: this.config.windowId}).appendTo(this.popup).html(html); $('
', {class: this.config.popupId + '_close'}).html('').appendTo(this.content); svgCreator.$container.append(this.popup); }, close: function (e) { if (!this.popup) return; if ((e.target.id === this.config.windowId || e.target.closest('#' + this.config.windowId)) && (!e.target.classList.contains(this.config.popupId + '_close') && !e.target.closest('.' + this.config.popupId + '_close'))) return; this.popup.remove(); }, } svgCreator.Request = { add: function (key, value, data) { if ($.isArray(data)) { data.push({ name: key, value: value, }); } else if ($.isPlainObject(data)) { data[key] = value; } else if (typeof data == 'string') { data += "&" + key + "=" + value; } else if (data instanceof FormData) { data.append(key, value); } return data; }, addList: function (mix, data) { for (let key in mix) { data = this.add(key, mix[key], data); } return data; }, send: function (data, config = {}, callbacks = {}, userCallbacks = {}){ var runCallback = function (callback, bind) { if (typeof callback == 'function') { return callback.apply(bind, Array.prototype.slice.call(arguments, 2)); } else if (typeof callback == 'object') { for (var i in callback) { if (callback.hasOwnProperty(i)) { var response = callback[i].apply(bind, Array.prototype.slice.call(arguments, 2)); if (response === false) { return false; } } } } return true; }; if (runCallback(callbacks.before) === false || runCallback(userCallbacks.before) === false) return; var XHR = ('onload' in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest; let xhr = new XHR(); xhr.responseType = 'json'; xhr.withCredentials = true; xhr.open(config.method ? config.method : 'POST', config.url, true); if (config.headers) { for (let i in config.headers) { xhr.setRequestHeader(i, config.headers[i]); } } else { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } let sendData = ''; if ($.isArray(data)) { sendData = new URLSearchParams(Object.entries(data)).toString(); } else if ($.isPlainObject(data)) { sendData = new URLSearchParams(Object.entries(data)).toString(); } else if (typeof data == "string") { sendData = data; } xhr.send(sendData); xhr.onload = () => { if (xhr.status != 200) svgCreator.Message.log(`Ошибка ${xhr.status}: ${xhr.statusText}`); let response = svgCreator.response = xhr.response; if (response.success) { if (response.message) { svgCreator.Message.success(response.message); } if (response.data.update){ svgCreator.update(); } runCallback(callbacks.response.success, svgCreator, response); if (!$.isEmptyObject(userCallbacks)) { runCallback(userCallbacks.response.success, svgCreator, response) }; } else { svgCreator.Message.log(response.message); if (response.data.required){ svgCreator.Required.setAll(response.data.required); } runCallback(callbacks.response.error, svgCreator, response); if (!$.isEmptyObject(userCallbacks)) { runCallback(userCallbacks.response.error, svgCreator, response) }; } }; }, toSystem: function (data, callbacks = {}, userCallbacks = {}) { if (typeof svgCreatorConfig.user === 'undefined') return this.log('User is undefined'); data = svgCreator.Request.add('user', svgCreatorConfig.user, data); let config = { url: svgCreator.url + 'data', type: 'POST', dataType: 'json', }; this.send(data, config, callbacks, userCallbacks); }, toOther: function (url, method = 'POST', headers = {}, data = {}, callbacks = {}) { let config = { url: url, type: method, headers: headers, }; this.send(data, config, callbacks = {}); }, }; svgCreator.Sms = { config: { smsId: 'sc_form_sms', }, form: function (action) { this.action = action; return `

Подтвердите свой номер телефона

`; }, send: function (e) { e.preventDefault(); let form = $(e.target); let data = this.data = svgCreator.Utils.serializeFormToObject(form); for (const [k, v] of Object.entries(data)){ if (!v) return svgCreator.Form.emptyField(form, k); } var callbacks = svgCreatorConfig.callbacksTemplate(); callbacks.response.success = function (response) { svgCreator.Sms.code = response.data.code; form.find('button').prop('disabled', true); $('#' + svgCreator.Sms.config.smsId + '_check').find('button').prop('disabled', false); $('#' + svgCreator.Sms.config.smsId + '_check').find('input').focus(); } svgCreator.Request.toSystem({action: 'sendSms', phone: data.phone}, callbacks); }, check: function (e) { e.preventDefault(); let form = $(e.target); let field = 'code'; let data = svgCreator.Utils.serializeFormToObject(form); if (!data[field]) return svgCreator.Form.errorField(form, field, 'Введите код подтверждения.'); if (data[field] != this.code) { return svgCreator.Form.errorField(form, field, 'Не верный код подтверждения.'); } if (this.action) this.action(); this.action = null; this.code = null; }, initialize: function () { svgCreator.$body.on('submit', '#' + this.config.smsId + '_send', (e) => svgCreator.Sms.send(e)); svgCreator.$body.on('submit', '#' + this.config.smsId + '_check', (e) => svgCreator.Sms.check(e)); }, } svgCreator.Form = { config: { formGroup: 'sc_form-group', formErr: 'sc_form-error', }, errorField: function (form, field, message) { this.resetErrors(form); let el = form.find('*[name=' + field + ']'); el.closest('.' + this.config.formGroup).addClass('error'); el.after(`${message}`); }, emptyField: function (form, field) { this.errorField(form, field, 'Это поле обязательно для заполнения.'); }, resetErrors: function (form) { form.find('.' + this.config.formGroup).removeClass('error'); form.find('.' + this.config.formErr).remove(); }, validate: function (form, e) { var isErrReqiured = false; var field; form.find('input, select, textarea').removeClass('error'); form.find('input, select, textarea').each(function (){ if (isErrReqiured) return; if (!$(this).prop('required') || $(this).prop('disabled')) return; field = $(this); switch (this.tagName.toLowerCase()) { case 'select': case 'textarea': if (!$(this).val()) isErrReqiured = true; break; case 'input': switch ($(this).attr('type').toLowerCase()) { case 'checkbox': if (!$(this).prop('checked')) isErrReqiured = true; break; case 'radio': if (!form.find('input[type=radio][name=' + $(this).attr('name') + ']:checked').length) isErrReqiured = true; break; default: if (!$(this).val()) isErrReqiured = true; break; } break; } }); if (isErrReqiured) { if (e) e.preventDefault(); field.addClass('error'); svgCreator.Message.errRequired(); return false } return true; }, } svgCreator.Message = { config: { container: 'sc_message', }, log: function (message) { console.error('[svgCreator] - ' + message); }, create: function (text, type = 'success') { this.initialize(); let item = $('
', {class: 'sc_message ' + type}).text(text).appendTo(this.contaner); let close = $('
', {class: 'sc_message_close'}).html('').appendTo(item); close.on('click', () => item.remove()); }, error: function (message) { this.create(message, 'error'); }, errRequired: function () { this.error('Заполните и/или выберите обязательные поля.'); }, initialize: function () { if (this.contaner) return; this.contaner = $('
', {id: this.config.container}).appendTo(svgCreator.$body); $('body').on('click', function (e){ //if (!$(e.target).hasClass('sc_message')) svgCreator.Message.contaner.html(''); }); }, } svgCreator.Loader = { config: { parCls: 'sc_loading', }, create: function () { if (this.el) return; this.el = $('', {class: 'sc_loader'}); svgCreator.$body.addClass(this.config.parCls); this.el.prependTo(svgCreator.$body); }, destroy: function () { if (!this.el) return; this.el.remove(); this.el = null; svgCreator.$body.removeClass(this.config.parCls); }, }; svgCreator.Utils = { getClearName: function (name){ return name.replace (/[^a-z0-9]/, '') }, getRuStatus: function (name) { return svgCreator.statuses[name]; }, getRand: function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }, serializeObject: function (data) { var obj = {}; data.map(function(x, i){ obj[x.name] = x.value; }); return obj; }, serializeFormToObject: function (form) { return this.serializeObject(form.serializeArray()); }, serializeBlockToObject: function (block) { return this.serializeObject(block.find('input, select, textarea').serializeArray()); }, getValueByPath: function (path, data) { let i = path.shift(); if (data[i] === null || typeof data[i] === 'undefined') return null; return path.length > 0 ? this.getValueByPath(path, data[i]) : data[i]; }, scroll: function (to, container) { to = (typeof to === 'string') ? $(to) : to; if (!to.length) return; if (!container) container = 'html, body'; container = (typeof container === 'string') ? $(container) : container; let scrollHeight = to[0].offsetTop - container[0].offsetTop; $(container).animate({ scrollTop: scrollHeight }, 500); }, isMobile: function () { return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) || (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))); }, lockScroll: function (lock = true) { let method = lock ? 'addClass' : 'removeClass'; $('html')[method]('sc_unscroll'); }, formatPrice: function (price) { return svgCreator.Utils.number_format(price, 0, '.', ' '); }, number_format: function (number, decimals, dec_point, thousands_sep) { var i, j, kw, kd, km; if (isNaN(decimals = Math.abs(decimals))) decimals = 2; if (dec_point == undefined) dec_point = ','; if (thousands_sep == undefined) thousands_sep = '.'; i = parseInt(number = (+number || 0).toFixed(decimals)) + ''; if ((j = i.length) > 3) { j = j % 3; } else { j = 0; } km = j ? i.substr(0, j) + thousands_sep : ''; kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep); kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, '0').slice(2) : ''); return km + kw + kd; }, roundHundred: function (price) { return svgCreator.Utils.formatPrice(Math.round(price / 100) * 100); }, uniqueid: function () { return Math.random().toString(16).slice(2) ; }, } svgCreator.Icon = { geo: ``, class: '', size: '', eye: '', } document.addEventListener("DOMContentLoaded", function () { svgCreator.load.scripts(); svgCreator.load.styles(); }); window.svgCreator = svgCreator; })(window, document, svgCreatorConfig); svgCreator.url = "https://gm.gorodbc.ru/"; svgCreator.load.config = { scripts: { jQuery: {url: '//code.jquery.com/jquery-3.7.0.min.js'}, SVG: {url: '//cdnjs.cloudflare.com/ajax/libs/svg.js/3.2.0/svg.min.js'}, slick: { url: '//cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.js', style: '//cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.css', depend: 'jQuery', }, mask: { url: '//cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.4.1/jquery.maskedinput.min.js', depend: 'jQuery', }, datepicker: { url: '//code.jquery.com/ui/1.13.3/jquery-ui.min.js', style: '//code.jquery.com/ui/1.13.3/themes/base/jquery-ui.min.css', depend: 'jQuery', }, }, styles: { 0: 'https://gm.gorodbc.ru/assets/template/css/svgcreator.css', }, };