insertTags() now ignores any final space character in the selection (normally caused...
[lhc/web/wiklou.git] / stylesheets / wikibits.js
1 // Wikipedia JavaScript support functions
2
3 // for enhanced RecentChanges
4 function toggleVisibility( _levelId, _otherId, _linkId) {
5 var thisLevel = document.getElementById( _levelId );
6 var otherLevel = document.getElementById( _otherId );
7 var linkLevel = document.getElementById( _linkId );
8 if ( thisLevel.style.display == 'none' ) {
9 thisLevel.style.display = 'block';
10 otherLevel.style.display = 'none';
11 linkLevel.style.display = 'inline';
12 } else {
13 thisLevel.style.display = 'none';
14 otherLevel.style.display = 'inline';
15 linkLevel.style.display = 'none';
16 }
17 }
18
19 // Timezone stuff
20 // tz in format [+-]HHMM
21 function checkTimezone( tz, msg ) {
22 var localclock = new Date();
23 // returns negative offset from GMT in minutes
24 var tzRaw = localclock.getTimezoneOffset();
25 var tzHour = Math.floor( Math.abs(tzRaw) / 60);
26 var tzMin = Math.abs(tzRaw) % 60;
27 var tzString = ((tzRaw >= 0) ? "-" : "+") + ((tzHour < 10) ? "0" : "") + tzHour + ((tzMin < 10) ? "0" : "") + tzMin;
28 if( tz != tzString ) {
29 var junk = msg.split( '$1' );
30 document.write( junk[0] + "UTC" + tzString + junk[1] );
31 }
32 }
33
34 // in [-]HH:MM format...
35 // won't yet work with non-even tzs
36 function fetchTimezone() {
37 // FIXME: work around Safari bug
38 var localclock = new Date();
39 // returns negative offset from GMT in minutes
40 var tzRaw = localclock.getTimezoneOffset();
41 var tzHour = Math.floor( Math.abs(tzRaw) / 60);
42 var tzMin = Math.abs(tzRaw) % 60;
43 var tzString = ((tzRaw >= 0) ? "-" : "") + ((tzHour < 10) ? "0" : "") + tzHour +
44 ":" + ((tzMin < 10) ? "0" : "") + tzMin;
45 return tzString;
46 }
47
48 function guessTimezone(box) {
49 document.preferences.wpHourDiff.value = fetchTimezone();
50 }
51
52 function showTocToggle(show,hide) {
53 if(document.getElementById) {
54 document.writeln('<small>[<a href="javascript:toggleToc()" class="internal">' +
55 '<span id="showlink" style="display:none;">' + show + '</span>' +
56 '<span id="hidelink">' + hide + '</span>'
57 + '</a>]</small>');
58 }
59 }
60
61 function toggleToc() {
62 var toc = document.getElementById('tocinside');
63 var showlink=document.getElementById('showlink');
64 var hidelink=document.getElementById('hidelink');
65 if(toc.style.display == 'none') {
66 toc.style.display = tocWas;
67 hidelink.style.display='';
68 showlink.style.display='none';
69
70 } else {
71 tocWas = toc.style.display;
72 toc.style.display = 'none';
73 hidelink.style.display='none';
74 showlink.style.display='';
75
76 }
77 }
78
79 // this function generates the actual toolbar buttons with localized text
80 // we use it to avoid creating the toolbar where javascript is not enabled
81 function addButton(imageFile, speedTip, tagOpen, tagClose, sampleText) {
82
83
84 speedTip=escapeQuotes(speedTip);
85 tagOpen=escapeQuotes(tagOpen);
86 tagClose=escapeQuotes(tagClose);
87 sampleText=escapeQuotes(sampleText);
88 document.write("<a href=\"#\" onclick=\"javascript:insertTags");
89 document.write("('"+tagOpen+"','"+tagClose+"','"+sampleText+"');\">");
90 document.write("<img width=\"23\" height=\"22\" src=\""+imageFile+"\" border=\"0\" ALT=\""+speedTip+"\" TITLE=\""+speedTip+"\">");
91 document.write("</a>");
92 return;
93 }
94
95 function addInfobox(infoText) {
96
97 // if no support for changing selection, add a small copy & paste field
98 var clientPC = navigator.userAgent.toLowerCase(); // Get client info
99 var is_nav = ((clientPC.indexOf('mozilla')!=-1) && (clientPC.indexOf('spoofer')==-1)
100 && (clientPC.indexOf('compatible') == -1) && (clientPC.indexOf('opera')==-1)
101 && (clientPC.indexOf('webtv')==-1) && (clientPC.indexOf('hotjava')==-1)
102 && (clientPC.indexOf('khtml')==-1));
103 if(!document.selection && !is_nav) {
104 document.write("<form name='infoform' id='infoform'>"+
105 "<input size=80 id='infobox' name='infobox' value='"+
106 infoText+"' READONLY></form>");
107 }
108
109 }
110
111 function escapeQuotes(text) {
112
113 text=text.replace(/'/g,"\\'");
114 text=text.replace(/\n/g,"\\n");
115 return text;
116 }
117
118 // apply tagOpen/tagClose to selection in textarea,
119 // use sampleText instead of selection if there is none
120 // copied and adapted from phpBB
121 function insertTags(tagOpen, tagClose, sampleText) {
122
123 var txtarea = document.editform.wpTextbox1;
124 // IE
125 if(document.selection) {
126 var theSelection = document.selection.createRange().text;
127 if(!theSelection) { theSelection=sampleText;}
128 txtarea.focus();
129 if(theSelection.charAt(theSelection.length - 1) == " "){// exclude ending space char, if any
130 theSelection = theSelection.substring(0, theSelection.length - 1);
131 document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
132 } else {
133 document.selection.createRange().text = tagOpen + theSelection + tagClose;
134 }
135 // Mozilla
136 } else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
137 var startPos = txtarea.selectionStart;
138 var endPos = txtarea.selectionEnd;
139 var myText = (txtarea.value).substring(startPos, endPos);
140 if(!myText) { myText=sampleText;}
141 if(myText.charAt(myText.length - 1) == " "){ // exclude ending space char, if any
142 subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
143 } else {
144 subst = tagOpen + myText + tagClose;
145 }
146 txtarea.value = txtarea.value.substring(0, startPos) + subst + txtarea.value.substring(endPos, txtarea.value.length);
147 txtarea.focus();
148 var cPos=startPos+(tagOpen.length+myText.length+tagClose.length);
149 txtarea.selectionStart=cPos;
150 txtarea.selectionEnd=cPos;
151 // All others
152 } else {
153 // Append at the end: Some people find that annoying
154 //txtarea.value += tagOpen + sampleText + tagClose;
155 //txtarea.focus();
156 tagOpen=tagOpen.replace(/\n/g,"");
157 tagClose=tagClose.replace(/\n/g,"");
158 document.infoform.infobox.value=tagOpen+sampleText+tagClose;
159 txtarea.focus();
160 }
161 // reposition cursor if possible
162 if (txtarea.createTextRange) txtarea.caretPos = document.selection.createRange().duplicate();
163 }