	
	var verifiedPaste = false;
	var insert = false;
	var lastEvent = false;
	var lengthRunning = false;
	var editorFields = new Array();
	
	var focusToggle = false;
	
	function tinyMCE_execCommand(editor_id, elm, command, user_interface, value) {
		switch(command) {
			case 'forecolor':
				var inst = tinyMCE.getInstanceById(editor_id);
				var selection = inst.selection.getSelectedHTML();
				var focusElement = inst.selection.getFocusElement();
				
				var patternRemoveStyleColor = new RegExp("(\"|\\s|;)color\\s*:\\s*[^;\"]+\\s*;?\\s*(\")?\\s*", 'ig');
				var replacement = selection.replace(patternRemoveStyleColor, '$1$2');
				
				replacement = '<font color="'+value+'">'+replacement+'</font>';
				
				if(!focusElement.style.color && !focusElement.color) {
					var tagName = focusElement.nodeName;
					var attributes;
					switch(tagName) {
						case 'SPAN':
							attributes = ' style="color:'+focusElement.style.color+';"';
						break;
						
						case 'FONT':
							attributes = ' color="'+focusElement.color+'"';
						break;
					}
					replacement = '</'+tagName+'>'+replacement+'<'+tagName+attributes+'>';
				}
				
				tinyMCE.execCommand('mceReplaceContent', false, replacement);
				//window.setTimeout("tinyMCE.execCommand('mceReplaceContent', false, '"+replacement+"');", 1000);
				
				return false;
				
				/*
					möjlig väg att gå...
					* kolla om focusElement har en färg satt på sig
						* avsluta focusElement precis innan vårt nya element
							--- nytt element --- 
						* starta focusElement igen efter vårt nya element
							* sätt samma färg och attribut på focusElement (2) som på focusElement (1) 
				*/
				
				/*
					tillägg 1
					* ta bort par av font/span color och en avslutande tag för varje som finns innuti den nya färgstycket
					* flytta överstående font/span taggar utanför (till vänster om) nya stycket
				*/
				
				/*
					1 Ta bort color i style taggar
						2 Ta bort tomma style taggar
						3 Ta bort tomma span taggar
				*/
				
				//	1
				/*
				var patternRemoveStyleColor = new RegExp("(\"|\\s|;)color\\s*:\\s*[^;\"]+\\s*;?\\s*(\")?\\s*", 'ig');
				selection = selection.replace(patternRemoveStyleColor, '$1$2');
				
				*/
				
			break;
		}
		return false;
	}
	
	function tinyMCE_checkSubmit(e) {
		var obj = document.getElementById(tinyMCE.settings['obj_title']);
		var title = obj.value;
		var event = e?e:window.event;
		var target = e.target ? e.target : e.srcElement ;
		var inst, length;
		var error = '';
		if(target.nodeType==3) target = target.parentNode; // defeat Safari bug
		title = title.replace(new RegExp("^\\s+|\\s+$", 'ig'), '');
		
		var arrInstances = new Array();
		if(tinyMCE.getInstanceById('mce_editor_0')) arrInstances[arrInstances.length] = 'mce_editor_0';
		if(tinyMCE.getInstanceById('mce_editor_1')) arrInstances[arrInstances.length] = 'mce_editor_1';
		
		for(var i = 0; i<arrInstances.length;i++) {
			tinyMCE.execInstanceCommand(arrInstances[i], "mceFocus");
			length = tinyMCE.getContent().length;
			inst = tinyMCE.getInstanceById(arrInstances[i]);
			if(inst.settings['content_limit'] > 0 && length>inst.settings['content_limit']) {
				error = inst.settings['title']+":\n"+inst.settings['content_to_long']+"\n"+error;
				toggleWarning(true, inst.settings['obj_length_warning'], inst.settings['content_to_long'], focusToggle ? true : false );
			}
		}
		
		target.focus();
		if(tinyMCE.isMSIE && error) {
			tinyMCE.execInstanceCommand(arrInstances[arrInstances.length], "mceFocus");
		}
		
		if(title.length && !error) {
			return true;
		} else if(error) {
			alert(error);
		} else {
			alert(lang_editor_title_needed);
		}
		return false;
	}
	
	function tinyMCE_submitForm(e, cancel) {
		var cancel = arguments.length == 2 ? arguments[1] : false ;
		
		if(cancel) {
			if(document.getElementById('submit_cancel')) document.getElementById('submit_cancel').checked = true;
			document.getElementById(tinyMCE.settings['formID']).submit();
			return true;
		}
		
		if(tinyMCE_checkSubmit(e)) {
			tinyMCE.triggerSave();
			for(var i = 0; i < editorFields.length; i++) {
				if(document.getElementById(editorFields[i][0])) {
					document.getElementById(editorFields[i][0]).name = editorFields[i][1];
				}
			}
			document.getElementById(tinyMCE.settings['formID']).submit();
			return true;
		} else {
			return false;
		}
	}
	
	function toggleWarning(toggle, id, text, focus) {
		var text = arguments.length > 2 ? arguments[2] : '' ;
		var focus = arguments.length > 3 ? arguments[3] : false ;
		var objWarning = document.getElementById(id);
		if(!objWarning) return true;
		
		if(toggle) {
			if(tinyMCE.activeEditor.getParam('obj_length_warning') && objWarning.style.display != 'block') {
				objWarning.firstChild.innerHTML = text;
				objWarning.style.display = 'block';
				if(focus) {
					window.location.href = window.location.href.replace(new RegExp("#[^#]*$", 'ig'), '')+'#'+objWarning.id;
				}
			}
		} else {
			document.getElementById(id).style.display = 'none';
		}
	}
	
	function tinyMCE_length() {
		if(lengthRunning) return true;
		lengthRunning = true;
		
		var length = tinyMCE.activeEditor.getContent().length;
		var limit = tinyMCE.activeEditor.getParam('content_limit');
		
		if(!document.getElementById(tinyMCE.activeEditor.id+'_chars')) {
			document.getElementById(tinyMCE.activeEditor.id+'_path_row').innerHTML = '<div id="'+tinyMCE.activeEditor.editorId+'_chars" class="mceStatusbarPathText">'+lang_editor_length+': <span id="'+tinyMCE.selectedInstance.editorId+'_chars_length"></span>/'+limit+' '+lang_editor_characters+'.</div>'+document.getElementById(tinyMCE.activeEditor.editorId+'_path_row').innerHTML;
		}
		
		document.getElementById(tinyMCE.selectedInstance.editorId+'_chars_length').innerHTML = length;
		
		if(tinyMCE.activeEditor.getParam('content_limit') > 0 && length > tinyMCE.activeEditor.getParam('content_limit')) {
			toggleWarning(true, tinyMCE.activeEditor.getParam('obj_length_warning'), tinyMCE.activeEditor.getParam('content_to_long'), focusToggle ? true : false);
		} else if(tinyMCE.activeEditor.getParam('obj_length_warning')) {
			toggleWarning(false, tinyMCE.activeEditor.getParam('obj_length_warning'));
		}
		
		lengthRunning = false;
		
	}
	
	function tinyMCE_events(e) {
		
		verifiedPaste = ( verifiedPaste || ( e.type == 'keydown' && e.ctrlKey == true && e.keyCode == 86 && !e.shiftKey && !e.altKey ) ) ? true : false ;
		
		if(verifiedPaste && e.type == 'keyup') {
			verifiedPaste = false;
			var bookmark = tinyMCE.selectedInstance.selection.getBookmark(false);
			var content = tinyMCE.activeEditor.getContent();
			tinyMCE.activeEditor.setContent(content);
			tinyMCE.selectedInstance.selection.moveToBookmark(bookmark);
		}
		
		if(tinyMCE.activeEditor.getParam('content_limit') > 0 && tinyMCE.activeEditor.getParam('length_callback')) {
			clearTimeout(lastEvent);
			lastEvent = window.setTimeout(tinyMCE.activeEditor.getParam('length_callback')+'()', 200);
		}
		
	}
	
	function tinyMCE_cleanup(type, value) {
		
		switch(type) {
			
			case "insert_to_editor_dom":
				insert = true;
				window.setTimeout('insert = false', 200);
			break;
			
			case "insert_to_editor":
				if(!insert) break;
				insert = false;
				
				/* # Appendix A.1 - ersätt varje punkt med en egen lista (sorterade) */
				var patternWordBulletListReplace = new RegExp("<p\\s+style=\"[^\"]*?text-indent:\\s+-\\d+pt;\">(\\d+)\\.<span\\s+style=.*?>.*?</span>(.*?)</p>", "ig");
				value = value.replace(patternWordBulletListReplace, "<ol genic=\"true\"><li>$2</li></ol genic=\"true\">");
				
				/* # Appendix A.2 - ersätt varje punkt med en egen lista (osorterade) */
				//var patternWordBulletListReplace = new RegExp("<p[^>]*(margin-left\\s*:\\s*(\\d+)pt;)[^>]*>[^<]*<!--\\s*\\[if\\s!supportLists\\]\\s*--"+">[^<]*<span[^>]*>\\s*<span[^>]*>\\s*(&middot;|o|&sect;|&Oslash;|&uuml;)\\s*<span([^>]*)>\\s*(&nbsp;\\s*)*(</span>\\s*){3}[^<]*<!--\\s*\\[endif\\]\\s*--"+">[^<]*<span[^>]*>([^<]*)</span>\\s*</p>", "ig");
				var patternWordBulletListReplace = new RegExp("<p\\s+style=.*?text-indent:\\s+-\\d+pt;[^>]*><span\\s+style=.font-family:\\s+Symbol;.>(&middot;|o|&sect;|&Oslash;|&uuml;|·)\\s*<span.*?</span></span>(.*?)</p>", "ig");
				value = value.replace(patternWordBulletListReplace, "<ul genic=\"true\"><li>$2</li></ul genic=\"true\">");
				
				/* # Appendix A.3 - slå ihop listor */
				var patternWordBulletListCombine = new RegExp("</(u|o)l genic=\"true\">[^<]*<\\1l genic=\"true\">", "ig");
				value = value.replace(patternWordBulletListCombine, "");
				
				/* # Appendix A.4 - ta bort genic="true" i ul */
				var patternWordBulletListCleanupGenic = new RegExp("(</?(u|o)l\\s*)genic=\"true\"(>)", "ig");
				value = value.replace(patternWordBulletListCleanupGenic, "$1$3");
				
				/* # 2 - ta bort kommentarer */
				var patternComments = new RegExp("<!--[\\s\\S]*?--"+">", "ig");
				var patternComments2 = new RegExp("<!--(\s|\S)*?--" + ">", "ig");
				value = value.replace(patternComments, "");
				
				/* # 4 - se till att alla style taggar avslutas med ett semikolon */ 
				var patternStyleSemicolon = new RegExp("(<[^>]*?style=\"[\\s\\S]*?);?\\s*\"", "ig");
				value = value.replace(patternStyleSemicolon, "$1;\"");
				
				/* # 5.1 - konvertera font-element till span-element */
				if(tinyMCE.activeEditor.getParam('definedElementFont') && tinyMCE.activeEditor.getParam('definedElementSpan')) {
					var patternElementFont = new RegExp("(</?)font((\\s+[\\s\\S]*?)*>)", "ig");
					value = value.replace(patternElementFont, "$1span$2");
				}
				
				/* # 5.6 - konvertera div-element till p-element */
				var patternElementDiv = new RegExp("(</?)div((\\s+[\\s\\S]*?)*>)", "ig");
				value = value.replace(patternElementDiv, "$1p$2");
				
				/* # 6 - konvertera color attributet till style color  */
				if(tinyMCE.activeEditor.getParam('definedElementFont')) {
					var patternElementColorAttribute = new RegExp("(<\\w+\\s+[^>]*?)color=\"\\s*(#[a-f0-9]{3,6})\"([\\s\\S]*?)>", "ig");
					value = value.replace(patternElementColorAttribute, "$1$3 style=\"color:$2;\">");
				}
				
				/* # 11 flytta alla tillåtna attribut till början */
				
				/* # 11.1 - flytta color */
				if(tinyMCE.activeEditor.getParam('definedElementFont')) {
					var patternStyleFrontColor = new RegExp("style=\"([^\"]*?;)\\s*(color\\s*:[^;]*?;)([^\"]*?)\"", "ig");
					value = value.replace(patternStyleFrontColor, "style=\"$2$1$3\"");
				}
				
				/* # 12 - ta bort ej tillåtna style attribut */
				var arrAllowedStyles = new Array();
				if(tinyMCE.activeEditor.getParam('definedElementFont')) arrAllowedStyles[arrAllowedStyles.length] = 'color';
				if(tinyMCE.activeEditor.getParam('definedElementStrong')) arrAllowedStyles[arrAllowedStyles.length] = 'font-weight';
				if(tinyMCE.activeEditor.getParam('definedElementEm')) arrAllowedStyles[arrAllowedStyles.length] = 'font-style';
				
				var patternAllowedStyles = new RegExp(",", "ig");
				var strAllowedStyles = arrAllowedStyles.toString().replace(patternAllowedStyles, '|');
				
				if(strAllowedStyles.length) {
					var patternStyleIllegalStyleAttributes = new RegExp("style=\"((\\s*("+strAllowedStyles+")\\s*:[^;]+;)*)[^\"]*\"", "ig");
					value = value.replace(patternStyleIllegalStyleAttributes, "style=\"$1\"");
				} else {
					var patternRemoveStyles = new RegExp("style=\"[^\"]*\"", "ig");
					value = value.replace(patternRemoveStyles, "");
				}
				
				/* # 2 - ta bort kommentarer */
				var patternComments = new RegExp("<!--[\\s\\S]*?--"+">", "ig");
				value = value.replace(patternComments, "");
				
				
			break;
		}
		
		return value;
	}
	