UNPKG

simple-ui-builder

Version:

Build user interface like Lego bricks. UI.input(), UI.button(cb), UI.select(arr) etc. For lazy guys as I am.

1,253 lines (1,015 loc) 35.7 kB
/** * Simple UI Builder * @ artbels * artbels@gmail.com * 2016 */ ;(function () { var UI = this.UI = {} UI.input = function (params, cb) { params = params || {} cb = cb || params.cb || function (value) { console.log('you pressed enter and input value is >> ' + value + ' <<') } if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } if (typeof params == 'string') params = { id: params } params.id = params.id || 'input' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var input = document.createElement('input') input.id = params.id input.type = params.type || 'text' if (params.placeholder) input.placeholder = params.placeholder input.name = params.name || params.id if ((params.class !== undefined) || (params.className !== undefined)) { input.className = params.class || params.className } else input.className = 'form-control'; // yes, I like bootstrap if (params.style) { for (var key in params.style) { var val = params.style[key] input.style[key] = val } } input.style.width = input.style.width || '300px' input.style.marginTop = input.style.marginTop || '5px' input.style.marginBottom = input.style.marginBottom || '5px' if (params.value === undefined) { input.value = localStorage['input#' + params.id] || params.default || '' } else input.value = params.value input.onkeyup = saveContents input.onchange = saveContents function saveContents (e) { localStorage['input#' + params.id] = input.value.trim() if (e.keyCode === 13) { // checks whether the pressed key is "Enter" cb(input.value) } } if (params.attributes) { for (var attribute in params.attributes) { var atr = params.attributes[attribute] input.setAttribute(attribute, atr) } } params.parent.appendChild(input) } UI.button = function (cb, params) { if (typeof cb == 'object') { if (typeof params == 'function') { var temp = params params = cb cb = temp } else if (typeof params == 'undefined') { params = cb cb = console.log } } if (typeof cb == 'string') { if (typeof params == 'function') { var temp2 = params params = { innerHTML: cb } cb = temp2 } else if (typeof params == 'undefined') { params = { innerHTML: cb } cb = console.log } } params = params || {} cb = cb || function (id) { console.log(id + ' clicked') } params.className = (params.class !== undefined) ? params.class : ((params.className !== undefined) ? params.className : 'btn btn-default') params.innerHTML = params.innerHTML || params.title || 'Action' params.id = params.id || UI.slug(params.innerHTML) if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var button = document.createElement('button') button.id = params.id button.className = params.className button.innerHTML = params.innerHTML if (params.style) { for (var key in params.style) { var val = params.style[key] button.style[key] = val } } button.style.margin = button.style.margin || params.margin || '10px' button.onclick = function () { cb(button.id) } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] button.setAttribute(attribute, val) } } params.parent.appendChild(button) } UI.buttons = function (arr, cb, params) { if (!arr || !arr.length) return console.warn('no array to build buttons!') if (typeof cb == 'object') { if (typeof params == 'function') { var temp = params params = cb cb = temp } else if (typeof params == 'undefined') { params = cb cb = console.log } } params = params || {} cb = cb || function (id) { console.log(id + ' clicked') } if (typeof params == 'string') params = { innerHTML: params, id: params } var i = 0 var l = arr.length ;(function next () { var item = arr[i] if (typeof item == 'number') item = item.toString() var buttonParams = { parent: params.parent, innerHTML: item, className: params.className, style: { margin: '2px' } } UI.button(cb, buttonParams) i++ if (i < l) next() })() } UI.br = function (params) { params = params || {} if (typeof params == 'string') { params = { parent: document.querySelector(params) } } else if (typeof params == 'number') { params = { id: params.toString() } } else if (params instanceof HTMLElement) { params = { parent: params } } if (typeof params.parent == 'string') params.parent = document.querySelector(params.parent) else params.parent = params.parent || document.querySelector('#ui') || document.body params.id = params.id || 'br' var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var br = document.createElement('br') br.id = params.id params.parent.appendChild(br) } UI.radio = function (arr, params, cb) { if (!arr || !arr.length) return console.warn('no array to build radios!') params = params || {} cb = cb || params.cb || function (value) { console.log('you clicked radio >> ' + value + ' <<') } if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } if (typeof params == 'string') params = { parent: document.querySelector(params) } if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body params.id = params.id || 'radio' var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var i = 0 var l = arr.length createRadio() function createRadio () { var item = arr[i] var radio = document.createElement('input') radio.type = 'radio' radio.id = item radio.name = params.id if (params.default && (params.default == item)) { radio.checked = true } radio.onclick = function () { cb(radio.id) } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] radio.setAttribute(attribute, val) } } params.parent.appendChild(radio) params.parent.appendChild(document.createTextNode(item)) if (params.br) params.parent.appendChild(document.createElement('br')) i++ if (i < l) { createRadio() } } } UI.checkbox = function (params, cb) { params = params || {} cb = cb || params.cb || function (value) { console.log('you clicked checkbox >> ' + value + ' <<') } if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } if (typeof params == 'string') params = { text: params, id: params } if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body params.id = params.id || 'checkbox' var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var checkbox = document.createElement('input') checkbox.type = 'checkbox' checkbox.id = params.id checkbox.className = params.className checkbox.checked = Boolean(params.checked) checkbox.onclick = function () { cb(checkbox.id + ' ' + checkbox.checked) } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] checkbox.setAttribute(attribute, val) } } params.parent.appendChild(checkbox) if (params.text) { var spanParams = { parent: params.parent, id: UI.slug(params.id) + '-span', innerHTML: params.text } var exSpanNode = document.getElementById(spanParams.id) if (exSpanNode) params.parent.removeChild(exSpanNode) UI.span(spanParams) } } UI.checkboxes = function (arr, cb, params) { if (!arr || !arr.length) return console.warn('no array to build buttons!') if (typeof cb == 'object') { if (typeof params == 'function') { var temp = params params = cb cb = temp } else if (typeof params == 'undefined') { params = cb cb = console.log } } params = params || {} if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body cb = cb || function (id) { console.log(id + ' checked') } var i = 0 var l = arr.length ;(function next () { var item = arr[i] if (typeof item == 'number') item = item.toString() var checkboxParams = { parent: params.parent, className: params.className, checked: Boolean(params.checked), text: item, id: UI.slug(item), style: { margin: '2px' } } UI.checkbox(cb, checkboxParams) if (params.br) params.parent.appendChild(document.createElement('br')) i++ if (i < l) next() })() } UI.fileReader = function (cb, params) { params = params || {} if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } cb = cb || params.cb || console.log params.id = params.id || 'file-reader' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var fileInput = document.createElement('input') params.parent.appendChild(fileInput) fileInput.type = 'file' fileInput.id = params.id if(params.multiple) fileInput.multiple = "multiple" if (params.style) { for (var key in params.style) { var val = params.style[key] fileInput.style[key] = val } } if (params.attributes) { for (var attribute in params.attributes) { var atrVal = params.attributes[attribute] fileInput.setAttribute(attribute, atrVal) } } fileInput.onchange = function (evt) { var files = evt.target.files var len = files.length var fileReader = new FileReader() function readFile (index) { if (index >= len) return var fileToRead = files[index] var fileType = fileToRead.name.split(/\./).pop() if (params.bypassFileReader) return cb(fileToRead) fileReader.onload = function (e) { var contents = e.target.result if (params.json && (['{', '['].indexOf(contents.slice(0, 1)) != -1)) { contents = JSON.parse(contents) } cb(contents, fileToRead, index, len) readFile(index + 1) } if ((['zip', 'kmz'].indexOf(fileType) != -1) || (params.readAsArrayBuffer)) { fileReader.readAsArrayBuffer(fileToRead) } else if ((['xls', 'xlsx'].indexOf(fileType) != -1) || (params.readAsBinaryString)) { fileReader.readAsBinaryString(fileToRead) } else { fileReader.readAsText(fileToRead, params.encoding) } } readFile(0) } } UI.download = function (str, params) { params = params || {} if (!str) console.warn('nothing to save!') if (typeof str == 'object') str = JSON.stringify(str, null, '\t') params.id = params.id || params.name || 'download-link' params.name = params.name || 'renameMe.json' params.type = params.type || 'application/json' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var a = document.createElement('a') if (params.noBlob) { var data = params.type + encodeURIComponent(str) a.href = 'data:' + data } else { var blobObj = new Blob([str], { type: params.type }) var blobUrl = URL.createObjectURL(blobObj) a.href = blobUrl } a.download = params.name a.textContent = params.name a.id = params.id if (params.style) { for (var key in params.style) { var val = params.style[key] a.style[key] = val } } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] a.setAttribute(attribute, val) } } params.parent.appendChild(a) } UI.span = function (params) { if (typeof params == 'string') params = { innerHTML: params } if (!params.innerHTML) return 'no innerHTML' params.id = params.id || UI.slug(params.innerHTML) if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var span = document.createElement('span') span.innerHTML = params.innerHTML span.id = params.id if (params.className) span.className = params.className if (params.style) { for (var key in params.style) { var val = params.style[key] span.style[key] = val } } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] span.setAttribute(attribute, val) } } params.parent.appendChild(span) } UI.img = function (params) { if (typeof params == 'string') params = { src: params } if (!params.src) return 'no src' params.id = params.id || 'img' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var img = document.createElement('img') img.src = params.src if (params.alt) img.alt = params.alt img.id = params.id if (params.className) img.className = params.className if (params.style) { for (var key in params.style) { var val = params.style[key] img.style[key] = val } } if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] img.setAttribute(attribute, val) } } params.parent.appendChild(img) } UI.link = function (params) { if (typeof params == 'string') params = { href: params, innerHTML: params } if (!params.href) return 'no href' params.innerHTML = params.innerHTML || params.href params.id = params.id || UI.slug(params.innerHTML) if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var a = document.createElement('a') a.id = params.id a.href = params.href if (params.targetBlank) a.target = '_blank' a.innerHTML = params.innerHTML if (params.style) { for (var key in params.style) { var val = params.style[key] a.style[key] = val } } a.className = params.class || params.className if (params.attributes) { for (var attribute in params.attributes) { var atr = params.attributes[attribute] a.setAttribute(attribute, atr) } } params.parent.appendChild(a) } UI.select = function (arr, cb, params) { if (!arr || !arr.length) return console.warn('no array to build select!') if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } if (!params && (typeof cb == 'object')) { params = cb cb = console.log } params = params || {} params.id = params.id || '' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id + 'Select') if (exNode) params.parent.removeChild(exNode) cb = cb || console.log var select = document.createElement('select') select.className = params.className || 'selectpicker' select.id = params.id + 'Select' if (params.style) { for (var key in params.style) { var val = params.style[key] select.style[key] = val } } var firstOption = document.createElement('option') firstOption.innerHTML = params.firstRowText || 'select ' + params.id select.appendChild(firstOption) for (var i = 0; i < arr.length; i++) { var item = arr[i] var option = document.createElement('option') option.id = params.id + 'Option' option.innerHTML = params.innerHTML || item option.value = params.value || item if (params.default && params.default == item) { option.selected = true } select.appendChild(option) } params.parent.appendChild(select) select.onchange = function () { var selectedOptionNode = document.querySelector('option#' + params.id + 'Option' + ':checked') if (selectedOptionNode) cb(selectedOptionNode.value) } } UI.textarea = function (params) { params = params || {} params.id = params.id || 'textarea' params.cols = (params.cols || 60).toString() params.rows = (params.rows || 12).toString() params.fontSize = params.fontSize || '12px' if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var textarea = document.createElement('textarea') textarea.cols = params.cols textarea.rows = params.rows textarea.id = params.id textarea.className = params.className || params.class || 'form-control' if (params.style) { for (var key in params.style) { var val = params.style[key] textarea.style[key] = val } } textarea.style.fontFamily = 'monospace' textarea.style.fontSize = params.fontSize if (params.attributes) { for (var attribute in params.attributes) { var val = params.attributes[attribute] textarea.setAttribute(attribute, val) } } params.parent.appendChild(textarea) textarea.value = params.value || localStorage['textarea#' + params.id] || '' textarea.onkeyup = saveContents textarea.onchange = saveContents function saveContents (e) { localStorage['textarea#' + params.id] = textarea.value.trim() } } UI.TB = function (cb, params) { if ((typeof params == 'function') && (typeof cb == 'object')) { var temp = params params = cb cb = temp } cb = cb || console.log params = params || {} if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body params.className = '' UI.textarea(params) var textareaId = params.id var textareaNode = document.querySelector('textarea#' + params.id) if (!params.noAction) { var actionParams = {} actionParams.parent = params.parent actionParams.id = params.id + 'Action' actionParams.innerHTML = params.buttonText || 'Action' actionParams.className = '' actionParams.style = { margin: '0px', marginTop: '10px', } UI.button(actionParams, function () { var textareaArr = textareaNode.value .trim() .split(/\n\r?/).filter(function (a) { return a }) cb(textareaArr) }) } var clearParams = {} clearParams.parent = params.parent clearParams.id = params.id + 'Clear' clearParams.innerHTML = 'Clear' clearParams.className = '' clearParams.style = { margin: '0px', marginLeft: '5px', marginTop: '10px', } UI.button(clearParams, function () { textareaNode.value = '' localStorage[textareaId] = '' }) } UI.table = function (arr, params) { if ((!arr) && (typeof (arr[0]) != 'object')) { alert('Argument is not an array with objects') } if (typeof arr[0] != 'object') arr = arr.map(function (a) { return { value: a } }) var reDateTimeJS = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/ if (typeof params == 'string') params = { parent: params } params = params || {} if (typeof params.selectable != 'boolean') params.selectable = false params.tableId = params.tableId || params.id || 'printedTable' params.showColumns = params.showColumns || params.columns || params.cols || [] params.hideColumns = params.hideColumns || [] if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body if (typeof params.hideHead != 'boolean') params.hideHead = false if (typeof params.sortColumns != 'boolean') params.sortColumns = false // console.log(params) var columns = [] var numCol = {} var cell = '' var chBoxCol if (params.showColumns.length !== 0) { columns = params.showColumns } else { for (var i = 0; i < arr.length; i++) { // собираем ключи со всех объектов for (var key in arr[i]) { if ((columns.indexOf(key) == -1) && (params.hideColumns.indexOf(key) == -1)) { columns.push(key) var colCell = arr[i][key] numCol[key] = (!isNaN(colCell) && (typeof colCell == 'number')) } } } } if (params.sortColumns) columns.sort() var exTable = document.getElementById(params.tableId) if (exTable) params.parent.removeChild(exTable) var table = document.createElement('table') table.id = params.tableId if (params.style) { for (var style in params.style) { var val = params.style[style] table.style[style] = val } } table.style.margin = table.style.margin || '10px' table.style.fontFamily = table.style.fontFamily || 'monospace' table.style.width = table.style.width || 'auto 90%' table.style.borderCollapse = table.style.borderCollapse || 'collapse' params.parent.appendChild(table) if (!params.hideHead) { var thead = table.createTHead() var hRow = thead.insertRow(0) if (params.selectable) { var thh = document.createElement('th') thh.style.background = '#f6f6f6' thh.style.padding = '3px' thh.style.border = '1px solid #CCC' chBoxCol = document.createElement('input') chBoxCol.id = params.tableId + 'ColCheckbox' chBoxCol.type = 'checkbox' chBoxCol.checked = Boolean(params.checked) thh.appendChild(chBoxCol) hRow.appendChild(thh) } for (var h = 0; h < columns.length; h++) { var th = document.createElement('th') th.style.background = '#f6f6f6' th.style.padding = '3px' th.style.border = '1px solid #CCC' th.appendChild(document.createTextNode(columns[h])) hRow.appendChild(th) } } var tbody = document.createElement('tbody') table.appendChild(tbody) if (arr.length !== 0) { for (var n = 0; n < arr.length; n++) { // собираем данные полей, чистим var dRow = tbody.insertRow(-1) dRow.id = 'r' + n var oneObj = arr[n] if (params.selectable) { var tdch = document.createElement('td') tdch.style.padding = '3px' tdch.style.border = '1px solid #CCC' var chBoxRow = document.createElement('input') chBoxRow.className = params.tableId + 'RowCheckbox' chBoxRow.id = 'r' + n chBoxRow.type = 'checkbox' chBoxRow.checked = Boolean(params.checked) tdch.appendChild(chBoxRow) dRow.appendChild(tdch) } for (var l = 0; l < columns.length; l++) { cell = oneObj[columns[l]] cell = (((cell !== undefined) && (cell !== null)) ? cell : '') if (cell.constructor === Array) cell = cell.join(', ') if (cell.constructor === Object) cell = JSON.stringify(cell) if (typeof cell == 'string') { cell = cell.replace(params.quotes, "'") if (reDateTimeJS.test(cell)) cell = new Date(cell).toLocaleDateString() } var td = document.createElement('td') if (/<a.+<\/a>/.test(cell)) { td.appendChild(new DOMParser() .parseFromString(cell, 'text/html') .querySelector('a')) } else if (/<img.+?>/.test(cell)) { td.appendChild(new DOMParser() .parseFromString(cell, 'text/html') .querySelector('img')) } else if (/<input.+?>/.test(cell)) { td.appendChild(new DOMParser() .parseFromString(cell, 'text/html') .querySelector('input')) } else { td.appendChild(document.createTextNode(cell)) } td.style.padding = '3px' td.style.border = '1px solid #CCC' dRow.appendChild(td) } } } if (chBoxCol) { chBoxCol.onchange = function () { var checkboxes = document.querySelectorAll('.' + params.tableId + 'RowCheckbox') for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = !checkboxes[i].checked } } } } UI.addRow = function (obj, params) { params = params || {} params.selectable = params.selectable || false params.mdl = params.mdl || false params.showColumns = params.showColumns || params.cols || params.columns || [] params.tableId = params.tableId || params.id || 'printedTable' var tableExists = document.getElementById(params.tableId) if (!tableExists) Table.print([], params) var reDateTimeJS = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/ var columns = [] var cell = '' if (params.showColumns.length !== 0) { columns = params.showColumns } else { columns = Object.keys(obj) } var tbody = document.querySelector('#' + params.tableId).querySelector('tbody') var dRow = tbody.insertRow(-1) if (params.selectable) { var tds = document.createElement('td') if (!params.mdl) { tds.style.padding = '3px' tds.style.border = '1px solid black' } var chBoxRow = document.createElement('input') chBoxRow.className = params.tableId + 'RowCheckbox' chBoxRow.type = 'checkbox' chBoxRow.checked = Boolean(params.checked) tds.appendChild(chBoxRow) dRow.appendChild(tds) } for (var i = 0; i < columns.length; i++) { var td = document.createElement('td') if (!params.mdl) { td.style.padding = '3px' td.style.border = '1px solid black' } cell = obj[columns[i]] cell = (((cell !== undefined) && (cell !== null)) ? cell : '') if (cell.constructor === Array) cell = cell.join(', ') else if (cell.constructor === Object) cell = JSON.stringify(cell) else if (typeof cell == 'string') { cell = cell.replace(params.quotes, "'") if (reDateTimeJS.test(cell)) cell = new Date(cell).toLocaleDateString() } if (/<a.+<\/a>/.test(cell)) { td.appendChild(new DOMParser().parseFromString(cell, 'text/html').querySelector('a')) } else if (/<img.+?>/.test(cell)) { td.appendChild(new DOMParser().parseFromString(cell, 'text/html').querySelector('img')) } else { td.appendChild(document.createTextNode(cell)) } if (!params.mdl) { td.style.padding = '3px' td.style.border = '1px solid black' } else { if (!numCol[columns[l]]) { // select first col with non-num td.className = 'mdl-data-table__cell--non-numeric' } } dRow.appendChild(td) } } UI.getTableSel = function (tableId) { var checkboxes = document.querySelectorAll('.' + tableId + 'RowCheckbox') var checkedArr = [] for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) checkedArr.push(i) } return checkedArr } UI.div = function (params) { params = params || {} if (typeof params == 'string') { params = { id: params } } if (typeof params.parent == 'string') { params.parent = document.querySelector(params.parent) } else params.parent = params.parent || document.querySelector('#ui') || document.body var exNode = document.getElementById(params.id) if (exNode) params.parent.removeChild(exNode) var div = document.createElement('div') div.id = params.id || 'div' div.className = params.className if (params.style) { for (var key in params.style) { div.style[key] = params.style[key] } } if (params.attributes) { for (var attribute in params.attributes) { div.setAttribute(attribute, params.attributes[attribute]) } } params.parent.appendChild(div) } UI.appendModal = function (params) { // requires bootstrap params = params || {} params.id = params.id || 'modal' params.title = params.title || 'Modal title' var fadeDiv = document.createElement('div') fadeDiv.id = params.id fadeDiv.setAttribute('class', 'modal fade') fadeDiv.setAttribute('role', 'dialog') document.body.appendChild(fadeDiv) var dialogDiv = document.createElement('div') dialogDiv.setAttribute('class', 'modal-dialog') fadeDiv.appendChild(dialogDiv) var contentDiv = document.createElement('div') contentDiv.setAttribute('class', 'modal-content') dialogDiv.appendChild(contentDiv) var headerDiv = document.createElement('div') headerDiv.setAttribute('class', 'modal-header') headerDiv.style.padding = '10px' contentDiv.appendChild(headerDiv) var closeButton = document.createElement('button') closeButton.setAttribute('class', 'close') closeButton.setAttribute('data-dismiss', 'modal') closeButton.innerHTML = '&times;' headerDiv.appendChild(closeButton) var h4 = document.createElement('h4') h4.setAttribute('class', 'modal-title') h4.innerHTML = params.title headerDiv.appendChild(h4) var bodyDiv = document.createElement('div') bodyDiv.id = params.id + '-body' contentDiv.appendChild(bodyDiv) var footerDiv = document.createElement('div') footerDiv.id = params.id + '-footer' contentDiv.appendChild(footerDiv) } UI.slug = function (str) { if (!str) return if (typeof str === 'number') return str var letterMap = { '/': '_', '\\': '_', 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'kh', 'ц': 'ts', 'ч': 'ch', 'ш': 'sh', 'щ': 'sch', 'ы': 'i', 'ь': '', 'ъ': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', 'ё': 'e', 'є': 'e', 'і': 'i', 'ї': 'yi', 'ґ': 'g', '+': '-plus' } var reOtherSymbols = /[^a-z0-9\-_]/gi var replLetters = str.split('').map(function (char) { char = char.toLowerCase() return (letterMap[char] !== undefined) ? letterMap[char] : char }).join('') var replSymb = replLetters.replace(reOtherSymbols, '-') var replUnnecDelims = removeUnnecessaryDelims(replSymb) return replUnnecDelims function removeUnnecessaryDelims (str) { return str .replace(/\-{2,}/g, '-') .replace(/_{2,}/g, '_') .replace(/[\-\_]+$/g, '') .replace(/^[\-\_]+/g, '') } } })()