**** version 2.6.0 ***
    
    * Widget promoted to GA - beta flag removed from all files.

    * Firefox
	    * 1776202 - FF:rich text formatting (italize) lost when color is selected in RTE
	    * 1886390 - [SF 1946017] Unable to delete text when editor opens (Firefox)
	    * 2030281 - [SF 2002911] Problem with Header styling in Firefox
        * 1765001 - [SF 1899196] Firefox button Inconsistencies

    * Internet Explorer
	    * 1842631 - [SF 1869619] Image Modification Dialog
	    * 2006122 - [SF 1995892] set('disabled',false) cause IE6 error 
	    * 2092598 - [SF 2021359] IE7: dbl click image doesn't show settings dialog
	    * 2093275 - [SF 2026296] Auto Adjusting height bug in IE
	    * 2093325 - [SF 2025092] IE7:allowNoEdit turned on period '.' doesn't work
	    * 2099035 - [SF 2027048] keyDown event does not fire in IE after enabling editor
	    * 2189912 - [SF 2093253] Editor used in HTTPS page will provoke Security warning
        * 1655240 - [SF 1851177] Text Align not working correctly in IE
	    * 1984727 - [SF 1986820] Clicking bulleted list before typing creates empty <li> IE7
	    * 2108127 - [SF 2027073] IE7: editor list items misaligned 
	    * 1918222 - [SF 1956586] Fontsize is not updating when nodechange in IE

    * Safari
	    * 1972354 - [SF 1978372] Safari/IE list creation quirk
	    * 1972367 - [SF 1978350] Safari 3.1 issue with lists

    * All
        * 1508375 - [SF 1791252, 1964709] Have Undo, Redo functions in Editor  
	    * 1839296 - [SF 1926238] Editor adds extra </li> tag at the end of a list
	    * 1844215 - [SF 1928426] filter_invalid_lists
	    * 1844258 - [SF 1923255] Give descriptive error when container isn't textarea
	    * 1851344 - [SF 1931768] Relative links automatically converted to absolute links.
	    * 1870106 - Add a strikethrough/blockquote buttons for the Rich Text Editor
	    * 1886339 - [SF 1946874] Double clicking in the editor sets "editorDirty" false
	    * 1892984 - [SF 1919826] Regex matches both <b> and <button>
	    * 1901545 - Rich Text Editor - Link menu's url encoding "&" to "&amp" 	
	    * 1908178 - [SF 1954228] Deleting 1+ button from buttonType:advanced fails
	    * 1926462 - html encoded characters are unencoded
	    * 1964404 - [SF 1975463] Editor.destroy() doesn't destroy editor windows
	    * 1984734 - [SF 1986184] error on _formButtonClicked log message
	    * 2030229 - [SF 2003080] Various widths affect toolbar layout
	    * 2138168 - [SF 2048035] autoHeight will cause dialog panels to be misaligned
	    * 2166952 - [SF 2065060] Tab & shift-tab should move focus from the editor
	    * 2178829 - [SF 2077747] Simple editor losing its format when font color changes
        * 2015947 - [SF 1998524] Alignment Code doesn't generate
        * 2118761 - [SF 2035187] Custom Editor body CSS only applies to visited links
        * 2118723 - [SF 2034544] Image Options Dialog Box needs fixing
        * 2036613 - [SF 2007145] Removing underline not working in IE6/7, FF3
        * 2065013 - [SF 2015601] Text in some controls is not vertically centered
	    * 1918278 - [SF 1955931] font color (background color) doesn't work properly
	    * 1972427 - [SF 1954095] Bulleting
        * 1839224 - [SF 1925337] editor indent/outdent inconsistent behavior
	    * 2006092 - [SF 1996074] Indent changes the font to Arial
        * 206493 - Handle Submit Failing


**** version 2.5.2 ***
    * Firefox 3
        * 1898002 - Fixed tabbing issues

    * Internet Explorer
        * 1898002 - Fixed tabbing issues
        * 1824259 - [SF 1918308] Rich Text Editor: colouring a word colours the sentence

    * All
        * 1847813 - [SF 1930871] RTE doesn't load if handleSubmit: false explicitly defined
        * 1841312 - In the RTE image menu the label for "link Url" and "image URL" aren't the same
        * Color picker stays active when loses focus (Basic Buttons)
        * Fixed CSS for toolbar seperators to allow for the groups to float better.

