More updates for Hebrew
[mediawiki.git] / skins / common / wikibits.js
blob63ea5935355f05d0f696813367760821bacc88c0
1 // Wikipedia JavaScript support functions
3 var clientPC = navigator.userAgent.toLowerCase(); // Get client info
4 var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1)
5                 && (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
6 var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1));
7 var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
8 if (clientPC.indexOf('opera') != -1) {
9         var is_opera = true;
10         var is_opera_preseven = (window.opera && !document.childNodes);
11         var is_opera_seven = (window.opera && document.childNodes);
14 // add any onload functions in this hook (please don't hard-code any events in the xhtml source)
16 var doneOnloadHook;
18 if (!window.onloadFuncts)
19         var onloadFuncts = [];
21 function addOnloadHook(hookFunct) {
22         // Allows add-on scripts to add onload functions
23         onloadFuncts[onloadFuncts.length] = hookFunct;
26 function runOnloadHook() {
27         // don't run anything below this for non-dom browsers
28         if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName))
29                 return;
31         histrowinit();
32         unhidetzbutton();
33         tabbedprefs();
34         akeytt();
35         scrollEditBox();
36         setupCheckboxShiftClick();
38         // Run any added-on functions
39         for (var i = 0; i < onloadFuncts.length; i++)
40                 onloadFuncts[i]();
42         doneOnloadHook = true;
45 function hookEvent(hookName, hookFunct) {
46         if (window.addEventListener)
47                 addEventListener(hookName, hookFunct, false);
48         else if (window.attachEvent)
49                 attachEvent("on" + hookName, hookFunct);
52 hookEvent("load", runOnloadHook);
54 // document.write special stylesheet links
55 if (typeof stylepath != 'undefined' && typeof skin != 'undefined') {
56         if (is_opera_preseven) {
57                 document.write('<link rel="stylesheet" type="text/css" href="'+stylepath+'/'+skin+'/Opera6Fixes.css">');
58         } else if (is_opera_seven) {
59                 document.write('<link rel="stylesheet" type="text/css" href="'+stylepath+'/'+skin+'/Opera7Fixes.css">');
60         } else if (is_khtml) {
61                 document.write('<link rel="stylesheet" type="text/css" href="'+stylepath+'/'+skin+'/KHTMLFixes.css">');
62         }
64 // Un-trap us from framesets
65 if (window.top != window)
66         window.top.location = window.location;
68 // for enhanced RecentChanges
69 function toggleVisibility(_levelId, _otherId, _linkId) {
70         var thisLevel = document.getElementById(_levelId);
71         var otherLevel = document.getElementById(_otherId);
72         var linkLevel = document.getElementById(_linkId);
73         if (thisLevel.style.display == 'none') {
74                 thisLevel.style.display = 'block';
75                 otherLevel.style.display = 'none';
76                 linkLevel.style.display = 'inline';
77         } else {
78                 thisLevel.style.display = 'none';
79                 otherLevel.style.display = 'inline';
80                 linkLevel.style.display = 'none';
81         }
84 // page history stuff
85 // attach event handlers to the input elements on history page
86 function histrowinit() {
87         var hf = document.getElementById('pagehistory');
88         if (!hf)
89                 return;
90         var lis = hf.getElementsByTagName('li');
91         for (i = 0; i < lis.length; i++) {
92                 var inputs = historyRadios(lis[i]);
93                 if (inputs[0] && inputs[1]) {
94                         inputs[0].onclick = diffcheck;
95                         inputs[1].onclick = diffcheck;
96                 }
97         }
98         diffcheck();
101 function historyRadios(parent) {
102         var inputs = parent.getElementsByTagName('input');
103         var radios = [];
104         for (var i = 0; i < inputs.length; i++) {
105                 if (inputs[i].name == "diff" || inputs[i].name == "oldid")
106                         radios[radios.length] = inputs[i];
107         }
108         return radios;
111 // check selection and tweak visibility/class onclick
112 function diffcheck() {
113         var dli = false; // the li where the diff radio is checked
114         var oli = false; // the li where the oldid radio is checked
115         var hf = document.getElementById('pagehistory');
116         if (!hf)
117                 return;
118         var lis = hf.getElementsByTagName('li');
119         for (i=0;i<lis.length;i++) {
120                 var inputs = historyRadios(lis[i]);
121                 if (inputs[1] && inputs[0]) {
122                         if (inputs[1].checked || inputs[0].checked) { // this row has a checked radio button
123                                 if (inputs[1].checked && inputs[0].checked && inputs[0].value == inputs[1].value)
124                                         return false;
125                                 if (oli) { // it's the second checked radio
126                                         if (inputs[1].checked) {
127                                                 oli.className = "selected";
128                                                 return false
129                                         }
130                                 } else if (inputs[0].checked) {
131                                         return false;
132                                 }
133                                 if (inputs[0].checked)
134                                         dli = lis[i];
135                                 if (!oli)
136                                         inputs[0].style.visibility = 'hidden';
137                                 if (dli)
138                                         inputs[1].style.visibility = 'hidden';
139                                 lis[i].className = "selected";
140                                 oli = lis[i];
141                         }  else { // no radio is checked in this row
142                                 if (!oli)
143                                         inputs[0].style.visibility = 'hidden';
144                                 else
145                                         inputs[0].style.visibility = 'visible';
146                                 if (dli)
147                                         inputs[1].style.visibility = 'hidden';
148                                 else
149                                         inputs[1].style.visibility = 'visible';
150                                 lis[i].className = "";
151                         }
152                 }
153         }
156 // generate toc from prefs form, fold sections
157 // XXX: needs testing on IE/Mac and safari
158 // more comments to follow
159 function tabbedprefs() {
160         var prefform = document.getElementById('preferences');
161         if (!prefform || !document.createElement)
162                 return;
163         if (prefform.nodeName.toLowerCase() == 'a')
164                 return; // Occasional IE problem
165         prefform.className = prefform.className + 'jsprefs';
166         var sections = new Array();
167         children = prefform.childNodes;
168         var seci = 0;
169         for (i = 0; i < children.length; i++) {
170                 if (children[i].nodeName.toLowerCase() == 'fieldset') {
171                         children[i].id = 'prefsection-' + seci;
172                         children[i].className = 'prefsection';
173                         if (is_opera || is_khtml)
174                                 children[i].className = 'prefsection operaprefsection';
175                         legends = children[i].getElementsByTagName('legend');
176                         sections[seci] = new Object();
177                         legends[0].className = 'mainLegend';
178                         if (legends[0] && legends[0].firstChild.nodeValue)
179                                 sections[seci].text = legends[0].firstChild.nodeValue;
180                         else
181                                 sections[seci].text = '# ' + seci;
182                         sections[seci].secid = children[i].id;
183                         seci++;
184                         if (sections.length != 1)
185                                 children[i].style.display = 'none';
186                         else
187                                 var selectedid = children[i].id;
188                 }
189         }
190         var toc = document.createElement('ul');
191         toc.id = 'preftoc';
192         toc.selectedid = selectedid;
193         for (i = 0; i < sections.length; i++) {
194                 var li = document.createElement('li');
195                 if (i == 0)
196                         li.className = 'selected';
197                 var a = document.createElement('a');
198                 a.href = '#' + sections[i].secid;
199                 a.onmousedown = a.onclick = uncoversection;
200                 a.appendChild(document.createTextNode(sections[i].text));
201                 a.secid = sections[i].secid;
202                 li.appendChild(a);
203                 toc.appendChild(li);
204         }
205         prefform.parentNode.insertBefore(toc, prefform.parentNode.childNodes[0]);
206         document.getElementById('prefsubmit').id = 'prefcontrol';
209 function uncoversection() {
210         oldsecid = this.parentNode.parentNode.selectedid;
211         newsec = document.getElementById(this.secid);
212         if (oldsecid != this.secid) {
213                 ul = document.getElementById('preftoc');
214                 document.getElementById(oldsecid).style.display = 'none';
215                 newsec.style.display = 'block';
216                 ul.selectedid = this.secid;
217                 lis = ul.getElementsByTagName('li');
218                 for (i = 0; i< lis.length; i++) {
219                         lis[i].className = '';
220                 }
221                 this.parentNode.className = 'selected';
222         }
223         return false;
226 // Timezone stuff
227 // tz in format [+-]HHMM
228 function checkTimezone(tz, msg) {
229         var localclock = new Date();
230         // returns negative offset from GMT in minutes
231         var tzRaw = localclock.getTimezoneOffset();
232         var tzHour = Math.floor( Math.abs(tzRaw) / 60);
233         var tzMin = Math.abs(tzRaw) % 60;
234         var tzString = ((tzRaw >= 0) ? "-" : "+") + ((tzHour < 10) ? "0" : "") + tzHour + ((tzMin < 10) ? "0" : "") + tzMin;
235         if (tz != tzString) {
236                 var junk = msg.split('$1');
237                 document.write(junk[0] + "UTC" + tzString + junk[1]);
238         }
241 function unhidetzbutton() {
242         tzb = document.getElementById('guesstimezonebutton')
243         if (tzb)
244                 tzb.style.display = 'inline';
247 // in [-]HH:MM format...
248 // won't yet work with non-even tzs
249 function fetchTimezone() {
250         // FIXME: work around Safari bug
251         var localclock = new Date();
252         // returns negative offset from GMT in minutes
253         var tzRaw = localclock.getTimezoneOffset();
254         var tzHour = Math.floor( Math.abs(tzRaw) / 60);
255         var tzMin = Math.abs(tzRaw) % 60;
256         var tzString = ((tzRaw >= 0) ? "-" : "") + ((tzHour < 10) ? "0" : "") + tzHour +
257                 ":" + ((tzMin < 10) ? "0" : "") + tzMin;
258         return tzString;
261 function guessTimezone(box) {
262         document.getElementsByName("wpHourDiff")[0].value = fetchTimezone();
265 function showTocToggle() {
266         if (document.createTextNode) {
267                 // Uses DOM calls to avoid document.write + XHTML issues
269                 var linkHolder = document.getElementById('toctitle')
270                 if (!linkHolder)
271                         return;
273                 var outerSpan = document.createElement('span');
274                 outerSpan.className = 'toctoggle';
276                 var toggleLink = document.createElement('a');
277                 toggleLink.id = 'togglelink';
278                 toggleLink.className = 'internal';
279                 toggleLink.href = 'javascript:toggleToc()';
280                 toggleLink.appendChild(document.createTextNode(tocHideText));
282                 outerSpan.appendChild(document.createTextNode('['));
283                 outerSpan.appendChild(toggleLink);
284                 outerSpan.appendChild(document.createTextNode(']'));
286                 linkHolder.appendChild(document.createTextNode(' '));
287                 linkHolder.appendChild(outerSpan);
289                 var cookiePos = document.cookie.indexOf("hidetoc=");
290                 if (cookiePos > -1 && document.cookie.charAt(cookiePos + 8) == 1)
291                         toggleToc();
292         }
295 function changeText(el, newText) {
296         // Safari work around
297         if (el.innerText)
298                 el.innerText = newText;
299         else if (el.firstChild && el.firstChild.nodeValue)
300                 el.firstChild.nodeValue = newText;
303 function toggleToc() {
304         var toc = document.getElementById('toc').getElementsByTagName('ul')[0];
305         var toggleLink = document.getElementById('togglelink')
307         if (toc && toggleLink && toc.style.display == 'none') {
308                 changeText(toggleLink, tocHideText);
309                 toc.style.display = 'block';
310                 document.cookie = "hidetoc=0";
311         } else {
312                 changeText(toggleLink, tocShowText);
313                 toc.style.display = 'none';
314                 document.cookie = "hidetoc=1";
315         }
318 // this function generates the actual toolbar buttons with localized text
319 // we use it to avoid creating the toolbar where javascript is not enabled
320 function addButton(imageFile, speedTip, tagOpen, tagClose, sampleText) {
321         // Don't generate buttons for browsers which don't fully
322         // support it.
323         if (!document.selection && !is_gecko) {
324                 return false;
325         }
326         imageFile = escapeQuotesHTML(imageFile);
327         speedTip = escapeQuotesHTML(speedTip);
328         tagOpen = escapeQuotes(tagOpen);
329         tagClose = escapeQuotes(tagClose);
330         sampleText = escapeQuotes(sampleText);
331         var mouseOver = "";
333         document.write("<a href=\"javascript:insertTags");
334         document.write("('"+tagOpen+"','"+tagClose+"','"+sampleText+"');\">");
335         document.write("<img width=\"23\" height=\"22\" src=\""+imageFile+"\" border=\"0\" alt=\""+speedTip+"\" title=\""+speedTip+"\""+mouseOver+">");
336         document.write("</a>");
337         return;
340 function escapeQuotes(text) {
341         var re = new RegExp("'","g");
342         text = text.replace(re,"\\'");
343         re = new RegExp("\\n","g");
344         text = text.replace(re,"\\n");
345         return escapeQuotesHTML(text);
348 function escapeQuotesHTML(text) {
349         var re = new RegExp('&',"g");
350         text = text.replace(re,"&amp;");
351         var re = new RegExp('"',"g");
352         text = text.replace(re,"&quot;");
353         var re = new RegExp('<',"g");
354         text = text.replace(re,"&lt;");
355         var re = new RegExp('>',"g");
356         text = text.replace(re,"&gt;");
357         return text;
360 // apply tagOpen/tagClose to selection in textarea,
361 // use sampleText instead of selection if there is none
362 // copied and adapted from phpBB
363 function insertTags(tagOpen, tagClose, sampleText) {
364         if (document.editform)
365                 var txtarea = document.editform.wpTextbox1;
366         else {
367                 // some alternate form? take the first one we can find
368                 var areas = document.getElementsByTagName('textarea');
369                 var txtarea = areas[0];
370         }
372         // IE
373         if (document.selection  && !is_gecko) {
374                 var theSelection = document.selection.createRange().text;
375                 if (!theSelection)
376                         theSelection=sampleText;
377                 txtarea.focus();
378                 if (theSelection.charAt(theSelection.length - 1) == " ") { // exclude ending space char, if any
379                         theSelection = theSelection.substring(0, theSelection.length - 1);
380                         document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
381                 } else {
382                         document.selection.createRange().text = tagOpen + theSelection + tagClose;
383                 }
385         // Mozilla
386         } else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
387                 var replaced = false;
388                 var startPos = txtarea.selectionStart;
389                 var endPos = txtarea.selectionEnd;
390                 if (endPos-startPos)
391                         replaced = true;
392                 var scrollTop = txtarea.scrollTop;
393                 var myText = (txtarea.value).substring(startPos, endPos);
394                 if (!myText)
395                         myText=sampleText;
396                 if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any
397                         subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
398                 } else {
399                         subst = tagOpen + myText + tagClose;
400                 }
401                 txtarea.value = txtarea.value.substring(0, startPos) + subst +
402                         txtarea.value.substring(endPos, txtarea.value.length);
403                 txtarea.focus();
404                 //set new selection
405                 if (replaced) {
406                         var cPos = startPos+(tagOpen.length+myText.length+tagClose.length);
407                         txtarea.selectionStart = cPos;
408                         txtarea.selectionEnd = cPos;
409                 } else {
410                         txtarea.selectionStart = startPos+tagOpen.length;
411                         txtarea.selectionEnd = startPos+tagOpen.length+myText.length;
412                 }
413                 txtarea.scrollTop = scrollTop;
415         // All other browsers get no toolbar.
416         // There was previously support for a crippled "help"
417         // bar, but that caused more problems than it solved.
418         }
419         // reposition cursor if possible
420         if (txtarea.createTextRange)
421                 txtarea.caretPos = document.selection.createRange().duplicate();
424 function akeytt() {
425         if (typeof ta == "undefined" || !ta)
426                 return;
427         var pref = 'alt-';
428         if (is_safari || navigator.userAgent.toLowerCase().indexOf('mac') + 1
429                 || navigator.userAgent.toLowerCase().indexOf('konqueror') + 1 )
430                 pref = 'control-';
431         if (is_opera)
432                 pref = 'shift-esc-';
434         for (var id in ta) {
435                 var n = document.getElementById(id);
436                 if (n) {
437                         var a = null;
438                         var ak = '';
439                         // Are we putting accesskey in it
440                         if (ta[id][0].length > 0) {
441                                 // Is this object a object? If not assume it's the next child.
443                                 if (n.nodeName.toLowerCase() == "a") {
444                                         a = n;
445                                 } else {
446                                         a = n.childNodes[0];
447                                 }
449                                 if (a) {
450                                         a.accessKey = ta[id][0];
451                                         ak = ' ['+pref+ta[id][0]+']';
452                                 }
453                         } else {
454                                 // We don't care what type the object is when assigning tooltip
455                                 a = n;
456                                 ak = '';
457                         }
459                         if (a) {
460                                 a.title = ta[id][1]+ak;
461                         }
462                 }
463         }
466 function setupRightClickEdit() {
467         if (document.getElementsByTagName) {
468                 var divs = document.getElementsByTagName('div');
469                 for (var i = 0; i < divs.length; i++) {
470                         var el = divs[i];
471                         if(el.className == 'editsection') {
472                                 addRightClickEditHandler(el);
473                         }
474                 }
475         }
478 function addRightClickEditHandler(el) {
479         for (var i = 0; i < el.childNodes.length; i++) {
480                 var link = el.childNodes[i];
481                 if (link.nodeType == 1 && link.nodeName.toLowerCase() == 'a') {
482                         var editHref = link.getAttribute('href');
484                         // find the following a
485                         var next = el.nextSibling;
486                         while (next.nodeType != 1)
487                                 next = next.nextSibling;
489                         // find the following header
490                         next = next.nextSibling;
491                         while (next.nodeType != 1)
492                                 next = next.nextSibling;
494                         if (next && next.nodeType == 1 &&
495                                 next.nodeName.match(/^[Hh][1-6]$/)) {
496                                 next.oncontextmenu = function() {
497                                         document.location = editHref;
498                                         return false;
499                                 }
500                         }
501                 }
502         }
505 function setupCheckboxShiftClick() {
506         if (document.getElementsByTagName) {
507                 var uls = document.getElementsByTagName('ul');
508                 var len = uls.length;
509                 for (var i = 0; i < len; ++i) {
510                         addCheckboxClickHandlers(uls[i]);
511                 }
512         }
515 function addCheckboxClickHandlers(ul, start, finish) {
516         if (ul.checkboxHandlersTimer) {
517                 clearInterval(ul.checkboxHandlersTimer);
518         }
519         if ( !ul.childNodes ) {
520                 return;
521         }
522         var len = ul.childNodes.length;
523         if (len < 2) {
524                 return;
525         }
526         start = start || 0;
527         finish = finish || start + 250;
528         if ( finish > len ) { finish = len; }
529         ul.checkboxes = ul.checkboxes || [];
530         ul.lastCheckbox = ul.lastCheckbox || null;
531         for (var i = start; i<finish; ++i) {
532                 var child = ul.childNodes[i];
533                 if ( child && child.childNodes && child.childNodes[0] ) {
534                         var cb = child.childNodes[0];
535                         if ( !cb.nodeName || cb.nodeName.toLowerCase() != 'input' ||
536                              !cb.type || cb.type.toLowerCase() != 'checkbox' ) {
537                                 return;
538                         }
539                         cb.index = ul.checkboxes.push(cb) - 1;
540                         cb.container = ul;
541                         cb.onmouseup = checkboxMouseupHandler;
542                 }
543         }
544         if (finish < len) {
545           var f=function(){ addCheckboxClickHandlers(ul, finish, finish+250); };
546           ul.checkboxHandlersTimer=setInterval(f, 200);
547         }
550 function checkboxMouseupHandler(e) {
551         if (typeof e == 'undefined') {
552                 e = window.event;
553         }
554         if ( !e.shiftKey || this.container.lastCheckbox === null ) {
555                 this.container.lastCheckbox = this.index;
556                 return true;
557         }
558         var endState = !this.checked;
559         if ( is_opera ) { // opera has already toggled the checkbox by this point
560                 endState = !endState;
561         }
562         var start, finish;
563         if ( this.index < this.container.lastCheckbox ) {
564                 start = this.index + 1;
565                 finish = this.container.lastCheckbox;
566         } else {
567                 start = this.container.lastCheckbox;
568                 finish = this.index - 1;
569         }
570         for (var i = start; i <= finish; ++i ) {
571                 this.container.checkboxes[i].checked = endState;
572         }
573         this.container.lastCheckbox = this.index;
574         return true;
577 function fillDestFilename() {
578         if (!document.getElementById)
579                 return;
580         var path = document.getElementById('wpUploadFile').value;
581         // Find trailing part
582         var slash = path.lastIndexOf('/');
583         var backslash = path.lastIndexOf('\\');
584         var fname;
585         if (slash == -1 && backslash == -1) {
586                 fname = path;
587         } else if (slash > backslash) {
588                 fname = path.substring(slash+1, 10000);
589         } else {
590                 fname = path.substring(backslash+1, 10000);
591         }
593         // Capitalise first letter and replace spaces by underscores
594         fname = fname.charAt(0).toUpperCase().concat(fname.substring(1,10000)).replace(/ /g, '_');
596         // Output result
597         var destFile = document.getElementById('wpDestFile');
598         if (destFile)
599                 destFile.value = fname;
603 function considerChangingExpiryFocus() {
604         if (!document.getElementById)
605                 return;
606         var drop = document.getElementById('wpBlockExpiry');
607         if (!drop)
608                 return;
609         var field = document.getElementById('wpBlockOther');
610         if (!field)
611                 return;
612         var opt = drop.value;
613         if (opt == 'other')
614                 field.style.display = '';
615         else
616                 field.style.display = 'none';
619 function scrollEditBox() {
620         var editBoxEl = document.getElementById("wpTextbox1");
621         var scrollTopEl = document.getElementById("wpScrolltop");
622         var editFormEl = document.getElementById("editform");
624         if (editBoxEl && scrollTopEl) {
625                 if (scrollTopEl.value) editBoxEl.scrollTop = scrollTopEl.value;
626                 editFormEl.onsubmit = function() {
627                         document.getElementById("wpScrolltop").value = document.getElementById("wpTextbox1").scrollTop;
628                 }
629         }
632 hookEvent("load", scrollEditBox);
634 function allmessagesfilter() {
635         text = document.getElementById('allmessagesinput').value;
636         k = document.getElementById('allmessagestable');
637         if (!k) { return;}
639         var items = k.getElementsByTagName('span');
641         if ( text.length > allmessages_prev.length ) {
642                 for (var i = items.length-1, j = 0; i >= 0; i--) {
643                         j = allmessagesforeach(items, i, j);
644                 }
645         } else {
646                 for (var i = 0, j = 0; i < items.length; i++) {
647                         j = allmessagesforeach(items, i, j);
648                 }
649         }
650         allmessages_prev = text;
653 function allmessagesforeach(items, i, j) {
654         var hItem = items[i].getAttribute('id');
655         if (hItem.substring(0,17) == 'sp-allmessages-i-') {
656                 if (items[i].firstChild && items[i].firstChild.nodeName == '#text' && items[i].firstChild.nodeValue.indexOf(text) != -1) {
657                         var itemA = document.getElementById( hItem.replace('i', 'r1') );
658                         var itemB = document.getElementById( hItem.replace('i', 'r2') );
659                         if ( itemA.style.display != '' ) {
660                                 var s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", '')";
661                                 var k = window.setTimeout(s,j++*5);
662                         }
663                 } else {
664                         var itemA = document.getElementById( hItem.replace('i', 'r1') );
665                         var itemB = document.getElementById( hItem.replace('i', 'r2') );
666                         if ( itemA.style.display != 'none' ) {
667                                 var s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", 'none')";
668                                 var k = window.setTimeout(s,j++*5);
669                         }
670                 }
671         }
672         return j;
676 function allmessageshider(idA, idB, cstyle) {
677         var itemA = document.getElementById( idA );
678         var itemB = document.getElementById( idB );
679         if (itemA) { itemA.style.display = cstyle; }
680         if (itemB) { itemB.style.display = cstyle; }
683 function allmessagesmodified() {
684         allmessages_modified = !allmessages_modified;
685         k = document.getElementById('allmessagestable');
686         if (!k) { return;}
687         var items = k.getElementsByTagName('tr');
688         for (var i = 0, j = 0; i< items.length; i++) {
689                 if (!allmessages_modified ) {
690                         if ( items[i].style.display != '' ) {
691                                 var s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, '')";
692                                 var k = window.setTimeout(s,j++*5);
693                         }
694                 } else if (items[i].getAttribute('class') == 'def' && allmessages_modified) {
695                         if ( items[i].style.display != 'none' ) {
696                                 var s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, 'none')";
697                                 var k = window.setTimeout(s,j++*5);
698                         }
699                 }
700         }
703 function allmessagesshow() {
704         k = document.getElementById('allmessagesfilter');
705         if (k) { k.style.display = ''; }
707         allmessages_prev = '';
708         allmessages_modified = false;
711 hookEvent("load", allmessagesshow);