/** * WYSIWYG - jQuery plugin 0.3 * * Copyright (c) 2008 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[0]; if ( element.nodeName.toLowerCase() == 'iframe') return element.contentWindow.document; /* return ( $.browser.msie ) ? document.frames[element.id].document : element.contentWindow.document // contentDocument; */ else return $(this); }; $.fn.documentSelection = function() { var element = this[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; } var options = $.extend({ html : '<'+'?xml version="1.0" encoding="UTF-8"?'+'>
STYLE_SHEETINITIAL_CONTENT', 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 controls : {}, messages : {} }, options); $.extend(options.messages, Wysiwyg.MSGS_EN); $.extend(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 ) { var self = $.data(this, 'wysiwyg'); if ( self.constructor == Wysiwyg && szURL && szURL.length > 0 ) 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 ) { self.editorDoc.execCommand('unlink', false, []); self.editorDoc.execCommand('createLink', false, szURL); } else if ( self.options.messages.nonSelection ) alert(self.options.messages.nonSelection); } }, 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' } }, italic : { visible : true, tags : ['i', 'em'], css : { fontStyle : 'italic' } }, strikeThrough : { visible : false, tags : ['s', 'strike'], css : { textDecoration : 'line-through' } }, underline : { visible : false, tags : ['u'], css : { textDecoration : 'underline' } }, separator00 : { visible : false, separator : true }, justifyLeft : { visible : false, css : { textAlign : 'left' } }, justifyCenter : { visible : false, tags : ['center'], css : { textAlign : 'center' } }, justifyRight : { visible : false, css : { textAlign : 'right' } }, justifyFull : { visible : false, css : { textAlign : 'justify' } }, separator01 : { visible : false, separator : true }, indent : { visible : false }, outdent : { visible : false }, separator02 : { visible : false, separator : true }, subscript : { visible : false, tags : ['sub'] }, superscript : { visible : false, tags : ['sup'] }, separator03 : { visible : false, separator : true }, undo : { visible : false }, redo : { visible : false }, separator04 : { visible : false, separator : true }, insertOrderedList : { visible : false, tags : ['ol'] }, insertUnorderedList : { visible : false, tags : ['ul'] }, insertHorizontalRule : { visible : false, tags : ['hr'] }, separator05 : { separator : true }, createLink : { visible : true, exec : function() { var selection = $(this.editor).documentSelection(); if ( selection.length > 0 ) { if ( $.browser.msie ) 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'] }, insertImage : { visible : true, exec : function() { if ( $.browser.msie ) 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'] }, separator06 : { separator : true }, h1mozilla : { visible : true && $.browser.mozilla, className : 'h1', command : 'heading', arguments : ['h1'], tags : ['h1'] }, h2mozilla : { visible : true && $.browser.mozilla, className : 'h2', command : 'heading', arguments : ['h2'], tags : ['h2'] }, h3mozilla : { visible : true && $.browser.mozilla, className : 'h3', command : 'heading', arguments : ['h3'], tags : ['h3'] }, h1 : { visible : true && !( $.browser.mozilla ), className : 'h1', command : 'formatBlock', arguments : ['h1'], tags : ['h1'] }, h2 : { visible : true && !( $.browser.mozilla ), className : 'h2', command : 'formatBlock', arguments : ['h2'], tags : ['h2'] }, h3 : { visible : true && !( $.browser.mozilla ), className : 'h3', command : 'formatBlock', arguments : ['h3'], tags : ['h3'] }, separator07 : { visible : false, separator : true }, cut : { visible : false }, copy : { visible : false }, paste : { visible : false }, separator08 : { separator : true && !( $.browser.msie ) }, increaseFontSize : { visible : true && !( $.browser.msie ), tags : ['big'] }, decreaseFontSize : { visible : true && !( $.browser.msie ), tags : ['small'] }, 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 ); } }, removeFormat : { visible : true, exec : function() { this.editorDoc.execCommand('removeFormat', false, []); this.editorDoc.execCommand('unlink', false, []); } } } }); $.extend(Wysiwyg.prototype, { original : null, options : {}, element : null, editor : null, 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 = $('').css({ minHeight : ( newY - 6 ).toString() + 'px', width : ( newX - 8 ).toString() + 'px' }).attr('id', $(element).attr('id') + 'IFrame'); if ( $.browser.msie ) { this.editor .css('height', ( newY ).toString() + 'px'); /** var editor = $('').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 = $('