//#####
//###  Epoz - a cross-browser-wysiwyg-editor for Zope
//##   Copyright (C) 2003 Maik Jablonski (maik.jablonski@uni-bielefeld.de)
//#

// This file has been modified by Simon MacMullen on a variety of dates after Jan 27th 2004.
// (See http://zope.org/Resources/ZPL clause 5)

var ELEMENT_NODE                   = 1;
var ATTRIBUTE_NODE                 = 2;
var TEXT_NODE                      = 3;
var CDATA_SECTION_NODE             = 4;
var ENTITY_REFERENCE_NODE          = 5;
var ENTITY_NODE                    = 6;
var PROCESSING_INSTRUCTION_NODE    = 7;
var COMMENT_NODE                   = 8;
var DOCUMENT_NODE                  = 9;
var DOCUMENT_TYPE_NODE             = 10;
var DOCUMENT_FRAGMENT_NODE         = 11;
var NOTATION_NODE                  = 12;


// Just to prevent typos when fetching the Epoz-IFrame...
var Epoz = "EpozEditor";

// Speed-Up-Storage for document.getElementById(Epoz);

var EpozElement;
var EpozTextArea;
var winElem;

// Global storages

var form_data;  // the document-data
var form_name;  // the name of the form-element
var form_path;  // path to buttons, font-selectors, ...

var contentLength = -1;
var contentLengthDelta = 30;

var UNDO_NUMBER_STATES = 50;
var undoStates = new Array();
var undoState = 0;

var selectedStyleNode;
var selectedSubstyleNode;


function Style(name, tag, cssClass) {
	this.name = name;
	this.tag = tag;
	this.cssClass = cssClass;
}

Style.prototype.matchStrength = function(node) {
	var strength = 0;

	if (this.tag.toLowerCase() == node.nodeName.toLowerCase()) {
		strength++;

		if (this.cssClass != '' && this.cssClass == node.className) {
			strength++;
		}

		if (this.cssClass == '' && node.className == '') {
			strength++;
		}
	}

	return strength;
}


function Substyle(name, tag, cssClass, colour) {
	this.name = name;
	this.tag = tag;
	this.cssClass = cssClass;
	this.colour = colour;
}

Substyle.prototype.matchStrength = function(node) {
	var strength = 0;

	if (this.tag.toLowerCase() == node.nodeName.toLowerCase()) {
		strength++;

		// Cheap way to match colours.
		var dummyColourNode = document.createElement('span');
		dummyColourNode.style.color = '#' + this.colour;

		if (dummyColourNode.style.color == node.style.color) {
			strength++;
		}

		if (this.cssClass != '' && this.cssClass == node.className) {
			strength++;
		}

		if (this.cssClass == '' && node.className == '') {
			strength++;
		}
	}

	return strength;
}


// Detect browser type and create Epoz- or Default-Textbox

function InitEpoz(name, data, path) {
    form_name = name;
    form_data = data;
    form_path = path;

	CreateEpoz();

    // Put data into Epoz-Editor
	var frameHtml = '<html><head><link href="' + form_path + 'epoz.css" rel="stylesheet" type="text/css" /></head><body>' + 
	                form_data + '</body></html>';

	var doc = document.getElementById(Epoz).contentWindow.document;
	doc.open();
	doc.write(frameHtml);
	doc.close();

    setTimeout(EnableDesignMode, 10);
}

