//
// WYZZ v0.1 Copyright (c) 2007 The Mouse Whisperer
//
// Contains code Copyright (c) 2006 openWebWare.com
// This copyright notice MUST stay intact for use.
//
// An open source WYSIWYG editor for use in web based applications.
// For full source code and docs, visit http://wyzz.bpweb.net
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
// License for more details.
//
// You should have received a copy of the GNU Lesser General Public License along
// with this library; if not, write to the Free Software Foundation, Inc., 59
// Temple Place, Suite 330, Boston, MA 02111-1307 USA
// Editor width and Height
wyzzW = 450;
wyzzH = 150;
// Style Sheet
document.write('\n');
// Order of available commands in toolbar
var buttonName = new Array("bold","italic","underline","justifyleft","justifycenter","justifyright","insertunorderedlist","insertorderedlist","upsize","downsize");
/*
Emulates insertAdjacentHTML(), insertAdjacentText() and insertAdjacentElement() three functions
so they work with Netscape 6/Mozilla - By Thor Larholm me@jscript.dk
*/
if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
HTMLElement.prototype.insertAdjacentElement = function
(where,parsedNode)
{
switch (where){
case 'beforeBegin':
this.parentNode.insertBefore(parsedNode,this)
break;
case 'afterBegin':
this.insertBefore(parsedNode,this.firstChild);
break;
case 'beforeEnd':
this.appendChild(parsedNode);
break;
case 'afterEnd':
if (this.nextSibling)
this.parentNode.insertBefore(parsedNode,this.nextSibling);
else this.parentNode.appendChild(parsedNode);
break;
}
}
HTMLElement.prototype.insertAdjacentHTML = function
(where,htmlStr)
{
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var parsedHTML = r.createContextualFragment(htmlStr);
this.insertAdjacentElement(where,parsedHTML)
}
HTMLElement.prototype.insertAdjacentText = function
(where,txtStr)
{
var parsedText = document.createTextNode(txtStr)
this.insertAdjacentElement(where,parsedText)
}
};
function make_wyzz(textareaID) {
// Hide the textarea
document.getElementById(textareaID).style.display = 'none';
// get textareaID
var n = textareaID;
// Toolbars width is 2 pixels wider than the editor
toolbarWidth = parseFloat(wyzzW) + 2;
// Generate WYSIWYG toolbar
var toolbar;
toolbar = '
';
// Output buttons for toolbar
for (btn in buttonName) {
toolbar += '
';
}
toolbar += '
';
// Create iframe for editor
var iframe = '
\n'
+ '\n'
+ '
\n';
// Insert toolbar after the textArea
document.getElementById(n).insertAdjacentHTML("afterEnd", toolbar + iframe);
// Give the iframe the required height and width
document.getElementById("wysiwyg" + n).style.height = wyzzH + "px";
document.getElementById("wysiwyg" + n).style.width = wyzzW + "px";
// Pass the textarea's existing text into the editor
var content = document.getElementById(n).value;
var doc = document.getElementById("wysiwyg" + n).contentWindow.document;
// Write the textarea's content into the iframe
doc.open();
doc.write(content);
doc.close();
// Make the iframe editable in both Mozilla and IE
doc.body.contentEditable = true;
doc.designMode = "on";
// Update the textarea with content in WYSIWYG when user submits form
var browserName = navigator.appName;
if (browserName == "Microsoft Internet Explorer") {
for (var idx=0; idx < document.forms.length; idx++) {
document.forms[idx].attachEvent('onsubmit', function() { updateTextArea(n); });
}
}
else {
for (var idx=0; idx < document.forms.length; idx++) {
document.forms[idx].addEventListener('submit',function OnSumbmit() { updateTextArea(n); }, true);
}
}
};
function formatText(id, n, selected) {
// When user clicks button make sure it always targets correct textarea
document.getElementById("wysiwyg" + n).contentWindow.focus();
if(id=="upsize") {
var currentFontSize = document.getElementById("wysiwyg"+n).contentWindow.document.queryCommandValue("FontSize");
if(currentFontSize == '') currentFontSize = 3; // fudge for FF
if(currentFontSize < 7) {
var newFontSize = parseInt(currentFontSize) + 1;
} else {
var newFontSize = currentFontSize;
}
document.getElementById("wysiwyg" + n).contentWindow.document.execCommand("FontSize", false, newFontSize);
}
else if(id=="downsize") {
var currentFontSize = document.getElementById("wysiwyg"+n).contentWindow.document.queryCommandValue("FontSize");
if(currentFontSize > 1) {
var newFontSize = currentFontSize - 1;
} else {
var newFontSize = currentFontSize;
}
document.getElementById("wysiwyg" + n).contentWindow.document.execCommand("FontSize", false, newFontSize);
}
else {
document.getElementById("wysiwyg" + n).contentWindow.document.execCommand(id, false, null);
}
};
function insertHTML(html, n) {
var browserName = navigator.appName;
if (browserName == "Microsoft Internet Explorer") {
document.getElementById('wysiwyg' + n).contentWindow.document.selection.createRange().pasteHTML(html);
}
else {
var div = document.getElementById('wysiwyg' + n).contentWindow.document.createElement("div");
div.innerHTML = html;
var node = insertNodeAtSelection(div, n);
}
}
function insertNodeAtSelection(insertNode, n) {
// get current selection
var sel = document.getElementById('wysiwyg' + n).contentWindow.getSelection();
// get the first range of the selection
// (there's almost always only one range)
var range = sel.getRangeAt(0);
// deselect everything
sel.removeAllRanges();
// remove content of current selection from document
range.deleteContents();
// get location of current selection
var container = range.startContainer;
var pos = range.startOffset;
// make a new range for the new selection
range=document.createRange();
if (container.nodeType==3 && insertNode.nodeType==3) {
// if we insert text in a textnode, do optimized insertion
container.insertData(pos, insertNode.nodeValue);
// put cursor after inserted text
range.setEnd(container, pos+insertNode.length);
range.setStart(container, pos+insertNode.length);
}
else {
var afterNode;
if (container.nodeType==3) {
// when inserting into a textnode
// we create 2 new textnodes
// and put the insertNode in between
var textNode = container;
container = textNode.parentNode;
var text = textNode.nodeValue;
// text before the split
var textBefore = text.substr(0,pos);
// text after the split
var textAfter = text.substr(pos);
var beforeNode = document.createTextNode(textBefore);
afterNode = document.createTextNode(textAfter);
// insert the 3 new nodes before the old one
container.insertBefore(afterNode, textNode);
container.insertBefore(insertNode, afterNode);
container.insertBefore(beforeNode, insertNode);
// remove the old node
container.removeChild(textNode);
}
else {
// else simply insert the node
afterNode = container.childNodes[pos];
container.insertBefore(insertNode, afterNode);
}
range.setEnd(afterNode, 0);
range.setStart(afterNode, 0);
}
sel.addRange(range);
};
function updateTextArea(n) {
document.getElementById(n).value = document.getElementById("wysiwyg" + n).contentWindow.document.body.innerHTML;
};
function grabSelectedText(n){
var browserName = navigator.appName;
var selectedText = '';
// Grab Selected Text for IE
if (browserName == "Microsoft Internet Explorer") {
var theText = document.getElementById("wysiwyg" + n).contentWindow.document.selection;
if(theText.type =='Text') {
var newText = theText.createRange();
selectedText = newText.text;
}
}
// Grab Selected Text for Mozilla/Netscape
else {
var selectedText = document.getElementById("wysiwyg" + n).contentWindow.document.getSelection();
}
return selectedText;
}