Järjestelmäviesti:Gadget-linkclassifier.js

Järjestelmäviesti:Gadget-linkclassifier.js:n artikkelissa tutkimme perusteellisesti tämän aiheen kaikkia puolia. Sen alkuperästä sen kehitykseen ajan myötä, sen vaikutuksen kautta yhteiskuntaan ja sen merkitykseen nykyään. Analysoimme alan asiantuntijoiden eri näkökulmia ja mielipiteitä sekä relevanttia dataa, joka auttaa ymmärtämään paremmin Järjestelmäviesti:Gadget-linkclassifier.js:n merkitystä ja vaikutusta eri alueilla. Tämän artikkelin tarkoituksena on tarjota täydellinen ja yksityiskohtainen näkemys Järjestelmäviesti:Gadget-linkclassifier.js:stä tavoitteenaan rikastaa tietoa ja edistää kriittistä pohdintaa tästä aiheesta.
/* If you want to use this script, simply add the following line to your ]:

importScript('User:Anomie/util.js');
importScript('User:Anomie/linkclassifier.js'); // Linkback: ]

* (Please keep the comment so I can see how many people use this). You will also want to
* add some CSS classes, such as those at ].
*/

/* If you want this to run "on demand" instead of on every page, set "LinkClassifierOnDemand=true" and
 * use mw.util.addPortletLink() or the like to add a button calling LinkClassifier.onDemand().
 */

//importScript('User:Zache/util.js');  // for backwards compat

