MediaWiki:Monobook.js

From Geofic

(Difference between revisions)
(test)
Line 1: Line 1:
 +
/* <pre><nowiki> */
 +
/* tooltips and access keys */
/* tooltips and access keys */
ta = new Object();
ta = new Object();
Line 8: Line 10:
ta['pt-watchlist'] = new Array('l','The list of pages you\'re monitoring for changes.');
ta['pt-watchlist'] = new Array('l','The list of pages you\'re monitoring for changes.');
ta['pt-mycontris'] = new Array('y','List of my contributions');
ta['pt-mycontris'] = new Array('y','List of my contributions');
-
ta['pt-login'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
+
ta['pt-login'] = new Array('o','You are encouraged to log in; however, it is not mandatory.');
-
ta['pt-anonlogin'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
+
ta['pt-anonlogin'] = new Array('o','You are encouraged to log in; however, it is not mandatory.');
ta['pt-logout'] = new Array('o','Log out');
ta['pt-logout'] = new Array('o','Log out');
ta['ca-talk'] = new Array('t','Discussion about the content page');
ta['ca-talk'] = new Array('t','Discussion about the content page');
Line 28: Line 30:
ta['n-currentevents'] = new Array('','Find background information on current events');
ta['n-currentevents'] = new Array('','Find background information on current events');
ta['n-recentchanges'] = new Array('r','The list of recent changes in the wiki.');
ta['n-recentchanges'] = new Array('r','The list of recent changes in the wiki.');
 +
ta['n-translations'] = new Array('','Help with translations');
ta['n-randompage'] = new Array('x','Load a random page');
ta['n-randompage'] = new Array('x','Load a random page');
ta['n-help'] = new Array('','The place to find out.');
ta['n-help'] = new Array('','The place to find out.');
ta['n-sitesupport'] = new Array('','Support us');
ta['n-sitesupport'] = new Array('','Support us');
 +
ta['n-Metapub'] = new Array('','Central forum about the Wikimedia Foundation and its projects');
 +
ta['n-Babel'] = new Array('','General and policy discussion page for Meta');
 +
ta['n-planet'] = new Array('','Weblog aggregator of Wikimedia-related posts');
ta['t-whatlinkshere'] = new Array('j','List of all wiki pages that link here');
ta['t-whatlinkshere'] = new Array('j','List of all wiki pages that link here');
ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linked from this page');
ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linked from this page');
Line 49: Line 55:
ta['ca-nstab-help'] = new Array('c','View the help page');
ta['ca-nstab-help'] = new Array('c','View the help page');
ta['ca-nstab-category'] = new Array('c','View the category page');
ta['ca-nstab-category'] = new Array('c','View the category page');
 +
 +
// ============================================================
 +
// BEGIN pageview counter
 +
// Please talk to User:LeonWeber before changing anything or
 +
// if there are any issues with that.
 +
// Please do NOT install this on a different site without
 +
// Talking to him before.
 +
 +
// this should be adjusted to a good value.
 +
// BE CAREFULL, you will break zedler if it's too low!
 +
// And then DaB. will kill Leon :-(
 +
var disable_counter = 0;
 +
var counter_factor = 50;
 +
 +
function pgcounter_setup()
 +
{
 +
if(disable_counter == 0)
 +
{
 +
var url = window.location.href;
 +
if(Math.floor(Math.random()*counter_factor)==42)  // the probability thing
 +
  {
 +
  if(wgIsArticle==true || wgArticleId==0) // do not count history pages etc.
 +
{
 +
var pgcountNs = wgCanonicalNamespace;
 +
if(wgCanonicalNamespace=="")
 +
{
 +
pgcountNs = "0";
 +
}
 +
  var cnt_url = "http://pgcount.wikimedia.de/index.png?ns=" + pgcountNs + "&title=" + encodeURI(wgTitle) + "&factor=" + counter_factor + "&wiki=metawiki";
 +
var img = new Image();
 +
img.src = cnt_url;
 +
}
 +
}
 +
}
 +
}
 +
// Do not use aOnloadFunctions[aOnloadFunctions.length] = pgcounter_setup;
 +
//  (or other onload functions), some browsers don't like that.
 +
pgcounter_setup();
 +
 +
// END pageview counter
 +
// ============================================================
 +
 +
 +
/**
 +
* Implements language selection for multilingual elements
 +
*
 +
* In certain environments, it's not feasible to neatly box away each
 +
* different language into its own section of the site. By marking elements
 +
* multilingual, you can emulate this behavior by only displaying the
 +
* message in the user's language. This reduced the "Tower of Babel" effect.
 +
*
 +
* @author Edward Z. Yang (Ambush Commander)
 +
* @version $Id: language_select.js 1358 2007-02-19 15:34:59Z Edward $
 +
*/
 +
 +
/* Configuration: */
 +
 +
// in your monobook.js, set ls_enable = false to stop the javascript
 +
// maybe it should be cookie configurable. However, you can achieve
 +
// something almost to this effect through cookie settings
 +
var ls_enable = true;
 +
 +
// the cookie name we use to stash the info.
 +
// change this if you are porting it to another wiki!
 +
var ls_cookie = 'metawiki_language_js';
 +
 +
// link to the language select page
 +
var ls_help_url = 'http://meta.wikimedia.org/wiki/Meta:Language_select';
 +
 +
// strings that are part of the widgets
 +
var ls_string_help = 'Language select:';
 +
var ls_string_select = 'Select';
 +
var ls_string_showall = 'Show all';
 +
 +
// define some meta-variables
 +
var ls__first = true; // the first iteration?
 +
 +
// node compatability fix
 +
if (!window.Node) {
 +
    var Node = {
 +
        ELEMENT_NODE : 1,
 +
        ATTRIBUTE_NODE: 2,
 +
        TEXT_NODE: 3,
 +
        COMMENT_NODE: 8,
 +
        DOCUMENT_NODE: 9,
 +
        DOCUMENT_FRAGMENT_NODE: 11
 +
    };
 +
}
 +
 +
// autodetects a browser language
 +
function ls_getBrowserLanguage() {
 +
    var language;
 +
    // borrowed from Wikimedia's site error notice
 +
    // find the language
 +
    if (navigator.userLanguage) {
 +
        // use the user's preferred language (non-Gecko)
 +
        language = navigator.userLanguage;
 +
    } else if (navigator.appName == 'Netscape') {
 +
        // use the only language information available to Gecko
 +
        language = navigator.language;
 +
    } else {
 +
        // get the browser language information in non-Gecko browsers
 +
        // (IE, Opera, Konqueror)
 +
        language = navigator.browserLanguage;
 +
    }
 +
    return language;
 +
}
 +
 +
// grabs language from cookie
 +
function ls_getCookieLanguage() {
 +
    var allcookies = document.cookie;
 +
    var marker = ls_cookie + '=';
 +
    var pos = allcookies.indexOf(marker);
 +
   
 +
    // cookie isn't set, so no behavior defined
 +
    if (pos === -1) return null;
 +
   
 +
    // cookie is set
 +
    var start = pos + marker.length;
 +
    var end  = allcookies.indexOf(';', start);
 +
    if (end == -1) end = allcookies.length;
 +
   
 +
    var raw  = allcookies.substring(start,end);
 +
    var value = unescape(raw);
 +
   
 +
    return value;
 +
}
 +
 +
// sets a new language to the cookie
 +
function ls_setCookieLanguage(language) {
 +
    var today = new Date();
 +
    var expiry = new Date(today.getUTCFullYear() + 30, 1);
 +
    document.cookie = ls_cookie + '=' + escape(language) + '; expires=' + expiry.toGMTString();
 +
}
 +
 +
// deletes the cookie
 +
function ls_deleteCookieLanguage(language) {
 +
    document.cookie = ls_cookie + '=; expires=Fri, 02-Jan-1970 00:00:00 GMT';
 +
}
 +
 +
// grabs the ISO 639 language code based
 +
// on either the browser or a supplied cookie
 +
// return of "mul" will display all available strings
 +
function ls_getLanguage() {
 +
    var language = '';
 +
   
 +
    // Priority:
 +
    //  1. Cookie
 +
    //  2. wgUserLanguage global variable
 +
    //  3. Browser autodetection
 +
   
 +
    // grab according to cookie
 +
    language = ls_getCookieLanguage();
 +
   
 +
    // grab according to wgUserLanguage
 +
    if (!language && window.wgUserLanguage) {
 +
        language = wgUserLanguage;
 +
    }
 +
   
 +
    // grab according to browser if none defined
 +
    if (!language) {
 +
        language = ls_getBrowserLanguage();
 +
    }
 +
   
 +
    // inflexible: can't accept multiple languages
 +
   
 +
    // remove dialect/region code, leaving only the ISO 639 code
 +
    var length;
 +
    // possible bug: supposedly the language string could be en_US
 +
    // switch to regexps when we get the chance
 +
    if ((length = language.indexOf('-')) !== -1) {
 +
        language = language.substr(0, length);
 +
    }
 +
   
 +
    return language;
 +
}
 +
 +
// walks all child elements and finds all elements with multilingual in them
 +
function ls_getAllMultilingualElements(n) {
 +
    var elements = new Array();
 +
    // possible bug if we have a classname that includes the word multilingual
 +
    //  but it's unlikely
 +
    if (n.className && n.className.indexOf('multilingual') != -1) {
 +
        elements = elements.concat(n);
 +
    }
 +
    var children = n.childNodes;
 +
    for(var i=0; i < children.length; i++) {
 +
        if (children[i].nodeType !== Node.ELEMENT_NODE) continue;
 +
        elements = elements.concat(ls_getAllMultilingualElements(children[i]));
 +
    }
 +
    return elements;
 +
}
 +
 +
// walks a hash and hides all non-matching languages
 +
function ls_hideAllExcept(lang_element_hash, language) {
 +
    for (var n in lang_element_hash) {
 +
        if (n == language) {
 +
            lang_element_hash[n].style.display = '';
 +
        } else {
 +
            lang_element_hash[n].style.display = 'none';
 +
        }
 +
    }
 +
}
 +
 +
// walks a hash and shows all languages
 +
function ls_showAll(lang_element_hash) {
 +
    for (var n in lang_element_hash) {
 +
        if (lang_element_hash[n].style.display) {
 +
            lang_element_hash[n].style.display = '';
 +
        }
 +
    }
 +
}
 +
 +
// build widget for changing the language cookie
 +
function ls_buildWidget(language) {
 +
 
 +
    // set up the floating form
 +
    var form = document.createElement('form');
 +
    form.className = 'lang_info';
 +
    form.onsubmit = function() {
 +
        if (this.elements[2].ls_mul_flag) {
 +
            this.elements[2].ls_mul_flag = false;
 +
            var language = 'mul';
 +
            var temporary = true;
 +
        } else {
 +
            ls_setCookieLanguage(this.elements[0].value);
 +
            var language = this.elements[0].value;
 +
            var temporary = false;
 +
        }
 +
        ls_applyLanguageSelect(language, temporary);
 +
       
 +
        return false; // don't perform action
 +
    };
 +
    form.appendSpace = function() {
 +
        this.appendChild(document.createTextNode(' '));
 +
    };
 +
   
 +
    // link to language select description page
 +
    var link = document.createElement('a');
 +
    link.href = ls_help_url;
 +
    link.className = 'ls_link';
 +
    link.appendChild(document.createTextNode(ls_string_help));
 +
    form.appendChild(link);
 +
   
 +
    form.appendSpace();
 +
   
 +
    // input box for the language
 +
    var input = document.createElement('input');
 +
    input.setAttribute('type', 'text');
 +
    input.setAttribute('size', '2');
 +
    input.setAttribute('maxlength', '3');
 +
    input.onclick = function() { this.select(); };
 +
    input.className = 'ls_input';
 +
    input.value = language;
 +
    form.appendChild(input);
 +
   
 +
    form.appendSpace();
 +
   
 +
    // save button
 +
    var submit = document.createElement('input');
 +
    submit.setAttribute('type', 'submit');
 +
    submit.value = ls_string_select;
 +
    submit.className = 'ls_select';
 +
    form.appendChild(submit);
 +
   
 +
    form.appendSpace();
 +
   
 +
    // show all button
 +
    // equivalent to setting input box to "mul" and pressing save
 +
    var showall = document.createElement('input');
 +
    showall.setAttribute('type', 'submit');
 +
    showall.value = ls_string_showall;
 +
    showall.onclick = function() {
 +
        this.ls_mul_flag = true;
 +
    };
 +
    form.appendChild(showall);
 +
   
 +
    return form;
 +
   
 +
}
 +
 +
// main body of the function
 +
function ls_applyLanguageSelect(language, temporary) {
 +
   
 +
    // possible site for cookie checking to disable language select
 +
    if (!ls_enable) return;
 +
   
 +
    // if language is blank, delete the cookie and then recalculate
 +
    if (!language) {
 +
        ls_deleteCookieLanguage();
 +
        language = ls_getLanguage();
 +
    }
 +
   
 +
    // grab the body element (only one)
 +
    var body = document.getElementsByTagName('body')[0];
 +
   
 +
    // grab an array of multilingual elements
 +
    var mls = ls_getAllMultilingualElements(body);
 +
   
 +
    // this will get overwritten many times, temporary variable
 +
    var form, language_element_hash;
 +
   
 +
    // iterate through all those elements
 +
    for (var i = 0; i < mls.length; i++) {
 +
        var ml  = mls[i];        // the current multilingual container
 +
        var ml_c = ml.childNodes; // children of the container
 +
       
 +
        // if it's the first iteration...
 +
        if (ls__first) {
 +
            form = ls_buildWidget(language);
 +
            ml.appendChild(form, ml_c[0]);
 +
        } else {
 +
            // update widget
 +
            form = ml_c[ml_c.length - 1]; // form is last element
 +
            if (!temporary) {
 +
                form.elements[0].value = language;
 +
                form.elements[0].removeAttribute('disabled');
 +
                form.elements[2].removeAttribute('disabled');
 +
            } else {
 +
                form.elements[0].setAttribute('disabled', 'disabled');
 +
                form.elements[2].setAttribute('disabled', 'disabled');
 +
            }
 +
        }
 +
       
 +
        form.elements[0].style.background="#FFF";
 +
       
 +
        // tells us whether or not to blindly perform the keep
 +
        var message_exists  = false;
 +
       
 +
        // iterate through all languages and set up a hash
 +
        //  with references to each of the language nodes
 +
        lang_element_hash = new Object();
 +
        for (var j = 0; j < ml_c.length; j++) {
 +
            var n = ml_c[j];
 +
            if (n.nodeType != Node.ELEMENT_NODE) continue; // skip non-elements
 +
            if (!n.lang) continue; // skip non-language specific elements
 +
            if (n.lang.indexOf(language) === 0) {
 +
                // it turns out our language is here
 +
                message_exists  = true;
 +
            }
 +
            lang_element_hash[n.lang] = n;
 +
        }
 +
       
 +
        // if a preferred language was kept, do quickest processing
 +
        if (message_exists) {
 +
            ls_hideAllExcept(lang_element_hash, language);
 +
            continue;
 +
        }
 +
       
 +
        // otherwise, nothing happened, this means that it wasn't found
 +
       
 +
        // if it's not the first time, repaint all of them
 +
        if (!ls__first) {
 +
            ls_showAll(lang_element_hash);
 +
        }
 +
       
 +
        if (language != 'mul') {
 +
            form.elements[0].style.background="#FCC";
 +
        }
 +
       
 +
    }
 +
   
 +
    // we've already processed once
 +
    ls__first = false;
 +
   
 +
}
 +
 +
function ls_applyDefaultLanguageSelect() {
 +
    ls_applyLanguageSelect(ls_getLanguage(), false);
 +
}
 +
 +
// register as onload function (there must be a better way)
 +
if (window.addEventListener) {
 +
    window.addEventListener("load", ls_applyDefaultLanguageSelect, false);
 +
} else if (window.attachEvent) {
 +
    window.attachEvent("onload", ls_applyDefaultLanguageSelect);
 +
}
 +
 +
 +
/* </nowiki></pre> */

Revision as of 20:23, 3 April 2007

/* <pre><nowiki> */

/* tooltips and access keys */
ta = new Object();
ta['pt-userpage'] = new Array('.','My user page');
ta['pt-anonuserpage'] = new Array('.','The user page for the ip you\'re editing as');
ta['pt-mytalk'] = new Array('n','My talk page');
ta['pt-anontalk'] = new Array('n','Discussion about edits from this ip address');
ta['pt-preferences'] = new Array('','My preferences');
ta['pt-watchlist'] = new Array('l','The list of pages you\'re monitoring for changes.');
ta['pt-mycontris'] = new Array('y','List of my contributions');
ta['pt-login'] = new Array('o','You are encouraged to log in; however, it is not mandatory.');
ta['pt-anonlogin'] = new Array('o','You are encouraged to log in; however, it is not mandatory.');
ta['pt-logout'] = new Array('o','Log out');
ta['ca-talk'] = new Array('t','Discussion about the content page');
ta['ca-edit'] = new Array('e','You can edit this page. Please use the preview button before saving.');
ta['ca-addsection'] = new Array('+','Add a comment to this discussion.');
ta['ca-viewsource'] = new Array('e','This page is protected. You can view its source.');
ta['ca-history'] = new Array('h','Past versions of this page.');
ta['ca-protect'] = new Array('=','Protect this page');
ta['ca-delete'] = new Array('d','Delete this page');
ta['ca-undelete'] = new Array('d','Restore the edits done to this page before it was deleted');
ta['ca-move'] = new Array('m','Move this page');
ta['ca-watch'] = new Array('w','Add this page to your watchlist');
ta['ca-unwatch'] = new Array('w','Remove this page from your watchlist');
ta['search'] = new Array('f','Search this wiki');
ta['p-logo'] = new Array('','Main Page');
ta['n-mainpage'] = new Array('z','Visit the Main Page');
ta['n-portal'] = new Array('','About the project, what you can do, where to find things');
ta['n-currentevents'] = new Array('','Find background information on current events');
ta['n-recentchanges'] = new Array('r','The list of recent changes in the wiki.');
ta['n-translations'] = new Array('','Help with translations');
ta['n-randompage'] = new Array('x','Load a random page');
ta['n-help'] = new Array('','The place to find out.');
ta['n-sitesupport'] = new Array('','Support us');
ta['n-Metapub'] = new Array('','Central forum about the Wikimedia Foundation and its projects');
ta['n-Babel'] = new Array('','General and policy discussion page for Meta');
ta['n-planet'] = new Array('','Weblog aggregator of Wikimedia-related posts');
ta['t-whatlinkshere'] = new Array('j','List of all wiki pages that link here');
ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linked from this page');
ta['feed-rss'] = new Array('','RSS feed for this page');
ta['feed-atom'] = new Array('','Atom feed for this page');
ta['t-contributions'] = new Array('','View the list of contributions of this user');
ta['t-emailuser'] = new Array('','Send a mail to this user');
ta['t-upload'] = new Array('u','Upload images or media files');
ta['t-specialpages'] = new Array('q','List of all special pages');
ta['ca-nstab-main'] = new Array('c','View the content page');
ta['ca-nstab-user'] = new Array('c','View the user page');
ta['ca-nstab-media'] = new Array('c','View the media page');
ta['ca-nstab-special'] = new Array('','This is a special page, you can\'t edit the page itself.');
ta['ca-nstab-wp'] = new Array('a','View the project page');
ta['ca-nstab-image'] = new Array('c','View the image page');
ta['ca-nstab-mediawiki'] = new Array('c','View the system message');
ta['ca-nstab-template'] = new Array('c','View the template');
ta['ca-nstab-help'] = new Array('c','View the help page');
ta['ca-nstab-category'] = new Array('c','View the category page');

 // ============================================================
 // BEGIN pageview counter
 // 	Please talk to User:LeonWeber before changing anything or 
 // 	if there are any issues with that.
 // 	Please do NOT install this on a different site without 
 // 	Talking to him before.
 
 // this should be adjusted to a good value.
 // BE CAREFULL, you will break zedler if it's too low!
 // And then DaB. will kill Leon :-(
 var disable_counter = 0;
 var counter_factor = 50;
 
 function pgcounter_setup()
 {
 	if(disable_counter == 0)
 	{
 		var url = window.location.href;
 		if(Math.floor(Math.random()*counter_factor)==42)  // the probability thing
  		{
  			if(wgIsArticle==true || wgArticleId==0) // do not count history pages etc.
 			{
 				var pgcountNs = wgCanonicalNamespace;
 				if(wgCanonicalNamespace=="")
 				{
 					pgcountNs = "0";
 				}
  				var cnt_url = "http://pgcount.wikimedia.de/index.png?ns=" + pgcountNs + "&title=" + encodeURI(wgTitle) + "&factor=" + counter_factor + "&wiki=metawiki";
 				var img = new Image(); 
 				img.src = cnt_url;
 			}
 		}
 	}
 }
 // Do not use aOnloadFunctions[aOnloadFunctions.length] = pgcounter_setup;
 //  (or other onload functions), some browsers don't like that.
 pgcounter_setup();
 
 // END pageview counter 
 // ============================================================


/**
 * Implements language selection for multilingual elements
 * 
 * In certain environments, it's not feasible to neatly box away each
 * different language into its own section of the site. By marking elements
 * multilingual, you can emulate this behavior by only displaying the 
 * message in the user's language. This reduced the "Tower of Babel" effect.
 * 
 * @author Edward Z. Yang (Ambush Commander)
 * @version $Id: language_select.js 1358 2007-02-19 15:34:59Z Edward $
 */

/* Configuration: */

// in your monobook.js, set ls_enable = false to stop the javascript
// maybe it should be cookie configurable. However, you can achieve
// something almost to this effect through cookie settings
var ls_enable = true;

// the cookie name we use to stash the info.
// change this if you are porting it to another wiki!
var ls_cookie = 'metawiki_language_js';

// link to the language select page
var ls_help_url = 'http://meta.wikimedia.org/wiki/Meta:Language_select';

// strings that are part of the widgets
var ls_string_help = 'Language select:';
var ls_string_select = 'Select';
var ls_string_showall = 'Show all';

// define some meta-variables
var ls__first = true; // the first iteration?

// node compatability fix
if (!window.Node) {
    var Node = {
        ELEMENT_NODE : 1,
        ATTRIBUTE_NODE: 2,
        TEXT_NODE: 3,
        COMMENT_NODE: 8,
        DOCUMENT_NODE: 9,
        DOCUMENT_FRAGMENT_NODE: 11
    };
}

// autodetects a browser language
function ls_getBrowserLanguage() {
    var language;
    // borrowed from Wikimedia's site error notice
    // find the language
    if (navigator.userLanguage) {
        // use the user's preferred language (non-Gecko)
        language = navigator.userLanguage;
    } else if (navigator.appName == 'Netscape') {
        // use the only language information available to Gecko
        language = navigator.language;
    } else {
        // get the browser language information in non-Gecko browsers
        // (IE, Opera, Konqueror)
        language = navigator.browserLanguage;
    }
    return language;
}

// grabs language from cookie
function ls_getCookieLanguage() {
    var allcookies = document.cookie;
    var marker = ls_cookie + '=';
    var pos = allcookies.indexOf(marker);
    
    // cookie isn't set, so no behavior defined
    if (pos === -1) return null;
    
    // cookie is set
    var start = pos + marker.length;
    var end   = allcookies.indexOf(';', start);
    if (end == -1) end = allcookies.length;
    
    var raw   = allcookies.substring(start,end);
    var value = unescape(raw);
    
    return value;
}

// sets a new language to the cookie
function ls_setCookieLanguage(language) {
    var today = new Date();
    var expiry = new Date(today.getUTCFullYear() + 30, 1);
    document.cookie = ls_cookie + '=' + escape(language) + '; expires=' + expiry.toGMTString();
}

// deletes the cookie
function ls_deleteCookieLanguage(language) {
    document.cookie = ls_cookie + '=; expires=Fri, 02-Jan-1970 00:00:00 GMT';
}

// grabs the ISO 639 language code based
// on either the browser or a supplied cookie
// return of "mul" will display all available strings
function ls_getLanguage() {
    var language = '';
    
    // Priority:
    //  1. Cookie
    //  2. wgUserLanguage global variable
    //  3. Browser autodetection
    
    // grab according to cookie
    language = ls_getCookieLanguage();
    
    // grab according to wgUserLanguage
    if (!language && window.wgUserLanguage) {
        language = wgUserLanguage;
    }
    
    // grab according to browser if none defined
    if (!language) {
        language = ls_getBrowserLanguage();
    }
    
    // inflexible: can't accept multiple languages
    
    // remove dialect/region code, leaving only the ISO 639 code
    var length;
    // possible bug: supposedly the language string could be en_US
    // switch to regexps when we get the chance
    if ((length = language.indexOf('-')) !== -1) {
        language = language.substr(0, length);
    }
    
    return language;
}

// walks all child elements and finds all elements with multilingual in them
function ls_getAllMultilingualElements(n) {
    var elements = new Array();
    // possible bug if we have a classname that includes the word multilingual
    //   but it's unlikely
    if (n.className && n.className.indexOf('multilingual') != -1) {
        elements = elements.concat(n);
    }
    var children = n.childNodes;
    for(var i=0; i < children.length; i++) {
        if (children[i].nodeType !== Node.ELEMENT_NODE) continue;
        elements = elements.concat(ls_getAllMultilingualElements(children[i]));
    }
    return elements;
}

// walks a hash and hides all non-matching languages
function ls_hideAllExcept(lang_element_hash, language) {
    for (var n in lang_element_hash) {
        if (n == language) {
            lang_element_hash[n].style.display = '';
        } else {
            lang_element_hash[n].style.display = 'none';
        }
    }
}

// walks a hash and shows all languages
function ls_showAll(lang_element_hash) {
    for (var n in lang_element_hash) {
        if (lang_element_hash[n].style.display) {
            lang_element_hash[n].style.display = '';
        }
    }
}

// build widget for changing the language cookie
function ls_buildWidget(language) {
   
    // set up the floating form
    var form = document.createElement('form');
    form.className = 'lang_info';
    form.onsubmit = function() {
        if (this.elements[2].ls_mul_flag) {
            this.elements[2].ls_mul_flag = false;
            var language = 'mul';
            var temporary = true;
        } else {
            ls_setCookieLanguage(this.elements[0].value);
            var language = this.elements[0].value;
            var temporary = false;
        }
        ls_applyLanguageSelect(language, temporary);
        
        return false; // don't perform action
    };
    form.appendSpace = function() {
        this.appendChild(document.createTextNode(' '));
    };
    
    // link to language select description page
    var link = document.createElement('a');
    link.href = ls_help_url;
    link.className = 'ls_link';
    link.appendChild(document.createTextNode(ls_string_help));
    form.appendChild(link);
    
    form.appendSpace();
    
    // input box for the language
    var input = document.createElement('input');
    input.setAttribute('type', 'text');
    input.setAttribute('size', '2');
    input.setAttribute('maxlength', '3');
    input.onclick = function() { this.select(); };
    input.className = 'ls_input';
    input.value = language;
    form.appendChild(input);
    
    form.appendSpace();
    
    // save button
    var submit = document.createElement('input');
    submit.setAttribute('type', 'submit');
    submit.value = ls_string_select;
    submit.className = 'ls_select';
    form.appendChild(submit);
    
    form.appendSpace();
    
    // show all button 
    // equivalent to setting input box to "mul" and pressing save
    var showall = document.createElement('input');
    showall.setAttribute('type', 'submit');
    showall.value = ls_string_showall;
    showall.onclick = function() {
        this.ls_mul_flag = true;
    };
    form.appendChild(showall);
    
    return form;
    
}

// main body of the function
function ls_applyLanguageSelect(language, temporary) {
    
    // possible site for cookie checking to disable language select
    if (!ls_enable) return;
    
    // if language is blank, delete the cookie and then recalculate
    if (!language) {
        ls_deleteCookieLanguage();
        language = ls_getLanguage();
    }
    
    // grab the body element (only one)
    var body = document.getElementsByTagName('body')[0];
    
    // grab an array of multilingual elements
    var mls = ls_getAllMultilingualElements(body);
    
    // this will get overwritten many times, temporary variable
    var form, language_element_hash;
    
    // iterate through all those elements
    for (var i = 0; i < mls.length; i++) {
        var ml   = mls[i];        // the current multilingual container
        var ml_c = ml.childNodes; // children of the container
        
        // if it's the first iteration...
        if (ls__first) {
            form = ls_buildWidget(language);
            ml.appendChild(form, ml_c[0]);
        } else {
            // update widget
            form = ml_c[ml_c.length - 1]; // form is last element
            if (!temporary) {
                form.elements[0].value = language;
                form.elements[0].removeAttribute('disabled');
                form.elements[2].removeAttribute('disabled');
            } else {
                form.elements[0].setAttribute('disabled', 'disabled');
                form.elements[2].setAttribute('disabled', 'disabled');
            }
        }
        
        form.elements[0].style.background="#FFF";
        
        // tells us whether or not to blindly perform the keep
        var message_exists  = false;
        
        // iterate through all languages and set up a hash
        //   with references to each of the language nodes
        lang_element_hash = new Object();
        for (var j = 0; j < ml_c.length; j++) {
            var n = ml_c[j];
            if (n.nodeType != Node.ELEMENT_NODE) continue; // skip non-elements
            if (!n.lang) continue; // skip non-language specific elements
            if (n.lang.indexOf(language) === 0) {
                // it turns out our language is here
                message_exists  = true;
            }
            lang_element_hash[n.lang] = n;
        }
        
        // if a preferred language was kept, do quickest processing
        if (message_exists) {
            ls_hideAllExcept(lang_element_hash, language);
            continue;
        }
        
        // otherwise, nothing happened, this means that it wasn't found
        
        // if it's not the first time, repaint all of them
        if (!ls__first) {
            ls_showAll(lang_element_hash);
        }
        
        if (language != 'mul') {
            form.elements[0].style.background="#FCC";
        }
        
    }
    
    // we've already processed once
    ls__first = false;
    
}

function ls_applyDefaultLanguageSelect() {
    ls_applyLanguageSelect(ls_getLanguage(), false);
}

// register as onload function (there must be a better way)
if (window.addEventListener) {
    window.addEventListener("load", ls_applyDefaultLanguageSelect, false);
} else if (window.attachEvent) {
    window.attachEvent("onload", ls_applyDefaultLanguageSelect);
}


/* </nowiki></pre> */
Personal tools
active geofiction