cramming in default wymeditor
Oleg
committed May 30, 2011
commit bcc309556f1650256246160a86f34fba561622ff
Showing 74
changed files with
8261 additions
and 14 deletions
app/assets/javascripts/comfortable_mexican_sofa/application.js
+4
-14
| @@ | @@ -10,7 +10,7 @@ $.CMS = function(){ |
| $.CMS.slugify(); | |
| $.CMS.tree_methods(); | |
| $.CMS.load_page_blocks(); | |
| - | // $.CMS.enable_rich_text(); |
| + | $.CMS.enable_rich_text(); |
| // $.CMS.enable_codemirror(); | |
| $.CMS.enable_date_picker(); | |
| $.CMS.enable_sortable_list(); | |
| @@ | @@ -72,19 +72,9 @@ $.CMS = function(){ |
| }, | |
| enable_rich_text: function(){ | |
| - | $('textarea.rich_text').tinymce({ |
| - | theme : "advanced", |
| - | plugins: "", |
| - | theme_advanced_buttons1 : "formatselect,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,link,unlink,anchor,image,|,code", |
| - | theme_advanced_buttons2 : "", |
| - | theme_advanced_buttons3 : "", |
| - | theme_advanced_buttons4 : "", |
| - | theme_advanced_toolbar_location : "top", |
| - | theme_advanced_toolbar_align : "left", |
| - | theme_advanced_statusbar_location : "bottom", |
| - | theme_advanced_resizing : true, |
| - | theme_advanced_resize_horizontal : false |
| - | }); |
| + | $('textarea.rich_text').wymeditor({ |
| + | |
| + | }); |
| }, | |
| enable_codemirror: function(){ | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-blockquote.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h1.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h2.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h3.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h4.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h5.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-h6.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-p.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/lbl-pre.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/wymiframe.css
+90
-0
| @@ | @@ -0,0 +1,90 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * wymeditor.css |
| + | * Main editor css file. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | /* VISUAL FEEDBACK */ |
| + | |
| + | /* basic */ |
| + | body { background: #e1e8f1;} |
| + | |
| + | /* make HTML blocs visible */ |
| + | p, |
| + | h1, |
| + | h2, |
| + | h3, |
| + | h4, |
| + | h5, |
| + | h6, |
| + | ul, |
| + | ol, |
| + | table, |
| + | blockquote, |
| + | pre { background: #FFFFFF no-repeat 2px 2px; |
| + | padding:8px 5px 5px; |
| + | margin:10px; } |
| + | td { background: #F0F4F8; } |
| + | th { background: #ffffcc; } |
| + | ul, |
| + | ol { border-left:20px solid #B9C4D0; padding:0px 5px; } |
| + | caption { background: #E4E4B0; padding: 5px; font-weight: bold; } |
| + | table { font-size: 12px; width: 500px; } |
| + | td { width: 25%; } |
| + | blockquote { margin-left: 30px; } |
| + | pre { background-color:transparent; border: 1px solid white; } |
| + | |
| + | /* Gecko min height fix */ |
| + | p { min-height: 1em; } /*min-height is needed under Firefox, because empty parargraphs */ |
| + | *+html p { min-height: auto; } /* but we have to remove it under IE7 because it triggers the 'haslayout' mode */ |
| + | td { height: 1.6em; } |
| + | |
| + | /* labels */ |
| + | p { background-image: url(lbl-p.png); } |
| + | h1 { background-image: url(lbl-h1.png); } |
| + | h2 { background-image: url(lbl-h2.png); } |
| + | h3 { background-image: url(lbl-h3.png); } |
| + | h4 { background-image: url(lbl-h4.png); } |
| + | h5 { background-image: url(lbl-h5.png); } |
| + | h6 { background-image: url(lbl-h6.png); } |
| + | blockquote{ background-image: url(lbl-blockquote.png); } |
| + | pre { background-image: url(lbl-pre.png); } |
| + | |
| + | /* specific HTML elements */ |
| + | caption { text-align: left; } |
| + | img { margin-right: 5px; |
| + | border-style: solid; |
| + | border-color: gray; |
| + | border-width: 0; } |
| + | a img { border-width: 1px; border-color: blue; } |
| + | acronym { border: 1px solid gray; } |
| + | span { background-color: #eef; } |
| + | |
| + | /* visual feedback for non-valid nesting of elements*/ |
| + | h1 h1, h1 h2, h1 h3, h1 h4, h1 h5, h1 h6, h1 p, h1 pre, h1 address, |
| + | h2 h1, h2 h2, h2 h3, h2 h4, h2 h5, h2 h6, h2 p, h2 pre, h2 address, |
| + | h3 h1, h3 h2, h3 h3, h3 h4, h3 h5, h3 h6, h3 p, h3 pre, h3 address, |
| + | h4 h1, h4 h2, h4 h3, h4 h4, h4 h5, h4 h6, h4 p, h4 pre, h4 address, |
| + | h5 h1, h5 h2, h5 h3, h5 h4, h5 h5, h5 h6, h5 p, h5 pre, h5 address, |
| + | h6 h1, h6 h2, h6 h3, h6 h4, h6 h4, h6 h6, h6 p, h6 pre, h6 address, |
| + | p h1, p h2, p h3, p h4, p h5, p h6, p pre, p address, |
| + | pre h1, pre h2, pre h3, pre h4, pre h5, pre h6, pre p, pre pre, pre address, |
| + | address h1, address h2, address h3, address h4, address h5, address h6, |
| + | address p, address pre, address address |
| + | { background-color: #ff9999 !important; |
| + | border: 1px solid red !important; |
| + | font-size: 12px !important; |
| + | font-weight: normal; } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/iframe/default/wymiframe.html
+26
-0
| @@ | @@ -0,0 +1,26 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| + | <!-- |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * wymiframe.html |
| + | * Iframe used by designMode. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | --> |
| + | <html> |
| + | <head> |
| + | <title>WYMeditor iframe</title> |
| + | <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> |
| + | <link rel="stylesheet" type="text/css" media="screen" href="wymiframe.css" /> |
| + | </head> |
| + | <body class="wym_iframe"></body> |
| + | </html> |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/jquery.wymeditor.js
+4688
-0
| @@ | @@ -0,0 +1,4688 @@ |
| + | /** |
| + | * @version 0.5-rc1 |
| + | * |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File: jquery.wymeditor.js |
| + | * |
| + | * Main JS file with core classes and functions. |
| + | * See the documentation for more info. |
| + | * |
| + | * About: authors |
| + | * |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | * Volker Mische (vmx a-t gmx dotde) |
| + | * Scott Lewis (lewiscot a-t gmail dotcom) |
| + | * Bermi Ferrer (wymeditor a-t bermi dotorg) |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | * Jonatan Lundin (jonatan.lundin a-t gmail dotcom) |
| + | */ |
| + | |
| + | /* |
| + | Namespace: WYMeditor |
| + | Global WYMeditor namespace. |
| + | */ |
| + | if(!WYMeditor) var WYMeditor = {}; |
| + | |
| + | //Wrap the Firebug console in WYMeditor.console |
| + | (function() { |
| + | if ( !window.console || !console.firebug ) { |
| + | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", |
| + | "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; |
| + | |
| + | WYMeditor.console = {}; |
| + | for (var i = 0; i < names.length; ++i) |
| + | WYMeditor.console[names[i]] = function() {} |
| + | |
| + | } else WYMeditor.console = window.console; |
| + | })(); |
| + | |
| + | jQuery.extend(WYMeditor, { |
| + | |
| + | /* |
| + | Constants: Global WYMeditor constants. |
| + | |
| + | VERSION - Defines WYMeditor version. |
| + | INSTANCES - An array of loaded WYMeditor.editor instances. |
| + | STRINGS - An array of loaded WYMeditor language pairs/values. |
| + | SKINS - An array of loaded WYMeditor skins. |
| + | NAME - The "name" attribute. |
| + | INDEX - A string replaced by the instance index. |
| + | WYM_INDEX - A string used to get/set the instance index. |
| + | BASE_PATH - A string replaced by WYMeditor's base path. |
| + | SKIN_PATH - A string replaced by WYMeditor's skin path. |
| + | WYM_PATH - A string replaced by WYMeditor's main JS file path. |
| + | SKINS_DEFAULT_PATH - The skins default base path. |
| + | SKINS_DEFAULT_CSS - The skins default CSS file. |
| + | LANG_DEFAULT_PATH - The language files default path. |
| + | IFRAME_BASE_PATH - A string replaced by the designmode iframe's base path. |
| + | IFRAME_DEFAULT - The iframe's default base path. |
| + | JQUERY_PATH - A string replaced by the computed jQuery path. |
| + | DIRECTION - A string replaced by the text direction (rtl or ltr). |
| + | LOGO - A string replaced by WYMeditor logo. |
| + | TOOLS - A string replaced by the toolbar's HTML. |
| + | TOOLS_ITEMS - A string replaced by the toolbar items. |
| + | TOOL_NAME - A string replaced by a toolbar item's name. |
| + | TOOL_TITLE - A string replaced by a toolbar item's title. |
| + | TOOL_CLASS - A string replaced by a toolbar item's class. |
| + | CLASSES - A string replaced by the classes panel's HTML. |
| + | CLASSES_ITEMS - A string replaced by the classes items. |
| + | CLASS_NAME - A string replaced by a class item's name. |
| + | CLASS_TITLE - A string replaced by a class item's title. |
| + | CONTAINERS - A string replaced by the containers panel's HTML. |
| + | CONTAINERS_ITEMS - A string replaced by the containers items. |
| + | CONTAINER_NAME - A string replaced by a container item's name. |
| + | CONTAINER_TITLE - A string replaced by a container item's title. |
| + | CONTAINER_CLASS - A string replaced by a container item's class. |
| + | HTML - A string replaced by the HTML view panel's HTML. |
| + | IFRAME - A string replaced by the designmode iframe. |
| + | STATUS - A string replaced by the status panel's HTML. |
| + | DIALOG_TITLE - A string replaced by a dialog's title. |
| + | DIALOG_BODY - A string replaced by a dialog's HTML body. |
| + | BODY - The BODY element. |
| + | STRING - The "string" type. |
| + | BODY,DIV,P, |
| + | H1,H2,H3,H4,H5,H6, |
| + | PRE,BLOCKQUOTE, |
| + | A,BR,IMG, |
| + | TABLE,TD,TH, |
| + | UL,OL,LI - HTML elements string representation. |
| + | CLASS,HREF,SRC, |
| + | TITLE,ALT - HTML attributes string representation. |
| + | DIALOG_LINK - A link dialog type. |
| + | DIALOG_IMAGE - An image dialog type. |
| + | DIALOG_TABLE - A table dialog type. |
| + | DIALOG_PASTE - A 'Paste from Word' dialog type. |
| + | BOLD - Command: (un)set selection to <strong>. |
| + | ITALIC - Command: (un)set selection to <em>. |
| + | CREATE_LINK - Command: open the link dialog or (un)set link. |
| + | INSERT_IMAGE - Command: open the image dialog or insert an image. |
| + | INSERT_TABLE - Command: open the table dialog. |
| + | PASTE - Command: open the paste dialog. |
| + | INDENT - Command: nest a list item. |
| + | OUTDENT - Command: unnest a list item. |
| + | TOGGLE_HTML - Command: display/hide the HTML view. |
| + | FORMAT_BLOCK - Command: set a block element to another type. |
| + | PREVIEW - Command: open the preview dialog. |
| + | UNLINK - Command: unset a link. |
| + | INSERT_UNORDEREDLIST- Command: insert an unordered list. |
| + | INSERT_ORDEREDLIST - Command: insert an ordered list. |
| + | MAIN_CONTAINERS - An array of the main HTML containers used in WYMeditor. |
| + | BLOCKS - An array of the HTML block elements. |
| + | KEY - Standard key codes. |
| + | NODE - Node types. |
| + | |
| + | */ |
| + | |
| + | VERSION : "0.5-rc1", |
| + | INSTANCES : [], |
| + | STRINGS : [], |
| + | SKINS : [], |
| + | NAME : "name", |
| + | INDEX : "{Wym_Index}", |
| + | WYM_INDEX : "wym_index", |
| + | BASE_PATH : "{Wym_Base_Path}", |
| + | CSS_PATH : "{Wym_Css_Path}", |
| + | WYM_PATH : "{Wym_Wym_Path}", |
| + | SKINS_DEFAULT_PATH : "skins/", |
| + | SKINS_DEFAULT_CSS : "skin.css", |
| + | SKINS_DEFAULT_JS : "skin.js", |
| + | LANG_DEFAULT_PATH : "lang/", |
| + | IFRAME_BASE_PATH : "{Wym_Iframe_Base_Path}", |
| + | IFRAME_DEFAULT : "iframe/default/", |
| + | JQUERY_PATH : "{Wym_Jquery_Path}", |
| + | DIRECTION : "{Wym_Direction}", |
| + | LOGO : "{Wym_Logo}", |
| + | TOOLS : "{Wym_Tools}", |
| + | TOOLS_ITEMS : "{Wym_Tools_Items}", |
| + | TOOL_NAME : "{Wym_Tool_Name}", |
| + | TOOL_TITLE : "{Wym_Tool_Title}", |
| + | TOOL_CLASS : "{Wym_Tool_Class}", |
| + | CLASSES : "{Wym_Classes}", |
| + | CLASSES_ITEMS : "{Wym_Classes_Items}", |
| + | CLASS_NAME : "{Wym_Class_Name}", |
| + | CLASS_TITLE : "{Wym_Class_Title}", |
| + | CONTAINERS : "{Wym_Containers}", |
| + | CONTAINERS_ITEMS : "{Wym_Containers_Items}", |
| + | CONTAINER_NAME : "{Wym_Container_Name}", |
| + | CONTAINER_TITLE : "{Wym_Containers_Title}", |
| + | CONTAINER_CLASS : "{Wym_Container_Class}", |
| + | HTML : "{Wym_Html}", |
| + | IFRAME : "{Wym_Iframe}", |
| + | STATUS : "{Wym_Status}", |
| + | DIALOG_TITLE : "{Wym_Dialog_Title}", |
| + | DIALOG_BODY : "{Wym_Dialog_Body}", |
| + | STRING : "string", |
| + | BODY : "body", |
| + | DIV : "div", |
| + | P : "p", |
| + | H1 : "h1", |
| + | H2 : "h2", |
| + | H3 : "h3", |
| + | H4 : "h4", |
| + | H5 : "h5", |
| + | H6 : "h6", |
| + | PRE : "pre", |
| + | BLOCKQUOTE : "blockquote", |
| + | A : "a", |
| + | BR : "br", |
| + | IMG : "img", |
| + | TABLE : "table", |
| + | TD : "td", |
| + | TH : "th", |
| + | UL : "ul", |
| + | OL : "ol", |
| + | LI : "li", |
| + | CLASS : "class", |
| + | HREF : "href", |
| + | SRC : "src", |
| + | TITLE : "title", |
| + | ALT : "alt", |
| + | DIALOG_LINK : "Link", |
| + | DIALOG_IMAGE : "Image", |
| + | DIALOG_TABLE : "Table", |
| + | DIALOG_PASTE : "Paste_From_Word", |
| + | BOLD : "Bold", |
| + | ITALIC : "Italic", |
| + | CREATE_LINK : "CreateLink", |
| + | INSERT_IMAGE : "InsertImage", |
| + | INSERT_TABLE : "InsertTable", |
| + | INSERT_HTML : "InsertHTML", |
| + | PASTE : "Paste", |
| + | INDENT : "Indent", |
| + | OUTDENT : "Outdent", |
| + | TOGGLE_HTML : "ToggleHtml", |
| + | FORMAT_BLOCK : "FormatBlock", |
| + | PREVIEW : "Preview", |
| + | UNLINK : "Unlink", |
| + | INSERT_UNORDEREDLIST: "InsertUnorderedList", |
| + | INSERT_ORDEREDLIST : "InsertOrderedList", |
| + | |
| + | MAIN_CONTAINERS : new Array("p","h1","h2","h3","h4","h5","h6","pre","blockquote"), |
| + | |
| + | BLOCKS : new Array("address", "blockquote", "div", "dl", |
| + | "fieldset", "form", "h1", "h2", "h3", "h4", "h5", "h6", "hr", |
| + | "noscript", "ol", "p", "pre", "table", "ul", "dd", "dt", |
| + | "li", "tbody", "td", "tfoot", "th", "thead", "tr"), |
| + | |
| + | KEY : { |
| + | BACKSPACE: 8, |
| + | ENTER: 13, |
| + | END: 35, |
| + | HOME: 36, |
| + | LEFT: 37, |
| + | UP: 38, |
| + | RIGHT: 39, |
| + | DOWN: 40, |
| + | CURSOR: new Array(37, 38, 39, 40), |
| + | DELETE: 46 |
| + | }, |
| + | |
| + | NODE : { |
| + | ELEMENT: 1, |
| + | ATTRIBUTE: 2, |
| + | TEXT: 3 |
| + | }, |
| + | |
| + | /* |
| + | Class: WYMeditor.editor |
| + | WYMeditor editor main class, instanciated for each editor occurrence. |
| + | */ |
| + | |
| + | editor : function(elem, options) { |
| + | |
| + | /* |
| + | Constructor: WYMeditor.editor |
| + | |
| + | Initializes main values (index, elements, paths, ...) |
| + | and call WYMeditor.editor.init which initializes the editor. |
| + | |
| + | Parameters: |
| + | |
| + | elem - The HTML element to be replaced by the editor. |
| + | options - The hash of options. |
| + | |
| + | Returns: |
| + | |
| + | Nothing. |
| + | |
| + | See Also: |
| + | |
| + | <WYMeditor.editor.init> |
| + | */ |
| + | |
| + | //store the instance in the INSTANCES array and store the index |
| + | this._index = WYMeditor.INSTANCES.push(this) - 1; |
| + | //store the element replaced by the editor |
| + | this._element = elem; |
| + | //store the options |
| + | this._options = options; |
| + | //store the element's inner value |
| + | this._html = jQuery(elem).val(); |
| + | |
| + | //store the HTML option, if any |
| + | if(this._options.html) this._html = this._options.html; |
| + | //get or compute the base path (where the main JS file is located) |
| + | this._options.basePath = this._options.basePath |
| + | || this.computeBasePath(); |
| + | //get or set the skin path (where the skin files are located) |
| + | this._options.skinPath = this._options.skinPath |
| + | || this._options.basePath + WYMeditor.SKINS_DEFAULT_PATH |
| + | + this._options.skin + '/'; |
| + | //get or compute the main JS file location |
| + | this._options.wymPath = this._options.wymPath |
| + | || this.computeWymPath(); |
| + | //get or set the language files path |
| + | this._options.langPath = this._options.langPath |
| + | || this._options.basePath + WYMeditor.LANG_DEFAULT_PATH; |
| + | //get or set the designmode iframe's base path |
| + | this._options.iframeBasePath = this._options.iframeBasePath |
| + | || this._options.basePath + WYMeditor.IFRAME_DEFAULT; |
| + | //get or compute the jQuery JS file location |
| + | this._options.jQueryPath = this._options.jQueryPath |
| + | || this.computeJqueryPath(); |
| + | |
| + | //initialize the editor instance |
| + | this.init(); |
| + | |
| + | } |
| + | |
| + | }); |
| + | |
| + | |
| + | /********** JQUERY **********/ |
| + | |
| + | /** |
| + | * Replace an HTML element by WYMeditor |
| + | * |
| + | * @example jQuery(".wymeditor").wymeditor( |
| + | * { |
| + | * |
| + | * } |
| + | * ); |
| + | * @desc Example description here |
| + | * |
| + | * @name WYMeditor |
| + | * @description WYMeditor is a web-based WYSIWYM XHTML editor |
| + | * @param Hash hash A hash of parameters |
| + | * @option Integer iExample Description here |
| + | * @option String sExample Description here |
| + | * |
| + | * @type jQuery |
| + | * @cat Plugins/WYMeditor |
| + | * @author Jean-Francois Hovinne |
| + | */ |
| + | jQuery.fn.wymeditor = function(options) { |
| + | |
| + | options = jQuery.extend({ |
| + | |
| + | html: "", |
| + | |
| + | basePath: false, |
| + | |
| + | skinPath: false, |
| + | |
| + | wymPath: false, |
| + | |
| + | iframeBasePath: false, |
| + | |
| + | jQueryPath: false, |
| + | |
| + | styles: false, |
| + | |
| + | stylesheet: false, |
| + | |
| + | skin: "default", |
| + | initSkin: true, |
| + | loadSkin: true, |
| + | |
| + | lang: "en", |
| + | |
| + | direction: "ltr", |
| + | |
| + | boxHtml: "<div class='wym_box'>" |
| + | + "<div class='wym_area_top'>" |
| + | + WYMeditor.TOOLS |
| + | + "</div>" |
| + | + "<div class='wym_area_left'></div>" |
| + | + "<div class='wym_area_right'>" |
| + | + WYMeditor.CONTAINERS |
| + | + WYMeditor.CLASSES |
| + | + "</div>" |
| + | + "<div class='wym_area_main'>" |
| + | + WYMeditor.HTML |
| + | + WYMeditor.IFRAME |
| + | + WYMeditor.STATUS |
| + | + "</div>" |
| + | + "<div class='wym_area_bottom'>" |
| + | + WYMeditor.LOGO |
| + | + "</div>" |
| + | + "</div>", |
| + | |
| + | logoHtml: "<a class='wym_wymeditor_link' " |
| + | + "href='http://www.wymeditor.org/'>WYMeditor</a>", |
| + | |
| + | iframeHtml:"<div class='wym_iframe wym_section'>" |
| + | + "<iframe " |
| + | + "src='" |
| + | + WYMeditor.IFRAME_BASE_PATH |
| + | + "wymiframe.html' " |
| + | + "onload='this.contentWindow.parent.WYMeditor.INSTANCES[" |
| + | + WYMeditor.INDEX + "].initIframe(this)'" |
| + | + "></iframe>" |
| + | + "</div>", |
| + | |
| + | editorStyles: [], |
| + | |
| + | toolsHtml: "<div class='wym_tools wym_section'>" |
| + | + "<h2>{Tools}</h2>" |
| + | + "<ul>" |
| + | + WYMeditor.TOOLS_ITEMS |
| + | + "</ul>" |
| + | + "</div>", |
| + | |
| + | toolsItemHtml: "<li class='" |
| + | + WYMeditor.TOOL_CLASS |
| + | + "'><a href='#' name='" |
| + | + WYMeditor.TOOL_NAME |
| + | + "' title='" |
| + | + WYMeditor.TOOL_TITLE |
| + | + "'>" |
| + | + WYMeditor.TOOL_TITLE |
| + | + "</a></li>", |
| + | |
| + | toolsItems: [ |
| + | {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'}, |
| + | {'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'}, |
| + | {'name': 'Superscript', 'title': 'Superscript', |
| + | 'css': 'wym_tools_superscript'}, |
| + | {'name': 'Subscript', 'title': 'Subscript', |
| + | 'css': 'wym_tools_subscript'}, |
| + | {'name': 'InsertOrderedList', 'title': 'Ordered_List', |
| + | 'css': 'wym_tools_ordered_list'}, |
| + | {'name': 'InsertUnorderedList', 'title': 'Unordered_List', |
| + | 'css': 'wym_tools_unordered_list'}, |
| + | {'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'}, |
| + | {'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'}, |
| + | {'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'}, |
| + | {'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'}, |
| + | {'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'}, |
| + | {'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'}, |
| + | {'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'}, |
| + | {'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'}, |
| + | {'name': 'Paste', 'title': 'Paste_From_Word', |
| + | 'css': 'wym_tools_paste'}, |
| + | {'name': 'ToggleHtml', 'title': 'HTML', 'css': 'wym_tools_html'}, |
| + | {'name': 'Preview', 'title': 'Preview', 'css': 'wym_tools_preview'} |
| + | ], |
| + | |
| + | containersHtml: "<div class='wym_containers wym_section'>" |
| + | + "<h2>{Containers}</h2>" |
| + | + "<ul>" |
| + | + WYMeditor.CONTAINERS_ITEMS |
| + | + "</ul>" |
| + | + "</div>", |
| + | |
| + | containersItemHtml:"<li class='" |
| + | + WYMeditor.CONTAINER_CLASS |
| + | + "'>" |
| + | + "<a href='#' name='" |
| + | + WYMeditor.CONTAINER_NAME |
| + | + "'>" |
| + | + WYMeditor.CONTAINER_TITLE |
| + | + "</a></li>", |
| + | |
| + | containersItems: [ |
| + | {'name': 'P', 'title': 'Paragraph', 'css': 'wym_containers_p'}, |
| + | {'name': 'H1', 'title': 'Heading_1', 'css': 'wym_containers_h1'}, |
| + | {'name': 'H2', 'title': 'Heading_2', 'css': 'wym_containers_h2'}, |
| + | {'name': 'H3', 'title': 'Heading_3', 'css': 'wym_containers_h3'}, |
| + | {'name': 'H4', 'title': 'Heading_4', 'css': 'wym_containers_h4'}, |
| + | {'name': 'H5', 'title': 'Heading_5', 'css': 'wym_containers_h5'}, |
| + | {'name': 'H6', 'title': 'Heading_6', 'css': 'wym_containers_h6'}, |
| + | {'name': 'PRE', 'title': 'Preformatted', 'css': 'wym_containers_pre'}, |
| + | {'name': 'BLOCKQUOTE', 'title': 'Blockquote', |
| + | 'css': 'wym_containers_blockquote'}, |
| + | {'name': 'TH', 'title': 'Table_Header', 'css': 'wym_containers_th'} |
| + | ], |
| + | |
| + | classesHtml: "<div class='wym_classes wym_section'>" |
| + | + "<h2>{Classes}</h2><ul>" |
| + | + WYMeditor.CLASSES_ITEMS |
| + | + "</ul></div>", |
| + | |
| + | classesItemHtml: "<li class='wym_classes_" |
| + | + WYMeditor.CLASS_NAME |
| + | + "'><a href='#' name='" |
| + | + WYMeditor.CLASS_NAME |
| + | + "'>" |
| + | + WYMeditor.CLASS_TITLE |
| + | + "</a></li>", |
| + | |
| + | classesItems: [], |
| + | |
| + | statusHtml: "<div class='wym_status wym_section'>" |
| + | + "<h2>{Status}</h2>" |
| + | + "</div>", |
| + | |
| + | htmlHtml: "<div class='wym_html wym_section'>" |
| + | + "<h2>{Source_Code}</h2>" |
| + | + "<textarea class='wym_html_val'></textarea>" |
| + | + "</div>", |
| + | |
| + | boxSelector: ".wym_box", |
| + | toolsSelector: ".wym_tools", |
| + | toolsListSelector: " ul", |
| + | containersSelector:".wym_containers", |
| + | classesSelector: ".wym_classes", |
| + | htmlSelector: ".wym_html", |
| + | iframeSelector: ".wym_iframe iframe", |
| + | iframeBodySelector:".wym_iframe", |
| + | statusSelector: ".wym_status", |
| + | toolSelector: ".wym_tools a", |
| + | containerSelector: ".wym_containers a", |
| + | classSelector: ".wym_classes a", |
| + | htmlValSelector: ".wym_html_val", |
| + | |
| + | hrefSelector: ".wym_href", |
| + | srcSelector: ".wym_src", |
| + | titleSelector: ".wym_title", |
| + | altSelector: ".wym_alt", |
| + | textSelector: ".wym_text", |
| + | |
| + | rowsSelector: ".wym_rows", |
| + | colsSelector: ".wym_cols", |
| + | captionSelector: ".wym_caption", |
| + | summarySelector: ".wym_summary", |
| + | |
| + | submitSelector: ".wym_submit", |
| + | cancelSelector: ".wym_cancel", |
| + | previewSelector: "", |
| + | |
| + | dialogTypeSelector: ".wym_dialog_type", |
| + | dialogLinkSelector: ".wym_dialog_link", |
| + | dialogImageSelector: ".wym_dialog_image", |
| + | dialogTableSelector: ".wym_dialog_table", |
| + | dialogPasteSelector: ".wym_dialog_paste", |
| + | dialogPreviewSelector: ".wym_dialog_preview", |
| + | |
| + | updateSelector: ".wymupdate", |
| + | updateEvent: "click", |
| + | |
| + | dialogFeatures: "menubar=no,titlebar=no,toolbar=no,resizable=no" |
| + | + ",width=560,height=300,top=0,left=0", |
| + | dialogFeaturesPreview: "menubar=no,titlebar=no,toolbar=no,resizable=no" |
| + | + ",scrollbars=yes,width=560,height=300,top=0,left=0", |
| + | |
| + | dialogHtml: "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'" |
| + | + " 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>" |
| + | + "<html dir='" |
| + | + WYMeditor.DIRECTION |
| + | + "'><head>" |
| + | + "<link rel='stylesheet' type='text/css' media='screen'" |
| + | + " href='" |
| + | + WYMeditor.CSS_PATH |
| + | + "' />" |
| + | + "<title>" |
| + | + WYMeditor.DIALOG_TITLE |
| + | + "</title>" |
| + | + "<script type='text/javascript'" |
| + | + " src='" |
| + | + WYMeditor.JQUERY_PATH |
| + | + "'></script>" |
| + | + "<script type='text/javascript'" |
| + | + " src='" |
| + | + WYMeditor.WYM_PATH |
| + | + "'></script>" |
| + | + "</head>" |
| + | + WYMeditor.DIALOG_BODY |
| + | + "</html>", |
| + | |
| + | dialogLinkHtml: "<body class='wym_dialog wym_dialog_link'" |
| + | + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'" |
| + | + ">" |
| + | + "<form>" |
| + | + "<fieldset>" |
| + | + "<input type='hidden' class='wym_dialog_type' value='" |
| + | + WYMeditor.DIALOG_LINK |
| + | + "' />" |
| + | + "<legend>{Link}</legend>" |
| + | + "<div class='row'>" |
| + | + "<label>{URL}</label>" |
| + | + "<input type='text' class='wym_href' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Title}</label>" |
| + | + "<input type='text' class='wym_title' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row row-indent'>" |
| + | + "<input class='wym_submit' type='button'" |
| + | + " value='{Submit}' />" |
| + | + "<input class='wym_cancel' type='button'" |
| + | + "value='{Cancel}' />" |
| + | + "</div>" |
| + | + "</fieldset>" |
| + | + "</form>" |
| + | + "</body>", |
| + | |
| + | dialogImageHtml: "<body class='wym_dialog wym_dialog_image'" |
| + | + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'" |
| + | + ">" |
| + | + "<form>" |
| + | + "<fieldset>" |
| + | + "<input type='hidden' class='wym_dialog_type' value='" |
| + | + WYMeditor.DIALOG_IMAGE |
| + | + "' />" |
| + | + "<legend>{Image}</legend>" |
| + | + "<div class='row'>" |
| + | + "<label>{URL}</label>" |
| + | + "<input type='text' class='wym_src' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Alternative_Text}</label>" |
| + | + "<input type='text' class='wym_alt' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Title}</label>" |
| + | + "<input type='text' class='wym_title' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row row-indent'>" |
| + | + "<input class='wym_submit' type='button'" |
| + | + " value='{Submit}' />" |
| + | + "<input class='wym_cancel' type='button'" |
| + | + "value='{Cancel}' />" |
| + | + "</div>" |
| + | + "</fieldset>" |
| + | + "</form>" |
| + | + "</body>", |
| + | |
| + | dialogTableHtml: "<body class='wym_dialog wym_dialog_table'" |
| + | + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'" |
| + | + ">" |
| + | + "<form>" |
| + | + "<fieldset>" |
| + | + "<input type='hidden' class='wym_dialog_type' value='" |
| + | + WYMeditor.DIALOG_TABLE |
| + | + "' />" |
| + | + "<legend>{Table}</legend>" |
| + | + "<div class='row'>" |
| + | + "<label>{Caption}</label>" |
| + | + "<input type='text' class='wym_caption' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Summary}</label>" |
| + | + "<input type='text' class='wym_summary' value='' size='40' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Number_Of_Rows}</label>" |
| + | + "<input type='text' class='wym_rows' value='3' size='3' />" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<label>{Number_Of_Cols}</label>" |
| + | + "<input type='text' class='wym_cols' value='2' size='3' />" |
| + | + "</div>" |
| + | + "<div class='row row-indent'>" |
| + | + "<input class='wym_submit' type='button'" |
| + | + " value='{Submit}' />" |
| + | + "<input class='wym_cancel' type='button'" |
| + | + "value='{Cancel}' />" |
| + | + "</div>" |
| + | + "</fieldset>" |
| + | + "</form>" |
| + | + "</body>", |
| + | |
| + | dialogPasteHtml: "<body class='wym_dialog wym_dialog_paste'" |
| + | + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'" |
| + | + ">" |
| + | + "<form>" |
| + | + "<input type='hidden' class='wym_dialog_type' value='" |
| + | + WYMeditor.DIALOG_PASTE |
| + | + "' />" |
| + | + "<fieldset>" |
| + | + "<legend>{Paste_From_Word}</legend>" |
| + | + "<div class='row'>" |
| + | + "<textarea class='wym_text' rows='10' cols='50'></textarea>" |
| + | + "</div>" |
| + | + "<div class='row'>" |
| + | + "<input class='wym_submit' type='button'" |
| + | + " value='{Submit}' />" |
| + | + "<input class='wym_cancel' type='button'" |
| + | + "value='{Cancel}' />" |
| + | + "</div>" |
| + | + "</fieldset>" |
| + | + "</form>" |
| + | + "</body>", |
| + | |
| + | dialogPreviewHtml: "<body class='wym_dialog wym_dialog_preview'" |
| + | + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'" |
| + | + "></body>", |
| + | |
| + | dialogStyles: [], |
| + | |
| + | stringDelimiterLeft: "{", |
| + | stringDelimiterRight:"}", |
| + | |
| + | preInit: null, |
| + | preBind: null, |
| + | postInit: null, |
| + | |
| + | preInitDialog: null, |
| + | postInitDialog: null |
| + | |
| + | }, options); |
| + | |
| + | return this.each(function() { |
| + | |
| + | new WYMeditor.editor(jQuery(this),options); |
| + | }); |
| + | }; |
| + | |
| + | /* @name extend |
| + | * @description Returns the WYMeditor instance based on its index |
| + | */ |
| + | jQuery.extend({ |
| + | wymeditors: function(i) { |
| + | return (WYMeditor.INSTANCES[i]); |
| + | } |
| + | }); |
| + | |
| + | |
| + | /********** WYMeditor **********/ |
| + | |
| + | /* @name Wymeditor |
| + | * @description WYMeditor class |
| + | */ |
| + | |
| + | /* @name init |
| + | * @description Initializes a WYMeditor instance |
| + | */ |
| + | WYMeditor.editor.prototype.init = function() { |
| + | |
| + | //load subclass - browser specific |
| + | //unsupported browsers: do nothing |
| + | if (jQuery.browser.msie) { |
| + | var WymClass = new WYMeditor.WymClassExplorer(this); |
| + | } |
| + | else if (jQuery.browser.mozilla) { |
| + | var WymClass = new WYMeditor.WymClassMozilla(this); |
| + | } |
| + | else if (jQuery.browser.opera) { |
| + | var WymClass = new WYMeditor.WymClassOpera(this); |
| + | } |
| + | else if (jQuery.browser.safari) { |
| + | var WymClass = new WYMeditor.WymClassSafari(this); |
| + | } |
| + | |
| + | if(WymClass) { |
| + | |
| + | if(jQuery.isFunction(this._options.preInit)) this._options.preInit(this); |
| + | |
| + | var SaxListener = new WYMeditor.XhtmlSaxListener(); |
| + | jQuery.extend(SaxListener, WymClass); |
| + | this.parser = new WYMeditor.XhtmlParser(SaxListener); |
| + | |
| + | if(this._options.styles || this._options.stylesheet){ |
| + | this.configureEditorUsingRawCss(); |
| + | } |
| + | |
| + | this.helper = new WYMeditor.XmlHelper(); |
| + | |
| + | //extend the Wymeditor object |
| + | //don't use jQuery.extend since 1.1.4 |
| + | //jQuery.extend(this, WymClass); |
| + | for (var prop in WymClass) { this[prop] = WymClass[prop]; } |
| + | |
| + | //load wymbox |
| + | this._box = jQuery(this._element).hide().after(this._options.boxHtml).next().addClass('wym_box_' + this._index); |
| + | |
| + | //store the instance index in wymbox and element replaced by editor instance |
| + | //but keep it compatible with jQuery < 1.2.3, see #122 |
| + | if( jQuery.isFunction( jQuery.fn.data ) ) { |
| + | jQuery.data(this._box.get(0), WYMeditor.WYM_INDEX, this._index); |
| + | jQuery.data(this._element.get(0), WYMeditor.WYM_INDEX, this._index); |
| + | } |
| + | |
| + | var h = WYMeditor.Helper; |
| + | |
| + | //construct the iframe |
| + | var iframeHtml = this._options.iframeHtml; |
| + | iframeHtml = h.replaceAll(iframeHtml, WYMeditor.INDEX, this._index); |
| + | iframeHtml = h.replaceAll(iframeHtml, WYMeditor.IFRAME_BASE_PATH, this._options.iframeBasePath); |
| + | |
| + | //construct wymbox |
| + | var boxHtml = jQuery(this._box).html(); |
| + | |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.LOGO, this._options.logoHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS, this._options.toolsHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS,this._options.containersHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES, this._options.classesHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.HTML, this._options.htmlHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.IFRAME, iframeHtml); |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.STATUS, this._options.statusHtml); |
| + | |
| + | //construct tools list |
| + | var aTools = eval(this._options.toolsItems); |
| + | var sTools = ""; |
| + | |
| + | for(var i = 0; i < aTools.length; i++) { |
| + | var oTool = aTools[i]; |
| + | if(oTool.name && oTool.title) |
| + | var sTool = this._options.toolsItemHtml; |
| + | var sTool = h.replaceAll(sTool, WYMeditor.TOOL_NAME, oTool.name); |
| + | sTool = h.replaceAll(sTool, WYMeditor.TOOL_TITLE, this._options.stringDelimiterLeft |
| + | + oTool.title |
| + | + this._options.stringDelimiterRight); |
| + | sTool = h.replaceAll(sTool, WYMeditor.TOOL_CLASS, oTool.css); |
| + | sTools += sTool; |
| + | } |
| + | |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS_ITEMS, sTools); |
| + | |
| + | //construct classes list |
| + | var aClasses = eval(this._options.classesItems); |
| + | var sClasses = ""; |
| + | |
| + | for(var i = 0; i < aClasses.length; i++) { |
| + | var oClass = aClasses[i]; |
| + | if(oClass.name && oClass.title) |
| + | var sClass = this._options.classesItemHtml; |
| + | sClass = h.replaceAll(sClass, WYMeditor.CLASS_NAME, oClass.name); |
| + | sClass = h.replaceAll(sClass, WYMeditor.CLASS_TITLE, oClass.title); |
| + | sClasses += sClass; |
| + | } |
| + | |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES_ITEMS, sClasses); |
| + | |
| + | //construct containers list |
| + | var aContainers = eval(this._options.containersItems); |
| + | var sContainers = ""; |
| + | |
| + | for(var i = 0; i < aContainers.length; i++) { |
| + | var oContainer = aContainers[i]; |
| + | if(oContainer.name && oContainer.title) |
| + | var sContainer = this._options.containersItemHtml; |
| + | sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_NAME, oContainer.name); |
| + | sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_TITLE, |
| + | this._options.stringDelimiterLeft |
| + | + oContainer.title |
| + | + this._options.stringDelimiterRight); |
| + | sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_CLASS, oContainer.css); |
| + | sContainers += sContainer; |
| + | } |
| + | |
| + | boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS_ITEMS, sContainers); |
| + | |
| + | //l10n |
| + | boxHtml = this.replaceStrings(boxHtml); |
| + | |
| + | //load html in wymbox |
| + | jQuery(this._box).html(boxHtml); |
| + | |
| + | //hide the html value |
| + | jQuery(this._box).find(this._options.htmlSelector).hide(); |
| + | |
| + | //enable the skin |
| + | this.loadSkin(); |
| + | |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.bindEvents = function() { |
| + | |
| + | //copy the instance |
| + | var wym = this; |
| + | |
| + | //handle click event on tools buttons |
| + | jQuery(this._box).find(this._options.toolSelector).click(function() { |
| + | wym._iframe.contentWindow.focus(); //See #154 |
| + | wym.exec(jQuery(this).attr(WYMeditor.NAME)); |
| + | return(false); |
| + | }); |
| + | |
| + | //handle click event on containers buttons |
| + | jQuery(this._box).find(this._options.containerSelector).click(function() { |
| + | wym.container(jQuery(this).attr(WYMeditor.NAME)); |
| + | return(false); |
| + | }); |
| + | |
| + | //handle keyup event on html value: set the editor value |
| + | //handle focus/blur events to check if the element has focus, see #147 |
| + | jQuery(this._box).find(this._options.htmlValSelector) |
| + | .keyup(function() { jQuery(wym._doc.body).html(jQuery(this).val());}) |
| + | .focus(function() { jQuery(this).toggleClass('hasfocus'); }) |
| + | .blur(function() { jQuery(this).toggleClass('hasfocus'); }); |
| + | |
| + | //handle click event on classes buttons |
| + | jQuery(this._box).find(this._options.classSelector).click(function() { |
| + | |
| + | var aClasses = eval(wym._options.classesItems); |
| + | var sName = jQuery(this).attr(WYMeditor.NAME); |
| + | |
| + | var oClass = WYMeditor.Helper.findByName(aClasses, sName); |
| + | |
| + | if(oClass) { |
| + | var jqexpr = oClass.expr; |
| + | wym.toggleClass(sName, jqexpr); |
| + | } |
| + | wym._iframe.contentWindow.focus(); //See #154 |
| + | return(false); |
| + | }); |
| + | |
| + | //handle event on update element |
| + | jQuery(this._options.updateSelector) |
| + | .bind(this._options.updateEvent, function() { |
| + | wym.update(); |
| + | }); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.ready = function() { |
| + | return(this._doc != null); |
| + | }; |
| + | |
| + | |
| + | /********** METHODS **********/ |
| + | |
| + | /* @name box |
| + | * @description Returns the WYMeditor container |
| + | */ |
| + | WYMeditor.editor.prototype.box = function() { |
| + | return(this._box); |
| + | }; |
| + | |
| + | /* @name html |
| + | * @description Get/Set the html value |
| + | */ |
| + | WYMeditor.editor.prototype.html = function(html) { |
| + | |
| + | if(typeof html === 'string') jQuery(this._doc.body).html(html); |
| + | else return(jQuery(this._doc.body).html()); |
| + | }; |
| + | |
| + | /* @name xhtml |
| + | * @description Cleans up the HTML |
| + | */ |
| + | WYMeditor.editor.prototype.xhtml = function() { |
| + | return this.parser.parse(this.html()); |
| + | }; |
| + | |
| + | /* @name exec |
| + | * @description Executes a button command |
| + | */ |
| + | WYMeditor.editor.prototype.exec = function(cmd) { |
| + | |
| + | //base function for execCommand |
| + | //open a dialog or exec |
| + | switch(cmd) { |
| + | case WYMeditor.CREATE_LINK: |
| + | var container = this.container(); |
| + | if(container || this._selected_image) this.dialog(WYMeditor.DIALOG_LINK); |
| + | break; |
| + | |
| + | case WYMeditor.INSERT_IMAGE: |
| + | this.dialog(WYMeditor.DIALOG_IMAGE); |
| + | break; |
| + | |
| + | case WYMeditor.INSERT_TABLE: |
| + | this.dialog(WYMeditor.DIALOG_TABLE); |
| + | break; |
| + | |
| + | case WYMeditor.PASTE: |
| + | this.dialog(WYMeditor.DIALOG_PASTE); |
| + | break; |
| + | |
| + | case WYMeditor.TOGGLE_HTML: |
| + | this.update(); |
| + | this.toggleHtml(); |
| + | break; |
| + | |
| + | case WYMeditor.PREVIEW: |
| + | this.dialog(WYMeditor.PREVIEW, this._options.dialogFeaturesPreview); |
| + | break; |
| + | |
| + | default: |
| + | this._exec(cmd); |
| + | break; |
| + | } |
| + | }; |
| + | |
| + | /* @name container |
| + | * @description Get/Set the selected container |
| + | */ |
| + | WYMeditor.editor.prototype.container = function(sType) { |
| + | |
| + | if(sType) { |
| + | |
| + | var container = null; |
| + | |
| + | if(sType.toLowerCase() == WYMeditor.TH) { |
| + | |
| + | container = this.container(); |
| + | |
| + | //find the TD or TH container |
| + | switch(container.tagName.toLowerCase()) { |
| + | |
| + | case WYMeditor.TD: case WYMeditor.TH: |
| + | break; |
| + | default: |
| + | var aTypes = new Array(WYMeditor.TD,WYMeditor.TH); |
| + | container = this.findUp(this.container(), aTypes); |
| + | break; |
| + | } |
| + | |
| + | //if it exists, switch |
| + | if(container!=null) { |
| + | |
| + | sType = (container.tagName.toLowerCase() == WYMeditor.TD)? WYMeditor.TH: WYMeditor.TD; |
| + | this.switchTo(container,sType); |
| + | this.update(); |
| + | } |
| + | } else { |
| + | |
| + | //set the container type |
| + | var aTypes=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5, |
| + | WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE); |
| + | container = this.findUp(this.container(), aTypes); |
| + | |
| + | if(container) { |
| + | |
| + | var newNode = null; |
| + | |
| + | //blockquotes must contain a block level element |
| + | if(sType.toLowerCase() == WYMeditor.BLOCKQUOTE) { |
| + | |
| + | var blockquote = this.findUp(this.container(), WYMeditor.BLOCKQUOTE); |
| + | |
| + | if(blockquote == null) { |
| + | |
| + | newNode = this._doc.createElement(sType); |
| + | container.parentNode.insertBefore(newNode,container); |
| + | newNode.appendChild(container); |
| + | this.setFocusToNode(newNode.firstChild); |
| + | |
| + | } else { |
| + | |
| + | var nodes = blockquote.childNodes; |
| + | var lgt = nodes.length; |
| + | var firstNode = null; |
| + | |
| + | if(lgt > 0) firstNode = nodes.item(0); |
| + | for(var x=0; x<lgt; x++) { |
| + | blockquote.parentNode.insertBefore(nodes.item(0),blockquote); |
| + | } |
| + | blockquote.parentNode.removeChild(blockquote); |
| + | if(firstNode) this.setFocusToNode(firstNode); |
| + | } |
| + | } |
| + | |
| + | else this.switchTo(container,sType); |
| + | |
| + | this.update(); |
| + | } |
| + | } |
| + | } |
| + | else return(this.selected()); |
| + | }; |
| + | |
| + | /* @name toggleClass |
| + | * @description Toggles class on selected element, or one of its parents |
| + | */ |
| + | WYMeditor.editor.prototype.toggleClass = function(sClass, jqexpr) { |
| + | |
| + | var container = (this._selected_image |
| + | ? this._selected_image |
| + | : jQuery(this.selected())); |
| + | container = jQuery(container).parentsOrSelf(jqexpr); |
| + | jQuery(container).toggleClass(sClass); |
| + | |
| + | if(!jQuery(container).attr(WYMeditor.CLASS)) jQuery(container).removeAttr(this._class); |
| + | |
| + | }; |
| + | |
| + | /* @name findUp |
| + | * @description Returns the first parent or self container, based on its type |
| + | */ |
| + | WYMeditor.editor.prototype.findUp = function(node, filter) { |
| + | |
| + | //filter is a string or an array of strings |
| + | |
| + | if(node) { |
| + | |
| + | var tagname = node.tagName.toLowerCase(); |
| + | |
| + | if(typeof(filter) == WYMeditor.STRING) { |
| + | |
| + | while(tagname != filter && tagname != WYMeditor.BODY) { |
| + | |
| + | node = node.parentNode; |
| + | tagname = node.tagName.toLowerCase(); |
| + | } |
| + | |
| + | } else { |
| + | |
| + | var bFound = false; |
| + | |
| + | while(!bFound && tagname != WYMeditor.BODY) { |
| + | for(var i = 0; i < filter.length; i++) { |
| + | if(tagname == filter[i]) { |
| + | bFound = true; |
| + | break; |
| + | } |
| + | } |
| + | if(!bFound) { |
| + | node = node.parentNode; |
| + | tagname = node.tagName.toLowerCase(); |
| + | } |
| + | } |
| + | } |
| + | |
| + | if(tagname != WYMeditor.BODY) return(node); |
| + | else return(null); |
| + | |
| + | } else return(null); |
| + | }; |
| + | |
| + | /* @name switchTo |
| + | * @description Switch the node's type |
| + | */ |
| + | WYMeditor.editor.prototype.switchTo = function(node,sType) { |
| + | |
| + | var newNode = this._doc.createElement(sType); |
| + | var html = jQuery(node).html(); |
| + | node.parentNode.replaceChild(newNode,node); |
| + | jQuery(newNode).html(html); |
| + | this.setFocusToNode(newNode); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.replaceStrings = function(sVal) { |
| + | //check if the language file has already been loaded |
| + | //if not, get it via a synchronous ajax call |
| + | if(!WYMeditor.STRINGS[this._options.lang]) { |
| + | try { |
| + | eval(jQuery.ajax({url:this._options.langPath |
| + | + this._options.lang + '.js', async:false}).responseText); |
| + | } catch(e) { |
| + | WYMeditor.console.error("WYMeditor: error while parsing language file."); |
| + | return sVal; |
| + | } |
| + | } |
| + | |
| + | //replace all the strings in sVal and return it |
| + | for (var key in WYMeditor.STRINGS[this._options.lang]) { |
| + | sVal = WYMeditor.Helper.replaceAll(sVal, this._options.stringDelimiterLeft + key |
| + | + this._options.stringDelimiterRight, |
| + | WYMeditor.STRINGS[this._options.lang][key]); |
| + | }; |
| + | return(sVal); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.encloseString = function(sVal) { |
| + | |
| + | return(this._options.stringDelimiterLeft |
| + | + sVal |
| + | + this._options.stringDelimiterRight); |
| + | }; |
| + | |
| + | /* @name status |
| + | * @description Prints a status message |
| + | */ |
| + | WYMeditor.editor.prototype.status = function(sMessage) { |
| + | |
| + | //print status message |
| + | jQuery(this._box).find(this._options.statusSelector).html(sMessage); |
| + | }; |
| + | |
| + | /* @name update |
| + | * @description Updates the element and textarea values |
| + | */ |
| + | WYMeditor.editor.prototype.update = function() { |
| + | |
| + | var html = this.xhtml(); |
| + | jQuery(this._element).val(html); |
| + | jQuery(this._box).find(this._options.htmlValSelector).not('.hasfocus').val(html); //#147 |
| + | }; |
| + | |
| + | /* @name dialog |
| + | * @description Opens a dialog box |
| + | */ |
| + | WYMeditor.editor.prototype.dialog = function( dialogType, dialogFeatures, bodyHtml ) { |
| + | |
| + | var features = dialogFeatures || this._wym._options.dialogFeatures; |
| + | var wDialog = window.open('', 'dialog', features); |
| + | |
| + | if(wDialog) { |
| + | |
| + | var sBodyHtml = ""; |
| + | |
| + | switch( dialogType ) { |
| + | |
| + | case(WYMeditor.DIALOG_LINK): |
| + | sBodyHtml = this._options.dialogLinkHtml; |
| + | break; |
| + | case(WYMeditor.DIALOG_IMAGE): |
| + | sBodyHtml = this._options.dialogImageHtml; |
| + | break; |
| + | case(WYMeditor.DIALOG_TABLE): |
| + | sBodyHtml = this._options.dialogTableHtml; |
| + | break; |
| + | case(WYMeditor.DIALOG_PASTE): |
| + | sBodyHtml = this._options.dialogPasteHtml; |
| + | break; |
| + | case(WYMeditor.PREVIEW): |
| + | sBodyHtml = this._options.dialogPreviewHtml; |
| + | break; |
| + | |
| + | default: |
| + | sBodyHtml = bodyHtml; |
| + | } |
| + | |
| + | var h = WYMeditor.Helper; |
| + | |
| + | //construct the dialog |
| + | var dialogHtml = this._options.dialogHtml; |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.BASE_PATH, this._options.basePath); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIRECTION, this._options.direction); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.CSS_PATH, this._options.skinPath + WYMeditor.SKINS_DEFAULT_CSS); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.WYM_PATH, this._options.wymPath); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.JQUERY_PATH, this._options.jQueryPath); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_TITLE, this.encloseString( dialogType )); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_BODY, sBodyHtml); |
| + | dialogHtml = h.replaceAll(dialogHtml, WYMeditor.INDEX, this._index); |
| + | |
| + | dialogHtml = this.replaceStrings(dialogHtml); |
| + | |
| + | var doc = wDialog.document; |
| + | doc.write(dialogHtml); |
| + | doc.close(); |
| + | } |
| + | }; |
| + | |
| + | /* @name toggleHtml |
| + | * @description Shows/Hides the HTML |
| + | */ |
| + | WYMeditor.editor.prototype.toggleHtml = function() { |
| + | jQuery(this._box).find(this._options.htmlSelector).toggle(); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.uniqueStamp = function() { |
| + | var now = new Date(); |
| + | return("wym-" + now.getTime()); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.paste = function(sData) { |
| + | |
| + | var sTmp; |
| + | var container = this.selected(); |
| + | |
| + | //split the data, using double newlines as the separator |
| + | var aP = sData.split(this._newLine + this._newLine); |
| + | var rExp = new RegExp(this._newLine, "g"); |
| + | |
| + | //add a P for each item |
| + | if(container && container.tagName.toLowerCase() != WYMeditor.BODY) { |
| + | for(x = aP.length - 1; x >= 0; x--) { |
| + | sTmp = aP[x]; |
| + | //simple newlines are replaced by a break |
| + | sTmp = sTmp.replace(rExp, "<br />"); |
| + | jQuery(container).after("<p>" + sTmp + "</p>"); |
| + | } |
| + | } else { |
| + | for(x = 0; x < aP.length; x++) { |
| + | sTmp = aP[x]; |
| + | //simple newlines are replaced by a break |
| + | sTmp = sTmp.replace(rExp, "<br />"); |
| + | jQuery(this._doc.body).append("<p>" + sTmp + "</p>"); |
| + | } |
| + | |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.insert = function(html) { |
| + | // Do we have a selection? |
| + | if (this._iframe.contentWindow.getSelection().focusNode != null) { |
| + | // Overwrite selection with provided html |
| + | this._exec( WYMeditor.INSERT_HTML, html); |
| + | } else { |
| + | // Fall back to the internal paste function if there's no selection |
| + | this.paste(html) |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.wrap = function(left, right) { |
| + | // Do we have a selection? |
| + | if (this._iframe.contentWindow.getSelection().focusNode != null) { |
| + | // Wrap selection with provided html |
| + | this._exec( WYMeditor.INSERT_HTML, left + this._iframe.contentWindow.getSelection().toString() + right); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.unwrap = function() { |
| + | // Do we have a selection? |
| + | if (this._iframe.contentWindow.getSelection().focusNode != null) { |
| + | // Unwrap selection |
| + | this._exec( WYMeditor.INSERT_HTML, this._iframe.contentWindow.getSelection().toString() ); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.setFocusToNode = function(node, toStart) { |
| + | var range = this._doc.createRange(), |
| + | selection = this._iframe.contentWindow.getSelection(); |
| + | toStart = toStart ? 0 : 1; |
| + | |
| + | range.selectNodeContents(node); |
| + | selection.addRange(range); |
| + | selection.collapse(node, toStart); |
| + | this._iframe.contentWindow.focus(); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.addCssRules = function(doc, aCss) { |
| + | var styles = doc.styleSheets[0]; |
| + | if(styles) { |
| + | for(var i = 0; i < aCss.length; i++) { |
| + | var oCss = aCss[i]; |
| + | if(oCss.name && oCss.css) this.addCssRule(styles, oCss); |
| + | } |
| + | } |
| + | }; |
| + | |
| + | /********** CONFIGURATION **********/ |
| + | |
| + | WYMeditor.editor.prototype.computeBasePath = function() { |
| + | return jQuery(jQuery.grep(jQuery('script'), function(s){ |
| + | return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ )) |
| + | })).attr('src').replace(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/, ''); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.computeWymPath = function() { |
| + | return jQuery(jQuery.grep(jQuery('script'), function(s){ |
| + | return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ )) |
| + | })).attr('src'); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.computeJqueryPath = function() { |
| + | return jQuery(jQuery.grep(jQuery('script'), function(s){ |
| + | return (s.src && s.src.match(/jquery(-(.*)){0,1}(\.pack|\.min|\.packed)?\.js(\?.*)?$/ )) |
| + | })).attr('src'); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.computeCssPath = function() { |
| + | return jQuery(jQuery.grep(jQuery('link'), function(s){ |
| + | return (s.href && s.href.match(/wymeditor\/skins\/(.*)screen\.css(\?.*)?$/ )) |
| + | })).attr('href'); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.configureEditorUsingRawCss = function() { |
| + | |
| + | var CssParser = new WYMeditor.WymCssParser(); |
| + | if(this._options.stylesheet){ |
| + | CssParser.parse(jQuery.ajax({url: this._options.stylesheet,async:false}).responseText); |
| + | }else{ |
| + | CssParser.parse(this._options.styles, false); |
| + | } |
| + | |
| + | if(this._options.classesItems.length == 0) { |
| + | this._options.classesItems = CssParser.css_settings.classesItems; |
| + | } |
| + | if(this._options.editorStyles.length == 0) { |
| + | this._options.editorStyles = CssParser.css_settings.editorStyles; |
| + | } |
| + | if(this._options.dialogStyles.length == 0) { |
| + | this._options.dialogStyles = CssParser.css_settings.dialogStyles; |
| + | } |
| + | }; |
| + | |
| + | /********** EVENTS **********/ |
| + | |
| + | WYMeditor.editor.prototype.listen = function() { |
| + | //don't use jQuery.find() on the iframe body |
| + | //because of MSIE + jQuery + expando issue (#JQ1143) |
| + | //jQuery(this._doc.body).find("*").bind("mouseup", this.mouseup); |
| + | |
| + | jQuery(this._doc.body).bind("mousedown", this.mousedown); |
| + | }; |
| + | |
| + | WYMeditor.editor.prototype.mousedown = function(evt) { |
| + | var wym = WYMeditor.INSTANCES[this.ownerDocument.title]; |
| + | wym._selected_image = (evt.target.tagName.toLowerCase() == WYMeditor.IMG) ? evt.target : null; |
| + | }; |
| + | |
| + | /********** SKINS **********/ |
| + | |
| + | /* |
| + | * Function: WYMeditor.loadCss |
| + | * Loads a stylesheet in the document. |
| + | * |
| + | * Parameters: |
| + | * href - The CSS path. |
| + | */ |
| + | WYMeditor.loadCss = function(href) { |
| + | |
| + | var link = document.createElement('link'); |
| + | link.rel = 'stylesheet'; |
| + | link.href = href; |
| + | |
| + | var head = jQuery('head').get(0); |
| + | head.appendChild(link); |
| + | }; |
| + | |
| + | /* |
| + | * Function: WYMeditor.editor.loadSkin |
| + | * Loads the skin CSS and initialization script (if needed). |
| + | */ |
| + | WYMeditor.editor.prototype.loadSkin = function() { |
| + | |
| + | //does the user want to automatically load the CSS (default: yes)? |
| + | //we also test if it hasn't been already loaded by another instance |
| + | //see below for a better (second) test |
| + | if(this._options.loadSkin && !WYMeditor.SKINS[this._options.skin]) { |
| + | |
| + | //check if it hasn't been already loaded |
| + | //so we don't load it more than once |
| + | //(we check the existing <link> elements) |
| + | |
| + | var found = false; |
| + | var rExp = new RegExp(this._options.skin |
| + | + '\/' + WYMeditor.SKINS_DEFAULT_CSS + '$'); |
| + | |
| + | jQuery('link').each( function() { |
| + | if(this.href.match(rExp)) found = true; |
| + | }); |
| + | |
| + | //load it, using the skin path |
| + | if(!found) WYMeditor.loadCss( this._options.skinPath |
| + | + WYMeditor.SKINS_DEFAULT_CSS ); |
| + | } |
| + | |
| + | //put the classname (ex. wym_skin_default) on wym_box |
| + | jQuery(this._box).addClass( "wym_skin_" + this._options.skin ); |
| + | |
| + | //does the user want to use some JS to initialize the skin (default: yes)? |
| + | //also check if it hasn't already been loaded by another instance |
| + | if(this._options.initSkin && !WYMeditor.SKINS[this._options.skin]) { |
| + | |
| + | eval(jQuery.ajax({url:this._options.skinPath |
| + | + WYMeditor.SKINS_DEFAULT_JS, async:false}).responseText); |
| + | } |
| + | |
| + | //init the skin, if needed |
| + | if(WYMeditor.SKINS[this._options.skin] |
| + | && WYMeditor.SKINS[this._options.skin].init) |
| + | WYMeditor.SKINS[this._options.skin].init(this); |
| + | |
| + | }; |
| + | |
| + | |
| + | /********** DIALOGS **********/ |
| + | |
| + | WYMeditor.INIT_DIALOG = function(index) { |
| + | |
| + | var wym = window.opener.WYMeditor.INSTANCES[index]; |
| + | var doc = window.document; |
| + | var selected = wym.selected(); |
| + | var dialogType = jQuery(wym._options.dialogTypeSelector).val(); |
| + | var sStamp = wym.uniqueStamp(); |
| + | |
| + | switch(dialogType) { |
| + | |
| + | case WYMeditor.DIALOG_LINK: |
| + | //ensure that we select the link to populate the fields |
| + | if(selected && selected.tagName && selected.tagName.toLowerCase != WYMeditor.A) |
| + | selected = jQuery(selected).parentsOrSelf(WYMeditor.A); |
| + | |
| + | //fix MSIE selection if link image has been clicked |
| + | if(!selected && wym._selected_image) |
| + | selected = jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A); |
| + | break; |
| + | |
| + | } |
| + | |
| + | //pre-init functions |
| + | if(jQuery.isFunction(wym._options.preInitDialog)) |
| + | wym._options.preInitDialog(wym,window); |
| + | |
| + | //add css rules from options |
| + | var styles = doc.styleSheets[0]; |
| + | var aCss = eval(wym._options.dialogStyles); |
| + | |
| + | wym.addCssRules(doc, aCss); |
| + | |
| + | //auto populate fields if selected container (e.g. A) |
| + | if(selected) { |
| + | jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF)); |
| + | jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC)); |
| + | jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE)); |
| + | jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT)); |
| + | } |
| + | |
| + | //auto populate image fields if selected image |
| + | if(wym._selected_image) { |
| + | jQuery(wym._options.dialogImageSelector + " " + wym._options.srcSelector) |
| + | .val(jQuery(wym._selected_image).attr(WYMeditor.SRC)); |
| + | jQuery(wym._options.dialogImageSelector + " " + wym._options.titleSelector) |
| + | .val(jQuery(wym._selected_image).attr(WYMeditor.TITLE)); |
| + | jQuery(wym._options.dialogImageSelector + " " + wym._options.altSelector) |
| + | .val(jQuery(wym._selected_image).attr(WYMeditor.ALT)); |
| + | } |
| + | |
| + | jQuery(wym._options.dialogLinkSelector + " " |
| + | + wym._options.submitSelector).click(function() { |
| + | |
| + | var sUrl = jQuery(wym._options.hrefSelector).val(); |
| + | if(sUrl.length > 0) { |
| + | var link; |
| + | |
| + | if (selected[0] && selected[0].tagName.toLowerCase() == WYMeditor.A) { |
| + | link = selected; |
| + | } else { |
| + | wym._exec(WYMeditor.CREATE_LINK, sStamp); |
| + | link = jQuery("a[href=" + sStamp + "]", wym._doc.body); |
| + | } |
| + | |
| + | link.attr(WYMeditor.HREF, sUrl) |
| + | .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val()); |
| + | |
| + | } |
| + | window.close(); |
| + | }); |
| + | |
| + | jQuery(wym._options.dialogImageSelector + " " |
| + | + wym._options.submitSelector).click(function() { |
| + | |
| + | var sUrl = jQuery(wym._options.srcSelector).val(); |
| + | if(sUrl.length > 0) { |
| + | |
| + | wym._exec(WYMeditor.INSERT_IMAGE, sStamp); |
| + | |
| + | jQuery("img[src$=" + sStamp + "]", wym._doc.body) |
| + | .attr(WYMeditor.SRC, sUrl) |
| + | .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val()) |
| + | .attr(WYMeditor.ALT, jQuery(wym._options.altSelector).val()); |
| + | } |
| + | window.close(); |
| + | }); |
| + | |
| + | jQuery(wym._options.dialogTableSelector + " " |
| + | + wym._options.submitSelector).click(function() { |
| + | |
| + | var iRows = jQuery(wym._options.rowsSelector).val(); |
| + | var iCols = jQuery(wym._options.colsSelector).val(); |
| + | |
| + | if(iRows > 0 && iCols > 0) { |
| + | |
| + | var table = wym._doc.createElement(WYMeditor.TABLE); |
| + | var newRow = null; |
| + | var newCol = null; |
| + | |
| + | var sCaption = jQuery(wym._options.captionSelector).val(); |
| + | |
| + | //we create the caption |
| + | var newCaption = table.createCaption(); |
| + | newCaption.innerHTML = sCaption; |
| + | |
| + | //we create the rows and cells |
| + | for(x=0; x<iRows; x++) { |
| + | newRow = table.insertRow(x); |
| + | for(y=0; y<iCols; y++) {newRow.insertCell(y);} |
| + | } |
| + | |
| + | //set the summary attr |
| + | jQuery(table).attr('summary', |
| + | jQuery(wym._options.summarySelector).val()); |
| + | |
| + | //append the table after the selected container |
| + | var node = jQuery(wym.findUp(wym.container(), |
| + | WYMeditor.MAIN_CONTAINERS)).get(0); |
| + | if(!node || !node.parentNode) jQuery(wym._doc.body).append(table); |
| + | else jQuery(node).after(table); |
| + | } |
| + | window.close(); |
| + | }); |
| + | |
| + | jQuery(wym._options.dialogPasteSelector + " " |
| + | + wym._options.submitSelector).click(function() { |
| + | |
| + | var sText = jQuery(wym._options.textSelector).val(); |
| + | wym.paste(sText); |
| + | window.close(); |
| + | }); |
| + | |
| + | jQuery(wym._options.dialogPreviewSelector + " " |
| + | + wym._options.previewSelector) |
| + | .html(wym.xhtml()); |
| + | |
| + | //cancel button |
| + | jQuery(wym._options.cancelSelector).mousedown(function() { |
| + | window.close(); |
| + | }); |
| + | |
| + | //pre-init functions |
| + | if(jQuery.isFunction(wym._options.postInitDialog)) |
| + | wym._options.postInitDialog(wym,window); |
| + | |
| + | }; |
| + | |
| + | /********** XHTML LEXER/PARSER **********/ |
| + | |
| + | /* |
| + | * @name xml |
| + | * @description Use these methods to generate XML and XHTML compliant tags and |
| + | * escape tag attributes correctly |
| + | * @author Bermi Ferrer - http://bermi.org |
| + | * @author David Heinemeier Hansson http://loudthinking.com |
| + | */ |
| + | WYMeditor.XmlHelper = function() |
| + | { |
| + | this._entitiesDiv = document.createElement('div'); |
| + | return this; |
| + | }; |
| + | |
| + | |
| + | /* |
| + | * @name tag |
| + | * @description |
| + | * Returns an empty HTML tag of type *name* which by default is XHTML |
| + | * compliant. Setting *open* to true will create an open tag compatible |
| + | * with HTML 4.0 and below. Add HTML attributes by passing an attributes |
| + | * array to *options*. For attributes with no value like (disabled and |
| + | * readonly), give it a value of true in the *options* array. |
| + | * |
| + | * Examples: |
| + | * |
| + | * this.tag('br') |
| + | * # => <br /> |
| + | * this.tag ('br', false, true) |
| + | * # => <br> |
| + | * this.tag ('input', jQuery({type:'text',disabled:true }) ) |
| + | * # => <input type="text" disabled="disabled" /> |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.tag = function(name, options, open) |
| + | { |
| + | options = options || false; |
| + | open = open || false; |
| + | return '<'+name+(options ? this.tagOptions(options) : '')+(open ? '>' : ' />'); |
| + | }; |
| + | |
| + | /* |
| + | * @name contentTag |
| + | * @description |
| + | * Returns a XML block tag of type *name* surrounding the *content*. Add |
| + | * XML attributes by passing an attributes array to *options*. For attributes |
| + | * with no value like (disabled and readonly), give it a value of true in |
| + | * the *options* array. You can use symbols or strings for the attribute names. |
| + | * |
| + | * this.contentTag ('p', 'Hello world!' ) |
| + | * # => <p>Hello world!</p> |
| + | * this.contentTag('div', this.contentTag('p', "Hello world!"), jQuery({class : "strong"})) |
| + | * # => <div class="strong"><p>Hello world!</p></div> |
| + | * this.contentTag("select", options, jQuery({multiple : true})) |
| + | * # => <select multiple="multiple">...options...</select> |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.contentTag = function(name, content, options) |
| + | { |
| + | options = options || false; |
| + | return '<'+name+(options ? this.tagOptions(options) : '')+'>'+content+'</'+name+'>'; |
| + | }; |
| + | |
| + | /* |
| + | * @name cdataSection |
| + | * @description |
| + | * Returns a CDATA section for the given +content+. CDATA sections |
| + | * are used to escape blocks of text containing characters which would |
| + | * otherwise be recognized as markup. CDATA sections begin with the string |
| + | * <tt><![CDATA[</tt> and } with (and may not contain) the string |
| + | * <tt>]]></tt>. |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.cdataSection = function(content) |
| + | { |
| + | return '<![CDATA['+content+']]>'; |
| + | }; |
| + | |
| + | |
| + | /* |
| + | * @name escapeOnce |
| + | * @description |
| + | * Returns the escaped +xml+ without affecting existing escaped entities. |
| + | * |
| + | * this.escapeOnce( "1 > 2 & 3") |
| + | * # => "1 > 2 & 3" |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.escapeOnce = function(xml) |
| + | { |
| + | return this._fixDoubleEscape(this.escapeEntities(xml)); |
| + | }; |
| + | |
| + | /* |
| + | * @name _fixDoubleEscape |
| + | * @description |
| + | * Fix double-escaped entities, such as &amp;, &#123;, etc. |
| + | */ |
| + | WYMeditor.XmlHelper.prototype._fixDoubleEscape = function(escaped) |
| + | { |
| + | return escaped.replace(/&([a-z]+|(#\d+));/ig, "&$1;"); |
| + | }; |
| + | |
| + | /* |
| + | * @name tagOptions |
| + | * @description |
| + | * Takes an array like the one generated by Tag.parseAttributes |
| + | * [["src", "http://www.editam.com/?a=b&c=d&f=g"], ["title", "Editam, <Simplified> CMS"]] |
| + | * or an object like {src:"http://www.editam.com/?a=b&c=d&f=g", title:"Editam, <Simplified> CMS"} |
| + | * and returns a string properly escaped like |
| + | * ' src = "http://www.editam.com/?a=b&c=d&f=g" title = "Editam, <Simplified> CMS"' |
| + | * which is valid for strict XHTML |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.tagOptions = function(options) |
| + | { |
| + | var xml = this; |
| + | xml._formated_options = ''; |
| + | |
| + | for (var key in options) { |
| + | var formated_options = ''; |
| + | var value = options[key]; |
| + | if(typeof value != 'function' && value.length > 0) { |
| + | |
| + | if(parseInt(key) == key && typeof value == 'object'){ |
| + | key = value.shift(); |
| + | value = value.pop(); |
| + | } |
| + | if(key != '' && value != ''){ |
| + | xml._formated_options += ' '+key+'="'+xml.escapeOnce(value)+'"'; |
| + | } |
| + | } |
| + | } |
| + | return xml._formated_options; |
| + | }; |
| + | |
| + | /* |
| + | * @name escapeEntities |
| + | * @description |
| + | * Escapes XML/HTML entities <, >, & and ". If seccond parameter is set to false it |
| + | * will not escape ". If set to true it will also escape ' |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.escapeEntities = function(string, escape_quotes) |
| + | { |
| + | this._entitiesDiv.innerHTML = string; |
| + | this._entitiesDiv.textContent = string; |
| + | var result = this._entitiesDiv.innerHTML; |
| + | if(typeof escape_quotes == 'undefined'){ |
| + | if(escape_quotes != false) result = result.replace('"', '"'); |
| + | if(escape_quotes == true) result = result.replace('"', '''); |
| + | } |
| + | return result; |
| + | }; |
| + | |
| + | /* |
| + | * Parses a string conatining tag attributes and values an returns an array formated like |
| + | * [["src", "http://www.editam.com"], ["title", "Editam, Simplified CMS"]] |
| + | */ |
| + | WYMeditor.XmlHelper.prototype.parseAttributes = function(tag_attributes) |
| + | { |
| + | // Use a compounded regex to match single quoted, double quoted and unquoted attribute pairs |
| + | var result = []; |
| + | var matches = tag_attributes.split(/((=\s*")(")("))|((=\s*\')(\')(\'))|((=\s*[^>\s]*))/g); |
| + | if(matches.toString() != tag_attributes){ |
| + | for (var k in matches) { |
| + | var v = matches[k]; |
| + | if(typeof v != 'function' && v.length != 0){ |
| + | var re = new RegExp('(\\w+)\\s*'+v); |
| + | if(match = tag_attributes.match(re) ){ |
| + | var value = v.replace(/^[\s=]+/, ""); |
| + | var delimiter = value.charAt(0); |
| + | delimiter = delimiter == '"' ? '"' : (delimiter=="'"?"'":''); |
| + | if(delimiter != ''){ |
| + | value = delimiter == '"' ? value.replace(/^"|"+$/g, '') : value.replace(/^'|'+$/g, ''); |
| + | } |
| + | tag_attributes = tag_attributes.replace(match[0],''); |
| + | result.push([match[1] , value]); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | return result; |
| + | }; |
| + | |
| + | /** |
| + | * XhtmlValidator for validating tag attributes |
| + | * |
| + | * @author Bermi Ferrer - http://bermi.org |
| + | */ |
| + | WYMeditor.XhtmlValidator = { |
| + | "_attributes": |
| + | { |
| + | "core": |
| + | { |
| + | "except":[ |
| + | "base", |
| + | "head", |
| + | "html", |
| + | "meta", |
| + | "param", |
| + | "script", |
| + | "style", |
| + | "title" |
| + | ], |
| + | "attributes":[ |
| + | "class", |
| + | "id", |
| + | "style", |
| + | "title", |
| + | "accesskey", |
| + | "tabindex" |
| + | ] |
| + | }, |
| + | "language": |
| + | { |
| + | "except":[ |
| + | "base", |
| + | "br", |
| + | "hr", |
| + | "iframe", |
| + | "param", |
| + | "script" |
| + | ], |
| + | "attributes": |
| + | { |
| + | "dir":[ |
| + | "ltr", |
| + | "rtl" |
| + | ], |
| + | "0":"lang", |
| + | "1":"xml:lang" |
| + | } |
| + | }, |
| + | "keyboard": |
| + | { |
| + | "attributes": |
| + | { |
| + | "accesskey":/^(\w){1}$/, |
| + | "tabindex":/^(\d)+$/ |
| + | } |
| + | } |
| + | }, |
| + | "_events": |
| + | { |
| + | "window": |
| + | { |
| + | "only":[ |
| + | "body" |
| + | ], |
| + | "attributes":[ |
| + | "onload", |
| + | "onunload" |
| + | ] |
| + | }, |
| + | "form": |
| + | { |
| + | "only":[ |
| + | "form", |
| + | "input", |
| + | "textarea", |
| + | "select", |
| + | "a", |
| + | "label", |
| + | "button" |
| + | ], |
| + | "attributes":[ |
| + | "onchange", |
| + | "onsubmit", |
| + | "onreset", |
| + | "onselect", |
| + | "onblur", |
| + | "onfocus" |
| + | ] |
| + | }, |
| + | "keyboard": |
| + | { |
| + | "except":[ |
| + | "base", |
| + | "bdo", |
| + | "br", |
| + | "frame", |
| + | "frameset", |
| + | "head", |
| + | "html", |
| + | "iframe", |
| + | "meta", |
| + | "param", |
| + | "script", |
| + | "style", |
| + | "title" |
| + | ], |
| + | "attributes":[ |
| + | "onkeydown", |
| + | "onkeypress", |
| + | "onkeyup" |
| + | ] |
| + | }, |
| + | "mouse": |
| + | { |
| + | "except":[ |
| + | "base", |
| + | "bdo", |
| + | "br", |
| + | "head", |
| + | "html", |
| + | "meta", |
| + | "param", |
| + | "script", |
| + | "style", |
| + | "title" |
| + | ], |
| + | "attributes":[ |
| + | "onclick", |
| + | "ondblclick", |
| + | "onmousedown", |
| + | "onmousemove", |
| + | "onmouseover", |
| + | "onmouseout", |
| + | "onmouseup" |
| + | ] |
| + | } |
| + | }, |
| + | "_tags": |
| + | { |
| + | "a": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"charset", |
| + | "1":"coords", |
| + | "2":"href", |
| + | "3":"hreflang", |
| + | "4":"name", |
| + | "rel":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/, |
| + | "rev":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/, |
| + | "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/, |
| + | "5":"type" |
| + | } |
| + | }, |
| + | "0":"abbr", |
| + | "1":"acronym", |
| + | "2":"address", |
| + | "area": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"alt", |
| + | "1":"coords", |
| + | "2":"href", |
| + | "nohref":/^(true|false)$/, |
| + | "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/ |
| + | }, |
| + | "required":[ |
| + | "alt" |
| + | ] |
| + | }, |
| + | "3":"b", |
| + | "base": |
| + | { |
| + | "attributes":[ |
| + | "href" |
| + | ], |
| + | "required":[ |
| + | "href" |
| + | ] |
| + | }, |
| + | "bdo": |
| + | { |
| + | "attributes": |
| + | { |
| + | "dir":/^(ltr|rtl)$/ |
| + | }, |
| + | "required":[ |
| + | "dir" |
| + | ] |
| + | }, |
| + | "4":"big", |
| + | "blockquote": |
| + | { |
| + | "attributes":[ |
| + | "cite" |
| + | ] |
| + | }, |
| + | "5":"body", |
| + | "6":"br", |
| + | "button": |
| + | { |
| + | "attributes": |
| + | { |
| + | "disabled":/^(disabled)$/, |
| + | "type":/^(button|reset|submit)$/, |
| + | "0":"value" |
| + | }, |
| + | "inside":"form" |
| + | }, |
| + | "7":"caption", |
| + | "8":"cite", |
| + | "9":"code", |
| + | "col": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "span":/^(\d)+$/, |
| + | "valign":/^(top|middle|bottom|baseline)$/, |
| + | "2":"width" |
| + | }, |
| + | "inside":"colgroup" |
| + | }, |
| + | "colgroup": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "span":/^(\d)+$/, |
| + | "valign":/^(top|middle|bottom|baseline)$/, |
| + | "2":"width" |
| + | } |
| + | }, |
| + | "10":"dd", |
| + | "del": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"cite", |
| + | "datetime":/^([0-9]){8}/ |
| + | } |
| + | }, |
| + | "11":"div", |
| + | "12":"dfn", |
| + | "13":"dl", |
| + | "14":"dt", |
| + | "15":"em", |
| + | "fieldset": |
| + | { |
| + | "inside":"form" |
| + | }, |
| + | "form": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"action", |
| + | "1":"accept", |
| + | "2":"accept-charset", |
| + | "3":"enctype", |
| + | "method":/^(get|post)$/ |
| + | }, |
| + | "required":[ |
| + | "action" |
| + | ] |
| + | }, |
| + | "head": |
| + | { |
| + | "attributes":[ |
| + | "profile" |
| + | ] |
| + | }, |
| + | "16":"h1", |
| + | "17":"h2", |
| + | "18":"h3", |
| + | "19":"h4", |
| + | "20":"h5", |
| + | "21":"h6", |
| + | "22":"hr", |
| + | "html": |
| + | { |
| + | "attributes":[ |
| + | "xmlns" |
| + | ] |
| + | }, |
| + | "23":"i", |
| + | "img": |
| + | { |
| + | "attributes":[ |
| + | "alt", |
| + | "src", |
| + | "height", |
| + | "ismap", |
| + | "longdesc", |
| + | "usemap", |
| + | "width" |
| + | ], |
| + | "required":[ |
| + | "alt", |
| + | "src" |
| + | ] |
| + | }, |
| + | "input": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"accept", |
| + | "1":"alt", |
| + | "checked":/^(checked)$/, |
| + | "disabled":/^(disabled)$/, |
| + | "maxlength":/^(\d)+$/, |
| + | "2":"name", |
| + | "readonly":/^(readonly)$/, |
| + | "size":/^(\d)+$/, |
| + | "3":"src", |
| + | "type":/^(button|checkbox|file|hidden|image|password|radio|reset|submit|text)$/, |
| + | "4":"value" |
| + | }, |
| + | "inside":"form" |
| + | }, |
| + | "ins": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"cite", |
| + | "datetime":/^([0-9]){8}/ |
| + | } |
| + | }, |
| + | "24":"kbd", |
| + | "label": |
| + | { |
| + | "attributes":[ |
| + | "for" |
| + | ], |
| + | "inside":"form" |
| + | }, |
| + | "25":"legend", |
| + | "26":"li", |
| + | "link": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"charset", |
| + | "1":"href", |
| + | "2":"hreflang", |
| + | "media":/^(all|braille|print|projection|screen|speech|,|;| )+$/i, |
| + | //next comment line required by Opera! |
| + | /*"rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,*/ |
| + | "rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i, |
| + | "rev":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i, |
| + | "3":"type" |
| + | }, |
| + | "inside":"head" |
| + | }, |
| + | "map": |
| + | { |
| + | "attributes":[ |
| + | "id", |
| + | "name" |
| + | ], |
| + | "required":[ |
| + | "id" |
| + | ] |
| + | }, |
| + | "meta": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"content", |
| + | "http-equiv":/^(content\-type|expires|refresh|set\-cookie)$/i, |
| + | "1":"name", |
| + | "2":"scheme" |
| + | }, |
| + | "required":[ |
| + | "content" |
| + | ] |
| + | }, |
| + | "27":"noscript", |
| + | "object": |
| + | { |
| + | "attributes":[ |
| + | "archive", |
| + | "classid", |
| + | "codebase", |
| + | "codetype", |
| + | "data", |
| + | "declare", |
| + | "height", |
| + | "name", |
| + | "standby", |
| + | "type", |
| + | "usemap", |
| + | "width" |
| + | ] |
| + | }, |
| + | "28":"ol", |
| + | "optgroup": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"label", |
| + | "disabled": /^(disabled)$/ |
| + | }, |
| + | "required":[ |
| + | "label" |
| + | ] |
| + | }, |
| + | "option": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"label", |
| + | "disabled":/^(disabled)$/, |
| + | "selected":/^(selected)$/, |
| + | "1":"value" |
| + | }, |
| + | "inside":"select" |
| + | }, |
| + | "29":"p", |
| + | "param": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"type", |
| + | "valuetype":/^(data|ref|object)$/, |
| + | "1":"valuetype", |
| + | "2":"value" |
| + | }, |
| + | "required":[ |
| + | "name" |
| + | ] |
| + | }, |
| + | "30":"pre", |
| + | "q": |
| + | { |
| + | "attributes":[ |
| + | "cite" |
| + | ] |
| + | }, |
| + | "31":"samp", |
| + | "script": |
| + | { |
| + | "attributes": |
| + | { |
| + | "type":/^(text\/ecmascript|text\/javascript|text\/jscript|text\/vbscript|text\/vbs|text\/xml)$/, |
| + | "0":"charset", |
| + | "defer":/^(defer)$/, |
| + | "1":"src" |
| + | }, |
| + | "required":[ |
| + | "type" |
| + | ] |
| + | }, |
| + | "select": |
| + | { |
| + | "attributes": |
| + | { |
| + | "disabled":/^(disabled)$/, |
| + | "multiple":/^(multiple)$/, |
| + | "0":"name", |
| + | "1":"size" |
| + | }, |
| + | "inside":"form" |
| + | }, |
| + | "32":"small", |
| + | "33":"span", |
| + | "34":"strong", |
| + | "style": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"type", |
| + | "media":/^(screen|tty|tv|projection|handheld|print|braille|aural|all)$/ |
| + | }, |
| + | "required":[ |
| + | "type" |
| + | ] |
| + | }, |
| + | "35":"sub", |
| + | "36":"sup", |
| + | "table": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"border", |
| + | "1":"cellpadding", |
| + | "2":"cellspacing", |
| + | "frame":/^(void|above|below|hsides|lhs|rhs|vsides|box|border)$/, |
| + | "rules":/^(none|groups|rows|cols|all)$/, |
| + | "3":"summary", |
| + | "4":"width" |
| + | } |
| + | }, |
| + | "tbody": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "valign":/^(top|middle|bottom|baseline)$/ |
| + | } |
| + | }, |
| + | "td": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"abbr", |
| + | "align":/^(left|right|center|justify|char)$/, |
| + | "1":"axis", |
| + | "2":"char", |
| + | "3":"charoff", |
| + | "colspan":/^(\d)+$/, |
| + | "4":"headers", |
| + | "rowspan":/^(\d)+$/, |
| + | "scope":/^(col|colgroup|row|rowgroup)$/, |
| + | "valign":/^(top|middle|bottom|baseline)$/ |
| + | } |
| + | }, |
| + | "textarea": |
| + | { |
| + | "attributes":[ |
| + | "cols", |
| + | "rows", |
| + | "disabled", |
| + | "name", |
| + | "readonly" |
| + | ], |
| + | "required":[ |
| + | "cols", |
| + | "rows" |
| + | ], |
| + | "inside":"form" |
| + | }, |
| + | "tfoot": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "valign":/^(top|middle|bottom)$/, |
| + | "2":"baseline" |
| + | } |
| + | }, |
| + | "th": |
| + | { |
| + | "attributes": |
| + | { |
| + | "0":"abbr", |
| + | "align":/^(left|right|center|justify|char)$/, |
| + | "1":"axis", |
| + | "2":"char", |
| + | "3":"charoff", |
| + | "colspan":/^(\d)+$/, |
| + | "4":"headers", |
| + | "rowspan":/^(\d)+$/, |
| + | "scope":/^(col|colgroup|row|rowgroup)$/, |
| + | "valign":/^(top|middle|bottom|baseline)$/ |
| + | } |
| + | }, |
| + | "thead": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "valign":/^(top|middle|bottom|baseline)$/ |
| + | } |
| + | }, |
| + | "37":"title", |
| + | "tr": |
| + | { |
| + | "attributes": |
| + | { |
| + | "align":/^(right|left|center|justify|char)$/, |
| + | "0":"char", |
| + | "1":"charoff", |
| + | "valign":/^(top|middle|bottom|baseline)$/ |
| + | } |
| + | }, |
| + | "38":"tt", |
| + | "39":"ul", |
| + | "40":"var" |
| + | }, |
| + | |
| + | // Temporary skiped attributes |
| + | skiped_attributes : [], |
| + | skiped_attribute_values : [], |
| + | |
| + | getValidTagAttributes: function(tag, attributes) |
| + | { |
| + | var valid_attributes = {}; |
| + | var possible_attributes = this.getPossibleTagAttributes(tag); |
| + | for(var attribute in attributes) { |
| + | var value = attributes[attribute]; |
| + | var h = WYMeditor.Helper; |
| + | if(!h.contains(this.skiped_attributes, attribute) && !h.contains(this.skiped_attribute_values, value)){ |
| + | if (typeof value != 'function' && h.contains(possible_attributes, attribute)) { |
| + | if (this.doesAttributeNeedsValidation(tag, attribute)) { |
| + | if(this.validateAttribute(tag, attribute, value)){ |
| + | valid_attributes[attribute] = value; |
| + | } |
| + | }else{ |
| + | valid_attributes[attribute] = value; |
| + | } |
| + | } |
| + | } |
| + | } |
| + | return valid_attributes; |
| + | }, |
| + | getUniqueAttributesAndEventsForTag : function(tag) |
| + | { |
| + | var result = []; |
| + | |
| + | if (this._tags[tag] && this._tags[tag]['attributes']) { |
| + | for (k in this._tags[tag]['attributes']) { |
| + | result.push(parseInt(k) == k ? this._tags[tag]['attributes'][k] : k); |
| + | } |
| + | } |
| + | return result; |
| + | }, |
| + | getDefaultAttributesAndEventsForTags : function() |
| + | { |
| + | var result = []; |
| + | for (var key in this._events){ |
| + | result.push(this._events[key]); |
| + | } |
| + | for (var key in this._attributes){ |
| + | result.push(this._attributes[key]); |
| + | } |
| + | return result; |
| + | }, |
| + | isValidTag : function(tag) |
| + | { |
| + | if(this._tags[tag]){ |
| + | return true; |
| + | } |
| + | for(var key in this._tags){ |
| + | if(this._tags[key] == tag){ |
| + | return true; |
| + | } |
| + | } |
| + | return false; |
| + | }, |
| + | getDefaultAttributesAndEventsForTag : function(tag) |
| + | { |
| + | var default_attributes = []; |
| + | if (this.isValidTag(tag)) { |
| + | var default_attributes_and_events = this.getDefaultAttributesAndEventsForTags(); |
| + | |
| + | for(var key in default_attributes_and_events) { |
| + | var defaults = default_attributes_and_events[key]; |
| + | if(typeof defaults == 'object'){ |
| + | var h = WYMeditor.Helper; |
| + | if ((defaults['except'] && h.contains(defaults['except'], tag)) || (defaults['only'] && !h.contains(defaults['only'], tag))) { |
| + | continue; |
| + | } |
| + | |
| + | var tag_defaults = defaults['attributes'] ? defaults['attributes'] : defaults['events']; |
| + | for(var k in tag_defaults) { |
| + | default_attributes.push(typeof tag_defaults[k] != 'string' ? k : tag_defaults[k]); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | return default_attributes; |
| + | }, |
| + | doesAttributeNeedsValidation: function(tag, attribute) |
| + | { |
| + | return this._tags[tag] && ((this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute]) || (this._tags[tag]['required'] && |
| + | WYMeditor.Helper.contains(this._tags[tag]['required'], attribute))); |
| + | }, |
| + | validateAttribute : function(tag, attribute, value) |
| + | { |
| + | if ( this._tags[tag] && |
| + | (this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute] && value.length > 0 && !value.match(this._tags[tag]['attributes'][attribute])) || // invalid format |
| + | (this._tags[tag] && this._tags[tag]['required'] && WYMeditor.Helper.contains(this._tags[tag]['required'], attribute) && value.length == 0) // required attribute |
| + | ) { |
| + | return false; |
| + | } |
| + | return typeof this._tags[tag] != 'undefined'; |
| + | }, |
| + | getPossibleTagAttributes : function(tag) |
| + | { |
| + | if (!this._possible_tag_attributes) { |
| + | this._possible_tag_attributes = {}; |
| + | } |
| + | if (!this._possible_tag_attributes[tag]) { |
| + | this._possible_tag_attributes[tag] = this.getUniqueAttributesAndEventsForTag(tag).concat(this.getDefaultAttributesAndEventsForTag(tag)); |
| + | } |
| + | return this._possible_tag_attributes[tag]; |
| + | } |
| + | }; |
| + | |
| + | |
| + | /** |
| + | * Compounded regular expression. Any of |
| + | * the contained patterns could match and |
| + | * when one does, it's label is returned. |
| + | * |
| + | * Constructor. Starts with no patterns. |
| + | * @param boolean case True for case sensitive, false |
| + | * for insensitive. |
| + | * @access public |
| + | * @author Marcus Baker (http://lastcraft.com) |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.ParallelRegex = function(case_sensitive) |
| + | { |
| + | this._case = case_sensitive; |
| + | this._patterns = []; |
| + | this._labels = []; |
| + | this._regex = null; |
| + | return this; |
| + | }; |
| + | |
| + | |
| + | /** |
| + | * Adds a pattern with an optional label. |
| + | * @param string pattern Perl style regex, but ( and ) |
| + | * lose the usual meaning. |
| + | * @param string label Label of regex to be returned |
| + | * on a match. |
| + | * @access public |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype.addPattern = function(pattern, label) |
| + | { |
| + | label = label || true; |
| + | var count = this._patterns.length; |
| + | this._patterns[count] = pattern; |
| + | this._labels[count] = label; |
| + | this._regex = null; |
| + | }; |
| + | |
| + | /** |
| + | * Attempts to match all patterns at once against |
| + | * a string. |
| + | * @param string subject String to match against. |
| + | * |
| + | * @return boolean True on success. |
| + | * @return string match First matched portion of |
| + | * subject. |
| + | * @access public |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype.match = function(subject) |
| + | { |
| + | if (this._patterns.length == 0) { |
| + | return [false, '']; |
| + | } |
| + | var matches = subject.match(this._getCompoundedRegex()); |
| + | |
| + | if(!matches){ |
| + | return [false, '']; |
| + | } |
| + | var match = matches[0]; |
| + | for (var i = 1; i < matches.length; i++) { |
| + | if (matches[i]) { |
| + | return [this._labels[i-1], match]; |
| + | } |
| + | } |
| + | return [true, matches[0]]; |
| + | }; |
| + | |
| + | /** |
| + | * Compounds the patterns into a single |
| + | * regular expression separated with the |
| + | * "or" operator. Caches the regex. |
| + | * Will automatically escape (, ) and / tokens. |
| + | * @param array patterns List of patterns in order. |
| + | * @access private |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype._getCompoundedRegex = function() |
| + | { |
| + | if (this._regex == null) { |
| + | for (var i = 0, count = this._patterns.length; i < count; i++) { |
| + | this._patterns[i] = '(' + this._untokenizeRegex(this._tokenizeRegex(this._patterns[i]).replace(/([\/\(\)])/g,'\\$1')) + ')'; |
| + | } |
| + | this._regex = new RegExp(this._patterns.join("|") ,this._getPerlMatchingFlags()); |
| + | } |
| + | return this._regex; |
| + | }; |
| + | |
| + | /** |
| + | * Escape lookahead/lookbehind blocks |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype._tokenizeRegex = function(regex) |
| + | { |
| + | return regex. |
| + | replace(/\(\?(i|m|s|x|U)\)/, '~~~~~~Tk1\$1~~~~~~'). |
| + | replace(/\(\?(\-[i|m|s|x|U])\)/, '~~~~~~Tk2\$1~~~~~~'). |
| + | replace(/\(\?\=(.*)\)/, '~~~~~~Tk3\$1~~~~~~'). |
| + | replace(/\(\?\!(.*)\)/, '~~~~~~Tk4\$1~~~~~~'). |
| + | replace(/\(\?\<\=(.*)\)/, '~~~~~~Tk5\$1~~~~~~'). |
| + | replace(/\(\?\<\!(.*)\)/, '~~~~~~Tk6\$1~~~~~~'). |
| + | replace(/\(\?\:(.*)\)/, '~~~~~~Tk7\$1~~~~~~'); |
| + | }; |
| + | |
| + | /** |
| + | * Unscape lookahead/lookbehind blocks |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype._untokenizeRegex = function(regex) |
| + | { |
| + | return regex. |
| + | replace(/~~~~~~Tk1(.{1})~~~~~~/, "(?\$1)"). |
| + | replace(/~~~~~~Tk2(.{2})~~~~~~/, "(?\$1)"). |
| + | replace(/~~~~~~Tk3(.*)~~~~~~/, "(?=\$1)"). |
| + | replace(/~~~~~~Tk4(.*)~~~~~~/, "(?!\$1)"). |
| + | replace(/~~~~~~Tk5(.*)~~~~~~/, "(?<=\$1)"). |
| + | replace(/~~~~~~Tk6(.*)~~~~~~/, "(?<!\$1)"). |
| + | replace(/~~~~~~Tk7(.*)~~~~~~/, "(?:\$1)"); |
| + | }; |
| + | |
| + | |
| + | /** |
| + | * Accessor for perl regex mode flags to use. |
| + | * @return string Perl regex flags. |
| + | * @access private |
| + | */ |
| + | WYMeditor.ParallelRegex.prototype._getPerlMatchingFlags = function() |
| + | { |
| + | return (this._case ? "m" : "mi"); |
| + | }; |
| + | |
| + | |
| + | |
| + | /** |
| + | * States for a stack machine. |
| + | * |
| + | * Constructor. Starts in named state. |
| + | * @param string start Starting state name. |
| + | * @access public |
| + | * @author Marcus Baker (http://lastcraft.com) |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.StateStack = function(start) |
| + | { |
| + | this._stack = [start]; |
| + | return this; |
| + | }; |
| + | |
| + | /** |
| + | * Accessor for current state. |
| + | * @return string State. |
| + | * @access public |
| + | */ |
| + | WYMeditor.StateStack.prototype.getCurrent = function() |
| + | { |
| + | return this._stack[this._stack.length - 1]; |
| + | }; |
| + | |
| + | /** |
| + | * Adds a state to the stack and sets it |
| + | * to be the current state. |
| + | * @param string state New state. |
| + | * @access public |
| + | */ |
| + | WYMeditor.StateStack.prototype.enter = function(state) |
| + | { |
| + | this._stack.push(state); |
| + | }; |
| + | |
| + | /** |
| + | * Leaves the current state and reverts |
| + | * to the previous one. |
| + | * @return boolean False if we drop off |
| + | * the bottom of the list. |
| + | * @access public |
| + | */ |
| + | WYMeditor.StateStack.prototype.leave = function() |
| + | { |
| + | if (this._stack.length == 1) { |
| + | return false; |
| + | } |
| + | this._stack.pop(); |
| + | return true; |
| + | }; |
| + | |
| + | |
| + | // GLOBALS |
| + | WYMeditor.LEXER_ENTER = 1; |
| + | WYMeditor.LEXER_MATCHED = 2; |
| + | WYMeditor.LEXER_UNMATCHED = 3; |
| + | WYMeditor.LEXER_EXIT = 4; |
| + | WYMeditor.LEXER_SPECIAL = 5; |
| + | |
| + | |
| + | /** |
| + | * Accepts text and breaks it into tokens. |
| + | * Some optimisation to make the sure the |
| + | * content is only scanned by the PHP regex |
| + | * parser once. Lexer modes must not start |
| + | * with leading underscores. |
| + | * |
| + | * Sets up the lexer in case insensitive matching |
| + | * by default. |
| + | * @param Parser parser Handling strategy by reference. |
| + | * @param string start Starting handler. |
| + | * @param boolean case True for case sensitive. |
| + | * @access public |
| + | * @author Marcus Baker (http://lastcraft.com) |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.Lexer = function(parser, start, case_sensitive) |
| + | { |
| + | start = start || 'accept'; |
| + | this._case = case_sensitive || false; |
| + | this._regexes = {}; |
| + | this._parser = parser; |
| + | this._mode = new WYMeditor.StateStack(start); |
| + | this._mode_handlers = {}; |
| + | this._mode_handlers[start] = start; |
| + | return this; |
| + | }; |
| + | |
| + | /** |
| + | * Adds a token search pattern for a particular |
| + | * parsing mode. The pattern does not change the |
| + | * current mode. |
| + | * @param string pattern Perl style regex, but ( and ) |
| + | * lose the usual meaning. |
| + | * @param string mode Should only apply this |
| + | * pattern when dealing with |
| + | * this type of input. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.addPattern = function(pattern, mode) |
| + | { |
| + | var mode = mode || "accept"; |
| + | if (typeof this._regexes[mode] == 'undefined') { |
| + | this._regexes[mode] = new WYMeditor.ParallelRegex(this._case); |
| + | } |
| + | this._regexes[mode].addPattern(pattern); |
| + | if (typeof this._mode_handlers[mode] == 'undefined') { |
| + | this._mode_handlers[mode] = mode; |
| + | } |
| + | }; |
| + | |
| + | /** |
| + | * Adds a pattern that will enter a new parsing |
| + | * mode. Useful for entering parenthesis, strings, |
| + | * tags, etc. |
| + | * @param string pattern Perl style regex, but ( and ) |
| + | * lose the usual meaning. |
| + | * @param string mode Should only apply this |
| + | * pattern when dealing with |
| + | * this type of input. |
| + | * @param string new_mode Change parsing to this new |
| + | * nested mode. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.addEntryPattern = function(pattern, mode, new_mode) |
| + | { |
| + | if (typeof this._regexes[mode] == 'undefined') { |
| + | this._regexes[mode] = new WYMeditor.ParallelRegex(this._case); |
| + | } |
| + | this._regexes[mode].addPattern(pattern, new_mode); |
| + | if (typeof this._mode_handlers[new_mode] == 'undefined') { |
| + | this._mode_handlers[new_mode] = new_mode; |
| + | } |
| + | }; |
| + | |
| + | /** |
| + | * Adds a pattern that will exit the current mode |
| + | * and re-enter the previous one. |
| + | * @param string pattern Perl style regex, but ( and ) |
| + | * lose the usual meaning. |
| + | * @param string mode Mode to leave. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.addExitPattern = function(pattern, mode) |
| + | { |
| + | if (typeof this._regexes[mode] == 'undefined') { |
| + | this._regexes[mode] = new WYMeditor.ParallelRegex(this._case); |
| + | } |
| + | this._regexes[mode].addPattern(pattern, "__exit"); |
| + | if (typeof this._mode_handlers[mode] == 'undefined') { |
| + | this._mode_handlers[mode] = mode; |
| + | } |
| + | }; |
| + | |
| + | /** |
| + | * Adds a pattern that has a special mode. Acts as an entry |
| + | * and exit pattern in one go, effectively calling a special |
| + | * parser handler for this token only. |
| + | * @param string pattern Perl style regex, but ( and ) |
| + | * lose the usual meaning. |
| + | * @param string mode Should only apply this |
| + | * pattern when dealing with |
| + | * this type of input. |
| + | * @param string special Use this mode for this one token. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.addSpecialPattern = function(pattern, mode, special) |
| + | { |
| + | if (typeof this._regexes[mode] == 'undefined') { |
| + | this._regexes[mode] = new WYMeditor.ParallelRegex(this._case); |
| + | } |
| + | this._regexes[mode].addPattern(pattern, '_'+special); |
| + | if (typeof this._mode_handlers[special] == 'undefined') { |
| + | this._mode_handlers[special] = special; |
| + | } |
| + | }; |
| + | |
| + | /** |
| + | * Adds a mapping from a mode to another handler. |
| + | * @param string mode Mode to be remapped. |
| + | * @param string handler New target handler. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.mapHandler = function(mode, handler) |
| + | { |
| + | this._mode_handlers[mode] = handler; |
| + | }; |
| + | |
| + | /** |
| + | * Splits the page text into tokens. Will fail |
| + | * if the handlers report an error or if no |
| + | * content is consumed. If successful then each |
| + | * unparsed and parsed token invokes a call to the |
| + | * held listener. |
| + | * @param string raw Raw HTML text. |
| + | * @return boolean True on success, else false. |
| + | * @access public |
| + | */ |
| + | WYMeditor.Lexer.prototype.parse = function(raw) |
| + | { |
| + | if (typeof this._parser == 'undefined') { |
| + | return false; |
| + | } |
| + | |
| + | var length = raw.length; |
| + | var parsed; |
| + | while (typeof (parsed = this._reduce(raw)) == 'object') { |
| + | var raw = parsed[0]; |
| + | var unmatched = parsed[1]; |
| + | var matched = parsed[2]; |
| + | var mode = parsed[3]; |
| + | |
| + | if (! this._dispatchTokens(unmatched, matched, mode)) { |
| + | return false; |
| + | } |
| + | |
| + | if (raw == '') { |
| + | return true; |
| + | } |
| + | if (raw.length == length) { |
| + | return false; |
| + | } |
| + | length = raw.length; |
| + | } |
| + | if (! parsed ) { |
| + | return false; |
| + | } |
| + | |
| + | return this._invokeParser(raw, WYMeditor.LEXER_UNMATCHED); |
| + | }; |
| + | |
| + | /** |
| + | * Sends the matched token and any leading unmatched |
| + | * text to the parser changing the lexer to a new |
| + | * mode if one is listed. |
| + | * @param string unmatched Unmatched leading portion. |
| + | * @param string matched Actual token match. |
| + | * @param string mode Mode after match. A boolean |
| + | * false mode causes no change. |
| + | * @return boolean False if there was any error |
| + | * from the parser. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._dispatchTokens = function(unmatched, matched, mode) |
| + | { |
| + | mode = mode || false; |
| + | |
| + | if (! this._invokeParser(unmatched, WYMeditor.LEXER_UNMATCHED)) { |
| + | return false; |
| + | } |
| + | |
| + | if (typeof mode == 'boolean') { |
| + | return this._invokeParser(matched, WYMeditor.LEXER_MATCHED); |
| + | } |
| + | if (this._isModeEnd(mode)) { |
| + | if (! this._invokeParser(matched, WYMeditor.LEXER_EXIT)) { |
| + | return false; |
| + | } |
| + | return this._mode.leave(); |
| + | } |
| + | if (this._isSpecialMode(mode)) { |
| + | this._mode.enter(this._decodeSpecial(mode)); |
| + | if (! this._invokeParser(matched, WYMeditor.LEXER_SPECIAL)) { |
| + | return false; |
| + | } |
| + | return this._mode.leave(); |
| + | } |
| + | this._mode.enter(mode); |
| + | |
| + | return this._invokeParser(matched, WYMeditor.LEXER_ENTER); |
| + | }; |
| + | |
| + | /** |
| + | * Tests to see if the new mode is actually to leave |
| + | * the current mode and pop an item from the matching |
| + | * mode stack. |
| + | * @param string mode Mode to test. |
| + | * @return boolean True if this is the exit mode. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._isModeEnd = function(mode) |
| + | { |
| + | return (mode === "__exit"); |
| + | }; |
| + | |
| + | /** |
| + | * Test to see if the mode is one where this mode |
| + | * is entered for this token only and automatically |
| + | * leaves immediately afterwoods. |
| + | * @param string mode Mode to test. |
| + | * @return boolean True if this is the exit mode. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._isSpecialMode = function(mode) |
| + | { |
| + | return (mode.substring(0,1) == "_"); |
| + | }; |
| + | |
| + | /** |
| + | * Strips the magic underscore marking single token |
| + | * modes. |
| + | * @param string mode Mode to decode. |
| + | * @return string Underlying mode name. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._decodeSpecial = function(mode) |
| + | { |
| + | return mode.substring(1); |
| + | }; |
| + | |
| + | /** |
| + | * Calls the parser method named after the current |
| + | * mode. Empty content will be ignored. The lexer |
| + | * has a parser handler for each mode in the lexer. |
| + | * @param string content Text parsed. |
| + | * @param boolean is_match Token is recognised rather |
| + | * than unparsed data. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._invokeParser = function(content, is_match) |
| + | { |
| + | |
| + | if (content === '') { |
| + | return true; |
| + | } |
| + | var current = this._mode.getCurrent(); |
| + | var handler = this._mode_handlers[current]; |
| + | var result; |
| + | eval('result = this._parser.' + handler + '(content, is_match);'); |
| + | return result; |
| + | }; |
| + | |
| + | /** |
| + | * Tries to match a chunk of text and if successful |
| + | * removes the recognised chunk and any leading |
| + | * unparsed data. Empty strings will not be matched. |
| + | * @param string raw The subject to parse. This is the |
| + | * content that will be eaten. |
| + | * @return array/boolean Three item list of unparsed |
| + | * content followed by the |
| + | * recognised token and finally the |
| + | * action the parser is to take. |
| + | * True if no match, false if there |
| + | * is a parsing error. |
| + | * @access private |
| + | */ |
| + | WYMeditor.Lexer.prototype._reduce = function(raw) |
| + | { |
| + | var matched = this._regexes[this._mode.getCurrent()].match(raw); |
| + | var match = matched[1]; |
| + | var action = matched[0]; |
| + | if (action) { |
| + | var unparsed_character_count = raw.indexOf(match); |
| + | var unparsed = raw.substr(0, unparsed_character_count); |
| + | raw = raw.substring(unparsed_character_count + match.length); |
| + | return [raw, unparsed, match, action]; |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | |
| + | |
| + | /** |
| + | * This are the rules for breaking the XHTML code into events |
| + | * handled by the provided parser. |
| + | * |
| + | * @author Marcus Baker (http://lastcraft.com) |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.XhtmlLexer = function(parser) |
| + | { |
| + | jQuery.extend(this, new WYMeditor.Lexer(parser, 'Text')); |
| + | |
| + | this.mapHandler('Text', 'Text'); |
| + | |
| + | this.addTokens(); |
| + | |
| + | this.init(); |
| + | |
| + | return this; |
| + | }; |
| + | |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.init = function() |
| + | { |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addTokens = function() |
| + | { |
| + | this.addCommentTokens('Text'); |
| + | this.addScriptTokens('Text'); |
| + | this.addCssTokens('Text'); |
| + | this.addTagTokens('Text'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addCommentTokens = function(scope) |
| + | { |
| + | this.addEntryPattern("<!--", scope, 'Comment'); |
| + | this.addExitPattern("-->", 'Comment'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addScriptTokens = function(scope) |
| + | { |
| + | this.addEntryPattern("<script", scope, 'Script'); |
| + | this.addExitPattern("</script>", 'Script'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addCssTokens = function(scope) |
| + | { |
| + | this.addEntryPattern("<style", scope, 'Css'); |
| + | this.addExitPattern("</style>", 'Css'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addTagTokens = function(scope) |
| + | { |
| + | this.addSpecialPattern("<\\s*[a-z0-9:\-]+\\s*>", scope, 'OpeningTag'); |
| + | this.addEntryPattern("<[a-z0-9:\-]+"+'[\\\/ \\\>]+', scope, 'OpeningTag'); |
| + | this.addInTagDeclarationTokens('OpeningTag'); |
| + | |
| + | this.addSpecialPattern("</\\s*[a-z0-9:\-]+\\s*>", scope, 'ClosingTag'); |
| + | |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addInTagDeclarationTokens = function(scope) |
| + | { |
| + | this.addSpecialPattern('\\s+', scope, 'Ignore'); |
| + | |
| + | this.addAttributeTokens(scope); |
| + | |
| + | this.addExitPattern('/>', scope); |
| + | this.addExitPattern('>', scope); |
| + | |
| + | }; |
| + | |
| + | WYMeditor.XhtmlLexer.prototype.addAttributeTokens = function(scope) |
| + | { |
| + | this.addSpecialPattern("\\s*[a-z-_0-9]*:?[a-z-_0-9]+\\s*(?=\=)\\s*", scope, 'TagAttributes'); |
| + | |
| + | this.addEntryPattern('=\\s*"', scope, 'DoubleQuotedAttribute'); |
| + | this.addPattern("\\\\\"", 'DoubleQuotedAttribute'); |
| + | this.addExitPattern('"', 'DoubleQuotedAttribute'); |
| + | |
| + | this.addEntryPattern("=\\s*'", scope, 'SingleQuotedAttribute'); |
| + | this.addPattern("\\\\'", 'SingleQuotedAttribute'); |
| + | this.addExitPattern("'", 'SingleQuotedAttribute'); |
| + | |
| + | this.addSpecialPattern('=\\s*[^>\\s]*', scope, 'UnquotedAttribute'); |
| + | }; |
| + | |
| + | |
| + | |
| + | /** |
| + | * XHTML Parser. |
| + | * |
| + | * This XHTML parser will trigger the events available on on |
| + | * current SaxListener |
| + | * |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.XhtmlParser = function(Listener, mode) |
| + | { |
| + | var mode = mode || 'Text'; |
| + | this._Lexer = new WYMeditor.XhtmlLexer(this); |
| + | this._Listener = Listener; |
| + | this._mode = mode; |
| + | this._matches = []; |
| + | this._last_match = ''; |
| + | this._current_match = ''; |
| + | |
| + | return this; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.parse = function(raw) |
| + | { |
| + | this._Lexer.parse(this.beforeParsing(raw)); |
| + | return this.afterParsing(this._Listener.getResult()); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.beforeParsing = function(raw) |
| + | { |
| + | if(raw.match(/class="MsoNormal"/) || raw.match(/ns = "urn:schemas-microsoft-com/)){ |
| + | // Usefull for cleaning up content pasted from other sources (MSWord) |
| + | this._Listener.avoidStylingTagsAndAttributes(); |
| + | } |
| + | return this._Listener.beforeParsing(raw); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.afterParsing = function(parsed) |
| + | { |
| + | if(this._Listener._avoiding_tags_implicitly){ |
| + | this._Listener.allowStylingTagsAndAttributes(); |
| + | } |
| + | return this._Listener.afterParsing(parsed); |
| + | }; |
| + | |
| + | |
| + | WYMeditor.XhtmlParser.prototype.Ignore = function(match, state) |
| + | { |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.Text = function(text) |
| + | { |
| + | this._Listener.addContent(text); |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.Comment = function(match, status) |
| + | { |
| + | return this._addNonTagBlock(match, status, 'addComment'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.Script = function(match, status) |
| + | { |
| + | return this._addNonTagBlock(match, status, 'addScript'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.Css = function(match, status) |
| + | { |
| + | return this._addNonTagBlock(match, status, 'addCss'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._addNonTagBlock = function(match, state, type) |
| + | { |
| + | switch (state){ |
| + | case WYMeditor.LEXER_ENTER: |
| + | this._non_tag = match; |
| + | break; |
| + | case WYMeditor.LEXER_UNMATCHED: |
| + | this._non_tag += match; |
| + | break; |
| + | case WYMeditor.LEXER_EXIT: |
| + | switch(type) { |
| + | case 'addComment': |
| + | this._Listener.addComment(this._non_tag+match); |
| + | break; |
| + | case 'addScript': |
| + | this._Listener.addScript(this._non_tag+match); |
| + | break; |
| + | case 'addCss': |
| + | this._Listener.addCss(this._non_tag+match); |
| + | break; |
| + | } |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.OpeningTag = function(match, state) |
| + | { |
| + | switch (state){ |
| + | case WYMeditor.LEXER_ENTER: |
| + | this._tag = this.normalizeTag(match); |
| + | this._tag_attributes = {}; |
| + | break; |
| + | case WYMeditor.LEXER_SPECIAL: |
| + | this._callOpenTagListener(this.normalizeTag(match)); |
| + | break; |
| + | case WYMeditor.LEXER_EXIT: |
| + | this._callOpenTagListener(this._tag, this._tag_attributes); |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.ClosingTag = function(match, state) |
| + | { |
| + | this._callCloseTagListener(this.normalizeTag(match)); |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._callOpenTagListener = function(tag, attributes) |
| + | { |
| + | var attributes = attributes || {}; |
| + | this.autoCloseUnclosedBeforeNewOpening(tag); |
| + | |
| + | if(this._Listener.isBlockTag(tag)){ |
| + | this._Listener._tag_stack.push(tag); |
| + | this._Listener.fixNestingBeforeOpeningBlockTag(tag, attributes); |
| + | this._Listener.openBlockTag(tag, attributes); |
| + | this._increaseOpenTagCounter(tag); |
| + | }else if(this._Listener.isInlineTag(tag)){ |
| + | this._Listener.inlineTag(tag, attributes); |
| + | }else{ |
| + | this._Listener.openUnknownTag(tag, attributes); |
| + | this._increaseOpenTagCounter(tag); |
| + | } |
| + | this._Listener.last_tag = tag; |
| + | this._Listener.last_tag_opened = true; |
| + | this._Listener.last_tag_attributes = attributes; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._callCloseTagListener = function(tag) |
| + | { |
| + | if(this._decreaseOpenTagCounter(tag)){ |
| + | this.autoCloseUnclosedBeforeTagClosing(tag); |
| + | |
| + | if(this._Listener.isBlockTag(tag)){ |
| + | var expected_tag = this._Listener._tag_stack.pop(); |
| + | if(expected_tag == false){ |
| + | return; |
| + | }else if(expected_tag != tag){ |
| + | tag = expected_tag; |
| + | } |
| + | this._Listener.closeBlockTag(tag); |
| + | }else{ |
| + | this._Listener.closeUnknownTag(tag); |
| + | } |
| + | }else{ |
| + | this._Listener.closeUnopenedTag(tag); |
| + | } |
| + | this._Listener.last_tag = tag; |
| + | this._Listener.last_tag_opened = false; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._increaseOpenTagCounter = function(tag) |
| + | { |
| + | this._Listener._open_tags[tag] = this._Listener._open_tags[tag] || 0; |
| + | this._Listener._open_tags[tag]++; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._decreaseOpenTagCounter = function(tag) |
| + | { |
| + | if(this._Listener._open_tags[tag]){ |
| + | this._Listener._open_tags[tag]--; |
| + | if(this._Listener._open_tags[tag] == 0){ |
| + | this._Listener._open_tags[tag] = undefined; |
| + | } |
| + | return true; |
| + | } |
| + | return false; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeNewOpening = function(new_tag) |
| + | { |
| + | this._autoCloseUnclosed(new_tag, false); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeTagClosing = function(tag) |
| + | { |
| + | this._autoCloseUnclosed(tag, true); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype._autoCloseUnclosed = function(new_tag, closing) |
| + | { |
| + | var closing = closing || false; |
| + | if(this._Listener._open_tags){ |
| + | for (var tag in this._Listener._open_tags) { |
| + | var counter = this._Listener._open_tags[tag]; |
| + | if(counter > 0 && this._Listener.shouldCloseTagAutomatically(tag, new_tag, closing)){ |
| + | this._callCloseTagListener(tag, true); |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.getTagReplacements = function() |
| + | { |
| + | return this._Listener.getTagReplacements(); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.normalizeTag = function(tag) |
| + | { |
| + | tag = tag.replace(/^([\s<\/>]*)|([\s<\/>]*)$/gm,'').toLowerCase(); |
| + | var tags = this._Listener.getTagReplacements(); |
| + | if(tags[tag]){ |
| + | return tags[tag]; |
| + | } |
| + | return tag; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.TagAttributes = function(match, state) |
| + | { |
| + | if(WYMeditor.LEXER_SPECIAL == state){ |
| + | this._current_attribute = match; |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.DoubleQuotedAttribute = function(match, state) |
| + | { |
| + | if(WYMeditor.LEXER_UNMATCHED == state){ |
| + | this._tag_attributes[this._current_attribute] = match; |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.SingleQuotedAttribute = function(match, state) |
| + | { |
| + | if(WYMeditor.LEXER_UNMATCHED == state){ |
| + | this._tag_attributes[this._current_attribute] = match; |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlParser.prototype.UnquotedAttribute = function(match, state) |
| + | { |
| + | this._tag_attributes[this._current_attribute] = match.replace(/^=/,''); |
| + | return true; |
| + | }; |
| + | |
| + | |
| + | |
| + | /** |
| + | * XHTML Sax parser. |
| + | * |
| + | * @author Bermi Ferrer (http://bermi.org) |
| + | */ |
| + | WYMeditor.XhtmlSaxListener = function() |
| + | { |
| + | this.output = ''; |
| + | this.helper = new WYMeditor.XmlHelper(); |
| + | this._open_tags = {}; |
| + | this.validator = WYMeditor.XhtmlValidator; |
| + | this._tag_stack = []; |
| + | this.avoided_tags = []; |
| + | |
| + | this.entities = { |
| + | ' ':' ','¡':'¡','¢':'¢', |
| + | '£':'£','¤':'¤','¥':'¥', |
| + | '¦':'¦','§':'§','¨':'¨', |
| + | '©':'©','ª':'ª','«':'«', |
| + | '¬':'¬','­':'­','®':'®', |
| + | '¯':'¯','°':'°','±':'±', |
| + | '²':'²','³':'³','´':'´', |
| + | 'µ':'µ','¶':'¶','·':'·', |
| + | '¸':'¸','¹':'¹','º':'º', |
| + | '»':'»','¼':'¼','½':'½', |
| + | '¾':'¾','¿':'¿','À':'À', |
| + | 'Á':'Á','Â':'Â','Ã':'Ã', |
| + | 'Ä':'Ä','Å':'Å','Æ':'Æ', |
| + | 'Ç':'Ç','È':'È','É':'É', |
| + | 'Ê':'Ê','Ë':'Ë','Ì':'Ì', |
| + | 'Í':'Í','Î':'Î','Ï':'Ï', |
| + | 'Ð':'Ð','Ñ':'Ñ','Ò':'Ò', |
| + | 'Ó':'Ó','Ô':'Ô','Õ':'Õ', |
| + | 'Ö':'Ö','×':'×','Ø':'Ø', |
| + | 'Ù':'Ù','Ú':'Ú','Û':'Û', |
| + | 'Ü':'Ü','Ý':'Ý','Þ':'Þ', |
| + | 'ß':'ß','à':'à','á':'á', |
| + | 'â':'â','ã':'ã','ä':'ä', |
| + | 'å':'å','æ':'æ','ç':'ç', |
| + | 'è':'è','é':'é','ê':'ê', |
| + | 'ë':'ë','ì':'ì','í':'í', |
| + | 'î':'î','ï':'ï','ð':'ð', |
| + | 'ñ':'ñ','ò':'ò','ó':'ó', |
| + | 'ô':'ô','õ':'õ','ö':'ö', |
| + | '÷':'÷','ø':'ø','ù':'ù', |
| + | 'ú':'ú','û':'û','ü':'ü', |
| + | 'ý':'ý','þ':'þ','ÿ':'ÿ', |
| + | 'Œ':'Œ','œ':'œ','Š':'Š', |
| + | 'š':'š','Ÿ':'Ÿ','ƒ':'ƒ', |
| + | 'ˆ':'ˆ','˜':'˜','Α':'Α', |
| + | 'Β':'Β','Γ':'Γ','Δ':'Δ', |
| + | 'Ε':'Ε','Ζ':'Ζ','Η':'Η', |
| + | 'Θ':'Θ','Ι':'Ι','Κ':'Κ', |
| + | 'Λ':'Λ','Μ':'Μ','Ν':'Ν', |
| + | 'Ξ':'Ξ','Ο':'Ο','Π':'Π', |
| + | 'Ρ':'Ρ','Σ':'Σ','Τ':'Τ', |
| + | 'Υ':'Υ','Φ':'Φ','Χ':'Χ', |
| + | 'Ψ':'Ψ','Ω':'Ω','α':'α', |
| + | 'β':'β','γ':'γ','δ':'δ', |
| + | 'ε':'ε','ζ':'ζ','η':'η', |
| + | 'θ':'θ','ι':'ι','κ':'κ', |
| + | 'λ':'λ','μ':'μ','ν':'ν', |
| + | 'ξ':'ξ','ο':'ο','π':'π', |
| + | 'ρ':'ρ','ς':'ς','σ':'σ', |
| + | 'τ':'τ','υ':'υ','φ':'φ', |
| + | 'χ':'χ','ψ':'ψ','ω':'ω', |
| + | 'ϑ':'ϑ','ϒ':'ϒ','ϖ':'ϖ', |
| + | ' ':' ',' ':' ',' ':' ', |
| + | '‌':'‌','‍':'‍','‎':'‎', |
| + | '‏':'‏','–':'–','—':'—', |
| + | '‘':'‘','’':'’','‚':'‚', |
| + | '“':'“','”':'”','„':'„', |
| + | '†':'†','‡':'‡','•':'•', |
| + | '…':'…','‰':'‰','′':'′', |
| + | '″':'″','‹':'‹','›':'›', |
| + | '‾':'‾','⁄':'⁄','€':'€', |
| + | 'ℑ':'ℑ','℘':'℘','ℜ':'ℜ', |
| + | '™':'™','ℵ':'ℵ','←':'←', |
| + | '↑':'↑','→':'→','↓':'↓', |
| + | '↔':'↔','↵':'↵','⇐':'⇐', |
| + | '⇑':'⇑','⇒':'⇒','⇓':'⇓', |
| + | '⇔':'⇔','∀':'∀','∂':'∂', |
| + | '∃':'∃','∅':'∅','∇':'∇', |
| + | '∈':'∈','∉':'∉','∋':'∋', |
| + | '∏':'∏','∑':'∑','−':'−', |
| + | '∗':'∗','√':'√','∝':'∝', |
| + | '∞':'∞','∠':'∠','∧':'∧', |
| + | '∨':'∨','∩':'∩','∪':'∪', |
| + | '∫':'∫','∴':'∴','∼':'∼', |
| + | '≅':'≅','≈':'≈','≠':'≠', |
| + | '≡':'≡','≤':'≤','≥':'≥', |
| + | '⊂':'⊂','⊃':'⊃','⊄':'⊄', |
| + | '⊆':'⊆','⊇':'⊇','⊕':'⊕', |
| + | '⊗':'⊗','⊥':'⊥','⋅':'⋅', |
| + | '⌈':'⌈','⌉':'⌉','⌊':'⌊', |
| + | '⌋':'⌋','⟨':'〈','⟩':'〉', |
| + | '◊':'◊','♠':'♠','♣':'♣', |
| + | '♥':'♥','♦':'♦'}; |
| + | |
| + | this.block_tags = ["a", "abbr", "acronym", "address", "area", "b", |
| + | "base", "bdo", "big", "blockquote", "body", "button", |
| + | "caption", "cite", "code", "col", "colgroup", "dd", "del", "div", |
| + | "dfn", "dl", "dt", "em", "fieldset", "form", "head", "h1", "h2", |
| + | "h3", "h4", "h5", "h6", "html", "i", "ins", |
| + | "kbd", "label", "legend", "li", "map", "noscript", |
| + | "object", "ol", "optgroup", "option", "p", "param", "pre", "q", |
| + | "samp", "script", "select", "small", "span", "strong", "style", |
| + | "sub", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", |
| + | "thead", "title", "tr", "tt", "ul", "var", "extends"]; |
| + | |
| + | |
| + | this.inline_tags = ["br", "hr", "img", "input"]; |
| + | |
| + | return this; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.shouldCloseTagAutomatically = function(tag, now_on_tag, closing) |
| + | { |
| + | var closing = closing || false; |
| + | if(tag == 'td'){ |
| + | if((closing && now_on_tag == 'tr') || (!closing && now_on_tag == 'td')){ |
| + | return true; |
| + | } |
| + | } |
| + | if(tag == 'option'){ |
| + | if((closing && now_on_tag == 'select') || (!closing && now_on_tag == 'option')){ |
| + | return true; |
| + | } |
| + | } |
| + | return false; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.beforeParsing = function(raw) |
| + | { |
| + | this.output = ''; |
| + | return raw; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.afterParsing = function(xhtml) |
| + | { |
| + | xhtml = this.replaceNamedEntities(xhtml); |
| + | xhtml = this.joinRepeatedEntities(xhtml); |
| + | xhtml = this.removeEmptyTags(xhtml); |
| + | xhtml = this.removeBrInPre(xhtml); |
| + | return xhtml; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.replaceNamedEntities = function(xhtml) |
| + | { |
| + | for (var entity in this.entities) { |
| + | xhtml = xhtml.replace(new RegExp(entity, 'g'), this.entities[entity]); |
| + | } |
| + | return xhtml; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.joinRepeatedEntities = function(xhtml) |
| + | { |
| + | var tags = 'em|strong|sub|sup|acronym|pre|del|address'; |
| + | return xhtml.replace(new RegExp('<\/('+tags+')><\\1>' ,''),''). |
| + | replace(new RegExp('(\s*<('+tags+')>\s*){2}(.*)(\s*<\/\\2>\s*){2}' ,''),'<\$2>\$3<\$2>'); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.removeEmptyTags = function(xhtml) |
| + | { |
| + | return xhtml.replace(new RegExp('<('+this.block_tags.join("|").replace(/\|td/,'').replace(/\|th/, '')+')>(<br \/>| | |\\s)*<\/\\1>' ,'g'),''); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.removeBrInPre = function(xhtml) |
| + | { |
| + | var matches = xhtml.match(new RegExp('<pre[^>]*>(.*?)<\/pre>','gmi')); |
| + | if(matches) { |
| + | for(var i=0; i<matches.length; i++) { |
| + | xhtml = xhtml.replace(matches[i], matches[i].replace(new RegExp('<br \/>', 'g'), String.fromCharCode(13,10))); |
| + | } |
| + | } |
| + | return xhtml; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.getResult = function() |
| + | { |
| + | return this.output; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.getTagReplacements = function() |
| + | { |
| + | return {'b':'strong', 'i':'em'}; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.addContent = function(text) |
| + | { |
| + | this.output += text; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.addComment = function(text) |
| + | { |
| + | if(this.remove_comments){ |
| + | this.output += text; |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.addScript = function(text) |
| + | { |
| + | if(!this.remove_scripts){ |
| + | this.output += text; |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.addCss = function(text) |
| + | { |
| + | if(!this.remove_embeded_styles){ |
| + | this.output += text; |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.openBlockTag = function(tag, attributes) |
| + | { |
| + | this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes), true); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.inlineTag = function(tag, attributes) |
| + | { |
| + | this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes)); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.openUnknownTag = function(tag, attributes) |
| + | { |
| + | //this.output += this.helper.tag(tag, attributes, true); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.closeBlockTag = function(tag) |
| + | { |
| + | this.output = this.output.replace(/<br \/>$/, '')+this._getClosingTagContent('before', tag)+"</"+tag+">"+this._getClosingTagContent('after', tag); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.closeUnknownTag = function(tag) |
| + | { |
| + | //this.output += "</"+tag+">"; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.closeUnopenedTag = function(tag) |
| + | { |
| + | this.output += "</"+tag+">"; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.avoidStylingTagsAndAttributes = function() |
| + | { |
| + | this.avoided_tags = ['div','span']; |
| + | this.validator.skiped_attributes = ['style']; |
| + | this.validator.skiped_attribute_values = ['MsoNormal','main1']; // MS Word attributes for class |
| + | this._avoiding_tags_implicitly = true; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.allowStylingTagsAndAttributes = function() |
| + | { |
| + | this.avoided_tags = []; |
| + | this.validator.skiped_attributes = []; |
| + | this.validator.skiped_attribute_values = []; |
| + | this._avoiding_tags_implicitly = false; |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.isBlockTag = function(tag) |
| + | { |
| + | return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.block_tags, tag); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.isInlineTag = function(tag) |
| + | { |
| + | return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.inline_tags, tag); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.insertContentAfterClosingTag = function(tag, content) |
| + | { |
| + | this._insertContentWhenClosingTag('after', tag, content); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.insertContentBeforeClosingTag = function(tag, content) |
| + | { |
| + | this._insertContentWhenClosingTag('before', tag, content); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype.fixNestingBeforeOpeningBlockTag = function(tag, attributes) |
| + | { |
| + | if(tag != 'li' && (tag == 'ul' || tag == 'ol') && this.last_tag && !this.last_tag_opened && this.last_tag == 'li'){ |
| + | this.output = this.output.replace(/<\/li>$/, ''); |
| + | this.insertContentAfterClosingTag(tag, '</li>'); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype._insertContentWhenClosingTag = function(position, tag, content) |
| + | { |
| + | if(!this['_insert_'+position+'_closing']){ |
| + | this['_insert_'+position+'_closing'] = []; |
| + | } |
| + | if(!this['_insert_'+position+'_closing'][tag]){ |
| + | this['_insert_'+position+'_closing'][tag] = []; |
| + | } |
| + | this['_insert_'+position+'_closing'][tag].push(content); |
| + | }; |
| + | |
| + | WYMeditor.XhtmlSaxListener.prototype._getClosingTagContent = function(position, tag) |
| + | { |
| + | if( this['_insert_'+position+'_closing'] && |
| + | this['_insert_'+position+'_closing'][tag] && |
| + | this['_insert_'+position+'_closing'][tag].length > 0){ |
| + | return this['_insert_'+position+'_closing'][tag].pop(); |
| + | } |
| + | return ''; |
| + | }; |
| + | |
| + | |
| + | /********** CSS PARSER **********/ |
| + | |
| + | |
| + | WYMeditor.WymCssLexer = function(parser, only_wym_blocks) |
| + | { |
| + | var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? true : only_wym_blocks); |
| + | |
| + | jQuery.extend(this, new WYMeditor.Lexer(parser, (only_wym_blocks?'Ignore':'WymCss'))); |
| + | |
| + | this.mapHandler('WymCss', 'Ignore'); |
| + | |
| + | if(only_wym_blocks == true){ |
| + | this.addEntryPattern("/\\\x2a[<\\s]*WYMeditor[>\\s]*\\\x2a/", 'Ignore', 'WymCss'); |
| + | this.addExitPattern("/\\\x2a[<\/\\s]*WYMeditor[>\\s]*\\\x2a/", 'WymCss'); |
| + | } |
| + | |
| + | this.addSpecialPattern("[\\sa-z1-6]*\\\x2e[a-z-_0-9]+", 'WymCss', 'WymCssStyleDeclaration'); |
| + | |
| + | this.addEntryPattern("/\\\x2a", 'WymCss', 'WymCssComment'); |
| + | this.addExitPattern("\\\x2a/", 'WymCssComment'); |
| + | |
| + | this.addEntryPattern("\x7b", 'WymCss', 'WymCssStyle'); |
| + | this.addExitPattern("\x7d", 'WymCssStyle'); |
| + | |
| + | this.addEntryPattern("/\\\x2a", 'WymCssStyle', 'WymCssFeedbackStyle'); |
| + | this.addExitPattern("\\\x2a/", 'WymCssFeedbackStyle'); |
| + | |
| + | return this; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser = function() |
| + | { |
| + | this._in_style = false; |
| + | this._has_title = false; |
| + | this.only_wym_blocks = true; |
| + | this.css_settings = {'classesItems':[], 'editorStyles':[], 'dialogStyles':[]}; |
| + | return this; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.parse = function(raw, only_wym_blocks) |
| + | { |
| + | var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? this.only_wym_blocks : only_wym_blocks); |
| + | this._Lexer = new WYMeditor.WymCssLexer(this, only_wym_blocks); |
| + | this._Lexer.parse(raw); |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.Ignore = function(match, state) |
| + | { |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.WymCssComment = function(text, status) |
| + | { |
| + | if(text.match(/end[a-z0-9\s]*wym[a-z0-9\s]*/mi)){ |
| + | return false; |
| + | } |
| + | if(status == WYMeditor.LEXER_UNMATCHED){ |
| + | if(!this._in_style){ |
| + | this._has_title = true; |
| + | this._current_item = {'title':WYMeditor.Helper.trim(text)}; |
| + | }else{ |
| + | if(this._current_item[this._current_element]){ |
| + | if(!this._current_item[this._current_element].expressions){ |
| + | this._current_item[this._current_element].expressions = [text]; |
| + | }else{ |
| + | this._current_item[this._current_element].expressions.push(text); |
| + | } |
| + | } |
| + | } |
| + | this._in_style = true; |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.WymCssStyle = function(match, status) |
| + | { |
| + | if(status == WYMeditor.LEXER_UNMATCHED){ |
| + | match = WYMeditor.Helper.trim(match); |
| + | if(match != ''){ |
| + | this._current_item[this._current_element].style = match; |
| + | } |
| + | }else if (status == WYMeditor.LEXER_EXIT){ |
| + | this._in_style = false; |
| + | this._has_title = false; |
| + | this.addStyleSetting(this._current_item); |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.WymCssFeedbackStyle = function(match, status) |
| + | { |
| + | if(status == WYMeditor.LEXER_UNMATCHED){ |
| + | this._current_item[this._current_element].feedback_style = match.replace(/^([\s\/\*]*)|([\s\/\*]*)$/gm,''); |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.WymCssStyleDeclaration = function(match) |
| + | { |
| + | match = match.replace(/^([\s\.]*)|([\s\.*]*)$/gm, ''); |
| + | |
| + | var tag = ''; |
| + | if(match.indexOf('.') > 0){ |
| + | var parts = match.split('.'); |
| + | this._current_element = parts[1]; |
| + | var tag = parts[0]; |
| + | }else{ |
| + | this._current_element = match; |
| + | } |
| + | |
| + | if(!this._has_title){ |
| + | this._current_item = {'title':(!tag?'':tag.toUpperCase()+': ')+this._current_element}; |
| + | this._has_title = true; |
| + | } |
| + | |
| + | if(!this._current_item[this._current_element]){ |
| + | this._current_item[this._current_element] = {'name':this._current_element}; |
| + | } |
| + | if(tag){ |
| + | if(!this._current_item[this._current_element].tags){ |
| + | this._current_item[this._current_element].tags = [tag]; |
| + | }else{ |
| + | this._current_item[this._current_element].tags.push(tag); |
| + | } |
| + | } |
| + | return true; |
| + | }; |
| + | |
| + | WYMeditor.WymCssParser.prototype.addStyleSetting = function(style_details) |
| + | { |
| + | for (var name in style_details){ |
| + | var details = style_details[name]; |
| + | if(typeof details == 'object' && name != 'title'){ |
| + | |
| + | this.css_settings.classesItems.push({ |
| + | 'name': WYMeditor.Helper.trim(details.name), |
| + | 'title': style_details.title, |
| + | 'expr' : WYMeditor.Helper.trim((details.expressions||details.tags).join(', ')) |
| + | }); |
| + | if(details.feedback_style){ |
| + | this.css_settings.editorStyles.push({ |
| + | 'name': '.'+ WYMeditor.Helper.trim(details.name), |
| + | 'css': details.feedback_style |
| + | }); |
| + | } |
| + | if(details.style){ |
| + | this.css_settings.dialogStyles.push({ |
| + | 'name': '.'+ WYMeditor.Helper.trim(details.name), |
| + | 'css': details.style |
| + | }); |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | /********** HELPERS **********/ |
| + | |
| + | // Returns true if it is a text node with whitespaces only |
| + | jQuery.fn.isPhantomNode = function() { |
| + | if (this[0].nodeType == 3) |
| + | return !(/[^\t\n\r ]/.test(this[0].data)); |
| + | |
| + | return false; |
| + | }; |
| + | |
| + | WYMeditor.isPhantomNode = function(n) { |
| + | if (n.nodeType == 3) |
| + | return !(/[^\t\n\r ]/.test(n.data)); |
| + | |
| + | return false; |
| + | }; |
| + | |
| + | WYMeditor.isPhantomString = function(str) { |
| + | return !(/[^\t\n\r ]/.test(str)); |
| + | }; |
| + | |
| + | // Returns the Parents or the node itself |
| + | // jqexpr = a jQuery expression |
| + | jQuery.fn.parentsOrSelf = function(jqexpr) { |
| + | var n = this; |
| + | |
| + | if (n[0].nodeType == 3) |
| + | n = n.parents().slice(0,1); |
| + | |
| + | // if (n.is(jqexpr)) // XXX should work, but doesn't (probably a jQuery bug) |
| + | if (n.filter(jqexpr).size() == 1) |
| + | return n; |
| + | else |
| + | return n.parents(jqexpr).slice(0,1); |
| + | }; |
| + | |
| + | // String & array helpers |
| + | |
| + | WYMeditor.Helper = { |
| + | |
| + | //replace all instances of 'old' by 'rep' in 'str' string |
| + | replaceAll: function(str, old, rep) { |
| + | var rExp = new RegExp(old, "g"); |
| + | return(str.replace(rExp, rep)); |
| + | }, |
| + | |
| + | //insert 'inserted' at position 'pos' in 'str' string |
| + | insertAt: function(str, inserted, pos) { |
| + | return(str.substr(0,pos) + inserted + str.substring(pos)); |
| + | }, |
| + | |
| + | //trim 'str' string |
| + | trim: function(str) { |
| + | return str.replace(/^(\s*)|(\s*)$/gm,''); |
| + | }, |
| + | |
| + | //return true if 'arr' array contains 'elem', or false |
| + | contains: function(arr, elem) { |
| + | for (var i = 0; i < arr.length; i++) { |
| + | if (arr[i] === elem) return true; |
| + | } |
| + | return false; |
| + | }, |
| + | |
| + | //return 'item' position in 'arr' array, or -1 |
| + | indexOf: function(arr, item) { |
| + | var ret=-1; |
| + | for(var i = 0; i < arr.length; i++) { |
| + | if (arr[i] == item) { |
| + | ret = i; |
| + | break; |
| + | } |
| + | } |
| + | return(ret); |
| + | }, |
| + | |
| + | //return 'item' object in 'arr' array, checking its 'name' property, or null |
| + | findByName: function(arr, name) { |
| + | for(var i = 0; i < arr.length; i++) { |
| + | var item = arr[i]; |
| + | if(item.name == name) return(item); |
| + | } |
| + | return(null); |
| + | } |
| + | }; |
| + | |
| + | |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.explorer.js |
| + | * MSIE specific class and functions. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | * Bermi Ferrer (wymeditor a-t bermi dotorg) |
| + | * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom) |
| + | * Jonatan Lundin (jonatan.lundin a-t gmail dotcom) |
| + | */ |
| + | |
| + | WYMeditor.WymClassExplorer = function(wym) { |
| + | |
| + | this._wym = wym; |
| + | this._class = "className"; |
| + | this._newLine = "\r\n"; |
| + | |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) { |
| + | |
| + | //This function is executed twice, though it is called once! |
| + | //But MSIE needs that, otherwise designMode won't work. |
| + | //Weird. |
| + | |
| + | this._iframe = iframe; |
| + | this._doc = iframe.contentWindow.document; |
| + | |
| + | //add css rules from options |
| + | var styles = this._doc.styleSheets[0]; |
| + | var aCss = eval(this._options.editorStyles); |
| + | |
| + | this.addCssRules(this._doc, aCss); |
| + | |
| + | this._doc.title = this._wym._index; |
| + | |
| + | //set the text direction |
| + | jQuery('html', this._doc).attr('dir', this._options.direction); |
| + | |
| + | //init html value |
| + | jQuery(this._doc.body).html(this._wym._html); |
| + | |
| + | //handle events |
| + | var wym = this; |
| + | |
| + | this._doc.body.onfocus = function() |
| + | {wym._doc.designMode = "on"; wym._doc = iframe.contentWindow.document;}; |
| + | this._doc.onbeforedeactivate = function() {wym.saveCaret();}; |
| + | this._doc.onkeyup = function() { |
| + | wym.saveCaret(); |
| + | wym.keyup(); |
| + | }; |
| + | this._doc.onclick = function() {wym.saveCaret();}; |
| + | |
| + | this._doc.body.onbeforepaste = function() { |
| + | wym._iframe.contentWindow.event.returnValue = false; |
| + | }; |
| + | |
| + | this._doc.body.onpaste = function() { |
| + | wym._iframe.contentWindow.event.returnValue = false; |
| + | wym.paste(window.clipboardData.getData("Text")); |
| + | }; |
| + | |
| + | //callback can't be executed twice, so we check |
| + | if(this._initialized) { |
| + | |
| + | //pre-bind functions |
| + | if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this); |
| + | |
| + | //bind external events |
| + | this._wym.bindEvents(); |
| + | |
| + | //post-init functions |
| + | if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this); |
| + | |
| + | //add event listeners to doc elements, e.g. images |
| + | this.listen(); |
| + | } |
| + | |
| + | this._initialized = true; |
| + | |
| + | //init designMode |
| + | this._doc.designMode="on"; |
| + | try{ |
| + | // (bermi's note) noticed when running unit tests on IE6 |
| + | // Is this really needed, it trigger an unexisting property on IE6 |
| + | this._doc = iframe.contentWindow.document; |
| + | }catch(e){} |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) { |
| + | |
| + | switch(cmd) { |
| + | |
| + | case WYMeditor.INDENT: case WYMeditor.OUTDENT: |
| + | |
| + | var container = this.findUp(this.container(), WYMeditor.LI); |
| + | if(container) { |
| + | var ancestor = container.parentNode.parentNode; |
| + | if(container.parentNode.childNodes.length>1 |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.OL |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.UL) |
| + | this._doc.execCommand(cmd); |
| + | } |
| + | break; |
| + | default: |
| + | if(param) this._doc.execCommand(cmd,false,param); |
| + | else this._doc.execCommand(cmd); |
| + | break; |
| + | } |
| + | |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.selected = function() { |
| + | |
| + | var caretPos = this._iframe.contentWindow.document.caretPos; |
| + | if(caretPos!=null) { |
| + | if(caretPos.parentElement!=undefined) |
| + | return(caretPos.parentElement()); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.saveCaret = function() { |
| + | |
| + | this._doc.caretPos = this._doc.selection.createRange(); |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.addCssRule = function(styles, oCss) { |
| + | |
| + | styles.addRule(oCss.name, oCss.css); |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.insert = function(html) { |
| + | |
| + | // Get the current selection |
| + | var range = this._doc.selection.createRange(); |
| + | |
| + | // Check if the current selection is inside the editor |
| + | if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) { |
| + | try { |
| + | // Overwrite selection with provided html |
| + | range.pasteHTML(html); |
| + | } catch (e) { } |
| + | } else { |
| + | // Fall back to the internal paste function if there's no selection |
| + | this.paste(html); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.wrap = function(left, right) { |
| + | |
| + | // Get the current selection |
| + | var range = this._doc.selection.createRange(); |
| + | |
| + | // Check if the current selection is inside the editor |
| + | if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) { |
| + | try { |
| + | // Overwrite selection with provided html |
| + | range.pasteHTML(left + range.text + right); |
| + | } catch (e) { } |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.unwrap = function() { |
| + | |
| + | // Get the current selection |
| + | var range = this._doc.selection.createRange(); |
| + | |
| + | // Check if the current selection is inside the editor |
| + | if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) { |
| + | try { |
| + | // Unwrap selection |
| + | var text = range.text; |
| + | this._exec( 'Cut' ); |
| + | range.pasteHTML( text ); |
| + | } catch (e) { } |
| + | } |
| + | }; |
| + | |
| + | //keyup handler |
| + | WYMeditor.WymClassExplorer.prototype.keyup = function() { |
| + | this._selected_image = null; |
| + | }; |
| + | |
| + | WYMeditor.WymClassExplorer.prototype.setFocusToNode = function(node, toStart) { |
| + | var range = this._doc.selection.createRange(); |
| + | toStart = toStart ? true : false; |
| + | |
| + | range.moveToElementText(node); |
| + | range.collapse(toStart); |
| + | range.select(); |
| + | node.focus(); |
| + | }; |
| + | |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.mozilla.js |
| + | * Gecko specific class and functions. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | * Volker Mische (vmx a-t gmx dotde) |
| + | * Bermi Ferrer (wymeditor a-t bermi dotorg) |
| + | * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom) |
| + | * Jonatan Lundin (jonatan.lundin a-t gmail dotcom) |
| + | */ |
| + | |
| + | WYMeditor.WymClassMozilla = function(wym) { |
| + | |
| + | this._wym = wym; |
| + | this._class = "class"; |
| + | this._newLine = "\n"; |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) { |
| + | var wym = this; |
| + | |
| + | this._iframe = iframe; |
| + | this._doc = iframe.contentDocument; |
| + | |
| + | //add css rules from options |
| + | |
| + | var styles = this._doc.styleSheets[0]; |
| + | var aCss = eval(this._options.editorStyles); |
| + | |
| + | this.addCssRules(this._doc, aCss); |
| + | |
| + | this._doc.title = this._wym._index; |
| + | |
| + | //set the text direction |
| + | jQuery('html', this._doc).attr('dir', this._options.direction); |
| + | |
| + | //init html value |
| + | this.html(this._wym._html); |
| + | |
| + | //init designMode |
| + | this.enableDesignMode(); |
| + | |
| + | //pre-bind functions |
| + | if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this); |
| + | |
| + | //bind external events |
| + | this._wym.bindEvents(); |
| + | |
| + | //bind editor keydown events |
| + | jQuery(this._doc).bind("keydown", this.keydown); |
| + | |
| + | //bind editor keyup events |
| + | jQuery(this._doc).bind("keyup", this.keyup); |
| + | |
| + | //bind editor focus events (used to reset designmode - Gecko bug) |
| + | jQuery(this._doc).bind("focus", function () { |
| + | // Fix scope |
| + | wym.enableDesignMode.call(wym); |
| + | }); |
| + | |
| + | //post-init functions |
| + | if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this); |
| + | |
| + | //add event listeners to doc elements, e.g. images |
| + | this.listen(); |
| + | }; |
| + | |
| + | /* @name html |
| + | * @description Get/Set the html value |
| + | */ |
| + | WYMeditor.WymClassMozilla.prototype.html = function(html) { |
| + | |
| + | if(typeof html === 'string') { |
| + | |
| + | //disable designMode |
| + | try { this._doc.designMode = "off"; } catch(e) { }; |
| + | |
| + | //replace em by i and strong by bold |
| + | //(designMode issue) |
| + | html = html.replace(/<em(\b[^>]*)>/gi, "<i$1>") |
| + | .replace(/<\/em>/gi, "</i>") |
| + | .replace(/<strong(\b[^>]*)>/gi, "<b$1>") |
| + | .replace(/<\/strong>/gi, "</b>"); |
| + | |
| + | //update the html body |
| + | jQuery(this._doc.body).html(html); |
| + | |
| + | //re-init designMode |
| + | this.enableDesignMode(); |
| + | } |
| + | else return(jQuery(this._doc.body).html()); |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) { |
| + | |
| + | if(!this.selected()) return(false); |
| + | |
| + | switch(cmd) { |
| + | |
| + | case WYMeditor.INDENT: case WYMeditor.OUTDENT: |
| + | |
| + | var focusNode = this.selected(); |
| + | var sel = this._iframe.contentWindow.getSelection(); |
| + | var anchorNode = sel.anchorNode; |
| + | if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode; |
| + | |
| + | focusNode = this.findUp(focusNode, WYMeditor.BLOCKS); |
| + | anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS); |
| + | |
| + | if(focusNode && focusNode == anchorNode |
| + | && focusNode.tagName.toLowerCase() == WYMeditor.LI) { |
| + | |
| + | var ancestor = focusNode.parentNode.parentNode; |
| + | |
| + | if(focusNode.parentNode.childNodes.length>1 |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.OL |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.UL) |
| + | this._doc.execCommand(cmd,'',null); |
| + | } |
| + | |
| + | break; |
| + | |
| + | default: |
| + | |
| + | if(param) this._doc.execCommand(cmd,'',param); |
| + | else this._doc.execCommand(cmd,'',null); |
| + | } |
| + | |
| + | //set to P if parent = BODY |
| + | var container = this.selected(); |
| + | if(container.tagName.toLowerCase() == WYMeditor.BODY) |
| + | this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); |
| + | }; |
| + | |
| + | /* @name selected |
| + | * @description Returns the selected container |
| + | */ |
| + | WYMeditor.WymClassMozilla.prototype.selected = function() { |
| + | |
| + | var sel = this._iframe.contentWindow.getSelection(); |
| + | var node = sel.focusNode; |
| + | if(node) { |
| + | if(node.nodeName == "#text") return(node.parentNode); |
| + | else return(node); |
| + | } else return(null); |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype.addCssRule = function(styles, oCss) { |
| + | |
| + | styles.insertRule(oCss.name + " {" + oCss.css + "}", |
| + | styles.cssRules.length); |
| + | }; |
| + | |
| + | |
| + | //keydown handler, mainly used for keyboard shortcuts |
| + | WYMeditor.WymClassMozilla.prototype.keydown = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | var container = null; |
| + | |
| + | if(evt.ctrlKey){ |
| + | if(evt.keyCode == 66){ |
| + | //CTRL+b => STRONG |
| + | wym._exec(WYMeditor.BOLD); |
| + | return false; |
| + | } |
| + | if(evt.keyCode == 73){ |
| + | //CTRL+i => EMPHASIS |
| + | wym._exec(WYMeditor.ITALIC); |
| + | return false; |
| + | } |
| + | } |
| + | |
| + | else if(evt.keyCode == 13) { |
| + | if(!evt.shiftKey){ |
| + | //fix PRE bug #73 |
| + | container = wym.selected(); |
| + | if(container && container.tagName.toLowerCase() == WYMeditor.PRE) { |
| + | evt.preventDefault(); |
| + | wym.insert('<p></p>'); |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | //keyup handler, mainly used for cleanups |
| + | WYMeditor.WymClassMozilla.prototype.keyup = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | |
| + | wym._selected_image = null; |
| + | var container = null; |
| + | |
| + | if(evt.keyCode == 13 && !evt.shiftKey) { |
| + | |
| + | //RETURN key |
| + | //cleanup <br><br> between paragraphs |
| + | jQuery(wym._doc.body).children(WYMeditor.BR).remove(); |
| + | } |
| + | |
| + | if(evt.keyCode != 8 |
| + | && evt.keyCode != 17 |
| + | && evt.keyCode != 46 |
| + | && evt.keyCode != 224 |
| + | && !evt.metaKey |
| + | && !evt.ctrlKey) { |
| + | |
| + | //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND |
| + | //text nodes replaced by P |
| + | |
| + | container = wym.selected(); |
| + | var name = container.tagName.toLowerCase(); |
| + | |
| + | //fix forbidden main containers |
| + | if( |
| + | name == "strong" || |
| + | name == "b" || |
| + | name == "em" || |
| + | name == "i" || |
| + | name == "sub" || |
| + | name == "sup" || |
| + | name == "a" |
| + | |
| + | ) name = container.parentNode.tagName.toLowerCase(); |
| + | |
| + | if(name == WYMeditor.BODY) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype.enableDesignMode = function() { |
| + | if(this._doc.designMode == "off") { |
| + | try { |
| + | this._doc.designMode = "on"; |
| + | this._doc.execCommand("styleWithCSS", '', false); |
| + | } catch(e) { } |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype.openBlockTag = function(tag, attributes) |
| + | { |
| + | var attributes = this.validator.getValidTagAttributes(tag, attributes); |
| + | |
| + | // Handle Mozilla styled spans |
| + | if(tag == 'span' && attributes.style){ |
| + | var new_tag = this.getTagForStyle(attributes.style); |
| + | if(new_tag){ |
| + | this._tag_stack.pop(); |
| + | var tag = new_tag; |
| + | this._tag_stack.push(new_tag); |
| + | attributes.style = ''; |
| + | }else{ |
| + | return; |
| + | } |
| + | } |
| + | |
| + | this.output += this.helper.tag(tag, attributes, true); |
| + | }; |
| + | |
| + | WYMeditor.WymClassMozilla.prototype.getTagForStyle = function(style) { |
| + | |
| + | if(/bold/.test(style)) return 'strong'; |
| + | if(/italic/.test(style)) return 'em'; |
| + | if(/sub/.test(style)) return 'sub'; |
| + | if(/super/.test(style)) return 'sup'; |
| + | return false; |
| + | }; |
| + | |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.opera.js |
| + | * Opera specific class and functions. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | WYMeditor.WymClassOpera = function(wym) { |
| + | |
| + | this._wym = wym; |
| + | this._class = "class"; |
| + | this._newLine = "\r\n"; |
| + | }; |
| + | |
| + | WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) { |
| + | |
| + | this._iframe = iframe; |
| + | this._doc = iframe.contentWindow.document; |
| + | |
| + | //add css rules from options |
| + | var styles = this._doc.styleSheets[0]; |
| + | var aCss = eval(this._options.editorStyles); |
| + | |
| + | this.addCssRules(this._doc, aCss); |
| + | |
| + | this._doc.title = this._wym._index; |
| + | |
| + | //set the text direction |
| + | jQuery('html', this._doc).attr('dir', this._options.direction); |
| + | |
| + | //init designMode |
| + | this._doc.designMode = "on"; |
| + | |
| + | //init html value |
| + | this.html(this._wym._html); |
| + | |
| + | //pre-bind functions |
| + | if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this); |
| + | |
| + | //bind external events |
| + | this._wym.bindEvents(); |
| + | |
| + | //bind editor keydown events |
| + | jQuery(this._doc).bind("keydown", this.keydown); |
| + | |
| + | //bind editor events |
| + | jQuery(this._doc).bind("keyup", this.keyup); |
| + | |
| + | //post-init functions |
| + | if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this); |
| + | |
| + | //add event listeners to doc elements, e.g. images |
| + | this.listen(); |
| + | }; |
| + | |
| + | WYMeditor.WymClassOpera.prototype._exec = function(cmd,param) { |
| + | |
| + | if(param) this._doc.execCommand(cmd,false,param); |
| + | else this._doc.execCommand(cmd); |
| + | |
| + | }; |
| + | |
| + | WYMeditor.WymClassOpera.prototype.selected = function() { |
| + | |
| + | var sel=this._iframe.contentWindow.getSelection(); |
| + | var node=sel.focusNode; |
| + | if(node) { |
| + | if(node.nodeName=="#text")return(node.parentNode); |
| + | else return(node); |
| + | } else return(null); |
| + | }; |
| + | |
| + | WYMeditor.WymClassOpera.prototype.addCssRule = function(styles, oCss) { |
| + | |
| + | styles.insertRule(oCss.name + " {" + oCss.css + "}", |
| + | styles.cssRules.length); |
| + | }; |
| + | |
| + | //keydown handler |
| + | WYMeditor.WymClassOpera.prototype.keydown = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | var sel = wym._iframe.contentWindow.getSelection(); |
| + | startNode = sel.getRangeAt(0).startContainer; |
| + | |
| + | //Get a P instead of no container |
| + | if(!jQuery(startNode).parentsOrSelf( |
| + | WYMeditor.MAIN_CONTAINERS.join(","))[0] |
| + | && !jQuery(startNode).parentsOrSelf('li') |
| + | && evt.keyCode != WYMeditor.KEY.ENTER |
| + | && evt.keyCode != WYMeditor.KEY.LEFT |
| + | && evt.keyCode != WYMeditor.KEY.UP |
| + | && evt.keyCode != WYMeditor.KEY.RIGHT |
| + | && evt.keyCode != WYMeditor.KEY.DOWN |
| + | && evt.keyCode != WYMeditor.KEY.BACKSPACE |
| + | && evt.keyCode != WYMeditor.KEY.DELETE) |
| + | wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); |
| + | |
| + | }; |
| + | |
| + | //keyup handler |
| + | WYMeditor.WymClassOpera.prototype.keyup = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | wym._selected_image = null; |
| + | }; |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.safari.js |
| + | * Safari specific class and functions. |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | * Scott Lewis (lewiscot a-t gmail dotcom) |
| + | */ |
| + | |
| + | WYMeditor.WymClassSafari = function(wym) { |
| + | |
| + | this._wym = wym; |
| + | this._class = "class"; |
| + | this._newLine = "\n"; |
| + | }; |
| + | |
| + | WYMeditor.WymClassSafari.prototype.initIframe = function(iframe) { |
| + | |
| + | this._iframe = iframe; |
| + | this._doc = iframe.contentDocument; |
| + | |
| + | //add css rules from options |
| + | |
| + | var styles = this._doc.styleSheets[0]; |
| + | var aCss = eval(this._options.editorStyles); |
| + | |
| + | this.addCssRules(this._doc, aCss); |
| + | |
| + | this._doc.title = this._wym._index; |
| + | |
| + | //set the text direction |
| + | jQuery('html', this._doc).attr('dir', this._options.direction); |
| + | |
| + | //init designMode |
| + | this._doc.designMode = "on"; |
| + | |
| + | //init html value |
| + | this.html(this._wym._html); |
| + | |
| + | //pre-bind functions |
| + | if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this); |
| + | |
| + | //bind external events |
| + | this._wym.bindEvents(); |
| + | |
| + | //bind editor keydown events |
| + | jQuery(this._doc).bind("keydown", this.keydown); |
| + | |
| + | //bind editor keyup events |
| + | jQuery(this._doc).bind("keyup", this.keyup); |
| + | |
| + | //post-init functions |
| + | if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this); |
| + | |
| + | //add event listeners to doc elements, e.g. images |
| + | this.listen(); |
| + | }; |
| + | |
| + | WYMeditor.WymClassSafari.prototype._exec = function(cmd,param) { |
| + | |
| + | if(!this.selected()) return(false); |
| + | |
| + | switch(cmd) { |
| + | |
| + | case WYMeditor.INDENT: case WYMeditor.OUTDENT: |
| + | |
| + | var focusNode = this.selected(); |
| + | var sel = this._iframe.contentWindow.getSelection(); |
| + | var anchorNode = sel.anchorNode; |
| + | if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode; |
| + | |
| + | focusNode = this.findUp(focusNode, WYMeditor.BLOCKS); |
| + | anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS); |
| + | |
| + | if(focusNode && focusNode == anchorNode |
| + | && focusNode.tagName.toLowerCase() == WYMeditor.LI) { |
| + | |
| + | var ancestor = focusNode.parentNode.parentNode; |
| + | |
| + | if(focusNode.parentNode.childNodes.length>1 |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.OL |
| + | || ancestor.tagName.toLowerCase() == WYMeditor.UL) |
| + | this._doc.execCommand(cmd,'',null); |
| + | } |
| + | |
| + | break; |
| + | |
| + | case WYMeditor.INSERT_ORDEREDLIST: case WYMeditor.INSERT_UNORDEREDLIST: |
| + | |
| + | this._doc.execCommand(cmd,'',null); |
| + | |
| + | //Safari creates lists in e.g. paragraphs. |
| + | //Find the container, and remove it. |
| + | var focusNode = this.selected(); |
| + | var container = this.findUp(focusNode, WYMeditor.MAIN_CONTAINERS); |
| + | if(container) jQuery(container).replaceWith(jQuery(container).html()); |
| + | |
| + | break; |
| + | |
| + | default: |
| + | |
| + | if(param) this._doc.execCommand(cmd,'',param); |
| + | else this._doc.execCommand(cmd,'',null); |
| + | } |
| + | |
| + | //set to P if parent = BODY |
| + | var container = this.selected(); |
| + | if(container && container.tagName.toLowerCase() == WYMeditor.BODY) |
| + | this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); |
| + | |
| + | }; |
| + | |
| + | /* @name selected |
| + | * @description Returns the selected container |
| + | */ |
| + | WYMeditor.WymClassSafari.prototype.selected = function() { |
| + | |
| + | var sel = this._iframe.contentWindow.getSelection(); |
| + | var node = sel.focusNode; |
| + | if(node) { |
| + | if(node.nodeName == "#text") return(node.parentNode); |
| + | else return(node); |
| + | } else return(null); |
| + | }; |
| + | |
| + | WYMeditor.WymClassSafari.prototype.addCssRule = function(styles, oCss) { |
| + | |
| + | styles.insertRule(oCss.name + " {" + oCss.css + "}", |
| + | styles.cssRules.length); |
| + | }; |
| + | |
| + | |
| + | //keydown handler, mainly used for keyboard shortcuts |
| + | WYMeditor.WymClassSafari.prototype.keydown = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | |
| + | if(evt.ctrlKey){ |
| + | if(evt.keyCode == 66){ |
| + | //CTRL+b => STRONG |
| + | wym._exec(WYMeditor.BOLD); |
| + | return false; |
| + | } |
| + | if(evt.keyCode == 73){ |
| + | //CTRL+i => EMPHASIS |
| + | wym._exec(WYMeditor.ITALIC); |
| + | return false; |
| + | } |
| + | } |
| + | }; |
| + | |
| + | //keyup handler, mainly used for cleanups |
| + | WYMeditor.WymClassSafari.prototype.keyup = function(evt) { |
| + | |
| + | //'this' is the doc |
| + | var wym = WYMeditor.INSTANCES[this.title]; |
| + | |
| + | wym._selected_image = null; |
| + | var container = null; |
| + | |
| + | if(evt.keyCode == 13 && !evt.shiftKey) { |
| + | |
| + | //RETURN key |
| + | //cleanup <br><br> between paragraphs |
| + | jQuery(wym._doc.body).children(WYMeditor.BR).remove(); |
| + | |
| + | //fix PRE bug #73 |
| + | container = wym.selected(); |
| + | if(container && container.tagName.toLowerCase() == WYMeditor.PRE) |
| + | wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //create P after PRE |
| + | } |
| + | |
| + | //fix #112 |
| + | if(evt.keyCode == 13 && evt.shiftKey) { |
| + | wym._exec('InsertLineBreak'); |
| + | } |
| + | |
| + | if(evt.keyCode != 8 |
| + | && evt.keyCode != 17 |
| + | && evt.keyCode != 46 |
| + | && evt.keyCode != 224 |
| + | && !evt.metaKey |
| + | && !evt.ctrlKey) { |
| + | |
| + | //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND |
| + | //text nodes replaced by P |
| + | |
| + | container = wym.selected(); |
| + | var name = container.tagName.toLowerCase(); |
| + | |
| + | //fix forbidden main containers |
| + | if( |
| + | name == "strong" || |
| + | name == "b" || |
| + | name == "em" || |
| + | name == "i" || |
| + | name == "sub" || |
| + | name == "sup" || |
| + | name == "a" || |
| + | name == "span" //fix #110 |
| + | |
| + | ) name = container.parentNode.tagName.toLowerCase(); |
| + | |
| + | if(name == WYMeditor.BODY || name == WYMeditor.DIV) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //fix #110 for DIV |
| + | } |
| + | }; |
| + | |
| + | WYMeditor.WymClassSafari.prototype.openBlockTag = function(tag, attributes) |
| + | { |
| + | var attributes = this.validator.getValidTagAttributes(tag, attributes); |
| + | |
| + | // Handle Safari styled spans |
| + | if(tag == 'span' && attributes.style) { |
| + | var new_tag = this.getTagForStyle(attributes.style); |
| + | if(new_tag){ |
| + | this._tag_stack.pop(); |
| + | var tag = new_tag; |
| + | this._tag_stack.push(new_tag); |
| + | attributes.style = ''; |
| + | |
| + | //should fix #125 - also removed the xhtml() override |
| + | if(typeof attributes['class'] == 'string') |
| + | attributes['class'] = attributes['class'].replace(/apple-style-span/gi, ''); |
| + | |
| + | } else { |
| + | return; |
| + | } |
| + | } |
| + | |
| + | this.output += this.helper.tag(tag, attributes, true); |
| + | }; |
| + | |
| + | WYMeditor.WymClassSafari.prototype.getTagForStyle = function(style) { |
| + | |
| + | if(/bold/.test(style)) return 'strong'; |
| + | if(/italic/.test(style)) return 'em'; |
| + | if(/sub/.test(style)) return 'sub'; |
| + | if(/super/.test(style)) return 'sup'; |
| + | return false; |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/jquery.wymeditor.pack.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('if(!f)l f={};(j(){if(!2l.4O||!4O.rD){l aj=["rC","rB","rA","rz","9w","ry","3z","rx","rw","rv","ru","rt","58","rs","cK","rr"];f.4O={};1h(l i=0;i<aj.Y;++i)f.4O[aj[i]]=j(){}}V f.4O=2l.4O})();D.53(f,{rq:"0.5-rp",2w:[],7U:[],5h:[],7Z:"F",3N:"{ro}",a2:"rn",dE:"{rm}",9s:"{rl}",9r:"{rk}",eX:"dw/",7E:"3a.1b",dm:"3a.js",eW:"3H/",a1:"{rj}",eV:"1K/3R/",9q:"{ri}",9t:"{rh}",a0:"{rg}",9Z:"{rf}",9R:"{rd}",9T:"{rc}",81:"{rb}",9S:"{ra}",9X:"{r9}",9O:"{r8}",80:"{r7}",9P:"{r6}",9Y:"{r5}",9I:"{r4}",9L:"{r3}",9K:"{r2}",9J:"{r1}",82:"{r0}",9W:"{qZ}",9V:"{qY}",9p:"{qX}",9o:"{qW}",dO:"3Q",3t:"1j",an:"N",P:"p",9F:"h1",9E:"h2",9D:"h3",9C:"h4",9B:"h5",9A:"h6",5q:"41",6b:"2J",A:"a",88:"br",du:"6Q",de:"3j",6d:"4F",5l:"5I",6o:"2I",6p:"ol",6r:"li",dP:"I",9c:"1P",7C:"1U",61:"M",7B:"5b",64:"aa",7R:"a9",7Q:"a7",7P:"a5",8a:"eU",89:"eT",9d:"eM",9b:"eL",dU:"eK",7L:"qV",dT:"eJ",6t:"ai",6s:"ah",dS:"eI",4q:"qU",7O:"af",qT:"ag",ar:"eP",as:"eQ",6n:1f 6c("p","h1","h2","h3","h4","h5","h6","41","2J"),5t:1f 6c("6L","2J","N","dl","2U","1M","h1","h2","h3","h4","h5","h6","hr","8E","ol","p","41","3j","2I","dd","dt","li","8D","4F","8C","5I","8B","6P"),3T:{av:8,aA:13,qS:35,qR:36,az:37,ay:38,ax:39,aw:40,qQ:1f 6c(37,38,39,40),au:46},qP:{qO:1,qN:2,qM:3},1g:j(5C,1Q){c.3f=f.2w.1X(c)-1;c.7T=5C;c.B=1Q;c.4R=D(5C).1H();if(c.B.O)c.4R=c.B.O;c.B.4L=c.B.4L||c.dz();c.B.5i=c.B.5i||c.B.4L+f.eX+c.B.3a+\'/\';c.B.7N=c.B.7N||c.dy();c.B.9x=c.B.9x||c.B.4L+f.eW;c.B.83=c.B.83||c.B.4L+f.eV;c.B.7M=c.B.7M||c.dx();c.56()}});D.fn.5k=j(1Q){1Q=D.53({O:"",4L:J,5i:J,7N:J,83:J,7M:J,1D:J,3p:J,3a:"3R",dn:R,7F:R,3H:"en",4S:"92",1u:"<N I=\'eH\'>"+"<N I=\'qL\'>"+f.9Z+"</N>"+"<N I=\'qK\'></N>"+"<N I=\'qJ\'>"+f.9Y+f.9X+"</N>"+"<N I=\'qI\'>"+f.82+f.9W+f.9V+"</N>"+"<N I=\'qH\'>"+f.a0+"</N>"+"</N>",ec:"<a I=\'qG\' "+"1P=\'91://ex.5k.ew/\'>f</a>",4n:"<N I=\'ae 5o\'>"+"<1K "+"1U=\'"+f.a1+"qF.O\' "+"4K=\'c.1B.qE.f.2w["+f.3N+"].5w(c)\'"+"></1K>"+"</N>",3g:[],eb:"<N I=\'ad 5o\'>"+"<h2>{qD}</h2>"+"<2I>"+f.9R+"</2I>"+"</N>",e5:"<li I=\'"+f.9S+"\'><a 1P=\'#\' F=\'"+f.9T+"\' M=\'"+f.81+"\'>"+f.81+"</a></li>",e6:[{\'F\':\'eU\',\'M\':\'qC\',\'1b\':\'qB\'},{\'F\':\'eT\',\'M\':\'qA\',\'1b\':\'qz\'},{\'F\':\'eS\',\'M\':\'eS\',\'1b\':\'qy\'},{\'F\':\'eR\',\'M\':\'eR\',\'1b\':\'qx\'},{\'F\':\'eQ\',\'M\':\'qw\',\'1b\':\'qv\'},{\'F\':\'eP\',\'M\':\'qu\',\'1b\':\'qt\'},{\'F\':\'ai\',\'M\':\'ai\',\'1b\':\'qs\'},{\'F\':\'ah\',\'M\':\'ah\',\'1b\':\'qr\'},{\'F\':\'eO\',\'M\':\'eO\',\'1b\':\'qq\'},{\'F\':\'eN\',\'M\':\'eN\',\'1b\':\'qp\'},{\'F\':\'eM\',\'M\':\'aa\',\'1b\':\'qo\'},{\'F\':\'ag\',\'M\':\'ag\',\'1b\':\'qn\'},{\'F\':\'eL\',\'M\':\'a9\',\'1b\':\'qm\'},{\'F\':\'eK\',\'M\':\'a7\',\'1b\':\'ql\'},{\'F\':\'eJ\',\'M\':\'a5\',\'1b\':\'qk\'},{\'F\':\'eI\',\'M\':\'82\',\'1b\':\'qj\'},{\'F\':\'af\',\'M\':\'af\',\'1b\':\'qi\'}],ea:"<N I=\'ac 5o\'>"+"<h2>{qh}</h2>"+"<2I>"+f.9I+"</2I>"+"</N>",e2:"<li I=\'"+f.9J+"\'>"+"<a 1P=\'#\' F=\'"+f.9L+"\'>"+f.9K+"</a></li>",e3:[{\'F\':\'P\',\'M\':\'qg\',\'1b\':\'qf\'},{\'F\':\'9F\',\'M\':\'qe\',\'1b\':\'qd\'},{\'F\':\'9E\',\'M\':\'qc\',\'1b\':\'qb\'},{\'F\':\'9D\',\'M\':\'qa\',\'1b\':\'q9\'},{\'F\':\'9C\',\'M\':\'q8\',\'1b\':\'q7\'},{\'F\':\'9B\',\'M\':\'q6\',\'1b\':\'q5\'},{\'F\':\'9A\',\'M\':\'q4\',\'1b\':\'q3\'},{\'F\':\'5q\',\'M\':\'q2\',\'1b\':\'q1\'},{\'F\':\'6b\',\'M\':\'q0\',\'1b\':\'pZ\'},{\'F\':\'5l\',\'M\':\'pY\',\'1b\':\'pX\'}],e9:"<N I=\'ab 5o\'>"+"<h2>{pW}</h2><2I>"+f.9O+"</2I></N>",e4:"<li I=\'pV"+f.80+"\'><a 1P=\'#\' F=\'"+f.80+"\'>"+f.9P+"</a></li>",3W:[],e7:"<N I=\'eF 5o\'>"+"<h2>{pU}</h2>"+"</N>",e8:"<N I=\'eG 5o\'>"+"<h2>{pT}</h2>"+"<4G I=\'eE\'></4G>"+"</N>",pS:".eH",pR:".ad",pQ:" 2I",pP:".ac",pO:".ab",9l:".eG",pN:".ae 1K",6w:".ae",dN:".eF",e0:".ad a",dZ:".ac a",dY:".ab a",9v:".eE",9e:".es",7D:".ep",60:".a8",7A:".eo",d6:".ee",dg:".eh",df:".eg",dc:".ej",d9:".ei",5Z:".6h",d2:".6g",d3:"",dk:".6i",di:".et",63:".er",dh:".ek",d7:".ef",d4:".ed",dX:".pM",dW:"4e",7S:"eD=no,eC=no,eB=no,eA=no"+",4J=ez,7h=ey,3o=0,2k=0",dR:"eD=no,eC=no,eB=no,eA=no"+",pL=pK,4J=ez,7h=ey,3o=0,2k=0",1I:"<!pJ O pI \'-//pH//ev pG 1.0 pF//pE\'"+" \'91://ex.pD.ew/pC/eu/ev/eu-pB.pA\'>"+"<O 3z=\'"+f.9t+"\'><2T>"+"<2u 7w=\'3p\' 1e=\'X/1b\' 8Z=\'7f\'"+" 1P=\'"+f.9s+"\' />"+"<M>"+f.9p+"</M>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9q+"\'></2h>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9r+"\'></2h>"+"</2T>"+f.9o+"</O>",dK:"<1j I=\'6f et\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.64+"\' />"+"<3k>{aa}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'es\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dJ:"<1j I=\'6f er\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7R+"\' />"+"<3k>{a9}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'ep\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pz}</1p>"+"<1y 1e=\'X\' I=\'eo\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dI:"<1j I=\'6f ek\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7Q+"\' />"+"<3k>{a7}</3k>"+"<N I=\'1O\'>"+"<1p>{py}</1p>"+"<1y 1e=\'X\' I=\'ej\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{px}</1p>"+"<1y 1e=\'X\' I=\'ei\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pw}</1p>"+"<1y 1e=\'X\' I=\'eh\' Q=\'3\' 2G=\'3\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pv}</1p>"+"<1y 1e=\'X\' I=\'eg\' Q=\'2\' 2G=\'3\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dH:"<1j I=\'6f ef\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7P+"\' />"+"<2U>"+"<3k>{a5}</3k>"+"<N I=\'1O\'>"+"<4G I=\'ee\' 7d=\'10\' 7e=\'50\'></4G>"+"</N>"+"<N I=\'1O\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dG:"<1j I=\'6f ed\'"+" 4K=\'f.5g("+f.3N+")\'"+"></1j>",4A:[],69:"{",68:"}",a4:1a,3y:1a,3w:1a,9f:1a,97:1a},1Q);o c.dq(j(){1f f.1g(D(c),1Q)})};D.53({pu:j(i){o(f.2w[i])}});f.1g.u.56=j(){if(D.84.pt){l 4o=1f f.2D(c)}V if(D.84.ps){l 4o=1f f.2C(c)}V if(D.84.pr){l 4o=1f f.3S(c)}V if(D.84.pq){l 4o=1f f.3d(c)}if(4o){if(D.2A(c.B.a4))c.B.a4(c);l a3=1f f.1l();D.53(a3,4o);c.3Z=1f f.1t(a3);if(c.B.1D||c.B.3p){c.dv()}c.4P=1f f.2W();1h(l 6U in 4o){c[6U]=4o[6U]}c.2p=D(c.7T).e1().5G(c.B.1u).5U().do(\'pp\'+c.3f);if(D.2A(D.fn.4z)){D.4z(c.2p.5W(0),f.a2,c.3f);D.4z(c.7T.5W(0),f.a2,c.3f)}l h=f.1L;l 4n=c.B.4n;4n=h.1k(4n,f.3N,c.3f);4n=h.1k(4n,f.a1,c.B.83);l 1u=D(c.2p).O();1u=h.1k(1u,f.a0,c.B.ec);1u=h.1k(1u,f.9Z,c.B.eb);1u=h.1k(1u,f.9Y,c.B.ea);1u=h.1k(1u,f.9X,c.B.e9);1u=h.1k(1u,f.82,c.B.e8);1u=h.1k(1u,f.9W,4n);1u=h.1k(1u,f.9V,c.B.e7);l 9U=2B(c.B.e6);l 9Q="";1h(l i=0;i<9U.Y;i++){l 5n=9U[i];if(5n.F&&5n.M)l 4m=c.B.e5;l 4m=h.1k(4m,f.9T,5n.F);4m=h.1k(4m,f.81,c.B.69+5n.M+c.B.68);4m=h.1k(4m,f.9S,5n.1b);9Q+=4m}1u=h.1k(1u,f.9R,9Q);l 6e=2B(c.B.3W);l 9N="";1h(l i=0;i<6e.Y;i++){l 4k=6e[i];if(4k.F&&4k.M)l 4j=c.B.e4;4j=h.1k(4j,f.80,4k.F);4j=h.1k(4j,f.9P,4k.M);9N+=4j}1u=h.1k(1u,f.9O,9N);l 9M=2B(c.B.e3);l 9H="";1h(l i=0;i<9M.Y;i++){l 5m=9M[i];if(5m.F&&5m.M)l 4l=c.B.e2;4l=h.1k(4l,f.9L,5m.F);4l=h.1k(4l,f.9K,c.B.69+5m.M+c.B.68);4l=h.1k(4l,f.9J,5m.1b);9H+=4l}1u=h.1k(1u,f.9I,9H);1u=c.9n(1u);D(c.2p).O(1u);D(c.2p).4g(c.B.9l).e1();c.7F()}};f.1g.u.5v=j(){l E=c;D(c.2p).4g(c.B.e0).4e(j(){E.1E.1B.4W();E.dV(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.dZ).4e(j(){E.L(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.9v).2x(j(){D(E.H.1j).O(D(c).1H())}).4W(j(){D(c).6a(\'9u\')}).po(j(){D(c).6a(\'9u\')});D(c.2p).4g(c.B.dY).4e(j(){l 6e=2B(E.B.3W);l 9G=D(c).1v(f.7Z);l 4k=f.1L.aL(6e,9G);if(4k){l 4y=4k.aT;E.6a(9G,4y)}E.1E.1B.4W();o(J)});D(c.B.dX).3x(c.B.dW,j(){E.67()})};f.1g.u.pn=j(){o(c.H!=1a)};f.1g.u.ct=j(){o(c.2p)};f.1g.u.O=j(O){if(1q O===\'3Q\')D(c.H.1j).O(O);V o(D(c.H.1j).O())};f.1g.u.1s=j(){o c.3Z.3X(c.O())};f.1g.u.dV=j(1F){3e(1F){1i f.9d:l L=c.L();if(L||c.2j)c.4M(f.64);1n;1i f.9b:c.4M(f.7R);1n;1i f.dU:c.4M(f.7Q);1n;1i f.dT:c.4M(f.7P);1n;1i f.dS:c.67();c.dC();1n;1i f.7O:c.4M(f.7O,c.B.dR);1n;3R:c.1C(1F);1n}};f.1g.u.L=j(3q){if(3q){l L=1a;if(3q.1o()==f.5l){L=c.L();3e(L.1r.1o()){1i f.6d:1i f.5l:1n;3R:l 7Y=1f 6c(f.6d,f.5l);L=c.2N(c.L(),7Y);1n}if(L!=1a){3q=(L.1r.1o()==f.6d)?f.5l:f.6d;c.9y(L,3q);c.67()}}V{l 7Y=1f 6c(f.P,f.9F,f.9E,f.9D,f.9C,f.9B,f.9A,f.5q,f.6b);L=c.2N(c.L(),7Y);if(L){l 3O=1a;if(3q.1o()==f.6b){l 2J=c.2N(c.L(),f.6b);if(2J==1a){3O=c.H.5Y(3q);L.1z.dQ(3O,L);3O.dr(L);c.5y(3O.pm)}V{l 7X=2J.6q;l 9z=7X.Y;l 7W=1a;if(9z>0)7W=7X.4v(0);1h(l x=0;x<9z;x++){2J.1z.dQ(7X.4v(0),2J)}2J.1z.pl(2J);if(7W)c.5y(7W)}}V c.9y(L,3q);c.67()}}}V o(c.1d())};f.1g.u.6a=j(4j,4y){l L=(c.2j?c.2j:D(c.1d()));L=D(L).4V(4y);D(L).6a(4j);if(!D(L).1v(f.dP))D(L).pk(c.5x)};f.1g.u.2N=j(1c,51){if(1c){l 4i=1c.1r.1o();if(1q(51)==f.dO){77(4i!=51&&4i!=f.3t){1c=1c.1z;4i=1c.1r.1o()}}V{l 7V=J;77(!7V&&4i!=f.3t){1h(l i=0;i<51.Y;i++){if(4i==51[i]){7V=R;1n}}if(!7V){1c=1c.1z;4i=1c.1r.1o()}}}if(4i!=f.3t)o(1c);V o(1a)}V o(1a)};f.1g.u.9y=j(1c,3q){l 3O=c.H.5Y(3q);l O=D(1c).O();1c.1z.pj(3O,1c);D(3O).O(O);c.5y(3O)};f.1g.u.9n=j(4N){if(!f.7U[c.B.3H]){4u{2B(D.9j({9i:c.B.9x+c.B.3H+\'.js\',9h:J}).9g)}4t(e){f.4O.9w("f: 9w 77 ph cX cI.");o 4N}}1h(l 1T in f.7U[c.B.3H]){4N=f.1L.1k(4N,c.B.69+1T+c.B.68,f.7U[c.B.3H][1T])};o(4N)};f.1g.u.dD=j(4N){o(c.B.69+4N+c.B.68)};f.1g.u.2n=j(dM){D(c.2p).4g(c.B.dN).O(dM)};f.1g.u.67=j(){l O=c.1s();D(c.7T).1H(O);D(c.2p).4g(c.B.9v).by(\'.9u\').1H(O);};f.1g.u.4M=j(65,7S,dF){l dL=7S||c.1V.B.7S;l 9m=2l.5X(\'\',\'4M\',dL);if(9m){l 4h="";3e(65){1i(f.64):4h=c.B.dK;1n;1i(f.7R):4h=c.B.dJ;1n;1i(f.7Q):4h=c.B.dI;1n;1i(f.7P):4h=c.B.dH;1n;1i(f.7O):4h=c.B.dG;1n;3R:4h=dF}l h=f.1L;l 1I=c.B.1I;1I=h.1k(1I,f.dE,c.B.4L);1I=h.1k(1I,f.9t,c.B.4S);1I=h.1k(1I,f.9s,c.B.5i+f.7E);1I=h.1k(1I,f.9r,c.B.7N);1I=h.1k(1I,f.9q,c.B.7M);1I=h.1k(1I,f.9p,c.dD(65));1I=h.1k(1I,f.9o,4h);1I=h.1k(1I,f.3N,c.3f);1I=c.9n(1I);l 4f=9m.3A;4f.pg(1I);4f.5e()}};f.1g.u.dC=j(){D(c.2p).4g(c.B.9l).pf()};f.1g.u.dj=j(){l dB=1f pe();o("E-"+dB.pd())};f.1g.u.5B=j(dA){l 3M;l L=c.1d();l aP=dA.8m(c.4s+c.4s);l 4x=1f 2O(c.4s,"g");if(L&&L.1r.1o()!=f.3t){1h(x=aP.Y-1;x>=0;x--){3M=aP[x];3M=3M.S(4x,"<br />");D(L).5G("<p>"+3M+"</p>")}}V{1h(x=0;x<aP.Y;x++){3M=aP[x];3M=3M.S(4x,"<br />");D(c.H.1j).d8("<p>"+3M+"</p>")}}};f.1g.u.8e=j(O){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,O)}V{c.5B(O)}};f.1g.u.aE=j(2k,2E){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,2k+c.1E.1B.2z().93()+2E)}};f.1g.u.aD=j(){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,c.1E.1B.2z().93())}};f.1g.u.5y=j(1c,3U){l 1S=c.H.4Y(),3V=c.1E.1B.2z();3U=3U?0:1;1S.pc(1c);3V.pb(1S);3V.aC(1c,3U);c.1E.1B.4W()};f.1g.u.4T=j(4f,2r){l 1D=4f.4U[0];if(1D){1h(l i=0;i<2r.Y;i++){l 1Y=2r[i];if(1Y.F&&1Y.1b)c.5r(1D,1Y)}}};f.1g.u.dz=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\').S(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/,\'\')};f.1g.u.dy=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.dx=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K(-(.*)){0,1}(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.pa=j(){o D(D.7G(D(\'2u\'),j(s){o(s.1P&&s.1P.K(/5k\\/dw\\/(.*)7f\\.1b(\\?.*)?$/))})).1v(\'1P\')};f.1g.u.dv=j(){l 5j=1f f.3D();if(c.B.3p){5j.3X(D.9j({9i:c.B.3p,9h:J}).9g)}V{5j.3X(c.B.1D,J)}if(c.B.3W.Y==0){c.B.3W=5j.4B.3W}if(c.B.3g.Y==0){c.B.3g=5j.4B.3g}if(c.B.4A.Y==0){c.B.4A=5j.4B.4A}};f.1g.u.5u=j(){D(c.H.1j).3x("7z",c.7z)};f.1g.u.7z=j(W){l E=f.2w[c.p9.M];E.2j=(W.ds.1r.1o()==f.du)?W.ds:1a};f.dp=j(1P){l 2u=3A.5Y(\'2u\');2u.7w=\'3p\';2u.1P=1P;l 2T=D(\'2T\').5W(0);2T.dr(2u)};f.1g.u.7F=j(){if(c.B.7F&&!f.5h[c.B.3a]){l 9k=J;l 4x=1f 2O(c.B.3a+\'\\/\'+f.7E+\'$\');D(\'2u\').dq(j(){if(c.1P.K(4x))9k=R});if(!9k)f.dp(c.B.5i+f.7E)}D(c.2p).do("p8"+c.B.3a);if(c.B.dn&&!f.5h[c.B.3a]){2B(D.9j({9i:c.B.5i+f.dm,9h:J}).9g)}if(f.5h[c.B.3a]&&f.5h[c.B.3a].56)f.5h[c.B.3a].56(c)};f.5g=j(5a){l E=2l.p7.f.2w[5a];l 4f=2l.3A;l 1d=E.1d();l 65=D(E.B.dk).1H();l 62=E.dj();3e(65){1i f.64:if(1d&&1d.1r&&1d.1r.1o!=f.A)1d=D(1d).4V(f.A);if(!1d&&E.2j)1d=D(E.2j).4V(f.A);1n}if(D.2A(E.B.9f))E.B.9f(E,2l);l 1D=4f.4U[0];l 2r=2B(E.B.4A);E.4T(4f,2r);if(1d){D(E.B.9e).1H(D(1d).1v(f.9c));D(E.B.7D).1H(D(1d).1v(f.7C));D(E.B.60).1H(D(1d).1v(f.61));D(E.B.7A).1H(D(1d).1v(f.7B))}if(E.2j){D(E.B.63+" "+E.B.7D).1H(D(E.2j).1v(f.7C));D(E.B.63+" "+E.B.60).1H(D(E.2j).1v(f.61));D(E.B.63+" "+E.B.7A).1H(D(E.2j).1v(f.7B))}D(E.B.di+" "+E.B.5Z).4e(j(){l 5f=D(E.B.9e).1H();if(5f.Y>0){l 2u;if(1d[0]&&1d[0].1r.1o()==f.A){2u=1d}V{E.1C(f.9d,62);2u=D("a[1P="+62+"]",E.H.1j)}2u.1v(f.9c,5f).1v(f.61,D(E.B.60).1H())}2l.5e()});D(E.B.63+" "+E.B.5Z).4e(j(){l 5f=D(E.B.7D).1H();if(5f.Y>0){E.1C(f.9b,62);D("6Q[1U$="+62+"]",E.H.1j).1v(f.7C,5f).1v(f.61,D(E.B.60).1H()).1v(f.7B,D(E.B.7A).1H())}2l.5e()});D(E.B.dh+" "+E.B.5Z).4e(j(){l 9a=D(E.B.dg).1H();l 99=D(E.B.df).1H();if(9a>0&&99>0){l 3j=E.H.5Y(f.de);l 98=1a;l p6=1a;l da=D(E.B.dc).1H();l db=3j.p5();db.94=da;1h(x=0;x<9a;x++){98=3j.p4(x);1h(y=0;y<99;y++){98.p3(y)}}D(3j).1v(\'cr\',D(E.B.d9).1H());l 1c=D(E.2N(E.L(),f.6n)).5W(0);if(!1c||!1c.1z)D(E.H.1j).d8(3j);V D(1c).5G(3j)}2l.5e()});D(E.B.d7+" "+E.B.5Z).4e(j(){l d5=D(E.B.d6).1H();E.5B(d5);2l.5e()});D(E.B.d4+" "+E.B.d3).O(E.1s());D(E.B.d2).7z(j(){2l.5e()});if(D.2A(E.B.97))E.B.97(E,2l)};f.2W=j(){c.7y=3A.5Y(\'N\');o c};f.2W.u.C=j(F,1Q,5X){1Q=1Q||J;5X=5X||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+(5X?\'>\':\' />\')};f.2W.u.p2=j(F,2b,1Q){1Q=1Q||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+\'>\'+2b+\'</\'+F+\'>\'};f.2W.u.p1=j(2b){o\'<![p0[\'+2b+\']]>\'};f.2W.u.cZ=j(3L){o c.d1(c.cY(3L))};f.2W.u.d1=j(d0){o d0.S(/&oZ;([a-z]+|(#\\d+));/ig,"&$1;")};f.2W.u.96=j(1Q){l 3L=c;3L.95=\'\';1h(l 1T in 1Q){l oY=\'\';l Q=1Q[1T];if(1q Q!=\'j\'&&Q.Y>0){if(ck(1T)==1T&&1q Q==\'4C\'){1T=Q.oX();Q=Q.4Q()}if(1T!=\'\'&&Q!=\'\'){3L.95+=\' \'+1T+\'="\'+3L.cZ(Q)+\'"\'}}}o 3L.95};f.2W.u.cY=j(3Q,7x){c.7y.94=3Q;c.7y.oW=3Q;l 1N=c.7y.94;if(1q 7x==\'2d\'){if(7x!=J)1N=1N.S(\'"\',\'&oV;\');if(7x==R)1N=1N.S(\'"\',\'&#oU;\')}o 1N};f.2W.u.oT=j(5c){l 1N=[];l 2g=5c.8m(/((=\\s*")(")("))|((=\\s*\\\')(\\\')(\\\'))|((=\\s*[^>\\s]*))/g);if(2g.93()!=5c){1h(l k in 2g){l v=2g[k];if(1q v!=\'j\'&&v.Y!=0){l re=1f 2O(\'(\\\\w+)\\\\s*\'+v);if(K=5c.K(re)){l Q=v.S(/^[\\s=]+/,"");l 5d=Q.oS(0);5d=5d==\'"\'?\'"\':(5d=="\'"?"\'":\'\');if(5d!=\'\'){Q=5d==\'"\'?Q.S(/^"|"+$/g,\'\'):Q.S(/^\'|\'+$/g,\'\')}5c=5c.S(K[0],\'\');1N.1X([K[1],Q])}}}}o 1N};f.bz={"8V":{"oR":{"59":["55","2T","O","7i","1R","2h","1m","M"],"G":["I","id","1m","M","cW","cV"]},"cX":{"59":["55","br","hr","1K","1R","2h"],"G":{"3z":["92","cL"],"0":"3H","1":"3L:3H"}},"cU":{"G":{"cW":/^(\\w){1}$/,"cV":/^(\\d)+$/}}},"8W":{"2l":{"7b":["1j"],"G":["4K","oQ"]},"1M":{"7b":["1M","1y","4G","4X","a","1p","2t"],"G":["oP","oO","oN","oM","oL","aK"]},"cU":{"59":["55","6S","br","cu","oK","2T","O","1K","7i","1R","2h","1m","M"],"G":["oJ","oI","aJ"]},"oH":{"59":["55","6S","br","2T","O","7i","1R","2h","1m","M"],"G":["aI","oG","oF","oE","oD","oC","oB"]}},"1J":{"a":{"G":{"0":"7g","1":"cS","2":"1P","3":"cE","4":"F","7w":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cD":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/,"5":"1e"}},"0":"6T","1":"8y","2":"6L","bv":{"G":{"0":"5b","1":"cS","2":"1P","oA":/^(R|J)$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/},"2c":["5b"]},"3":"b","55":{"G":["1P"],"2c":["1P"]},"6S":{"G":{"3z":/^(92|cL)$/},"2c":["3z"]},"4":"bu","2J":{"G":["54"]},"5":"1j","6":"br","2t":{"G":{"2Z":/^(2Z)$/,"1e":/^(2t|cH|cG)$/,"0":"Q"},"3K":"1M"},"7":"bt","8":"54","9":"bs","6R":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"},"3K":"5K"},"5K":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"}},"10":"dd","8x":{"G":{"0":"54","cF":/^([0-9]){8}/}},"11":"N","12":"bq","13":"dl","14":"dt","15":"em","2U":{"3K":"1M"},"1M":{"G":{"0":"5N","1":"5Q","2":"5Q-7g","3":"oz","oy":/^(5W|ox)$/},"2c":["5N"]},"2T":{"G":["cK"]},"16":"h1","17":"h2","18":"h3","19":"h4","20":"h5","21":"h6","22":"hr","O":{"G":["ow"]},"23":"i","6Q":{"G":["5b","1U","7h","ov","ou","cB","4J"],"2c":["5b","1U"]},"1y":{"G":{"0":"5Q","1":"5b","cJ":/^(cJ)$/,"2Z":/^(2Z)$/,"ot":/^(\\d)+$/,"2":"F","8X":/^(8X)$/,"2G":/^(\\d)+$/,"3":"1U","1e":/^(2t|os|cI|5V|bx|oq|op|cH|cG|X)$/,"4":"Q"},"3K":"1M"},"bp":{"G":{"0":"54","cF":/^([0-9]){8}/}},"24":"bo","1p":{"G":["1h"],"3K":"1M"},"25":"3k","26":"li","2u":{"G":{"0":"7g","1":"1P","2":"cE","8Z":/^(8Y|cv|cw|cx|7f|oo|,|;|)+$/i,"7w":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"cD":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"3":"1e"},"3K":"2T"},"bn":{"G":["id","F"],"2c":["id"]},"7i":{"G":{"0":"2b","91-bw":/^(2b\\-1e|om|ok|oj\\-oi)$/i,"1":"F","2":"oh"},"2c":["2b"]},"27":"8E","4C":{"G":["og","of","oe","od","4z","oc","7h","F","ob","1e","cB","4J"]},"28":"ol","bm":{"G":{"0":"1p","2Z":/^(2Z)$/},"2c":["1p"]},"6O":{"G":{"0":"1p","2Z":/^(2Z)$/,"1d":/^(1d)$/,"1":"Q"},"3K":"4X"},"29":"p","1R":{"G":{"0":"1e","cA":/^(4z|oa|4C)$/,"1":"cA","2":"Q"},"2c":["F"]},"30":"41","q":{"G":["54"]},"31":"bl","2h":{"G":{"1e":/^(X\\/o9|X\\/90|X\\/o8|X\\/o7|X\\/o6|X\\/3L)$/,"0":"7g","cz":/^(cz)$/,"1":"1U"},"2c":["1e"]},"4X":{"G":{"2Z":/^(2Z)$/,"cy":/^(cy)$/,"0":"F","1":"2G"},"3K":"1M"},"32":"bk","33":"3r","34":"3c","1m":{"G":{"0":"1e","8Z":/^(7f|o5|o4|cx|o3|cw|cv|o2|8Y)$/},"2c":["1e"]},"35":"3b","36":"3P","3j":{"G":{"0":"cs","1":"o1","2":"o0","cu":/^(nZ|nY|nX|nW|nV|nU|nT|ct|cs)$/,"nS":/^(nR|nQ|7d|7e|8Y)$/,"3":"cr","4":"4J"}},"8D":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"4F":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"4G":{"G":["7e","7d","2Z","F","8X"],"2c":["7e","7d"],"3K":"1M"},"8C":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47)$/,"2":"45"}},"5I":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"8B":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"37":"M","6P":{"G":{"4d":/^(2E|2k|4c|4b|2Y)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"38":"bj","39":"2I","40":"l"},6G:[],6F:[],5p:j(C,G){l 7c={};l cl=c.cf(C);1h(l 2i in G){l Q=G[2i];l h=f.1L;if(!h.2F(c.6G,2i)&&!h.2F(c.6F,Q)){if(1q Q!=\'j\'&&h.2F(cl,2i)){if(c.ch(C,2i)){if(c.cg(C,2i,Q)){7c[2i]=Q}}V{7c[2i]=Q}}}}o 7c},ce:j(C){l 1N=[];if(c.1J[C]&&c.1J[C][\'G\']){1h(k in c.1J[C][\'G\']){1N.1X(ck(k)==k?c.1J[C][\'G\'][k]:k)}}o 1N},ci:j(){l 1N=[];1h(l 1T in c.8W){1N.1X(c.8W[1T])}1h(l 1T in c.8V){1N.1X(c.8V[1T])}o 1N},cj:j(C){if(c.1J[C]){o R}1h(l 1T in c.1J){if(c.1J[1T]==C){o R}}o J},cd:j(C){l 8T=[];if(c.cj(C)){l 8U=c.ci();1h(l 1T in 8U){l 3J=8U[1T];if(1q 3J==\'4C\'){l h=f.1L;if((3J[\'59\']&&h.2F(3J[\'59\'],C))||(3J[\'7b\']&&!h.2F(3J[\'7b\'],C))){nP}l 7a=3J[\'G\']?3J[\'G\']:3J[\'nO\'];1h(l k in 7a){8T.1X(1q 7a[k]!=\'3Q\'?k:7a[k])}}}}o 8T},ch:j(C,2i){o c.1J[C]&&((c.1J[C][\'G\']&&c.1J[C][\'G\'][2i])||(c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)))},cg:j(C,2i,Q){if(c.1J[C]&&(c.1J[C][\'G\']&&c.1J[C][\'G\'][2i]&&Q.Y>0&&!Q.K(c.1J[C][\'G\'][2i]))||(c.1J[C]&&c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)&&Q.Y==0)){o J}o 1q c.1J[C]!=\'2d\'},cf:j(C){if(!c.5T){c.5T={}}if(!c.5T[C]){c.5T[C]=c.ce(C).nN(c.cd(C))}o c.5T[C]}};f.2X=j(78){c.4I=78;c.44=[];c.8S=[];c.5S=1a;o c};f.2X.u.43=j(3n,1p){1p=1p||R;l 58=c.44.Y;c.44[58]=3n;c.8S[58]=1p;c.5S=1a};f.2X.u.K=j(cc){if(c.44.Y==0){o[J,\'\']}l 2g=cc.K(c.cb());if(!2g){o[J,\'\']}l K=2g[0];1h(l i=1;i<2g.Y;i++){if(2g[i]){o[c.8S[i-1],K]}}o[R,2g[0]]};f.2X.u.cb=j(){if(c.5S==1a){1h(l i=0,58=c.44.Y;i<58;i++){c.44[i]=\'(\'+c.c9(c.ca(c.44[i]).S(/([\\/\\(\\)])/g,\'\\\\$1\'))+\')\'}c.5S=1f 2O(c.44.6u("|"),c.c1())}o c.5S};f.2X.u.ca=j(79){o 79.S(/\\(\\?(i|m|s|x|U)\\)/,\'~~~~~~c8\\$1~~~~~~\').S(/\\(\\?(\\-[i|m|s|x|U])\\)/,\'~~~~~~c7\\$1~~~~~~\').S(/\\(\\?\\=(.*)\\)/,\'~~~~~~c6\\$1~~~~~~\').S(/\\(\\?\\!(.*)\\)/,\'~~~~~~c5\\$1~~~~~~\').S(/\\(\\?\\<\\=(.*)\\)/,\'~~~~~~c4\\$1~~~~~~\').S(/\\(\\?\\<\\!(.*)\\)/,\'~~~~~~c3\\$1~~~~~~\').S(/\\(\\?\\:(.*)\\)/,\'~~~~~~c2\\$1~~~~~~\')};f.2X.u.c9=j(79){o 79.S(/~~~~~~c8(.{1})~~~~~~/,"(?\\$1)").S(/~~~~~~c7(.{2})~~~~~~/,"(?\\$1)").S(/~~~~~~c6(.*)~~~~~~/,"(?=\\$1)").S(/~~~~~~c5(.*)~~~~~~/,"(?!\\$1)").S(/~~~~~~c4(.*)~~~~~~/,"(?<=\\$1)").S(/~~~~~~c3(.*)~~~~~~/,"(?<!\\$1)").S(/~~~~~~c2(.*)~~~~~~/,"(?:\\$1)")};f.2X.u.c1=j(){o(c.4I?"m":"mi")};f.5R=j(2L){c.57=[2L];o c};f.5R.u.8O=j(){o c.57[c.57.Y-1]};f.5R.u.8Q=j(2a){c.57.1X(2a)};f.5R.u.8R=j(){if(c.57.Y==1){o J}c.57.4Q();o R};f.71=1;f.bZ=2;f.3E=3;f.5E=4;f.6Y=5;f.2f=j(3Z,2L,78){2L=2L||\'5Q\';c.4I=78||J;c.2o={};c.8P=3Z;c.42=1f f.5R(2L);c.2K={};c.2K[2L]=2L;o c};f.2f.u.43=j(3n,T){l T=T||"5Q";if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n);if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.2Q=j(3n,T,5P){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,5P);if(1q c.2K[5P]==\'2d\'){c.2K[5P]=5P}};f.2f.u.2H=j(3n,T){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,"bX");if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.4E=j(3n,T,5O){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,\'bV\'+5O);if(1q c.2K[5O]==\'2d\'){c.2K[5O]=5O}};f.2f.u.8q=j(T,75){c.2K[T]=75};f.2f.u.3X=j(1w){if(1q c.8P==\'2d\'){o J}l Y=1w.Y;l 3I;77(1q(3I=c.bR(1w))==\'4C\'){l 1w=3I[0];l 76=3I[1];l 3m=3I[2];l T=3I[3];if(!c.c0(76,3m,T)){o J}if(1w==\'\'){o R}if(1w.Y==Y){o J}Y=1w.Y}if(!3I){o J}o c.4H(1w,f.3E)};f.2f.u.c0=j(76,3m,T){T=T||J;if(!c.4H(76,f.3E)){o J}if(1q T==\'nM\'){o c.4H(3m,f.bZ)}if(c.bY(T)){if(!c.4H(3m,f.5E)){o J}o c.42.8R()}if(c.bW(T)){c.42.8Q(c.bU(T));if(!c.4H(3m,f.6Y)){o J}o c.42.8R()}c.42.8Q(T);o c.4H(3m,f.71)};f.2f.u.bY=j(T){o(T==="bX")};f.2f.u.bW=j(T){o(T.6y(0,1)=="bV")};f.2f.u.bU=j(T){o T.6y(1)};f.2f.u.4H=j(2b,bS){if(2b===\'\'){o R}l bT=c.42.8O();l 75=c.2K[bT];l 1N;2B(\'1N = c.8P.\'+75+\'(2b, bS);\');o 1N};f.2f.u.bR=j(1w){l 3m=c.2o[c.42.8O()].K(1w);l K=3m[1];l 5N=3m[0];if(5N){l 8N=1w.8h(K);l bQ=1w.aN(0,8N);1w=1w.6y(8N+K.Y);o[1w,bQ,K,5N]}o R};f.3l=j(3Z){D.53(c,1f f.2f(3Z,\'3h\'));c.8q(\'3h\',\'3h\');c.bP();c.56();o c};f.3l.u.56=j(){};f.3l.u.bP=j(){c.bO(\'3h\');c.bN(\'3h\');c.bM(\'3h\');c.bL(\'3h\')};f.3l.u.bO=j(1G){c.2Q("<!--",1G,\'8M\');c.2H("-->",\'8M\')};f.3l.u.bN=j(1G){c.2Q("<2h",1G,\'8L\');c.2H("</2h>",\'8L\')};f.3l.u.bM=j(1G){c.2Q("<1m",1G,\'8K\');c.2H("</1m>",\'8K\')};f.3l.u.bL=j(1G){c.4E("<\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'72\');c.2Q("<[a-5F-9:\\-]+"+\'[\\\\\\/ \\\\\\>]+\',1G,\'72\');c.bK(\'72\');c.4E("</\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'bG\')};f.3l.u.bK=j(1G){c.4E(\'\\\\s+\',1G,\'52\');c.bJ(1G);c.2H(\'/>\',1G);c.2H(\'>\',1G)};f.3l.u.bJ=j(1G){c.4E("\\\\s*[a-z-8p-9]*:?[a-z-8p-9]+\\\\s*(?=\\=)\\\\s*",1G,\'bB\');c.2Q(\'=\\\\s*"\',1G,\'6X\');c.43("\\\\\\\\\\"",\'6X\');c.2H(\'"\',\'6X\');c.2Q("=\\\\s*\'",1G,\'6W\');c.43("\\\\\\\\\'",\'6W\');c.2H("\'",\'6W\');c.4E(\'=\\\\s*[^>\\\\s]*\',1G,\'bA\')};f.1t=j(bI,T){l T=T||\'3h\';c.6D=1f f.3l(c);c.Z=bI;c.42=T;c.nL=[];c.nK=\'\';c.nJ=\'\';o c};f.1t.u.3X=j(1w){c.6D.3X(c.6N(1w));o c.6M(c.Z.bb())};f.1t.u.6N=j(1w){if(1w.K(/I="b3"/)||1w.K(/ns = "nI:nH-nG-nF/)){c.Z.b4()}o c.Z.6N(1w)};f.1t.u.6M=j(3I){if(c.Z.8w){c.Z.b2()}o c.Z.6M(3I)};f.1t.u.52=j(K,2a){o R};f.1t.u.3h=j(X){c.Z.ba(X);o R};f.1t.u.8M=j(K,2n){o c.74(K,2n,\'6J\')};f.1t.u.8L=j(K,2n){o c.74(K,2n,\'6I\')};f.1t.u.8K=j(K,2n){o c.74(K,2n,\'6H\')};f.1t.u.74=j(K,2a,1e){3e(2a){1i f.71:c.5M=K;1n;1i f.3E:c.5M+=K;1n;1i f.5E:3e(1e){1i\'6J\':c.Z.6J(c.5M+K);1n;1i\'6I\':c.Z.6I(c.5M+K);1n;1i\'6H\':c.Z.6H(c.5M+K);1n}}o R};f.1t.u.72=j(K,2a){3e(2a){1i f.71:c.bH=c.6Z(K);c.5L={};1n;1i f.6Y:c.8J(c.6Z(K));1n;1i f.5E:c.8J(c.bH,c.5L)}o R};f.1t.u.bG=j(K,2a){c.8G(c.6Z(K));o R};f.1t.u.8J=j(C,G){l G=G||{};c.bE(C);if(c.Z.8v(C)){c.Z.4p.1X(C);c.Z.aY(C,G);c.Z.6k(C,G);c.8I(C)}V if(c.Z.b1(C)){c.Z.b9(C,G)}V{c.Z.b8(C,G);c.8I(C)}c.Z.6E=C;c.Z.8t=R;c.Z.nE=G};f.1t.u.8G=j(C){if(c.bF(C)){c.bD(C);if(c.Z.8v(C)){l 70=c.Z.4p.4Q();if(70==J){o}V if(70!=C){C=70}c.Z.b7(C)}V{c.Z.b6(C)}}V{c.Z.b5(C)}c.Z.6E=C;c.Z.8t=J};f.1t.u.8I=j(C){c.Z.2V[C]=c.Z.2V[C]||0;c.Z.2V[C]++};f.1t.u.bF=j(C){if(c.Z.2V[C]){c.Z.2V[C]--;if(c.Z.2V[C]==0){c.Z.2V[C]=2d}o R}o J};f.1t.u.bE=j(2v){c.8H(2v,J)};f.1t.u.bD=j(C){c.8H(C,R)};f.1t.u.8H=j(2v,2S){l 2S=2S||J;if(c.Z.2V){1h(l C in c.Z.2V){l bC=c.Z.2V[C];if(bC>0&&c.Z.bi(C,2v,2S)){c.8G(C,R)}}}};f.1t.u.6K=j(){o c.Z.6K()};f.1t.u.6Z=j(C){C=C.S(/^([\\s<\\/>]*)|([\\s<\\/>]*)$/gm,\'\').1o();l 3i=c.Z.6K();if(3i[C]){o 3i[C]}o C};f.1t.u.bB=j(K,2a){if(f.6Y==2a){c.6V=K}o R};f.1t.u.6X=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.6W=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.bA=j(K,2a){c.5L[c.6V]=K.S(/^=/,\'\');o R};f.1l=j(){c.1W=\'\';c.4P=1f f.2W();c.2V={};c.3s=f.bz;c.4p=[];c.5H=[];c.8A={\'&bd;\':\'&#be;\',\'&nD;\':\'&#nC;\',\'&nB;\':\'&#nA;\',\'&nz;\':\'&#ny;\',\'&nx;\':\'&#nw;\',\'&nv;\':\'&#nt;\',\'&nr;\':\'&#nq;\',\'&np;\':\'&#nn;\',\'&nm;\':\'&#nl;\',\'&nk;\':\'&#nj;\',\'&nh;\':\'&#ng;\',\'&nf;\':\'&#nd;\',\'&by;\':\'&#nc;\',\'&nb;\':\'&#na;\',\'&n9;\':\'&#n8;\',\'&n7;\':\'&#n6;\',\'&n5;\':\'&#n4;\',\'&n3;\':\'&#n2;\',\'&n1;\':\'&#n0;\',\'&mZ;\':\'&#mY;\',\'&mX;\':\'&#mW;\',\'&mV;\':\'&#mU;\',\'&mT;\':\'&#mS;\',\'&mR;\':\'&#mQ;\',\'&mP;\':\'&#mO;\',\'&mN;\':\'&#mM;\',\'&mL;\':\'&#mK;\',\'&mJ;\':\'&#mI;\',\'&mH;\':\'&#mG;\',\'&mF;\':\'&#mE;\',\'&mD;\':\'&#mC;\',\'&mB;\':\'&#mA;\',\'&mz;\':\'&#my;\',\'&mx;\':\'&#mw;\',\'&mv;\':\'&#mt;\',\'&ms;\':\'&#mr;\',\'&mq;\':\'&#mp;\',\'&mo;\':\'&#mn;\',\'&mm;\':\'&#ml;\',\'&mk;\':\'&#mj;\',\'&mh;\':\'&#mg;\',\'&mf;\':\'&#me;\',\'&md;\':\'&#mc;\',\'&mb;\':\'&#ma;\',\'&m9;\':\'&#m8;\',\'&m7;\':\'&#m6;\',\'&m5;\':\'&#m4;\',\'&m3;\':\'&#m2;\',\'&m1;\':\'&#m0;\',\'&lZ;\':\'&#lY;\',\'&lX;\':\'&#lW;\',\'&lV;\':\'&#lU;\',\'&lT;\':\'&#lS;\',\'&lR;\':\'&#lQ;\',\'&lP;\':\'&#lO;\',\'&lN;\':\'&#lM;\',\'&lL;\':\'&#lK;\',\'&lJ;\':\'&#lI;\',\'&lH;\':\'&#lG;\',\'&lF;\':\'&#lE;\',\'&lD;\':\'&#lC;\',\'&lB;\':\'&#lA;\',\'&lz;\':\'&#ly;\',\'&lx;\':\'&#lw;\',\'&lv;\':\'W\',\'&lu;\':\'&#lt;\',\'&ls;\':\'&#lr;\',\'&lq;\':\'&#lp;\',\'&lo;\':\'&#ln;\',\'&lm;\':\'&#ll;\',\'&lk;\':\'&#lj;\',\'&lh;\':\'&#lg;\',\'&lf;\':\'&#ld;\',\'&lc;\':\'&#lb;\',\'&la;\':\'&#l9;\',\'&l8;\':\'&#l7;\',\'&l6;\':\'&#l5;\',\'&l4;\':\'&#l3;\',\'&l2;\':\'&#l1;\',\'&l0;\':\'&#kZ;\',\'&kY;\':\'&#kX;\',\'&kW;\':\'&#kV;\',\'&kU;\':\'&#kT;\',\'&kS;\':\'&#kR;\',\'&kQ;\':\'&#kP;\',\'&kO;\':\'&#kN;\',\'&kM;\':\'&#kL;\',\'&kK;\':\'&#kJ;\',\'&kI;\':\'&#kH;\',\'&kG;\':\'&#kF;\',\'&kE;\':\'&#kD;\',\'&kC;\':\'&#kB;\',\'&kA;\':\'&#kz;\',\'&ky;\':\'&#kx;\',\'&kw;\':\'&#kv;\',\'&ku;\':\'&#kt;\',\'&ks;\':\'&#kr;\',\'&kq;\':\'&#kp;\',\'&ko;\':\'&#kn;\',\'&km;\':\'&#kl;\',\'&kk;\':\'&#kj;\',\'&ki;\':\'&#kh;\',\'&8F;\':\'&#kg;\',\'&kf;\':\'&#ke;\',\'&kd;\':\'&#kc;\',\'&kb;\':\'&#ka;\',\'&k9;\':\'&#k8;\',\'&k7;\':\'&#k6;\',\'&k5;\':\'&#k4;\',\'&k3;\':\'&#k2;\',\'&k1;\':\'&#k0;\',\'&jZ;\':\'&#jY;\',\'&jX;\':\'&#jW;\',\'&jV;\':\'&#jU;\',\'&jT;\':\'&#jS;\',\'&jR;\':\'&#jQ;\',\'&jP;\':\'&#jO;\',\'&jN;\':\'&#jM;\',\'&jL;\':\'&#jK;\',\'&jJ;\':\'&#jI;\',\'&jH;\':\'&#jG;\',\'&jF;\':\'&#jE;\',\'&jD;\':\'&#jC;\',\'&jB;\':\'&#jA;\',\'&jz;\':\'&#jy;\',\'&jx;\':\'&#jw;\',\'&jv;\':\'&#ju;\',\'&jt;\':\'&#jr;\',\'&jq;\':\'&#jp;\',\'&jo;\':\'&#jn;\',\'&jm;\':\'&#jl;\',\'&jk;\':\'&#jj;\',\'&ji;\':\'&#jh;\',\'&jg;\':\'&#jf;\',\'&je;\':\'&#jd;\',\'&jc;\':\'&#jb;\',\'&ja;\':\'&#j9;\',\'&j8;\':\'&#j7;\',\'&j6;\':\'&#j5;\',\'μ\':\'&#j4;\',\'ν\':\'&#j3;\',\'&j2;\':\'&#j1;\',\'&j0;\':\'&#iZ;\',\'π\':\'&#iY;\',\'&iX;\':\'&#iW;\',\'&iV;\':\'&#iU;\',\'&iT;\':\'&#iS;\',\'&iR;\':\'&#iQ;\',\'&iP;\':\'&#iO;\',\'&iN;\':\'&#iM;\',\'&iL;\':\'&#iK;\',\'&iJ;\':\'&#iI;\',\'&iH;\':\'&#iG;\',\'&iF;\':\'&#iE;\',\'&iD;\':\'&#iC;\',\'&iB;\':\'&#iA;\',\'&iz;\':\'&#iy;\',\'&ix;\':\'&#iw;\',\'&iv;\':\'&#iu;\',\'⁢\':\'&#ir;\',\'&iq;\':\'&#ip;\',\'&io;\':\'&#im;\',\'&il;\':\'&#ik;\',\'&ij;\':\'&#ii;\',\'&ih;\':\'&#ie;\',\'⁣\':\'&#ib;\',\'&ia;\':\'&#i9;\',\'&i8;\':\'&#i7;\',\'&i6;\':\'&#i5;\',\'&i4;\':\'&#i3;\',\'&i2;\':\'&#i1;\',\'&i0;\':\'&#hZ;\',\'&hY;\':\'&#hX;\',\'&hW;\':\'&#hV;\',\'&hU;\':\'&#hT;\',\'&hS;\':\'&#hR;\',\'&hQ;\':\'&#hP;\',\'&hO;\':\'&#hN;\',\'&hM;\':\'&#hL;\',\'&hK;\':\'&#hJ;\',\'&hI;\':\'&#hH;\',\'&hG;\':\'&#hF;\',\'&hE;\':\'&#hD;\',\'&bx;\':\'&#hC;\',\'&hB;\':\'&#hA;\',\'&hz;\':\'&#hy;\',\'&hx;\':\'&#hw;\',\'&hv;\':\'&#hu;\',\'&ht;\':\'&#hs;\',\'&hq;\':\'&#hp;\',\'&ho;\':\'&#hn;\',\'&hm;\':\'&#hl;\',\'&hk;\':\'&#hj;\',\'&hi;\':\'&#hh;\',\'&hg;\':\'&#hf;\',\'&he;\':\'&#hd;\',\'&hc;\':\'&#hb;\',\'&ha;\':\'&#h9;\',\'&h8;\':\'&#h7;\',\'&h0;\':\'&#gZ;\',\'&gY;\':\'&#gX;\',\'&gW;\':\'&#gV;\',\'&gU;\':\'&#gT;\',\'&gS;\':\'&#gR;\',\'&gQ;\':\'&#gP;\',\'&gO;\':\'&#gN;\',\'∋\':\'&#gM;\',\'&gL;\':\'&#gK;\',\'&gJ;\':\'&#gI;\',\'&gH;\':\'&#gG;\',\'&gF;\':\'&#gE;\',\'&gD;\':\'&#gC;\',\'&6U;\':\'&#gB;\',\'&gA;\':\'&#gz;\',\'&gy;\':\'&#gx;\',\'&gw;\':\'&#gv;\',\'∨\':\'&#gu;\',\'>\':\'&#gs;\',\'&gr;\':\'&#gq;\',\'&gp;\':\'&#go;\',\'&gn;\':\'&#gl;\',\'&gk;\':\'&#gj;\',\'&gh;\':\'&#gg;\',\'&gf;\':\'&#gd;\',\'≠\':\'&#gc;\',\'&bw;\':\'&#gb;\',\'≤\':\'&#ga;\',\'≥\':\'&#g9;\',\'&3b;\':\'&#g8;\',\'&3P;\':\'&#g7;\',\'&g6;\':\'&#g5;\',\'&g4;\':\'&#g3;\',\'&g2;\':\'&#g1;\',\'&g0;\':\'&#fZ;\',\'&fY;\':\'&#fX;\',\'&fW;\':\'&#fV;\',\'&fU;\':\'&#fT;\',\'&fS;\':\'&#fR;\',\'&fQ;\':\'&#fP;\',\'&fO;\':\'&#fN;\',\'&fM;\':\'&#fL;\',\'&3H;\':\'&#fK;\',\'&fJ;\':\'&#fI;\',\'&fH;\':\'&#fG;\',\'&fF;\':\'&#fE;\',\'&fD;\':\'&#fC;\',\'&fB;\':\'&#fA;\',\'&fz;\':\'&#fy;\'};c.8u=["a","6T","8y","6L","bv","b","55","6S","bu","2J","1j","2t","bt","54","bs","6R","5K","dd","8x","N","bq","dl","dt","em","2U","1M","2T","h1","h2","h3","h4","h5","h6","O","i","bp","bo","1p","3k","li","bn","8E","4C","ol","bm","6O","p","1R","41","q","bl","2h","4X","bk","3r","3c","1m","3b","3P","3j","8D","4F","4G","8C","5I","8B","M","6P","bj","2I","l","fx"];c.b0=["br","hr","6Q","1y"];o c};f.1l.u.bi=j(C,5J,2S){l 2S=2S||J;if(C==\'4F\'){if((2S&&5J==\'6P\')||(!2S&&5J==\'4F\')){o R}}if(C==\'6O\'){if((2S&&5J==\'4X\')||(!2S&&5J==\'6O\')){o R}}o J};f.1l.u.6N=j(1w){c.1W=\'\';o 1w};f.1l.u.6M=j(1s){1s=c.bh(1s);1s=c.bg(1s);1s=c.bf(1s);1s=c.bc(1s);o 1s};f.1l.u.bh=j(1s){1h(l 8z in c.8A){1s=1s.S(1f 2O(8z,\'g\'),c.8A[8z])}o 1s};f.1l.u.bg=j(1s){l 3i=\'em|3c|3b|3P|8y|41|8x|6L\';o 1s.S(1f 2O(\'<\\/(\'+3i+\')><\\\\1>\',\'\'),\'\').S(1f 2O(\'(\\s*<(\'+3i+\')>\\s*){2}(.*)(\\s*<\\/\\\\2>\\s*){2}\',\'\'),\'<\\$2>\\$3<\\$2>\')};f.1l.u.bf=j(1s){o 1s.S(1f 2O(\'<(\'+c.8u.6u("|").S(/\\|4F/,\'\').S(/\\|5I/,\'\')+\')>(<br \\/>|&#be;|&bd;|\\\\s)*<\\/\\\\1>\',\'g\'),\'\')};f.1l.u.bc=j(1s){l 2g=1s.K(1f 2O(\'<41[^>]*>(.*?)<\\/41>\',\'fw\'));if(2g){1h(l i=0;i<2g.Y;i++){1s=1s.S(2g[i],2g[i].S(1f 2O(\'<br \\/>\',\'g\'),fv.fu(13,10)))}}o 1s};f.1l.u.bb=j(){o c.1W};f.1l.u.6K=j(){o{\'b\':\'3c\',\'i\':\'em\'}};f.1l.u.ba=j(X){c.1W+=X};f.1l.u.6J=j(X){if(c.ft){c.1W+=X}};f.1l.u.6I=j(X){if(!c.fs){c.1W+=X}};f.1l.u.6H=j(X){if(!c.fr){c.1W+=X}};f.1l.u.6k=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G),R)};f.1l.u.b9=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G))};f.1l.u.b8=j(C,G){};f.1l.u.b7=j(C){c.1W=c.1W.S(/<br \\/>$/,\'\')+c.8r(\'aZ\',C)+"</"+C+">"+c.8r(\'5G\',C)};f.1l.u.b6=j(C){};f.1l.u.b5=j(C){c.1W+="</"+C+">"};f.1l.u.b4=j(){c.5H=[\'N\',\'3r\'];c.3s.6G=[\'1m\'];c.3s.6F=[\'b3\',\'fq\'];c.8w=R};f.1l.u.b2=j(){c.5H=[];c.3s.6G=[];c.3s.6F=[];c.8w=J};f.1l.u.8v=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.8u,C)};f.1l.u.b1=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.b0,C)};f.1l.u.aX=j(C,2b){c.8s(\'5G\',C,2b)};f.1l.u.fp=j(C,2b){c.8s(\'aZ\',C,2b)};f.1l.u.aY=j(C,G){if(C!=\'li\'&&(C==\'2I\'||C==\'ol\')&&c.6E&&!c.8t&&c.6E==\'li\'){c.1W=c.1W.S(/<\\/li>$/,\'\');c.aX(C,\'</li>\')}};f.1l.u.8s=j(2R,C,2b){if(!c[\'3G\'+2R+\'3F\']){c[\'3G\'+2R+\'3F\']=[]}if(!c[\'3G\'+2R+\'3F\'][C]){c[\'3G\'+2R+\'3F\'][C]=[]}c[\'3G\'+2R+\'3F\'][C].1X(2b)};f.1l.u.8r=j(2R,C){if(c[\'3G\'+2R+\'3F\']&&c[\'3G\'+2R+\'3F\'][C]&&c[\'3G\'+2R+\'3F\'][C].Y>0){o c[\'3G\'+2R+\'3F\'][C].4Q()}o\'\'};f.aW=j(3Z,2s){l 2s=(1q 2s==\'2d\'?R:2s);D.53(c,1f f.2f(3Z,(2s?\'52\':\'4D\')));c.8q(\'4D\',\'52\');if(2s==R){c.2Q("/\\\\\\3Y[<\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'52\',\'4D\');c.2H("/\\\\\\3Y[<\\/\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'4D\')}c.4E("[\\\\fo-fm-6]*\\\\\\fl[a-z-8p-9]+",\'4D\',\'aV\');c.2Q("/\\\\\\3Y",\'4D\',\'8o\');c.2H("\\\\\\3Y/",\'8o\');c.2Q("\\fk",\'4D\',\'6C\');c.2H("\\fj",\'6C\');c.2Q("/\\\\\\3Y",\'6C\',\'8n\');c.2H("\\\\\\3Y/",\'8n\');o c};f.3D=j(){c.6B=J;c.5D=J;c.2s=R;c.4B={\'3W\':[],\'3g\':[],\'4A\':[]};o c};f.3D.u.3X=j(1w,2s){l 2s=(1q 2s==\'2d\'?c.2s:2s);c.6D=1f f.aW(c,2s);c.6D.3X(1w)};f.3D.u.52=j(K,2a){o R};f.3D.u.8o=j(X,2n){if(X.K(/fi[a-5F-9\\s]*E[a-5F-9\\s]*/mi)){o J}if(2n==f.3E){if(!c.6B){c.5D=R;c.2m={\'M\':f.1L.4w(X)}}V{if(c.2m[c.2e]){if(!c.2m[c.2e].6z){c.2m[c.2e].6z=[X]}V{c.2m[c.2e].6z.1X(X)}}}c.6B=R}o R};f.3D.u.6C=j(K,2n){if(2n==f.3E){K=f.1L.4w(K);if(K!=\'\'){c.2m[c.2e].1m=K}}V if(2n==f.5E){c.6B=J;c.5D=J;c.aU(c.2m)}o R};f.3D.u.8n=j(K,2n){if(2n==f.3E){c.2m[c.2e].8k=K.S(/^([\\s\\/\\*]*)|([\\s\\/\\*]*)$/gm,\'\')}o R};f.3D.u.aV=j(K){K=K.S(/^([\\s\\.]*)|([\\s\\.*]*)$/gm,\'\');l C=\'\';if(K.8h(\'.\')>0){l 8l=K.8m(\'.\');c.2e=8l[1];l C=8l[0]}V{c.2e=K}if(!c.5D){c.2m={\'M\':(!C?\'\':C.fh()+\': \')+c.2e};c.5D=R}if(!c.2m[c.2e]){c.2m[c.2e]={\'F\':c.2e}}if(C){if(!c.2m[c.2e].3i){c.2m[c.2e].3i=[C]}V{c.2m[c.2e].3i.1X(C)}}o R};f.3D.u.aU=j(6A){1h(l F in 6A){l 2P=6A[F];if(1q 2P==\'4C\'&&F!=\'M\'){c.4B.3W.1X({\'F\':f.1L.4w(2P.F),\'M\':6A.M,\'aT\':f.1L.4w((2P.6z||2P.3i).6u(\', \'))});if(2P.8k){c.4B.3g.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.8k})}if(2P.1m){c.4B.4A.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.1m})}}}};D.fn.aS=j(){if(c[0].8j==3)o!(/[^\\t\\n\\r ]/.2M(c[0].4z));o J};f.aS=j(n){if(n.8j==3)o!(/[^\\t\\n\\r ]/.2M(n.4z));o J};f.fg=j(3C){o!(/[^\\t\\n\\r ]/.2M(3C))};D.fn.4V=j(4y){l n=c;if(n[0].8j==3)n=n.5z().aR(0,1);if(n.51(4y).2G()==1)o n;V o n.5z(4y).aR(0,1)};f.1L={1k:j(3C,aQ,aO){l 4x=1f 2O(aQ,"g");o(3C.S(4x,aO))},ff:j(3C,aM,8i){o(3C.aN(0,8i)+aM+3C.6y(8i))},4w:j(3C){o 3C.S(/^(\\s*)|(\\s*)$/gm,\'\')},2F:j(3B,5C){1h(l i=0;i<3B.Y;i++){if(3B[i]===5C)o R}o J},8h:j(3B,4v){l 8g=-1;1h(l i=0;i<3B.Y;i++){if(3B[i]==4v){8g=i;1n}}o(8g)},aL:j(3B,F){1h(l i=0;i<3B.Y;i++){l 4v=3B[i];if(4v.F==F)o(4v)}o(1a)}};f.2D=j(E){c.1V=E;c.5x="fe";c.4s="\\r\\n"};f.2D.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);D(c.H.1j).O(c.1V.4R);l E=c;c.H.1j.aK=j(){E.H.4r="on";E.H=1K.1B.3A};c.H.fd=j(){E.6x()};c.H.aJ=j(){E.6x();E.2x()};c.H.aI=j(){E.6x()};c.H.1j.fc=j(){E.1E.1B.aH.aG=J};c.H.1j.fb=j(){E.1E.1B.aH.aG=J;E.5B(2l.fa.f9("3h"))};if(c.aF){if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();if(D.2A(c.B.3w))c.B.3w(c);c.5u()}c.aF=R;c.H.4r="on";4u{c.H=1K.1B.3A}4t(e){}};f.2D.u.1C=j(1F,1R){3e(1F){1i f.6t:1i f.6s:l L=c.2N(c.L(),f.6r);if(L){l 3v=L.1z.1z;if(L.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F)}1n;3R:if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F);1n}};f.2D.u.1d=j(){l 4Z=c.1E.1B.3A.4Z;if(4Z!=1a){if(4Z.5A!=2d)o(4Z.5A())}};f.2D.u.6x=j(){c.H.4Z=c.H.3V.4Y()};f.2D.u.5r=j(1D,1Y){1D.f8(1Y.F,1Y.1b)};f.2D.u.8e=j(O){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(O)}4t(e){}}V{c.5B(O)}};f.2D.u.aE=j(2k,2E){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(2k+1S.X+2E)}4t(e){}}};f.2D.u.aD=j(){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{l X=1S.X;c.1C(\'f7\');1S.8f(X)}4t(e){}}};f.2D.u.2x=j(){c.2j=1a};f.2D.u.5y=j(1c,3U){l 1S=c.H.3V.4Y();3U=3U?R:J;1S.f6(1c);1S.aC(3U);1S.4X();1c.4W()};f.2C=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.2C.u.5w=j(1K){l E=c;c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.O(c.1V.4R);c.6v();if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);D(c.H).3x("4W",j(){E.6v.f5(E)});if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.2C.u.O=j(O){if(1q O===\'3Q\'){4u{c.H.4r="aB"}4t(e){};O=O.S(/<em(\\b[^>]*)>/gi,"<i$1>").S(/<\\/em>/gi,"</i>").S(/<3c(\\b[^>]*)>/gi,"<b$1>").S(/<\\/3c>/gi,"</b>");D(c.H.1j).O(O);c.6v()}V o(D(c.H.1j).O())};f.2C.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.2C.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.2C.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.2C.u.3u=j(W){l E=f.2w[c.M];l L=1a;if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}V if(W.1A==13){if(!W.6m){L=E.1d();if(L&&L.1r.1o()==f.5q){W.f4();E.8e(\'<p></p>\')}}}};f.2C.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap()}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a")F=L.1z.1r.1o();if(F==f.3t)E.1C(f.4q,f.P)}};f.2C.u.6v=j(){if(c.H.4r=="aB"){4u{c.H.4r="on";c.H.2q("f3",\'\',J)}4t(e){}}};f.2C.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\'}V{o}}c.1W+=c.4P.C(C,G,R)};f.2C.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};f.3S=j(E){c.1V=E;c.5x="I";c.4s="\\r\\n"};f.3S.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3S.u.1C=j(1F,1R){if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F)};f.3S.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3S.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3S.u.3u=j(W){l E=f.2w[c.M];l 2y=E.1E.1B.2z();8d=2y.f2(0).f1;if(!D(8d).4V(f.6n.6u(","))[0]&&!D(8d).4V(\'li\')&&W.1A!=f.3T.aA&&W.1A!=f.3T.az&&W.1A!=f.3T.ay&&W.1A!=f.3T.ax&&W.1A!=f.3T.aw&&W.1A!=f.3T.av&&W.1A!=f.3T.au)E.1C(f.4q,f.P)};f.3S.u.2x=j(W){l E=f.2w[c.M];E.2j=1a};f.3d=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.3d.u.5w=j(1K){c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3d.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;1i f.as:1i f.ar:c.H.2q(1F,\'\',1a);l 1x=c.1d();l L=c.2N(1x,f.6n);if(L)D(L).f0(D(L).O());1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L&&L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.3d.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3d.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3d.u.3u=j(W){l E=f.2w[c.M];if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}};f.3d.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap();L=E.1d();if(L&&L.1r.1o()==f.5q)E.1C(f.4q,f.P);}if(W.1A==13&&W.6m){E.1C(\'eZ\')}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a"||F=="3r")F=L.1z.1r.1o();if(F==f.3t||F==f.an)E.1C(f.4q,f.P);}};f.3d.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\';if(1q G[\'I\']==\'3Q\')G[\'I\']=G[\'I\'].S(/eY-1m-3r/gi,\'\')}V{o}}c.1W+=c.4P.C(C,G,R)};f.3d.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};',62,1714,'||||||||||||this|||WYMeditor||||function||var|||return||||||prototype|||||||_options|tag|jQuery|wym|name|attributes|_doc|class|false|match|container|title|div|html||value|true|replace|mode||else|evt|text|length|_Listener|||||||||||null|css|node|selected|type|new|editor|for|case|body|replaceAll|XhtmlSaxListener|style|break|toLowerCase|label|typeof|tagName|xhtml|XhtmlParser|boxHtml|attr|raw|focusNode|input|parentNode|keyCode|contentWindow|_exec|styles|_iframe|cmd|scope|val|dialogHtml|_tags|iframe|Helper|form|result|row|href|options|param|range|key|src|_wym|output|push|oCss|anchorNode|||||||||||state|content|required|undefined|_current_element|Lexer|matches|script|attribute|_selected_image|left|window|_current_item|status|_regexes|_box|execCommand|aCss|only_wym_blocks|button|link|new_tag|INSTANCES|keyup|sel|getSelection|isFunction|eval|WymClassMozilla|WymClassExplorer|right|contains|size|addExitPattern|ul|blockquote|_mode_handlers|start|test|findUp|RegExp|details|addEntryPattern|position|closing|head|fieldset|_open_tags|XmlHelper|ParallelRegex|char|disabled|||||||||||skin|sub|strong|WymClassSafari|switch|_index|editorStyles|Text|tags|table|legend|XhtmlLexer|matched|pattern|top|stylesheet|sType|span|validator|BODY|keydown|ancestor|postInit|bind|preBind|dir|document|arr|str|WymCssParser|LEXER_UNMATCHED|_closing|_insert_|lang|parsed|defaults|inside|xml|sTmp|INDEX|newNode|sup|string|default|WymClassOpera|KEY|toStart|selection|classesItems|parse|x2a|parser||pre|_mode|addPattern|_patterns|baseline||bottom|middle|valign|charoff|justify|center|align|click|doc|find|sBodyHtml|tagname|sClass|oClass|sContainer|sTool|iframeHtml|WymClass|_tag_stack|FORMAT_BLOCK|designMode|_newLine|catch|try|item|trim|rExp|jqexpr|data|dialogStyles|css_settings|object|WymCss|addSpecialPattern|td|textarea|_invokeParser|_case|width|onload|basePath|dialog|sVal|console|helper|pop|_html|direction|addCssRules|styleSheets|parentsOrSelf|focus|select|createRange|caretPos||filter|Ignore|extend|cite|base|init|_stack|count|except|index|alt|tag_attributes|delimiter|close|sUrl|INIT_DIALOG|SKINS|skinPath|CssParser|wymeditor|TH|oContainer|oTool|wym_section|getValidTagAttributes|PRE|addCssRule|nodeName|BLOCKS|listen|bindEvents|initIframe|_class|setFocusToNode|parents|parentElement|paste|elem|_has_title|LEXER_EXIT|z0|after|avoided_tags|th|now_on_tag|colgroup|_tag_attributes|_non_tag|action|special|new_mode|accept|StateStack|_regex|_possible_tag_attributes|next|hidden|get|open|createElement|submitSelector|titleSelector|TITLE|sStamp|dialogImageSelector|DIALOG_LINK|dialogType||update|stringDelimiterRight|stringDelimiterLeft|toggleClass|BLOCKQUOTE|Array|TD|aClasses|wym_dialog|wym_cancel|wym_submit|wym_dialog_type|getTagForStyle|openBlockTag|ctrlKey|shiftKey|MAIN_CONTAINERS|UL|OL|childNodes|LI|OUTDENT|INDENT|join|enableDesignMode|iframeBodySelector|saveCaret|substring|expressions|style_details|_in_style|WymCssStyle|_Lexer|last_tag|skiped_attribute_values|skiped_attributes|addCss|addScript|addComment|getTagReplacements|address|afterParsing|beforeParsing|option|tr|img|col|bdo|abbr|prop|_current_attribute|SingleQuotedAttribute|DoubleQuotedAttribute|LEXER_SPECIAL|normalizeTag|expected_tag|LEXER_ENTER|OpeningTag||_addNonTagBlock|handler|unmatched|while|case_sensitive|regex|tag_defaults|only|valid_attributes|rows|cols|screen|charset|height|meta|icon|shortcut|subsection|section|prev|help|glossary|copyright|contents|chapter|bookmark|appendix|alternate|rel|escape_quotes|_entitiesDiv|mousedown|altSelector|ALT|SRC|srcSelector|SKINS_DEFAULT_CSS|loadSkin|grep|packed|min|pack|jquery|INSERT_HTML|jQueryPath|wymPath|PREVIEW|DIALOG_PASTE|DIALOG_TABLE|DIALOG_IMAGE|dialogFeatures|_element|STRINGS|bFound|firstNode|nodes|aTypes|NAME|CLASS_NAME|TOOL_TITLE|HTML|iframeBasePath|browser|Cancel|Submit|224|BR|ITALIC|BOLD|cssRules|insertRule|startNode|insert|pasteHTML|ret|indexOf|pos|nodeType|feedback_style|parts|split|WymCssFeedbackStyle|WymCssComment|_0|mapHandler|_getClosingTagContent|_insertContentWhenClosingTag|last_tag_opened|block_tags|isBlockTag|_avoiding_tags_implicitly|del|acronym|entity|entities|thead|tfoot|tbody|noscript|circ|_callCloseTagListener|_autoCloseUnclosed|_increaseOpenTagCounter|_callOpenTagListener|Css|Script|Comment|unparsed_character_count|getCurrent|_parser|enter|leave|_labels|default_attributes|default_attributes_and_events|_attributes|_events|readonly|all|media|javascript|http|ltr|toString|innerHTML|_formated_options|tagOptions|postInitDialog|newRow|iCols|iRows|INSERT_IMAGE|HREF|CREATE_LINK|hrefSelector|preInitDialog|responseText|async|url|ajax|found|htmlSelector|wDialog|replaceStrings|DIALOG_BODY|DIALOG_TITLE|JQUERY_PATH|WYM_PATH|CSS_PATH|DIRECTION|hasfocus|htmlValSelector|error|langPath|switchTo|lgt|H6|H5|H4|H3|H2|H1|sName|sContainers|CONTAINERS_ITEMS|CONTAINER_CLASS|CONTAINER_TITLE|CONTAINER_NAME|aContainers|sClasses|CLASSES_ITEMS|CLASS_TITLE|sTools|TOOLS_ITEMS|TOOL_CLASS|TOOL_NAME|aTools|STATUS|IFRAME|CLASSES|CONTAINERS|TOOLS|LOGO|IFRAME_BASE_PATH|WYM_INDEX|SaxListener|preInit|Paste_From_Word|indent|Table|wym_title|Image|Link|wym_classes|wym_containers|wym_tools|wym_iframe|Preview|Unlink|Outdent|Indent|names|super|italic|bold|DIV|metaKey|remove|children|INSERT_UNORDEREDLIST|INSERT_ORDEREDLIST|contentDocument|DELETE|BACKSPACE|DOWN|RIGHT|UP|LEFT|ENTER|off|collapse|unwrap|wrap|_initialized|returnValue|event|onclick|onkeyup|onfocus|findByName|inserted|substr|rep||old|slice|isPhantomNode|expr|addStyleSetting|WymCssStyleDeclaration|WymCssLexer|insertContentAfterClosingTag|fixNestingBeforeOpeningBlockTag|before|inline_tags|isInlineTag|allowStylingTagsAndAttributes|MsoNormal|avoidStylingTagsAndAttributes|closeUnopenedTag|closeUnknownTag|closeBlockTag|openUnknownTag|inlineTag|addContent|getResult|removeBrInPre|nbsp|160|removeEmptyTags|joinRepeatedEntities|replaceNamedEntities|shouldCloseTagAutomatically|tt|small|samp|optgroup|map|kbd|ins|dfn||code|caption|big|area|equiv|image|not|XhtmlValidator|UnquotedAttribute|TagAttributes|counter|autoCloseUnclosedBeforeTagClosing|autoCloseUnclosedBeforeNewOpening|_decreaseOpenTagCounter|ClosingTag|_tag|Listener|addAttributeTokens|addInTagDeclarationTokens|addTagTokens|addCssTokens|addScriptTokens|addCommentTokens|addTokens|unparsed|_reduce|is_match|current|_decodeSpecial|_|_isSpecialMode|__exit|_isModeEnd|LEXER_MATCHED|_dispatchTokens|_getPerlMatchingFlags|Tk7|Tk6|Tk5|Tk4|Tk3|Tk2|Tk1|_untokenizeRegex|_tokenizeRegex|_getCompoundedRegex|subject|getDefaultAttributesAndEventsForTag|getUniqueAttributesAndEventsForTag|getPossibleTagAttributes|validateAttribute|doesAttributeNeedsValidation|getDefaultAttributesAndEventsForTags|isValidTag|parseInt|possible_attributes|rowgroup|rowspan|headers|colspan|axis|summary|border|box|frame|braille|print|projection|multiple|defer|valuetype|usemap|home|rev|hreflang|datetime|submit|reset|file|checked|profile|rtl|polygon|poly|circle|rectangle|rect|shape|coords|designates|keyboard|tabindex|accesskey|language|escapeEntities|escapeOnce|escaped|_fixDoubleEscape|cancelSelector|previewSelector|dialogPreviewSelector|sText|textSelector|dialogPasteSelector|append|summarySelector|sCaption|newCaption|captionSelector||TABLE|colsSelector|rowsSelector|dialogTableSelector|dialogLinkSelector|uniqueStamp|dialogTypeSelector||SKINS_DEFAULT_JS|initSkin|addClass|loadCss|each|appendChild|target||IMG|configureEditorUsingRawCss|skins|computeJqueryPath|computeWymPath|computeBasePath|sData|now|toggleHtml|encloseString|BASE_PATH|bodyHtml|dialogPreviewHtml|dialogPasteHtml|dialogTableHtml|dialogImageHtml|dialogLinkHtml|features|sMessage|statusSelector|STRING|CLASS|insertBefore|dialogFeaturesPreview|TOGGLE_HTML|PASTE|INSERT_TABLE|exec|updateEvent|updateSelector|classSelector|containerSelector|toolSelector|hide|containersItemHtml|containersItems|classesItemHtml|toolsItemHtml|toolsItems|statusHtml|htmlHtml|classesHtml|containersHtml|toolsHtml|logoHtml|wym_dialog_preview|wym_text|wym_dialog_paste|wym_cols|wym_rows|wym_summary|wym_caption|wym_dialog_table|Title|||wym_alt|wym_src|URL|wym_dialog_image|wym_href|wym_dialog_link|xhtml1|DTD|org|www|300|560|resizable|toolbar|titlebar|menubar|wym_html_val|wym_status|wym_html|wym_box|ToggleHtml|Paste|InsertTable|InsertImage|CreateLink|Redo|Undo|InsertUnorderedList|InsertOrderedList|Subscript|Superscript|Italic|Bold|IFRAME_DEFAULT|LANG_DEFAULT_PATH|SKINS_DEFAULT_PATH|apple|InsertLineBreak|replaceWith|startContainer|getRangeAt|styleWithCSS|preventDefault|call|moveToElementText|Cut|addRule|getData|clipboardData|onpaste|onbeforepaste|onbeforedeactivate|className|insertAt|isPhantomString|toUpperCase|end|x7d|x7b|x2e|z1||sa|insertContentBeforeClosingTag|main1|remove_embeded_styles|remove_scripts|remove_comments|fromCharCode|String|gmi|extends|9830|diams|9829|hearts|9827|clubs|9824|spades|9674|loz|9002|rang|9001|8971|rfloor|8970|lfloor|8969|rceil|8968|lceil|8901|sdot|8869|perp|8855|otimes|8853|oplus|8839|supe|8838|sube|8836|nsub|8835|8834|8805|8804|8801|8800|8776||asymp|8773|cong||8764|sim|8756||there4|8747|int|8746|cup|8745|cap|8744|8743|and|8736|ang|8734|infin|8733|8730|radic|8727|lowast|8722|minus|8721|sum|8719|prod|8715|8713|notin|8712|isin|8711|nabla|8709|empty|8707|exist|8706|part|8704|forall|||||||8660|hArr|8659|dArr|8658|rArr|8657|uArr|8656|lArr|8629|crarr|8596|harr|8595|darr|8594|rarr|8593|uarr||8592|larr|8501|alefsym|8482|trade|8476|real|8472|weierp|8465|8364|euro|8260|frasl|8254|oline|8250|rsaquo|8249|lsaquo|8243|Prime|8242|prime|8240|permil|8230|hellip|8226|bull|8225|Dagger|8224|dagger|8222|bdquo|8221|rdquo|8220|ldquo|8218|sbquo|8217|rsquo|8216|lsquo||8212|||mdash|8211|ndash|8207|rlm|8206||lrm|8205|zwj|8204||zwnj|8201|thinsp|8195|emsp|8194|ensp|982|piv|978|upsih|977|thetasym|969|omega|968|psi|967|chi|966|phi|965|upsilon|964|tau|963|sigma|962|sigmaf|961|rho|960|959|omicron|958|xi|957|956|955|lambda|954|kappa|953|iota|952|theta|951|eta|950|zeta|949|epsilon|948|delta|947|gamma|946|beta|945|alpha|937||Omega|936|Psi|935|Chi|934|Phi|933|Upsilon|932|Tau|931|Sigma|929|Rho|928|Pi|927|Omicron|926|Xi|925|Nu|924|Mu|923|Lambda|922|Kappa|921|Iota|920|Theta|919|Eta|918|Zeta|917|Epsilon|916|Delta|915|Gamma|914|Beta|913|Alpha|732|tilde|710|402|fnof|376|Yuml|353|scaron|352|Scaron|339|oelig|338|OElig|255|yuml|254|thorn|253|yacute|252|uuml|251|ucirc|250|uacute|249|ugrave|248|oslash|247|divide|246|ouml|245|otilde|244|ocirc|243|oacute|242|ograve|241|ntilde|240|eth|239|iuml|238|icirc|237|iacute|236|igrave|235|euml|234|ecirc|233|eacute|232||egrave|231|ccedil||230|aelig|229|aring|228|auml|227|atilde|226|acirc|225|aacute|agrave|223|szlig|222|THORN|221|Yacute|220|Uuml|219|Ucirc|218|Uacute|217|Ugrave|216|Oslash|215|times|214|Ouml|213|Otilde|212|Ocirc|211|Oacute|210|Ograve|209|Ntilde|208|ETH|207|Iuml|206|Icirc|205|Iacute|204|Igrave|203|Euml|202|Ecirc|201|Eacute|200|Egrave||199|Ccedil|198|AElig|197|Aring|196|Auml|195|Atilde|194||Acirc|193|Aacute|192|Agrave|191|iquest|190|frac34|189|frac12|188|frac14|187|raquo|186|ordm|185|sup1|184|cedil|183|middot|182|para|181|micro|180|acute|179|sup3|178|sup2|177|plusmn|176|deg|175|macr|174|reg|173|shy|172|171||laquo|170|ordf||169|copy|168|uml|167||sect|166|brvbar||165||yen|164|curren|163|pound|162|cent|161|iexcl|last_tag_attributes|com|microsoft|schemas|urn|_current_match|_last_match|_matches|boolean|concat|events|continue|groups|none|rules|vsides|rhs|lhs|hsides|below|above|void|cellspacing|cellpadding|aural|handheld|tv|tty|vbs|vbscript|jscript|ecmascript|ref|standby|declare|codetype|codebase|classid|archive|scheme|cookie|set|refresh||expires||speech|radio|password||checkbox|maxlength|longdesc|ismap|xmlns|post|method|enctype|nohref|onmouseup|onmouseout|onmouseover|onmousemove|onmousedown|ondblclick|mouse|onkeypress|onkeydown|frameset|onblur|onselect|onreset|onsubmit|onchange|onunload|core|charAt|parseAttributes|039|quot|textContent|shift|formated_options|amp|CDATA|cdataSection|contentTag|insertCell|insertRow|createCaption|newCol|opener|wym_skin_|ownerDocument|computeCssPath|addRange|selectNodeContents|getTime|Date|toggle|write|parsing||replaceChild|removeAttr|removeChild|firstChild|ready|blur|wym_box_|safari|opera|mozilla|msie|wymeditors|Number_Of_Cols|Number_Of_Rows|Summary|Caption|Alternative_Text|dtd|strict|TR|w3|EN|Strict|XHTML|W3C|PUBLIC|DOCTYPE|yes|scrollbars|wymupdate|iframeSelector|classesSelector|containersSelector|toolsListSelector|toolsSelector|boxSelector|Source_Code|Status|wym_classes_|Classes|wym_containers_th|Table_Header|wym_containers_blockquote|Blockquote|wym_containers_pre|Preformatted|wym_containers_h6|Heading_6|wym_containers_h5|Heading_5|wym_containers_h4|Heading_4|wym_containers_h3|Heading_3|wym_containers_h2|Heading_2|wym_containers_h1|Heading_1|wym_containers_p|Paragraph|Containers|wym_tools_preview|wym_tools_html|wym_tools_paste|wym_tools_table|wym_tools_image|wym_tools_unlink|wym_tools_link|wym_tools_redo|wym_tools_undo|wym_tools_outdent|wym_tools_indent|wym_tools_unordered_list|Unordered_List|wym_tools_ordered_list|Ordered_List|wym_tools_subscript|wym_tools_superscript|wym_tools_emphasis|Emphasis|wym_tools_strong|Strong|Tools|parent|wymiframe|wym_wymeditor_link|wym_area_bottom|wym_area_main|wym_area_right|wym_area_left|wym_area_top|TEXT|ATTRIBUTE|ELEMENT|NODE|CURSOR|HOME|END|UNLINK|FormatBlock|InsertHTML|Wym_Dialog_Body|Wym_Dialog_Title|Wym_Status|Wym_Iframe|Wym_Html|Wym_Container_Class|Wym_Containers_Title|Wym_Container_Name|Wym_Containers_Items|Wym_Containers|Wym_Class_Title|Wym_Class_Name|Wym_Classes_Items|Wym_Classes|Wym_Tool_Class|Wym_Tool_Title|Wym_Tool_Name|Wym_Tools_Items||Wym_Tools|Wym_Logo|Wym_Direction|Wym_Jquery_Path|Wym_Iframe_Base_Path|Wym_Wym_Path|Wym_Css_Path|Wym_Base_Path|wym_index|Wym_Index|rc1|VERSION|profileEnd|trace|timeEnd|time|groupEnd|group|dirxml|assert|warn|info|debug|log|firebug'.split('|'),0,{})) |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/bg.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['bg'] = { |
| + | Strong: 'Получер', |
| + | Emphasis: 'Курсив', |
| + | Superscript: 'Горен индекс', |
| + | Subscript: 'Долен индекс', |
| + | Ordered_List: 'Подреден списък', |
| + | Unordered_List: 'Неподреден списък', |
| + | Indent: 'Блок навътре', |
| + | Outdent: 'Блок навън', |
| + | Undo: 'Стъпка назад', |
| + | Redo: 'Стъпка напред', |
| + | Link: 'Създай хипервръзка', |
| + | Unlink: 'Премахни хипервръзката', |
| + | Image: 'Изображение', |
| + | Table: 'Таблица', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Абзац', |
| + | Heading_1: 'Заглавие 1', |
| + | Heading_2: 'Заглавие 2', |
| + | Heading_3: 'Заглавие 3', |
| + | Heading_4: 'Заглавие 4', |
| + | Heading_5: 'Заглавие 5', |
| + | Heading_6: 'Заглавие 6', |
| + | Preformatted: 'Преформатиран', |
| + | Blockquote: 'Цитат', |
| + | Table_Header: 'Заглавие на таблицата', |
| + | URL: 'URL', |
| + | Title: 'Заглавие', |
| + | Alternative_Text: 'Алтернативен текст', |
| + | Caption: 'Етикет', |
| + | Summary: 'Общо', |
| + | Number_Of_Rows: 'Брой редове', |
| + | Number_Of_Cols: 'Брой колони', |
| + | Submit: 'Изпрати', |
| + | Cancel: 'Отмени', |
| + | Choose: 'Затвори', |
| + | Preview: 'Предварителен преглед', |
| + | Paste_From_Word: 'Вмъкни от MS WORD', |
| + | Tools: 'Инструменти', |
| + | Containers: 'Контейнери', |
| + | Classes: 'Класове', |
| + | Status: 'Статус', |
| + | Source_Code: 'Източник, код' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/ca.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['ca'] = { |
| + | Strong: 'Ressaltar', |
| + | Emphasis: 'Emfatitzar', |
| + | Superscript: 'Superindex', |
| + | Subscript: 'Subindex', |
| + | Ordered_List: 'Llistat ordenat', |
| + | Unordered_List: 'Llistat sense ordenar', |
| + | Indent: 'Indentat', |
| + | Outdent: 'Sense indentar', |
| + | Undo: 'Desfer', |
| + | Redo: 'Refer', |
| + | Link: 'Enllaçar', |
| + | Unlink: 'Eliminar enllaç', |
| + | Image: 'Imatge', |
| + | Table: 'Taula', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paràgraf', |
| + | Heading_1: 'Capçalera 1', |
| + | Heading_2: 'Capçalera 2', |
| + | Heading_3: 'Capçalera 3', |
| + | Heading_4: 'Capçalera 4', |
| + | Heading_5: 'Capçalera 5', |
| + | Heading_6: 'Capçalera 6', |
| + | Preformatted: 'Pre-formatejat', |
| + | Blockquote: 'Cita', |
| + | Table_Header: 'Capçalera de la taula', |
| + | URL: 'URL', |
| + | Title: 'Títol', |
| + | Alternative_Text: 'Text alternatiu', |
| + | Caption: 'Llegenda', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Nombre de files', |
| + | Number_Of_Cols: 'Nombre de columnes', |
| + | Submit: 'Enviar', |
| + | Cancel: 'Cancel·lar', |
| + | Choose: 'Triar', |
| + | Preview: 'Vista prèvia', |
| + | Paste_From_Word: 'Pegar des de Word', |
| + | Tools: 'Eines', |
| + | Containers: 'Contenidors', |
| + | Classes: 'Classes', |
| + | Status: 'Estat', |
| + | Source_Code: 'Codi font' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/cs.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['cs'] = { |
| + | Strong: 'Tučné', |
| + | Emphasis: 'Kurzíva', |
| + | Superscript: 'Horní index', |
| + | Subscript: 'Dolní index', |
| + | Ordered_List: 'Číslovaný seznam', |
| + | Unordered_List: 'Nečíslovaný seznam', |
| + | Indent: 'Zvětšit odsazení', |
| + | Outdent: 'Zmenšit odsazení', |
| + | Undo: 'Zpět', |
| + | Redo: 'Znovu', |
| + | Link: 'Vytvořit odkaz', |
| + | Unlink: 'Zrušit odkaz', |
| + | Image: 'Obrázek', |
| + | Table: 'Tabulka', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Odstavec', |
| + | Heading_1: 'Nadpis 1. úrovně', |
| + | Heading_2: 'Nadpis 2. úrovně', |
| + | Heading_3: 'Nadpis 3. úrovně', |
| + | Heading_4: 'Nadpis 4. úrovně', |
| + | Heading_5: 'Nadpis 5. úrovně', |
| + | Heading_6: 'Nadpis 6. úrovně', |
| + | Preformatted: 'Předformátovaný text', |
| + | Blockquote: 'Citace', |
| + | Table_Header: 'Hlavičková buňka tabulky', |
| + | URL: 'Adresa', |
| + | Title: 'Text po najetí myší', |
| + | Alternative_Text: 'Text pro případ nezobrazení obrázku', |
| + | Caption: 'Titulek tabulky', |
| + | Summary: 'Shrnutí obsahu', |
| + | Number_Of_Rows: 'Počet řádek', |
| + | Number_Of_Cols: 'Počet sloupců', |
| + | Submit: 'Vytvořit', |
| + | Cancel: 'Zrušit', |
| + | Choose: 'Vybrat', |
| + | Preview: 'Náhled', |
| + | Paste_From_Word: 'Vložit z Wordu', |
| + | Tools: 'Nástroje', |
| + | Containers: 'Typy obsahu', |
| + | Classes: 'Třídy', |
| + | Status: 'Stav', |
| + | Source_Code: 'Zdrojový kód' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/cy.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['cy'] = { |
| + | Strong: 'Bras', |
| + | Emphasis: 'Italig', |
| + | Superscript: 'Uwchsgript', |
| + | Subscript: 'Is-sgript', |
| + | Ordered_List: 'Rhestr mewn Trefn', |
| + | Unordered_List: 'Pwyntiau Bwled', |
| + | Indent: 'Mewnoli', |
| + | Outdent: 'Alloli', |
| + | Undo: 'Dadwneud', |
| + | Redo: 'Ailwneud', |
| + | Link: 'Cysylltu', |
| + | Unlink: 'Datgysylltu', |
| + | Image: 'Delwedd', |
| + | Table: 'Tabl', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraff', |
| + | Heading_1: 'Pennawd 1', |
| + | Heading_2: 'Pennawd 2', |
| + | Heading_3: 'Pennawd 3', |
| + | Heading_4: 'Pennawd 4', |
| + | Heading_5: 'Pennawd 5', |
| + | Heading_6: 'Pennawd 6', |
| + | Preformatted: 'Rhagfformat', |
| + | Blockquote: 'Bloc Dyfyniad', |
| + | Table_Header: 'Pennyn Tabl', |
| + | URL: 'URL', |
| + | Title: 'Teitl', |
| + | Alternative_Text: 'Testun Amgen', |
| + | Caption: 'Pennawd', |
| + | Summary: 'Crynodeb', |
| + | Number_Of_Rows: 'Nifer y rhesi', |
| + | Number_Of_Cols: 'Nifer y colofnau', |
| + | Submit: 'Anfon', |
| + | Cancel: 'Diddymu', |
| + | Choose: 'Dewis', |
| + | Preview: 'Rhagolwg', |
| + | Paste_From_Word: 'Gludo o Word', |
| + | Tools: 'Offer', |
| + | Containers: 'Cynhwysyddion', |
| + | Classes: 'Dosbarthiadau', |
| + | Status: 'Statws', |
| + | Source_Code: 'Cod ffynhonnell' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/de.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['de'] = { |
| + | Strong: 'Fett', |
| + | Emphasis: 'Kursiv', |
| + | Superscript: 'Text hochstellen', |
| + | Subscript: 'Text tiefstellen', |
| + | Ordered_List: 'Geordnete Liste einfügen', |
| + | Unordered_List: 'Ungeordnete Liste einfügen', |
| + | Indent: 'Einzug erhöhen', |
| + | Outdent: 'Einzug vermindern', |
| + | Undo: 'Befehle rückgängig machen', |
| + | Redo: 'Befehle wiederherstellen', |
| + | Link: 'Hyperlink einfügen', |
| + | Unlink: 'Hyperlink entfernen', |
| + | Image: 'Bild einfügen', |
| + | Table: 'Tabelle einfügen', |
| + | HTML: 'HTML anzeigen/verstecken', |
| + | Paragraph: 'Absatz', |
| + | Heading_1: 'Überschrift 1', |
| + | Heading_2: 'Überschrift 2', |
| + | Heading_3: 'Überschrift 3', |
| + | Heading_4: 'Überschrift 4', |
| + | Heading_5: 'Überschrift 5', |
| + | Heading_6: 'Überschrift 6', |
| + | Preformatted: 'Vorformatiert', |
| + | Blockquote: 'Zitat', |
| + | Table_Header: 'Tabellenüberschrift', |
| + | URL: 'URL', |
| + | Title: 'Titel', |
| + | Alternative_Text: 'Alternativer Text', |
| + | Caption: 'Tabellenüberschrift', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Anzahl Zeilen', |
| + | Number_Of_Cols: 'Anzahl Spalten', |
| + | Submit: 'Absenden', |
| + | Cancel: 'Abbrechen', |
| + | Choose: 'Auswählen', |
| + | Preview: 'Vorschau', |
| + | Paste_From_Word: 'Aus Word einfügen', |
| + | Tools: 'Werkzeuge', |
| + | Containers: 'Inhaltstyp', |
| + | Classes: 'Klassen', |
| + | Status: 'Status', |
| + | Source_Code: 'Quellcode' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/en.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['en'] = { |
| + | Strong: 'Strong', |
| + | Emphasis: 'Emphasis', |
| + | Superscript: 'Superscript', |
| + | Subscript: 'Subscript', |
| + | Ordered_List: 'Ordered List', |
| + | Unordered_List: 'Unordered List', |
| + | Indent: 'Indent', |
| + | Outdent: 'Outdent', |
| + | Undo: 'Undo', |
| + | Redo: 'Redo', |
| + | Link: 'Link', |
| + | Unlink: 'Unlink', |
| + | Image: 'Image', |
| + | Table: 'Table', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraph', |
| + | Heading_1: 'Heading 1', |
| + | Heading_2: 'Heading 2', |
| + | Heading_3: 'Heading 3', |
| + | Heading_4: 'Heading 4', |
| + | Heading_5: 'Heading 5', |
| + | Heading_6: 'Heading 6', |
| + | Preformatted: 'Preformatted', |
| + | Blockquote: 'Blockquote', |
| + | Table_Header: 'Table Header', |
| + | URL: 'URL', |
| + | Title: 'Title', |
| + | Alternative_Text: 'Alternative text', |
| + | Caption: 'Caption', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Number of rows', |
| + | Number_Of_Cols: 'Number of cols', |
| + | Submit: 'Submit', |
| + | Cancel: 'Cancel', |
| + | Choose: 'Choose', |
| + | Preview: 'Preview', |
| + | Paste_From_Word: 'Paste from Word', |
| + | Tools: 'Tools', |
| + | Containers: 'Containers', |
| + | Classes: 'Classes', |
| + | Status: 'Status', |
| + | Source_Code: 'Source code' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/es.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['es'] = { |
| + | Strong: 'Resaltar', |
| + | Emphasis: 'Enfatizar', |
| + | Superscript: 'Superindice', |
| + | Subscript: 'Subindice', |
| + | Ordered_List: 'Lista ordenada', |
| + | Unordered_List: 'Lista sin ordenar', |
| + | Indent: 'Indentado', |
| + | Outdent: 'Sin indentar', |
| + | Undo: 'Deshacer', |
| + | Redo: 'Rehacer', |
| + | Link: 'Enlazar', |
| + | Unlink: 'Eliminar enlace', |
| + | Image: 'Imagen', |
| + | Table: 'Tabla', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Párrafo', |
| + | Heading_1: 'Cabecera 1', |
| + | Heading_2: 'Cabecera 2', |
| + | Heading_3: 'Cabecera 3', |
| + | Heading_4: 'Cabecera 4', |
| + | Heading_5: 'Cabecera 5', |
| + | Heading_6: 'Cabecera 6', |
| + | Preformatted: 'Preformateado', |
| + | Blockquote: 'Cita', |
| + | Table_Header: 'Cabecera de la tabla', |
| + | URL: 'URL', |
| + | Title: 'Título', |
| + | Alternative_Text: 'Texto alternativo', |
| + | Caption: 'Leyenda', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Número de filas', |
| + | Number_Of_Cols: 'Número de columnas', |
| + | Submit: 'Enviar', |
| + | Cancel: 'Cancelar', |
| + | Choose: 'Seleccionar', |
| + | Preview: 'Vista previa', |
| + | Paste_From_Word: 'Pegar desde Word', |
| + | Tools: 'Herramientas', |
| + | Containers: 'Contenedores', |
| + | Classes: 'Clases', |
| + | Status: 'Estado', |
| + | Source_Code: 'Código fuente' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/fa.js
+46
-0
| @@ | @@ -0,0 +1,46 @@ |
| + | //Translation To Persian: Ghassem Tofighi (http://ght.ir) |
| + | WYMeditor.STRINGS['fa'] = { |
| + | Strong: 'پررنگ',//Strong |
| + | Emphasis: 'ایتالیک',//Emphasis |
| + | Superscript: 'بالانويس ',//Superscript |
| + | Subscript: 'زيرنويس',//Subscript |
| + | Ordered_List: 'لیست مرتب',//Ordered List |
| + | Unordered_List: 'لیست نامرتب',//Unordered List |
| + | Indent: 'افزودن دندانه',//Indent |
| + | Outdent: 'کاهش دندانه',//Outdent |
| + | Undo: 'واگردانی',//Undo |
| + | Redo: 'تکرار',//Redo |
| + | Link: 'ساختن پیوند',//Link |
| + | Unlink: 'برداشتن پیوند',//Unlink |
| + | Image: 'تصویر',//Image |
| + | Table: 'جدول',//Table |
| + | HTML: 'HTML',//HTML |
| + | Paragraph: 'پاراگراف',//Paragraph |
| + | Heading_1: 'سرتیتر ۱',//Heading 1 |
| + | Heading_2: 'سرتیتر ۲',//Heading 2 |
| + | Heading_3: 'سرتیتر ۳',//Heading 3 |
| + | Heading_4: 'سرتیتر ۴',//Heading 4 |
| + | Heading_5: 'سرتیتر ۵',//Heading 5 |
| + | Heading_6: 'سرتیتر ۶',//Heading 6 |
| + | Preformatted: 'قالب آماده',//Preformatted |
| + | Blockquote: 'نقل قول',//Blockquote |
| + | Table_Header: 'سرجدول',//Table Header |
| + | URL: 'آدرس اینترنتی',//URL |
| + | Title: 'عنوان',//Title |
| + | Alternative_Text: 'متن جایگزین',//Alternative text |
| + | Caption: 'عنوان',//Caption |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'تعداد سطرها',//Number of rows |
| + | Number_Of_Cols: 'تعداد ستونها',//Number of cols |
| + | Submit: 'فرستادن',//Submit |
| + | Cancel: 'لغو',//Cancel |
| + | Choose: 'انتخاب',//Choose |
| + | Preview: 'پیشنمایش',//Preview |
| + | Paste_From_Word: 'انتقال از ورد',//Paste from Word |
| + | Tools: 'ابزار',//Tools |
| + | Containers: 'قالبها',//Containers |
| + | Classes: 'کلاسها',//Classes |
| + | Status: 'وضعیت',//Status |
| + | Source_Code: 'کد مبدأ'//Source code |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/fi.js
+44
-0
| @@ | @@ -0,0 +1,44 @@ |
| + | WYMeditor.STRINGS['fi'] = { |
| + | Strong: 'Lihavoitu', |
| + | Emphasis: 'Korostus', |
| + | Superscript: 'Yläindeksi', |
| + | Subscript: 'Alaindeksi', |
| + | Ordered_List: 'Numeroitu lista', |
| + | Unordered_List: 'Luettelomerkit', |
| + | Indent: 'Suurenna sisennystä', |
| + | Outdent: 'Pienennä sisennystä', |
| + | Undo: 'Kumoa', |
| + | Redo: 'Toista', |
| + | Link: 'Linkitä', |
| + | Unlink: 'Poista linkitys', |
| + | Image: 'Kuva', |
| + | Table: 'Taulukko', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Kappale', |
| + | Heading_1: 'Otsikko 1', |
| + | Heading_2: 'Otsikko 2', |
| + | Heading_3: 'Otsikko 3', |
| + | Heading_4: 'Otsikko 4', |
| + | Heading_5: 'Otsikko 5', |
| + | Heading_6: 'Otsikko 6', |
| + | Preformatted: 'Esimuotoilu', |
| + | Blockquote: 'Sitaatti', |
| + | Table_Header: 'Taulukon otsikko', |
| + | URL: 'URL', |
| + | Title: 'Otsikko', |
| + | Alternative_Text: 'Vaihtoehtoinen teksti', |
| + | Caption: 'Kuvateksti', |
| + | Summary: 'Yhteenveto', |
| + | Number_Of_Rows: 'Rivien määrä', |
| + | Number_Of_Cols: 'Palstojen määrä', |
| + | Submit: 'Lähetä', |
| + | Cancel: 'Peruuta', |
| + | Choose: 'Valitse', |
| + | Preview: 'Esikatsele', |
| + | Paste_From_Word: 'Tuo Wordista', |
| + | Tools: 'Työkalut', |
| + | Containers: 'Muotoilut', |
| + | Classes: 'Luokat', |
| + | Status: 'Tila', |
| + | Source_Code: 'Lähdekoodi' |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/fr.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['fr'] = { |
| + | Strong: 'Mise en évidence', |
| + | Emphasis: 'Emphase', |
| + | Superscript: 'Exposant', |
| + | Subscript: 'Indice', |
| + | Ordered_List: 'Liste Ordonnée', |
| + | Unordered_List: 'Liste Non-Ordonnée', |
| + | Indent: 'Imbriqué', |
| + | Outdent: 'Non-imbriqué', |
| + | Undo: 'Annuler', |
| + | Redo: 'Rétablir', |
| + | Link: 'Lien', |
| + | Unlink: 'Supprimer le Lien', |
| + | Image: 'Image', |
| + | Table: 'Tableau', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraphe', |
| + | Heading_1: 'Titre 1', |
| + | Heading_2: 'Titre 2', |
| + | Heading_3: 'Titre 3', |
| + | Heading_4: 'Titre 4', |
| + | Heading_5: 'Titre 5', |
| + | Heading_6: 'Titre 6', |
| + | Preformatted: 'Pré-formatté', |
| + | Blockquote: 'Citation', |
| + | Table_Header: 'Cellule de titre', |
| + | URL: 'URL', |
| + | Title: 'Titre', |
| + | Alternative_Text: 'Texte alternatif', |
| + | Caption: 'Légende', |
| + | Summary: 'Résumé', |
| + | Number_Of_Rows: 'Nombre de lignes', |
| + | Number_Of_Cols: 'Nombre de colonnes', |
| + | Submit: 'Envoyer', |
| + | Cancel: 'Annuler', |
| + | Choose: 'Choisir', |
| + | Preview: 'Prévisualisation', |
| + | Paste_From_Word: 'Copier depuis Word', |
| + | Tools: 'Outils', |
| + | Containers: 'Type de texte', |
| + | Classes: 'Type de contenu', |
| + | Status: 'Infos', |
| + | Source_Code: 'Code source' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/gl.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['gl'] = { |
| + | Strong: 'Moita énfase', |
| + | Emphasis: 'Énfase', |
| + | Superscript: 'Superíndice', |
| + | Subscript: 'Subíndice', |
| + | Ordered_List: 'Lista ordenada', |
| + | Unordered_List: 'Lista sen ordenar', |
| + | Indent: 'Aniñar', |
| + | Outdent: 'Desaniñar', |
| + | Undo: 'Desfacer', |
| + | Redo: 'Refacer', |
| + | Link: 'Ligazón', |
| + | Unlink: 'Desligar', |
| + | Image: 'Imaxe', |
| + | Table: 'Táboa', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Parágrafo', |
| + | Heading_1: 'Título 1', |
| + | Heading_2: 'Título 2', |
| + | Heading_3: 'Título 3', |
| + | Heading_4: 'Título 4', |
| + | Heading_5: 'Título 5', |
| + | Heading_6: 'Título 6', |
| + | Preformatted: 'Preformatado', |
| + | Blockquote: 'Cita en parágrafo', |
| + | Table_Header: 'Cabeceira da táboa', |
| + | URL: 'URL', |
| + | Title: 'Título', |
| + | Alternative_Text: 'Texto alternativo', |
| + | Caption: 'Título', |
| + | Summary: 'Resumo', |
| + | Number_Of_Rows: 'Número de filas', |
| + | Number_Of_Cols: 'Número de columnas', |
| + | Submit: 'Enviar', |
| + | Cancel: 'Cancelar', |
| + | Choose: 'Escoller', |
| + | Preview: 'Previsualizar', |
| + | Paste_From_Word: 'Colar dende Word', |
| + | Tools: 'Ferramentas', |
| + | Containers: 'Contenedores', |
| + | Classes: 'Clases', |
| + | Status: 'Estado', |
| + | Source_Code: 'Código fonte' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/he.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['he'] = { |
| + | Strong: 'חזק', |
| + | Emphasis: 'מובלט', |
| + | Superscript: 'כתב עילי', |
| + | Subscript: 'כתב תחתי', |
| + | Ordered_List: 'רשימה ממוספרת', |
| + | Unordered_List: 'רשימה לא ממוספרת', |
| + | Indent: 'הזחה פנימה', |
| + | Outdent: 'הזחה החוצה', |
| + | Undo: 'בטל פעולה', |
| + | Redo: 'בצע מחדש פעולה', |
| + | Link: 'קישור', |
| + | Unlink: 'בטל קישור', |
| + | Image: 'תמונה', |
| + | Table: 'טבלה', |
| + | HTML: 'קוד HTML', |
| + | Paragraph: 'פסקה', |
| + | Heading_1: 'כותרת 1 ; תג <h1>', |
| + | Heading_2: 'כותרת 2 ; תג <h2>', |
| + | Heading_3: 'כותרת 3 ; תג <h3>', |
| + | Heading_4: 'כותרת 4 ; תג <h4>', |
| + | Heading_5: 'כותרת 5 ; תג <h5>', |
| + | Heading_6: 'כותרת 6 ; תג <h6>', |
| + | Preformatted: 'משמר רווחים', |
| + | Blockquote: 'ציטוט', |
| + | Table_Header: 'כותרת טבלה', |
| + | URL: 'קישור (URL)', |
| + | Title: 'כותרת', |
| + | Alternative_Text: 'טקסט חלופי', |
| + | Caption: 'כותרת', |
| + | Summary: 'סיכום', |
| + | Number_Of_Rows: 'מספר שורות', |
| + | Number_Of_Cols: 'מספר טורים', |
| + | Submit: 'שלח', |
| + | Cancel: 'בטל', |
| + | Choose: 'בחר', |
| + | Preview: 'תצוגה מקדימה', |
| + | Paste_From_Word: 'העתק מ-Word', |
| + | Tools: 'כלים', |
| + | Containers: 'מיכלים', |
| + | Classes: 'מחלקות', |
| + | Status: 'מצב', |
| + | Source_Code: 'קוד מקור' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/hr.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['hr'] = { |
| + | Strong: 'Podebljano', |
| + | Emphasis: 'Naglašeno', |
| + | Superscript: 'Iznad', |
| + | Subscript: 'Ispod', |
| + | Ordered_List: 'Pobrojana lista', |
| + | Unordered_List: 'Nepobrojana lista', |
| + | Indent: 'Uvuci', |
| + | Outdent: 'Izvuci', |
| + | Undo: 'Poništi promjenu', |
| + | Redo: 'Ponovno promjeni', |
| + | Link: 'Hiperveza', |
| + | Unlink: 'Ukloni hipervezu', |
| + | Image: 'Slika', |
| + | Table: 'Tablica', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraf', |
| + | Heading_1: 'Naslov 1', |
| + | Heading_2: 'Naslov 2', |
| + | Heading_3: 'Naslov 3', |
| + | Heading_4: 'Naslov 4', |
| + | Heading_5: 'Naslov 5', |
| + | Heading_6: 'Naslov 6', |
| + | Preformatted: 'Unaprijed formatirano', |
| + | Blockquote: 'Citat', |
| + | Table_Header: 'Zaglavlje tablice', |
| + | URL: 'URL', |
| + | Title: 'Naslov', |
| + | Alternative_Text: 'Alternativni tekst', |
| + | Caption: 'Zaglavlje', |
| + | Summary: 'Sažetak', |
| + | Number_Of_Rows: 'Broj redova', |
| + | Number_Of_Cols: 'Broj kolona', |
| + | Submit: 'Snimi', |
| + | Cancel: 'Odustani', |
| + | Choose: 'Izaberi', |
| + | Preview: 'Pregled', |
| + | Paste_From_Word: 'Zalijepi iz Word-a', |
| + | Tools: 'Alati', |
| + | Containers: 'Kontejneri', |
| + | Classes: 'Klase', |
| + | Status: 'Status', |
| + | Source_Code: 'Izvorni kod' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/hu.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['hu'] = { |
| + | Strong: 'Félkövér', |
| + | Emphasis: 'Kiemelt', |
| + | Superscript: 'Felső index', |
| + | Subscript: 'Alsó index', |
| + | Ordered_List: 'Rendezett lista', |
| + | Unordered_List: 'Rendezetlen lista', |
| + | Indent: 'Bekezdés', |
| + | Outdent: 'Bekezdés törlése', |
| + | Undo: 'Visszavon', |
| + | Redo: 'Visszaállít', |
| + | Link: 'Link', |
| + | Unlink: 'Link törlése', |
| + | Image: 'Kép', |
| + | Table: 'Tábla', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Bekezdés', |
| + | Heading_1: 'Címsor 1', |
| + | Heading_2: 'Címsor 2', |
| + | Heading_3: 'Címsor 3', |
| + | Heading_4: 'Címsor 4', |
| + | Heading_5: 'Címsor 5', |
| + | Heading_6: 'Címsor 6', |
| + | Preformatted: 'Előformázott', |
| + | Blockquote: 'Idézet', |
| + | Table_Header: 'Tábla Fejléc', |
| + | URL: 'Webcím', |
| + | Title: 'Megnevezés', |
| + | Alternative_Text: 'Alternatív szöveg', |
| + | Caption: 'Fejléc', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Sorok száma', |
| + | Number_Of_Cols: 'Oszlopok száma', |
| + | Submit: 'Elküld', |
| + | Cancel: 'Mégsem', |
| + | Choose: 'Választ', |
| + | Preview: 'Előnézet', |
| + | Paste_From_Word: 'Másolás Word-ból', |
| + | Tools: 'Eszközök', |
| + | Containers: 'Tartalmak', |
| + | Classes: 'Osztályok', |
| + | Status: 'Állapot', |
| + | Source_Code: 'Forráskód' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/it.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['it'] = { |
| + | Strong: 'Grassetto', |
| + | Emphasis: 'Corsetto', |
| + | Superscript: 'Apice', |
| + | Subscript: 'Pedice', |
| + | Ordered_List: 'Lista Ordinata', |
| + | Unordered_List: 'Lista Puntata', |
| + | Indent: 'Indenta', |
| + | Outdent: 'Caccia', |
| + | Undo: 'Indietro', |
| + | Redo: 'Avanti', |
| + | Link: 'Inserisci Link', |
| + | Unlink: 'Togli Link', |
| + | Image: 'Inserisci Immagine', |
| + | Table: 'Inserisci Tabella', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragrafo', |
| + | Heading_1: 'Heading 1', |
| + | Heading_2: 'Heading 2', |
| + | Heading_3: 'Heading 3', |
| + | Heading_4: 'Heading 4', |
| + | Heading_5: 'Heading 5', |
| + | Heading_6: 'Heading 6', |
| + | Preformatted: 'Preformattato', |
| + | Blockquote: 'Blockquote', |
| + | Table_Header: 'Header Tabella', |
| + | URL: 'Indirizzo', |
| + | Title: 'Titolo', |
| + | Alternative_Text: 'Testo Alternativo', |
| + | Caption: 'Caption', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Numero di Righe', |
| + | Number_Of_Cols: 'Numero di Colonne', |
| + | Submit: 'Invia', |
| + | Cancel: 'Cancella', |
| + | Choose: 'Scegli', |
| + | Preview: 'Anteprima', |
| + | Paste_From_Word: 'Incolla', |
| + | Tools: 'Tools', |
| + | Containers: 'Contenitori', |
| + | Classes: 'Classi', |
| + | Status: 'Stato', |
| + | Source_Code: 'Codice Sorgente' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/nb.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['nb'] = { |
| + | Strong: 'Fet', |
| + | Emphasis: 'Uthevet', |
| + | Superscript: 'Opphøyet', |
| + | Subscript: 'Nedsenket', |
| + | Ordered_List: 'Nummerert liste', |
| + | Unordered_List: 'Punktliste', |
| + | Indent: 'Rykk inn', |
| + | Outdent: 'Rykk ut', |
| + | Undo: 'Angre', |
| + | Redo: 'Gjenta', |
| + | Link: 'Lenke', |
| + | Unlink: 'Ta bort lenken', |
| + | Image: 'Bilde', |
| + | Table: 'Tabell', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Avsnitt', |
| + | Heading_1: 'Overskrift 1', |
| + | Heading_2: 'Overskrift 2', |
| + | Heading_3: 'Overskrift 3', |
| + | Heading_4: 'Overskrift 4', |
| + | Heading_5: 'Overskrift 5', |
| + | Heading_6: 'Overskrift 6', |
| + | Preformatted: 'Preformatert', |
| + | Blockquote: 'Sitat', |
| + | Table_Header: 'Tabelloverskrift', |
| + | URL: 'URL', |
| + | Title: 'Tittel', |
| + | Alternative_Text: 'Alternativ tekst', |
| + | Caption: 'Overskrift', |
| + | Summary: 'Sammendrag', |
| + | Number_Of_Rows: 'Antall rader', |
| + | Number_Of_Cols: 'Antall kolonner', |
| + | Submit: 'Ok', |
| + | Cancel: 'Avbryt', |
| + | Choose: 'Velg', |
| + | Preview: 'Forhåndsvis', |
| + | Paste_From_Word: 'Lim inn fra Word', |
| + | Tools: 'Verktøy', |
| + | Containers: 'Formatering', |
| + | Classes: 'Klasser', |
| + | Status: 'Status', |
| + | Source_Code: 'Kildekode' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/nl.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['nl'] = { |
| + | Strong: 'Sterk benadrukken', |
| + | Emphasis: 'Benadrukken', |
| + | Superscript: 'Bovenschrift', |
| + | Subscript: 'Onderschrift', |
| + | Ordered_List: 'Geordende lijst', |
| + | Unordered_List: 'Ongeordende lijst', |
| + | Indent: 'Inspringen', |
| + | Outdent: 'Terugspringen', |
| + | Undo: 'Ongedaan maken', |
| + | Redo: 'Opnieuw uitvoeren', |
| + | Link: 'Linken', |
| + | Unlink: 'Ontlinken', |
| + | Image: 'Afbeelding', |
| + | Table: 'Tabel', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraaf', |
| + | Heading_1: 'Kop 1', |
| + | Heading_2: 'Kop 2', |
| + | Heading_3: 'Kop 3', |
| + | Heading_4: 'Kop 4', |
| + | Heading_5: 'Kop 5', |
| + | Heading_6: 'Kop 6', |
| + | Preformatted: 'Voorgeformatteerd', |
| + | Blockquote: 'Citaat', |
| + | Table_Header: 'Tabel-kop', |
| + | URL: 'URL', |
| + | Title: 'Titel', |
| + | Alternative_Text: 'Alternatieve tekst', |
| + | Caption: 'Bijschrift', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Aantal rijen', |
| + | Number_Of_Cols: 'Aantal kolommen', |
| + | Submit: 'Versturen', |
| + | Cancel: 'Annuleren', |
| + | Choose: 'Kiezen', |
| + | Preview: 'Voorbeeld bekijken', |
| + | Paste_From_Word: 'Plakken uit Word', |
| + | Tools: 'Hulpmiddelen', |
| + | Containers: 'Teksttypes', |
| + | Classes: 'Klassen', |
| + | Status: 'Status', |
| + | Source_Code: 'Broncode' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/nn.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['nn'] = { |
| + | Strong: 'Feit', |
| + | Emphasis: 'Utheva', |
| + | Superscript: 'Opphøgd', |
| + | Subscript: 'Nedsenka', |
| + | Ordered_List: 'Nummerert liste', |
| + | Unordered_List: 'Punktliste', |
| + | Indent: 'Rykk inn', |
| + | Outdent: 'Rykk ut', |
| + | Undo: 'Angre', |
| + | Redo: 'Gjentaka', |
| + | Link: 'Lenkje', |
| + | Unlink: 'Ta bort lenkja', |
| + | Image: 'Bilete', |
| + | Table: 'Tabell', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Avsnitt', |
| + | Heading_1: 'Overskrift 1', |
| + | Heading_2: 'Overskrift 2', |
| + | Heading_3: 'Overskrift 3', |
| + | Heading_4: 'Overskrift 4', |
| + | Heading_5: 'Overskrift 5', |
| + | Heading_6: 'Overskrift 6', |
| + | Preformatted: 'Preformatert', |
| + | Blockquote: 'Sitat', |
| + | Table_Header: 'Tabelloverskrift', |
| + | URL: 'URL', |
| + | Title: 'Tittel', |
| + | Alternative_Text: 'Alternativ tekst', |
| + | Caption: 'Overskrift', |
| + | Summary: 'Samandrag', |
| + | Number_Of_Rows: 'Tal på rader', |
| + | Number_Of_Cols: 'Tal på kolonnar', |
| + | Submit: 'Ok', |
| + | Cancel: 'Avbryt', |
| + | Choose: 'Vel', |
| + | Preview: 'Førehandsvis', |
| + | Paste_From_Word: 'Lim inn frå Word', |
| + | Tools: 'Verkty', |
| + | Containers: 'Formatering', |
| + | Classes: 'Klassar', |
| + | Status: 'Status', |
| + | Source_Code: 'Kjeldekode' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/pl.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['pl'] = { |
| + | Strong: 'Nacisk', |
| + | Emphasis: 'Emfaza', |
| + | Superscript: 'Indeks górny', |
| + | Subscript: 'Indeks dolny', |
| + | Ordered_List: 'Lista numerowana', |
| + | Unordered_List: 'Lista wypunktowana', |
| + | Indent: 'Zwiększ wcięcie', |
| + | Outdent: 'Zmniejsz wcięcie', |
| + | Undo: 'Cofnij', |
| + | Redo: 'Ponów', |
| + | Link: 'Wstaw link', |
| + | Unlink: 'Usuń link', |
| + | Image: 'Obraz', |
| + | Table: 'Tabela', |
| + | HTML: 'Źródło HTML', |
| + | Paragraph: 'Akapit', |
| + | Heading_1: 'Nagłówek 1', |
| + | Heading_2: 'Nagłówek 2', |
| + | Heading_3: 'Nagłówek 3', |
| + | Heading_4: 'Nagłówek 4', |
| + | Heading_5: 'Nagłówek 5', |
| + | Heading_6: 'Nagłówek 6', |
| + | Preformatted: 'Preformatowany', |
| + | Blockquote: 'Cytat blokowy', |
| + | Table_Header: 'Nagłówek tabeli', |
| + | URL: 'URL', |
| + | Title: 'Tytuł', |
| + | Alternative_Text: 'Tekst alternatywny', |
| + | Caption: 'Tytuł tabeli', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Liczba wierszy', |
| + | Number_Of_Cols: 'Liczba kolumn', |
| + | Submit: 'Wyślij', |
| + | Cancel: 'Anuluj', |
| + | Choose: 'Wybierz', |
| + | Preview: 'Podgląd', |
| + | Paste_From_Word: 'Wklej z Worda', |
| + | Tools: 'Narzędzia', |
| + | Containers: 'Format', |
| + | Classes: 'Styl', |
| + | Status: 'Status', |
| + | Source_Code: 'Kod źródłowy' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/pt-br.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['pt-br'] = { |
| + | Strong: 'Resaltar', |
| + | Emphasis: 'Enfatizar', |
| + | Superscript: 'Sobre escrito', |
| + | Subscript: 'Sub escrito ', |
| + | Ordered_List: 'Lista ordenada', |
| + | Unordered_List: 'Lista desordenada', |
| + | Indent: 'Indentado', |
| + | Outdent: 'Desidentar', |
| + | Undo: 'Desfazer', |
| + | Redo: 'Refazer', |
| + | Link: 'Link', |
| + | Unlink: 'Remover Link', |
| + | Image: 'Imagem', |
| + | Table: 'Tabela', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Parágrafo', |
| + | Heading_1: 'Título 1', |
| + | Heading_2: 'Título 2', |
| + | Heading_3: 'Título 3', |
| + | Heading_4: 'Título 4', |
| + | Heading_5: 'Título 5', |
| + | Heading_6: 'Título 6', |
| + | Preformatted: 'Preformatado', |
| + | Blockquote: 'Citação', |
| + | Table_Header: 'Título de tabela', |
| + | URL: 'URL', |
| + | Title: 'Título', |
| + | Alternative_Text: 'Texto alternativo', |
| + | Caption: 'Legenda', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Número de linhas', |
| + | Number_Of_Cols: 'Número de colunas', |
| + | Submit: 'Enviar', |
| + | Cancel: 'Cancelar', |
| + | Choose: 'Selecionar', |
| + | Preview: 'Previsualizar', |
| + | Paste_From_Word: 'Copiar do Word', |
| + | Tools: 'Ferramentas', |
| + | Containers: 'Conteneiners', |
| + | Classes: 'Classes', |
| + | Status: 'Estado', |
| + | Source_Code: 'Código fonte' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/pt.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['pt'] = { |
| + | Strong: 'Negrito', |
| + | Emphasis: 'Itálico', |
| + | Superscript: 'Sobrescrito', |
| + | Subscript: 'Subsescrito', |
| + | Ordered_List: 'Lista Numerada', |
| + | Unordered_List: 'Lista Marcada', |
| + | Indent: 'Aumentar Indentaçã', |
| + | Outdent: 'Diminuir Indentaçã', |
| + | Undo: 'Desfazer', |
| + | Redo: 'Restaurar', |
| + | Link: 'Link', |
| + | Unlink: 'Tirar link', |
| + | Image: 'Imagem', |
| + | Table: 'Tabela', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Parágrafo', |
| + | Heading_1: 'Título 1', |
| + | Heading_2: 'Título 2', |
| + | Heading_3: 'Título 3', |
| + | Heading_4: 'Título 4', |
| + | Heading_5: 'Título 5', |
| + | Heading_6: 'Título 6', |
| + | Preformatted: 'Pré-formatado', |
| + | Blockquote: 'Citação', |
| + | Table_Header: 'Cabeçalho Tabela', |
| + | URL: 'URL', |
| + | Title: 'Título', |
| + | Alternative_Text: 'Texto Alterativo', |
| + | Caption: 'Título Tabela', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Número de Linhas', |
| + | Number_Of_Cols: 'Número de Colunas', |
| + | Submit: 'Enviar', |
| + | Cancel: 'Cancelar', |
| + | Choose: 'Escolha', |
| + | Preview: 'Prever', |
| + | Paste_From_Word: 'Colar do Word', |
| + | Tools: 'Ferramentas', |
| + | Containers: 'Containers', |
| + | Classes: 'Classes', |
| + | Status: 'Status', |
| + | Source_Code: 'Código Fonte' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/ru.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['ru'] = { |
| + | Strong: 'Жирный', |
| + | Emphasis: 'Наклонный', |
| + | Superscript: 'Надстрочный', |
| + | Subscript: 'Подстрочный', |
| + | Ordered_List: 'Нумерованый список', |
| + | Unordered_List: 'Ненумерованый список', |
| + | Indent: 'Увеличить отступ', |
| + | Outdent: 'Уменьшить отступ', |
| + | Undo: 'Отменить', |
| + | Redo: 'Повторить', |
| + | Link: 'Ссылка', |
| + | Unlink: 'Удалить ссылку', |
| + | Image: 'Изображение', |
| + | Table: 'Таблица', |
| + | HTML: 'Править HTML', |
| + | Paragraph: 'Параграф', |
| + | Heading_1: 'Заголовок 1', |
| + | Heading_2: 'Заголовок 2', |
| + | Heading_3: 'Заголовок 3', |
| + | Heading_4: 'Заголовок 4', |
| + | Heading_5: 'Заголовок 5', |
| + | Heading_6: 'Заголовок 6', |
| + | Preformatted: 'Preformatted', |
| + | Blockquote: 'Цитата', |
| + | Table_Header: 'Заголовок таблицы', |
| + | URL: 'URL', |
| + | Title: 'Заголовок', |
| + | Alternative_Text: 'Альтернативный текст', |
| + | Caption: 'Надпись', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Кол-во строк', |
| + | Number_Of_Cols: 'Кол-во столбцов', |
| + | Submit: 'Отправить', |
| + | Cancel: 'Отмена', |
| + | Choose: 'Выбор', |
| + | Preview: 'Просмотр', |
| + | Paste_From_Word: 'Вставить из Word', |
| + | Tools: 'Инструменты', |
| + | Containers: 'Контейнеры', |
| + | Classes: 'Классы', |
| + | Status: 'Статус', |
| + | Source_Code: 'Исходный код' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/sv.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['sv'] = { |
| + | Strong: 'Viktigt', |
| + | Emphasis: 'Betoning', |
| + | Superscript: 'Upphöjt', |
| + | Subscript: 'Nedsänkt', |
| + | Ordered_List: 'Nummerlista', |
| + | Unordered_List: 'Punktlista', |
| + | Indent: 'Indrag', |
| + | Outdent: 'Utdrag', |
| + | Undo: 'Ångra', |
| + | Redo: 'Gör om', |
| + | Link: 'Länk', |
| + | Unlink: 'Ta bort länk', |
| + | Image: 'Bild', |
| + | Table: 'Tabell', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Paragraf', |
| + | Heading_1: 'Rubrik 1', |
| + | Heading_2: 'Rubrik 2', |
| + | Heading_3: 'Rubrik 3', |
| + | Heading_4: 'Rubrik 4', |
| + | Heading_5: 'Rubrik 5', |
| + | Heading_6: 'Rubrik 6', |
| + | Preformatted: 'Förformaterad', |
| + | Blockquote: 'Blockcitat', |
| + | Table_Header: 'Tabellrubrik', |
| + | URL: 'URL', |
| + | Title: 'Titel', |
| + | Alternative_Text: 'Alternativ text', |
| + | Caption: 'Överskrift', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Antal rader', |
| + | Number_Of_Cols: 'Antal kolumner', |
| + | Submit: 'Skicka', |
| + | Cancel: 'Avbryt', |
| + | Choose: 'Välj', |
| + | Preview: 'Förhandsgranska', |
| + | Paste_From_Word: 'Klistra in från Word', |
| + | Tools: 'Verktyg', |
| + | Containers: 'Formatering', |
| + | Classes: 'Klasser', |
| + | Status: 'Status', |
| + | Source_Code: 'Källkod' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/tr.js
+45
-0
| @@ | @@ -0,0 +1,45 @@ |
| + | WYMeditor.STRINGS['tr'] = { |
| + | Strong: 'Kalın', |
| + | Emphasis: 'Vurgu', |
| + | Superscript: 'Superscript', |
| + | Subscript: 'Subscript', |
| + | Ordered_List: 'Sıralı List', |
| + | Unordered_List: 'Sırasız List', |
| + | Indent: 'İçerlek', |
| + | Outdent: 'Çıkıntılı', |
| + | Undo: 'Geri Al', |
| + | Redo: 'Yinele', |
| + | Link: 'Bağlantı', |
| + | Unlink: 'Bağlantıyı Kaldır', |
| + | Image: 'İmaj', |
| + | Table: 'Tablo', |
| + | HTML: 'HTML', |
| + | Paragraph: 'Parağraf', |
| + | Heading_1: 'Başlık 1', |
| + | Heading_2: 'Başlık 2', |
| + | Heading_3: 'Başlık 3', |
| + | Heading_4: 'Başlık 4', |
| + | Heading_5: 'Başlık 5', |
| + | Heading_6: 'Başlık 6', |
| + | Preformatted: 'Önceden Formatlı', |
| + | Blockquote: 'Alıntı', |
| + | Table_Header: 'Tablo Başlığı', |
| + | URL: 'URL', |
| + | Title: 'Başlık', |
| + | Alternative_Text: 'Alternatif Metin', |
| + | Caption: 'Etiket', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: 'Satır sayısı', |
| + | Number_Of_Cols: 'Sütun sayısı', |
| + | Submit: 'Gönder', |
| + | Cancel: 'İptal', |
| + | Choose: 'Seç', |
| + | Preview: 'Önizleme', |
| + | Paste_From_Word: 'Wordden yapıştır', |
| + | Tools: 'Araçlar', |
| + | Containers: 'Kapsayıcılar', |
| + | Classes: 'Sınıflar', |
| + | Status: 'Durum', |
| + | Source_Code: 'Kaynak Kodu' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/lang/zh_cn.js
+47
-0
| @@ | @@ -0,0 +1,47 @@ |
| + | WYMeditor.STRINGS['zh_cn'] = { |
| + | Strong: '加粗', |
| + | Emphasis: '斜体', |
| + | Superscript: '上标', |
| + | Subscript: '下标', |
| + | Ordered_List: '有序列表', |
| + | Unordered_List: '无序列表', |
| + | Indent: '增加缩进', |
| + | Outdent: '减少缩进', |
| + | Undo: '撤消', |
| + | Redo: '重做', |
| + | Link: '链接', |
| + | Unlink: '取消链接', |
| + | Image: '图片', |
| + | Table: '表格', |
| + | HTML: 'HTML源代码', |
| + | Paragraph: '段落', |
| + | Heading_1: '标题 1', |
| + | Heading_2: '标题 2', |
| + | Heading_3: '标题 3', |
| + | Heading_4: '标题 4', |
| + | Heading_5: '标题 5', |
| + | Heading_6: '标题 6', |
| + | Preformatted: '原始文本', |
| + | Blockquote: '引语', |
| + | Table_Header: '表头', |
| + | URL: '地址', |
| + | Title: '提示文字', |
| + | Alternative_Text: '失效文字', |
| + | Caption: '标题', |
| + | Summary: 'Summary', |
| + | Number_Of_Rows: '行数', |
| + | Number_Of_Cols: '列数', |
| + | Submit: '提交', |
| + | Cancel: '放弃', |
| + | Choose: '选择', |
| + | Preview: '预览', |
| + | Paste_From_Word: '从Word粘贴纯文本', |
| + | Tools: '工具', |
| + | Containers: '容器', |
| + | Classes: '预定义样式', |
| + | Status: '状态', |
| + | Source_Code: '源代码', |
| + | Attachment: '附件', |
| + | NewParagraph: '新段落' |
| + | }; |
| + | |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/embed/jquery.wymeditor.embed.js
+52
-0
| @@ | @@ -0,0 +1,52 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.embed.js |
| + | * Experimental embed plugin |
| + | * |
| + | * File Authors: |
| + | * Jonatan Lundin (jonatan.lundin a-t gmail dotcom) |
| + | */ |
| + | |
| + | /* |
| + | * ISSUES: |
| + | * - The closing object tag seems to be stripped out... |
| + | */ |
| + | (function() { |
| + | if (WYMeditor && WYMeditor.XhtmlValidator['_tags']['param']['attributes']) { |
| + | |
| + | WYMeditor.XhtmlValidator['_tags']["embed"] = { |
| + | "attributes":[ |
| + | "allowscriptaccess", |
| + | "allowfullscreen", |
| + | "height", |
| + | "src", |
| + | "type", |
| + | "width" |
| + | ] |
| + | }; |
| + | |
| + | WYMeditor.XhtmlValidator['_tags']['param']['attributes'] = { |
| + | '0':'name', |
| + | '1':'type', |
| + | 'valuetype':/^(data|ref|object)$/, |
| + | '2':'valuetype', |
| + | '3':'value' |
| + | }; |
| + | |
| + | var XhtmlSaxListener = WYMeditor.XhtmlSaxListener; |
| + | WYMeditor.XhtmlSaxListener = function () { |
| + | var listener = XhtmlSaxListener.call(this); |
| + | listener.block_tags.push('embed'); |
| + | return listener; |
| + | }; |
| + | WYMeditor.XhtmlSaxListener.prototype = XhtmlSaxListener.prototype; |
| + | } |
| + | })(); |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/fullscreen/icon_fullscreen.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js
+127
-0
| @@ | @@ -0,0 +1,127 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.fullscreen.js |
| + | * Fullscreen plugin for WYMeditor |
| + | * |
| + | * File Authors: |
| + | * Luis Santos (luis.santos a-t openquest dotpt) |
| + | * Jonatan Lundin (jonatan.lundin a-t gmail dotcom) |
| + | * Gerd Riesselmann (gerd a-t gyro-php dot org) : Fixed issue with new skin layout |
| + | */ |
| + | |
| + | //Extend WYMeditor |
| + | WYMeditor.editor.prototype.fullscreen = function() { |
| + | var wym = this, |
| + | $box = jQuery(this._box), |
| + | $iframe = jQuery(this._iframe), |
| + | $overlay = null, |
| + | $window = jQuery(window), |
| + | |
| + | editorMargin = 15; // Margin from window (without padding) |
| + | |
| + | |
| + | //construct the button's html |
| + | var html = "<li class='wym_tools_fullscreen'>" |
| + | + "<a name='Fullscreen' href='#'" |
| + | + " style='background-image:" |
| + | + " url(" + wym._options.basePath +"plugins/fullscreen/icon_fullscreen.gif)'>" |
| + | + "Fullscreen" |
| + | + "</a></li>"; |
| + | |
| + | //add the button to the tools box |
| + | $box.find(wym._options.toolsSelector + wym._options.toolsListSelector) |
| + | .append(html); |
| + | |
| + | function resize () { |
| + | // Calculate margins |
| + | var uiHeight = $box.outerHeight(true) |
| + | - $iframe.outerHeight(true), |
| + | editorPadding = $box.outerWidth() - $box.width(), |
| + | |
| + | // Calculate heights |
| + | screenHeight = $window.height(), |
| + | iframeHeight = (screenHeight |
| + | - uiHeight |
| + | - (editorMargin * 2)) + 'px', |
| + | |
| + | // Calculate witdths |
| + | screenWidth = $window.width(), |
| + | boxWidth = (screenWidth |
| + | - editorPadding |
| + | - (editorMargin * 2)) + 'px'; |
| + | |
| + | $box.css('width', boxWidth); |
| + | $iframe.css('height', iframeHeight); |
| + | $overlay.css({ |
| + | 'height': screenHeight + 'px', |
| + | 'width': screenWidth + 'px' |
| + | }); |
| + | }; |
| + | |
| + | //handle click event |
| + | $box.find('li.wym_tools_fullscreen a').click(function() { |
| + | if ($box.css('position') != 'fixed') { |
| + | // Store previous inline styles |
| + | $box.data('wym-inline-css', $box.attr('style')); |
| + | $iframe.data('wym-inline-css', $iframe.attr('style')); |
| + | |
| + | // Create overlay |
| + | $overlay = jQuery('<div id="wym-fullscreen-overlay"></div>') |
| + | .appendTo('body').css({ |
| + | 'position': 'fixed', |
| + | 'background-color': 'rgb(0, 0, 0)', |
| + | 'opacity': '0.75', |
| + | 'z-index': '98', |
| + | 'top': '0px', |
| + | 'left': '0px' |
| + | }); |
| + | |
| + | // Possition the editor |
| + | $box.css({ |
| + | 'position': 'fixed', |
| + | 'z-index': '99', |
| + | 'top': editorMargin + 'px', |
| + | 'left': editorMargin + 'px' |
| + | }); |
| + | |
| + | // Bind event listeners |
| + | $window.bind('resize', resize); |
| + | $box.find('li.wym_tools_html a').bind('click', resize); |
| + | |
| + | // Force resize |
| + | resize(); |
| + | } else { |
| + | // Unbind event listeners |
| + | $window.unbind('resize', resize); |
| + | $box.find('li.wym_tools_html a').unbind('click', resize); |
| + | |
| + | // Remove inline styles |
| + | $box.css({ |
| + | 'position': 'static', |
| + | 'z-index': '', |
| + | 'width': '', |
| + | 'top': '', |
| + | 'left': '' |
| + | }); |
| + | $iframe.css('height', ''); |
| + | |
| + | // Remove overlay |
| + | $overlay.remove(); |
| + | $overlay = null; |
| + | |
| + | // Retore previous inline styles |
| + | $box.attr('style', $box.data('wym-inline-css')); |
| + | $iframe.attr('style', $iframe.data('wym-inline-css')); |
| + | } |
| + | |
| + | return false; |
| + | }); |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js
+57
-0
| @@ | @@ -0,0 +1,57 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.hovertools.js |
| + | * hovertools plugin for WYMeditor |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | //Extend WYMeditor |
| + | WYMeditor.editor.prototype.hovertools = function() { |
| + | |
| + | var wym = this; |
| + | |
| + | //bind events on buttons |
| + | jQuery(this._box).find(this._options.toolSelector).hover( |
| + | function() { |
| + | wym.status(jQuery(this).html()); |
| + | }, |
| + | function() { |
| + | wym.status(' '); |
| + | } |
| + | ); |
| + | |
| + | //classes: add/remove a style attr to matching elems |
| + | //while mouseover/mouseout |
| + | jQuery(this._box).find(this._options.classSelector).hover( |
| + | function() { |
| + | var aClasses = eval(wym._options.classesItems); |
| + | var sName = jQuery(this).attr(WYMeditor.NAME); |
| + | var oClass = WYMeditor.Helper.findByName(aClasses, sName); |
| + | |
| + | if(oClass){ |
| + | jqexpr = oClass.expr; |
| + | //don't use jQuery.find() on the iframe body |
| + | //because of MSIE + jQuery + expando issue (#JQ1143) |
| + | if(!jQuery.browser.msie) |
| + | jQuery(wym._doc).find(jqexpr).css('background-color','#cfc'); |
| + | } |
| + | }, |
| + | function() { |
| + | //don't use jQuery.find() on the iframe body |
| + | //because of MSIE + jQuery + expando issue (#JQ1143) |
| + | if(!jQuery.browser.msie) |
| + | jQuery(wym._doc).find('*').removeAttr('style'); |
| + | } |
| + | ); |
| + | |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
+91
-0
| @@ | @@ -0,0 +1,91 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.resizable.js |
| + | * resize plugin for WYMeditor |
| + | * |
| + | * File Authors: |
| + | * Peter Eschler (peschler _at_ gmail.com) |
| + | * Jean-Francois Hovinne - http://www.hovinne.com/ |
| + | * |
| + | * Version: |
| + | * 0.4 |
| + | * |
| + | * Changelog: |
| + | * |
| + | * 0.4 |
| + | * - Removed UI and UI.resizable scripts loading - see #167 (jfh). |
| + | * |
| + | * 0.3 |
| + | * - Added 'iframeOriginalSize' and removed 'ui.instance' calls (jfh). |
| + | * |
| + | * 0.2 |
| + | * - Added full support for all jQueryUI resizable plugin options. |
| + | * - Refactored and documented code. |
| + | * 0.1 |
| + | * - Initial release. |
| + | */ |
| + | |
| + | /** |
| + | * The resizable plugin makes the wymeditor box vertically resizable. |
| + | * It it based on the ui.resizable.js plugin of the jQuery UI library. |
| + | * |
| + | * The WYMeditor resizable plugin supports all parameters of the jQueryUI |
| + | * resizable plugin. The parameters are passed like this: |
| + | * |
| + | * wym.resizable({ handles: "s,e", |
| + | * maxHeight: 600 }); |
| + | * |
| + | * DEPENDENCIES: jQuery UI, jQuery UI resizable |
| + | * |
| + | * @param options options for the plugin |
| + | */ |
| + | WYMeditor.editor.prototype.resizable = function(options) { |
| + | |
| + | var wym = this; |
| + | var iframe = jQuery(wym._box).find('iframe'); |
| + | var iframeOriginalSize = {}; |
| + | |
| + | // Define some default options |
| + | var default_options = { |
| + | start: function(e, ui) { |
| + | iframeOriginalSize = { |
| + | width: jQuery(iframe).width(), |
| + | height: jQuery(iframe).height() |
| + | } |
| + | }, |
| + | |
| + | // resize is called by the jQuery resizable plugin whenever the |
| + | // client area was resized. |
| + | resize: function(e, ui) { |
| + | var diff = ui.size.height - ui.originalSize.height; |
| + | jQuery(iframe).height( iframeOriginalSize.height + diff ); |
| + | |
| + | // If the plugin has horizontal resizing disabled we need to |
| + | // adjust the "width" attribute of the area css, because the |
| + | // resizing will set a fixed width (which breaks liquid layout |
| + | // of the wymeditor area). |
| + | if( !ui.options.handles['w'] && !ui.options.handles['e'] ) { |
| + | ui.size.width = "inherit"; |
| + | } |
| + | }, |
| + | handles: "s,e,se", |
| + | minHeight: 250, |
| + | maxHeight: 600 |
| + | }; |
| + | |
| + | // Merge given options with default options. Given options override |
| + | // default ones. |
| + | var final_options = jQuery.extend(default_options, options); |
| + | |
| + | if(jQuery.isFunction( jQuery.fn.resizable )) jQuery(wym._box).resizable(final_options); |
| + | else WYMeditor.console.error('Oops, jQuery UI.resizable unavailable.'); |
| + | |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/resizable/readme.txt
+124
-0
| @@ | @@ -0,0 +1,124 @@ |
| + | |
| + | |
| + | resizable plugin for WYMeditor |
| + | ############################## |
| + | |
| + | The ``resizable`` plugin for WYMeditor_ enables vertical resizing of the |
| + | editor area. The plugin is based on the jQuery UI library. |
| + | |
| + | Requirements |
| + | ============ |
| + | The following packages are required for using the WYMeditor ``resizable`` |
| + | plugin: |
| + | |
| + | * jQuery (tested with jQuery ``jquery-1.2.4a.js`` from ``jquery.ui`` package) |
| + | * WYMeditor SVN trunk (Revision: 482) |
| + | * jQuery-UI (tested with ``jquery.ui-1.5b2``) |
| + | |
| + | It should be possible to use this plugin with ``WYMeditor-0.4`` but I have not |
| + | tried. |
| + | |
| + | Download |
| + | ======== |
| + | You can download the WYMeditor ``resizable`` plugin here: |
| + | |
| + | * wymeditor-resizable-plugin-0.2.tgz_ |
| + | * wymeditor-resizable-plugin-0.1.tgz_ |
| + | |
| + | See the Changelog_ for more infos about the releases. |
| + | |
| + | .. _wymeditor-resizable-plugin-0.2.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.2.tgz |
| + | .. _wymeditor-resizable-plugin-0.1.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.1.tgz |
| + | |
| + | Installation |
| + | ============ |
| + | Just extract the downloaded archive into your WYMeditor's ``plugin`` |
| + | directory. |
| + | |
| + | Usage |
| + | ===== |
| + | For general instructions on WYMeditor plugins please refer to the `WYMeditor |
| + | plugin page`_. |
| + | |
| + | To use the ``resizable`` plugin simply include the plugin's JavaScript file in |
| + | your code. You **do not** need to include the jQuery UI files - this is done |
| + | automatically by the plugin (see `Internals`_):: |
| + | |
| + | <script type="text/javascript" |
| + | src="/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js"> |
| + | </script> |
| + | |
| + | Make sure to adjust the ``src`` attribute to your needs, then initialize the |
| + | plugin in WYMeditor's ``postInit`` function:: |
| + | |
| + | wymeditor({postInit: function(wym) { |
| + | wym.hovertools(); // other plugins... |
| + | wym.resizable({handles: "s,e", |
| + | maxHeight: 600}); |
| + | } |
| + | }) |
| + | |
| + | The ``resizable`` plugin takes exactly one parameter, which is an object literal |
| + | containing the options of the plugin. The WYMeditor ``resizable`` plugin |
| + | supports all options of the jQuery UI ``resizable`` plugin. These are the |
| + | default values used by the plugin:: |
| + | |
| + | handles: "s,e,se", |
| + | minHeight: 250, |
| + | maxHeight: 600 |
| + | |
| + | See the `jQuery UI resizable plugin docs`_ for a list of all options. |
| + | |
| + | That's it! You are now able to resize the WYMeditor vertically, horizontally or |
| + | both, depending on your options. |
| + | |
| + | .. _jQuery UI resizable plugin docs: http://docs.jquery.com/UI/Resizables |
| + | |
| + | Internals |
| + | ========= |
| + | The plugin takes care of loading the necessary jQuery UI files (``base`` and |
| + | ``resizable``) from the same path the jQuery library was loaded. Here's how |
| + | it's done:: |
| + | |
| + | // Get the jQuery path from the editor, stripping away the jQuery file. |
| + | // see http://www.oreilly.com/catalog/regex/chapter/ch04.html |
| + | // The match result array contains the path and the filename. |
| + | var jQueryPath = wym.computeJqueryPath().match(/^(.*)\/(.*)$/)[1]; |
| + | |
| + | // Make an array of the external JavaScript files required by the plugin. |
| + | var jQueryPlugins = [jQueryPath + '/ui.base.js', |
| + | jQueryPath + '/ui.resizable.js']; |
| + | |
| + | // First get the jQuery UI base file |
| + | $.getScript(jQueryPlugins[0]); |
| + | |
| + | // Get the jQuery UI resizeable plugin and then init the wymeditor resizable |
| + | // plugin. It is import to do the initialisation after loading the |
| + | // necessary jQuery UI files has finished, otherwise the "resizable" method |
| + | // would not be available. |
| + | $.getScript(jQueryPlugins[1], function() { |
| + | jQuery(wym._box).resizable(final_options); |
| + | }); |
| + | |
| + | An alternative approach would be to use an AJAX queue when getting the script |
| + | files to ensure that all jQuery files are loaded before the initialisation code |
| + | of the plugin is executed. There is an `jQuery AJAX queue plugin`_ which does |
| + | that. |
| + | |
| + | .. _jQuery AJAX queue plugin: http://plugins.jquery.com/project/ajaxqueue |
| + | |
| + | Changelog |
| + | ========= |
| + | |
| + | 0.2 |
| + | --- |
| + | - Added full support for all jQuery UI resizable plugin options. |
| + | - Refactored and documented code. |
| + | - Now contains a packed version (775 bytes). |
| + | |
| + | 0.1 |
| + | --- |
| + | - Initial release. |
| + | |
| + | .. _WYMeditor: http://www.wymeditor.org/ |
| + | .. _WYMeditor plugin page: http://trac.wymeditor.org/trac/wiki/0.4/Plugins |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/tidy/README
+19
-0
| @@ | @@ -0,0 +1,19 @@ |
| + | WYMeditor : what you see is What You Mean web-based editor |
| + | Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | Dual licensed under the MIT (MIT-license.txt) |
| + | and GPL (GPL-license.txt) licenses. |
| + | |
| + | For further information visit: |
| + | http://www.wymeditor.org/ |
| + | |
| + | File Name: |
| + | README - HTML Tidy plugin for WYMeditor |
| + | |
| + | File Authors: |
| + | Jean-François Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | |
| + | Credits: |
| + | 'HTML Tidy' by Dave Ragget - http://tidy.sourceforge.net/ |
| + | Icon 'wand' by Mark James - http://famfamfam.com/ |
| + | |
| + | WYMeditor documentation is available online at http://www.wymeditor.org/ |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js
+82
-0
| @@ | @@ -0,0 +1,82 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * jquery.wymeditor.tidy.js |
| + | * HTML Tidy plugin for WYMeditor |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | //Extend WYMeditor |
| + | WYMeditor.editor.prototype.tidy = function(options) { |
| + | var tidy = new WymTidy(options, this); |
| + | return(tidy); |
| + | }; |
| + | |
| + | //WymTidy constructor |
| + | function WymTidy(options, wym) { |
| + | |
| + | options = jQuery.extend({ |
| + | |
| + | sUrl: wym._options.basePath + "plugins/tidy/tidy.php", |
| + | sButtonHtml: "<li class='wym_tools_tidy'>" |
| + | + "<a name='CleanUp' href='#'" |
| + | + " style='background-image:" |
| + | + " url(" + wym._options.basePath + "plugins/tidy/wand.png)'>" |
| + | + "Clean up HTML" |
| + | + "</a></li>", |
| + | |
| + | sButtonSelector: "li.wym_tools_tidy a" |
| + | |
| + | }, options); |
| + | |
| + | this._options = options; |
| + | this._wym = wym; |
| + | |
| + | }; |
| + | |
| + | //WymTidy initialization |
| + | WymTidy.prototype.init = function() { |
| + | |
| + | var tidy = this; |
| + | |
| + | jQuery(this._wym._box).find( |
| + | this._wym._options.toolsSelector + this._wym._options.toolsListSelector) |
| + | .append(this._options.sButtonHtml); |
| + | |
| + | //handle click event |
| + | jQuery(this._wym._box).find(this._options.sButtonSelector).click(function() { |
| + | tidy.cleanup(); |
| + | return(false); |
| + | }); |
| + | |
| + | }; |
| + | |
| + | //WymTidy cleanup |
| + | WymTidy.prototype.cleanup = function() { |
| + | |
| + | var wym = this._wym; |
| + | var html = "<html><body>" + wym.xhtml() + "</body></html>"; |
| + | |
| + | jQuery.post(this._options.sUrl, { html: html}, function(data) { |
| + | |
| + | if(data.length > 0 && data != '0') { |
| + | if(data.indexOf("<?php") == 0) { |
| + | wym.status("Ooops... Is PHP installed?"); |
| + | } else { |
| + | wym.html(data); |
| + | wym.status("HTML has been cleaned up."); |
| + | } |
| + | } else { |
| + | wym.status("An error occurred."); |
| + | } |
| + | }); |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/tidy/tidy.php
+36
-0
| @@ | @@ -0,0 +1,36 @@ |
| + | <?php |
| + | |
| + | if (get_magic_quotes_gpc()) $html = stripslashes($_REQUEST['html']); |
| + | else $html = $_REQUEST['html']; |
| + | |
| + | if(strlen($html) > 0) { |
| + | |
| + | // Specify configuration |
| + | $config = array( |
| + | 'bare' => true, |
| + | 'clean' => true, |
| + | 'doctype' => 'strict', |
| + | 'drop-empty-paras' => true, |
| + | 'drop-font-tags' => true, |
| + | 'drop-proprietary-attributes' => true, |
| + | 'enclose-block-text' => true, |
| + | 'indent' => false, |
| + | 'join-classes' => true, |
| + | 'join-styles' => true, |
| + | 'logical-emphasis' => true, |
| + | 'output-xhtml' => true, |
| + | 'show-body-only' => true, |
| + | 'wrap' => 0); |
| + | |
| + | // Tidy |
| + | $tidy = new tidy; |
| + | $tidy->parseString($html, $config, 'utf8'); |
| + | $tidy->cleanRepair(); |
| + | |
| + | // Output |
| + | echo $tidy; |
| + | } else { |
| + | |
| + | echo ('0'); |
| + | } |
| + | ?> |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/plugins/tidy/wand.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/compact/icons.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/compact/skin.css
+134
-0
| @@ | @@ -0,0 +1,134 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * screen.css |
| + | * main stylesheet for the WYMeditor skin |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | /*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/ |
| + | .wym_skin_compact p, .wym_skin_compact h2, .wym_skin_compact h3, |
| + | .wym_skin_compact ul, .wym_skin_compact li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; } |
| + | |
| + | |
| + | /*HIDDEN BY DEFAULT*/ |
| + | .wym_skin_compact .wym_area_left { display: none; } |
| + | .wym_skin_compact .wym_area_right { display: none; } |
| + | |
| + | |
| + | /*TYPO*/ |
| + | .wym_skin_compact { font-size: 10px; font-family: Verdana, Arial, sans-serif; } |
| + | .wym_skin_compact h2 { font-size: 110%; /* = 11px */} |
| + | .wym_skin_compact h3 { font-size: 100%; /* = 10px */} |
| + | .wym_skin_compact li { font-size: 100%; /* = 10px */} |
| + | |
| + | |
| + | /*WYM_BOX*/ |
| + | .wym_skin_compact { border: 1px solid gray; padding: 5px} |
| + | |
| + | /*auto-clear the wym_box*/ |
| + | .wym_skin_compact:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_compact { height: 1%;} |
| + | |
| + | |
| + | /*WYM_HTML*/ |
| + | .wym_skin_compact .wym_html { width: 98%;} |
| + | .wym_skin_compact .wym_html textarea { font-size: 120%; width: 100%; height: 200px; border: 1px solid gray; background: white; } |
| + | |
| + | |
| + | /*WYM_IFRAME*/ |
| + | .wym_skin_compact .wym_iframe { width: 98%;} |
| + | .wym_skin_compact .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white } |
| + | |
| + | |
| + | /*AREAS*/ |
| + | .wym_skin_compact .wym_area_left { width: 100px; float: left;} |
| + | .wym_skin_compact .wym_area_right { width: 150px; float: right;} |
| + | .wym_skin_compact .wym_area_bottom { height: 1%; clear: both;} |
| + | * html .wym_skin_compact .wym_area_main { height: 1%;} |
| + | * html .wym_skin_compact .wym_area_top { height: 1%;} |
| + | *+html .wym_skin_compact .wym_area_top { height: 1%;} |
| + | |
| + | /*SECTIONS SYSTEM*/ |
| + | |
| + | /*common defaults for all sections*/ |
| + | .wym_skin_compact .wym_section { margin-bottom: 5px; } |
| + | .wym_skin_compact .wym_section h2, |
| + | .wym_skin_compact .wym_section h3 { padding: 1px 3px; margin: 0; } |
| + | .wym_skin_compact .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; } |
| + | .wym_skin_compact .wym_section a:hover { background-color: yellow; } |
| + | /*hide section titles by default*/ |
| + | .wym_skin_compact .wym_section h2 { display: none; } |
| + | /*disable any margin-collapse*/ |
| + | .wym_skin_compact .wym_section { padding-top: 1px; padding-bottom: 1px; } |
| + | /*auto-clear sections*/ |
| + | .wym_skin_compact .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_compact .wym_section ul { height: 1%;} |
| + | |
| + | /*option: add this class to a section to make it render as a panel*/ |
| + | .wym_skin_compact .wym_panel { } |
| + | .wym_skin_compact .wym_panel h2 { display: block; } |
| + | |
| + | /*option: add this class to a section to make it render as a dropdown menu*/ |
| + | .wym_skin_compact .wym_dropdown h2 { display: block; } |
| + | .wym_skin_compact .wym_dropdown ul { display: none; position: absolute; background: white; } |
| + | .wym_skin_compact .wym_dropdown:hover ul, |
| + | .wym_skin_compact .wym_dropdown.hover ul { display: block; } |
| + | |
| + | /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/ |
| + | .wym_skin_compact .wym_buttons li { float:left;} |
| + | .wym_skin_compact .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px } |
| + | /*image replacements*/ |
| + | .wym_skin_compact .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_link a { background-position: 0 -96px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_image a { background-position: 0 -121px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_table a { background-position: 0 -144px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_html a { background-position: 0 -193px;} |
| + | .wym_skin_compact .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;} |
| + | |
| + | /*DECORATION*/ |
| + | .wym_skin_compact .wym_section h2 { background: #f0f0f0; border: solid gray; border-width: 0 0 1px;} |
| + | .wym_skin_compact .wym_section h2 span { color: gray;} |
| + | .wym_skin_compact .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;} |
| + | .wym_skin_compact .wym_panel ul { margin: 2px 0 5px; } |
| + | .wym_skin_compact .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; } |
| + | .wym_skin_compact .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;} |
| + | |
| + | /*DIALOGS*/ |
| + | .wym_dialog div.row { margin-bottom: 5px;} |
| + | .wym_dialog div.row input { margin-right: 5px;} |
| + | .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; } |
| + | .wym_dialog div.row-indent { padding-left: 160px; } |
| + | /*autoclearing*/ |
| + | .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | .wym_dialog div.row { display: inline-block; } |
| + | /* Hides from IE-mac \*/ |
| + | * html .wym_dialog div.row { height: 1%; } |
| + | .wym_dialog div.row { display: block; } |
| + | /* End hide from IE-mac */ |
| + | |
| + | /*WYMEDITOR_LINK*/ |
| + | a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/compact/skin.js
+35
-0
| @@ | @@ -0,0 +1,35 @@ |
| + | WYMeditor.SKINS['compact'] = { |
| + | |
| + | init: function(wym) { |
| + | |
| + | //move the containers panel to the top area |
| + | jQuery(wym._options.containersSelector + ', ' |
| + | + wym._options.classesSelector, wym._box) |
| + | .appendTo( jQuery("div.wym_area_top", wym._box) ) |
| + | .addClass("wym_dropdown") |
| + | .css({"margin-right": "10px", "width": "120px", "float": "left"}); |
| + | |
| + | //render following sections as buttons |
| + | jQuery(wym._options.toolsSelector, wym._box) |
| + | .addClass("wym_buttons") |
| + | .css({"margin-right": "10px", "float": "left"}); |
| + | |
| + | //make hover work under IE < 7 |
| + | jQuery(".wym_section", wym._box).hover(function(){ |
| + | jQuery(this).addClass("hover"); |
| + | },function(){ |
| + | jQuery(this).removeClass("hover"); |
| + | }); |
| + | |
| + | var postInit = wym._options.postInit; |
| + | wym._options.postInit = function(wym) { |
| + | |
| + | if(postInit) postInit.call(wym, wym); |
| + | var rule = { |
| + | name: 'body', |
| + | css: 'background-color: #f0f0f0;' |
| + | }; |
| + | wym.addCssRule( wym._doc.styleSheets[0], rule); |
| + | }; |
| + | } |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/default/icons.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/default/skin.css
+133
-0
| @@ | @@ -0,0 +1,133 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * skin.css |
| + | * main stylesheet for the default WYMeditor skin |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | */ |
| + | |
| + | /*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/ |
| + | .wym_skin_default p, .wym_skin_default h2, .wym_skin_default h3, |
| + | .wym_skin_default ul, .wym_skin_default li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; } |
| + | |
| + | |
| + | /*HIDDEN BY DEFAULT*/ |
| + | .wym_skin_default .wym_area_left { display: none; } |
| + | .wym_skin_default .wym_area_right { display: block; } |
| + | |
| + | |
| + | /*TYPO*/ |
| + | .wym_skin_default { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; } |
| + | .wym_skin_default h2 { font-size: 110%; /* = 11px */} |
| + | .wym_skin_default h3 { font-size: 100%; /* = 10px */} |
| + | .wym_skin_default li { font-size: 100%; /* = 10px */} |
| + | |
| + | |
| + | /*WYM_BOX*/ |
| + | .wym_skin_default { border: 1px solid gray; background: #f2f2f2; padding: 5px} |
| + | |
| + | /*auto-clear the wym_box*/ |
| + | .wym_skin_default:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_default { height: 1%;} |
| + | |
| + | |
| + | /*WYM_HTML*/ |
| + | .wym_skin_default .wym_html { width: 98%;} |
| + | .wym_skin_default .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; } |
| + | |
| + | |
| + | /*WYM_IFRAME*/ |
| + | .wym_skin_default .wym_iframe { width: 98%;} |
| + | .wym_skin_default .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white } |
| + | |
| + | |
| + | /*AREAS*/ |
| + | .wym_skin_default .wym_area_left { width: 150px; float: left;} |
| + | .wym_skin_default .wym_area_right { width: 150px; float: right;} |
| + | .wym_skin_default .wym_area_bottom { height: 1%; clear: both;} |
| + | * html .wym_skin_default .wym_area_main { height: 1%;} |
| + | * html .wym_skin_default .wym_area_top { height: 1%;} |
| + | *+html .wym_skin_default .wym_area_top { height: 1%;} |
| + | |
| + | /*SECTIONS SYSTEM*/ |
| + | |
| + | /*common defaults for all sections*/ |
| + | .wym_skin_default .wym_section { margin-bottom: 5px; } |
| + | .wym_skin_default .wym_section h2, |
| + | .wym_skin_default .wym_section h3 { padding: 1px 3px; margin: 0; } |
| + | .wym_skin_default .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; } |
| + | .wym_skin_default .wym_section a:hover { background-color: yellow; } |
| + | /*hide section titles by default*/ |
| + | .wym_skin_default .wym_section h2 { display: none; } |
| + | /*disable any margin-collapse*/ |
| + | .wym_skin_default .wym_section { padding-top: 1px; padding-bottom: 1px; } |
| + | /*auto-clear sections*/ |
| + | .wym_skin_default .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_default .wym_section ul { height: 1%;} |
| + | |
| + | /*option: add this class to a section to make it render as a panel*/ |
| + | .wym_skin_default .wym_panel { } |
| + | .wym_skin_default .wym_panel h2 { display: block; } |
| + | |
| + | /*option: add this class to a section to make it render as a dropdown menu*/ |
| + | .wym_skin_default .wym_dropdown h2 { display: block; } |
| + | .wym_skin_default .wym_dropdown ul { display: none; position: absolute; background: white; } |
| + | .wym_skin_default .wym_dropdown:hover ul, |
| + | .wym_skin_default .wym_dropdown.hover ul { display: block; } |
| + | |
| + | /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/ |
| + | .wym_skin_default .wym_buttons li { float:left;} |
| + | .wym_skin_default .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px } |
| + | /*image replacements*/ |
| + | .wym_skin_default .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_link a { background-position: 0 -96px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_image a { background-position: 0 -121px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_table a { background-position: 0 -144px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_html a { background-position: 0 -193px;} |
| + | .wym_skin_default .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;} |
| + | |
| + | /*DECORATION*/ |
| + | .wym_skin_default .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;} |
| + | .wym_skin_default .wym_section h2 span { color: gray;} |
| + | .wym_skin_default .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;} |
| + | .wym_skin_default .wym_panel ul { margin: 2px 0 5px; } |
| + | .wym_skin_default .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; } |
| + | .wym_skin_default .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;} |
| + | |
| + | /*DIALOGS*/ |
| + | .wym_dialog div.row { margin-bottom: 5px;} |
| + | .wym_dialog div.row input { margin-right: 5px;} |
| + | .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; } |
| + | .wym_dialog div.row-indent { padding-left: 160px; } |
| + | /*autoclearing*/ |
| + | .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | .wym_dialog div.row { display: inline-block; } |
| + | /* Hides from IE-mac \*/ |
| + | * html .wym_dialog div.row { height: 1%; } |
| + | .wym_dialog div.row { display: block; } |
| + | /* End hide from IE-mac */ |
| + | |
| + | /*WYMEDITOR_LINK*/ |
| + | a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/default/skin.js
+40
-0
| @@ | @@ -0,0 +1,40 @@ |
| + | WYMeditor.SKINS['default'] = { |
| + | |
| + | init: function(wym) { |
| + | |
| + | //render following sections as panels |
| + | jQuery(wym._box).find(wym._options.classesSelector) |
| + | .addClass("wym_panel"); |
| + | |
| + | //render following sections as buttons |
| + | jQuery(wym._box).find(wym._options.toolsSelector) |
| + | .addClass("wym_buttons"); |
| + | |
| + | //render following sections as dropdown menus |
| + | jQuery(wym._box).find(wym._options.containersSelector) |
| + | .addClass("wym_dropdown") |
| + | .find(WYMeditor.H2) |
| + | .append("<span> ></span>"); |
| + | |
| + | // auto add some margin to the main area sides if left area |
| + | // or right area are not empty (if they contain sections) |
| + | jQuery(wym._box).find("div.wym_area_right ul") |
| + | .parents("div.wym_area_right").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-right": "155px"}); |
| + | |
| + | jQuery(wym._box).find("div.wym_area_left ul") |
| + | .parents("div.wym_area_left").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-left": "155px"}); |
| + | |
| + | //make hover work under IE < 7 |
| + | jQuery(wym._box).find(".wym_section").hover(function(){ |
| + | jQuery(this).addClass("hover"); |
| + | },function(){ |
| + | jQuery(this).removeClass("hover"); |
| + | }); |
| + | } |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/images/bg.header.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/images/bg.selector.silver.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/images/bg.wymeditor.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/images/icons.silver.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/skin.css
+131
-0
| @@ | @@ -0,0 +1,131 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * skin.css |
| + | * main stylesheet for the minimal WYMeditor skin |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Jean-Francois Hovinne |
| + | * Scott Lewis (see Silver skin) |
| + | */ |
| + | |
| + | /* Set iframe */ |
| + | .wym_skin_minimal div.wym_iframe iframe { |
| + | width: 90%; |
| + | height: 200px; |
| + | } |
| + | |
| + | /* Hide h2 by default */ |
| + | .wym_skin_minimal h2 { |
| + | display: none; |
| + | } |
| + | |
| + | /* Show specific h2 */ |
| + | .wym_skin_minimal div.wym_tools h2, |
| + | .wym_skin_minimal div.wym_containers h2, |
| + | .wym_skin_minimal div.wym_classes h2 { |
| + | display: block; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_section ul { |
| + | margin: 0; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_section ul li { |
| + | float: left; |
| + | list-style-type: none; |
| + | margin-right: 5px; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_area_top, |
| + | .wym_skin_minimal div.wym_area_right, |
| + | .wym_skin_minimal div.wym_containers, |
| + | .wym_skin_minimal div.wym_classes { |
| + | float: left; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_area_main { |
| + | clear: both; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_html { |
| + | width: 90%; |
| + | } |
| + | |
| + | .wym_skin_minimal textarea.wym_html_val { |
| + | width: 100%; |
| + | height: 100px; |
| + | } |
| + | |
| + | /* DROPDOWNS (see Silver skin) */ |
| + | .wym_skin_minimal div.wym_dropdown { |
| + | cursor: pointer; |
| + | margin: 0px 4px 10px 0px; |
| + | padding: 0px; |
| + | z-index: 1001; |
| + | display: block; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_dropdown ul { |
| + | display: none; |
| + | width: 124px; |
| + | padding: 0px; |
| + | margin: 0px; |
| + | list-style-type: none; |
| + | list-style-image: none; |
| + | z-index: 1002; |
| + | position: absolute; |
| + | border-top: 1px solid #AAA; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_dropdown ul li { |
| + | width: 146px; |
| + | height: 20px; |
| + | padding: 0px; |
| + | margin: 0px; |
| + | border: 1px solid #777; |
| + | border-top: none; |
| + | background: #EEE; |
| + | list-style-image: none; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_dropdown h2 { |
| + | width: 138px; |
| + | height: 16px; |
| + | color: #000; |
| + | background-image: url(images/bg.selector.silver.gif); |
| + | background-position: 0px -18px; |
| + | background-repeat: no-repeat; |
| + | border: none; |
| + | font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif; |
| + | font-size: 12px; |
| + | font-weight: bold; |
| + | padding: 2px 0px 0px 10px; |
| + | margin: 0px; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_dropdown a { |
| + | text-decoration: none; |
| + | font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif; |
| + | font-size: 12px; |
| + | padding: 5px 0px 0px 10px; |
| + | display: block; |
| + | width: 136px; |
| + | height: 15px; |
| + | color: #000; |
| + | text-align: left; |
| + | margin-left: 0px; |
| + | } |
| + | |
| + | .wym_skin_minimal div.wym_dropdown a:hover { |
| + | background: #BBB; |
| + | border-bottom: none; |
| + | } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/minimal/skin.js
+30
-0
| @@ | @@ -0,0 +1,30 @@ |
| + | jQuery.fn.selectify = function() { |
| + | return this.each(function() { |
| + | jQuery(this).hover( |
| + | function() { |
| + | jQuery("h2", this).css("background-position", "0px -18px"); |
| + | jQuery("ul", this).fadeIn("fast"); |
| + | }, |
| + | function() { |
| + | jQuery("h2", this).css("background-position", ""); |
| + | jQuery("ul", this).fadeOut("fast"); |
| + | } |
| + | ); |
| + | }); |
| + | }; |
| + | |
| + | WYMeditor.SKINS['minimal'] = { |
| + | //placeholder for the skin JS, if needed |
| + | |
| + | //init the skin |
| + | //wym is the WYMeditor.editor instance |
| + | init: function(wym) { |
| + | |
| + | //render following sections as dropdown menus |
| + | jQuery(wym._box).find(wym._options.toolsSelector + ', ' + wym._options.containersSelector + ', ' + wym._options.classesSelector) |
| + | .addClass("wym_dropdown") |
| + | .selectify(); |
| + | |
| + | |
| + | } |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/COPYING
+674
-0
| @@ | @@ -0,0 +1,674 @@ |
| + | GNU GENERAL PUBLIC LICENSE |
| + | Version 3, 29 June 2007 |
| + | |
| + | Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
| + | Everyone is permitted to copy and distribute verbatim copies |
| + | of this license document, but changing it is not allowed. |
| + | |
| + | Preamble |
| + | |
| + | The GNU General Public License is a free, copyleft license for |
| + | software and other kinds of works. |
| + | |
| + | The licenses for most software and other practical works are designed |
| + | to take away your freedom to share and change the works. By contrast, |
| + | the GNU General Public License is intended to guarantee your freedom to |
| + | share and change all versions of a program--to make sure it remains free |
| + | software for all its users. We, the Free Software Foundation, use the |
| + | GNU General Public License for most of our software; it applies also to |
| + | any other work released this way by its authors. You can apply it to |
| + | your programs, too. |
| + | |
| + | When we speak of free software, we are referring to freedom, not |
| + | price. Our General Public Licenses are designed to make sure that you |
| + | have the freedom to distribute copies of free software (and charge for |
| + | them if you wish), that you receive source code or can get it if you |
| + | want it, that you can change the software or use pieces of it in new |
| + | free programs, and that you know you can do these things. |
| + | |
| + | To protect your rights, we need to prevent others from denying you |
| + | these rights or asking you to surrender the rights. Therefore, you have |
| + | certain responsibilities if you distribute copies of the software, or if |
| + | you modify it: responsibilities to respect the freedom of others. |
| + | |
| + | For example, if you distribute copies of such a program, whether |
| + | gratis or for a fee, you must pass on to the recipients the same |
| + | freedoms that you received. You must make sure that they, too, receive |
| + | or can get the source code. And you must show them these terms so they |
| + | know their rights. |
| + | |
| + | Developers that use the GNU GPL protect your rights with two steps: |
| + | (1) assert copyright on the software, and (2) offer you this License |
| + | giving you legal permission to copy, distribute and/or modify it. |
| + | |
| + | For the developers' and authors' protection, the GPL clearly explains |
| + | that there is no warranty for this free software. For both users' and |
| + | authors' sake, the GPL requires that modified versions be marked as |
| + | changed, so that their problems will not be attributed erroneously to |
| + | authors of previous versions. |
| + | |
| + | Some devices are designed to deny users access to install or run |
| + | modified versions of the software inside them, although the manufacturer |
| + | can do so. This is fundamentally incompatible with the aim of |
| + | protecting users' freedom to change the software. The systematic |
| + | pattern of such abuse occurs in the area of products for individuals to |
| + | use, which is precisely where it is most unacceptable. Therefore, we |
| + | have designed this version of the GPL to prohibit the practice for those |
| + | products. If such problems arise substantially in other domains, we |
| + | stand ready to extend this provision to those domains in future versions |
| + | of the GPL, as needed to protect the freedom of users. |
| + | |
| + | Finally, every program is threatened constantly by software patents. |
| + | States should not allow patents to restrict development and use of |
| + | software on general-purpose computers, but in those that do, we wish to |
| + | avoid the special danger that patents applied to a free program could |
| + | make it effectively proprietary. To prevent this, the GPL assures that |
| + | patents cannot be used to render the program non-free. |
| + | |
| + | The precise terms and conditions for copying, distribution and |
| + | modification follow. |
| + | |
| + | TERMS AND CONDITIONS |
| + | |
| + | 0. Definitions. |
| + | |
| + | "This License" refers to version 3 of the GNU General Public License. |
| + | |
| + | "Copyright" also means copyright-like laws that apply to other kinds of |
| + | works, such as semiconductor masks. |
| + | |
| + | "The Program" refers to any copyrightable work licensed under this |
| + | License. Each licensee is addressed as "you". "Licensees" and |
| + | "recipients" may be individuals or organizations. |
| + | |
| + | To "modify" a work means to copy from or adapt all or part of the work |
| + | in a fashion requiring copyright permission, other than the making of an |
| + | exact copy. The resulting work is called a "modified version" of the |
| + | earlier work or a work "based on" the earlier work. |
| + | |
| + | A "covered work" means either the unmodified Program or a work based |
| + | on the Program. |
| + | |
| + | To "propagate" a work means to do anything with it that, without |
| + | permission, would make you directly or secondarily liable for |
| + | infringement under applicable copyright law, except executing it on a |
| + | computer or modifying a private copy. Propagation includes copying, |
| + | distribution (with or without modification), making available to the |
| + | public, and in some countries other activities as well. |
| + | |
| + | To "convey" a work means any kind of propagation that enables other |
| + | parties to make or receive copies. Mere interaction with a user through |
| + | a computer network, with no transfer of a copy, is not conveying. |
| + | |
| + | An interactive user interface displays "Appropriate Legal Notices" |
| + | to the extent that it includes a convenient and prominently visible |
| + | feature that (1) displays an appropriate copyright notice, and (2) |
| + | tells the user that there is no warranty for the work (except to the |
| + | extent that warranties are provided), that licensees may convey the |
| + | work under this License, and how to view a copy of this License. If |
| + | the interface presents a list of user commands or options, such as a |
| + | menu, a prominent item in the list meets this criterion. |
| + | |
| + | 1. Source Code. |
| + | |
| + | The "source code" for a work means the preferred form of the work |
| + | for making modifications to it. "Object code" means any non-source |
| + | form of a work. |
| + | |
| + | A "Standard Interface" means an interface that either is an official |
| + | standard defined by a recognized standards body, or, in the case of |
| + | interfaces specified for a particular programming language, one that |
| + | is widely used among developers working in that language. |
| + | |
| + | The "System Libraries" of an executable work include anything, other |
| + | than the work as a whole, that (a) is included in the normal form of |
| + | packaging a Major Component, but which is not part of that Major |
| + | Component, and (b) serves only to enable use of the work with that |
| + | Major Component, or to implement a Standard Interface for which an |
| + | implementation is available to the public in source code form. A |
| + | "Major Component", in this context, means a major essential component |
| + | (kernel, window system, and so on) of the specific operating system |
| + | (if any) on which the executable work runs, or a compiler used to |
| + | produce the work, or an object code interpreter used to run it. |
| + | |
| + | The "Corresponding Source" for a work in object code form means all |
| + | the source code needed to generate, install, and (for an executable |
| + | work) run the object code and to modify the work, including scripts to |
| + | control those activities. However, it does not include the work's |
| + | System Libraries, or general-purpose tools or generally available free |
| + | programs which are used unmodified in performing those activities but |
| + | which are not part of the work. For example, Corresponding Source |
| + | includes interface definition files associated with source files for |
| + | the work, and the source code for shared libraries and dynamically |
| + | linked subprograms that the work is specifically designed to require, |
| + | such as by intimate data communication or control flow between those |
| + | subprograms and other parts of the work. |
| + | |
| + | The Corresponding Source need not include anything that users |
| + | can regenerate automatically from other parts of the Corresponding |
| + | Source. |
| + | |
| + | The Corresponding Source for a work in source code form is that |
| + | same work. |
| + | |
| + | 2. Basic Permissions. |
| + | |
| + | All rights granted under this License are granted for the term of |
| + | copyright on the Program, and are irrevocable provided the stated |
| + | conditions are met. This License explicitly affirms your unlimited |
| + | permission to run the unmodified Program. The output from running a |
| + | covered work is covered by this License only if the output, given its |
| + | content, constitutes a covered work. This License acknowledges your |
| + | rights of fair use or other equivalent, as provided by copyright law. |
| + | |
| + | You may make, run and propagate covered works that you do not |
| + | convey, without conditions so long as your license otherwise remains |
| + | in force. You may convey covered works to others for the sole purpose |
| + | of having them make modifications exclusively for you, or provide you |
| + | with facilities for running those works, provided that you comply with |
| + | the terms of this License in conveying all material for which you do |
| + | not control copyright. Those thus making or running the covered works |
| + | for you must do so exclusively on your behalf, under your direction |
| + | and control, on terms that prohibit them from making any copies of |
| + | your copyrighted material outside their relationship with you. |
| + | |
| + | Conveying under any other circumstances is permitted solely under |
| + | the conditions stated below. Sublicensing is not allowed; section 10 |
| + | makes it unnecessary. |
| + | |
| + | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
| + | |
| + | No covered work shall be deemed part of an effective technological |
| + | measure under any applicable law fulfilling obligations under article |
| + | 11 of the WIPO copyright treaty adopted on 20 December 1996, or |
| + | similar laws prohibiting or restricting circumvention of such |
| + | measures. |
| + | |
| + | When you convey a covered work, you waive any legal power to forbid |
| + | circumvention of technological measures to the extent such circumvention |
| + | is effected by exercising rights under this License with respect to |
| + | the covered work, and you disclaim any intention to limit operation or |
| + | modification of the work as a means of enforcing, against the work's |
| + | users, your or third parties' legal rights to forbid circumvention of |
| + | technological measures. |
| + | |
| + | 4. Conveying Verbatim Copies. |
| + | |
| + | You may convey verbatim copies of the Program's source code as you |
| + | receive it, in any medium, provided that you conspicuously and |
| + | appropriately publish on each copy an appropriate copyright notice; |
| + | keep intact all notices stating that this License and any |
| + | non-permissive terms added in accord with section 7 apply to the code; |
| + | keep intact all notices of the absence of any warranty; and give all |
| + | recipients a copy of this License along with the Program. |
| + | |
| + | You may charge any price or no price for each copy that you convey, |
| + | and you may offer support or warranty protection for a fee. |
| + | |
| + | 5. Conveying Modified Source Versions. |
| + | |
| + | You may convey a work based on the Program, or the modifications to |
| + | produce it from the Program, in the form of source code under the |
| + | terms of section 4, provided that you also meet all of these conditions: |
| + | |
| + | a) The work must carry prominent notices stating that you modified |
| + | it, and giving a relevant date. |
| + | |
| + | b) The work must carry prominent notices stating that it is |
| + | released under this License and any conditions added under section |
| + | 7. This requirement modifies the requirement in section 4 to |
| + | "keep intact all notices". |
| + | |
| + | c) You must license the entire work, as a whole, under this |
| + | License to anyone who comes into possession of a copy. This |
| + | License will therefore apply, along with any applicable section 7 |
| + | additional terms, to the whole of the work, and all its parts, |
| + | regardless of how they are packaged. This License gives no |
| + | permission to license the work in any other way, but it does not |
| + | invalidate such permission if you have separately received it. |
| + | |
| + | d) If the work has interactive user interfaces, each must display |
| + | Appropriate Legal Notices; however, if the Program has interactive |
| + | interfaces that do not display Appropriate Legal Notices, your |
| + | work need not make them do so. |
| + | |
| + | A compilation of a covered work with other separate and independent |
| + | works, which are not by their nature extensions of the covered work, |
| + | and which are not combined with it such as to form a larger program, |
| + | in or on a volume of a storage or distribution medium, is called an |
| + | "aggregate" if the compilation and its resulting copyright are not |
| + | used to limit the access or legal rights of the compilation's users |
| + | beyond what the individual works permit. Inclusion of a covered work |
| + | in an aggregate does not cause this License to apply to the other |
| + | parts of the aggregate. |
| + | |
| + | 6. Conveying Non-Source Forms. |
| + | |
| + | You may convey a covered work in object code form under the terms |
| + | of sections 4 and 5, provided that you also convey the |
| + | machine-readable Corresponding Source under the terms of this License, |
| + | in one of these ways: |
| + | |
| + | a) Convey the object code in, or embodied in, a physical product |
| + | (including a physical distribution medium), accompanied by the |
| + | Corresponding Source fixed on a durable physical medium |
| + | customarily used for software interchange. |
| + | |
| + | b) Convey the object code in, or embodied in, a physical product |
| + | (including a physical distribution medium), accompanied by a |
| + | written offer, valid for at least three years and valid for as |
| + | long as you offer spare parts or customer support for that product |
| + | model, to give anyone who possesses the object code either (1) a |
| + | copy of the Corresponding Source for all the software in the |
| + | product that is covered by this License, on a durable physical |
| + | medium customarily used for software interchange, for a price no |
| + | more than your reasonable cost of physically performing this |
| + | conveying of source, or (2) access to copy the |
| + | Corresponding Source from a network server at no charge. |
| + | |
| + | c) Convey individual copies of the object code with a copy of the |
| + | written offer to provide the Corresponding Source. This |
| + | alternative is allowed only occasionally and noncommercially, and |
| + | only if you received the object code with such an offer, in accord |
| + | with subsection 6b. |
| + | |
| + | d) Convey the object code by offering access from a designated |
| + | place (gratis or for a charge), and offer equivalent access to the |
| + | Corresponding Source in the same way through the same place at no |
| + | further charge. You need not require recipients to copy the |
| + | Corresponding Source along with the object code. If the place to |
| + | copy the object code is a network server, the Corresponding Source |
| + | may be on a different server (operated by you or a third party) |
| + | that supports equivalent copying facilities, provided you maintain |
| + | clear directions next to the object code saying where to find the |
| + | Corresponding Source. Regardless of what server hosts the |
| + | Corresponding Source, you remain obligated to ensure that it is |
| + | available for as long as needed to satisfy these requirements. |
| + | |
| + | e) Convey the object code using peer-to-peer transmission, provided |
| + | you inform other peers where the object code and Corresponding |
| + | Source of the work are being offered to the general public at no |
| + | charge under subsection 6d. |
| + | |
| + | A separable portion of the object code, whose source code is excluded |
| + | from the Corresponding Source as a System Library, need not be |
| + | included in conveying the object code work. |
| + | |
| + | A "User Product" is either (1) a "consumer product", which means any |
| + | tangible personal property which is normally used for personal, family, |
| + | or household purposes, or (2) anything designed or sold for incorporation |
| + | into a dwelling. In determining whether a product is a consumer product, |
| + | doubtful cases shall be resolved in favor of coverage. For a particular |
| + | product received by a particular user, "normally used" refers to a |
| + | typical or common use of that class of product, regardless of the status |
| + | of the particular user or of the way in which the particular user |
| + | actually uses, or expects or is expected to use, the product. A product |
| + | is a consumer product regardless of whether the product has substantial |
| + | commercial, industrial or non-consumer uses, unless such uses represent |
| + | the only significant mode of use of the product. |
| + | |
| + | "Installation Information" for a User Product means any methods, |
| + | procedures, authorization keys, or other information required to install |
| + | and execute modified versions of a covered work in that User Product from |
| + | a modified version of its Corresponding Source. The information must |
| + | suffice to ensure that the continued functioning of the modified object |
| + | code is in no case prevented or interfered with solely because |
| + | modification has been made. |
| + | |
| + | If you convey an object code work under this section in, or with, or |
| + | specifically for use in, a User Product, and the conveying occurs as |
| + | part of a transaction in which the right of possession and use of the |
| + | User Product is transferred to the recipient in perpetuity or for a |
| + | fixed term (regardless of how the transaction is characterized), the |
| + | Corresponding Source conveyed under this section must be accompanied |
| + | by the Installation Information. But this requirement does not apply |
| + | if neither you nor any third party retains the ability to install |
| + | modified object code on the User Product (for example, the work has |
| + | been installed in ROM). |
| + | |
| + | The requirement to provide Installation Information does not include a |
| + | requirement to continue to provide support service, warranty, or updates |
| + | for a work that has been modified or installed by the recipient, or for |
| + | the User Product in which it has been modified or installed. Access to a |
| + | network may be denied when the modification itself materially and |
| + | adversely affects the operation of the network or violates the rules and |
| + | protocols for communication across the network. |
| + | |
| + | Corresponding Source conveyed, and Installation Information provided, |
| + | in accord with this section must be in a format that is publicly |
| + | documented (and with an implementation available to the public in |
| + | source code form), and must require no special password or key for |
| + | unpacking, reading or copying. |
| + | |
| + | 7. Additional Terms. |
| + | |
| + | "Additional permissions" are terms that supplement the terms of this |
| + | License by making exceptions from one or more of its conditions. |
| + | Additional permissions that are applicable to the entire Program shall |
| + | be treated as though they were included in this License, to the extent |
| + | that they are valid under applicable law. If additional permissions |
| + | apply only to part of the Program, that part may be used separately |
| + | under those permissions, but the entire Program remains governed by |
| + | this License without regard to the additional permissions. |
| + | |
| + | When you convey a copy of a covered work, you may at your option |
| + | remove any additional permissions from that copy, or from any part of |
| + | it. (Additional permissions may be written to require their own |
| + | removal in certain cases when you modify the work.) You may place |
| + | additional permissions on material, added by you to a covered work, |
| + | for which you have or can give appropriate copyright permission. |
| + | |
| + | Notwithstanding any other provision of this License, for material you |
| + | add to a covered work, you may (if authorized by the copyright holders of |
| + | that material) supplement the terms of this License with terms: |
| + | |
| + | a) Disclaiming warranty or limiting liability differently from the |
| + | terms of sections 15 and 16 of this License; or |
| + | |
| + | b) Requiring preservation of specified reasonable legal notices or |
| + | author attributions in that material or in the Appropriate Legal |
| + | Notices displayed by works containing it; or |
| + | |
| + | c) Prohibiting misrepresentation of the origin of that material, or |
| + | requiring that modified versions of such material be marked in |
| + | reasonable ways as different from the original version; or |
| + | |
| + | d) Limiting the use for publicity purposes of names of licensors or |
| + | authors of the material; or |
| + | |
| + | e) Declining to grant rights under trademark law for use of some |
| + | trade names, trademarks, or service marks; or |
| + | |
| + | f) Requiring indemnification of licensors and authors of that |
| + | material by anyone who conveys the material (or modified versions of |
| + | it) with contractual assumptions of liability to the recipient, for |
| + | any liability that these contractual assumptions directly impose on |
| + | those licensors and authors. |
| + | |
| + | All other non-permissive additional terms are considered "further |
| + | restrictions" within the meaning of section 10. If the Program as you |
| + | received it, or any part of it, contains a notice stating that it is |
| + | governed by this License along with a term that is a further |
| + | restriction, you may remove that term. If a license document contains |
| + | a further restriction but permits relicensing or conveying under this |
| + | License, you may add to a covered work material governed by the terms |
| + | of that license document, provided that the further restriction does |
| + | not survive such relicensing or conveying. |
| + | |
| + | If you add terms to a covered work in accord with this section, you |
| + | must place, in the relevant source files, a statement of the |
| + | additional terms that apply to those files, or a notice indicating |
| + | where to find the applicable terms. |
| + | |
| + | Additional terms, permissive or non-permissive, may be stated in the |
| + | form of a separately written license, or stated as exceptions; |
| + | the above requirements apply either way. |
| + | |
| + | 8. Termination. |
| + | |
| + | You may not propagate or modify a covered work except as expressly |
| + | provided under this License. Any attempt otherwise to propagate or |
| + | modify it is void, and will automatically terminate your rights under |
| + | this License (including any patent licenses granted under the third |
| + | paragraph of section 11). |
| + | |
| + | However, if you cease all violation of this License, then your |
| + | license from a particular copyright holder is reinstated (a) |
| + | provisionally, unless and until the copyright holder explicitly and |
| + | finally terminates your license, and (b) permanently, if the copyright |
| + | holder fails to notify you of the violation by some reasonable means |
| + | prior to 60 days after the cessation. |
| + | |
| + | Moreover, your license from a particular copyright holder is |
| + | reinstated permanently if the copyright holder notifies you of the |
| + | violation by some reasonable means, this is the first time you have |
| + | received notice of violation of this License (for any work) from that |
| + | copyright holder, and you cure the violation prior to 30 days after |
| + | your receipt of the notice. |
| + | |
| + | Termination of your rights under this section does not terminate the |
| + | licenses of parties who have received copies or rights from you under |
| + | this License. If your rights have been terminated and not permanently |
| + | reinstated, you do not qualify to receive new licenses for the same |
| + | material under section 10. |
| + | |
| + | 9. Acceptance Not Required for Having Copies. |
| + | |
| + | You are not required to accept this License in order to receive or |
| + | run a copy of the Program. Ancillary propagation of a covered work |
| + | occurring solely as a consequence of using peer-to-peer transmission |
| + | to receive a copy likewise does not require acceptance. However, |
| + | nothing other than this License grants you permission to propagate or |
| + | modify any covered work. These actions infringe copyright if you do |
| + | not accept this License. Therefore, by modifying or propagating a |
| + | covered work, you indicate your acceptance of this License to do so. |
| + | |
| + | 10. Automatic Licensing of Downstream Recipients. |
| + | |
| + | Each time you convey a covered work, the recipient automatically |
| + | receives a license from the original licensors, to run, modify and |
| + | propagate that work, subject to this License. You are not responsible |
| + | for enforcing compliance by third parties with this License. |
| + | |
| + | An "entity transaction" is a transaction transferring control of an |
| + | organization, or substantially all assets of one, or subdividing an |
| + | organization, or merging organizations. If propagation of a covered |
| + | work results from an entity transaction, each party to that |
| + | transaction who receives a copy of the work also receives whatever |
| + | licenses to the work the party's predecessor in interest had or could |
| + | give under the previous paragraph, plus a right to possession of the |
| + | Corresponding Source of the work from the predecessor in interest, if |
| + | the predecessor has it or can get it with reasonable efforts. |
| + | |
| + | You may not impose any further restrictions on the exercise of the |
| + | rights granted or affirmed under this License. For example, you may |
| + | not impose a license fee, royalty, or other charge for exercise of |
| + | rights granted under this License, and you may not initiate litigation |
| + | (including a cross-claim or counterclaim in a lawsuit) alleging that |
| + | any patent claim is infringed by making, using, selling, offering for |
| + | sale, or importing the Program or any portion of it. |
| + | |
| + | 11. Patents. |
| + | |
| + | A "contributor" is a copyright holder who authorizes use under this |
| + | License of the Program or a work on which the Program is based. The |
| + | work thus licensed is called the contributor's "contributor version". |
| + | |
| + | A contributor's "essential patent claims" are all patent claims |
| + | owned or controlled by the contributor, whether already acquired or |
| + | hereafter acquired, that would be infringed by some manner, permitted |
| + | by this License, of making, using, or selling its contributor version, |
| + | but do not include claims that would be infringed only as a |
| + | consequence of further modification of the contributor version. For |
| + | purposes of this definition, "control" includes the right to grant |
| + | patent sublicenses in a manner consistent with the requirements of |
| + | this License. |
| + | |
| + | Each contributor grants you a non-exclusive, worldwide, royalty-free |
| + | patent license under the contributor's essential patent claims, to |
| + | make, use, sell, offer for sale, import and otherwise run, modify and |
| + | propagate the contents of its contributor version. |
| + | |
| + | In the following three paragraphs, a "patent license" is any express |
| + | agreement or commitment, however denominated, not to enforce a patent |
| + | (such as an express permission to practice a patent or covenant not to |
| + | sue for patent infringement). To "grant" such a patent license to a |
| + | party means to make such an agreement or commitment not to enforce a |
| + | patent against the party. |
| + | |
| + | If you convey a covered work, knowingly relying on a patent license, |
| + | and the Corresponding Source of the work is not available for anyone |
| + | to copy, free of charge and under the terms of this License, through a |
| + | publicly available network server or other readily accessible means, |
| + | then you must either (1) cause the Corresponding Source to be so |
| + | available, or (2) arrange to deprive yourself of the benefit of the |
| + | patent license for this particular work, or (3) arrange, in a manner |
| + | consistent with the requirements of this License, to extend the patent |
| + | license to downstream recipients. "Knowingly relying" means you have |
| + | actual knowledge that, but for the patent license, your conveying the |
| + | covered work in a country, or your recipient's use of the covered work |
| + | in a country, would infringe one or more identifiable patents in that |
| + | country that you have reason to believe are valid. |
| + | |
| + | If, pursuant to or in connection with a single transaction or |
| + | arrangement, you convey, or propagate by procuring conveyance of, a |
| + | covered work, and grant a patent license to some of the parties |
| + | receiving the covered work authorizing them to use, propagate, modify |
| + | or convey a specific copy of the covered work, then the patent license |
| + | you grant is automatically extended to all recipients of the covered |
| + | work and works based on it. |
| + | |
| + | A patent license is "discriminatory" if it does not include within |
| + | the scope of its coverage, prohibits the exercise of, or is |
| + | conditioned on the non-exercise of one or more of the rights that are |
| + | specifically granted under this License. You may not convey a covered |
| + | work if you are a party to an arrangement with a third party that is |
| + | in the business of distributing software, under which you make payment |
| + | to the third party based on the extent of your activity of conveying |
| + | the work, and under which the third party grants, to any of the |
| + | parties who would receive the covered work from you, a discriminatory |
| + | patent license (a) in connection with copies of the covered work |
| + | conveyed by you (or copies made from those copies), or (b) primarily |
| + | for and in connection with specific products or compilations that |
| + | contain the covered work, unless you entered into that arrangement, |
| + | or that patent license was granted, prior to 28 March 2007. |
| + | |
| + | Nothing in this License shall be construed as excluding or limiting |
| + | any implied license or other defenses to infringement that may |
| + | otherwise be available to you under applicable patent law. |
| + | |
| + | 12. No Surrender of Others' Freedom. |
| + | |
| + | If conditions are imposed on you (whether by court order, agreement or |
| + | otherwise) that contradict the conditions of this License, they do not |
| + | excuse you from the conditions of this License. If you cannot convey a |
| + | covered work so as to satisfy simultaneously your obligations under this |
| + | License and any other pertinent obligations, then as a consequence you may |
| + | not convey it at all. For example, if you agree to terms that obligate you |
| + | to collect a royalty for further conveying from those to whom you convey |
| + | the Program, the only way you could satisfy both those terms and this |
| + | License would be to refrain entirely from conveying the Program. |
| + | |
| + | 13. Use with the GNU Affero General Public License. |
| + | |
| + | Notwithstanding any other provision of this License, you have |
| + | permission to link or combine any covered work with a work licensed |
| + | under version 3 of the GNU Affero General Public License into a single |
| + | combined work, and to convey the resulting work. The terms of this |
| + | License will continue to apply to the part which is the covered work, |
| + | but the special requirements of the GNU Affero General Public License, |
| + | section 13, concerning interaction through a network will apply to the |
| + | combination as such. |
| + | |
| + | 14. Revised Versions of this License. |
| + | |
| + | The Free Software Foundation may publish revised and/or new versions of |
| + | the GNU General Public License from time to time. Such new versions will |
| + | be similar in spirit to the present version, but may differ in detail to |
| + | address new problems or concerns. |
| + | |
| + | Each version is given a distinguishing version number. If the |
| + | Program specifies that a certain numbered version of the GNU General |
| + | Public License "or any later version" applies to it, you have the |
| + | option of following the terms and conditions either of that numbered |
| + | version or of any later version published by the Free Software |
| + | Foundation. If the Program does not specify a version number of the |
| + | GNU General Public License, you may choose any version ever published |
| + | by the Free Software Foundation. |
| + | |
| + | If the Program specifies that a proxy can decide which future |
| + | versions of the GNU General Public License can be used, that proxy's |
| + | public statement of acceptance of a version permanently authorizes you |
| + | to choose that version for the Program. |
| + | |
| + | Later license versions may give you additional or different |
| + | permissions. However, no additional obligations are imposed on any |
| + | author or copyright holder as a result of your choosing to follow a |
| + | later version. |
| + | |
| + | 15. Disclaimer of Warranty. |
| + | |
| + | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
| + | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
| + | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
| + | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
| + | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
| + | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
| + | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
| + | |
| + | 16. Limitation of Liability. |
| + | |
| + | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
| + | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
| + | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
| + | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
| + | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
| + | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
| + | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
| + | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
| + | SUCH DAMAGES. |
| + | |
| + | 17. Interpretation of Sections 15 and 16. |
| + | |
| + | If the disclaimer of warranty and limitation of liability provided |
| + | above cannot be given local legal effect according to their terms, |
| + | reviewing courts shall apply local law that most closely approximates |
| + | an absolute waiver of all civil liability in connection with the |
| + | Program, unless a warranty or assumption of liability accompanies a |
| + | copy of the Program in return for a fee. |
| + | |
| + | END OF TERMS AND CONDITIONS |
| + | |
| + | How to Apply These Terms to Your New Programs |
| + | |
| + | If you develop a new program, and you want it to be of the greatest |
| + | possible use to the public, the best way to achieve this is to make it |
| + | free software which everyone can redistribute and change under these terms. |
| + | |
| + | To do so, attach the following notices to the program. It is safest |
| + | to attach them to the start of each source file to most effectively |
| + | state the exclusion of warranty; and each file should have at least |
| + | the "copyright" line and a pointer to where the full notice is found. |
| + | |
| + | <one line to give the program's name and a brief idea of what it does.> |
| + | Copyright (C) <year> <name of author> |
| + | |
| + | This program is free software: you can redistribute it and/or modify |
| + | it under the terms of the GNU General Public License as published by |
| + | the Free Software Foundation, either version 3 of the License, or |
| + | (at your option) any later version. |
| + | |
| + | This program 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 General Public License for more details. |
| + | |
| + | You should have received a copy of the GNU General Public License |
| + | along with this program. If not, see <http://www.gnu.org/licenses/>. |
| + | |
| + | Also add information on how to contact you by electronic and paper mail. |
| + | |
| + | If the program does terminal interaction, make it output a short |
| + | notice like this when it starts in an interactive mode: |
| + | |
| + | <program> Copyright (C) <year> <name of author> |
| + | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
| + | This is free software, and you are welcome to redistribute it |
| + | under certain conditions; type `show c' for details. |
| + | |
| + | The hypothetical commands `show w' and `show c' should show the appropriate |
| + | parts of the General Public License. Of course, your program's commands |
| + | might be different; for a GUI interface, you would use an "about box". |
| + | |
| + | You should also get your employer (if you work as a programmer) or school, |
| + | if any, to sign a "copyright disclaimer" for the program, if necessary. |
| + | For more information on this, and how to apply and follow the GNU GPL, see |
| + | <http://www.gnu.org/licenses/>. |
| + | |
| + | The GNU General Public License does not permit incorporating your program |
| + | into proprietary programs. If your program is a subroutine library, you |
| + | may consider it more useful to permit linking proprietary applications with |
| + | the library. If this is what you want to do, use the GNU Lesser General |
| + | Public License instead of this License. But first, please read |
| + | <http://www.gnu.org/philosophy/why-not-lgpl.html>. |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/README
+27
-0
| @@ | @@ -0,0 +1,27 @@ |
| + | /** |
| + | * @version Alpha 0.1 2008-05-10 23:28:43 $ |
| + | * @package Silver skin for WYMeditor |
| + | * @copyright Copyright (C) 2008 Scott Edwin Lewis. All rights reserved. |
| + | * @license GNU/GPL, see COPYING |
| + | * Silver skin for WYMeditor is free software and is licensed under the |
| + | * GNU General Public License. See COPYING for copyright notices and details. |
| + | */ |
| + | |
| + | Adds custom buttons and color palette to the WYMeditor XHTML Editor. |
| + | |
| + | INSTALLATION: |
| + | |
| + | 1. Copy the entire /silver/ directory to /wymeditor/skins/ |
| + | 2. Initialize the WYMeditor 'skin' option as below: |
| + | |
| + | <script type="text/javascript"> |
| + | jQuery(function() { |
| + | |
| + | jQuery('.wymeditor').wymeditor({ |
| + | skin: 'silver' |
| + | }); |
| + | |
| + | }); |
| + | </script> |
| + | |
| + | That's it. You're done. |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/images/bg.header.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/images/bg.selector.silver.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/images/bg.wymeditor.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/images/icons.silver.gif
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/skin.css
+297
-0
| @@ | @@ -0,0 +1,297 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * screen.css |
| + | * main stylesheet for the default WYMeditor skin |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | * Scott Edwin Lewis |
| + | */ |
| + | |
| + | /*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/ |
| + | .wym_skin_silver p, .wym_skin_silver h2, .wym_skin_silver h3, |
| + | .wym_skin_silver ul, .wym_skin_silver li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; } |
| + | |
| + | |
| + | /*HIDDEN BY DEFAULT*/ |
| + | .wym_skin_silver .wym_area_left { display: none; } |
| + | .wym_skin_silver .wym_area_right { display: block; } |
| + | |
| + | |
| + | /*TYPO*/ |
| + | .wym_skin_silver { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; } |
| + | .wym_skin_silver h2 { font-size: 110%; /* = 11px */} |
| + | .wym_skin_silver h3 { font-size: 100%; /* = 10px */} |
| + | .wym_skin_silver li { font-size: 100%; /* = 10px */} |
| + | |
| + | |
| + | /*WYM_BOX*/ |
| + | .wym_skin_silver { border: 1px solid gray; background: #f2f2f2; padding: 0px; margin: 0px;} |
| + | |
| + | /*auto-clear the wym_box*/ |
| + | .wym_skin_silver:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_silver { height: 1%;} |
| + | |
| + | |
| + | /*WYM_HTML*/ |
| + | .wym_skin_silver .wym_html { width: 98%;} |
| + | .wym_skin_silver .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; } |
| + | |
| + | |
| + | /*WYM_IFRAME*/ |
| + | .wym_skin_silver .wym_iframe { width: 98%;} |
| + | .wym_skin_silver .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white } |
| + | |
| + | |
| + | /*AREAS*/ |
| + | .wym_skin_silver .wym_area_left { width: 150px; float: left;} |
| + | .wym_skin_silver .wym_area_right { width: 150px; float: right;} |
| + | .wym_skin_silver .wym_area_bottom { height: 1%; clear: both;} |
| + | * html .wym_skin_silver .wym_area_main { height: 1%;} |
| + | * html .wym_skin_silver .wym_area_top { height: 1%;} |
| + | *+html .wym_skin_silver .wym_area_top { height: 1%;} |
| + | |
| + | /*SECTIONS SYSTEM*/ |
| + | |
| + | /*common defaults for all sections*/ |
| + | .wym_skin_silver .wym_section { margin-bottom: 5px; } |
| + | .wym_skin_silver .wym_section h2, |
| + | .wym_skin_silver .wym_section h3 { padding: 1px 3px; margin: 0; cursor: pointer; } |
| + | .wym_skin_silver .wym_section a { padding: 5px 0px 0px 10px; display: block; text-decoration: none; color: black; } |
| + | .wym_skin_silver .wym_section a:hover { /*background-color: #DDD;*/} |
| + | /*hide section titles by default*/ |
| + | .wym_skin_silver .wym_section h2 { display: none; } |
| + | /*disable any margin-collapse*/ |
| + | .wym_skin_silver .wym_section { padding-top: 1px; padding-bottom: 1px; } |
| + | /*auto-clear sections*/ |
| + | .wym_skin_silver .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; padding: 0px; } |
| + | * html .wym_skin_silver .wym_section ul { height: 1%;} |
| + | .wym_skin_silver .wym_section li {} |
| + | |
| + | /*option: add this class to a section to make it render as a panel*/ |
| + | .wym_skin_silver .wym_panel { } |
| + | .wym_skin_silver .wym_panel h2 { display: block; font-size: 11px; } |
| + | |
| + | /*option: add this class to a section to make it render as a dropdown menu*/ |
| + | .wym_skin_silver .wym_dropdown h2 { display: block; font-size: 11px;} |
| + | .wym_skin_silver .wym_dropdown ul { position: absolute; background: white; padding: 0px;} |
| + | .wym_skin_silver .wym_dropdown:hover ul, |
| + | .wym_skin_silver .wym_dropdown.hover ul { cursor: pointer;} |
| + | .wym_skin_silver .wym_dropdown ul li a {/*border-bottom: 1px solid #AAA;*/} |
| + | |
| + | /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/ |
| + | .wym_skin_silver .wym_buttons li { float:left;} |
| + | .wym_skin_silver .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px; text-decoration: none !important; border: 1px solid #666; } |
| + | .wym_skin_silver .wym_buttons a:hover { text-decoration: none !important; border: 1px solid #000;} |
| + | /*image replacements*/ |
| + | .wym_skin_silver .wym_buttons li a { background: url(images/icons.silver.gif) no-repeat; text-indent: -9999px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_strong a { background-position: 0 -384px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_emphasis a { background-position: 0 -24px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_superscript a { background-position: 0 -432px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_subscript a { background-position: 0 -456px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_indent a { background-position: 0 -600px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_outdent a { background-position: 0 -624px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_undo a { background-position: 0 -504px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_redo a { background-position: 0 -528px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_link a { background-position: 0 -96px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_image a { background-position: 0 -120px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_table a { background-position: 0 -144px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_html a { background-position: 0 -192px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_gadget a { background-position: 0 -576px;} |
| + | |
| + | .wym_skin_silver .wym_buttons li.wym_tools_strong a:hover { background-position: -24px -384px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_emphasis a:hover { background-position: -24px -24px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_superscript a:hover { background-position: -24px -432px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_subscript a:hover { background-position: -24px -456px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a:hover { background-position: -24px -48px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a:hover{ background-position: -24px -72px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_indent a:hover { background-position: -24px -600px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_outdent a:hover { background-position: -24px -624px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_undo a:hover { background-position: -24px -504px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_redo a:hover { background-position: -24px -528px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_link a:hover { background-position: -24px -96px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_unlink a:hover { background-position: -24px -168px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_image a:hover { background-position: -24px -120px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_table a:hover { background-position: -24px -144px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_paste a:hover { background-position: -24px -552px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_html a:hover { background-position: -24px -192px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_preview a:hover { background-position: -24px -408px;} |
| + | .wym_skin_silver .wym_buttons li.wym_tools_gadget a:hover { background-position: -24px -576px;} |
| + | |
| + | /*DECORATION*/ |
| + | .wym_skin_silver .wym_section h2 { background: #ddd; border: none;} |
| + | .wym_skin_silver .wym_section h2 span { color: gray;} |
| + | .wym_skin_silver .wym_panel { padding: 0; border: solid gray; border-width: 0px;} |
| + | .wym_skin_silver .wym_panel ul { margin: 2px 0 5px; } |
| + | .wym_skin_silver .wym_dropdown { padding: 0; border: none; } |
| + | .wym_skin_silver .wym_dropdown ul { border: none; margin-left: -1px; padding: 0px;} |
| + | |
| + | /*DIALOGS*/ |
| + | .wym_dialog div.row { margin-bottom: 5px;} |
| + | .wym_dialog div.row input { margin-right: 5px;} |
| + | .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; } |
| + | .wym_dialog div.row-indent { padding-left: 160px; } |
| + | /*autoclearing*/ |
| + | .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | .wym_dialog div.row { display: inline-block; } |
| + | /* Hides from IE-mac \*/ |
| + | * html .wym_dialog div.row { height: 1%; } |
| + | .wym_dialog div.row { display: block; } |
| + | /* End hide from IE-mac */ |
| + | |
| + | /*WYMEDITOR_LINK*/ |
| + | a.wym_wymeditor_link |
| + | { |
| + | text-indent: -9999px; |
| + | float: right; |
| + | display: block; |
| + | width: 50px; |
| + | height: 15px; |
| + | background: url(../wymeditor_icon.png); |
| + | background-position: 1px 1px; |
| + | background-repeat: no-repeat; |
| + | overflow: hidden; |
| + | text-decoration: none; |
| + | padding: 1px !important; |
| + | border: 1px solid #333 !important; |
| + | background-color: #FFF !important; |
| + | } |
| + | |
| + | .wym_box |
| + | { |
| + | padding: 0px !important; |
| + | margin: 0px; |
| + | } |
| + | .wym_inner |
| + | { |
| + | border-left: 1px solid #FFF; |
| + | border-top: 1px solid #FFF; |
| + | border-right: 1px solid #FFF; |
| + | border-bottom: 1px solid #FFF; |
| + | padding: 5px; |
| + | background-color: #B8C1C4; |
| + | height: auto; |
| + | } |
| + | |
| + | .clear {clear: both;} |
| + | |
| + | div.wym_dropdown |
| + | { |
| + | cursor: pointer; |
| + | width: 138px !important; |
| + | margin: 0px 4px 10px 0px !important; |
| + | padding: 0px; |
| + | z-index: 1001; |
| + | display: block; |
| + | border: 1px solid red; |
| + | } |
| + | |
| + | div.wym_dropdown ul |
| + | { |
| + | display: none; |
| + | width: 124px; |
| + | padding: 0px !important; |
| + | margin: 0px !important; |
| + | list-style-type: none; |
| + | list-style-image: none; |
| + | z-index: 1002; |
| + | position: absolute; |
| + | border-top: 1px solid #AAA; |
| + | } |
| + | |
| + | div.wym_dropdown ul li |
| + | { |
| + | width: 146px; |
| + | height: 20px; |
| + | padding: 0px !important; |
| + | margin: 0px; |
| + | border: 1px solid #777; |
| + | border-top: none; |
| + | background: #DDD; |
| + | list-style-image: none; |
| + | } |
| + | |
| + | div.wym_dropdown h2 |
| + | { |
| + | width: 138px; |
| + | height: 16px; |
| + | color: #000 !important; |
| + | background-image: url(images/bg.selector.silver.gif) !important; |
| + | background-position: 0px -18px; |
| + | background-repeat: no-repeat; |
| + | border: none; |
| + | font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif; |
| + | font-size: 12px !important; |
| + | font-weight: bold !important; |
| + | padding: 2px 0px 0px 10px !important; |
| + | margin: 0px !important; |
| + | } |
| + | |
| + | .wym_skin_silver .wym_panel h2 |
| + | { |
| + | width: 138px; |
| + | height: 16px; |
| + | color: #000 !important; |
| + | background-image: url(images/bg.header.gif) !important; |
| + | background-position: 0px 0px; |
| + | background-repeat: no-repeat; |
| + | border: none; |
| + | font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif; |
| + | font-size: 12px !important; |
| + | font-weight: bold !important; |
| + | padding: 2px 0px 0px 10px !important; |
| + | margin: 0px !important; |
| + | } |
| + | |
| + | .wym_skin_silver .wym_panel ul |
| + | { |
| + | margin-top: 0px !important; |
| + | } |
| + | |
| + | .wym_skin_silver .wym_panel ul li |
| + | { |
| + | width: 146px; |
| + | height: 20px; |
| + | padding: 0px !important; |
| + | margin: 0px; |
| + | border: 1px solid #777; |
| + | border-top: none; |
| + | background: #DDD; |
| + | list-style-image: none; |
| + | } |
| + | |
| + | .wym_skin_silver .wym_panel a, |
| + | div.wym_dropdown a |
| + | { |
| + | text-decoration: none; |
| + | font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif; |
| + | font-size: 12px; |
| + | padding: 5px 0px 0px 10px !important; |
| + | display: block; |
| + | width: 136px; |
| + | height: 15px; |
| + | color: #000; |
| + | text-align: left !important; |
| + | margin-left: 0px !important; |
| + | } |
| + | |
| + | div.wym_dropdown a:hover, |
| + | .wym_skin_silver .wym_panel a:hover |
| + | { |
| + | background: #BBB; |
| + | border-bottom: none !important; |
| + | } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/silver/skin.js
+61
-0
| @@ | @@ -0,0 +1,61 @@ |
| + | /* This file is part of the Silver skin for WYMeditor by Scott Edwin Lewis */ |
| + | |
| + | jQuery.fn.selectify = function() { |
| + | return this.each(function() { |
| + | jQuery(this).hover( |
| + | function() { |
| + | jQuery("h2", this).css("background-position", "0px -18px"); |
| + | jQuery("ul", this).fadeIn("fast"); |
| + | }, |
| + | function() { |
| + | jQuery("h2", this).css("background-position", ""); |
| + | jQuery("ul", this).fadeOut("fast"); |
| + | } |
| + | ); |
| + | }); |
| + | }; |
| + | |
| + | WYMeditor.SKINS['silver'] = { |
| + | |
| + | init: function(wym) { |
| + | |
| + | //add some elements to improve the rendering |
| + | jQuery(wym._box) |
| + | .append('<div class="clear"></div>') |
| + | .wrapInner('<div class="wym_inner"></div>'); |
| + | |
| + | //render following sections as panels |
| + | jQuery(wym._box).find(wym._options.classesSelector) |
| + | .addClass("wym_panel"); |
| + | |
| + | //render following sections as buttons |
| + | jQuery(wym._box).find(wym._options.toolsSelector) |
| + | .addClass("wym_buttons"); |
| + | |
| + | //render following sections as dropdown menus |
| + | jQuery(wym._box).find(wym._options.containersSelector) |
| + | .addClass("wym_dropdown") |
| + | .selectify(); |
| + | |
| + | // auto add some margin to the main area sides if left area |
| + | // or right area are not empty (if they contain sections) |
| + | jQuery(wym._box).find("div.wym_area_right ul") |
| + | .parents("div.wym_area_right").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-right": "155px"}); |
| + | |
| + | jQuery(wym._box).find("div.wym_area_left ul") |
| + | .parents("div.wym_area_left").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-left": "155px"}); |
| + | |
| + | //make hover work under IE < 7 |
| + | jQuery(wym._box).find(".wym_section").hover(function(){ |
| + | jQuery(this).addClass("hover"); |
| + | },function(){ |
| + | jQuery(this).removeClass("hover"); |
| + | }); |
| + | } |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/twopanels/icons.png
+0
-0
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/twopanels/skin.css
+134
-0
| @@ | @@ -0,0 +1,134 @@ |
| + | /* |
| + | * WYMeditor : what you see is What You Mean web-based editor |
| + | * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/ |
| + | * Dual licensed under the MIT (MIT-license.txt) |
| + | * and GPL (GPL-license.txt) licenses. |
| + | * |
| + | * For further information visit: |
| + | * http://www.wymeditor.org/ |
| + | * |
| + | * File Name: |
| + | * screen.css |
| + | * main stylesheet for the WYMeditor skin |
| + | * See the documentation for more info. |
| + | * |
| + | * File Authors: |
| + | * Daniel Reszka (d.reszka a-t wymeditor dotorg) |
| + | * Jean-Francois Hovinne |
| + | */ |
| + | |
| + | /*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/ |
| + | .wym_skin_twopanels p, .wym_skin_twopanels h2, .wym_skin_twopanels h3, |
| + | .wym_skin_twopanels ul, .wym_skin_twopanels li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; } |
| + | |
| + | |
| + | /*HIDDEN BY DEFAULT*/ |
| + | .wym_skin_twopanels .wym_area_left { display: block; } |
| + | .wym_skin_twopanels .wym_area_right { display: block; } |
| + | |
| + | |
| + | /*TYPO*/ |
| + | .wym_skin_twopanels { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; } |
| + | .wym_skin_twopanels h2 { font-size: 110%; /* = 11px */} |
| + | .wym_skin_twopanels h3 { font-size: 100%; /* = 10px */} |
| + | .wym_skin_twopanels li { font-size: 100%; /* = 10px */} |
| + | |
| + | |
| + | /*WYM_BOX*/ |
| + | .wym_skin_twopanels { border: 1px solid gray; background: #f2f2f2; padding: 5px} |
| + | |
| + | /*auto-clear the wym_box*/ |
| + | .wym_skin_twopanels:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_twopanels { height: 1%;} |
| + | |
| + | |
| + | /*WYM_HTML*/ |
| + | .wym_skin_twopanels .wym_html { width: 98%;} |
| + | .wym_skin_twopanels .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; } |
| + | |
| + | |
| + | /*WYM_IFRAME*/ |
| + | .wym_skin_twopanels .wym_iframe { width: 98%;} |
| + | .wym_skin_twopanels .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white } |
| + | |
| + | |
| + | /*AREAS*/ |
| + | .wym_skin_twopanels .wym_area_left { width: 100px; float: left;} |
| + | .wym_skin_twopanels .wym_area_right { width: 150px; float: right;} |
| + | .wym_skin_twopanels .wym_area_bottom { height: 1%; clear: both;} |
| + | * html .wym_skin_twopanels .wym_area_main { height: 1%;} |
| + | * html .wym_skin_twopanels .wym_area_top { height: 1%;} |
| + | *+html .wym_skin_twopanels .wym_area_top { height: 1%;} |
| + | |
| + | /*SECTIONS SYSTEM*/ |
| + | |
| + | /*common defaults for all sections*/ |
| + | .wym_skin_twopanels .wym_section { margin-bottom: 5px; } |
| + | .wym_skin_twopanels .wym_section h2, |
| + | .wym_skin_twopanels .wym_section h3 { padding: 1px 3px; margin: 0; } |
| + | .wym_skin_twopanels .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; } |
| + | .wym_skin_twopanels .wym_section a:hover { background-color: yellow; } |
| + | /*hide section titles by default*/ |
| + | .wym_skin_twopanels .wym_section h2 { display: none; } |
| + | /*disable any margin-collapse*/ |
| + | .wym_skin_twopanels .wym_section { padding-top: 1px; padding-bottom: 1px; } |
| + | /*auto-clear sections*/ |
| + | .wym_skin_twopanels .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | * html .wym_skin_twopanels .wym_section ul { height: 1%;} |
| + | |
| + | /*option: add this class to a section to make it render as a panel*/ |
| + | .wym_skin_twopanels .wym_panel { } |
| + | .wym_skin_twopanels .wym_panel h2 { display: block; } |
| + | |
| + | /*option: add this class to a section to make it render as a dropdown menu*/ |
| + | .wym_skin_twopanels .wym_dropdown h2 { display: block; } |
| + | .wym_skin_twopanels .wym_dropdown ul { display: none; position: absolute; background: white; } |
| + | .wym_skin_twopanels .wym_dropdown:hover ul, |
| + | .wym_skin_twopanels .wym_dropdown.hover ul { display: block; } |
| + | |
| + | /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/ |
| + | .wym_skin_twopanels .wym_buttons li { float:left;} |
| + | .wym_skin_twopanels .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px } |
| + | /*image replacements*/ |
| + | .wym_skin_twopanels .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_link a { background-position: 0 -96px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_image a { background-position: 0 -121px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_table a { background-position: 0 -144px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_html a { background-position: 0 -193px;} |
| + | .wym_skin_twopanels .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;} |
| + | |
| + | /*DECORATION*/ |
| + | .wym_skin_twopanels .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;} |
| + | .wym_skin_twopanels .wym_section h2 span { color: gray;} |
| + | .wym_skin_twopanels .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;} |
| + | .wym_skin_twopanels .wym_panel ul { margin: 2px 0 5px; } |
| + | .wym_skin_twopanels .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; } |
| + | .wym_skin_twopanels .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;} |
| + | |
| + | /*DIALOGS*/ |
| + | .wym_dialog div.row { margin-bottom: 5px;} |
| + | .wym_dialog div.row input { margin-right: 5px;} |
| + | .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; } |
| + | .wym_dialog div.row-indent { padding-left: 160px; } |
| + | /*autoclearing*/ |
| + | .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | .wym_dialog div.row { display: inline-block; } |
| + | /* Hides from IE-mac \*/ |
| + | * html .wym_dialog div.row { height: 1%; } |
| + | .wym_dialog div.row { display: block; } |
| + | /* End hide from IE-mac */ |
| + | |
| + | /*WYMEDITOR_LINK*/ |
| + | a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; } |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/twopanels/skin.js
+39
-0
| @@ | @@ -0,0 +1,39 @@ |
| + | WYMeditor.SKINS['twopanels'] = { |
| + | |
| + | init: function(wym) { |
| + | |
| + | //move the containers panel to the left area |
| + | jQuery(wym._box).find(wym._options.containersSelector) |
| + | .appendTo("div.wym_area_left"); |
| + | |
| + | //render following sections as panels |
| + | jQuery(wym._box).find(wym._options.classesSelector + ', ' |
| + | + wym._options.containersSelector) |
| + | .addClass("wym_panel"); |
| + | |
| + | //render following sections as buttons |
| + | jQuery(wym._box).find(wym._options.toolsSelector) |
| + | .addClass("wym_buttons"); |
| + | |
| + | // auto add some margin to the main area sides if left area |
| + | // or right area are not empty (if they contain sections) |
| + | jQuery(wym._box).find("div.wym_area_right ul") |
| + | .parents("div.wym_area_right").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-right": "155px"}); |
| + | |
| + | jQuery(wym._box).find("div.wym_area_left ul") |
| + | .parents("div.wym_area_left").show() |
| + | .parents(wym._options.boxSelector) |
| + | .find("div.wym_area_main") |
| + | .css({"margin-left": "115px"}); |
| + | |
| + | //make hover work under IE < 7 |
| + | jQuery(wym._box).find(".wym_section").hover(function(){ |
| + | jQuery(this).addClass("hover"); |
| + | },function(){ |
| + | jQuery(this).removeClass("hover"); |
| + | }); |
| + | } |
| + | }; |
app/assets/javascripts/comfortable_mexican_sofa/wymeditor/skins/wymeditor_icon.png
+0
-0
app/views/layouts/cms_admin/_head.html.erb
+2
-0
| @@ | @@ -4,8 +4,10 @@ |
| <%= csrf_meta_tag %> | |
| <meta name="cms-admin-path" content="<%= ComfortableMexicanSofa.config.admin_route_prefix %>" /> | |
| + | |
| <%= stylesheet_link_tag 'comfortable_mexican_sofa/application' %> | |
| <%= javascript_include_tag 'comfortable_mexican_sofa/application' %> | |
| + | <%= javascript_include_tag 'comfortable_mexican_sofa/wymeditor/jquery.wymeditor.pack.js' %> |
| <%= yield :head %> | |
| <%= cms_hook :html_head %> | |