// Needs to be called by timeout for Mozilla...
var handlersAdded = false;
function EnableDesignMode() {
    // Store the Editor-Element in a global variable
    EpozElement = document.getElementById(Epoz);
    EpozTextArea = document.getElementById(form_name);
    winElem = EpozElement.contentWindow.window;

    if (browser.isIE5up) {
        frames[Epoz].document.designMode = "On";
    }
    else {
		// just a try-catch-poll to see
		// when Mozilla is ready to go...
		try {
			EpozElement.contentDocument.designMode = "on";
		} catch (e) {
			setTimeout(EnableDesignMode, 10);
			return;
		}
    }

    // Set all forms in sync with Epoz

    if (document.getElementsByTagName)
        var x = document.getElementsByTagName('FORM');
    else if (document.all)
        var x = document.all.tags('FORM');

    for (var i=0;i<x.length;i++) {
        x[i].onsubmit = SyncEpoz;
    }

	if (!handlersAdded) {
		handlersAdded = true;

		addEventHandler("click", updateStateHandler);
		addEventHandler("dblclick", updateStateHandler);
		addEventHandler("keyup", updateStateHandler);

		addEventHandler("keyup", checkForPaste);
		addEventHandler("mousemove", checkForPaste);

		addEventHandler("dblclick", updateAltTag);

		if (browser.isIE5up) {
			getDoc().onkeydown = iecrlf;
		}

		updateStateHandler();
    }

	// Store undo state
	undoState = 0;
	setTimeout(function() {undoStates.unshift(getHTML());}, 10); // Give MSIE time to catch up
}

function getDoc() {
    return EpozElement.contentWindow.document;
}

function getHTML() {
    return getDoc().body.innerHTML;
}

function setHTML(html) {
    getDoc().body.innerHTML = html;
}

function updateStateHandler() {
	var currentNode = getRangeParent();
	if (currentNode == null) return;

	// Find the main style

	var selector = document.getElementById("formatblock");
	var index = -1;
	var bestMatchStrength = 0;
	selectedStyleNode = null;
	var node = currentNode;

	while (index == -1 && node.parentNode) {
		for (i = 0; i < styleList.length; i++) {
			if (styleList[i].matchStrength(node) > bestMatchStrength) {
				index = i;
				bestMatchStrength = styleList[i].matchStrength(node);
				selectedStyleNode = node;
			}
		}
		node = node.parentNode;
	}

	selector.selectedIndex = index + 1;

	var sub = document.getElementById("formatsubblock");
	sub.options.length = 0;

	if (index == -1 || styleList[index].substyles.length == 0) {
		sub.style.visibility = 'hidden';

	} else {
		// Set up sub-styles

		var style = styleList[index];

		sub.style.visibility = 'visible';
		sub.options[0] = new Option('Normal', '');

		for (var i = 0; i < style.substyles.length; i++) {
			sub.options[i + 1] = new Option(style.substyles[i].name, i);
		}

		// And find the right sub-style

		var index = -1;
		var bestMatchStrength = 0;
		var haveFoundWithColour = false;
		selectedSubstyleNode = null;
		var node = currentNode;

		while (index == -1 && node.parentNode) {
			for (i = 0; i < style.substyles.length; i++) {
				if (style.substyles[i].matchStrength(node) > bestMatchStrength) {
					index = i;
					bestMatchStrength = style.substyles[i].matchStrength(node);
					selectedSubstyleNode = node;
				}
			}
			node = node.parentNode;
		}

		sub.selectedIndex = index + 1;
	}
}

function iecrlf() {
	if (EpozElement.contentWindow.event.keyCode == 13) {
		if (containingListNode()) {
			return true;

		} else {
			InsertHTML("<br/>");
		}

		forceIERefresh();

		return false;
	}
}

function forceIERefresh() {
	var range = getDoc().selection.createRange();
	range.moveStart('character', -1);
	range.select();
	range.moveStart('character', 1);
	range.select();
}

function avoidPasteCheck() {
	contentLength = getHTML().length;
}