**** version 2.5.1 ***

    * Adobe AIR Support
        * 1763867 - Adobe AIR: iFrame document open
        * 1763869 - Adobe AIR: Blank Image insertion fails
        * 1763872 - Adobe AIR: Setting font-family fails
        * 1763880 - Adobe AIR: Image Editor should show copy/paste note

    * Internet Explorer
        * 1556954 - [SF 1816784 ] tabbing troubles...
        * 1776579 - [SF 1873881 ] IE Bulleting Behavior

    * Safari
        * 1775802 - [SF 1899803] Links in safari are treated as regular links...
        * 1777918 - [SF 1898878 ] Safari uses <span> instead of <strong> tags...

    * All
        * 1776107 - ToolbarButton doesn't have a destroy method
        * 1776117 - Editor Accessibility Enhancements
        * 1776539 - [SF 1874009 ] Greedy Regex in RTE Eats embed and other tags
        * 1777925 - [SF 1878976 ] Regex matches both <i> and <iframe>
        * 1764038 - [SF 1898886 ] Problem with handleSubmit after move to 2.5.0
        * 1693686 - [SF 1869619] Image Modification Dialog


**** version 2.5.0 ***

    *Examples:
        1. [1687273] - [SF 1861119 ] Flickr Example code is incorrect

    *Config
        1. [1556954] - [SF 1816784 ] tabbing troubles...
            Added a new config option called plainText. (See API docs for more information)
        2. Removed the requirement for a textarea. If you pass the config as the first argument to the constructor
            the Editor will create the textarea for you.

    *Internet Explorer
        1. [1515145] - [SF 1807057 ] RTE _setDesignMode reloads page content
        2. [1687267] - [SF 1861514 ] editorContentLoaded fires early in IE6/7
        3. [1687244] - [SF 1866217 ] Editor in frameset causes "unspecified error" in IE6
        4. [1687278] - [SF 1859031 ] Change Font Color on IE
        5. [1687283] - [SF 1857798 ] IE7 RTE HTTPS problem
        6. [1687316] - [SF 1854657 ] IE bullet/number strange behaviour
    
    *All
        1. [1687258] - [SF 1862824 ] Problem with <script> tags in editor content
        2. [1687292] - [SF 1857235 ] cleanHTML function stripping closing tags
        3. [1687322] - [SF 1849730 ] Multiple Editors' toolbars conflict
        4. [1688270] - [SF 1867927] Editor dynamic height adjust
        5. [1693656] - [SF 1870215] handleSubmit hijacks the value of the submit button
        6. [1693686] - [SF 1869619] Image Modification Dialog
        7. [1693719] - [SF 1850814] Editor produces faulty code


**** version 2.4.0 ***

* Performance enhancements and bug fixes.
* Created a new base class called SimpleEditor. Editor now extends SimpleEditor
* Created 2 new Toolbar Buttons
    YAHOO.widget.ToolbarButton - No requirement for Button or Menu
    YAHOO.widget.ToolbarButtonAdvanced - Still Required Button and Menu

    *All
        1. [1423860] - [SF 1774823] Change text size removes selection highlight
        2. [1487601] - [SF 1796897] Font size issue
        3. [1508412] - [SF 1799379] setEditorHTML strips title attribute
        4. [1528759] - [SF 1810162] [example] Link Options Window appears behind the editor
            Added a config option "limitCommands" when set to true, the editor will not execute a command that is not bound to a button.

        5. [1544149] - [SF 1808154] add non-editable snippets to YUI-RTE
            Added a config option "allowNoEdit", when set to true the "_isNonEditalble method is called at the beginning of all event handlers to check if this element or
                a parent element has the class yui-noedit (this.CLASS_NOEDIT) applied. If it does, then this method will stop the event and return true. The event handlers
                will then return false and stop the nodeChange from occurring. This method will also disable and enable the Editor's toolbar based on the noedit state.

        6. [1544160] - [SF 1808102] Keep the content of invalidHTML
            If you set the value of a key in this.invalidHTML to "{ keepContents: true }", then the element will be replaced with a yui-non span to be filtered out when 
                cleanHTML is called. The only tag that is ignored here is the span tag as it will force the Editor into a loop and freeze the browser. However, all of
                these tags will be removed in the cleanHTML routine

        7. [1560982] - [SF 1818681] RTE converts input tags to emnput
        8. [1508390] - [SF 1787357] Split into separate modules
            Split the Editor into Editor and SimpleEditor. Also split out the execCommand support into several methods for easier overriding and extending.

        9. [1508403] - [SF 1779516] Dirty flag for editor
            You can now check the editorDirty property on the Editor instance. It will be default false and be set to true when something important happens.
            You will need to manually change it back to false when you check it.

    *Internet Explorer
        1. [1508413] - [SF 1804028, 1810362] Omission of DocType at top of page
            It appears that Internet Explorer doesn't like the page containing the Editor to not have a doctype if the page inside the editor does.
                The Editor will now check for compatMode and if it is not in standards mode, it will omit the doctype from the editable area.
                
        2. [1528733] - [SF 1808818] IE6 reports security violation on secure pages
        3. [1528766] - [SF 1810362] Will Not Work Without DTD header
        4. [1496536] - yui editor indentation problem
        5. [1465375] - [SF 1789702] RTE Image insertion creates timer error

    *Firefox
        1. [1492573] - Can not get focus on edit box in FF 1.5 on FreeBSD

