MediaWiki:Linjekart.js
Fra Villmark
(Forskjeller mellom versjoner)
Admin (Diskusjon | bidrag)
(Ny side: /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mi…)
(Ny side: /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mi…)
Nåværende revisjon fra 22. jul 2009 kl. 23:40
/* Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
*/
var hasClass = (function () {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
var aNode = new Array();
var aOffset = new Array();
var aGallery = new Array();
var mainTable;
var rightGallery;
var bottomGallery;
function positionTop(object)
{
var pos = 0;
for (var par = object; par.offsetParent; par = par.offsetParent)
pos += par.offsetTop;
return pos;
}
function positionLeft(object)
{
var pos = 0;
for (var par = object; par.offsetParent; par = par.offsetParent)
pos += par.offsetLeft;
return pos;
}
function reorgGalleries()
{
var bottomOffset = positionTop(mainTable) + mainTable.offsetHeight;
var reduce = 0;
var expand = 0;
for ( var i = 0, TC; i < aNode.length; i++) {
if ( aOffset[i] > bottomOffset) {
if ( aNode[i].parentNode == rightGallery)
expand++;
} else
if ( aNode[i].parentNode.parentNode.parentNode == bottomGallery) {
rightGallery.insertBefore( aNode[i], mainTable );
reduce++;
}
}
if (reduce > 0)
for (var i = 0; i < aGallery.length - reduce; i++)
aGallery[i].appendChild( aGallery[i + reduce].firstChild);
if (expand > 0)
for (var i = aGallery.length; i > 0; i--)
aGallery[i - 1].appendChild( i > expand ? aGallery[i - expand - 1].firstChild
: aNode[aNode.length - aGallery.length + i - 1]);
}
function createGalleries()
{
var Divs = document.getElementsByTagName( "div" );
mainTable = 0;
for ( var i = 0; i < Divs.length; i++ ) {
if ( hasClass( Divs[i], "flytegalleri" ) ) {
Divs[i].normalize();
rightGallery = Divs[i];
for ( var chi = Divs[i].firstChild, rightOffset = 0; chi.nextSibling; chi = chi.nextSibling ) {
if ( hasClass( chi, "thumb" ) ) {
aNode[aNode.length] = chi;
aOffset[aOffset.length] = chi.offsetTop + chi.offsetHeight;
if (! rightOffset)
rightOffset = positionLeft(chi) + chi.offsetWidth;
}
if ( ! mainTable && chi.tagName == "TABLE" )
mainTable = chi;
if ( hasClass( chi, "flytegalleri" ) && aNode.length > 0 ) {
var bottomOffset = positionTop(chi);
var galleryRow = 0;
var TR = chi.insertRow(galleryRow++);
bottomGallery = chi.firstChild;
for ( var j = 0, k = 0, g = 0, test=0, TC; j < aNode.length; j++ ) {
if ( aOffset[j] > bottomOffset) {
TC = TR.insertCell(k++);
TC.appendChild( aNode[j] );
aGallery[g++] = TC;
if (test + TC.offsetWidth > rightOffset) {
TR = chi.insertRow(galleryRow++);
k = 0;
test = 0;
} else
test = positionLeft(TC) + TC.offsetWidth;
}
}
break;
}
}
}
}
}
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[Wikipedia:NavFrame]].
*/
/* Show/hide table sections *********************************
*
* Description: Shows or hides predefined sections of collapsible tables.
* Maintainers: [[User:BjørnN]]
*/
function leftCollapseTable(tableIndex, rowIndex)
{
var Tables = document.getElementsByTagName( "table" );
var TableRows = Tables[tableIndex].rows;
var TD = Tables[tableIndex+1].rows[0].getElementsByTagName( "td" );
var collapse = false;
var change = false;
var started = false;
var collapsedView = false;
var detailView = false;
for ( var j = 0; j < TableRows.length; j++ ) {
var TR = TableRows[j];
switch (rowIndex) {
case 0:
switch (TR.className) {
case "startCollapse":
TR.style.display = "none";
break;
case "endCollapse":
break;
default:
TR.style.display = "";
}
detailView = true;
break;
case -1:
switch (TR.className) {
case "startCollapse":
TR.style.display = "";
collapse = true;
break;
case "endCollapse":
collapse = false;
break;
default:
if (collapse) {
TR.style.display = "none";
}
}
collapsedView = true;
break;
default:
if (j == rowIndex) {
change = true;
}
if (TR.className == "endCollapse") {
change = false;
}
if (change) {
if (TR.style.display == "none") {
TR.style.display = "";
} else {
TR.style.display = "none";
}
}
if (TR.className == "startCollapse") {
if (! started) {
if (TR.style.display == "none") {
detailView |= true
} else {
collapsedView |= true
}
started = true;
}
} else {
started = false;
}
}
}
if (collapsedView) {
TD[0].getElementsByTagName( "span" )[0].style.display = "";
} else {
TD[0].getElementsByTagName( "span" )[0].style.display = "none";
}
if (detailView) {
TD[1].getElementsByTagName( "span" )[0].style.display = "";
} else {
TD[1].getElementsByTagName( "span" )[0].style.display = "none";
}
reorgGalleries();
}
/* Create a button *********************************
*
* Description: Creates folder style navigation buttons for collapsible tables.
* Based on function createCollapseButton, maintained by [[:en:User:R. Koot]]
* Maintainers: [[User:BjørnN]]
*/
function createLeftCollapseButton(tableIndex, rowIndex, caption, buttonTitle)
{
var Button = document.createElement( "span" );
var ButtonLink = document.createElement( "a" );
var ButtonText = document.createTextNode( caption );
Button.style.fontWeight = "normal";
Button.style.width = "6em";
ButtonLink.setAttribute( "title", buttonTitle );
ButtonLink.setAttribute( "href", "javascript:leftCollapseTable(" + tableIndex + ", " + rowIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( "[" ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( "]" ) );
return Button;
}
/* Create show/hide buttons for table sections *********************************
*
* Description: Creates folder style navigation buttons for collapsible tables.
* Maintainers: [[User:BjørnN]]
*/
function createLeftCollapseButtons()
{
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "withAlternateSections" ) ) {
var started = false;
var displayRow = true;
var sectionStart = 0;
var TableRows = Tables[i].rows;
var TR = Tables[i+1].rows[0];
var detailCaption = "Vis alt";
var overviewCaption = "Vis oversikt";
var showCaption = "+";
var hideCaption = "–";
var showTitle = "Vis mer";
var hideTitle = "Vis mindre";
var aTD = TR.getElementsByTagName( "td" ); // fetch parameter cache
try { detailCaption = aTD[1].firstChild.data; } catch (e) { ; }
try { overviewCaption = aTD[2].firstChild.data; } catch (e) { ; }
try { showCaption = aTD[3].firstChild.data; } catch (e) { ; }
try { hideCaption = aTD[4].firstChild.data; } catch (e) { ; }
try { showTitle = aTD[5].firstChild.data; } catch (e) { ; }
try { hideTitle = aTD[6].firstChild.data; } catch (e) { ; }
var TD = TR.insertCell(0); // execute after all the aTD statemens - it changes the index reference
var Button = createLeftCollapseButton(i, 0, detailCaption, detailCaption);
TD.appendChild(Button);
TD = TR.insertCell(1);
Button = createLeftCollapseButton(i, -1, overviewCaption, overviewCaption);
Button.style.display = "none";
TD.appendChild(Button);
for ( var j = 0; j < TableRows.length; j++ ) {
var TR = TableRows[j];
var TD = TR.insertCell(0);
switch (TR.className) {
case "startCollapse":
if (! started) {
sectionStart = j;
Button = createLeftCollapseButton(i, sectionStart, showCaption, showTitle);
TD.appendChild(Button);
started = true;
displayRow = false;
}
TR.style.display = "";
break;
case "endCollapse":
displayRow = true;
break;
default:
if (started) {
Button = createLeftCollapseButton(i, sectionStart, hideCaption, hideTitle);
TD.appendChild(Button);
started = false;
TR.style.display = "none";
} else {
if (! displayRow)
TR.style.display = "none";
}
}
}
}
}
createGalleries();
}
addOnloadHook( createLeftCollapseButtons );

