/** * TinyMce Bootstrap plugin * * @version 2.3.2 * @author Gilles Migliori - gilles.migliori@gmail.com * */ /** * Iconpicker Iconsets & classes : * glyphicon => .glyphicon * ionicon => [class*="ion-"] * fontawesome => .fa * weathericon => .wi * mapicon => [class*="map-icon-"] * octicon => .octicon * typicon => .typcn * elusiveicon => [class*="el-icon-"] * materialdesign => [class*="md-"] */ /*jshint globalstrict: true, unused:false*/ /*global jQuery, jQuery, tinymce, window, document*/ 'use strict'; tinymce.PluginManager.requireLangPack('bootstrap'); tinymce.PluginManager.add('bootstrap', function(editor, url) { var iFrameDefaultWidth = 885, bootstrapElements, menuType, dropdownText, bootstrapDefaultCssPath, bootstrapCssPath, bootstrapIcon = [], DefaultImagesPath, imagesPath; if(typeof(editor.settings.bootstrapConfig) == 'undefined') { editor.settings.bootstrapConfig = [ ]; } /* Default Bootstrap Elements */ if(typeof(editor.settings.bootstrapConfig.bootstrapElements) == 'undefined') { editor.settings.bootstrapConfig.bootstrapElements = { 'btn': true, 'icon': true, 'image': true, 'table': true, 'template': true, 'breadcrumb': true, 'pagination': true, 'pager': true, 'label': true, 'badge': true, 'alert': true, 'panel': true, 'snippet': true }; } bootstrapElements = editor.settings.bootstrapConfig.bootstrapElements; /* Set valid elements to prevent tinymce from removing glyphicon or other empty tags */ if ((editor.settings.verify_html !== false || editor.settings.valid_elements !== '*[*]') && editor.settings.bootstrapConfig.overwriteValidElements !== false) { editor.settings.valid_elements = getValidElements(); } /* Default Menu type (buttongroup|dropdownMenu) */ if(typeof(editor.settings.bootstrapConfig.type) == 'undefined') { editor.settings.bootstrapConfig.type = 'buttongroup'; } menuType = editor.settings.bootstrapConfig.type; /* Default text for dropdownMenu */ if(typeof(editor.settings.bootstrapConfig.dropdownText) == 'undefined') { editor.settings.bootstrapConfig.dropdownText = 'Elements'; } dropdownText = editor.settings.bootstrapConfig.dropdownText; /* Default Bootstrap css path */ if(typeof(editor.settings.bootstrapConfig.bootstrapCssPath) == 'undefined') { bootstrapDefaultCssPath = url + '/css/bootstrap.min.css'; editor.settings.bootstrapConfig.bootstrapCssPath = bootstrapDefaultCssPath; } bootstrapCssPath = editor.settings.bootstrapConfig.bootstrapCssPath; /* Default Icon font */ if(typeof(editor.settings.bootstrapConfig.bootstrapIconFont) == 'undefined') { bootstrapIcon.defaultFont = 'glyphicon'; editor.settings.bootstrapConfig.bootstrapIconFont = bootstrapIcon.defaultFont; } bootstrapIcon.font = editor.settings.bootstrapConfig.bootstrapIconFont; /* set search type & parameter to look for icon */ if(bootstrapIcon.font == 'glyphicon') { bootstrapIcon.searchClass = 'glyphicon-'; } else if(bootstrapIcon.font == 'ionicon') { bootstrapIcon.searchClass = 'ion-'; } else if(bootstrapIcon.font == 'fontawesome') { bootstrapIcon.searchClass = 'fa-'; } else if(bootstrapIcon.font == 'weathericon') { bootstrapIcon.searchClass = 'wi-'; } else if(bootstrapIcon.font == 'mapicon') { bootstrapIcon.searchClass = 'map-icon-'; } else if(bootstrapIcon.font == 'octicon') { bootstrapIcon.searchClass = 'octicon-'; } else if(bootstrapIcon.font == 'typicon') { bootstrapIcon.searchClass = 'typcn-'; } else if(bootstrapIcon.font == 'elusiveicon') { bootstrapIcon.searchClass = 'el-icon-'; } else if(bootstrapIcon.font == 'materialdesign') { bootstrapIcon.searchClass = 'md-'; } /* Default Images path */ if(typeof(editor.settings.bootstrapConfig.imagesPath) == 'undefined') { DefaultImagesPath = url + '/'; editor.settings.bootstrapConfig.imagesPath = {'imagesPath': DefaultImagesPath}; } imagesPath = editor.settings.bootstrapConfig.imagesPath; /* Snippet Management (Allow / Disallow) */ if(typeof(editor.settings.bootstrapConfig.bootstrapElements.snippet === true && editor.settings.bootstrapConfig.allowSnippetManagement) == 'undefined') { editor.settings.bootstrapConfig.allowSnippetManagement = true; } /* Add Bootstrap css + icons css to editor */ var content_css = editor.settings.content_css; var icon_css; if(typeof(content_css) == 'undefined') { content_css = bootstrapCssPath + ',' + url + '/css/editor-content.min.css'; } else { content_css = bootstrapCssPath + ',' + content_css + ',' + url + '/css/editor-content.min.css'; } if(bootstrapIcon.font == 'glyphicon') { icon_css = ''; } else if(bootstrapIcon.font == 'ionicon') { icon_css = 'ionicons.min.css'; } else if(bootstrapIcon.font == 'fontawesome') { icon_css = 'font-awesome.min.css'; } else if(bootstrapIcon.font == 'weathericon') { icon_css = 'weather-icons.min.css'; } else if(bootstrapIcon.font == 'mapicon') { icon_css = 'map-icons.min.css'; } else if(bootstrapIcon.font == 'octicon') { icon_css = 'octicons.min.css'; } else if(bootstrapIcon.font == 'typicon') { icon_css = 'typicons.min.css'; } else if(bootstrapIcon.font == 'elusiveicon') { icon_css = 'elusive-icons.min.css'; } else if(bootstrapIcon.font == 'materialdesign') { icon_css = 'material-design-iconic-font.min.css'; } if(icon_css !== '') { content_css += ',' + url + '/css/iconpicker/css/' + icon_css; } editor.settings.content_css = content_css; /** * look for current icon class in element class * @param object selectedNode * @return Boolean */ function isIcon(selectedNode) { if(selectedNode.is('[class*="' + bootstrapIcon.searchClass + '"]')) { return true; } return false; } /** * Open iframe dialog, * Get and transmit selected element attributes to iframe * @param string iframeUrl * @param string iframeTitle * @param string iframeHeight * @param string type the dialog to display * (bsBtn|bsIcon|bsImage|bsTable|bsTemplate|bsBreadcrumb|bsPagination|bsPager|bsLabel|bsBadge|bsAlert|bsPanel|bsSnippet) * @return void */ function showDialog(iframeUrl, iframeTitle, iframeHeight, type) { /* get selected element values to transmit to iframe */ var selectedNode = getSelectedNode('showDialog'); var nodeAttributes = ''; if(jQuery(selectedNode).hasClass('active')) { if(jQuery(selectedNode).hasClass('btn')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsBtn'); } else if(isIcon(jQuery(selectedNode))) { nodeAttributes = getNodeAttributes(selectedNode, 'bsIcon'); } else if(jQuery(selectedNode).is('img')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsImage'); } else if(jQuery(selectedNode).hasClass('table')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsTable'); } else if(jQuery(selectedNode).hasClass('breadcrumb')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsBreadcrumb'); } else if(jQuery(selectedNode).hasClass('pagination')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsPagination'); } else if(jQuery(selectedNode).hasClass('pager')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsPager'); } else if(jQuery(selectedNode).hasClass('label')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsLabel'); } else if(jQuery(selectedNode).hasClass('badge')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsBadge'); } else if(jQuery(selectedNode).hasClass('alert')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsAlert'); } else if(jQuery(selectedNode).hasClass('panel')) { nodeAttributes = getNodeAttributes(selectedNode, 'bsPanel'); } } var getTheHtml = function (){ var html = ''; var language = editor.getParam('language'); if(!language) { language = 'en_EN'; } html += ''; var qrySign = '?'; if(iframeUrl.match(/\?/)) { qrySign = '&'; } html += ''; return html; }; var iFrameWidth = iFrameDefaultWidth; if(jQuery(window).width() < 885) { iFrameWidth = jQuery(window).width()*0.9; } if(jQuery(window).height() > iframeHeight) { iframeHeight = (jQuery(window).height()*0.9) - 90; } var win = editor.windowManager.open({ title: iframeTitle, width : iFrameWidth, height : iframeHeight, html: getTheHtml(), buttons: [ { text: 'OK', subtype: 'primary', onclick: function(element) { renderContent(element, type); this.parent().parent().close(); } }, { text: 'Cancel', onclick: function() { this.parent().parent().close(); } } ] }); /* OK / Cancel buttons position for responsive */ jQuery('.mce-floatpanel').find('.mce-widget.mce-abs-layout-item.mce-first').css({'left':'auto', 'right':'82px'}); jQuery('.mce-floatpanel').find('.mce-widget.mce-last.mce-abs-layout-item').css({'left':'auto', 'right':'10px'}); jQuery(window).on('resize', function() { resizeDialog(); }); } function resizeDialog() { var iFrameWidth = iFrameDefaultWidth; if(jQuery(window).width() > iFrameDefaultWidth) { iFrameWidth = iFrameDefaultWidth; } else { iFrameWidth = jQuery(window).width()*0.9; } jQuery('.mce-floatpanel').width(iFrameWidth).css('left', (jQuery(window).width() - iFrameWidth) / 2); jQuery('.mce-floatpanel').find('.mce-container-body, .mce-foot, .mce-abs-layout').width(iFrameWidth); if(iFrameWidth < 768) { jQuery('.mce-edit-area iframe').contents().find('.container').addClass('container-xs'); } else { jQuery('.mce-edit-area iframe').contents().find('.container').removeClass('container-xs'); } } /** * gets the selected node in editor, or the active parent matching a bootstrap element * @return matching bootstrap element */ function getSelectedNode(callingFunction) { var selectedNode = editor.selection.getNode(); /*if(callingFunction == 'renderContent' && !jQuery(selectedNode).is('th') && !jQuery(selectedNode).is('td') && jQuery(selectedNode).closest('.breadcrumb').length < 1) { return selectedNode; }*/ if(!jQuery(selectedNode).hasClass('active') || jQuery(selectedNode).closest('.table').length > 0 || jQuery(selectedNode).closest('ol.breadcrumb').length > 0 || jQuery(selectedNode).closest('ul.pagination').length > 0 || jQuery(selectedNode).closest('ul.pager').length > 0 || jQuery(selectedNode).closest('div.alert').length > 0) { // li without link HAS class 'active' in bootstrap /* look for .table|.breadcrumb|.pagination|.pager|.alert|.panel in parents */ var classes = ['.table', '.breadcrumb', '.pagination', '.pager', '.alert', '.panel']; var found = false; for (var i = 0; i < classes.length; i++) { if(jQuery(selectedNode).closest(classes[i]).length > 0 && found === false) { selectedNode = jQuery(selectedNode).closest(classes[i]); found = true; } } } return selectedNode; } /** * insert|update editor content * @param string element the 'ok' button of iframe * @param string type type of content to insert|update * (bsBtn|bsIcon|bsImage|bsTable|bsTemplate|bsBreadcrumb|bsPagination|bsPager|bsLabel|bsBadge|bsAlert|bsPanel) * @return void */ function renderContent(element, type) { var markup = htmlDecode(document.getElementById('bs-code').value); var selectedNode = getSelectedNode('renderContent'); if(jQuery(selectedNode).hasClass('active') || jQuery(selectedNode).siblings().hasClass('active')) { /* insert new content */ jQuery(selectedNode).after(markup); /* remove old content */ var typesClasses = { 'bsBtn': 'btn', 'bsIcon': bootstrapIcon.searchClass, 'bsImage': 'img', 'bsTable': 'table', 'bsBreadcrumb': 'breadcrumb', 'bsPagination': 'pagination', 'bsPager': 'pager', 'bsLabel': 'label', 'bsBadge': 'badge', 'bsAlert': 'alert', 'bsPanel': 'panel' }; for(var key in typesClasses) { var value = typesClasses[key]; if(type == key) { if(type == 'bsImage' && jQuery(selectedNode).is('img')) { editor.dom.remove(selectedNode); } else if(jQuery(selectedNode).hasClass(value) || jQuery(selectedNode).is('[class*="' + value + '"]')) { // remove old element (is(value) is for icon class)) editor.dom.remove(selectedNode); } } } } else { /* if none selected, insert new content */ editor.insertContent(markup); } /* remove the '
added by tinyMce in pagination with firefox */ editor.dom.remove(editor.dom.select('li > br[data-mce-bogus="1"]')); } function getIconClass(selectedNode) { var iconClass = '', elClasses = jQuery(selectedNode).attr('class').split(' '), reg = new RegExp(bootstrapIcon.searchClass, 'g'); jQuery.each(elClasses, function (index, value) { if(value.match(reg)) { iconClass = value; } }); return iconClass; } /** * get selected node attributes to transmit to iframe * @param string selectedNode * @param string type type of the clicked btn * (bsBtn|bsIcon|bsImage|bsTable|bsTemplate|bsBreadcrumb|bsPagination|bsPager|bsLabel|bsBadge|bsAlert|bsPanel) * @return string node attributes */ function getNodeAttributes(selectedNode, type) { var urlString = ''; if(type == 'bsBtn') { var i; var btnCode = jQuery(selectedNode)[0].outerHTML.replace(' active', ''); var btnIcon = ''; if(jQuery(selectedNode).find('span')[0]) { btnIcon = getIconClass(jQuery(selectedNode).find('span').get(0)); } var iconFont = bootstrapIcon.font; var styles = new Array('default', 'btn-primary', 'btn-success', 'btn-info', 'btn-warning', 'btn-danger'); var btnStyle = ''; for (i = styles.length - 1; i >= 0; i--) { if(jQuery(selectedNode).hasClass(styles[i])) { btnStyle = styles[i]; } } var sizes = new Array('btn-xs', 'btn-sm', 'btn-lg'); var btnSize = ''; for (i = sizes.length - 1; i >= 0; i--) { if(jQuery(selectedNode).hasClass(sizes[i])) { btnSize = sizes[i]; } } var btnTag = jQuery(selectedNode).prop('tagName').toLowerCase(); var btnHref = ''; if(btnTag == 'a') { btnHref = jQuery(selectedNode).attr('href'); } var btnType = ''; if(btnTag == 'button' || btnTag == 'input') { btnType = jQuery(selectedNode).attr('type'); } var btnText; if(btnTag == 'button' || btnTag == 'a') { btnText = jQuery(selectedNode).remove('i').text(); } else { btnText = jQuery(selectedNode).val(); } var iconPos = 'prepend'; if(jQuery(selectedNode).find('span')[0]) { var reg = new RegExp('/^' + btnText + '/'); if(reg.test(jQuery(selectedNode).html()) === true) { iconPos = 'append'; } } btnCode = encodeURIComponent(btnCode); btnIcon = encodeURIComponent(btnIcon); btnStyle = encodeURIComponent(btnStyle); btnSize = encodeURIComponent(btnSize); btnTag = encodeURIComponent(btnTag); btnHref = encodeURIComponent(btnHref); btnType = encodeURIComponent(btnType); btnText = encodeURIComponent(btnText); iconFont = encodeURIComponent(iconFont); iconPos = encodeURIComponent(iconPos); urlString = 'btnCode=' + btnCode + '&btnIcon=' + btnIcon + '&btnStyle=' + btnStyle + '&btnSize=' + btnSize + '&btnTag=' + btnTag + '&btnHref=' + btnHref + '&btnType=' + btnType + '&btnText=' + btnText + '&iconFont=' + iconFont + '&iconPos=' + iconPos; } else if(type == 'bsImage') { var imgSrc = jQuery(selectedNode).attr('src'); var imgAlt = ''; var imgWidth = ''; var imgHeight = ''; var imgStyle = ''; var imgResponsive = 'false'; if(jQuery(selectedNode).hasClass('img-rounded')) { imgStyle = 'img-rounded'; } else if(jQuery(selectedNode).hasClass('img-circle')) { imgStyle = 'img-circle'; } else if(jQuery(selectedNode).hasClass('img-thumbnail')) { imgStyle = 'img-thumbnail'; } if(jQuery(selectedNode).hasClass('img-responsive')) { imgResponsive = 'true'; } if(jQuery(selectedNode).attr('alt')) { imgAlt = jQuery(selectedNode).attr('alt'); } if(jQuery(selectedNode).attr('width')) { imgWidth = jQuery(selectedNode).attr('width'); } if(jQuery(selectedNode).attr('height')) { imgHeight = jQuery(selectedNode).attr('height'); } imgSrc = encodeURIComponent(imgSrc); imgAlt = encodeURIComponent(imgAlt); imgWidth = encodeURIComponent(imgWidth); imgHeight = encodeURIComponent(imgHeight); imgStyle = encodeURIComponent(imgStyle); urlString = 'imgSrc=' + imgSrc + '&imgAlt=' + imgAlt + '&imgWidth=' + imgWidth + '&imgHeight=' + imgHeight + '&imgStyle=' + imgStyle + '&imgResponsive=' + imgResponsive; } else if(type == 'bsIcon') { var icon = getIconClass(selectedNode); var iconSize = jQuery(selectedNode).css('font-size'); var iconColor = jQuery(selectedNode).css('color'); icon = encodeURIComponent(icon); iconSize = encodeURIComponent(iconSize); iconColor = encodeURIComponent(iconColor); urlString = 'icon=' + icon + '&iconSize=' + iconSize + '&iconColor=' + iconColor; } else if(type == 'bsTable') { selectedNode = jQuery(selectedNode).closest('.table'); var tableStriped = 'false'; var tableBordered = 'false'; var tableHover = 'false'; var tableCondensed = 'false'; var tableResponsive = 'false'; if(jQuery(selectedNode).hasClass('table-striped')) { tableStriped = 'true'; } if(jQuery(selectedNode).hasClass('table-bordered')) { tableBordered = 'true'; } if(jQuery(selectedNode).hasClass('table-hover')) { tableHover = 'true'; } if(jQuery(selectedNode).hasClass('table-condensed')) { tableCondensed = 'true'; } if(jQuery(selectedNode).hasClass('table-responsive')) { tableResponsive = 'true'; } urlString = 'tableStriped=' + tableStriped + '&tableBordered=' + tableBordered + '&tableHover=' + tableHover + '&tableCondensed=' + tableCondensed + '&tableResponsive=' + tableResponsive; } else if(type == 'bsBreadcrumb' || type == 'bsPagination' || type == 'bsPager' || type == 'bsLabel' || type == 'bsBadge' || type == 'bsAlert'| type == 'bsPanel') { urlString = 'edit=true'; } return urlString.replace(/(\r\n|\n|\r)/gm, ''); } function htmlDecode(input){ var e = document.createElement('div'); e.innerHTML = input; return e.childNodes.length === 0 ? '' : e.childNodes[0].nodeValue; } // Add custom css for toolbar icons editor.on('init', function() { var cssURL = url + '/css/editor.min.css'; if(document.createStyleSheet){ document.createStyleSheet(cssURL); } else { var cssLink = editor.dom.create('link', { rel: 'stylesheet', href: cssURL }); document.getElementsByTagName('head')[0]. appendChild(cssLink); } /* get custom background color */ var tinymceBackgroundColor = editor.settings.bootstrapConfig.tinymceBackgroundColor; if(tinymceBackgroundColor !== '') { editor.dom.addStyle('.mce-content-body {background-color: ' + tinymceBackgroundColor + ' !important}'); } initCallbackEvents(); }); /** * toggle visual aid for templates * @return void */ function toggleVisualAid() { if(editor.hasVisual) { editor.dom.addClass(editor.dom.select('.mce-content-body '), 'hasVisual'); } else { editor.dom.removeClass(editor.dom.select('.mce-content-body '), 'hasVisual'); } } /* callback events to select bootstrap elements on click and allow updates */ /** * initCallbackEvents * @return void */ function initCallbackEvents() { toggleVisualAid(); editor.on('ExecCommand', function(e) { if(e.command == 'mceToggleVisualAid'); { toggleVisualAid(); } }); toggleVisualAid(); editor.on('click keyup', function(e) { var elementSelector = ''; var editorBtnName = ''; if(jQuery(e.target).is('img')) { // image elementSelector = 'img'; editorBtnName = 'insertImageBtn'; } else if(jQuery(e.target).attr('class')) { if(jQuery(e.target).attr('class').match(/btn/)) { elementSelector = '.btn'; editorBtnName = 'insertBtnBtn'; } else if(isIcon(jQuery(e.target))) { elementSelector = 'icon'; editorBtnName = 'insertIconBtn'; } else if(jQuery(e.target).attr('class').match(/label/)) { elementSelector = '.label'; editorBtnName = 'insertLabelBtn'; } else if(jQuery(e.target).attr('class').match(/badge/)) { elementSelector = '.badge'; editorBtnName = 'insertBadgeBtn'; } else if(jQuery(e.target).attr('class').match(/alert/)) { elementSelector = '.alert'; editorBtnName = 'insertAlertBtn'; } } else if(jQuery(e.target).closest('.table').attr('class')) { // table elementSelector = '.table'; editorBtnName = 'insertTableBtn'; } else if(jQuery(e.target).closest('.breadcrumb').attr('class')) { // breadcrumb elementSelector = '.breadcrumb'; editorBtnName = 'insertBreadcrumbBtn'; } else if(jQuery(e.target).closest('.pagination').attr('class')) { // pagination elementSelector = '.pagination'; editorBtnName = 'insertPaginationBtn'; } else if(jQuery(e.target).closest('.pager').attr('class')) { // pager elementSelector = '.pager'; editorBtnName = 'insertPagerBtn'; } else if(jQuery(e.target).closest('.alert').attr('class')) { // alert elementSelector = '.alert'; editorBtnName = 'insertAlertBtn'; } else if(jQuery(e.target).closest('.panel').attr('class')) { // panel elementSelector = '.panel'; editorBtnName = 'insertPanelBtn'; } /* deactivate all previous activated */ deactivateAll(); if(elementSelector === '') { return; } /* activate current */ activate(e.target, elementSelector, editorBtnName); }); deactivateAll(); // onLoad } function activate(element, elementSelector, editorBtnName) { if(elementSelector == 'icon') { editor.selection.setCursorLocation(element); } else if(elementSelector == '.btn' && jQuery(element).is('input') !== true) { editor.selection.setCursorLocation(element, true); } if(elementSelector == '.table') { jQuery(element).closest('.table').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else if(elementSelector == '.breadcrumb') { jQuery(element).closest('.breadcrumb').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else if(elementSelector == '.pagination') { jQuery(element).closest('.pagination').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else if(elementSelector == '.pager') { jQuery(element).closest('.pager').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else if(elementSelector == '.alert') { jQuery(element).closest('.alert').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else if(elementSelector == '.panel') { jQuery(element).closest('.panel').addClass('active'); toggleEditorButton(editorBtnName, 'on'); } else { jQuery(element).addClass('active'); toggleEditorButton(editorBtnName, 'on'); } } function deactivateAll() { var elements = new Array('.btn', '[class*="' + bootstrapIcon.searchClass + '"]', 'img', '.table', '.breadcrumb', '.pagination', '.pager', '.label', '.badge', '.alert', '.panel'); for (var i = 0; i < elements.length; i++) { jQuery(editor.dom.select(elements[i])).removeClass('active'); } var editorBtns; if(menuType == 'buttongroup') { editorBtns = editor.buttons.bootstrap.items; } else { editorBtns = editor.buttons.bootstrap.menu; } for (var j = editorBtns.length - 1; j >= 0; j--) { editorBtns[j].active(false); } } function toggleEditorButton(editorBtnName, onOff) { var editorBtns; if(menuType == 'buttongroup') { editorBtns = editor.buttons.bootstrap.items; } else { editorBtns = editor.buttons.bootstrap.menu; } for (var i = editorBtns.length - 1; i >= 0; i--) { if(editorBtnName == 'allBtns' || editorBtns[i]._name == editorBtnName) { if(onOff == 'on') { editorBtns[i].active(true); } } } } // Create and render a buttongroup with buttons var bsItems = [], elType = 'button', elClass = 'widget btn bs-icon-btn', text = {}, bsText = [], bsTip = []; text.button = 'Button'; text.image = 'Image'; text.icon = 'Icon'; text.table = 'Table'; text.template = 'Template'; text.breadcrumb = 'Breadcrumb'; text.pagination = 'Pagination'; text.pager = 'Pager'; text.label = 'Label'; text.badge = 'Badge'; text.alert = 'Alert'; text.panel = 'Panel'; text.snippet = 'Snippet'; jQuery.each(text, function(key, val) { bsText[key] = val; bsTip[key] = 'Insert/Edit ' + val; }); if(menuType == 'buttongroup') { jQuery.each(text, function(key, val) { bsText[key] = ''; }); } else { elType = 'menuitem'; elClass = 'bs-list-icon-btn'; } if(menuType == 'buttongroup') { var bs3Btn = tinymce.ui.Factory.create({ type: elType, text: '', classes: elClass, icon: 'bootstrap-icon', tooltip: 'Bootstrap Elements' }); bsItems.push(bs3Btn); } if(bootstrapElements.btn) { var insertBtn = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['button'], icon: 'icon-btn', name: 'insertBtnBtn', tooltip: bsTip['button'], onclick: function() { showDialog('bootstrap-btn.php', 'Insert/Edit Bootstrap Button', 580, 'bsBtn'); } }); bsItems.push(insertBtn); } if(bootstrapElements.image) { var insertImage = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['image'], icon: 'icon-image', name: 'insertImageBtn', tooltip: bsTip['image'], onclick: function() { showDialog('bootstrap-image.php', 'Insert/Edit Bootstrap Image', 580, 'bsImage'); } }); bsItems.push(insertImage); } if(bootstrapElements.icon) { var insertIcon = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['icon'], icon: 'icon-icon', name: 'insertIconBtn', tooltip: bsTip['icon'], onclick: function() { showDialog('bootstrap-icon.php', 'Insert/Edit Bootstrap Icon', 450, 'bsIcon'); } }); bsItems.push(insertIcon); } if(bootstrapElements.table) { var insertTable = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['table'], icon: 'icon-table', name: 'insertTableBtn', tooltip: bsTip['table'], onclick: function() { showDialog('bootstrap-table.php', 'Insert/Edit Bootstrap Table', 620, 'bsTable'); } }); bsItems.push(insertTable); } if(bootstrapElements.template) { var insertTemplate = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['template'], icon: 'icon-template', name: 'insertTemplateBtn', tooltip: bsTip['template'], onclick: function() { showDialog('bootstrap-template.php', 'Insert Bootstrap Template', 580, 'bsTemplate'); } }); bsItems.push(insertTemplate); } if(bootstrapElements.breadcrumb) { var insertBreadcrumb = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['breadcrumb'], icon: 'icon-breadcrumb', name: 'insertBreadcrumbBtn', tooltip: bsTip['breadcrumb'], onclick: function() { showDialog('bootstrap-breadcrumb.php', 'Insert/Edit Bootstrap Breadcrumb', 580, 'bsBreadcrumb'); } }); bsItems.push(insertBreadcrumb); } if(bootstrapElements.pagination) { var insertPagination = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['pagination'], icon: 'icon-pagination', name: 'insertPaginationBtn', tooltip: bsTip['pagination'], onclick: function() { showDialog('bootstrap-pagination.php', 'Insert/Edit Bootstrap Pagination', 650, 'bsPagination'); } }); bsItems.push(insertPagination); } if(bootstrapElements.pager) { var insertPager = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['pager'], icon: 'icon-pager', name: 'insertPagerBtn', tooltip: bsTip['pager'], onclick: function() { showDialog('bootstrap-pager.php', 'Insert/Edit Bootstrap Pager', 450, 'bsPager'); } }); bsItems.push(insertPager); } if(bootstrapElements.label) { var insertLabel = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['label'], icon: 'icon-label', name: 'insertLabelBtn', tooltip: bsTip['label'], onclick: function() { showDialog('bootstrap-label.php', 'Insert/Edit Bootstrap Label', 350, 'bsLabel'); } }); bsItems.push(insertLabel); } if(bootstrapElements.badge) { var insertBadge = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['badge'], icon: 'icon-badge', name: 'insertBadgeBtn', tooltip: bsTip['badge'], onclick: function() { showDialog('bootstrap-badge.php', 'Insert/Edit Bootstrap Badge', 350, 'bsBadge'); } }); bsItems.push(insertBadge); } if(bootstrapElements.alert) { var insertAlert = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['alert'], icon: 'icon-alert', name: 'insertAlertBtn', tooltip: bsTip['alert'], onclick: function() { showDialog('bootstrap-alert.php', 'Insert/Edit Bootstrap Alert', 580, 'bsAlert'); } }); bsItems.push(insertAlert); } if(bootstrapElements.panel) { var insertPanel = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['panel'], icon: 'icon-panel', name: 'insertPanelBtn', tooltip: bsTip['panel'], onclick: function() { showDialog('bootstrap-panel.php', 'Insert/Edit Bootstrap Panel', 650, 'bsPanel'); } }); bsItems.push(insertPanel); } if(bootstrapElements.snippet) { var insertSnippet = tinymce.ui.Factory.create({ type: elType, classes: elClass, text: bsText['snippet'], icon: 'icon-snippet', name: 'insertSnippetBtn', tooltip: bsTip['snippet'], onclick: function() { showDialog('bootstrap-snippet.php?allowEdit=' + editor.settings.bootstrapConfig.allowSnippetManagement, 'Insert Snippet', 650, 'bsSnippet'); } }); bsItems.push(insertSnippet); } if(menuType == 'buttongroup') { editor.addButton('bootstrap', { type: 'buttongroup', classes: 'bs-btn', items: bsItems }); } else { editor.addButton('bootstrap', { type: 'menubutton', text: dropdownText, icon: false, menu: bsItems }); } /** * set tinymce valid_elements according to html5 shema * based on veprbl / html5_valid_elements.js * https://gist.github.com/veprbl/1136304 * @return string */ function getValidElements() { var valid_elements = '@[accesskey|draggable|style|class|hidden|tabindex|contenteditable|id|title|contextmenu|lang|dir 0) { currentNode = parents[0]; if(e.altKey === true) { newParagraph = jQuery('

 

'); // if in table, row, breadcrumb pagination for (var i = 0; i < specificParents.length; i++) { bsElement = specificParents[i]; if(jQuery(currentNode).closest(bsElement)[0]) { jQuery(parents).each(function() { if(jQuery(this).is(bsElement)) { jQuery(this).after(newParagraph); specificParentFound = true; } }); } } if(specificParentFound === false) { jQuery(currentNode).after(newParagraph); } editor.selection.setCursorLocation(newParagraph[0], 0); } else { editor.execCommand('mceInsertContent', false, '
'); var curElm = editor.selection.getRng().startContainer; var caretPos = editor.selection.getBookmark(curElm.textContent).rng.startOffset; editor.selection.setCursorLocation(curElm, caretPos - 1); } } return false; } }); });