**** version 2.3.1 ***

* Performance enhancements and bug fixes.

    *All
        1. [1406169] - Fixed Toolbar performance issues
        2. [1406176] - You can now set the height and width of the editor after it has been rendered       
        3. [1413456] - Group Labels can now be turned off after the editor has been rendered
        4. [1413750] - Editor now supports delayed render (script block above the textarea markup)
        5. [1416349] - cleanHTML now supports markup config options better (added xhtml option)
        6. [1422334] - Added a link field to the image property editor
        7. [1425540] - [SF 1775187] Fixed adding a link to an LI
        8. [1406370] - [SF 1767246 ] Using Back button causes breaking behavior. Fixed.
        9. [1435809] - Base href config fails when on a page with a port number. Fixed.

    *Safari
        1. [1390926] - Fixed Safari handleSubmit issue
        2. [1433563] - Editor becomes unstable when rendered inside an element set to display: none (added show() method)

    *Opera
        1. [1396921] - Fixed clicking the Toolbar while typing loses insertion point
        2. [1406700] - [SF 1767251] Background color can not be overridden in Opera.. Fixed.

    *Gecko
        1. [1411911] - [SF 1769657] RTE looks strange on Firefox when base.css - Fixed style collisions
        2. [1433563] - Editor becomes unstable when rendered inside an element set to display: none (added show() method)

    *Internet Explorer
        1. [1396921] - Fixed clicking the Toolbar while typing loses insertion point


**** version 2.3.0 ***

* Beta release.

* Known Issues
    * All
        1. Removed the menu for Create Ordered Lists, it now defaults to creating a simple OL with no type.
     
    * Safari
        1. Bug #1390926 - Safari may not inject the editor's HTML into the text area when the config handleSubmit is set to true.
            You can get around this with the following code (where comment is the id of the textarea):
                YAHOO.util.Dom.setStyle('comment', 'visibility', 'hidden');
                YAHOO.util.Dom.setStyle('comment', 'position', 'absolute');
                YAHOO.util.Dom.setStyle('comment', 'display', 'block');
                oEditor.saveHTML();
                window.setTimeout(function() {
                        YAHOO.util.Dom.get('comment').form.submit();
                }, 200);

            This issue will be fixed in a later release..
        2. Unable to get the cursor position inside the editable area.
            What this means is that when an image/object is inserted into the document
            we have no way of knowing "exactly" where to put it. So we make an educated guess.
            If they user clicked on an "element" (HTML Element) in the editor, then we will place
            the newly inserted element directly after it in the DOM. If there was no element clicked
            We will append the new element to the body.

        3. Ordered/Unorder Lists are not support natively. So we have built a work around for this.
            Most browsers will allow you to select a block of text and create a list out of it "automagically"
            by inserting an LI around blocks that are separated by line breaks, BRs or Ps. In Safari, the 
            entire text block will be turned into the first LI of the list. The user can then place the cursor
            at the beginning of each line, and backspace, then hit enter to create the new list item. There are some
            use cases that this might fail.

        4. Dragging and dropping of selections and images/objects is not supported.
            Safari will do some weird things if the text in the editable area is selected and dragged and dropped.
            We prevent this from happening to images inside of the editable area, but we can not prevent it for text.
            Safari will also give unexpected results if text from another Safari window in selected, then dragged
            into the editable area.

    * Opera
        1. Placing the cursor in the editor, then Shift Clicking to highlight will not work. The limitation appear to be in Opera.

        2. Image resize is unavailable, due to limitations in the browser

        3. Shortcut keys are not supported in this release.

        4. Dragging and dropping of selections and images/objects is not supported.

        5. Hitting the back button on the page will not reload the iframe.

        6. Selecting the editable area, then hitting the shortcut keys for "Reload" will
            cause the current page to be displayed inside the editable area.


**** version 2.3.0 Peview Release Notes ***

* The only server side resource required to run the editor, is the blankimage file.
    The blankimage file is the temporary image loaded into the editor when you click the
    "Insert Image" button in the toolbar.

    This can be set using:

    var myEditor = new YAHOO.widget.Editor('test', {
        blankimage: 'MY_IMAGE_PATH'
    });

* There is a performance issue with Safari on a G4 computer. We will be working to get this resolved before the initial beta release.
