MediaWiki:UIElements.js

/*

Read UI elements from the DOM. Used by MediaWiki:Gadget-ImageAnnotator.

Author: User:Lupo, March 2008

License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)

Choose whichever license of these you like best :-)

  • /

var UIElements = {

defaultLanguage : 'en',

getElementsByClassName : function (elem, tag, classes) {

// getElementsByClassName in wikibits.js has been changed in a contract-breaking way and

// newly won't work anymore with regexp strings or arrays of strings passed as classes.

// We need this functionality here, so we have our own copy of this function.

var arrElements = (tag == "*" && elem.all) ? elem.all : elem.getElementsByTagName (tag);

var arrReturnElements = new Array();

var arrRegExpClassNames = new Array();

if (typeof classes == "object") {

for (var i=0; i < classes.length; i++){

arrRegExpClassNames[arrRegExpClassNames.length] =

new RegExp("(^|\\s)" + classes[i].replace(/\-/g, "\\-") + "(\\s|$)");

}

} else {

arrRegExpClassNames[arrRegExpClassNames.length] =

new RegExp("(^|\\s)" + classes.replace(/\-/g, "\\-") + "(\\s|$)");

}

var this_elem;

var matches_all;

for (var j=0; j < arrElements.length; j++){

this_elem = arrElements[j];

matches_all = true;

for (var k=0; k < arrRegExpClassNames.length; k++){

if (!arrRegExpClassNames[k].test (this_elem.className)) {

matches_all = false;

break;

}

}

if (matches_all) {

arrReturnElements[arrReturnElements.length] = this_elem;

}

}

return (arrReturnElements)

},

load : function (container_name, items, tag, repository, default_language, doc)

{

doc = doc || document;

function add_item (item, lang)

{

var classes = item.className.split (' ');

var node = null;

if (item.ownerDocument != document && document.importNode)

node = document.importNode (item, true);

else

node = item.cloneNode (true);

UIElements.setEntry (classes[0], repository, node, lang, classes.slice (1));

}

if (!container_name || container_name.length == 0 || container_name == '*') return repository;

var base = UIElements.getElementsByClassName (doc, 'div', container_name);

if (!base || base.length == 0) return repository;

if (!items || items.length == 0)

items = ['wp\\S*'];

else if (items && typeof (items) == 'string')

items = [items];

if (!repository) repository = UIElements.emptyRepository (default_language);

for (var i = 0; i < base.length; i++) {

var b = base[i];

var lang = (b.getAttribute ('lang') || repository.defaultLanguage).replace(/-/g, '_');

for (var j = 0; j < items.length; j++) {

var nodes = UIElements.getElementsByClassName (b, tag || '*', items[j]);

if (nodes) {

for (var k = 0; k < nodes.length; k++) add_item (nodes[k], lang);

}

}

}

return repository;

},

getEntry : function (id, repository, lang, selector)

{

if (repository && repository[id]) {

if (!lang || lang.length == 0)

lang = repository.defaultLanguage || UIElements.defaultLanguage;

lang = lang.replace (/-/g, '_');

if (repository[id][lang]) {

if (selector == '*')

return repository[id][lang];

else if (!selector || selector.length == 0)

return repository[id][lang]._default;

else

return repository[id][lang][selector.replace (/-/g, '_')];

}

}

return null;

},

setEntry : function (id, repository, value, lang, selectors)

{

if (!repository) return null;

if (!lang) lang = repository.defaultLanguage;

lang = lang.replace (/-/g, '_');

id = id.replace(/-/g, '_');

if (!repository[id]) repository[id] = new Object ();

if (!repository[id][lang]) repository[id][lang] = new Object ();

if (!selectors || selectors.length == 0)

repository[id][lang]._default = value;

else {

for (var k = 0; k < selectors.length; k++) {

if (!selectors[k] || selectors[k].length == 0)

repository[id][lang]._default = value;

else

repository[id][lang][selectors[k].replace (/-/g, '_')] = value;

}

}

},

emptyRepository : function (default_language)

{

var repository = new Object ();

repository.defaultLanguage = default_language || UIElements.defaultLanguage;

return repository;

}

} // end UIElements