function checkForPaste() {
	var newContentLength = getHTML().length;
	var shouldStoreUndo = false;

	//debug(getHTML());

	if (newContentLength - contentLength > contentLengthDelta && contentLength != -1) {
		contentLength = getHTML().length;
		shouldStoreUndo = true;

		cleanContent();
	} else {
		shouldStoreUndo = newContentLength != contentLength;
	}

	if (shouldStoreUndo) {
		// Throw away undo states that no longer apply
		for (i = 0; i < undoState; i++) {
			undoStates.shift();
		}

		undoState = 0;
		undoStates.unshift(getHTML());

		if (undoStates.length > UNDO_NUMBER_STATES) {
			undoStates.pop();
		}
	}

	contentLength = getHTML().length;
}

function undo() {
	undoState++;
	if (undoState >= UNDO_NUMBER_STATES) {
		undoState = UNDO_NUMBER_STATES - 1;
	}

	var html = undoStates[undoState];
	if (html) {
		setHTML(html);
    	avoidPasteCheck();
    }
}

function redo() {
	undoState--;
	if (undoState < 0) {
		undoState = 0;
	}

	var html = undoStates[undoState];
	if (html) {
		setHTML(html);
    	avoidPasteCheck();
    }
}

function debug(text) {
	document.getElementById('debug').replaceChild(document.createTextNode(text), document.getElementById('debug').childNodes[0]);
}

var cleanedContent;

function cleanContent() {
	var oldHTML = undoStates[undoState];
	var newHTML = getHTML();

	var insertStart;
	var insertEnd;
	var difference = newHTML.length - oldHTML.length;

	var inTag = false;

	for (insertStart = 0; insertStart < oldHTML.length; insertStart++) {
		var character = oldHTML.charAt(insertStart);
		if (inTag) {
			if (character == '>') {
				inTag = false;
			}
		} else {
			if (character == '<') {
				inTag = true;
			}
		}

		if (character != newHTML.charAt(insertStart)) {
			break;
		}
	}

	if (inTag) {
		var oldStart = insertStart;
		insertStart = oldHTML.lastIndexOf('<', insertStart);
		//alert('Moved back ' + (oldStart - insertStart));
	}

	inTag = false;

	for (insertEnd = oldHTML.length - 1; insertEnd >= 0; insertEnd--) {
		var character = oldHTML.charAt(insertEnd);

		if (character != newHTML.charAt(insertEnd + difference)) {
			break;
		}

		if (inTag) {
			if (character == '<') {
				inTag = false;
			}
		} else {
			if (character == '>') {
				inTag = true;
			}
		}
	}

	if (inTag) {
		var oldEnd = insertEnd;
		insertEnd = oldHTML.indexOf('>', insertEnd);
		//alert('Moved forward ' + (oldEnd - insertEnd));
	}

	var inserted = newHTML.substring(insertStart, insertEnd + difference + 1);

	var fragment = getDoc().createDocumentFragment();
	var div = getDoc().createElement("div");
	div.innerHTML = inserted;

	cleanedContent = '';
	cleanVisit(div);


	var debug = oldHTML.substring(0, insertStart) + '|' + cleanedContent + '|' + oldHTML.substring(insertEnd + 1);
	//alert(oldHTML);
	//alert(newHTML);
	//alert(debug);

	setHTML(oldHTML.substring(0, insertStart) + cleanedContent + oldHTML.substring(insertEnd + 1));
}

function cleanVisit(node) {
	if (node.nodeType == TEXT_NODE) {
		cleanedContent += node.nodeValue;
	}

	if (node.nodeType == ELEMENT_NODE) {
		// MSIE defines node.scopeName instead of nameSpaceURI or similar. It also starts using
		// weird bonkers namespaces when pasting from MS Word, which can have tags with "clean" names
		// in (e.g. <o.p> -> <p>), so we need to explicitly ignore.
		var dodgyXMLNode = node.scopeName && node.scopeName != 'HTML';

		var nodeName = node.nodeName.toLowerCase();
		var niceNodeName;
		if (!dodgyXMLNode) {
			if (nodeName == 'b' || nodeName == 'i' ||
				nodeName == 'h2' || nodeName == 'h3' || nodeName == 'h4' || nodeName == 'h5' || nodeName == 'h6' ||
				nodeName == 'ul' || nodeName == 'li' || nodeName == 'ol') {
				niceNodeName = nodeName;
			}
		}

		if (niceNodeName) {
			cleanedContent += '<' + niceNodeName + '>';
		}

		for (var i = 0; i < node.childNodes.length; i++) {
			cleanVisit(node.childNodes[i]);
		}

		if (niceNodeName) {
			cleanedContent += '</' + niceNodeName + '>';
		}

		if (!dodgyXMLNode && (nodeName == 'br' || nodeName == 'p')) {
			cleanedContent += '<br/>';
			if (nodeName == 'p') {
				cleanedContent += '<br/>';				
			}
		}
	}
}

// A submit-wrapper to pass the parameters into the form-element

function SyncEpoz() {
	if (!EpozElement) return;

	// Just a simple workaround...
	// Switching views results in code,
	// that is slightly (x)html-cleaned
	// automatically by the browser.

	if (document.getElementById('EpozViewMode') && document.getElementById('EpozViewMode').checked) {
		setHTML(EpozTextArea.value);
	}

	try {
		html = getHTML();
	} catch (e) {
		html = EpozElement.value;
	}

	EpozTextArea.value=html;

	html = document.getElementById(form_name).value;
	html = TidyHTML(html);

	if (html == '') {
		html = '&nbsp;';
	}

  	document.getElementById(form_name).value = html;
}

// Convert all IE-format-tags to Mozilla-format-tags
// IE is much smarter when editing the Mozilla-format-tags

function TidyHTML(html) {
	html = html.replace(/<strong>/ig,'<b>');
	html = html.replace(/<\/strong>/ig,'</b>');

	html = html.replace(/<em>/ig,'<i>');
	html = html.replace(/<\/em>/ig,'</i>');
	return html;
}

// -------------------------------------------------------------
// Here are the definitions for the control-and-format-functions

// Format text with RichText-Controls

function FormatText(command, option) {
    EpozElement.contentWindow.focus();

    // Mozilla inserts css-styles per default

	if (browser.isGecko) {
    	getDoc().execCommand('useCSS',false, true);
    }

    getDoc().execCommand(command, false, option);
    avoidPasteCheck();
}

function formatList(type) {
    if (browser.isIE5up) {
    	var listNode = containingListNode();

		if (listNode) {
			visitConvertListToLines(listNode);
			removeElement(listNode);

		} else {
			var html = getRange().htmlText;

			if (html.toLowerCase().match(/.*<br>$/)) {
				var size = html.length - 4;
				html = html.substring(0, size);
			}

			html = html.replace(/<br>/ig,'</li><li>');
			html = '<' + type + '><li>' + html + '</li></' + type + '>';

			getRange().pasteHTML(html);
		}

	} else {
		if (type == 'ol') {
			FormatText('insertorderedlist', '');
		} else {
			FormatText('insertunorderedlist', '');
		}
	}

    avoidPasteCheck();
}

function containingListNode() {
   	var node = getRangeParent();
	var listNode;

	while (node) {
		if (node.nodeName.toLowerCase() == 'ul' || node.nodeName.toLowerCase() == 'ol') {
			listNode = node;
		}
		node = node.parentNode;
	}
	return listNode;
}

var definitionListHTML;
var definitionListTag;
var definitionListText;

function formatDefinitionList(type) {
	var listNode = containingDefinitionListNode();

	if (listNode) {
		visitConvertListToLines(listNode);
		removeElement(listNode);

	} else {
		var node = extractRangeContents();

		definitionListHTML = '<dl>';
		definitionListTag = 'dt';
		definitionListText = '';

		visitFormatDefinitionList(node);

		definitionListHTML += '<' + definitionListTag + '>' + definitionListText + '</' + definitionListTag + '>';
		definitionListHTML += '</dl>';

		InsertHTML(definitionListHTML);
	}

    avoidPasteCheck();
}

