f986c854b05161d88046074d08a73a7ec805a92d
1 window
.currentFocused
= undefined;
3 // this function adds a toolbar button to the mwEditButtons list
4 window
.addButton = function( imageFile
, speedTip
, tagOpen
, tagClose
, sampleText
, imageId
) {
5 // Don't generate buttons for browsers which don't fully
9 'imageFile': imageFile
,
13 'sampleText': sampleText
17 // this function adds one toolbar button from a mwEditButtons/mwCustomEditButtons item
18 window
.mwInsertEditButton = function( parent
, item
) {
19 var image
= document
.createElement( 'img' );
22 image
.className
= 'mw-toolbar-editbutton';
24 image
.id
= item
.imageId
;
26 image
.src
= item
.imageFile
;
28 image
.alt
= item
.speedTip
;
29 image
.title
= item
.speedTip
;
30 image
.style
.cursor
= 'pointer';
31 image
.onclick = function() {
32 insertTags( item
.tagOpen
, item
.tagClose
, item
.sampleText
);
34 if ( ( typeof $ != 'undefined' ) && ( typeof $.trackAction
!= 'undefined' ) ) {
35 $.trackAction( 'oldedit.' + item
.speedTip
.replace(/ /g
, "-") );
40 parent
.appendChild( image
);
44 // this function generates the actual toolbar buttons with localized text
45 // we use it to avoid creating the toolbar where javascript is not enabled
46 window
.mwSetupToolbar = function() {
47 var toolbar
= document
.getElementById( 'toolbar' );
52 // Don't generate buttons for browsers which don't fully
54 // but don't assume wpTextbox1 is always here
55 var textboxes
= document
.getElementsByTagName( 'textarea' );
56 if ( !textboxes
.length
) {
57 // No toolbar if we can't find any textarea
60 // Only check for selection capability if the textarea is visible - errors will occur otherwise - just because
61 // the textarea is not visible, doesn't mean we shouldn't build out the toolbar though - it might have been replaced
62 // with some other kind of control
63 if ( textboxes
[0].style
.display
!= 'none' ) {
64 if ( !( document
.selection
&& document
.selection
.createRange
)
65 && textboxes
[0].selectionStart
=== null ) {
69 for ( var i
= 0; i
< mwEditButtons
.length
; i
++ ) {
70 mwInsertEditButton( toolbar
, mwEditButtons
[i
] );
72 for ( var i
= 0; i
< mwCustomEditButtons
.length
; i
++ ) {
73 mwInsertEditButton( toolbar
, mwCustomEditButtons
[i
] );
78 // apply tagOpen/tagClose to selection in textarea,
79 // use sampleText instead of selection if there is none
80 window
.insertTags = function( tagOpen
, tagClose
, sampleText
) {
81 if ( typeof $ != 'undefined' && typeof $.fn
.textSelection
!= 'undefined' && currentFocused
&&
82 ( currentFocused
.nodeName
.toLowerCase() == 'iframe' || currentFocused
.id
== 'wpTextbox1' ) ) {
83 $( '#wpTextbox1' ).textSelection(
84 'encapsulateSelection', { 'pre': tagOpen
, 'peri': sampleText
, 'post': tagClose
}
89 if ( document
.editform
) {
90 txtarea
= currentFocused
;
92 // some alternate form? take the first one we can find
93 var areas
= document
.getElementsByTagName( 'textarea' );
96 var selText
, isSample
= false;
98 if ( document
.selection
&& document
.selection
.createRange
) { // IE/Opera
99 // save window scroll position
100 if ( document
.documentElement
&& document
.documentElement
.scrollTop
) {
101 var winScroll
= document
.documentElement
.scrollTop
102 } else if ( document
.body
) {
103 var winScroll
= document
.body
.scrollTop
;
105 // get current selection
107 var range
= document
.selection
.createRange();
108 selText
= range
.text
;
111 range
.text
= tagOpen
+ selText
+ tagClose
;
112 // mark sample text as selected
113 if ( isSample
&& range
.moveStart
) {
114 if ( window
.opera
) {
115 tagClose
= tagClose
.replace(/\n/g,'');
117 range
.moveStart('character', - tagClose
.length
- selText
.length
);
118 range
.moveEnd('character', - tagClose
.length
);
121 // restore window scroll position
122 if ( document
.documentElement
&& document
.documentElement
.scrollTop
) {
123 document
.documentElement
.scrollTop
= winScroll
;
124 } else if ( document
.body
) {
125 document
.body
.scrollTop
= winScroll
;
128 } else if ( txtarea
.selectionStart
|| txtarea
.selectionStart
== '0' ) { // Mozilla
129 // save textarea scroll position
130 var textScroll
= txtarea
.scrollTop
;
131 // get current selection
133 var startPos
= txtarea
.selectionStart
;
134 var endPos
= txtarea
.selectionEnd
;
135 selText
= txtarea
.value
.substring( startPos
, endPos
);
138 txtarea
.value
= txtarea
.value
.substring(0, startPos
)
139 + tagOpen
+ selText
+ tagClose
140 + txtarea
.value
.substring(endPos
, txtarea
.value
.length
);
143 txtarea
.selectionStart
= startPos
+ tagOpen
.length
;
144 txtarea
.selectionEnd
= startPos
+ tagOpen
.length
+ selText
.length
;
146 txtarea
.selectionStart
= startPos
+ tagOpen
.length
+ selText
.length
+ tagClose
.length
;
147 txtarea
.selectionEnd
= txtarea
.selectionStart
;
149 // restore textarea scroll position
150 txtarea
.scrollTop
= textScroll
;
153 function checkSelectedText() {
155 selText
= sampleText
;
157 } else if ( selText
.charAt(selText
.length
- 1) == ' ' ) { // exclude ending space char
158 selText
= selText
.substring(0, selText
.length
- 1);
166 * Restore the edit box scroll state following a preview operation,
167 * and set up a form submission handler to remember this state
169 window
.scrollEditBox = function() {
170 var editBox
= document
.getElementById( 'wpTextbox1' );
171 var scrollTop
= document
.getElementById( 'wpScrolltop' );
172 var editForm
= document
.getElementById( 'editform' );
173 if( editForm
&& editBox
&& scrollTop
) {
174 if( scrollTop
.value
) {
175 editBox
.scrollTop
= scrollTop
.value
;
177 addHandler( editForm
, 'submit', function() {
178 scrollTop
.value
= editBox
.scrollTop
;
182 hookEvent( 'load', scrollEditBox
);
183 hookEvent( 'load', mwSetupToolbar
);
184 hookEvent( 'load', function() {
185 currentFocused
= document
.getElementById( 'wpTextbox1' );
186 // http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
187 // focus does not bubble normally, but using a trick we can do event delegation
188 // on the focus event on all text inputs to make the toolbox usable on all of them
189 var editForm
= document
.getElementById( 'editform' );
193 function onfocus( e
) {
194 var elm
= e
.target
|| e
.srcElement
;
198 var tagName
= elm
.tagName
.toLowerCase();
199 var type
= elm
.type
|| '';
200 if ( tagName
!== 'textarea' && tagName
!== 'input' ) {
203 if ( tagName
=== 'input' && type
.toLowerCase() !== 'text' ) {
207 currentFocused
= elm
;
210 if ( editForm
.addEventListener
) {
211 // Gecko, WebKit, Opera, etc... (all standards compliant browsers)
212 editForm
.addEventListener( 'focus', onfocus
, true ); // This MUST be true to work
213 } else if ( editForm
.attachEvent
) {
214 // IE needs a specific trick here since it doesn't support the standard
215 editForm
.attachEvent( 'onfocusin', function() { onfocus( event
); } );
218 // HACK: make currentFocused work with the usability iframe
219 // With proper focus detection support (HTML 5!) this'll be much cleaner
220 if ( typeof $ != 'undefined' ) {
221 var iframe
= $( '.wikiEditor-ui-text iframe' );
222 if ( iframe
.length
> 0 ) {
223 $( iframe
.get( 0 ).contentWindow
.document
)
224 .add( iframe
.get( 0 ).contentWindow
.document
.body
) // for IE
225 .focus( function() { currentFocused
= iframe
.get( 0 ); } );