php-mpos/public/site_assets/mmcFE/js/jquery.wysiwyg.js
2013-05-06 14:11:38 +02:00

790 lines
25 KiB
JavaScript

/**
* WYSIWYG - jQuery plugin 0.6
*
* Copyright (c) 2008-2009 Juan M Martinez
* http://plugins.jquery.com/project/jWYSIWYG
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* $Id: $
*/
(function ($) {
$.fn.document = function () {
var element = this.get(0);
if (element.nodeName.toLowerCase() == 'iframe') {
return element.contentWindow.document;
/*
return ( $.browser.msie )
? document.frames[element.id].document
: element.contentWindow.document // contentDocument;
*/
}
return this;
};
$.fn.documentSelection = function () {
var element = this.get(0);
if (element.contentWindow.document.selection) return element.contentWindow.document.selection.createRange().text;
else return element.contentWindow.getSelection().toString();
};
$.fn.wysiwyg = function (options) {
if (arguments.length > 0 && arguments[0].constructor == String) {
var action = arguments[0].toString();
var params = [];
for (var i = 1; i < arguments.length; i++)
params[i - 1] = arguments[i];
if (action in Wysiwyg) {
return this.each(function () {
$.data(this, 'wysiwyg').designMode();
Wysiwyg[action].apply(this, params);
});
} else return this;
}
var controls = {};
/**
* If the user set custom controls, we catch it, and merge with the
* defaults controls later.
*/
if (options && options.controls) {
var controls = options.controls;
delete options.controls;
}
options = $.extend({
html: '<' + '?xml version="1.0" encoding="UTF-8"?' + '><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">STYLE_SHEET</head><body style="margin: 0px;">INITIAL_CONTENT</body></html>',
css: {},
debug: false,
autoSave: true,
// http://code.google.com/p/jwysiwyg/issues/detail?id=11
rmUnwantedBr: true,
// http://code.google.com/p/jwysiwyg/issues/detail?id=15
brIE: true,
controls: {},
messages: {}
}, options);
options.messages = $.extend(true, options.messages, Wysiwyg.MSGS_EN);
options.controls = $.extend(true, options.controls, Wysiwyg.TOOLBAR);
for (var control in controls) {
if (control in options.controls) $.extend(options.controls[control], controls[control]);
else options.controls[control] = controls[control];
}
// not break the chain
return this.each(function () {
Wysiwyg(this, options);
});
};
function Wysiwyg(element, options) {
return this instanceof Wysiwyg ? this.init(element, options) : new Wysiwyg(element, options);
}
$.extend(Wysiwyg, {
insertImage: function (szURL, attributes) {
var self = $.data(this, 'wysiwyg');
if (self.constructor == Wysiwyg && szURL && szURL.length > 0) {
if ($.browser.msie) self.focus();
if (attributes) {
self.editorDoc.execCommand('insertImage', false, '#jwysiwyg#');
var img = self.getElementByAttributeValue('img', 'src', '#jwysiwyg#');
if (img) {
img.src = szURL;
for (var attribute in attributes) {
img.setAttribute(attribute, attributes[attribute]);
}
}
} else {
self.editorDoc.execCommand('insertImage', false, szURL);
}
}
},
createLink: function (szURL) {
var self = $.data(this, 'wysiwyg');
if (self.constructor == Wysiwyg && szURL && szURL.length > 0) {
var selection = $(self.editor).documentSelection();
if (selection.length > 0) {
if ($.browser.msie) self.focus();
self.editorDoc.execCommand('unlink', false, []);
self.editorDoc.execCommand('createLink', false, szURL);
} else if (self.options.messages.nonSelection) alert(self.options.messages.nonSelection);
}
},
insertHtml: function (szHTML) {
var self = $.data(this, 'wysiwyg');
if (self.constructor == Wysiwyg && szHTML && szHTML.length > 0) {
if ($.browser.msie) {
self.focus();
self.editorDoc.execCommand('insertImage', false, '#jwysiwyg#');
var img = self.getElementByAttributeValue('img', 'src', '#jwysiwyg#');
if (img) {
$(img).replaceWith(szHTML);
}
} else {
self.editorDoc.execCommand('insertHTML', false, szHTML);
}
}
},
setContent: function (newContent) {
var self = $.data(this, 'wysiwyg');
self.setContent(newContent);
self.saveContent();
},
clear: function () {
var self = $.data(this, 'wysiwyg');
self.setContent('');
self.saveContent();
},
MSGS_EN: {
nonSelection: 'select the text you wish to link'
},
TOOLBAR: {
bold: {
visible: true,
tags: ['b', 'strong'],
css: {
fontWeight: 'bold'
},
tooltip: "Bold"
},
italic: {
visible: true,
tags: ['i', 'em'],
css: {
fontStyle: 'italic'
},
tooltip: "Italic"
},
strikeThrough: {
visible: true,
tags: ['s', 'strike'],
css: {
textDecoration: 'line-through'
},
tooltip: "Strike-through"
},
underline: {
visible: true,
tags: ['u'],
css: {
textDecoration: 'underline'
},
tooltip: "Underline"
},
separator00: {
visible: true,
separator: true
},
justifyLeft: {
visible: true,
css: {
textAlign: 'left'
},
tooltip: "Justify Left"
},
justifyCenter: {
visible: true,
tags: ['center'],
css: {
textAlign: 'center'
},
tooltip: "Justify Center"
},
justifyRight: {
visible: true,
css: {
textAlign: 'right'
},
tooltip: "Justify Right"
},
justifyFull: {
visible: true,
css: {
textAlign: 'justify'
},
tooltip: "Justify Full"
},
separator01: {
visible: true,
separator: true
},
indent: {
visible: true,
tooltip: "Indent"
},
outdent: {
visible: true,
tooltip: "Outdent"
},
separator02: {
visible: false,
separator: true
},
subscript: {
visible: true,
tags: ['sub'],
tooltip: "Subscript"
},
superscript: {
visible: true,
tags: ['sup'],
tooltip: "Superscript"
},
separator03: {
visible: true,
separator: true
},
undo: {
visible: true,
tooltip: "Undo"
},
redo: {
visible: true,
tooltip: "Redo"
},
separator04: {
visible: true,
separator: true
},
insertOrderedList: {
visible: true,
tags: ['ol'],
tooltip: "Insert Ordered List"
},
insertUnorderedList: {
visible: true,
tags: ['ul'],
tooltip: "Insert Unordered List"
},
insertHorizontalRule: {
visible: true,
tags: ['hr'],
tooltip: "Insert Horizontal Rule"
},
separator05: {
separator: true
},
createLink: {
visible: true,
exec: function () {
var selection = $(this.editor).documentSelection();
if (selection.length > 0) {
if ($.browser.msie) {
this.focus();
this.editorDoc.execCommand('createLink', true, null);
} else {
var szURL = prompt('URL', 'http://');
if (szURL && szURL.length > 0) {
this.editorDoc.execCommand('unlink', false, []);
this.editorDoc.execCommand('createLink', false, szURL);
}
}
} else if (this.options.messages.nonSelection) alert(this.options.messages.nonSelection);
},
tags: ['a'],
tooltip: "Create link"
},
insertImage: {
visible: true,
exec: function () {
if ($.browser.msie) {
this.focus();
this.editorDoc.execCommand('insertImage', true, null);
} else {
var szURL = prompt('URL', 'http://');
if (szURL && szURL.length > 0) this.editorDoc.execCommand('insertImage', false, szURL);
}
},
tags: ['img'],
tooltip: "Insert image"
},
separator06: {
separator: true
},
h1mozilla: {
visible: true && $.browser.mozilla,
className: 'h1',
command: 'heading',
arguments: ['h1'],
tags: ['h1'],
tooltip: "Header 1"
},
h2mozilla: {
visible: true && $.browser.mozilla,
className: 'h2',
command: 'heading',
arguments: ['h2'],
tags: ['h2'],
tooltip: "Header 2"
},
h3mozilla: {
visible: true && $.browser.mozilla,
className: 'h3',
command: 'heading',
arguments: ['h3'],
tags: ['h3'],
tooltip: "Header 3"
},
h1: {
visible: true && !($.browser.mozilla),
className: 'h1',
command: 'formatBlock',
arguments: ['<H1>'],
tags: ['h1'],
tooltip: "Header 1"
},
h2: {
visible: true && !($.browser.mozilla),
className: 'h2',
command: 'formatBlock',
arguments: ['<H2>'],
tags: ['h2'],
tooltip: "Header 2"
},
h3: {
visible: true && !($.browser.mozilla),
className: 'h3',
command: 'formatBlock',
arguments: ['<H3>'],
tags: ['h3'],
tooltip: "Header 3"
},
separator07: {
visible: false,
separator: true
},
cut: {
visible: false,
tooltip: "Cut"
},
copy: {
visible: false,
tooltip: "Copy"
},
paste: {
visible: false,
tooltip: "Paste"
},
separator08: {
separator: false && !($.browser.msie)
},
increaseFontSize: {
visible: false && !($.browser.msie),
tags: ['big'],
tooltip: "Increase font size"
},
decreaseFontSize: {
visible: false && !($.browser.msie),
tags: ['small'],
tooltip: "Decrease font size"
},
separator09: {
separator: true
},
html: {
visible: false,
exec: function () {
if (this.viewHTML) {
this.setContent($(this.original).val());
$(this.original).hide();
} else {
this.saveContent();
$(this.original).show();
}
this.viewHTML = !(this.viewHTML);
},
tooltip: "View source code"
},
removeFormat: {
visible: true,
exec: function () {
if ($.browser.msie) this.focus();
this.editorDoc.execCommand('removeFormat', false, []);
this.editorDoc.execCommand('unlink', false, []);
},
tooltip: "Remove formatting"
}
}
});
$.extend(Wysiwyg.prototype, {
original: null,
options: {},
element: null,
editor: null,
focus: function () {
$(this.editorDoc.body).focus();
},
init: function (element, options) {
var self = this;
this.editor = element;
this.options = options || {};
$.data(element, 'wysiwyg', this);
var newX = element.width || element.clientWidth;
var newY = element.height || element.clientHeight;
if (element.nodeName.toLowerCase() == 'textarea') {
this.original = element;
if (newX == 0 && element.cols) newX = (element.cols * 8) + 21;
if (newY == 0 && element.rows) newY = (element.rows * 16) + 16;
var editor = this.editor = $('<iframe src="javascript:false;"></iframe>').css({
minHeight: (newY - 6).toString() + 'px',
width: (newX - 0).toString() + 'px'
}).attr('id', $(element).attr('id') + 'IFrame').attr('frameborder', '0');
/**
* http://code.google.com/p/jwysiwyg/issues/detail?id=96
*/
this.editor.attr('tabindex', $(element).attr('tabindex'));
if ($.browser.msie) {
this.editor.css('height', (newY).toString() + 'px');
/**
var editor = $('<span></span>').css({
width : ( newX - 6 ).toString() + 'px',
height : ( newY - 8 ).toString() + 'px'
}).attr('id', $(element).attr('id') + 'IFrame');
editor.outerHTML = this.editor.outerHTML;
*/
}
}
var panel = this.panel = $('<ul role="menu" class="panel"></ul>');
this.appendControls();
this.element = $('<div></div>').css({
width: (newX > 0) ? (newX).toString() + 'px' : '100%'
}).addClass('wysiwyg').append(panel).append($('<div><!-- --></div>').css({
clear: 'both'
})).append(editor);
$(element).hide().before(this.element);
this.viewHTML = false;
this.initialHeight = newY - 8;
/**
* @link http://code.google.com/p/jwysiwyg/issues/detail?id=52
*/
this.initialContent = $(element).val();
this.initFrame();
if (this.initialContent.length == 0) this.setContent('');
/**
* http://code.google.com/p/jwysiwyg/issues/detail?id=100
*/
var form = $(element).closest('form');
if (this.options.autoSave) {
form.submit(function () {
self.saveContent();
});
}
form.bind('reset', function () {
self.setContent(self.initialContent);
self.saveContent();
});
},
initFrame: function () {
var self = this;
var style = '';
/**
* @link http://code.google.com/p/jwysiwyg/issues/detail?id=14
*/
if (this.options.css && this.options.css.constructor == String) {
style = '<link rel="stylesheet" type="text/css" media="screen" href="' + this.options.css + '" />';
}
this.editorDoc = $(this.editor).document();
this.editorDoc_designMode = false;
try {
this.editorDoc.designMode = 'on';
this.editorDoc_designMode = true;
} catch (e) {
// Will fail on Gecko if the editor is placed in an hidden container element
// The design mode will be set ones the editor is focused
$(this.editorDoc).focus(function () {
self.designMode();
});
}
this.editorDoc.open();
this.editorDoc.write(
this.options.html
/**
* @link http://code.google.com/p/jwysiwyg/issues/detail?id=144
*/
.replace(/INITIAL_CONTENT/, function () {
return self.initialContent;
}).replace(/STYLE_SHEET/, function () {
return style;
}));
this.editorDoc.close();
this.editorDoc.contentEditable = 'true';
if ($.browser.msie) {
/**
* Remove the horrible border it has on IE.
*/
setTimeout(function () {
$(self.editorDoc.body).css('border', 'none');
}, 0);
}
$(this.editorDoc).click(function (event) {
self.checkTargets(event.target ? event.target : event.srcElement);
});
/**
* @link http://code.google.com/p/jwysiwyg/issues/detail?id=20
*/
$(this.original).focus(function () {
if (!$.browser.msie) {
self.focus();
}
});
if (this.options.autoSave) {
/**
* @link http://code.google.com/p/jwysiwyg/issues/detail?id=11
*/
$(this.editorDoc).keydown(function () {
self.saveContent();
}).keyup(function () {
self.saveContent();
}).mousedown(function () {
self.saveContent();
});
}
if (this.options.css) {
setTimeout(function () {
if (self.options.css.constructor == String) {
/**
* $(self.editorDoc)
* .find('head')
* .append(
* $('<link rel="stylesheet" type="text/css" media="screen" />')
* .attr('href', self.options.css)
* );
*/
} else $(self.editorDoc).find('body').css(self.options.css);
}, 0);
}
$(this.editorDoc).keydown(function (event) {
if ($.browser.msie && self.options.brIE && event.keyCode == 13) {
var rng = self.getRange();
rng.pasteHTML('<br />');
rng.collapse(false);
rng.select();
return false;
}
return true;
});
},
designMode: function () {
if (!(this.editorDoc_designMode)) {
try {
this.editorDoc.designMode = 'on';
this.editorDoc_designMode = true;
} catch (e) {}
}
},
getSelection: function () {
return (window.getSelection) ? window.getSelection() : document.selection;
},
getRange: function () {
var selection = this.getSelection();
if (!(selection)) return null;
return (selection.rangeCount > 0) ? selection.getRangeAt(0) : selection.createRange();
},
getContent: function () {
return $($(this.editor).document()).find('body').html();
},
setContent: function (newContent) {
$($(this.editor).document()).find('body').html(newContent);
},
saveContent: function () {
if (this.original) {
var content = this.getContent();
if (this.options.rmUnwantedBr) {
content = (content.substr(-4) == '<br>') ? content.substr(0, content.length - 4) : content;
}
$(this.original).val(content);
}
},
withoutCss: function () {
if ($.browser.mozilla) {
try {
this.editorDoc.execCommand('styleWithCSS', false, false);
} catch (e) {
try {
this.editorDoc.execCommand('useCSS', false, true);
} catch (e) {}
}
}
},
appendMenu: function (cmd, args, className, fn, tooltip) {
var self = this;
args = args || [];
$('<li></li>').append(
$('<a role="menuitem" tabindex="-1" href="javascript:;">' + (className || cmd) + '</a>').addClass(className || cmd).attr('title', tooltip)).click(function () {
if (fn) fn.apply(self);
else {
self.withoutCss();
self.editorDoc.execCommand(cmd, false, args);
}
if (self.options.autoSave) self.saveContent();
}).appendTo(this.panel);
},
appendMenuSeparator: function () {
$('<li role="separator" class="separator"></li>').appendTo(this.panel);
},
appendControls: function () {
for (var name in this.options.controls) {
var control = this.options.controls[name];
if (control.separator) {
if (control.visible !== false) this.appendMenuSeparator();
} else if (control.visible) {
this.appendMenu(
control.command || name, control.arguments || [], control.className || control.command || name || 'empty', control.exec, control.tooltip || control.command || name || '');
}
}
},
checkTargets: function (element) {
for (var name in this.options.controls) {
var control = this.options.controls[name];
var className = control.className || control.command || name || 'empty';
$('.' + className, this.panel).removeClass('active');
if (control.tags) {
var elm = element;
do {
if (elm.nodeType != 1) break;
if ($.inArray(elm.tagName.toLowerCase(), control.tags) != -1) $('.' + className, this.panel).addClass('active');
} while ((elm = elm.parentNode));
}
if (control.css) {
var elm = $(element);
do {
if (elm[0].nodeType != 1) break;
for (var cssProperty in control.css)
if (elm.css(cssProperty).toString().toLowerCase() == control.css[cssProperty]) $('.' + className, this.panel).addClass('active');
} while ((elm = elm.parent()));
}
}
},
getElementByAttributeValue: function (tagName, attributeName, attributeValue) {
var elements = this.editorDoc.getElementsByTagName(tagName);
for (var i = 0; i < elements.length; i++) {
var value = elements[i].getAttribute(attributeName);
if ($.browser.msie) { /** IE add full path, so I check by the last chars. */
value = value.substr(value.length - attributeValue.length);
}
if (value == attributeValue) return elements[i];
}
return false;
}
});
})(jQuery);