function visitFormatDefinitionList(node) {
	if (node.nodeType == ELEMENT_NODE || node.nodeType == DOCUMENT_FRAGMENT_NODE) {
		for (var i = 0; i < node.childNodes.length; i++) {
			visitFormatDefinitionList(node.childNodes[i]);
		}

		if (node.nodeName.toLowerCase() == 'br') {
			definitionListHTML += '<' + definitionListTag + '>' + definitionListText + '</' + definitionListTag + '>';
			definitionListText = '';
			definitionListTag = (definitionListTag == 'dt') ? 'dd' : 'dt';
		}
	} else if (node.nodeType == TEXT_NODE) {
		definitionListText += ' ' + node.nodeValue;
		definitionListText = trim(definitionListText);
	}
}

function extractRangeContents() {
	var fragment;
	if (browser.isIE5up) {
		var html = getRange().htmlText;
		getRange().pasteHTML('');

		fragment = getDoc().createDocumentFragment();

		var node = getDoc().createElement('div');
		node.innerHTML = html;

		while (node.childNodes.length > 0) {
			fragment.appendChild(node.childNodes[0]);
		}

	} else {
		fragment = getRange().extractContents();
	}

	return fragment;
}

function containingDefinitionListNode() {
   	var node = getRangeParent();
	var listNode;

	while (node) {
		if (node.nodeName.toLowerCase() == 'dl') {
			listNode = node;
		}
		node = node.parentNode;
	}
	return listNode;
}

function visitConvertListToLines(node) {
	if (node.nodeType == ELEMENT_NODE) {
		for (var i = 0; i < node.childNodes.length; i++) {
			visitConvertListToLines(node.childNodes[i]);
		}

		var name = node.nodeName.toLowerCase();
		if (name == 'li' || name == 'dt' || name == 'dd') {
			removeElement(node, true);
		}
	}
}

// Insert arbitrary HTML at current selection

function InsertHTML(html) {

    EpozElement.contentWindow.focus();

    if (browser.isIE5up) {
        selection = getDoc().selection;
        range = selection.createRange();
        try {
            range.pasteHTML(html);
        } catch (e) {
            // catch error when range is evil for IE
        }
    } else {
        selection = winElem.getSelection();
        EpozElement.contentWindow.focus();
        if (selection) {
            range = selection.getRangeAt(0);
        } else {
            range = getDoc().createRange();
        }

        var fragment = getDoc().createDocumentFragment();
        var div = getDoc().createElement("div");
        div.innerHTML = html;

        while (div.firstChild) {
            fragment.appendChild(div.firstChild);
        }

        selection.removeAllRanges();
        range.deleteContents();

        var node = range.startContainer;
        var pos = range.startOffset;

        switch (node.nodeType) {
            case 3:
                if (fragment.nodeType == 3) {
                    node.insertData(pos, fragment.data);
                    range.setEnd(node, pos + fragment.length);
                    range.setStart(node, pos + fragment.length);
                } else {
                    node = node.splitText(pos);
                    node.parentNode.insertBefore(fragment, node);
                    range.setEnd(node, pos + fragment.length);
                    range.setStart(node, pos + fragment.length);
                }
                break;

            case 1:
                node = node.childNodes[pos];
                node.parentNode.insertBefore(fragment, node);
                range.setEnd(node, pos + fragment.length);
                range.setStart(node, pos + fragment.length);
                break;
        }
        selection.addRange(range);
    }
}

function insertNode(nodeType, nodeToReplace, cssClass, colour) {
	if (isRangeCollapsed() && !nodeToReplace) {
		alert("Please select some text");
		return;
	}

	if (nodeToReplace) {
		var grandparent = nodeToReplace.parentNode;
		var children = nodeToReplace.childNodes;
		var newNode = getDoc().createElement(nodeType);

		if (cssClass && cssClass != '') {
			newNode.className = cssClass;
		}

		if (colour && colour != '') {
			newNode.style.color = '#' + colour;
		}

		while (children.length > 0) {
			newNode.appendChild(children[0]);
		}

		grandparent.replaceChild(newNode, nodeToReplace);
		updateStateHandler();


	} else {
		if (browser.isIE5up) {
			// MSIE can't do range.extractContents() - we have to fake it.

			var range = getDoc().selection.createRange();

			var attribs = '';
			if (cssClass && cssClass != '') {
				attribs += ' class="' + cssClass + '"';
			}

			if (colour && colour != '') {
				attribs += ' style="color: #' + colour + '"';
			}

			range.pasteHTML('<' + nodeType + attribs + '>' + range.htmlText + '</' + nodeType + '>');

			range.collapse();
			range.moveStart('character', -1);
			range.moveEnd('character', -1);
			range.select();
			range = getDoc().selection.createRange()

			var element = range.parentElement();
			while (element.nodeName.toLowerCase() != nodeType.toLowerCase()) {
				element = element.parentNode;
			}

			range.moveEnd('character', 1);
			range.moveStart('character', 1);
			range.select();

			return element;

		} else {
			var newNode = getDoc().createElement(nodeType);
			if (cssClass && cssClass != '') {
				newNode.className = cssClass;
			}

			if (colour && colour != '') {
				newNode.style.color = '#' + colour;
			}

			range = winElem.getSelection().getRangeAt(0);

			var contents = range.extractContents();
			newNode.appendChild(contents);
			range.insertNode(newNode);

			return newNode;
		}
    }
}

function isRangeCollapsed() {
    if (browser.isIE5up) {
    	// MSIE can't do range.collapsed - we have to fake it.
        var range = getDoc().selection.createRange();
		var rangeCollapsed = range.duplicate();
		rangeCollapsed.collapse();
		return range.isEqual(rangeCollapsed);

    } else {
        var range = winElem.getSelection().getRangeAt(0);
        return range.collapsed;
    }
}

function getRangeParent() {
	var node;

    if (browser.isIE5up) {
        var range = getDoc().selection.createRange();
        if (!range.parentElement) {
			// Range can be eg selected horizontal rule with drag handles - no parentElement()
        	return null;
        }
        node = range.parentElement();

    } else {
        var range = winElem.getSelection().getRangeAt(0);
        node = range.commonAncestorContainer;
    }

	while (node.nodeType != ELEMENT_NODE) {
		node = node.parentNode;
	}

	return node;
}

function getRange() {
    if (browser.isIE5up) {
        return getDoc().selection.createRange();
    } else {
        return winElem.getSelection().getRangeAt(0);
    }
}

function removeParentFormat() {
	var node = getRangeParent();
	removeElement(node);
}

function removeElement(node, breakAfter) {
	// Safety catch in case something else goes wrong...
	if (node.nodeName.toLowerCase() == 'body') return;
	var grandparent = node.parentNode;
	var children = node.childNodes;

	while (node.childNodes.length > 0) {
		grandparent.insertBefore(children[0], node);
	}

	if (breakAfter) {
		grandparent.insertBefore(getDoc().createElement('br'), node);
	}

	grandparent.removeChild(node);
	updateStateHandler();
}

// Create a Hyperlink

var linkToEdit;

function CreateLink(URL) {
    if ((URL == null) || (URL == "")) {
    	linkToEdit = null;

    	var node = getRangeParent();
    	while (true) {
    		if (node.nodeName.toLowerCase() == 'a') {
    			linkToEdit = node;
    			break;
    		}

    		if (node.childNodes.length == 1) {
    			node = node.childNodes[0];
    		} else {
    			break;
    		}
    	}

		popup('insertObjectPopup?mode=links&id=' + idForUploads + '&slotTypeId=' + slotTypeId, 'img_popup', 420, 600);			

    } else {
		EpozElement.contentWindow.focus();

        var anchor = insertNode('a');
        anchor.href = URL;

		avoidPasteCheck();
    }
}

