Vlad Kurkin (b_vladi) wrote in changelog,
Vlad Kurkin
b_vladi
changelog

[livejournal] r20467: LJSUP-10170: Correct css in RTE

Committer: vkurkin
LJSUP-10170: Correct css in RTE
U   trunk/htdocs/js/ck/contents.css
U   trunk/htdocs/js/ck/plugins/livejournal/plugin.js
U   trunk/htdocs/js/rte.js
Modified: trunk/htdocs/js/ck/contents.css
===================================================================
--- trunk/htdocs/js/ck/contents.css	2011-11-01 12:30:56 UTC (rev 20466)
+++ trunk/htdocs/js/ck/contents.css	2011-11-01 14:47:25 UTC (rev 20467)
@@ -58,14 +58,14 @@
 	display: block;
 }
 
-lj\:cut {
+lj|cut {
 	display: block;
 	border: #000 1px dotted;
 	background-color: #d2d2d2;
 	min-height: 14px;
 }
 
-lj|cut {
+lj\:cut {
 	display: block;
 	border: #000 1px dotted;
 	background-color: #d2d2d2;
@@ -73,13 +73,12 @@
 }
 
 /* fix inline behavior, for no IE */
-lj\:cut ul,
-lj\:cut ol {
+.lj|cut ul, .lj|cut ol {
 	background-color: #d2d2d2;
 	border: #000 1px dotted;
 }
-lj|cut ul,
-lj|cut ol {
+
+.lj\:cut ul, .lj\:cut ol {
 	background-color: #d2d2d2;
 	border: #000 1px dotted;
 }
@@ -151,7 +150,7 @@
 		background-position: 0 -21px;
 		}
 /* LJ map */
-.lj-map {
+.lj-map, .lj-iframe {
 	position: relative;
 	top: 45%;
 	display: inline-block;

Modified: trunk/htdocs/js/ck/plugins/livejournal/plugin.js
===================================================================
--- trunk/htdocs/js/ck/plugins/livejournal/plugin.js	2011-11-01 12:30:56 UTC (rev 20466)
+++ trunk/htdocs/js/ck/plugins/livejournal/plugin.js	2011-11-01 14:47:25 UTC (rev 20467)
@@ -1,4 +1,4 @@
-(function() {
+(function(){
 	var dtd = CKEDITOR.dtd;
 
 	dtd.$block['lj:template'] = 1;
@@ -39,87 +39,71 @@
 			id: 'facebook',
 			abbr: 'fb',
 			html: '<span class="lj-like-item fb">' + top.CKLang.LJLike_button_facebook + '</span>',
-			htmlOpt: '<li class="like-fb"><input type="checkbox" id="like-fb" /><label for="like-fb">' + top.CKLang
-				.LJLike_button_facebook + '</label></li>'
+			htmlOpt: '<li class="like-fb"><input type="checkbox" id="like-fb" /><label for="like-fb">' + top.CKLang.LJLike_button_facebook + '</label></li>'
 		},
 		{
 			label: top.CKLang.LJLike_button_twitter,
 			id: 'twitter',
 			abbr: 'tw',
 			html: '<span class="lj-like-item tw">' + top.CKLang.LJLike_button_twitter + '</span>',
-			htmlOpt: '<li class="like-tw"><input type="checkbox" id="like-tw" /><label for="like-tw">' + top.CKLang
-				.LJLike_button_twitter + '</label></li>'
+			htmlOpt: '<li class="like-tw"><input type="checkbox" id="like-tw" /><label for="like-tw">' + top.CKLang.LJLike_button_twitter + '</label></li>'
 		},
 		{
 			label: top.CKLang.LJLike_button_google,
 			id: 'google',
 			abbr: 'go',
 			html: '<span class="lj-like-item go">' + top.CKLang.LJLike_button_google + '</span>',
-			htmlOpt: '<li class="like-go"><input type="checkbox" id="like-go" /><label for="like-go">' + top.CKLang
-				.LJLike_button_google + '</label></li>'
+			htmlOpt: '<li class="like-go"><input type="checkbox" id="like-go" /><label for="like-go">' + top.CKLang.LJLike_button_google + '</label></li>'
 		},
 		{
 			label: top.CKLang.LJLike_button_vkontakte,
 			id: 'vkontakte',
 			abbr: 'vk',
 			html: '<span class="lj-like-item vk">' + top.CKLang.LJLike_button_vkontakte + '</span>',
-			htmlOpt: window
-				.isSupUser ? '<li class="like-vk"><input type="checkbox" id="like-vk" /><label for="like-vk">' + top.CKLang
-				.LJLike_button_vkontakte + '</label></li>' : ''
+			htmlOpt: window.isSupUser ? '<li class="like-vk"><input type="checkbox" id="like-vk" /><label for="like-vk">' + top.CKLang.LJLike_button_vkontakte + '</label></li>' : ''
 		},
 		{
 			label: top.CKLang.LJLike_button_give,
 			id: 'livejournal',
 			abbr: 'lj',
 			html: '<span class="lj-like-item lj">' + top.CKLang.LJLike_button_give + '</span>',
-			htmlOpt: '<li class="like-lj"><input type="checkbox" id="like-lj" /><label for="like-lj">' + top.CKLang
-				.LJLike_button_give + '</label></li>'
+			htmlOpt: '<li class="like-lj"><input type="checkbox" id="like-lj" /><label for="like-lj">' + top.CKLang.LJLike_button_give + '</label></li>'
 		}
 	];
 
-	var note;
-
 	var ljTagsData = {
 		LJPollLink: {
-			html: encodeURIComponent(top.CKLang.Poll_PollWizardNotice + '<br /><a href="#" lj-cmd="LJPollLink">' + top.CKLang
-				.Poll_PollWizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.Poll_PollWizardNotice + '<br /><a href="#" lj-cmd="LJPollLink">' + top.CKLang.Poll_PollWizardNoticeLink + '</a>')
 		},
 		LJLike: {
-			html: encodeURIComponent(top.CKLang.LJLike_WizardNotice + '<br /><a href="#" lj-cmd="LJLike">' + top.CKLang
-				.LJLike_WizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.LJLike_WizardNotice + '<br /><a href="#" lj-cmd="LJLike">' + top.CKLang.LJLike_WizardNoticeLink + '</a>')
 		},
 		LJUserLink: {
-			html: encodeURIComponent(top.CKLang.LJUser_WizardNotice + '<br /><a href="#" lj-cmd="LJUserLink">' + top.CKLang
-				.LJUser_WizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.LJUser_WizardNotice + '<br /><a href="#" lj-cmd="LJUserLink">' + top.CKLang.LJUser_WizardNoticeLink + '</a>')
 		},
 		LJLink: {
-			html: encodeURIComponent(top.CKLang.LJLink_WizardNotice + '<br /><a href="#" lj-cmd="LJLink">' + top.CKLang
-				.LJLink_WizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.LJLink_WizardNotice + '<br /><a href="#" lj-cmd="LJLink">' + top.CKLang.LJLink_WizardNoticeLink + '</a>')
 		},
 		image: {
-			html: encodeURIComponent(top.CKLang.LJImage_WizardNotice + '<br /><a href="#" lj-cmd="image">' + top.CKLang
-				.LJImage_WizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.LJImage_WizardNotice + '<br /><a href="#" lj-cmd="image">' + top.CKLang.LJImage_WizardNoticeLink + '</a>')
 		},
 		LJCut: {
-			html: encodeURIComponent(top.CKLang.LJCut_WizardNotice + '<br /><a href="#" lj-cmd="LJCut">' + top.CKLang
-				.LJCut_WizardNoticeLink + '</a>')
+			html: encodeURIComponent(top.CKLang.LJCut_WizardNotice + '<br /><a href="#" lj-cmd="LJCut">' + top.CKLang.LJCut_WizardNoticeLink + '</a>')
 		}
 	};
 
 	var ljUsers = {};
-	var activeCmdName,
-		execFromEditor;
+	var execFromEditor;
 
-	function createNote(editor) {
+	function createNote(editor){
 		var timer,
 			state,
 			currentData,
 			tempData,
-			note,
 			noteNode = document.createElement('lj-note'),
 			isIE = typeof(document.body.style.opacity) != 'string';
 
-		var animate = (function() {
+		var animate = (function(){
 			var fps = 60,
 				totalTime = 100,
 				steps = totalTime * fps / 1000,
@@ -127,37 +111,36 @@
 				type,
 				parentContainer = document.getElementById('draft-container') || document.body;
 
-			function apply() {
+			function apply(){
 				var data = timeOuts.shift();
 				var currentStep = (type ? data.time / totalTime : -(data.time / totalTime - 1)).toFixed(1);
 
-				if (!timeOuts.length) {
+				if(!timeOuts.length){
 					currentStep = type ? 1 : 0;
 				}
 
-				if (isIE) {
-					noteNode.style
-						.filter = (currentStep >= 1) ? null : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + (currentStep * 100) + ')';
+				if(isIE){
+					noteNode.style.filter = (currentStep >= 1) ? null : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + (currentStep * 100) + ')';
 				} else {
 					noteNode.style.opacity = currentStep;
 				}
 
-				if (currentStep == 0 && noteNode && noteNode.parentNode) {
+				if(currentStep == 0 && noteNode && noteNode.parentNode){
 					noteNode.parentNode.removeChild(noteNode);
 				}
 			}
 
-			return function(animateType) {
+			return function(animateType){
 				type = animateType;
 
-				if (type && noteNode.parentNode) {
-					if (isIE) {
+				if(type && noteNode.parentNode){
+					if(isIE){
 						noteNode.style.filter = null;
 					} else {
 						noteNode.style.opacity = 1;
 					}
 				} else {
-					for (var i = 1; i <= steps; i++) {
+					for(var i = 1; i <= steps; i++){
 						var time = Math.floor(1000 / fps) * i;
 						timeOuts.push({
 							time: time,
@@ -174,50 +157,50 @@
 
 		noteNode.className = 'note-popup';
 
-		noteNode.onmouseout = function() {
-			if (!currentData || !currentData.cmd) {
-				note.hide();
+		noteNode.onmouseout = function(){
+			if(!currentData || !currentData.cmd){
+				CKEDITOR.note.hide();
 			}
 		};
 
-		noteNode.onmouseover = function() {
-			if (timer && !state) {
+		noteNode.onmouseover = function(){
+			if(timer && !state){
 				state = 1;
 				clearTimeout(timer);
 				timer = null;
 			}
 		};
 
-		if (isIE) {
+		if(isIE){
 			noteNode.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)';
 		} else {
 			noteNode.style.opacity = 0;
 		}
 
-		function callCmd() {
+		function callCmd(){
 			var cmd = this.getAttribute('lj-cmd');
-			if (currentData.hasOwnProperty(cmd)) {
+			if(currentData.hasOwnProperty(cmd)){
 				ljTagsData[cmd].node = currentData[cmd].node;
 				var selection = new CKEDITOR.dom.selection(editor.document);
 				selection.selectElement(ljTagsData[cmd].node);
 				execFromEditor = true;
 				editor.execCommand(cmd);
-				note.hide(true);
+				CKEDITOR.note.hide(true);
 			}
 			return false;
 		}
 
-		function applyNote() {
+		function applyNote(){
 			if(!window.switchedRteOn){
-				return;
+				CKEDITOR.note.hide(true);
 			}
-			if (state) {
+			if(state){
 				currentData = tempData;
 				tempData = null;
 
 				var html = '';
-				for (var cmd in currentData) {
-					if (currentData.hasOwnProperty(cmd)) {
+				for(var cmd in currentData){
+					if(currentData.hasOwnProperty(cmd)){
 						html += '<div class="noteItem">' + currentData[cmd].content + '</div>';
 					}
 				}
@@ -225,9 +208,9 @@
 				noteNode.innerHTML = decodeURIComponent(html);
 
 				var links = noteNode.getElementsByTagName('a');
-				for (var i = 0, l = links.length; i < l; i++) {
+				for(var i = 0, l = links.length; i < l; i++){
 					var link = links[i];
-					if (ljTagsData.hasOwnProperty(link.getAttribute('lj-cmd'))) {
+					if(ljTagsData.hasOwnProperty(link.getAttribute('lj-cmd'))){
 						link.onclick = callCmd;
 					}
 				}
@@ -240,13 +223,13 @@
 			timer = null;
 		}
 
-		note = {
-			show: function(data, isNow) {
-				if ((!isNow && data == tempData) || window.swi) {
+		CKEDITOR.note = {
+			show: function(data, isNow){
+				if((!isNow && data == tempData) || window.swi){
 					return;
 				}
 
-				if (timer) {
+				if(timer){
 					clearTimeout(timer);
 					timer = null;
 				}
@@ -257,137 +240,165 @@
 
 				isNow === true ? applyNote() : timer = setTimeout(applyNote, 1000);
 			},
-			hide: function(isNow) {
-				if (state) {
+			hide: function(isNow){
+				if(state){
 					state = 0;
 
-					if (timer) {
+					if(timer){
 						clearTimeout(timer);
 						timer = null;
 					}
 
-					if (noteNode.parentNode) {
+					if(noteNode.parentNode){
 						isNow === true ? applyNote() : timer = setTimeout(applyNote, 500);
 					}
 				}
 			}
 		};
-
-		return note;
 	}
 
 	CKEDITOR.plugins.add('livejournal', {
-		init: function(editor) {
-			editor.addCss('.lj_selected {' +
-				'background-color: #C4E0F7 !important;' +
-				'border: 1px solid #6EA9DF !important;' +
-			'}');
+		init: function(editor){
+			editor.addCss('.lj_selected {' + 'background-color: #C4E0F7 !important;' + 'border: 1px solid #6EA9DF !important;' + '}');
 
-			function onClickFrame(evt) {
-				if (this.$ != editor.document.$) {
-					var frame = this.frameElement;
-					var cmdName = frame.getAttribute('lj-cmd');
-					if(cmdName){
-						editor.getCommand(cmdName).setState(CKEDITOR.TRISTATE_ON);
-					}
-					evt.editor = editor;
-					new CKEDITOR.dom.selection(editor.document).selectElement(frame);
-					frame.addClass('lj_selected');
+			function onClickFrame(evt){
+				if(this.$ != editor.document.$){
+					new CKEDITOR.dom.selection(editor.document).selectElement(this.frameElement);
 				}
+
 				evt.data.getKey() == 1 && evt.data.preventDefault();
 			}
 
-			function onPressFrame(evt) {
+			function onKeyUp(evt){
 				if(evt.data.getKey() == 46){
-					this.frameElement.remove();
+					var ranges = new CKEDITOR.dom.selection(editor.document).getRanges();
+					var length = ranges.length;
+					while(length--){
+						ranges[length].deleteContents();
+					}
 				}
 			}
 
-			function findLJTags(evt) {
+			function onLoadFrame(){
+				var win = this.$.contentWindow;
+				var doc = win.document;
+				if(win.frameElement.getAttribute('lj-cmd') && doc.body.scrollHeight){
+					this.setStyle('height', doc.body.scrollHeight + 'px');
+				}
+
+				var body = new CKEDITOR.dom.element.get(doc.body);
+				body.on('dblclick', onDoubleClick);
+				body.on('click', onClickFrame);
+
+				doc = new CKEDITOR.dom.element.get(doc);
+				doc.on('keyup', onKeyUp);
+
+				doc.frameElement = body.frameElement = this;
+			}
+
+			function updateFrames(){
+				execFromEditor = false;
+				var frames = editor.document.getElementsByTag('iframe');
+				var length = frames.count();
+
+				while(length--){
+					var iFrameCss = 'widht: 100%; margin: 0; padding 0; overflow-y: hidden;',
+						frame = frames.getItem(length),
+						cmd = frame.getAttribute('lj-cmd'),
+						frameWin = frame.$.contentWindow,
+						doc = frameWin.document,
+						ljStyle = frame.getAttribute('lj-style');
+
+					if(ljStyle){
+						iFrameCss += ljStyle;
+					}
+
+					frame.removeListener('load', onLoadFrame);
+					frame.on('load', onLoadFrame);
+					doc.open();
+					doc.write('<!DOCTYPE html><html style="' + iFrameCss + '"><head><style type="text/css">' + styleSheet + '</style></head><body style="' + iFrameCss + '" ' + (cmd ? ('lj-cmd="' + cmd + '"') : '') + '>' + decodeURIComponent(frame.getAttribute('lj-content') || '&nbsp;') + '</body></html>');
+					doc.close();
+				}
+			}
+
+			function findLJTags(evt){
 				var noteData,
 					isSelection = evt.name == 'selectionChange' || evt.name == 'click',
-					target = evt.data.element || evt.data.getTarget();
+					target = evt.data.element || evt.data.getTarget(),
+					node,
+					command;
 
-				if (evt.name == 'click' && (evt.data.getKey() == 1 || evt.data.$.button == 0)) {
+				if(evt.name == 'click' && (evt.data.getKey() == 1 || evt.data.$.button == 0)){
 					evt.data.preventDefault();
 				}
 
-				if (target.type != 1) {
+				if(target.type != 1){
 					target = target.getParent();
 				}
 
-				var node = target,
-					command;
+				node = target;
 
 				if(isSelection){
 					var frames = editor.document.getElementsByTag('iframe');
 					for(var i = 0, l = frames.count(); i < l; i++){
-						var item = frames.getItem(i);
-						if(item.$ !== target.$){
-							item.removeClass('lj_selected');
-						}
+						frames.getItem(i).removeClass('lj_selected');
 					}
-					if(CKEDITOR.env.ie && node.is('iframe')){
+
+					if(node.is('iframe')){
 						node.addClass('lj_selected');
 					}
 				}
-				while (node) {
+
+				do {
 					var attr = node.getAttribute('lj-cmd');
 
-					if (!attr && node.type == 1) {
-						if (node.is('img') && node.getParent().getParent() && !node.getParent().getParent()
-							.hasAttribute('lj:user')) {
+					if(!attr && node.type == 1){
+						var parent = node.getParent();
+						if(node.is('img') && parent.getParent() && !parent.getParent().hasAttribute('lj:user')){
 							attr = 'image';
 							node.setAttribute('lj-cmd', attr);
-						} else if (node.is('a') && !node.getParent().hasAttribute('lj:user')) {
+						} else if(node.is('a') && !parent.hasAttribute('lj:user')){
 							attr = 'LJLink';
 							node.setAttribute('lj-cmd', attr);
 						}
 					}
 
-					if (attr && ljTagsData.hasOwnProperty(attr)) {
-						if (isSelection) {
+					if(attr && ljTagsData.hasOwnProperty(attr)){
+						if(isSelection){
 							ljTagsData[attr].node = node;
 							editor.getCommand(attr).setState(CKEDITOR.TRISTATE_ON);
-							activeCmdName = attr;
 						}
 						(noteData || (noteData = {}))[attr] = {
 							content: ljTagsData[attr].html,
 							node: node
 						};
 					}
+				} while(node = node.getParent());
 
-					node = node.getParent();
-				}
-
-				noteData ? note.show(noteData) : note.hide();
-
-				for (command in ljTagsData) {
-					if (ljTagsData.hasOwnProperty(command) && isSelection && (!noteData || !noteData.hasOwnProperty(command))) {
-						if (ljTagsData[command].node) {
+				if(isSelection){
+					for(command in ljTagsData){
+						if(ljTagsData.hasOwnProperty(command) && (!noteData || !noteData.hasOwnProperty(command))){
 							delete ljTagsData[command].node;
+							editor.getCommand(command).setState(CKEDITOR.TRISTATE_OFF);
 						}
-						editor.getCommand(command).setState(CKEDITOR.TRISTATE_OFF);
 					}
 				}
+
+				noteData ? CKEDITOR.note.show(noteData) : CKEDITOR.note.hide();
 			}
 
-			editor.dataProcessor.toHtml = function(html, fixForBody) {
-				html = html.replace(/(<lj [^>]+)(?!\/)>/gi, '$1 />').replace(/(<lj-map[^>]+)(?!\/)>/gi, '$1 />')
-					.replace(/(<lj-template[^>]*)(?!\/)>/gi, '$1 />').replace(/<((?!br)[^\s>]+)([^>]*?)\/>/gi, '<$1$2></$1>')
-					.replace(/<lj-poll .*?>[\s\S]*?<\/lj-poll>/gi, function(ljtags) {
-					var poll = new Poll(ljtags);
-					return '<iframe class="lj-poll" frameborder="0" allowTransparency="true" lj-cmd="LJPollLink" lj-data="' + poll
-						.outputLJtags() + '" lj-content="' + poll.outputHTML() + '"></iframe>';
-				});
+			editor.dataProcessor.toHtml = function(html, fixForBody){
+				html = html.replace(/(<lj [^>]+)(?!\/)>/gi, '$1 />').replace(/(<lj-map[^>]+)(?!\/)>/gi, '$1 />').replace(/(<lj-template[^>]*)(?!\/)>/gi, '$1 />').replace(/<((?!br)[^\s>]+)([^>]*?)\/>/gi, '<$1$2></$1>').replace(/<lj-poll.*?>[\s\S]*?<\/lj-poll>/gi,
+					function(ljtags){
+						var poll = new Poll(ljtags);
+						return '<iframe class="lj-poll" frameborder="0" allowTransparency="true" ' + 'lj-cmd="LJPollLink" lj-data="' + poll.outputLJtags() + '" lj-content="' + poll.outputHTML() + '"></iframe>';
+					}).replace(/<lj-embed(.*?)>([\s\S]*?)<\/lj-embed>/gi, function(result, attrs, data){
+						return '<iframe' + attrs + ' class="lj-embed" lj-style="height: 100%;" lj-data="' + encodeURIComponent(data) + '" frameborder="0" allowTransparency="true"></iframe>';
+					});
 
-				html = html.replace(/<lj-embed(.*?)>([\s\S]*?)<\/lj-embed>/gi, function(result, attrs, data) {
-					return '<iframe' + attrs + ' class="lj-embed" lj-data="' + encodeURIComponent(data) + '" frameborder="0" allowTransparency="true"></iframe>';
-				});
-
-				if (!$('event_format').checked) {
+				if(!$('event_format').checked){
 					html = html.replace(/(<lj-raw.*?>)([\s\S]*?)(<\/lj-raw>)/gi,
-						function(result, open, content, close) {
+						function(result, open, content, close){
 							return open + content.replace(/\n/g, '') + close;
 						}).replace(/\n/g, '<br />');
 				}
@@ -399,10 +410,10 @@
 				return html;
 			};
 
-			editor.dataProcessor.toDataFormat = function(html, fixForBody) {
+			editor.dataProcessor.toDataFormat = function(html, fixForBody){
 				html = CKEDITOR.htmlDataProcessor.prototype.toDataFormat.call(this, html, fixForBody);
 
-				if (!$('event_format').checked) {
+				if(!$('event_format').checked){
 					html = html.replace(/<br\s*\/>/gi, '\n');
 				}
 
@@ -414,21 +425,20 @@
 			editor.dataProcessor.writer.indentationChars = '';
 			editor.dataProcessor.writer.lineBreakChars = '';
 
-			function onDoubleClick(evt) {
+			function onDoubleClick(evt){
 				var node = evt.data.element || evt.data.getTarget();
 
-				if (node.type != 1) {
+				if(node.type != 1){
 					node = node.getParent();
 				}
 
-				while (node) {
+				while(node){
 					var cmdName = node.getAttribute('lj-cmd');
-					if (ljTagsData.hasOwnProperty(cmdName)) {
+					if(ljTagsData.hasOwnProperty(cmdName)){
 						var cmd = editor.getCommand(cmdName);
-						if (cmd.state == CKEDITOR.TRISTATE_ON) {
+						if(cmd.state == CKEDITOR.TRISTATE_ON){
 							var selection = new CKEDITOR.dom.selection(editor.document);
-							ljTagsData[cmdName].node = node.is('body') ? new CKEDITOR.dom.element.get(node.getWindow().$
-								.frameElement) : node;
+							ljTagsData[cmdName].node = node.is('body') ? new CKEDITOR.dom.element.get(node.getWindow().$.frameElement) : node;
 							selection.selectElement(ljTagsData[cmdName].node);
 							evt.data.dialog = '';
 							execFromEditor = true;
@@ -436,6 +446,7 @@
 							break;
 						}
 					}
+
 					node = node.getParent();
 				}
 			}
@@ -446,58 +457,19 @@
 				styleSheet = data;
 			});
 
-			function onLoadFrame() {
-				var win = this.$.contentWindow;
-				var doc = win.document;
-				if(win.frameElement.getAttribute('lj-cmd') && doc.body.scrollHeight){
-					this.setStyle('height', doc.body.scrollHeight + 'px');
-				}
-
-				var body = new CKEDITOR.dom.element.get(doc.body);
-				body.on('dblclick', onDoubleClick);
-				body.on('click', onClickFrame);
-
-				doc = new CKEDITOR.dom.element.get(doc);
-				doc.on('keyup', onPressFrame);
-
-				doc.frameElement = body.frameElement = this;
-			}
-
-			function updateFrames() {
-				execFromEditor = false;
-				var frames = editor.document.getElementsByTag('iframe');
-				var length = frames.count();
-
-				while (length--) {
-					var iFrameCss = 'width: 100%; margin: 0; padding 0; overflow-y: hidden;',
-						frame = frames.getItem(length),
-						cmd = frame.getAttribute('lj-cmd'),
-						frameWin = frame.$.contentWindow,
-						doc = frameWin.document,
-						ljStyle = frame.getAttribute('lj-style');
-
-					if (ljStyle) {
-						iFrameCss += ljStyle;
-					}
-
-					frame.removeListener('load', onLoadFrame);
-					frame.on('load', onLoadFrame);
-					doc.open();
-					doc.write('<!DOCTYPE html><html style="' + iFrameCss + '"><head><style type="text/css">' + styleSheet + '</style></head><body style="' + iFrameCss + '" ' + (cmd ? ('lj-cmd="' + cmd + '"') : '') + '>' + decodeURIComponent(frame.getAttribute('lj-content') || '&nbsp;' ) + '</body></html>');
-					doc.close();
-				}
-			}
-
 			editor.on('selectionChange', findLJTags);
 			editor.on('doubleclick', onDoubleClick);
 			editor.on('afterCommandExec', updateFrames);
 			editor.on('dialogHide', updateFrames);
-			editor.on('dataReady', function() {
-				note = note || createNote(editor);
+			editor.on('dataReady', function(){
+				if(!CKEDITOR.note){
+					createNote(editor);
+				}
+
 				editor.document.on('click', findLJTags);
-				editor.document.on('mouseout', note.hide);
+				editor.document.on('mouseout', CKEDITOR.note.hide);
 				editor.document.on('mouseover', findLJTags);
-
+				editor.document.on('keyup', onKeyUp);
 				updateFrames();
 			});
 
@@ -505,25 +477,25 @@
 			var url = top.Site.siteroot + '/tools/endpoints/ljuser.bml';
 
 			editor.addCommand('LJUserLink', {
-				exec: function(editor) {
+				exec: function(editor){
 					var userName = '',
 						selection = new CKEDITOR.dom.selection(editor.document),
 						LJUser = ljTagsData.LJUserLink.node,
 						currentUserName;
 
-					if (LJUser) {
-						note.hide(true);
+					if(LJUser){
+						CKEDITOR.note && CKEDITOR.note.hide(true);
 						currentUserName = ljTagsData.LJUserLink.node.getElementsByTag('b').getItem(0).getText();
 						userName = prompt(top.CKLang.UserPrompt, currentUserName);
-					} else if (selection.getType() == 2) {
+					} else if(selection.getType() == 2){
 						userName = selection.getSelectedText();
 					}
 
-					if (userName == '') {
+					if(userName == ''){
 						userName = prompt(top.CKLang.UserPrompt, userName);
 					}
 
-					if (!userName || currentUserName == userName) {
+					if(!userName || currentUserName == userName){
 						return;
 					}
 
@@ -533,12 +505,12 @@
 						}),
 						method: 'POST',
 						url: url,
-						onData: function(data) {
-							if (data.error) {
+						onData: function(data){
+							if(data.error){
 								alert(data.error);
 								return;
 							}
-							if (!data.success) {
+							if(!data.success){
 								return;
 							}
 							data.ljuser = data.ljuser.replace('<span class="useralias-value">*</span>', '');
@@ -548,7 +520,7 @@
 							var tmpNode = new CKEDITOR.dom.element.createFromHtml(data.ljuser);
 							tmpNode.setAttribute('lj-cmd', 'LJUserLink');
 
-							if (LJUser) {
+							if(LJUser){
 								LJUser.$.parentNode.replaceChild(tmpNode.$, LJUser.$);
 							} else {
 								editor.insertElement(tmpNode);
@@ -564,7 +536,6 @@
 			});
 
 			//////////  LJ Image Button //////////////
-
 			editor.ui.addButton('image', {
 				label: editor.lang.common.imageButton,
 				command: 'image'
@@ -572,12 +543,12 @@
 
 			if(window.ljphotoEnabled){
 				editor.addCommand('LJImage_beta', {
-					exec: function(editor) {
-							jQuery('#updateForm').photouploader({
-								type: 'upload'
-							}).photouploader('show').bind('htmlready', function (event) {
+					exec: function(editor){
+						jQuery('#updateForm').photouploader({
+							type: 'upload'
+						}).photouploader('show').bind('htmlready', function (event){
 								var html = event.htmlStrings;
-								for (var i = 0, l = html.length; i < l; i++) {
+								for(var i = 0, l = html.length; i < l; i++){
 									editor.insertElement(new CKEDITOR.dom.element.createFromHtml(html[i], editor.document));
 								}
 							});
@@ -593,10 +564,9 @@
 
 			//////////  LJ Link Button //////////////
 			editor.addCommand('LJLink', {
-				exec: function(editor) {
-					!execFromEditor && this.state == CKEDITOR.TRISTATE_ON ? editor.execCommand('unlink') : editor
-						.openDialog('link');
-					note.hide(true);
+				exec: function(editor){
+					!execFromEditor && this.state == CKEDITOR.TRISTATE_ON ? editor.execCommand('unlink') : editor.openDialog('link');
+					CKEDITOR.note && CKEDITOR.note.hide(true);
 				},
 				editorFocus: false
 			});
@@ -608,7 +578,7 @@
 
 			//////////  LJ Embed Media Button //////////////
 			editor.addCommand('LJEmbedLink', {
-				exec: function() {
+				exec: function(){
 					top.LJ_IPPU.textPrompt(top.CKLang.LJEmbedPromptTitle, top.CKLang.LJEmbedPrompt, doEmbed, {
 						width: '350px'
 					});
@@ -620,14 +590,14 @@
 				command: 'LJEmbedLink'
 			});
 
-			editor.addCss('.lj-embed {' + 'background: #CCCCCC url(' + CKEDITOR.getUrl(this
-				.path + 'images/placeholder_flash.png') + ') no-repeat center center;' + 'border: 1px dotted #000000;' + 'height: 80px;' + 'width: 100%;' + '}');
+			editor.addCss('.lj-embed {' + 'background: #CCCCCC url(' + CKEDITOR.getUrl(this.path + 'images/placeholder_flash.png') + ') no-repeat center center;' + 'border: 1px dotted #000000;' + 'height: 80px;' + 'width: 100%;' + '}');
 
-			function doEmbed(content) {
-				if (content && content.length) {
-					if (window.switchedRteOn) {
+			function doEmbed(content){
+				if(content && content.length){
+					if(window.switchedRteOn){
 						var iframe = new CKEDITOR.dom.element('iframe', editor.document);
 						iframe.setAttribute('lj-data', encodeURIComponent(content));
+						iframe.setAttribute('lj-style', 'height: 100%;');
 						iframe.setAttribute('class', 'lj-embed');
 						iframe.setAttribute('frameBorder', 0);
 						iframe.setAttribute('allowTransparency', 'true');
@@ -639,42 +609,39 @@
 
 			//////////  LJ Cut Button //////////////
 			editor.addCommand('LJCut', {
-				exec: function() {
-					var text;
-					if (ljTagsData.LJCut.node) {
-						text = prompt(top.CKLang.CutPrompt, ljTagsData.LJCut.node.getAttribute('text') || top.CKLang.ReadMore);
-						if (text) {
-							if (text == top.CKLang.ReadMore) {
-								ljTagsData.LJCut.node.removeAttribute('text');
+				exec: function(){
+					var text,
+						ljCutNode = ljTagsData.LJCut.node;
+
+					if(ljCutNode){
+						if(text = prompt(top.CKLang.CutPrompt, ljCutNode.getAttribute('text') || top.CKLang.ReadMore)){
+							if(text == top.CKLang.ReadMore){
+								ljCutNode.removeAttribute('text');
 							} else {
-								ljTagsData.LJCut.node.setAttribute('text', text);
+								ljCutNode.setAttribute('text', text);
 							}
 						}
 					} else {
-						text = prompt(top.CKLang.CutPrompt, top.CKLang.ReadMore);
-						if (text) {
-							var selection = new CKEDITOR.dom.selection(editor.document);
+						if(text = prompt(top.CKLang.CutPrompt, top.CKLang.ReadMore)){
+							var selection = new CKEDITOR.dom.selection(editor.document),
+								ranges = selection.getRanges();
 
-							ljTagsData.LJCut.node = new CKEDITOR.dom.element.get(editor.document.$.createElement('lj:cut'));
-							ljTagsData.LJCut.node.setAttribute('lj-cmd', 'LJCut');
-							if (text != top.CKLang.ReadMore) {
-								ljTagsData.LJCut.node.setAttribute('text', text);
+							var ljCutNode = new CKEDITOR.dom.element.get(editor.document.$.createElement('lj:cut'));
+							ljCutNode.setAttribute('lj-cmd', 'LJCut');
+
+							if(text != top.CKLang.ReadMore){
+								ljCutNode.setAttribute('text', text);
 							}
 
-							var ranges = selection.getRanges();
-							var fragment = editor.document.$.createDocumentFragment();
-							selection.lock();
-							for (var i = 0, l = ranges.length; i < l; i++) {
+							for(var i = 0, l = ranges.length; i < l; i++){
 								var range = ranges[i];
-								var content = range.extractContents();
-								fragment.appendChild(content.$);
+								ljCutNode.append(range.extractContents());
 							}
-							editor.insertElement(ljTagsData.LJCut.node);
-							ljTagsData.LJCut.node.$.appendChild(fragment);
-							selection.unlock();
-							selection.selectElement(ljTagsData.LJCut.node);
+
+							editor.insertElement(ljCutNode);
 						}
-						note.hide(true);
+
+						CKEDITOR.note && CKEDITOR.note.hide(true);
 					}
 				},
 				editorFocus: false
@@ -686,21 +653,21 @@
 			});
 
 			//////////  LJ Justify //////////////
-			(function() {
-				function getAlignment(element, useComputedState) {
+			(function(){
+				function getAlignment(element, useComputedState){
 					useComputedState = useComputedState === undefined || useComputedState;
 
 					var align,
 						LJLike = ljTagsData.LJLike.node;
-					if (LJLike) {
+					if(LJLike){
 						var attr = element.getAttribute('lj-style');
 						align = attr ? attr.replace(/text-align:\s*(left|right|center)/i, '$1') : 'left';
-					} else if (useComputedState) {
+					} else if(useComputedState){
 						align = element.getComputedStyle('text-align');
 					} else {
-						while (!element.hasAttribute || !( element.hasAttribute('align') || element.getStyle('text-align') )) {
+						while(!element.hasAttribute || !( element.hasAttribute('align') || element.getStyle('text-align') )){
 							var parent = element.getParent();
-							if (!parent) {
+							if(!parent){
 								break;
 							}
 							element = parent;
@@ -715,17 +682,17 @@
 					return align;
 				}
 
-				function onSelectionChange(evt) {
-					if (evt.editor.readOnly) {
+				function onSelectionChange(evt){
+					if(evt.editor.readOnly){
 						return;
 					}
 
 					var command = evt.editor.getCommand(this.name),
 						element = evt.data.element,
-						cmd = element.hasAttribute('lj-cmd') && element.getAttribute('lj-cmd');
+						cmd = element.type == 1 && element.hasAttribute('lj-cmd') && element.getAttribute('lj-cmd');
 					if(cmd == 'LJLike'){
 						command.state = (getAlignment(element, editor.config.useComputedState) == this.value) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF;
-					} else if(!element || element.getName() == 'body' || element.getName() == 'iframe'){
+					} else if(!element || element.type != 1 || element.is('body') || element.is('iframe')){
 						command.state = CKEDITOR.TRISTATE_OFF;
 					} else {
 						command.state = getAlignment(element, editor.config.useComputedState) == this.value ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF;
@@ -734,13 +701,13 @@
 					command.fire('state');
 				}
 
-				function justifyCommand(editor, name, value) {
+				function justifyCommand(editor, name, value){
 					this.name = name;
 					this.value = value;
 
 					var classes = editor.config.justifyClasses;
-					if (classes) {
-						switch (value) {
+					if(classes){
+						switch(value){
 							case 'left' :
 								this.cssClassName = classes[0];
 								break;
@@ -756,7 +723,7 @@
 					}
 				}
 
-				function onDirChanged(e) {
+				function onDirChanged(e){
 					var editor = e.editor;
 
 					var range = new CKEDITOR.dom.range(editor.document);
@@ -766,10 +733,10 @@
 					var walker = new CKEDITOR.dom.walker(range),
 						node;
 
-					while (( node = walker.next() )) {
-						if (node.type == CKEDITOR.NODE_ELEMENT) {
+					while(( node = walker.next() )){
+						if(node.type == CKEDITOR.NODE_ELEMENT){
 							// A child with the defined dir is to be ignored.
-							if (!node.equals(e.data.node) && node.getDirection()) {
+							if(!node.equals(e.data.node) && node.getDirection()){
 								range.setStartAfter(node);
 								walker = new CKEDITOR.dom.walker(range);
 								continue;
@@ -777,14 +744,14 @@
 
 							// Switch the alignment.
 							var classes = editor.config.justifyClasses;
-							if (classes) {
+							if(classes){
 								// The left align class.
-								if (node.hasClass(classes[ 0 ])) {
+								if(node.hasClass(classes[ 0 ])){
 									node.removeClass(classes[ 0 ]);
 									node.addClass(classes[ 2 ]);
 								}
 								// The right align class.
-								else if (node.hasClass(classes[ 2 ])) {
+								else if(node.hasClass(classes[ 2 ])){
 									node.removeClass(classes[ 2 ]);
 									node.addClass(classes[ 0 ]);
 								}
@@ -794,9 +761,9 @@
 							var style = 'text-align';
 							var align = node.getStyle(style);
 
-							if (align == 'left') {
+							if(align == 'left'){
 								node.setStyle(style, 'right');
-							} else if (align == 'right') {
+							} else if(align == 'right'){
 								node.setStyle(style, 'left');
 							}
 						}
@@ -804,17 +771,17 @@
 				}
 
 				justifyCommand.prototype = {
-					exec : function(editor) {
+					exec : function(editor){
 						var selection = editor.getSelection(),
 							enterMode = editor.config.enterMode;
 
-						if (!selection) {
+						if(!selection){
 							return;
 						}
 
 						var bookmarks = selection.createBookmarks();
 
-						if (ljTagsData.LJLike.node) {
+						if(ljTagsData.LJLike.node){
 							ljTagsData.LJLike.node.setAttribute('lj-style', 'text-align: ' + this.value);
 						} else {
 							var ranges = selection.getRanges(true);
@@ -826,7 +793,7 @@
 							var useComputedState = editor.config.useComputedState;
 							useComputedState = useComputedState === undefined || useComputedState;
 
-							for (var i = ranges.length - 1; i >= 0; i--) {
+							for(var i = ranges.length - 1; i >= 0; i--){
 								var range = ranges[i];
 								var encloseNode = range.getEnclosedNode();
 								if(encloseNode && encloseNode.is('iframe')){
@@ -835,25 +802,23 @@
 
 								iterator = range.createIterator();
 								iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
-								while (( block = iterator.getNextParagraph(enterMode == CKEDITOR.ENTER_P ? 'p' : 'div') )) {
+								while(( block = iterator.getNextParagraph(enterMode == CKEDITOR.ENTER_P ? 'p' : 'div') )){
 									block.removeAttribute('align');
 									block.removeStyle('text-align');
 
 									// Remove any of the alignment classes from the className.
-									var className = cssClassName && ( block.$.className = CKEDITOR.tools.ltrim(block.$.className
-										.replace(this.cssClassRegex, '')) );
+									var className = cssClassName && ( block.$.className = CKEDITOR.tools.ltrim(block.$.className.replace(this.cssClassRegex, '')) );
 
-									var apply = ( this.state == CKEDITOR
-										.TRISTATE_OFF ) && ( !useComputedState || ( getAlignment(block, true) != this.value ) );
+									var apply = ( this.state == CKEDITOR.TRISTATE_OFF ) && ( !useComputedState || ( getAlignment(block, true) != this.value ) );
 
-									if (cssClassName) {
+									if(cssClassName){
 										// Append the desired class name.
-										if (apply) {
+										if(apply){
 											block.addClass(cssClassName);
-										} else if (!className) {
+										} else if(!className){
 											block.removeAttribute('class');
 										}
-									} else if (apply) {
+									} else if(apply){
 										block.setStyle('text-align', this.value);
 									}
 								}
@@ -895,32 +860,26 @@
 			})();
 
 			//////////  LJ Poll Button //////////////
-			if (top.canmakepoll) {
+			if(top.canmakepoll){
 				var currentPoll;
 
-				editor.addCss('.lj-poll {' +
-					'width:100%;' +
-					'border: #000 1px dotted;' +
-					'background-color: #d2d2d2;' +
-					'font-style: italic;' +
-					'}');
+				editor.addCss('.lj-poll {' + 'width:100%;' + 'border: #000 1px dotted;' + 'background-color: #d2d2d2;' + 'font-style: italic;' + '}');
 
-				CKEDITOR.dialog.add('LJPollDialog', function() {
+				CKEDITOR.dialog.add('LJPollDialog', function(){
 					var isAllFrameLoad = 0, okButtonNode, questionsWindow, setupWindow;
 
-					var onLoadPollPage = function() {
-						if (this.removeListener) {
+					var onLoadPollPage = function(){
+						if(this.removeListener){
 							this.removeListener('load', onLoadPollPage);
 						}
-						if (isAllFrameLoad && okButtonNode) {
-							currentPoll = new Poll(ljTagsData.LJPollLink.node && decodeURIComponent(ljTagsData.LJPollLink.node
-								.getAttribute('lj-data')), questionsWindow.document, setupWindow.document, questionsWindow.Questions);
+						if(isAllFrameLoad && okButtonNode){
+							currentPoll = new Poll(ljTagsData.LJPollLink.node && decodeURIComponent(ljTagsData.LJPollLink.node.getAttribute('lj-data')), questionsWindow.document, setupWindow.document, questionsWindow.Questions);
 
 							questionsWindow.ready(currentPoll);
 							setupWindow.ready(currentPoll);
 
 							okButtonNode.style.display = 'block';
-							note.hide(true);
+							CKEDITOR.note && CKEDITOR.note.hide(true);
 						} else {
 							isAllFrameLoad++;
 						}
@@ -930,15 +889,14 @@
 						type: 'button',
 						id: 'LJPoll_Ok',
 						label: editor.lang.common.ok,
-						onClick: function(evt) {
+						onClick: function(evt){
 							evt.data.dialog.hide();
-							var poll = new Poll(currentPoll, questionsWindow.document, setupWindow.document, questionsWindow
-								.Questions);
+							var poll = new Poll(currentPoll, questionsWindow.document, setupWindow.document, questionsWindow.Questions);
 							var pollSource = poll.outputHTML();
 							var pollLJTags = poll.outputLJtags();
 
-							if (pollSource.length > 0) {
-								if (ljTagsData.LJPollLink.node) {
+							if(pollSource.length > 0){
+								if(ljTagsData.LJPollLink.node){
 									ljTagsData.LJPollLink.node.setAttribute('lj-content', pollSource);
 									ljTagsData.LJPollLink.node.setAttribute('lj-data', pollLJTags);
 								} else {
@@ -964,10 +922,9 @@
 						width: 420,
 						height: 270,
 						resizable: false,
-						onShow: function() {
-							if (isAllFrameLoad) {
-								currentPoll = new Poll(ljTagsData.LJPollLink.node && unescape(ljTagsData.LJPollLink.node
-									.getAttribute('data')), questionsWindow.document, setupWindow.document, questionsWindow.Questions);
+						onShow: function(){
+							if(isAllFrameLoad){
+								currentPoll = new Poll(ljTagsData.LJPollLink.node && unescape(ljTagsData.LJPollLink.node.getAttribute('data')), questionsWindow.document, setupWindow.document, questionsWindow.Questions);
 
 								questionsWindow.ready(currentPoll);
 								setupWindow.ready(currentPoll);
@@ -982,14 +939,13 @@
 									{
 										type: 'html',
 										html: '<iframe src="/tools/ck_poll_setup.bml" allowTransparency="true" frameborder="0" style="width:100%; height:320px;"></iframe>',
-										onShow: function(data) {
-											if (!okButtonNode) {
-												(okButtonNode = document.getElementById(data.sender.getButton('LJPoll_Ok').domId).parentNode)
-													.style.display = 'none';
+										onShow: function(data){
+											if(!okButtonNode){
+												(okButtonNode = document.getElementById(data.sender.getButton('LJPoll_Ok').domId).parentNode).style.display = 'none';
 											}
 											var iframe = this.getElement('iframe');
 											setupWindow = iframe.$.contentWindow;
-											if (setupWindow.ready) {
+											if(setupWindow.ready){
 												onLoadPollPage();
 											} else {
 												iframe.on('load', onLoadPollPage);
@@ -1006,10 +962,10 @@
 									{
 										type: 'html',
 										html: '<iframe src="/tools/ck_poll_questions.bml" allowTransparency="true" frameborder="0" style="width:100%; height:320px;"></iframe>',
-										onShow: function() {
+										onShow: function(){
 											var iframe = this.getElement('iframe');
 											questionsWindow = iframe.$.contentWindow;
-											if (questionsWindow.ready) {
+											if(questionsWindow.ready){
 												onLoadPollPage();
 											} else {
 												iframe.on('load', onLoadPollPage);
@@ -1026,8 +982,8 @@
 				editor.addCommand('LJPollLink', new CKEDITOR.dialogCommand('LJPollDialog'));
 			} else {
 				editor.addCommand('LJPollLink', {
-					exec: function() {
-						note.show(top.CKLang.Poll_AccountLevelNotice, null, null, true);
+					exec: function(){
+						CKEDITOR.note && CKEDITOR.note.show(top.CKLang.Poll_AccountLevelNotice, null, null, true);
 					}
 				});
 
@@ -1044,18 +1000,9 @@
 			var dialogContent = '<div class="cke-dialog-likes"><ul class="cke-dialog-likes-list">';
 			likeButtons.defaultButtons = [];
 
-			editor
-				.addCss('.lj-like {' +
-				    'width: 100%;' +
-					'height: 44px !important;' +
-					'overflow: hidden;' +
-					'padding: 0;' +
-					'margin: 0;' +
-					'background: #D2D2D2;' +
-					'border: 1px dotted #000;' +
-				'}');
+			editor.addCss('.lj-like {' + 'width: 100%;' + 'height: 44px !important;' + 'overflow: hidden;' + 'padding: 0;' + 'margin: 0;' + 'background: #D2D2D2;' + 'border: 1px dotted #000;' + '}');
 
-			for (var i = 0; i < buttonsLength; i++) {
+			for(var i = 0; i < buttonsLength; i++){
 				var button = likeButtons[i];
 				likeButtons[button.id] = likeButtons[button.abbr] = button;
 				likeButtons.defaultButtons.push(button.id);
@@ -1066,22 +1013,21 @@
 
 			var countChanges = 0, ljLikeDialog, ljLikeInputs;
 
-			function onChangeLike() {
+			function onChangeLike(){
 				var command = editor.getCommand('LJLike');
-				if (command.state == CKEDITOR.TRISTATE_OFF) {
+				if(command.state == CKEDITOR.TRISTATE_OFF){
 					this.$.checked ? countChanges++ : countChanges--;
-					ljLikeDialog.getButton('LJLike_Ok')
-						.getElement()[countChanges == 0 ? 'addClass' : 'removeClass']('btn-disabled');
+					ljLikeDialog.getButton('LJLike_Ok').getElement()[countChanges == 0 ? 'addClass' : 'removeClass']('btn-disabled');
 				}
 			}
 
-			CKEDITOR.dialog.add('LJLikeDialog', function() {
+			CKEDITOR.dialog.add('LJLikeDialog', function(){
 				var buttonsDefinition = [new CKEDITOR.ui.button({
 					type: 'button',
 					id: 'LJLike_Ok',
 					label: editor.lang.common.ok,
-					onClick: function() {
-						if (ljLikeDialog.getButton('LJLike_Ok').getElement().hasClass('btn-disabled')) {
+					onClick: function(){
+						if(ljLikeDialog.getButton('LJLike_Ok').getElement().hasClass('btn-disabled')){
 							return false;
 						}
 
@@ -1089,19 +1035,19 @@
 							likeHtml = '<span class="lj-like-wrapper">',
 							likeNode = ljTagsData.LJLike.node;
 
-						for (var i = 0; i < buttonsLength; i++) {
+						for(var i = 0; i < buttonsLength; i++){
 							var button = likeButtons[i];
 							var input = document.getElementById('like-' + button.abbr);
 							var currentBtn = likeNode && likeNode.getAttribute('buttons');
-							if ((input && input.checked) || (currentBtn && !button.htmlOpt && (currentBtn.indexOf(button
-								.abbr) + 1 || currentBtn.indexOf(button.id) + 1))) {
+							if((input && input.checked) || (currentBtn && !button.htmlOpt && (currentBtn.indexOf(button.abbr) + 1 || currentBtn.indexOf(button.id) + 1))){
 								attr.push(button.id);
 								likeHtml += button.html;
 							}
 						}
+
 						likeHtml += '</span>';
-						if (attr.length) {
-							if (likeNode) {
+						if(attr.length){
+							if(likeNode){
 								ljTagsData.LJLike.node.setAttribute('buttons', attr.join(','));
 								ljTagsData.LJLike.node.setAttribute('lj-content', encodeURIComponent(likeHtml));
 							} else {
@@ -1114,7 +1060,7 @@
 								likeNode.setAttribute('allowTransparency', 'true');
 								editor.insertElement(likeNode);
 							}
-						} else if (likeNode) {
+						} else if(likeNode){
 							ljTagsData.LJLike.node.remove();
 						}
 
@@ -1140,21 +1086,20 @@
 							]
 						}
 					],
-					onShow: function() {
-						note.hide(true);
+					onShow: function(){
+						CKEDITOR.note && CKEDITOR.note.hide(true);
 						var command = editor.getCommand('LJLike');
 						var i = countChanges = 0,
 							isOn = command.state == CKEDITOR.TRISTATE_ON,
 							buttons = ljTagsData.LJLike.node && ljTagsData.LJLike.node.getAttribute('buttons');
 
-						for (; i < buttonsLength; i++) {
-							var isChecked = buttons ? !!(buttons.indexOf(likeButtons[i].abbr) + 1 || buttons.indexOf(likeButtons[i]
-								.id) + 1) : true;
+						for(; i < buttonsLength; i++){
+							var isChecked = buttons ? !!(buttons.indexOf(likeButtons[i].abbr) + 1 || buttons.indexOf(likeButtons[i].id) + 1) : true;
 
 							var input = document.getElementById('like-' + likeButtons[i].abbr);
 
-							if (input) {
-								if (isChecked && !isOn) {
+							if(input){
+								if(isChecked && !isOn){
 									countChanges++;
 								}
 
@@ -1162,14 +1107,14 @@
 							}
 						}
 
-						if (countChanges > 0) {
+						if(countChanges > 0){
 							ljLikeDialog.getButton('LJLike_Ok').getElement().removeClass('btn-disabled');
 						}
 					},
-					onLoad: function() {
+					onLoad: function(){
 						ljLikeDialog = this;
 						ljLikeInputs = ljLikeDialog.parts.contents.getElementsByTag('input');
-						for (var i = 0; i < buttonsLength; i++) {
+						for(var i = 0; i < buttonsLength; i++){
 							var item = ljLikeInputs.getItem(i);
 							item && item.on('click', onChangeLike);
 						}
@@ -1185,29 +1130,20 @@
 				command: 'LJLike'
 			});
 
-			//////////  LJ Map Button //////////////
-			editor
-				.addCss('.lj-map {' +
-					'width: 100%;' +
-					'overflow: hidden;' +
-					'min-height: 13px;' +
-					'margin-top: 20px;' +
-					'background: #D2D2D2;' +
-					'border: 1px dotted #000;' +
-					'text-align: center;' +
-				'}');
+			//////////  LJ Map Button & LJ Iframe //////////////
+			editor.addCss('.lj-map, .lj-iframe {' + 'width: 100%;' + 'overflow: hidden;' + 'min-height: 13px;' + 'margin-top: 20px;' + 'background: #D2D2D2;' + 'border: 1px dotted #000;' + 'text-align: center;' + '}');
 		},
-		afterInit: function(editor) {
+		afterInit: function(editor){
 			var dataProcessor = editor.dataProcessor;
 
 			dataProcessor.dataFilter.addRules({
 				elements: {
-					'lj-like': function(element) {
+					'lj-like': function(element){
 						var attr = [];
 
 						var fakeElement = new CKEDITOR.htmlParser.element('iframe');
 						fakeElement.attributes['class'] = 'lj-like';
-						if (element.attributes.hasOwnProperty('style')) {
+						if(element.attributes.hasOwnProperty('style')){
 							fakeElement.attributes['lj-style'] = element.attributes.style;
 						}
 						fakeElement.attributes['lj-cmd'] = 'LJLike';
@@ -1215,18 +1151,18 @@
 						fakeElement.attributes['frameBorder'] = 0;
 						fakeElement.attributes['allowTransparency'] = 'true';
 
-						var currentButtons = element.attributes.buttons && element.attributes.buttons.split(',') || likeButtons
-							.defaultButtons;
+						var currentButtons = element.attributes.buttons && element.attributes.buttons.split(',') || likeButtons.defaultButtons;
 
 						var length = currentButtons.length;
-						for (var i = 0; i < length; i++) {
+						for(var i = 0; i < length; i++){
 							var buttonName = currentButtons[i].replace(/^\s*([a-z]{2,})\s*$/i, '$1');
 							var button = likeButtons[buttonName];
-							if (button) {
+							if(button){
 								fakeElement.attributes['lj-content'] += encodeURIComponent(button.html);
 								attr.push(buttonName);
 							}
 						}
+
 						fakeElement.attributes['lj-content'] += '</span>';
 
 						fakeElement.attributes.buttons = attr.join(',');
@@ -1307,11 +1243,9 @@
 							}
 						};
 					})(),
-					'lj-map': function(element) {
+					'lj-map': function(element){
 						var fakeElement = new CKEDITOR.htmlParser.element('iframe');
-						fakeElement.attributes.style = '' + 'width:' + (isNaN(element.attributes.width) ? 500 : element.attributes
-							.width) + 'px;' + 'height:' + (isNaN(element.attributes.height) ? 350 : element.attributes
-							.height) + 'px;';
+						fakeElement.attributes.style = 'width:' + (isNaN(element.attributes.width) ? 500 : element.attributes.width) + 'px;' + 'height:' + (isNaN(element.attributes.height) ? 350 : element.attributes.height) + 'px;';
 
 						fakeElement.attributes['lj-url'] = element.attributes.url ? encodeURIComponent(element.attributes.url) : '';
 						fakeElement.attributes['class'] = 'lj-map';
@@ -1322,45 +1256,56 @@
 
 						return fakeElement;
 					},
-					'lj-repost': function(element) {
+					'lj-repost': function(element){
 						var fakeElement = new CKEDITOR.htmlParser.element('input');
 						fakeElement.attributes.type = 'button';
-						fakeElement.attributes.value = (element.attributes && element.attributes.button) || top.CKLang
-							.LJRepost_Value;
+						fakeElement.attributes.value = (element.attributes && element.attributes.button) || top.CKLang.LJRepost_Value;
 						fakeElement.attributes['class'] = 'lj-repost';
 						return fakeElement;
-					},
-					'lj-cut': function(element) {
+					},'lj-cut': function(element){
 						element.name = 'lj:cut';
 						element.attributes['lj-cmd'] = 'LJCut';
 					},
-					'lj-raw': function(element) {
+					'lj-raw': function(element){
 						element.name = 'lj:raw';
 					},
-					'lj-wishlist': function(element) {
+					'lj-wishlist': function(element){
 						element.name = 'lj:wishlist';
 					},
-					'lj-template': function(element) {
+					'lj-template': function(element){
 						element.name = 'lj:template';
 						element.children.length = 0;
 					},
-					a: function(element) {
-						if (element.parent.attributes && !element.parent.attributes['lj:user']) {
+					'iframe': function(element){
+						if(element.attributes['class'] && element.attributes['class'].indexOf('lj-') + 1 == 1){
+							return element;
+						}
+						var fakeElement = new CKEDITOR.htmlParser.element('iframe');
+						fakeElement.attributes.style = 'width:' + (isNaN(element.attributes.width) ? 500 : element.attributes.width) + 'px;' + 'height:' + (isNaN(element.attributes.height) ? 350 : element.attributes.height) + 'px;';
+
+						fakeElement.attributes['lj-url'] = element.attributes.src ? encodeURIComponent(element.attributes.src) : '';
+						fakeElement.attributes['class'] = 'lj-iframe';
+						fakeElement.attributes['lj-content'] = '<p class="lj-iframe">iframe</p>';
+						fakeElement.attributes['lj-style'] = ' height: 100%; text-align: center;';
+						fakeElement.attributes['frameBorder'] = 0;
+
+						return fakeElement;
+					},
+					a: function(element){
+						if(element.parent.attributes && !element.parent.attributes['lj:user']){
 							element.attributes['lj-cmd'] = 'LJLink';
 						}
 					},
-					img: function(element) {
+					img: function(element){
 						var parent = element.parent.parent;
-						if (!parent || !parent.attributes || !parent.attributes['lj:user']) {
+						if(!parent || !parent.attributes || !parent.attributes['lj:user']){
 							element.attributes['lj-cmd'] = 'image';
 						}
 					},
-					div: function(element) {
-						if (element.attributes && element.attributes['class'] == 'ljcut') {
-							var newElement = new CKEDITOR.htmlParser.element('lj:cut');
-							newElement.attributes['lj-cmd'] = 'LJCut';
-							newElement.children = element.children;
-							return newElement;
+					div: function(element){
+						if(element.attributes && element.attributes['class'] == 'ljcut'){
+							element.name = 'lj:cut';
+							element.attributes['lj-cmd'] = 'LJCut';
 						}
 					}
 				}
@@ -1368,14 +1313,19 @@
 
 			dataProcessor.htmlFilter.addRules({
 				elements: {
-					iframe: function(element) {
+					iframe: function(element){
 						var newElement = element;
-						var className = /lj-[a-z]+/i.exec(element.attributes['class'])[0];
-						switch (className) {
+						var className = /lj-[a-z]+/i.exec(element.attributes['class']);
+						if(className){
+							className = className[0];
+						} else {
+							return element;
+						}
+						switch(className){
 							case 'lj-like':
 								newElement = new CKEDITOR.htmlParser.element('lj-like');
 								newElement.attributes.buttons = element.attributes.buttons;
-								if (element.attributes.hasOwnProperty('lj-style')) {
+								if(element.attributes.hasOwnProperty('lj-style')){
 									newElement.attributes.style = element.attributes['lj-style'];
 								}
 								newElement.isEmpty = true;
@@ -1384,61 +1334,68 @@
 							case 'lj-embed':
 								newElement = new CKEDITOR.htmlParser.element('lj-embed');
 								newElement.attributes.id = element.attributes.id;
-								if (element.attributes.hasOwnProperty('source_user')) {
+								if(element.attributes.hasOwnProperty('source_user')){
 									newElement.attributes.source_user = element.attributes.source_user;
 								}
-								newElement.children = new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(element
-									.attributes['lj-data'])).children;
+								newElement.children = new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(element.attributes['lj-data'])).children;
 								newElement.isOptionalClose = true;
 								break;
 							case 'lj-map':
 								newElement = new CKEDITOR.htmlParser.element('lj-map');
 								newElement.attributes.url = decodeURIComponent(element.attributes['lj-url']);
-								element.attributes.style && (element.attributes.style + ';')
-									.replace(/([a-z-]+):(.*?);/gi, function(result, name, value) {
+								element.attributes.style && (element.attributes.style + ';').replace(/([a-z-]+):(.*?);/gi, function(result, name, value){
 									newElement.attributes[name.toLowerCase()] = parseInt(value);
 								});
 
 								newElement.isOptionalClose = newElement.isEmpty = true;
 								break;
+							case 'lj-iframe':
+								newElement = new CKEDITOR.htmlParser.element('iframe');
+								newElement.attributes.src = decodeURIComponent(element.attributes['lj-url']);
+								element.attributes.style && (element.attributes.style + ';').replace(/([a-z-]+):(.*?);/gi, function(result, name, value){
+									newElement.attributes[name.toLowerCase()] = parseInt(value);
+								});
+								newElement.attributes.frameBorder = 0;
+
+								newElement.isOptionalClose = newElement.isEmpty = true;
+								break;
 							case 'lj-poll':
-								newElement = new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(element
-									.attributes['lj-data'])).children[0];
+								newElement = new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(element.attributes['lj-data'])).children[0];
 								break;
 							default:
-								if (!element.children.length) {
+								if(!element.children.length){
 									newElement = false;
 								}
 						}
 
 						return newElement;
 					},
-					span: function(element) {
+					span: function(element){
 						var userName = element.attributes['lj:user'];
-						if (userName) {
+						if(userName){
 							var ljUserNode = new CKEDITOR.htmlParser.element('lj');
 							ljUserNode.attributes.user = userName;
 
-							try {
+							try{
 								var userTitle = element.children[1].children[0].children[0].value;
-							} catch(e) {
+							} catch(e){
 								return false;
 							}
 
-							if (userTitle && userTitle != userName) {
+							if(userTitle && userTitle != userName){
 								ljUserNode.attributes.title = userTitle;
 							}
 
 							ljUserNode.isOptionalClose = ljUserNode.isEmpty = true;
 							return ljUserNode;
-						} else if (element.attributes.style == 'display: none;' || !element.children.length) {
+						} else if(element.attributes.style == 'display: none;' || !element.children.length){
 							return false;
 						}
 					},
-					input: function(element) {
-						if (element.attributes['class'] == 'lj-repost') {
+					input: function(element){
+						if(element.attributes['class'] == 'lj-repost'){
 							var newElement = new CKEDITOR.htmlParser.element('lj-repost');
-							if (element.attributes.value != top.CKLang.LJRepost_Value) {
+							if(element.attributes.value != top.CKLang.LJRepost_Value){
 								newElement.attributes.button = element.attributes.value;
 							}
 							newElement.isOptionalClose = newElement.isEmpty = true;
@@ -1450,25 +1407,25 @@
 							return false;
 						}
 					},
-					'lj:template': function(element) {
+					'lj:template': function(element){
 						element.name = 'lj-template';
 						element.isOptionalClose = element.isEmpty = true;
 					},
-					'lj:cut': function(element) {
-						element.name = 'lj-cut'
+					'lj:cut': function(element){
+						element.name = 'lj-cut';
 					},
-					'lj:raw': function(element) {
+					'lj:raw': function(element){
 						element.name = 'lj-raw';
 					},
-					'lj:wishlist': function(element) {
+					'lj:wishlist': function(element){
 						element.name = 'lj-wishlist';
 					}
 				},
 				attributes: {
-					'lj-cmd': function() {
+					'lj-cmd': function(){
 						return false;
 					},
-					'contenteditable': function() {
+					'contenteditable': function(){
 						return false;
 					}
 				}

Modified: trunk/htdocs/js/rte.js
===================================================================
--- trunk/htdocs/js/rte.js	2011-11-01 12:30:56 UTC (rev 20466)
+++ trunk/htdocs/js/rte.js	2011-11-01 14:47:25 UTC (rev 20467)
@@ -149,7 +149,7 @@
 						editor.document.on('keypress', updateDraftState);
 						editor.document.on('click', updateDraftState);
 
-						editor.focus();
+						!CKEDITOR.env.ie && editor.focus();
 					});
 				});
 			} else {
@@ -181,6 +181,7 @@
 			$('#entry-form-wrapper').attr('class', 'hide-richtext');
 			if (CKEditor) {
 
+				CKEDITOR.note.hide(true);
 				var data = CKEditor.getData().trim(); //also remove trailing spaces and newlines
 				CKEditor.container.hide();
 				CKEditor.element.show();

Tags: b_vladi, css, js, livejournal, vkurkin
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments