]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blobdiff - skins/common/prefs.js
MediaWiki 1.14.0
[autoinstalls/mediawiki.git] / skins / common / prefs.js
diff --git a/skins/common/prefs.js b/skins/common/prefs.js
new file mode 100644 (file)
index 0000000..c2554c0
--- /dev/null
@@ -0,0 +1,164 @@
+
+// generate toc from prefs form, fold sections
+// XXX: needs testing on IE/Mac and safari
+// more comments to follow
+function tabbedprefs() {
+       var prefform = document.getElementById('preferences');
+       if (!prefform || !document.createElement) {
+               return;
+       }
+       if (prefform.nodeName.toLowerCase() == 'a') {
+               return; // Occasional IE problem
+       }
+       prefform.className = prefform.className + 'jsprefs';
+       var sections = [];
+       var children = prefform.childNodes;
+       var seci = 0;
+       for (var i = 0; i < children.length; i++) {
+               if (children[i].nodeName.toLowerCase() == 'fieldset') {
+                       children[i].id = 'prefsection-' + seci;
+                       children[i].className = 'prefsection';
+                       if (is_opera || is_khtml) {
+                               children[i].className = 'prefsection operaprefsection';
+                       }
+                       var legends = children[i].getElementsByTagName('legend');
+                       sections[seci] = {};
+                       if (legends[0]) legends[0].className = 'mainLegend';
+                       if (legends[0] && legends[0].firstChild.nodeValue) {
+                               sections[seci].text = legends[0].firstChild.nodeValue;
+                       } else {
+                               sections[seci].text = '# ' + seci;
+                       }
+                       sections[seci].secid = children[i].id;
+                       seci++;
+                       if (sections.length != 1) {
+                               children[i].style.display = 'none';
+                       } else {
+                               var selectedid = children[i].id;
+                       }
+               }
+       }
+       var toc = document.createElement('ul');
+       toc.id = 'preftoc';
+       toc.selectedid = selectedid;
+       for (i = 0; i < sections.length; i++) {
+               var li = document.createElement('li');
+               if (i === 0) {
+                       li.className = 'selected';
+               }
+               var a = document.createElement('a');
+               a.href = '#' + sections[i].secid;
+               a.onmousedown = a.onclick = uncoversection;
+               a.appendChild(document.createTextNode(sections[i].text));
+               a.secid = sections[i].secid;
+               li.appendChild(a);
+               toc.appendChild(li);
+       }
+       prefform.parentNode.insertBefore(toc, prefform.parentNode.childNodes[0]);
+       document.getElementById('prefsubmit').id = 'prefcontrol';
+}
+
+function uncoversection() {
+       var oldsecid = this.parentNode.parentNode.selectedid;
+       var newsec = document.getElementById(this.secid);
+       if (oldsecid != this.secid) {
+               var ul = document.getElementById('preftoc');
+               document.getElementById(oldsecid).style.display = 'none';
+               newsec.style.display = 'block';
+               ul.selectedid = this.secid;
+               var lis = ul.getElementsByTagName('li');
+               for (var i = 0; i< lis.length; i++) {
+                       lis[i].className = '';
+               }
+               this.parentNode.className = 'selected';
+       }
+       return false;
+}
+
+// Timezone stuff
+// tz in format [+-]HHMM
+function checkTimezone(tz, msg) {
+       var localclock = new Date();
+       // returns negative offset from GMT in minutes
+       var tzRaw = localclock.getTimezoneOffset();
+       var tzHour = Math.floor( Math.abs(tzRaw) / 60);
+       var tzMin = Math.abs(tzRaw) % 60;
+       var tzString = ((tzRaw >= 0) ? "-" : "+") + ((tzHour < 10) ? "0" : "") + tzHour + ((tzMin < 10) ? "0" : "") + tzMin;
+       if (tz != tzString) {
+               var junk = msg.split('$1');
+               document.write(junk[0] + "UTC" + tzString + junk[1]);
+       }
+}
+
+function unhidetzbutton() {
+       var tzb = document.getElementById('guesstimezonebutton');
+       if (tzb) {
+               tzb.style.display = 'inline';
+       }
+       updateTimezoneSelection(false);
+}
+
+// in [-]HH:MM format...
+// won't yet work with non-even tzs
+function fetchTimezone() {
+       // FIXME: work around Safari bug
+       var localclock = new Date();
+       // returns negative offset from GMT in minutes
+       var tzRaw = localclock.getTimezoneOffset();
+       var tzHour = Math.floor( Math.abs(tzRaw) / 60);
+       var tzMin = Math.abs(tzRaw) % 60;
+       var tzString = ((tzRaw >= 0) ? "-" : "") + ((tzHour < 10) ? "0" : "") + tzHour +
+               ":" + ((tzMin < 10) ? "0" : "") + tzMin;
+       return tzString;
+}
+
+function guessTimezone(box) {
+       document.getElementsByName("wpHourDiff")[0].value = fetchTimezone();
+       updateTimezoneSelection(true);
+}
+
+function updateTimezoneSelection(force_offset) {
+       var wpTimeZone = document.getElementsByName("wpTimeZone")[0];
+       var wpHourDiff = document.getElementsByName("wpHourDiff")[0];
+       var wpLocalTime = document.getElementById("wpLocalTime");
+       var wpServerTime = document.getElementsByName("wpServerTime")[0];
+       var minDiff = 0;
+
+       if (force_offset) wpTimeZone.selectedIndex = 1;
+       if (wpTimeZone.selectedIndex == 1) {
+               wpHourDiff.disabled = false;
+               var diffArr = wpHourDiff.value.split(':');
+               if (diffArr.length == 1) {
+                       minDiff = parseInt(diffArr[0], 10) * 60;
+               } else {
+                       minDiff = Math.abs(parseInt(diffArr[0], 10))*60 + parseInt(diffArr[1], 10);
+                       if (parseInt(diffArr[0], 10) < 0) minDiff = -minDiff;
+               }
+       } else {
+               wpHourDiff.disabled = true;
+               var diffArr = wpTimeZone.options[wpTimeZone.selectedIndex].value.split('|');
+               minDiff = parseInt(diffArr[1], 10);
+       }
+       if (isNaN(minDiff)) minDiff = 0;
+       var localTime = parseInt(wpServerTime.value, 10) + minDiff;
+       while (localTime < 0) localTime += 1440;
+       while (localTime >= 1440) localTime -= 1440;
+
+       var hour = String(Math.floor(localTime/60));
+       if (hour.length<2) hour = '0'+hour;
+       var min = String(localTime%60);
+       if (min.length<2) min = '0'+min;
+       changeText(wpLocalTime, hour+':'+min);
+
+       if (wpTimeZone.selectedIndex != 1) {
+               hour = String(Math.abs(Math.floor(minDiff/60)));
+               if (hour.length<2) hour = '0'+hour;
+               if (minDiff < 0) hour = '-'+hour;
+               min = String(minDiff%60);
+               if (min.length<2) min = '0'+min;
+               wpHourDiff.value = hour+':'+min;
+       }
+}
+
+hookEvent("load", unhidetzbutton);
+hookEvent("load", tabbedprefs);