// a simple dialog to allow user to paste in some 'embed' HTML and show it via a clickable image CKEDITOR.dialog.add('bfembed', function(editor) { // check embed content and return first valid content object var validateEmbedContent = function(content) { var srchTags = ['embed', 'object', 'applet', 'iframe'], lContent = content.toLowerCase(), valid = false, sPos, ePos, i, tag, start = -1, end = -1; for (i = 0; i < srchTags.length; i++) { tag = srchTags[i]; // find first tag start sPos = lContent.indexOf('<' + tag); // find end tag if (sPos >= 0) { var endtag = '\/'+tag+'>'; ePos = lContent.lastIndexOf(endtag); if (sPos < start || start < 0) { start = sPos; end = ePos + tag.length + 2; } } } if (start >= 0 && end >= 0) { content = content.slice(start, end); valid = true; } return valid; }; // dialog definition return { title : FIRSTCLASS.locale.editor.embed.title, minWidth : 415, minHeight : 128, onOk : function() { var m = editor.message; // the message // sniff out content size var content = this.getValueOf('info', 'embedcontents'); var w = 320, h = 240; var pos = content.indexOf('width="'); if (pos > 0) { w = content.slice(pos + 7, content.indexOf('"', pos + 7)) - 0; } pos = content.indexOf('height="'); if (pos > 0) { h = content.slice(pos + 8, content.indexOf('"', pos + 8)) - 0; } // test for valid content (and filter out invalid stuff) var isValid = validateEmbedContent(content); if (isValid) { // save image attrs and post attachment data var url = FIRSTCLASS.lang.ensureSlashUrl(m._config.baseURL) + FIRSTCLASS.opCodes.FormSave + "?KeepNames=1&Close=-1"; if (FIRSTCLASS.session.server.requiresvkeys && editor.message._embedVKey) { url += "&VKey=" + editor.message._embedVKey; } m._embedIdx++; var attrs = [m._embedIdx, w, h]; if (content !== "" && this._ckEl) { this._ckEl.setAttribute('fcid', 'fcestart'); this._ckEl.setAttribute('fcattrs', attrs.join(";")); var urlStart = content.indexOf('http://'), urlEnd, tUrl; if (urlStart > 0) { urlEnd = content.indexOf('/', urlStart + 7); tUrl = content.slice(urlStart, urlEnd); this._ckEl.setAttribute('title','Embed content from ' + tUrl); } var data = [ { name: 'AttName', value: 'embed' + m._embedIdx + '.html' }, { name: 'Embed', value: content }, { name: 'Close', value: '-1' } ]; var post = FIRSTCLASS.util.net.createPostData(data); FIRSTCLASS.util.net.asyncRequest('POST', url, {}, post.postData, post.cfg); m._embedContents[m._embedIdx] = content; } } else { alert(FIRSTCLASS.locale.editor.embed.scanerror); } return isValid; }, onCancel : function() { if (this._isNew) { var br = this._ckEl.getNext(); br.remove(); this._ckEl.remove(); } }, onShow : function() { this._isNew = true; this._ckEl = false; var sel = editor.getSelection(); var el = sel.getSelectedElement(); var m = editor.message; if (el && el.is && el.is('img') && el.hasClass('fcEmbed')) { this._ckEl = el; this._isNew = false; // fetch previous contents var theAttrs = this._ckEl.getAttribute('fcattrs'); if (theAttrs) { var params = theAttrs.split(";"); var index = params[0] - 0; if (!this._isNew) { if (m._embedContents[index]) { this.setValueOf('info','embedcontents', m._embedContents[index]); } else { var that = this; var callback = { success: function(response) { that.setValueOf('info','embedcontents', response.responseText); } }; var url = m._config.baseURL; if (url.indexOf(m._config.op)) { url = url.slice(0, url.indexOf(m._config.op)); } url = FIRSTCLASS.lang.ensureSlashUrl(url) + "embed" + index + ".html?Close=-1"; FIRSTCLASS.util.net.asyncRequest('GET', url, callback); } } } } else { // create the placeholder image this._ckEl = CKEDITOR.dom.element.createFromHtml("", editor.document); editor.insertElement(this._ckEl); var br = editor.document.createElement('br'); br.insertAfter(this._ckEl); } if (FIRSTCLASS.session.server.requiresvkeys) { // update message's vkey for next time var vkeycb = function(key) { editor.message._embedVKey = key; }; FIRSTCLASS.util.net.getVKey(vkeycb); } }, contents : [ { id : 'info', elements : [ { type : 'textarea', id : 'embedcontents', width: '85%', label : FIRSTCLASS.locale.editor.embed.paste } ] } ] }; } );