function load_linkclassifier()
{
	var LinkClassifier={
	    /* This object maps classes to the categories for which to apply them. Values may be an array of strings or a regex. */
	    cats:{
	        deletion:[
	            'Luokka:Pikapoisto',
	            'Luokka:Hauki on kala',
	            'Luokka:Merkittävyys kyseenalaistettu',
	            'Luokka:Tekijänoikeusongelmat',
	            'Luokka:Poistettavat'
	        ].sort(),
	        disambiguation:[
	            'Luokka:Täsmennyssivut',
	        ].sort(),
	        sisterproject:[
	            'Luokka:Ohjaukset Wikisanakirjaan'
	        ].sort(),
	        userwarning:[
	            'Luokka:Varoitetut käyttäjät'
	        ].sort(),
	        'set-index':[
	            'Category:All set index articles'
	        ].sort(),
	        'featured-content2':[
	"Luokka:Yleinen wikiluokitusjärjestelmä",
	"Luokka:0 Yleiset tieteet",
	"Luokka:00 Kirja-ala, kirjoitus",
	"Luokka:02 Kirjastotoimi, kirjastotiede, informatiikka",
	"Luokka:06 Yleinen kulttuuripolitiikka",
	"Luokka:07 Viestintä, joukkoviestintä",
	"Luokka:1 Filosofia, psykologia",
	"Luokka:11 Filosofia",
	"Luokka:14 Psykologia",
	"Luokka:15 Rajatieto",
	"Luokka:17 Etiikka",
	"Luokka:2 Uskonto",
	"Luokka:20 Uskonnot yleisesti",
	"Luokka:23 Hindulaisuus",
	"Luokka:24 Buddhalaisuus",
	"Luokka:26 Juutalaisuus",
	"Luokka:27 Kristinusko",
	"Luokka:27.0 Kristinuskon historia, kirkkohistoria",
	"Luokka:27.71 Kristinusko Suomessa",
	"Luokka:27.714 Suomen herätysliikkeet",
	"Luokka:28 Islam",
	"Luokka:29 Muut uskonnot, mytologiat",
	"Luokka:3 Yhteiskuntatieteet",
	"Luokka:30 Yleinen yhteiskuntatiede",
	"Luokka:30.1 Sosiologia",
	"Luokka:30.16 Rikokset, kriminologia",
	"Luokka:30.7 Kansalais- ja järjestötoiminta, kokoustekniikka",
	"Luokka:31 Tilastotiede",
	"Luokka:32 Politiikka",
	"Luokka:32.0 Valtio-oppi, politiikka",
	"Luokka:32.1 Valtiofilosofia, valtiomuodot",
	"Luokka:32.3 Ihmisoikeudet, kansalaisen asema yhteiskunnassa",
	"Luokka:32.4 Sisäpolitiikka, puolueet",
	"Luokka:32.5 Kansainvälinen politiikka",
	"Luokka:33 Oikeustiede",
	"Luokka:34 Aluesuunnittelu, aluepolitiikka",
	"Luokka:35 Hallinto",
	"Luokka:36 Talous",
	"Luokka:37 Sosiaalipolitiikka",
	"Luokka:38 Kasvatus, opetus",
	"Luokka:39 Maanpuolustus",
	"Luokka:39.1 Aseistus, asevarustelu, asekauppa",
	"Luokka:39.4 Maavoimat, maasodankäynti",
	"Luokka:39.5 Merivoimat, merisodankäynti",
	"Luokka:39.6 Ilmavoimat, ilmasodankäynti",
	"Luokka:39.7 Sotilaskoulutus",
	"Luokka:4 Maantiede",
	"Luokka:41 Eurooppa",
	"Luokka:41.1 Suomi",
	"Luokka:41.2 Pohjoismaat",
	"Luokka:41.3 Keski-Eurooppa",
	"Luokka:41.4 Britteinsaaret",
	"Luokka:41.5 Etelä-Eurooppa",
	"Luokka:41.58 Balkanin maat",
	"Luokka:41.585 Kreikka",
	"Luokka:41.6 Itä-Eurooppa",
	"Luokka:41.61 Venäjä",
	"Luokka:41.62 Baltian maat",
	"Luokka:42 Aasia",
	"Luokka:43 Afrikka",
	"Luokka:44 Pohjois-Amerikka",
	"Luokka:45 Etelä-Amerikka",
	"Luokka:46 Australia, Oseania, Napamaat",
	"Luokka:49 Kansantiede, antropologia",
	"Luokka:5 Luonnontieteet",
	"Luokka:51 Matematiikka",
	"Luokka:52 Tähtitiede",
	"Luokka:53 Fysiikka",
	"Luokka:54 Kemia",
	"Luokka:55 Geologia",
	"Luokka:57 Biologia",
	"Luokka:57.4 Ekologia",
	"Luokka:58 Kasvitiede, sienitiede",
	"Luokka:58.1 Kasvimorfologia, kasvianatomia",
	"Luokka:58.4 Putkilokasvit",
	"Luokka:58.41 Puut, pensaat",
	"Luokka:58.5 Levät, jäkälät, sienet, sammalet",
	"Luokka:59 Eläintiede",
	"Luokka:59.2 Nisäkkäät",
	"Luokka:59.3 Linnut",
	"Luokka:59.4 Matelijat, sammakkoeläimet",
	"Luokka:59.5 Kalat",
	"Luokka:59.6 Selkärangattomat",
	"Luokka:6 Soveltavat tieteet, tekniikka",
	"Luokka:61 Lääketiede, terveydenhuolto",
	"Luokka:61.5 Hoitomenetelmät",
	"Luokka:61.51 Lääkehoito, lääkeaineoppi",
	"Luokka:61.7 Kliininen lääketiede",
	"Luokka:61.8 Psykiatria",
	"Luokka:61.81 Päihteiden käyttö",
	"Luokka:62 Tekniikka, kulkuneuvot",
	"Luokka:62.09 Energia",
	"Luokka:62.1 Tieto- ja viestintätekniikka",
	"Luokka:62.4 Liikenneväylät, kulkuneuvot",
	"Luokka:64 Kemianteollisuus, kaivosteollisuus",
	"Luokka:66 Rakennustekniikka",
	"Luokka:67 Maa- ja metsätalous",
	"Luokka:68 Kotitalous",
	"Luokka:69 Liiketalous",
	"Luokka:7 Taiteet, liikunta, huvit",
	"Luokka:70 Taide, taidehistoria",
	"Luokka:70.9 Yleinen taidehistoria",
	"Luokka:71 Uudet taidemuodot",
	"Luokka:72 Arkkitehtuuri",
	"Luokka:72.2 Rakennukset, rakennustyypit",
	"Luokka:72.21 Asuinrakennukset",
	"Luokka:72.22 Linnat, palatsit, kartanot",
	"Luokka:72.24 Uskonnolliset rakennukset",
	"Luokka:72.9 Arkkitehtuurin historia",
	"Luokka:73 Kuvanveisto",
	"Luokka:73.9 Kuvanveiston historia",
	"Luokka:73.91 Suomen kuvanveiston historia",
	"Luokka:74 Maalaustaide, piirustustaide",
	"Luokka:74.1 Maalaustaiteen materiaalit ja tekniikat",
	"Luokka:74.9 Maalaustaiteen historia",
	"Luokka:74.91 Suomen maalaustaiteen historia",
	"Luokka:75 Graafinen taide, valokuvaus",
	"Luokka:77 Näyttämötaide, elokuvataide",
	"Luokka:77.1 Teatteritaide",
	"Luokka:77.4 Elokuvataide",
	"Luokka:77.5 Televisiosarjat",
	"Luokka:78 Musiikki",
	"Luokka:78.1 Musiikin tutkimus, musiikkikasvatus",
	"Luokka:78.3 Laulu-, näyttämö- ja kirkkomusiikki",
	"Luokka:78.6 Soitinmusiikki, soittimet",
	"Luokka:78.8 Populaarimusiikki",
	"Luokka:78.81 Blues, soul",
	"Luokka:78.9 Musiikin historia",
	"Luokka:79 Urheilu, pelit, huvit",
	"Luokka:79.1 Yleisurheilu",
	"Luokka:79.2 Talviurheilu",
	"Luokka:79.3 Palloilu",
	"Luokka:79.4 Voimailu, itsepuolustus",
	"Luokka:79.5 Moottoriurheilu",
	"Luokka:79.8 Pelit, leikit, keräily",
	"Luokka:79.9 Julkiset huvit",
	"Luokka:8 Kirjallisuus, kielitiede",
	"Luokka:82 Runot",
	"Luokka:83 Näytelmät",
	"Luokka:83.2 Suomenkieliset näytelmät",
	"Luokka:84 Kertomakirjallisuus",
	"Luokka:84.2 Suomenkielinen kertomakirjallisuus",
	"Luokka:85 Sadut, kuvakirjat, sarjakuvat",
	"Luokka:86 Kirjallisuustiede",
	"Luokka:86.0 Yleinen kirjallisuustiede",
	"Luokka:86.1 Yleinen kirjallisuudenhistoria",
	"Luokka:87 Kielitiede",
	"Luokka:9 Historia",
	"Luokka:90 Historian tutkimus, maailmanhistoria",
	"Luokka:90.2 Yleinen arkeologia",
	"Luokka:90.3 Historian aputieteet",
	"Luokka:91 Euroopan historia",
	"Luokka:92 Aasian historia",
	"Luokka:93 Afrikan historia",
	"Luokka:94 Pohjois-Amerikan historia",
	"Luokka:95 Etelä-Amerikan historia",
	"Luokka:96 Australia, Oseania, napamaat",
	"Luokka:99 Henkilö- ja sukuhistoria",
	"Luokka:99.1 Filosofit, psykologit",
	"Luokka:99.2 Uskontojen ja kirkkokuntien edustajat",
	"Luokka:99.3 Yhteiskuntaelämän edustajat",
	"Luokka:99.4 Maantieteilijät, tutkimusmatkailijat, kansatieteilijät",
	"Luokka:99.5 Luonnontieteilijät, matemaatikot",
	"Luokka:99.6 Lääketieteen, tekniikan ja talouselämän edustajat",
	"Luokka:99.7 Humanististen tieteiden edustajat",
	"Luokka:99.9 Sukuhistoria, sukututkimus"
	        ].sort(),
	        'featured-content':[
	            'Luokka:Suositellut artikkelit',
	            'Luokka:Suositellut luettelot',
	            'Luokka:Hyvät artikkelit',
	            'Luokka:Lupaavat artikkelit',
	            'Luokka:Tarkistetut artikkelit'
	        ].sort(),
	        'broken-content':[        
	            'Luokka:Tarkistettava',
	            'Luokka:Epäselvät artikkelit',
	            'Luokka:Kesken jääneet artikkelit',
	            'Luokka:Keskeneräiset käännökset',
	            'Luokka:Kielenhuoltoa kaipaavat sivut',
	            'Luokka:Korjattavat sivut',
	            'Luokka:Mahdollisesti väärässä aikamuodossa olevat sivut',
	            'Luokka:Mahdollista mainontaa sisältävät artikkelit',
	            'Luokka:Uudelleenkirjoitusta vaativat sivut',
	            'Luokka:Mahdollisesti väärässä aikamuodossa olevat sivut',
	            'Luokka:Muodon korjausta kaipaavat sivut',
	            'Luokka:Neutraali näkökulma keskustelunalainen',
	            'Luokka:Päivitystä kaipaavat sivut',
	            'Luokka:Resentistiset artikkelit',
	            'Luokka:Määritelmän korjausta kaipaavat sivut'
	        ].sort(),
	        'proxy-ip':[
	            'Luokka:Yhteiskäyttöosoitteet'
	        ].sort(),
	        'spoken-articles':[
	            'Luokka:Puhutut sivut'
	        ].sort(),
	        stubcls:/^Luokka:.*tyngät$/,
	        'nonfree-media':[
	            'Category:All non-free media'
	        ].sort(),
	        unprintworthy:[
	            'Category:Unprintworthy redirects',
	        ].sort(),
	        'unprintworthy-shortcut':[
	            'Category:Redirects from shortcuts',
	        ].sort(),
	        'reviews':[
	            'Luokka:Lupaavaksi ehdotetut artikkelit',
	            'Luokka:Tarkistetuksi ehdotetut artikkelit',
	            'Luokka:Vertaisarviointi',
	        ].sort()
	    },
	 
	    callback:function(r, cc){
	        if(!r || !r.query) {
	        	mw.log.warn('Gadget-linkclassifier.js:Bad response');
	        	return;
	        }
	        if(r){
	            for(var k in r){
	                for(var k2 in r){
	                    cc=r;
	                }
	            }
	            api(cc, arguments.callee);
	        }
	        r=r.query;
	
	        var a=document.getElementById('wikiPreview');
	        if(!a) a=document.getElementById('bodyContent');
	        if(!a) mw.log.warn('Gadget-linkclassifier.js:Huh? No body content?');
	        a=a.getElementsByTagName('A');
	        if(a.length==0) return;
	
	        var redir={};
	        var redirlist=;
	        if(r.redirects) for(var i=r.redirects.length-1; i>=0; i--){
	            redir.from]=r.redirects.to;
	            redirlist.push(r.redirects.from);
	        }
	        if(redirlist.length>0) api({action:'query', titles:redirlist, prop:'categories', cllimit:'max'}, LinkClassifier.callback);
	
	        var cats={};
	        var missing={};
	        var classes={};
	        if(r.pages) for(var i in r.pages){
	            missing.title]=(typeof(r.pages.missing)!='undefined');
	            if(typeof(r.pages.categories)!='undefined'){
	                cats.title]=r.pages.categories.map(function(a){ return a.title; }).sort();
	            }
	            if(typeof(r.pages.protection)!='undefined'){
	                classes.title]=;
	                var x={};
	                for(var j=r.pages.protection.length-1; j>=0; j--){
	                    var p='protection-'+r.pages.protection.type+'-'+r.pages.protection.level;
	                    if(typeof(x)=='undefined'){
	                        x=1;
	                        classes.title].push(p);
	                    }
	                    if(r.pages.protection.expiry=='infinity'){
	                        p+='-indef';
	                        if(typeof(x)=='undefined'){
	                            x=1;
	                            classes.title].push(p);
	                        }
	                    }
	                }
	            }
	            if(typeof(r.pages.flagged)!='undefined'){
	                if(r.pages.lastrevid!=r.pages.flagged.stable_revid){
	                    classes.title].push('needs-review');
	                }
	            }
	        }
	        Array.forEach(a, function(a){
	            if(typeof(a.wikipage)=='undefined') return;
	            if(typeof(redir)!='undefined'){
	                addClass(a,'redirect');
	                a.wikipage=redir;
	                a.title=a.wikipage;
	                if(a.wikipage==(mw.config.get('wgCanonicalNamespace')?mw.config.get('wgCanonicalNamespace')+':':'')+mw.config.get('wgTitle'))
	                    addClass(a,'self-redirect');
	                if(missing)
	                    addClass(a,'broken-redirect');
	            }
	            var m=a.href.match(/#.*/);
	            if(m){
	                a.title=a.title.replace(/#.*/,'')+m.replace(/_/g,' ').replace(/\.()/gi, function(x,n){ return String.fromCharCode(parseInt(n,16)); });
	            }
	            if(/ \(disambiguation\)$/.test(a.origwikipage)){
	                addClass(a,'intentional-disambiguation');
	            }
	            if(typeof(classes)!='undefined'){
	                for(var j=classes.length-1; j>=0; j--)
	                    addClass(a,classes);
	            }
	            var c1=;
	            if(typeof(cats)!='undefined'){
	                c1=c1.concat(cats);
	            }
	            if(a.wikipage!=a.origwikipage && typeof(cats)!='undefined'){
	                c1=c1.concat(cats);
	            }
	            if(c1.length>0){
	                c1=c1.sort();
	                for(var cls in LinkClassifier.cats){
	                    var i1=c1.length-1;
	                    var c2=LinkClassifier.cats;
	                    if(c2 instanceof RegExp){
	                        while(i1>=0){
	                            if(c2.test(c1)){
	                                addClass(a,cls);
	                                break;
	                            }
	                            i1--;
	                        }
	                    } else {
	                        var i2=c2.length-1;
	                        while(i1>=0 && i2>=0){
	                            if(c1==c2){
	                                addClass(a,cls);
	                                break;
	                            }
	                            (c1>c2)?--i1:--i2;
	                        }
	                    }
	                }
	            }
	        });
	    },
	
	    getPageName:function(url){
	        var m=url.match(/\/wiki\/(+)/);
	        if(!m) m=url.match(/\/w\/index.php\?(?:.*&)?title=(+)/);
	        if(!m) return '';
	        var t=decodeURIComponent(m).replace(/_/g,' ');
	        if(t.substr(0,6)=='Image:') t='File:'+t.substr(6);
	        if(t.substr(0,11)=='Image talk:') t='File talk:'+t.substr(6);
	        if(t.substr(0,8)=='Special:') t='';
	        return t;
	    },
	
	    classifyChildren:function(node){
	        var a=node.getElementsByTagName('A');
	        if(a.length==0) return;
	      
	        var self=LinkClassifier.getPageName(location.href);
	      
	        a=Array.prototype.map.call(a, function(a){
	            a.wikipage='';
	            if(/(^|\s)(external|extiw|NavToggle)(\s|$)/.test(a.className)) return '';
	            if(!/(^|\s)(image)(\s|$)/.test(a.className)) a.className+=" nonimage";
	            a.wikipage=LinkClassifier.getPageName(a.href);
	            if(a.wikipage==self) a.wikipage='';
	            a.origwikipage=a.wikipage;
	            return a.wikipage;
	        }).sort().filter(function(e,i,a){
	            return e!=='' && (i==0 || a!==e);
	        });
	        while(a.length>0){
	            api({action:'query', titles:a.splice(0,50), prop:'categories|info|flagged', redirects:1, cllimit:'max', inprop:'protection'}, LinkClassifier.callback);
	        }
	    },
	 
	    classifyTitle:function() {
	
	        var firstHeading=document.getElementById("firstHeading");
	        if (firstHeading) firstHeading.innerHTML="<span>"+ firstHeading.innerHTML +"</span>";      
	
	        var catlinks=document.getElementById("catlinks");
	        if (catlinks) var cats=catlinks.getElementsByTagName("A");
	        if (cats) {
	           var c1=;
	           for (var n=cats.length-1; n>=0; n--)
	               if (cats.href.search("https://wikifreehand.com/fi/Luokka:")!=-1) c1.push("Luokka:" + cats.innerHTML);          
	
	           c1=c1.sort();
	           for(var cls in LinkClassifier.cats){
	               var i1=c1.length-1;
	               var c2=LinkClassifier.cats;
	               if(c2 instanceof RegExp){
	                  while(i1>=0){
	                     if(c2.test(c1)){
	                          addClass(firstHeading.firstChild,"a_" + cls);
	                          break;
	                     }
	                     i1--;
	                   }
	               } else {
	                   var i2=c2.length-1;
	                   while(i1>=0 && i2>=0){
	                      if(c1==c2){
	                         addClass(firstHeading.firstChild,"a_" + cls);
	                         break;
	                      }
	                      (c1>c2)?--i1:--i2;
	                    }
	               }
	            }               
	        }
	    },
	
	    onLoad:function(){             
	        if(window.AJAXPreview) window.AJAXPreview.AddOnLoadHook(LinkClassifier.classifyChildren);
	        LinkClassifier.onDemand();
	    },
	 
	    onDemand:function(){
	        LinkClassifier.classifyTitle();
	        var node=document.getElementById('wikiPreview');
	        if(!node) node=document.getElementById('bodyContent');
	        if(node) LinkClassifier.classifyChildren(node);
	      
	    }
	};
	
	if(!window.LinkClassifierOnDemand){
	    $(LinkClassifier.onLoad);
	}

