From: <be...@us...> - 2012-08-20 10:16:19
|
Revision: 10090 http://xoops.svn.sourceforge.net/xoops/?rev=10090&view=rev Author: beckmi Date: 2012-08-20 10:16:09 +0000 (Mon, 20 Aug 2012) Log Message: ----------- Adding RhEditor from XOOPS Russia Added Paths: ----------- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/Readme.txt ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/buttons.gif ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/toolbar.gif ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.css ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.js ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.xoopscode.js ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor_registry.php ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/index.html ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/english.php ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/index.html ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/russian.php ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/rheditor.php Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/Readme.txt =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/Readme.txt (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/Readme.txt 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,3 @@ +This is an editor create by members from XOOPS Russia. +See more info: +http://xoops.ws/modules/news/article.php?storyid=56 \ No newline at end of file Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/buttons.gif =================================================================== (Binary files differ) Property changes on: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/buttons.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/toolbar.gif =================================================================== (Binary files differ) Property changes on: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/images/toolbar.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.css =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.css (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.css 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,24 @@ +.rheditorMain {border:1px solid #999; padding:0 1px 1px; background-color:white} +.rheditorMain iframe {border:none; margin:0; padding:0} +.rheditorMain textarea {border:none; margin:0; padding:0; overflow-y:scroll; font:10pt Arial,Verdana; resize:none; outline:none /* webkit grip focus */} +.rheditorToolbar {background: url('images/toolbar.gif') repeat} +.rheditorGroup {float:left; height:26px} +.rheditorButton {float:left; width:24px; height:24px; margin:1px 0 1px 0; background: url('images/buttons.gif')} +.rheditorDisabled {opacity:0.3; filter:alpha(opacity=30)} +.rheditorDivider {float:left; width:1px; height:23px; margin:1px 0 1px 0; background:#CCC} +.rheditorPopup {border:solid 1px #999; background-color:white; position:absolute; font:10pt Arial,Verdana; cursor:default; z-index:10000} +.rheditorList div {padding:2px 4px 2px 4px} +.rheditorList p, +.rheditorList h1, +.rheditorList h2, +.rheditorList h3, +.rheditorList h4, +.rheditorList h5, +.rheditorList h6, +.rheditorList font {padding:0; margin:0; background-color:Transparent} +.rheditorColor {width:150px; padding:1px 0 0 1px} +.rheditorColor div {float:left; width:14px; height:14px; margin:0 1px 1px 0} +.rheditorPrompt {background-color:#F6F7F9; padding:4px; font-size:8.5pt} +.rheditorPrompt input, +.rheditorPrompt textarea {font:8.5pt Arial,Verdana;} +.rheditorMsg {background-color:#FDFCEE; width:150px; padding:4px; font-size:8.5pt} Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.js =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.js (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.js 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,1119 @@ + +(function($) { + + //============== + // jQuery Plugin + //============== + + $.rheditor = { + + // Define the defaults used for all new rheditor instances + defaultOptions: { + width: 500, // width not including margins, borders or padding + height: 250, // height not including margins, borders or padding + controls: // controls to add to the toolbar + "bold italic underline strikethrough subscript superscript | font size " + + "style | color highlight removeformat | bullets numbering | outdent " + + "indent | alignleft center alignright justify | undo redo | " + + "rule image link unlink | cut copy paste pastetext | print source", + colors: // colors in the color popup + "FFF FCC FC9 FF9 FFC 9F9 9FF CFF CCF FCF " + + "CCC F66 F96 FF6 FF3 6F9 3FF 6FF 99F F9F " + + "BBB F00 F90 FC6 FF0 3F3 6CC 3CF 66C C6C " + + "999 C00 F60 FC3 FC0 3C0 0CC 36F 63F C3C " + + "666 900 C60 C93 990 090 399 33F 60C 939 " + + "333 600 930 963 660 060 366 009 339 636 " + + "000 300 630 633 330 030 033 006 309 303", + fonts: // font names in the font popup + "Arial,Arial Black,Comic Sans MS,Courier New,Narrow,Garamond," + + "Georgia,Impact,Sans Serif,Serif,Tahoma,Trebuchet MS,Verdana", + sizes: // sizes in the font size popup + "1,2,3,4,5,6,7", + styles: // styles in the style popup + [["Paragraph", "<p>"], ["Header 1", "<h1>"], ["Header 2", "<h2>"], + ["Header 3", "<h3>"], ["Header 4","<h4>"], ["Header 5","<h5>"], + ["Header 6","<h6>"]], + useCSS: false, // use CSS to style HTML when possible (not supported in ie) + docType: // Document type contained within the editor + '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">', + docCSSFile: // CSS file used to style the document contained within the editor + "", + bodyStyle: // style to assign to document body contained within the editor + "margin:4px; font:10pt Arial,Verdana; cursor:text" + }, + + // Define all usable toolbar buttons - the init string property is + // expanded during initialization back into the buttons object and + // seperate object properties are created for each button. + // e.g. buttons.size.title = "Font Size" + buttons: { + // name,title,command,popupName (""=use name) + init: + "bold,,|" + + "italic,,|" + + "underline,,|" + + "strikethrough,,|" + + "subscript,,|" + + "superscript,,|" + + "font,,fontname,|" + + "size,Font Size,fontsize,|" + + "style,,formatblock,|" + + "color,Font Color,forecolor,|" + + "highlight,Text Highlight Color,hilitecolor,color|" + + "removeformat,Remove Formatting,|" + + "bullets,,insertunorderedlist|" + + "numbering,,insertorderedlist|" + + "outdent,,|" + + "indent,,|" + + "alignleft,Align Text Left,justifyleft|" + + "center,,justifycenter|" + + "alignright,Align Text Right,justifyright|" + + "justify,,justifyfull|" + + "undo,,|" + + "redo,,|" + + "rule,Insert Horizontal Rule,inserthorizontalrule|" + + "image,Insert Image,insertimage,url|" + + "link,Insert Hyperlink,createlink,url|" + + "unlink,Remove Hyperlink,|" + + "cut,,|" + + "copy,,|" + + "paste,,|" + + "pastetext,Paste as Text,inserthtml,|" + + "print,,|" + + "source,Show Source" + }, + + // imagesPath - returns the path to the images folder + imagesPath: function() { return imagesPath(); } + + }; + + // rheditor - creates a new editor for each of the matched textareas + $.fn.rheditor = function(options) { + + // Create a new jQuery object to hold the results + var $result = $([]); + + // Loop through all matching textareas and create the editors + this.each(function(idx, elem) { + if (elem.tagName == "TEXTAREA") { + var data = $.data(elem, RHEDITOR); + if (!data) data = new rheditor(elem, options); + $result = $result.add(data); + } + }); + + // return the new jQuery object + return $result; + + }; + + //================== + // Private Variables + //================== + + var + + // Misc constants + BACKGROUND_COLOR = "backgroundColor", + BUTTON = "button", + BUTTON_NAME = "buttonName", + CHANGE = "change", + RHEDITOR = "rheditor", + CLICK = "click", + DISABLED = "disabled", + DIV_TAG = "<div>", + TRANSPARENT = "transparent", + UNSELECTABLE = "unselectable", + + // Class name constants + MAIN_CLASS = "rheditorMain", // main containing div + TOOLBAR_CLASS = "rheditorToolbar", // toolbar div inside main div + GROUP_CLASS = "rheditorGroup", // group divs inside the toolbar div + BUTTON_CLASS = "rheditorButton", // button divs inside group div + DISABLED_CLASS = "rheditorDisabled",// disabled button divs + DIVIDER_CLASS = "rheditorDivider", // divider divs inside group div + POPUP_CLASS = "rheditorPopup", // popup divs inside body + LIST_CLASS = "rheditorList", // list popup divs inside body + COLOR_CLASS = "rheditorColor", // color popup div inside body + PROMPT_CLASS = "rheditorPrompt", // prompt popup divs inside body + MSG_CLASS = "rheditorMsg", // message popup div inside body + + // Test for ie + ie = $.browser.msie, + ie6 = /msie\s6/i.test(navigator.userAgent), + + // Test for iPhone/iTouch/iPad + iOS = /iphone|ipad|ipod/i.test(navigator.userAgent), + + // Popups are created once as needed and shared by all editor instances + popups = {}, + + // Used to prevent the document click event from being bound more than once + documentClickAssigned, + + // Local copy of the buttons object + buttons = $.rheditor.buttons; + + //=============== + // Initialization + //=============== + + // Expand the buttons.init string back into the buttons object + // and create seperate object properties for each button. + // e.g. buttons.size.title = "Font Size" + $.each(buttons.init.split("|"), function(idx, button) { + var items = button.split(","), name = items[0]; + buttons[name] = { + stripIndex: idx, + name: name, + title: items[1] === "" ? name.charAt(0).toUpperCase() + name.substr(1) : items[1], + command: items[2] === "" ? name : items[2], + popupName: items[3] === "" ? name : items[3] + }; + }); + delete buttons.init; + + //============ + // Constructor + //============ + + // rheditor - creates a new editor for the passed in textarea element + rheditor = function(area, options) { + + var editor = this; + + // Get the defaults and override with options + editor.options = options = $.extend({}, $.rheditor.defaultOptions, options); + + // Hide the textarea and associate it with this editor + var $area = editor.$area = $(area) + .hide() + .data(RHEDITOR, editor) + .blur(function() { + // Update the iframe when the textarea loses focus + updateFrame(editor, true); + }); + + // Create the main container and append the textarea + var $main = editor.$main = $(DIV_TAG) + .addClass(MAIN_CLASS) + .width(options.width) + .height(options.height); + + // Create the toolbar + var $toolbar = editor.$toolbar = $(DIV_TAG) + .addClass(TOOLBAR_CLASS) + .appendTo($main); + + // Add the first group to the toolbar + var $group = $(DIV_TAG) + .addClass(GROUP_CLASS) + .appendTo($toolbar); + + // Add the buttons to the toolbar + $.each(options.controls.split(" "), function(idx, buttonName) { + if (buttonName === "") return true; + + // Divider + if (buttonName == "|") { + + // Add a new divider to the group + var $div = $(DIV_TAG) + .addClass(DIVIDER_CLASS) + .appendTo($group); + + // Create a new group + $group = $(DIV_TAG) + .addClass(GROUP_CLASS) + .appendTo($toolbar); + + } + + // Button + else { + + // Get the button definition + var button = buttons[buttonName]; + + // Add a new button to the group + var $buttonDiv = $(DIV_TAG) + .data(BUTTON_NAME, button.name) + .addClass(BUTTON_CLASS) + .attr("title", button.title) + .bind(CLICK, $.proxy(buttonClick, editor)) + .appendTo($group) + .hover(hoverEnter, hoverLeave); + + // Prepare the button image + var map = {}; + if (button.css) map = button.css; + else if (button.image) map.backgroundImage = imageUrl(button.image); + if (button.stripIndex) map.backgroundPosition = button.stripIndex * -24; + $buttonDiv.css(map); + + // Add the unselectable attribute for ie + if (ie) + $buttonDiv.attr(UNSELECTABLE, "on"); + + // Create the popup + if (button.popupName) + createPopup(button.popupName, options, button.popupClass, + button.popupContent, button.popupHover); + + } + + }); + + // Add the main div to the DOM and append the textarea + $main.insertBefore($area) + .append($area); + + // Bind the document click event handler + if (!documentClickAssigned) { + $(document).click(function(e) { + // Dismiss all non-prompt popups + var $target = $(e.target); + if (!$target.add($target.parents()).is("." + PROMPT_CLASS)) + hidePopups(); + }); + documentClickAssigned = true; + } + + // Bind the window resize event when the width or height is auto or % + if (/auto|%/.test("" + options.width + options.height)) + $(window).resize(function() {refresh(editor);}); + + // Create the iframe and resize the controls + refresh(editor); + + }; + + //=============== + // Public Methods + //=============== + + var fn = rheditor.prototype, + + // Expose the following private functions as methods on the rheditor object. + // The closure compiler will rename the private functions. However, the + // exposed method names on the rheditor object will remain fixed. + methods = [ + ["clear", clear], + ["disable", disable], + ["execCommand", execCommand], + ["focus", focus], + ["hidePopups", hidePopups], + ["sourceMode", sourceMode, true], + ["refresh", refresh], + ["select", select], + ["selectedHTML", selectedHTML, true], + ["selectedText", selectedText, true], + ["showMessage", showMessage], + ["updateFrame", updateFrame], + ["updateTextArea", updateTextArea] + ]; + + $.each(methods, function(idx, method) { + fn[method[0]] = function() { + var editor = this, args = [editor]; + // using each here would cast booleans into objects! + for(var x = 0; x < arguments.length; x++) {args.push(arguments[x]);} + var result = method[1].apply(editor, args); + if (method[2]) return result; + return editor; + }; + }); + + // change - shortcut for .bind("change", handler) or .trigger("change") + fn.change = function(handler) { + var $this = $(this); + return handler ? $this.bind(CHANGE, handler) : $this.trigger(CHANGE); + }; + + //=============== + // Event Handlers + //=============== + + // buttonClick - click event handler for toolbar buttons + function buttonClick(e) { + + var editor = this, + buttonDiv = e.target, + buttonName = $.data(buttonDiv, BUTTON_NAME), + button = buttons[buttonName], + popupName = button.popupName, + popup = popups[popupName]; + + // Check if disabled + if (editor.disabled || $(buttonDiv).attr(DISABLED) == DISABLED) + return; + + // Fire the buttonClick event + var data = { + editor: editor, + button: buttonDiv, + buttonName: buttonName, + popup: popup, + popupName: popupName, + command: button.command, + useCSS: editor.options.useCSS + }; + + if (button.buttonClick && button.buttonClick(e, data) === false) + return false; + + // Toggle source + if (buttonName == "source") { + + // Show the iframe + if (sourceMode(editor)) { + delete editor.range; + editor.$area.hide(); + editor.$frame.show(); + buttonDiv.title = button.title; + } + + // Show the textarea + else { + editor.$frame.hide(); + editor.$area.show(); + buttonDiv.title = "Show Rich Text"; + } + + // Enable or disable the toolbar buttons + // IE requires the timeout + setTimeout(function() {refreshButtons(editor);}, 100); + + } + + // Check for rich text mode + else if (!sourceMode(editor)) { + + // Handle popups + if (popupName) { + var $popup = $(popup); + + // URL + if (popupName == "url") { + + // Check for selection before showing the link url popup + if (buttonName == "link" && selectedText(editor) === "") { + showMessage(editor, "A selection is required when inserting a link.", buttonDiv); + return false; + } + + // Wire up the submit button click event handler + $popup.children(":button") + .unbind(CLICK) + .bind(CLICK, function() { + + // Insert the image or link if a url was entered + var $text = $popup.find(":text"), + url = $.trim($text.val()); + if (url !== "") + execCommand(editor, data.command, url, null, data.button); + + // Reset the text, hide the popup and set focus + $text.val("http://"); + hidePopups(); + focus(editor); + + }); + + } + + // Paste as Text + else if (popupName == "pastetext") { + + // Wire up the submit button click event handler + $popup.children(":button") + .unbind(CLICK) + .bind(CLICK, function() { + + // Insert the unformatted text replacing new lines with break tags + var $textarea = $popup.find("textarea"), + text = $textarea.val().replace(/\n/g, "<br />"); + if (text !== "") + execCommand(editor, data.command, text, null, data.button); + + // Reset the text, hide the popup and set focus + $textarea.val(""); + hidePopups(); + focus(editor); + + }); + + } + + // Show the popup if not already showing for this button + if (buttonDiv !== $.data(popup, BUTTON)) { + showPopup(editor, popup, buttonDiv); + return false; // stop propagination to document click + } + + // propaginate to documnt click + return; + + } + + // Print + else if (buttonName == "print") + editor.$frame[0].contentWindow.print(); + + // All other buttons + else if (!execCommand(editor, data.command, data.value, data.useCSS, buttonDiv)) + return false; + + } + + // Focus the editor + focus(editor); + + } + + // hoverEnter - mouseenter event handler for buttons and popup items + function hoverEnter(e) { + var $div = $(e.target).closest("div"); + $div.css(BACKGROUND_COLOR, $div.data(BUTTON_NAME) ? "#FFF" : "#FFC"); + } + + // hoverLeave - mouseleave event handler for buttons and popup items + function hoverLeave(e) { + $(e.target).closest("div").css(BACKGROUND_COLOR, "transparent"); + } + + // popupClick - click event handler for popup items + function popupClick(e) { + + var editor = this, + popup = e.data.popup, + target = e.target; + + // Check for message and prompt popups + if (popup === popups.msg || $(popup).hasClass(PROMPT_CLASS)) + return; + + // Get the button info + var buttonDiv = $.data(popup, BUTTON), + buttonName = $.data(buttonDiv, BUTTON_NAME), + button = buttons[buttonName], + command = button.command, + value, + useCSS = editor.options.useCSS; + + // Get the command value + if (buttonName == "font") + // Opera returns the fontfamily wrapped in quotes + value = target.style.fontFamily.replace(/"/g, ""); + else if (buttonName == "size") { + if (target.tagName == "DIV") + target = target.children[0]; + value = target.innerHTML; + } + else if (buttonName == "style") + value = "<" + target.tagName + ">"; + else if (buttonName == "color") + value = hex(target.style.backgroundColor); + else if (buttonName == "highlight") { + value = hex(target.style.backgroundColor); + if (ie) command = 'backcolor'; + else useCSS = true; + } + + // Fire the popupClick event + var data = { + editor: editor, + button: buttonDiv, + buttonName: buttonName, + popup: popup, + popupName: button.popupName, + command: command, + value: value, + useCSS: useCSS + }; + + if (button.popupClick && button.popupClick(e, data) === false) + return; + + // Execute the command + if (data.command && !execCommand(editor, data.command, data.value, data.useCSS, buttonDiv)) + return false; + + // Hide the popup and focus the editor + hidePopups(); + focus(editor); + + } + + //================== + // Private Functions + //================== + + // checksum - returns a checksum using the Adler-32 method + function checksum(text) + { + var a = 1, b = 0; + for (var index = 0; index < text.length; ++index) { + a = (a + text.charCodeAt(index)) % 65521; + b = (b + a) % 65521; + } + return (b << 16) | a; + } + + // clear - clears the contents of the editor + function clear(editor) { + editor.$area.val(""); + updateFrame(editor); + } + + // createPopup - creates a popup and adds it to the body + function createPopup(popupName, options, popupTypeClass, popupContent, popupHover) { + + // Check if popup already exists + if (popups[popupName]) + return popups[popupName]; + + // Create the popup + var $popup = $(DIV_TAG) + .hide() + .addClass(POPUP_CLASS) + .appendTo("body"); + + // Add the content + + // Custom popup + if (popupContent) + $popup.html(popupContent); + + // Color + else if (popupName == "color") { + var colors = options.colors.split(" "); + if (colors.length < 10) + $popup.width("auto"); + $.each(colors, function(idx, color) { + $(DIV_TAG).appendTo($popup) + .css(BACKGROUND_COLOR, "#" + color); + }); + popupTypeClass = COLOR_CLASS; + } + + // Font + else if (popupName == "font") + $.each(options.fonts.split(","), function(idx, font) { + $(DIV_TAG).appendTo($popup) + .css("fontFamily", font) + .html(font); + }); + + // Size + else if (popupName == "size") + $.each(options.sizes.split(","), function(idx, size) { + $(DIV_TAG).appendTo($popup) + .html("<font size=" + size + ">" + size + "</font>"); + }); + + // Style + else if (popupName == "style") + $.each(options.styles, function(idx, style) { + $(DIV_TAG).appendTo($popup) + .html(style[1] + style[0] + style[1].replace("<", "</")); + }); + + // URL + else if (popupName == "url") { + $popup.html('Enter URL:<br><input type=text value="http://" size=35><br><input type=button value="Submit">'); + popupTypeClass = PROMPT_CLASS; + } + + // Paste as Text + else if (popupName == "pastetext") { + $popup.html('Paste your content here and click submit.<br /><textarea cols=40 rows=3></textarea><br /><input type=button value=Submit>'); + popupTypeClass = PROMPT_CLASS; + } + + // Add the popup type class name + if (!popupTypeClass && !popupContent) + popupTypeClass = LIST_CLASS; + $popup.addClass(popupTypeClass); + + // Add the unselectable attribute to all items + if (ie) { + $popup.attr(UNSELECTABLE, "on") + .find("div,font,p,h1,h2,h3,h4,h5,h6") + .attr(UNSELECTABLE, "on"); + } + + // Add the hover effect to all items + if ($popup.hasClass(LIST_CLASS) || popupHover === true) + $popup.children().hover(hoverEnter, hoverLeave); + + // Add the popup to the array and return it + popups[popupName] = $popup[0]; + return $popup[0]; + + } + + // disable - enables or disables the editor + function disable(editor, disabled) { + + // Update the textarea and save the state + if (disabled) { + editor.$area.attr(DISABLED, DISABLED); + editor.disabled = true; + } + else { + editor.$area.removeAttr(DISABLED); + delete editor.disabled; + } + + // Switch the iframe into design mode. + // ie6 does not support designMode. + // ie7 & ie8 do not properly support designMode="off". + try { + if (ie) editor.doc.body.contentEditable = !disabled; + else editor.doc.designMode = !disabled ? "on" : "off"; + } + // Firefox 1.5 throws an exception that can be ignored + // when toggling designMode from off to on. + catch (err) {} + + // Enable or disable the toolbar buttons + refreshButtons(editor); + + } + + // execCommand - executes a designMode command + function execCommand(editor, command, value, useCSS, button) { + + // Restore the current ie selection + restoreRange(editor); + + // Set the styling method + if (!ie) { + if (useCSS === undefined || useCSS === null) + useCSS = editor.options.useCSS; + editor.doc.execCommand("styleWithCSS", 0, useCSS.toString()); + } + + // Execute the command and check for error + var success = true, description; + if (ie && command.toLowerCase() == "inserthtml") + getRange(editor).pasteHTML(value); + else { + try { success = editor.doc.execCommand(command, 0, value || null); } + catch (err) { description = err.description; success = false; } + if (!success) { + if ("cutcopypaste".indexOf(command) > -1) + showMessage(editor, "For security reasons, your browser does not support the " + + command + " command. Try using the keyboard shortcut or context menu instead.", + button); + else + showMessage(editor, + (description ? description : "Error executing the " + command + " command."), + button); + } + } + + // Enable the buttons + refreshButtons(editor); + return success; + + } + + // focus - sets focus to either the textarea or iframe + function focus(editor) { + setTimeout(function() { + if (sourceMode(editor)) editor.$area.focus(); + else editor.$frame[0].contentWindow.focus(); + refreshButtons(editor); + }, 0); + } + + // getRange - gets the current text range object + function getRange(editor) { + if (ie) return getSelection(editor).createRange(); + return getSelection(editor).getRangeAt(0); + } + + // getSelection - gets the current text range object + function getSelection(editor) { + if (ie) return editor.doc.selection; + return editor.$frame[0].contentWindow.getSelection(); + } + + // Returns the hex value for the passed in string. + // hex("rgb(255, 0, 0)"); // #FF0000 + // hex("#FF0000"); // #FF0000 + // hex("#F00"); // #FF0000 + function hex(s) { + var m = /rgba?\((\d+), (\d+), (\d+)/.exec(s), + c = s.split(""); + if (m) { + s = ( m[1] << 16 | m[2] << 8 | m[3] ).toString(16); + while (s.length < 6) + s = "0" + s; + } + return "#" + (s.length == 6 ? s : c[1] + c[1] + c[2] + c[2] + c[3] + c[3]); + } + + // hidePopups - hides all popups + function hidePopups() { + $.each(popups, function(idx, popup) { + $(popup) + .hide() + .unbind(CLICK) + .removeData(BUTTON); + }); + } + + // imagesPath - returns the path to the images folder + function imagesPath() { + var cssFile = "jquery.rheditor.css", + href = $("link[href$='" + cssFile +"']").attr("href"); + return href.substr(0, href.length - cssFile.length) + "images/"; + } + + // imageUrl - Returns the css url string for a filemane + function imageUrl(filename) { + return "url(" + imagesPath() + filename + ")"; + } + + // refresh - creates the iframe and resizes the controls + function refresh(editor) { + + var $main = editor.$main, + options = editor.options; + + // Remove the old iframe + if (editor.$frame) + editor.$frame.remove(); + + // Create a new iframe + var $frame = editor.$frame = $('<iframe frameborder="0" src="javascript:true;">') + .hide() + .appendTo($main); + + // Load the iframe document content + var contentWindow = $frame[0].contentWindow, + doc = editor.doc = contentWindow.document, + $doc = $(doc); + + doc.open(); + doc.write( + options.docType + + '<html>' + + ((options.docCSSFile === '') ? '' : '<head><link rel="stylesheet" type="text/css" href="' + options.docCSSFile + '" /></head>') + + '<body style="' + options.bodyStyle + '"></body></html>' + ); + doc.close(); + + // Work around for bug in IE which causes the editor to lose + // focus when clicking below the end of the document. + if (ie) + $doc.click(function() {focus(editor);}); + + // Load the content + updateFrame(editor); + + // Bind the ie specific iframe event handlers + if (ie) { + + // Save the current user selection. This code is needed since IE will + // reset the selection just after the beforedeactivate event and just + // before the beforeactivate event. + $doc.bind("beforedeactivate beforeactivate selectionchange keypress", function(e) { + + // Flag the editor as inactive + if (e.type == "beforedeactivate") + editor.inactive = true; + + // Get rid of the bogus selection and flag the editor as active + else if (e.type == "beforeactivate") { + if (!editor.inactive && editor.range && editor.range.length > 1) + editor.range.shift(); + delete editor.inactive; + } + + // Save the selection when the editor is active + else if (!editor.inactive) { + if (!editor.range) + editor.range = []; + editor.range.unshift(getRange(editor)); + + // We only need the last 2 selections + while (editor.range.length > 2) + editor.range.pop(); + } + + }); + + // Restore the text range when the iframe gains focus + $frame.focus(function() { + restoreRange(editor); + }); + + } + + // Update the textarea when the iframe loses focus + ($.browser.mozilla ? $doc : $(contentWindow)).blur(function() { + updateTextArea(editor, true); + }); + + // Enable the toolbar buttons as the user types or clicks + $doc.click(hidePopups) + .bind("keyup mouseup", function() { + refreshButtons(editor); + }); + + // Show the textarea for iPhone/iTouch/iPad or + // the iframe when design mode is supported. + if (iOS) editor.$area.show(); + else $frame.show(); + + // Wait for the layout to finish - shortcut for $(document).ready() + $(function() { + + var $toolbar = editor.$toolbar, + $group = $toolbar.children("div:last"), + wid = $main.width(); + + // Resize the toolbar + var hgt = $group.offset().top + $group.outerHeight() - $toolbar.offset().top + 1; + $toolbar.height(hgt); + + // Resize the iframe + hgt = (/%/.test("" + options.height) ? $main.height() : parseInt(options.height)) - hgt; + $frame.width(wid).height(hgt); + + // Resize the textarea. IE6 textareas have a 1px top + // & bottom margin that cannot be removed using css. + editor.$area.width(wid).height(ie6 ? hgt - 2 : hgt); + + // Switch the iframe into design mode if enabled + disable(editor, editor.disabled); + + // Enable or disable the toolbar buttons + refreshButtons(editor); + + }); + + } + + // refreshButtons - enables or disables buttons based on availability + function refreshButtons(editor) { + + // Webkit requires focus before queryCommandEnabled will return anything but false + if (!iOS && $.browser.webkit && !editor.focused) { + editor.$frame[0].contentWindow.focus(); + window.focus(); + editor.focused = true; + } + + // Get the object used for checking queryCommandEnabled + var queryObj = editor.doc; + if (ie) queryObj = getRange(editor); + + // Loop through each button + var inSourceMode = sourceMode(editor); + $.each(editor.$toolbar.find("." + BUTTON_CLASS), function(idx, elem) { + + var $elem = $(elem), + button = $.rheditor.buttons[$.data(elem, BUTTON_NAME)], + command = button.command, + enabled = true; + + // Determine the state + if (editor.disabled) + enabled = false; + else if (button.getEnabled) { + var data = { + editor: editor, + button: elem, + buttonName: button.name, + popup: popups[button.popupName], + popupName: button.popupName, + command: button.command, + useCSS: editor.options.useCSS + }; + enabled = button.getEnabled(data); + if (enabled === undefined) + enabled = true; + } + else if (((inSourceMode || iOS) && button.name != "source") || + (ie && (command == "undo" || command == "redo"))) + enabled = false; + else if (command && command != "print") { + if (ie && command == "hilitecolor") + command = "backcolor"; + // IE does not support inserthtml, so it's always enabled + if (!ie || command != "inserthtml") { + try {enabled = queryObj.queryCommandEnabled(command);} + catch (err) {enabled = false;} + } + } + + // Enable or disable the button + if (enabled) { + $elem.removeClass(DISABLED_CLASS); + $elem.removeAttr(DISABLED); + } + else { + $elem.addClass(DISABLED_CLASS); + $elem.attr(DISABLED, DISABLED); + } + + }); + } + + // restoreRange - restores the current ie selection + function restoreRange(editor) { + if (ie && editor.range) + editor.range[0].select(); + } + + // select - selects all the text in either the textarea or iframe + function select(editor) { + setTimeout(function() { + if (sourceMode(editor)) editor.$area.select(); + else execCommand(editor, "selectall"); + }, 0); + } + + // selectedHTML - returns the current HTML selection or and empty string + function selectedHTML(editor) { + restoreRange(editor); + var range = getRange(editor); + if (ie) + return range.htmlText; + var layer = $("<layer>")[0]; + layer.appendChild(range.cloneContents()); + var html = layer.innerHTML; + layer = null; + return html; + } + + // selectedText - returns the current text selection or and empty string + function selectedText(editor) { + restoreRange(editor); + if (ie) return getRange(editor).text; + return getSelection(editor).toString(); + } + + // showMessage - alert replacement + function showMessage(editor, message, button) { + var popup = createPopup("msg", editor.options, MSG_CLASS); + popup.innerHTML = message; + showPopup(editor, popup, button); + } + + // showPopup - shows a popup + function showPopup(editor, popup, button) { + + var offset, left, top, $popup = $(popup); + + // Determine the popup location + if (button) { + var $button = $(button); + offset = $button.offset(); + left = --offset.left; + top = offset.top + $button.height(); + } + else { + var $toolbar = editor.$toolbar; + offset = $toolbar.offset(); + left = Math.floor(($toolbar.width() - $popup.width()) / 2) + offset.left; + top = offset.top + $toolbar.height() - 2; + } + + // Position and show the popup + hidePopups(); + $popup.css({left: left, top: top}) + .show(); + + // Assign the popup button and click event handler + if (button) { + $.data(popup, BUTTON, button); + $popup.bind(CLICK, {popup: popup}, $.proxy(popupClick, editor)); + } + + // Focus the first input element if any + setTimeout(function() { + $popup.find(":text,textarea").eq(0).focus().select(); + }, 100); + + } + + // sourceMode - returns true if the textarea is showing + function sourceMode(editor) { + return editor.$area.is(":visible"); + } + + // updateFrame - updates the iframe with the textarea contents + function updateFrame(editor, checkForChange) { + + var code = editor.$area.val(), + options = editor.options, + updateFrameCallback = options.updateFrame, + $body = $(editor.doc.body); + + // Check for textarea change to avoid unnecessary firing + // of potentially heavy updateFrame callbacks. + if (updateFrameCallback) { + var sum = checksum(code); + if (checkForChange && editor.areaChecksum == sum) + return; + editor.areaChecksum = sum; + } + + // Convert the textarea source code into iframe html + var html = updateFrameCallback ? updateFrameCallback(code) : code; + + // Prevent script injection attacks by html encoding script tags + html = html.replace(/<(?=\/?script)/ig, "<"); + + // Update the iframe checksum + if (options.updateTextArea) + editor.frameChecksum = checksum(html); + + // Update the iframe and trigger the change event + if (html != $body.html()) { + $body.html(html); + $(editor).triggerHandler(CHANGE); + } + + } + + // updateTextArea - updates the textarea with the iframe contents + function updateTextArea(editor, checkForChange) { + + var html = $(editor.doc.body).html(), + options = editor.options, + updateTextAreaCallback = options.updateTextArea, + $area = editor.$area; + + // Check for iframe change to avoid unnecessary firing + // of potentially heavy updateTextArea callbacks. + if (updateTextAreaCallback) { + var sum = checksum(html); + if (checkForChange && editor.frameChecksum == sum) + return; + editor.frameChecksum = sum; + } + + // Convert the iframe html into textarea source code + var code = updateTextAreaCallback ? updateTextAreaCallback(html) : html; + + // Update the textarea checksum + if (options.updateFrame) + editor.areaChecksum = checksum(code); + + // Update the textarea and trigger the change event + if (code != $area.val()) { + $area.val(code); + $(editor).triggerHandler(CHANGE); + } + + } + +})(jQuery); Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.xoopscode.js =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.xoopscode.js (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor/jquery.rheditor.xoopscode.js 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,217 @@ + +(function($) { + + // Браузеры + var browserMozilla = $.browser.mozilla; + var browserMsie = $.browser.msie; + var browserOpera = $.browser.opera; + var browserWebkit = $.browser.webkit; + + // XoopsCode only supports a small subset of HTML, so remove + // any toolbar buttons that are not currently supported. + $.rheditor.defaultOptions.controls = + "bold italic underline strikethrough | font size color removeformat | bullets numbering | " + + "undo redo | image link unlink | cut copy paste pastetext | source"; + + // Save the previously assigned callback handlers + var oldAreaCallback = $.rheditor.defaultOptions.updateTextArea; + var oldFrameCallback = $.rheditor.defaultOptions.updateFrame; + + // Wireup the updateTextArea callback handler + $.rheditor.defaultOptions.updateTextArea = function(html) { + + // Fire the previously assigned callback handler + if (oldAreaCallback) + html = oldAreaCallback(html); + + // Convert the HTML to XoopsCode + return $.rheditor.convertHTMLtoXoopsCode(html); + + } + + // Wireup the updateFrame callback handler + $.rheditor.defaultOptions.updateFrame = function(code) { + + // Fire the previously assigned callback handler + if (oldFrameCallback) + code = oldFrameCallback(code); + + // Convert the XoopsCode to HTML + return $.rheditor.convertXoopsCodeToHTML(code); + + } + + // Expose the convertHTMLtoXoopsCode method + $.rheditor.convertHTMLtoXoopsCode = function(html) { + + // Переводы строк + html = html.replace( /[\r|\n]/g, "" ); + + // Списки + html = html.replace( /<ul>/gi, "[ul]" ); + html = html.replace( /<\/ul>/gi, "[/ul]" ); + html = html.replace( /<ol>/gi, "[ol]" ); + html = html.replace( /<\/ol>/gi, "[/ol]" ); + html = html.replace( /<li>/gi, "[li]" ); + html = html.replace( /<\/li>/gi, "[/li]" ); + + // Картинка + // С шириной + html = html.replace( /<img style=\"?width: ?([0-9]+px|auto);? ?height: ?([0-9]+px|auto);?\"? [^<>]*?src=\"([^<>\"]*?)\"(\s[^<>]*)?\/?>/gi, "[img width=$1]$3[/img]" ); + // <img src="http://localhost.radio-hobby.org/themes/rh/img/logo-ng2012.png" height="100" width="422"> Мазила + // <img src="http://localhost.radio-hobby.org/themes/rh/img/logo-ng2012.png" width="373" height="100"> IE9 + // <IMG height=100 src="http://localhost.radio-hobby.org/themes/rh/img/logo-ng2012.png" width=397> IE6 + html = html.replace( /<img\s[^<>]*?src=\"([^<>\"]*?)\"[^<>]*?width=\"?([0-9]+)\"?[^<>]*?\/?>/gi, "[img width=$2]$1[/img]" ); // IE9 IE6 в первый раз так изменяет размеры + // Остальные картинки + html = html.replace( /<img\s[^<>]*?src=\"([^<>\"]*?)\"(\s[^<>]*)?\/?>/gi, "[img]$1[/img]" ); + // Очищаем ТЕГ [img] + html = html.replace( /\[img width=([0-9]+)px\]/gi, "[img width=$1]" ); + html = html.replace( /\[img width=auto\]/gi, "[img]" ); + // Ссылки + html = html.replace( /<a\s[^<>]*?href=\"([^<>\"]*?)\"(\s[^<>]*)?>([^<>]*?)<\/a>/gi, "[url=$1]$3[/url]" ); + // Цвет + //html = html.replace( /<font\s[^<>]*?color=\"\#([0-9a-f]+)\"(\s[^<>]*)?>([^<>]*?)<\/font>/gi, "[color=$1]$3[/color]" ); + // + html = html.replace( /<(u|ins)(\s[^<>]*)?>/gi, "[u]" ); + html = html.replace( /<\/(u|ins)>/gi, "[/u]" ); + html = html.replace( /<(strike|del)(\s[^<>]*)?>/gi, "[d]" ); + html = html.replace( /<\/(strike|del)>/gi, "[/d]" ); + html = html.replace( /<(strong|b)(\s[^<>]*)?>/gi, "[b]" ); + html = html.replace( /<\/(strong|b)>/gi, "[/b]" ); + html = html.replace( /<(em|i)(\s[^<>]*)?>/gi, "[i]" ); + html = html.replace( /<\/(em|i)>/gi, "[/i]" ); + + // Переводы строк + html = html.replace( /<br(\s[^<>]*)?>/gi, "\n" ); + html = html.replace( /<p(\s[^<>]*)?>/gi, "" ); + html = html.replace( /<\/p>/gi, "\n" ); + // DIV заменяем на SPAN + html = html.replace( /<div><br(\s[^<>]*)?>/gi, "<div>" ); //chrome-safari fix to prevent double linefeeds + html = html.replace( /<\/div>\s*<div([^<>]*)>/gi, "</span>\n<span$1>" ); //chrome-safari fix to prevent double linefeeds + html = html.replace( /<div([^<>]*)>/gi, "\n<span$1>" ); + html = html.replace( /<\/div>/gi, "</span>\n" ); + + // HTML мнемоника + html = html.replace( / /gi, " " ); + html = html.replace( /"/gi, "\"" ); + html = html.replace( /&/gi, "&" ); + + var sc; + // Цикл обработки SPAN + do { + sc = html; + // Обработка тега FONT + // Цвет + html = html.replace( /<font\s([^<>]*?)color=\"?\#([0-9a-f]+)\"?([^<]*?)<\/font>/gi, "[color=$2]<font $1$3</font>[/color]" ); + // Шрифт + html = html.replace( /<font\s([^<>]*?)face=\"'?([^<>\"]*?)'?\"([^<]*?)<\/font>/gi, "[font=$2]<font $1$3</font>[/font]" ); // Сафари и Хром в face добавляют одинарные ковычки + // Размер шрифта + html = html.replace( /<font\s([^<>]*?)size=\"?([1-7]+)\"?([^<]*?)<\/font>/gi, "[size=$2]<font $1$3</font>[/size]" ); + // Удаляем пустой FONT + html = html.replace( /<font\s*>([^<>]*?)<\/font>/gi, "$1" ); + // Удаляем неизвестный FONT + if( sc == html ){ + html = html.replace( /<font[^<>]*>([^<>]*?)<\/font>/gi, "$1" ); + } + + // + } while( sc != html ); + // Преобразуем HTML размеры шрифта в CSS + html = html.replace( /\[size=1\]/gi, "[size=xx-small]" ); + html = html.replace( /\[size=2\]/gi, "[size=small]" ); + html = html.replace( /\[size=3\]/gi, "[size=medium]" ); + html = html.replace( /\[size=4\]/gi, "[size=large]" ); + html = html.replace( /\[size=5\]/gi, "[size=x-large]" ); + html = html.replace( /\[size=6\]/gi, "[size=xx-large]" ); + html = html.replace( /\[size=7\]/gi, "[size=xx-large]" ); + // =================== + + // Удаляем HTML теги + html = html.replace( /<[^<>]*>/gi, "" ); + html = html.replace( /</gi, "<" ); + html = html.replace( />/gi, ">" ); + + // Упорядочиваем BB теги + // ===================== + + // Удаляем пустые BB теги + do { + sc = html; + html = html.replace( /\[b\]\n*\[\/b\]/gi, "" ); + html = html.replace( /\[i\]\n*\[\/i\]/gi, "" ); + html = html.replace( /\[u\]\n*\[\/u\]/gi, "" ); + html = html.replace( /\[quote[^\]]*\]\n*\[\/quote\]/gi, "" ); + html = html.replace( /\[code\]\n*\[\/code\]/gi, "" ); + html = html.replace( /\[url=([^\]]+)\]\n*\[\/url\]/gi, "" ); + html = html.replace( /\[img( align=(left|center|right))?( width=[0-9]+)?\]\n*\[\/img\]/gi, "" ); + html = html.replace( /\[color=\#?[0-9a-f]+\]\n*\[\/color\]/gi, "" ); + html = html.replace( /\[font=[^\]]*\]\n*\[\/font\]/gi, "" ); + // + }while( sc != html ); + + return html; + + } + + // Expose the convertXoopsCodeToHTML method + $.rheditor.convertXoopsCodeToHTML = function(code) { + + // Удаляем HTML теги + code = code.replace( /\</gi, "<" ); + code = code.replace( /\>/gi, ">" ); + + // Переводы строк + code = code.replace( /\r/g, "" ); + code = code.replace( /\n/g, "<br />" ); + // Списки + code = code.replace( /\[ul\]/gi, "<ul>" ); + code = code.replace( /\[\/ul\]/gi, "</ul>" ); + code = code.replace( /\[ol\]/gi, "<ol>" ); + code = code.replace( /\[\/ol\]/gi, "</ol>" ); + code = code.replace( /\[li\]/gi, "<li>" ); + code = code.replace( /\[\/li\]/gi, "</li>" ); + // Картинки + code = code.replace( /\[img align=(left|center|right) width=([0-9]+)\]([^\"\(\)\?\&'<>]*?)\[\/img\]/gi, "<img style=\"width: $2px; height: auto;\" src=\"$3\">" ); + code = code.replace( /\[img align=(left|center|right)\]([^\"\(\)\?\&'<>]*?)\[\/img\]/gi, "<img style=\"width: auto; height: auto;\" src=\"$2\">" ); + code = code.replace( /\[img width=([0-9]+)\]([^\"\(\)\?\&'<>]*?)\[\/img\]/gi, "<img style=\"width: $1px; height: auto;\" src=\"$2\">" ); + code = code.replace( /\[img\]([^\"\(\)\?\&'<>]*?)\[\/img\]/gi, "<img style=\"width: auto; height: auto;\" src=\"$1\">" ); + // Ссылки + code = code.replace( /\[url=([^'\"<>]*?)\](.*?)\[\/url\]/gi, "<a href=\"$1\">$2</a>" ); + // Цвета + code = code.replace( /\[color=\#?([0-9a-f]+)\](.*?)\[\/color\]/gi, "<font color=\"#$1\">$2</font>" ); + // Шрифт + code = code.replace( /\[font=([^;<>\*\(\)\"']*?)\](.*?)\[\/font\]/gi, "<font face=\"$1\">$2</font>" ); + // Размер шрифта + // Преобразуем CSS размер в HTML + code = code.replace( /\[size=xx\-small\]/gi, "[size=1]" ); + code = code.replace( /\[size=small\]/gi, "[size=2]" ); + code = code.replace( /\[size=medium\]/gi, "[size=3]" ); + code = code.replace( /\[size=large\]/gi, "[size=4]" ); + code = code.replace( /\[size=x\-large\]/gi, "[size=5]" ); + code = code.replace( /\[size=xx\-large\]/gi, "[size=6]" ); + // Переводим BB тег в HTML + code = code.replace( /\[size=([1-7]+)\](.*?)\[\/size\]/gi, "<font size=\"$1\">$2</font>" ); + // + code = code.replace( /\[u\]/gi, "<u>" ); + code = code.replace( /\[\/u\]/gi, "</u>" ); + code = code.replace( /\[(d|s)\]/gi, "<strike>" ); + code = code.replace( /\[\/(d|s)\]/gi, "</strike>" ); + // Опера и IE отличаются умом и производительностью... + if( browserOpera || browserMsie ) { + code = code.replace( /\[b\]/gi, "<strong>" ); + code = code.replace( /\[\/b\]/gi, "</strong>" ); + code = code.replace( /\[i\]/gi, "<em>" ); + code = code.replace( /\[\/i\]/gi, "</em>" ); + // Остальные браузеры + } else { + code = code.replace( /\[b\]/gi, "<b>" ); + code = code.replace( /\[\/b\]/gi, "</b>" ); + code = code.replace( /\[i\]/gi, "<i>" ); + code = code.replace( /\[\/i\]/gi, "</i>" ); + } + + return code; + + } + +})(jQuery); \ No newline at end of file Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor_registry.php =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor_registry.php (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/editor_registry.php 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,15 @@ +<?php +// Автор: andrey3761 +// Копирайт: xoops.ws + +defined( 'XOOPS_ROOT_PATH' ) or die( 'Restricted access' ); + +return $config = array( + 'class' => 'FormRhEditor', + 'file' => XOOPS_ROOT_PATH . '/class/xoopseditor/rheditor/rheditor.php', + 'title' => _XOOPS_EDITOR_RHEDITOR, + 'order' => 2, + 'nohtml' => 1 +); + +?> \ No newline at end of file Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/index.html =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/index.html (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/index.html 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1 @@ + <script>history.go(-1);</script> \ No newline at end of file Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/english.php =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/english.php (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/english.php 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,7 @@ +<?php +// Автор: andrey3761 +// Копирайт: xoops.ws + +define( '_XOOPS_EDITOR_RHEDITOR', 'Rh Editor' ); + +?> Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/index.html =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/index.html (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/index.html 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1 @@ + <script>history.go(-1);</script> \ No newline at end of file Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/russian.php =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/russian.php (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/language/russian.php 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,7 @@ +<?php +// Автор: andrey3761 +// Копирайт: xoops.ws + +define( '_XOOPS_EDITOR_RHEDITOR', 'Rh Editor' ); + +?> Added: ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/rheditor.php =================================================================== --- ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/rheditor.php (rev 0) +++ ThirdParty/xoopseditor/trunk/htdocs/class/xoopseditor/rheditor/rheditor.php 2012-08-20 10:16:09 UTC (rev 10090) @@ -0,0 +1,47 @@ +<?php +// Автор: andrey3761 +// Копирайт: xoops.ws + +xoops_load('XoopsEditor'); + +class FormRhEditor extends XoopsEditor +{ + + // Инициализация заголовка + private function initHeader() + { + static $init; + + if( !$init ) { + // Подключаем jQuery + $GLOBALS['xoTheme']->addScript('browse.php?Frameworks/jquery/jquery.js'); + // Подключаем редактор + $GLOBALS['xoTheme']->addScript(XOOPS_URL . '/class/xoopseditor/rheditor/editor/jquery.rheditor.js'); + $GLOBALS['xoTheme']->addScript(XOOPS_URL . '/class/xoopseditor/rheditor/editor/jquery.rheditor.xoopscode.js'); + $GLOBALS['xoTheme']->addStylesheet(XOOPS_URL . '/class/xoopseditor/rheditor/editor/jquery.rheditor.css'); + + $init = true; + } + + return $init; + } + + // Прорисовка + public function render() + { + // + $this->initHeader(); + + $ret = ' +<script type="text/javascript"> + $(document).ready(function() { + $("#' . $this->getName() . '").rheditor()[0].focus(); + }); +</script> +'; + $ret .= parent::render(); + + return $ret; + } +} +?> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |