define("dijit/_BidiSupport", ["./_WidgetBase"], function(_WidgetBase){ // module: // dijit/_BidiSupport /*===== return function(){ // summary: // Module that deals with BIDI, special with the auto // direction if needed without changing the GUI direction. // Including this module will extend _WidgetBase with BIDI related methods. // description: // There's a special need for displaying BIDI text in rtl direction // in ltr GUI, sometimes needed auto support. // In creation of widget, if it's want to activate this class, // the widget should define the "textDir". }; =====*/ _WidgetBase.extend({ getTextDir: function(/*String*/ text){ // summary: // Gets the right direction of text. // description: // If textDir is ltr or rtl returns the value. // If it's auto, calls to another function that responsible // for checking the value, and defining the direction. // tags: // protected. return this.textDir == "auto" ? this._checkContextual(text) : this.textDir; }, _checkContextual: function(text){ // summary: // Finds the first strong (directional) character, return ltr if isLatin // or rtl if isBidiChar. // tags: // private. // look for strong (directional) characters var fdc = /[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(text); // if found return the direction that defined by the character, else return widgets dir as defult. return fdc ? ( fdc[0] <= 'z' ? "ltr" : "rtl" ) : this.dir ? this.dir : this.isLeftToRight() ? "ltr" : "rtl"; }, applyTextDir: function(/*Object*/ element, /*String*/ text){ // summary: // Set element.dir according to this.textDir // element: // The text element to be set. Should have dir property. // text: // Used in case this.textDir is "auto", for calculating the right transformation // description: // If textDir is ltr or rtl returns the value. // If it's auto, calls to another function that responsible // for checking the value, and defining the direction. // tags: // protected. var textDir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir; // update only when there's a difference if(element.dir != textDir){ element.dir = textDir; } }, enforceTextDirWithUcc: function(option, text){ // summary: // Wraps by UCC (Unicode control characters) option's text according to this.textDir // option: // The element (`<option>`) we wrapping the text for. // text: // The text to be wrapped. // description: // There's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`) // defining the dir in different direction then the GUI orientation, won't display correctly. // FF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text // should be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`. // Therefore the only solution is to use UCC (Unicode control characters) to display the text in correct orientation. // This function saves the original text value for later restoration if needed, for example if the textDir will change etc. if(this.textDir){ option.originalText = text; var dir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir; return (dir == "ltr" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF; } return text; }, restoreOriginalText: function(origObj){ // summary: // Restores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set("textDir", textDir). // origObj: // The element (`<option>`) to restore. // description: // Sets the text of origObj to origObj.originalText, which is the original text, without the UCCs. // The function than removes the originalText from origObj! if(origObj.originalText){ origObj.text = origObj.originalText; delete origObj.originalText; } return origObj; } }); // UCC - constants that will be used by bidi support. var bidi_const = { LRM : '\u200E', LRE : '\u202A', PDF : '\u202C', RLM : '\u200f', RLE : '\u202B' }; return _WidgetBase; });