checked in skins, courtesy of djbclark
[libreplanet-static.git] / skins / common / prefs.js
1
2 // generate toc from prefs form, fold sections
3 // XXX: needs testing on IE/Mac and safari
4 // more comments to follow
5 function tabbedprefs() {
6 var prefform = document.getElementById('preferences');
7 if (!prefform || !document.createElement) {
8 return;
9 }
10 if (prefform.nodeName.toLowerCase() == 'a') {
11 return; // Occasional IE problem
12 }
13 prefform.className = prefform.className + 'jsprefs';
14 var sections = [];
15 var children = prefform.childNodes;
16 var seci = 0;
17 for (var i = 0; i < children.length; i++) {
18 if (children[i].nodeName.toLowerCase() == 'fieldset') {
19 children[i].id = 'prefsection-' + seci;
20 children[i].className = 'prefsection';
21 if (is_opera || is_khtml) {
22 children[i].className = 'prefsection operaprefsection';
23 }
24 var legends = children[i].getElementsByTagName('legend');
25 sections[seci] = {};
26 if (legends[0]) legends[0].className = 'mainLegend';
27 if (legends[0] && legends[0].firstChild.nodeValue) {
28 sections[seci].text = legends[0].firstChild.nodeValue;
29 } else {
30 sections[seci].text = '# ' + seci;
31 }
32 sections[seci].secid = children[i].id;
33 seci++;
34 if (sections.length != 1) {
35 children[i].style.display = 'none';
36 } else {
37 var selectedid = children[i].id;
38 }
39 }
40 }
41 var toc = document.createElement('ul');
42 toc.id = 'preftoc';
43 toc.selectedid = selectedid;
44 for (i = 0; i < sections.length; i++) {
45 var li = document.createElement('li');
46 if (i === 0) {
47 li.className = 'selected';
48 }
49 var a = document.createElement('a');
50 a.href = '#' + sections[i].secid;
51 a.onmousedown = a.onclick = uncoversection;
52 a.appendChild(document.createTextNode(sections[i].text));
53 a.secid = sections[i].secid;
54 li.appendChild(a);
55 toc.appendChild(li);
56 }
57 prefform.parentNode.insertBefore(toc, prefform.parentNode.childNodes[0]);
58 document.getElementById('prefsubmit').id = 'prefcontrol';
59 }
60
61 function uncoversection() {
62 var oldsecid = this.parentNode.parentNode.selectedid;
63 var newsec = document.getElementById(this.secid);
64 if (oldsecid != this.secid) {
65 var ul = document.getElementById('preftoc');
66 document.getElementById(oldsecid).style.display = 'none';
67 newsec.style.display = 'block';
68 ul.selectedid = this.secid;
69 var lis = ul.getElementsByTagName('li');
70 for (var i = 0; i< lis.length; i++) {
71 lis[i].className = '';
72 }
73 this.parentNode.className = 'selected';
74 }
75 return false;
76 }
77
78 // Timezone stuff
79 // tz in format [+-]HHMM
80 function checkTimezone(tz, msg) {
81 var localclock = new Date();
82 // returns negative offset from GMT in minutes
83 var tzRaw = localclock.getTimezoneOffset();
84 var tzHour = Math.floor( Math.abs(tzRaw) / 60);
85 var tzMin = Math.abs(tzRaw) % 60;
86 var tzString = ((tzRaw >= 0) ? "-" : "+") + ((tzHour < 10) ? "0" : "") + tzHour + ((tzMin < 10) ? "0" : "") + tzMin;
87 if (tz != tzString) {
88 var junk = msg.split('$1');
89 document.write(junk[0] + "UTC" + tzString + junk[1]);
90 }
91 }
92
93 function unhidetzbutton() {
94 var tzb = document.getElementById('guesstimezonebutton');
95 if (tzb) {
96 tzb.style.display = 'inline';
97 }
98 updateTimezoneSelection(false);
99 }
100
101 // in [-]HH:MM format...
102 // won't yet work with non-even tzs
103 function fetchTimezone() {
104 // FIXME: work around Safari bug
105 var localclock = new Date();
106 // returns negative offset from GMT in minutes
107 var tzRaw = localclock.getTimezoneOffset();
108 var tzHour = Math.floor( Math.abs(tzRaw) / 60);
109 var tzMin = Math.abs(tzRaw) % 60;
110 var tzString = ((tzRaw >= 0) ? "-" : "") + ((tzHour < 10) ? "0" : "") + tzHour +
111 ":" + ((tzMin < 10) ? "0" : "") + tzMin;
112 return tzString;
113 }
114
115 function guessTimezone(box) {
116 document.getElementsByName("wpHourDiff")[0].value = fetchTimezone();
117 updateTimezoneSelection(true);
118 }
119
120 function updateTimezoneSelection(force_offset) {
121 var wpTimeZone = document.getElementsByName("wpTimeZone")[0];
122 var wpHourDiff = document.getElementsByName("wpHourDiff")[0];
123 var wpLocalTime = document.getElementById("wpLocalTime");
124 var wpServerTime = document.getElementsByName("wpServerTime")[0];
125 var minDiff = 0;
126
127 if (force_offset) wpTimeZone.selectedIndex = 1;
128 if (wpTimeZone.selectedIndex == 1) {
129 wpHourDiff.disabled = false;
130 var diffArr = wpHourDiff.value.split(':');
131 if (diffArr.length == 1) {
132 minDiff = parseInt(diffArr[0], 10) * 60;
133 } else {
134 minDiff = Math.abs(parseInt(diffArr[0], 10))*60 + parseInt(diffArr[1], 10);
135 if (parseInt(diffArr[0], 10) < 0) minDiff = -minDiff;
136 }
137 } else {
138 wpHourDiff.disabled = true;
139 var diffArr = wpTimeZone.options[wpTimeZone.selectedIndex].value.split('|');
140 minDiff = parseInt(diffArr[1], 10);
141 }
142 if (isNaN(minDiff)) minDiff = 0;
143 var localTime = parseInt(wpServerTime.value, 10) + minDiff;
144 while (localTime < 0) localTime += 1440;
145 while (localTime >= 1440) localTime -= 1440;
146
147 var hour = String(Math.floor(localTime/60));
148 if (hour.length<2) hour = '0'+hour;
149 var min = String(localTime%60);
150 if (min.length<2) min = '0'+min;
151 changeText(wpLocalTime, hour+':'+min);
152
153 if (wpTimeZone.selectedIndex != 1) {
154 hour = String(Math.abs(Math.floor(minDiff/60)));
155 if (hour.length<2) hour = '0'+hour;
156 if (minDiff < 0) hour = '-'+hour;
157 min = String(minDiff%60);
158 if (min.length<2) min = '0'+min;
159 wpHourDiff.value = hour+':'+min;
160 }
161 }
162
163 hookEvent("load", unhidetzbutton);
164 hookEvent("load", tabbedprefs);