// Insert image via a URL

function CreateImage(URL, width, height, align, widthObject, altText, captionText) {
    if ((URL == null) || (URL == "")) {
	    popup('insertObjectPopup?mode=images&id=' + idForUploads + '&slotTypeId=' + slotTypeId, 'img_popup', 302, 600);

    } else {
        EpozElement.contentWindow.focus();
        var sizedImage;

        if (widthObject) {
	        sizedImage = URL + '?width=' + width + '&height=' + height + '&showDraft=plain';

        } else {
	        sizedImage = URL + '?showDraft=plain';
        }

		var cssClass;

		if (widthObject) {
			cssClass = align + '-' + widthObject.columns;
		} else {
			cssClass = align + '-unscaled';
		}

        var results = '';

		if (captionText && widthObject) {
			results += '<span class="cmhtml-caption-' + cssClass + '">';
		}

		results += '<img class="cmhtml-img-' + cssClass + '" src="' + sizedImage + '" alt="' +
					altText + '" width="' + width + '" height="' + height + '">';

		if (captionText && widthObject) {
			results += captionText + '</span>';
		}

		InsertHTML(results);
		avoidPasteCheck();
    }
}

// Sets selected formats

function SelectFormat()
{
	var select = document.getElementById('formatblock');

	if (select.options[select.selectedIndex].value == '') {
		removeParentFormat();

	} else {
		var style = styleList[select.selectedIndex - 1];

		insertNode(style.tag, selectedStyleNode, style.cssClass);
	}

	updateStateHandler();
	avoidPasteCheck();
    EpozElement.contentWindow.focus();
}

function SelectSubFormat()
{
	var select = document.getElementById('formatblock');
	var subselect = document.getElementById('formatsubblock');

	if (subselect.options[subselect.selectedIndex].value == '') {
		removeParentFormat();

	} else {
		var style = styleList[select.selectedIndex - 1];
		var substyle = style.substyles[subselect.selectedIndex - 1];

		insertNode(substyle.tag, selectedSubstyleNode, substyle.cssClass, substyle.colour);
	}

	updateStateHandler();
	avoidPasteCheck();
    EpozElement.contentWindow.focus();
}

function updateAltTag(event) {
	var node;
    if (browser.isIE5up) {
    	if (!event) event = window.event;
    	node = event.srcElement;
	} else {
		node = event.target;
	}

	if (node.nodeName.toLowerCase() == 'img') {
		var newAlt = prompt('Change the ALT attribute for this image:', node.getAttribute('alt'));
		if (newAlt != null) {
			node.setAttribute('alt', newAlt);
			avoidPasteCheck();
		}
	}
}

// Switch between Source- and Wysiwyg-View

function SwitchViewMode(mode)
{
	if (mode) {

		try {
			html = getHTML();
		} catch (e) {
			html = EpozElement.value;
		}

		document.getElementById("EpozToolbar").style.display="none";
		EpozTextArea.value=html;
		EpozTextArea.style.display="inline";

	} else {

		html = EpozTextArea.value;
		setHTML(html);
		document.getElementById("EpozToolbar").style.display="inline";
		EpozTextArea.style.display="none";

   		if (browser.isGecko) {
			EpozElement.contentDocument.designMode = "on";
		}
	}
}

function addEventHandler(event, method) {
   	var obj = getDoc();
    try {

        if (browser.isGecko) {
            obj.addEventListener(event, method, false);
        } else if (browser.isIE5up) {
            obj.attachEvent("on" + event, method);
        } else {
            throw "Unsupported browser!";
        }
    } catch(e) {
        alert('exception ' + e.message + ' while registering an event handler for event ' + event + ', method ' + method);
    	alert(obj);
    }
}

