UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

226 lines (185 loc) 5.17 kB
/** * plugin.js * * Copyright, Moxiecode Systems AB * Released under LGPL License. * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ /*global tinymce:true */ tinymce.PluginManager.add('layer', function(editor) { function getParentLayer(node) { do { if (node.className && node.className.indexOf('mceItemLayer') != -1) { return node; } } while ((node = node.parentNode)); } function visualAid(e) { var dom = editor.dom; tinymce.each(dom.select('div,p', e), function(e) { if (/^(absolute|relative|fixed)$/i.test(e.style.position)) { if (e.hasVisual) { dom.addClass(e, 'mceItemVisualAid'); } else { dom.removeClass(e, 'mceItemVisualAid'); } dom.addClass(e, 'mceItemLayer'); } }); } function move(d) { var i, z = [], le = getParentLayer(editor.selection.getNode()), ci = -1, fi = -1, nl; nl = []; tinymce.walk(editor.getBody(), function(n) { if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position)) { nl.push(n); } }, 'childNodes'); // Find z-indexes for (i = 0; i < nl.length; i++) { z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex, 10) : 0; if (ci < 0 && nl[i] == le) { ci = i; } } if (d < 0) { // Move back // Try find a lower one for (i = 0; i < z.length; i++) { if (z[i] < z[ci]) { fi = i; break; } } if (fi > -1) { nl[ci].style.zIndex = z[fi]; nl[fi].style.zIndex = z[ci]; } else { if (z[ci] > 0) { nl[ci].style.zIndex = z[ci] - 1; } } } else { // Move forward // Try find a higher one for (i = 0; i < z.length; i++) { if (z[i] > z[ci]) { fi = i; break; } } if (fi > -1) { nl[ci].style.zIndex = z[fi]; nl[fi].style.zIndex = z[ci]; } else { nl[ci].style.zIndex = z[ci] + 1; } } editor.execCommand('mceRepaint'); } function insertLayer() { var dom = editor.dom, p = dom.getPos(dom.getParent(editor.selection.getNode(), '*')); var body = editor.getBody(); editor.dom.add(body, 'div', { style: { position: 'absolute', left: p.x, top: (p.y > 20 ? p.y : 20), width: 100, height: 100 }, 'class': 'mceItemVisualAid mceItemLayer' }, editor.selection.getContent() || editor.getLang('layer.content')); // Workaround for IE where it messes up the JS engine if you insert a layer on IE 6,7 if (tinymce.Env.ie) { dom.setHTML(body, body.innerHTML); } } function toggleAbsolute() { var le = getParentLayer(editor.selection.getNode()); if (!le) { le = editor.dom.getParent(editor.selection.getNode(), 'DIV,P,IMG'); } if (le) { if (le.style.position.toLowerCase() == "absolute") { editor.dom.setStyles(le, { position: '', left: '', top: '', width: '', height: '' }); editor.dom.removeClass(le, 'mceItemVisualAid'); editor.dom.removeClass(le, 'mceItemLayer'); } else { if (!le.style.left) { le.style.left = 20 + 'px'; } if (!le.style.top) { le.style.top = 20 + 'px'; } if (!le.style.width) { le.style.width = le.width ? (le.width + 'px') : '100px'; } if (!le.style.height) { le.style.height = le.height ? (le.height + 'px') : '100px'; } le.style.position = "absolute"; editor.dom.setAttrib(le, 'data-mce-style', ''); editor.addVisual(editor.getBody()); } editor.execCommand('mceRepaint'); editor.nodeChanged(); } } // Register commands editor.addCommand('mceInsertLayer', insertLayer); editor.addCommand('mceMoveForward', function() { move(1); }); editor.addCommand('mceMoveBackward', function() { move(-1); }); editor.addCommand('mceMakeAbsolute', function() { toggleAbsolute(); }); // Register buttons editor.addButton('moveforward', {title: 'layer.forward_desc', cmd: 'mceMoveForward'}); editor.addButton('movebackward', {title: 'layer.backward_desc', cmd: 'mceMoveBackward'}); editor.addButton('absolute', {title: 'layer.absolute_desc', cmd: 'mceMakeAbsolute'}); editor.addButton('insertlayer', {title: 'layer.insertlayer_desc', cmd: 'mceInsertLayer'}); editor.on('init', function() { if (tinymce.Env.ie) { editor.getDoc().execCommand('2D-Position', false, true); } }); // Remove serialized styles when selecting a layer since it might be changed by a drag operation editor.on('mouseup', function(e) { var layer = getParentLayer(e.target); if (layer) { editor.dom.setAttrib(layer, 'data-mce-style', ''); } }); // Fixes edit focus issues with layers on Gecko // This will enable designMode while inside a layer and disable it when outside editor.on('mousedown', function(e) { var node = e.target, doc = editor.getDoc(), parent; if (tinymce.Env.gecko) { if (getParentLayer(node)) { if (doc.designMode !== 'on') { doc.designMode = 'on'; // Repaint caret node = doc.body; parent = node.parentNode; parent.removeChild(node); parent.appendChild(node); } } else if (doc.designMode == 'on') { doc.designMode = 'off'; } } }); editor.on('NodeChange', visualAid); });