// :en:User:Anomie/util.js alkaa
	function sajax_init_object() {
		var A;
		try {
			// Try the new style before ActiveX so we don't
			// unnecessarily trigger warnings in IE 7 when
			// set to prompt about ActiveX usage
			A = new XMLHttpRequest();
		} catch ( e ) {
			try {
				A = new ActiveXObject( 'Msxml2.XMLHTTP' );
			} catch ( e ) {
				try {
					A = new ActiveXObject( 'Microsoft.XMLHTTP' );
				} catch ( oc ) {
					A = null;
				}
			}
		}
		return A;
	};

	function jsondecode(v){
	    try {
	        return !(/0-9.\-+Eaeflnr-u\n\r\t]/.test(v.replace(/"(\\.|)*"/g,''))) && eval('('+v+')');
	    } catch(e){
	        return null;
	    }
	}
	 
	if(!Number.prototype.toHex) Number.prototype.toHex = function(p){
	        var s=this.toString(16);
	        var i=s.indexOf('.');
	        if(i<0) i=s.length;
	        if(typeof(p)!='undefined') for(p-=i; p>0; p--){
	                s='0'+s;
	        }
	        return s;
	}
	if(!Number.toHex) Number.toHex = function(n,p){
		return Number(n).toHex(p);
	}
	 
	if(!RegExp.quote){
	    RegExp.quote = function(s){
	        return s.replace(//ig, RegExp.quote.$replacer);
	    }
	    RegExp.quote.$replacer = function(c){
	        c=c.charCodeAt(0);
	        return '\\u'+c.toHex(4);
	    }
	}
	 
	function api(p, cb){
	    var uri=mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php';
	    var data='format=json';
	    for(var k in p){
	        var v=p;
	        if(typeof(v)=='object' && (v instanceof Array))
	            v=v.map(encodeURIComponent).join('|');
	        else
	            v=encodeURIComponent(v);
	        data+='&'+encodeURIComponent(k)+'='+v;
	    }
	 
	    var x = sajax_init_object();
	    if(!x) return false;
	 
	    if(typeof(cb)=='function'){
	        x.open('POST', uri, true);
	        x.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	        x.onreadystatechange=function(){
	            if(x.readyState!=4) return;
	            var r=jsondecode(x.responseText);
	            if(!r) mw.log.warn('Gadget-linkclassifier.js:Could not parse response');
	            cb(r, p);
	        };
	        x.send(data);
	        return true;
	    } else {
	        x.open('POST', uri, false);
	        x.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	        x.send(data);
	        var r=jsondecode(x.responseText);
	        if(!r) mw.log.warn("Could not parse response");
	        return r;
	    }
	}
	 
	function rawpage(pg, cb){
	    var uri=mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/index.php?action=raw&title='+encodeURIComponent(pg);
	 
	    var x = sajax_init_object();
	    if(!x) return false;
	 
	    if(typeof(cb)=='function'){
	        x.open('GET', uri, true);
	        x.onreadystatechange=function(){
	            if(x.readyState!=4) return;
	            cb(x.responseText);
	        };
	        x.send(null);
	        return true;
	    } else {
	        x.open('GET', uri, false);
	        x.send(null);
	        return x.responseText;
	    }
	}
	 
	function isClass(n, c){
		return n.className.match(new RegExp('(^|\\s)'+c+'(\\s|$)'));
	}
	function addClass(n, c){
		if(!isClass(n,c)) n.className=(n.className=='')?c:(n.className+' '+c);
	}
	function delClass(n, c){
		var cl=n.className;
		cl=cl.replace(new RegExp('(^|\\s)'+c+'(\\s|$)', 'g'), ' ');
		cl=cl.replace(/\s\s+/g, ' ').replace(/^\s+|\s+$/g, '');
		if(n.className!=cl) n.className=cl;
	}
	 
	if(!Array.prototype.map) Array.prototype.map=function(callback, thisObject){
	        var l=this.length;
	        var a=;
	        if(typeof(thisObject)=='undefined' || thisObject===null){
	                for(var i=0;i<l;i++){
	                        a=callback(this,i,this);
	                }
	        } else {
	                for(var i=0;i<l;i++){
	                        a=callback.call(thisObject,this,i,this);
	                }
	        }
	        return a;
	}
	if(!Array.map) Array.map=function(obj, callback, thisObject){
	        return Array.prototype.map.call(obj, callback, thisObject);
	}
	 
	if(!Array.prototype.forEach) Array.prototype.forEach=function(callback, thisObject){
		var l=this.length;
		if(typeof(thisObject)=='undefined' || thisObject===null){
			for(var i=0;i<l;i++){
				callback(this,i,this);
			}
		} else {
			for(var i=0;i<l;i++){
				callback.call(thisObject,this,i,this);
			}
		}
	}
	if(!Array.forEach) Array.forEach=function(obj, callback, thisObject){
		return Array.prototype.forEach.call(obj, callback, thisObject);
	}
	 
	if(!Array.prototype.filter) Array.prototype.filter=function(callback, thisObject){
		var l=this.length;
		var a=;
		if(typeof(thisObject)=='undefined' || thisObject===null){
			for(var i=0;i<l;i++){
				if(callback(this,i,this)) a.push(this);
			}
		} else {
			for(var i=0;i<l;i++){
				if(callback.call(thisObject,this,i,this)) a.push(this);
			}
		}
		return a;
	}
	if(!Array.filter) Array.filter=function(obj, callback, thisObject){
		return Array.prototype.filter.call(obj, callback, thisObject);
	}
// :en:User:Anomie/util.js loppuu
}
$(load_linkclassifier);