« MediaWiki:Common.js » : différence entre les versions
De BoyWiki
Aucun résumé des modifications |
(m) |
||
Ligne 224 : | Ligne 224 : | ||
var selText, isSample = false; | var selText, isSample = false; | ||
if (txtarea.selectionStart || txtarea.selectionStart == '0') { // | if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Firefox | ||
//save textarea scroll position | //save textarea scroll position | ||
Ligne 264 : | Ligne 264 : | ||
//mark sample text as selected | //mark sample text as selected | ||
if (isSample && range.moveStart) { | if (isSample && range.moveStart) { | ||
if (window.opera) | //if (window.opera) | ||
// tagClose = tagClose.replace(/\n/g,''); | |||
range.moveStart('character', - tagClose.length - selText.length); | range.moveStart('character', - tagClose.length - selText.length); | ||
range.moveEnd('character', - tagClose.length); | range.moveEnd('character', - tagClose.length); |
Version du 1 septembre 2009 à 10:49
/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */
/* Fonctions importées de Wikipédia */
/**
* Diverses fonctions manipulant les classes (utilisées par les boîtes déroulantes)
* Utilise des expressions régulières et un cache pour de meilleures perfs
* isClass et whichClass depuis http://fr.wikibooks.org/w/index.php?title=MediaWiki:Common.js&oldid=140211
* hasClass, addClass, removeClass et eregReplace depuis http://drupal.org.in/doc/misc/drupal.js.source.html
* surveiller l'implémentation de .classList http://www.w3.org/TR/2008/WD-html5-diff-20080122/#htmlelement-extensions
*/
function isClass(element, classe) {
return hasClass(element, classe);
}
function whichClass(element, classes) {
var s=" "+element.className+" ";
for(var i=0;i<classes.length;i++)
if (s.indexOf(" "+classes[i]+" ")>=0) return i;
return -1;
}
function hasClass(node, className) {
if (node.className == className) {
return true;
}
var reg = new RegExp('(^| )'+ className +'($| )')
if (reg.test(node.className)) {
return true;
}
return false;
}
function addClass(node, className) {
if (hasClass(node, className)) {
return false;
}
node.className += ' '+ className;
return true;
}
function removeClass(node, className) {
if (!hasClass(node, className)) {
return false;
}
node.className = eregReplace('(^|\\s+)'+ className +'($|\\s+)', ' ', node.className);
return true;
}
function eregReplace(search, replace, subject) {
return subject.replace(new RegExp(search,'g'), replace);
}
/**
* Boîtes déroulantes
*
* Pour [[Modèle:Méta palette de navigation]]
*/
var autoCollapse = 2;
var collapseCaption = '[ Enrouler ]';
var expandCaption = '[ Dérouler ]';
function collapseTable( tableIndex ) {
var Button = document.getElementById( "collapseButton" + tableIndex );
var Table = document.getElementById( "collapsibleTable" + tableIndex );
if ( !Table || !Button ) return false;
var Rows = Table.getElementsByTagName( "tr" );
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = "none";
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons() {
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "collapsible" ) ) {
NavigationBoxes[ tableIndex ] = Tables[i];
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
var Button = document.createElement( "span" );
var ButtonLink = document.createElement( "a" );
var ButtonText = document.createTextNode( collapseCaption );
Button.style.styleFloat = "right";
Button.style.cssFloat = "right";
Button.style.fontWeight = "normal";
Button.style.textAlign = "right";
Button.style.width = "6em";
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( ButtonLink );
var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
/* only add button and increment count if there is a header row to work with */
if (Header) {
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
}
for (var i = 0; i < tableIndex; i++) {
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) collapseTable( i );
}
}
addOnloadHook(createCollapseButtons);
/**
* Pour [[Modèle:Boîte déroulante]]
*/
var NavigationBarShowDefault = 0;
function toggleNavigationBar(indexNavigationBar) {
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
if (!NavFrame || !NavToggle) return;
// surcharge des libellés dérouler/enrouler grâce a l'attribut title
// exemple : title="[déroulade]/[enroulade]"
var caption = [expandCaption, collapseCaption];
if (NavFrame.title && NavFrame.title.length > 0) {
caption = NavFrame.title.split("/");
if (caption.length < 2) caption.push(collapseCaption);
}
// if shown now
if (NavToggle.firstChild.data == caption[1]) {
for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'none';
if (hasClass(NavChild, 'NavContent')) NavChild.style.display = 'none';
if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[0];
}
// if hidden now
} else if (NavToggle.firstChild.data == caption[0]) {
for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'block';
if (hasClass(NavChild, 'NavContent')) NavChild.style.display = 'block';
if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[1];
}
}
}
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton() {
var indexNavigationBar = 0;
var NavFrame;
// iterate over all < div >-elements
for( var i=0; NavFrame = document.getElementsByTagName("div")[i]; i++ ) {
// if found a navigation bar
if (hasClass(NavFrame, "NavFrame")) {
indexNavigationBar++;
var NavToggle = document.createElement("a");
NavToggle.className = 'NavToggle';
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
// surcharge des libellés dérouler/enrouler grâce a l'attribut title
var caption = collapseCaption;
if (NavFrame.title && NavFrame.title.indexOf("/") > 0) {
caption = NavFrame.title.split("/")[1];
}
var NavToggleText = document.createTextNode(caption);
NavToggle.appendChild(NavToggleText);
// add NavToggle-Button as first div-element
// in <div class="NavFrame">
NavFrame.insertBefore( NavToggle, NavFrame.firstChild );
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
}
}
// if more Navigation Bars found than Default: hide all
if (NavigationBarShowDefault < indexNavigationBar) {
for( var i=1; i<=indexNavigationBar; i++ ) {
toggleNavigationBar(i);
}
}
}
addOnloadHook(createNavigationBarToggleButton);
/**
* Redéfinition fonction insertTags() de la page /w/skins/common/edit.js non éditable
* mise en variable de la zone de texte éditable (la version originale ne permet que textarea)
* (d'après Wikipedia)
*/
var currentFocused;
function insertTags(tagOpen, tagClose, sampleText) {
var txtarea;
if (currentFocused) {
txtarea = currentFocused;
} else {
return;
}
var selText, isSample = false;
if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Firefox
//save textarea scroll position
var textScroll = txtarea.scrollTop;
//get current selection
txtarea.focus();
var startPos = txtarea.selectionStart;
var endPos = txtarea.selectionEnd;
selText = txtarea.value.substring(startPos, endPos);
//insert tags
checkSelectedText();
txtarea.value = txtarea.value.substring(0, startPos) + tagOpen + selText + tagClose +
txtarea.value.substring(endPos, txtarea.value.length);
//set new selection
if (isSample) {
txtarea.selectionStart = startPos + tagOpen.length;
txtarea.selectionEnd = startPos + tagOpen.length + selText.length;
} else {
txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
txtarea.selectionEnd = txtarea.selectionStart;
}
//restore textarea scroll position
txtarea.scrollTop = textScroll;
} else if (document.selection && document.selection.createRange) { // IE
//save window scroll position
if (document.documentElement && document.documentElement.scrollTop)
var winScroll = document.documentElement.scrollTop
else if (document.body)
var winScroll = document.body.scrollTop;
//get current selection
txtarea.focus();
var range = document.selection.createRange();
selText = range.text;
//insert tags
checkSelectedText();
range.text = tagOpen + selText + tagClose;
//mark sample text as selected
if (isSample && range.moveStart) {
//if (window.opera)
// tagClose = tagClose.replace(/\n/g,'');
range.moveStart('character', - tagClose.length - selText.length);
range.moveEnd('character', - tagClose.length);
}
range.select();
//restore window scroll position
if (document.documentElement && document.documentElement.scrollTop)
document.documentElement.scrollTop = winScroll
else if (document.body)
document.body.scrollTop = winScroll;
}
function checkSelectedText(){
if (!selText) {
selText = sampleText;
isSample = true;
} else if (selText.charAt(selText.length - 1) == ' ') { //exclude ending space char
selText = selText.substring(0, selText.length - 1);
tagClose += ' '
}
}
}
/* init variable currentFocused pour pages edition article */
hookEvent( 'load', function() {
if ( document.editform ) {
currentFocused = document.editform.wpTextbox1;
document.editform.wpTextbox1.onfocus = function() { currentFocused = document.editform.wpTextbox1; };
document.editform.wpSummary.onfocus = function() { currentFocused = document.editform.wpSummary; };
}
} );
/*-----------------------------------------------------------------*/
/* Fonctions utilitaires autres */
/* Spécifique IE qui partage apparemment un unique curseur d'insertion pour tout le document */
var text_cursor_position;
/* Retourne la position du curseur dans un champ texte */
function getpositiontxtcursor(objtxtarea) {
/* IE */
if (!document.selection || !document.selection.createRange) return -1;
/* sauve le contenu avant modification */
objtxtarea.focus();
var oldtxt = objtxtarea.value;
var range = document.selection.createRange();
var oldrangetxt = range.text;
/* chaine marqueur identifiable */
/*var tag = String.fromCharCode(28)+String.fromCharCode(29)+String.fromCharCode(30);*/
var tag = '§;¤;§';
/* insère marqueur à emplacement curseur */
range.text = oldrangetxt + tag; range.moveStart('character', (0 - oldrangetxt.length - tag.length));
/* sauve nouvelle chaine */
var newtxt = objtxtarea.value;
/* reinit contenu à ancienne valeur */
range.text = oldrangetxt;
/* recherche marqueur dans nouvelle chaine et retourne la position */
/*for (i=0; i <= newtxt.length; i++) {
var sTemp = newtxt.substring(i, i + tag.length);
if (sTemp == tag) {
var cursorpos = (i - oldrangetxt.length);*/
var i = newtxt.search(tag);
var cursorpos = (i - oldrangetxt.length);
return cursorpos;
}
/* Insère texte à position curseur */
function insertxtatcursorpos(objtxtarea,cursorpos,txt) {
/* IE */
if (!document.selection || !document.selection.createRange) return -1;
/* si position curseur inconnue insère txt à la fin */
if (typeof(cursorpos) == 'undefined') {
objtxtarea.value += txt;
}else {
var start = objtxtarea.value.substring(0, cursorpos);
var end = objtxtarea.value.substring(cursorpos,objtxtarea.value.length);
objtxtarea.value = start + txt + end;
}
}
/*-----------------------------------------------------------------*/
/* Création objet http pour requête serveur */
function createxhrobject() {
if (window.XMLHttpRequest) { // Firefox
return new XMLHttpRequest();
}
else if (window.ActiveXObject) { // IE
return new ActiveXObject("Msxml2.XMLHTTP");
}
else return null;
}
/*-----------------------------------------------------------------*/
/* Tri alphabétique */
/* Ordre alphabétique des caractères latins */
var alphabeticorder = 'AÀÁÂÃÄÅĀĂÆBßCĆČÇDÐEÈÉÊËĒĔFGHIÌÍÎÏĪĬJKLMNÑOÒÓÔÕÖŌŎØǾŒPQRSŚŠŞTÙÚÛÜŪŬVWXYÝZ';
/* Comparaison externe de 2 mots pour sort */
function alphacompare(a,b) {
if (a.length < b.length) var n = a.length;
else var n = b.length;
for (var i = 0; i < n ; i++) {
var x = alphabeticorder.indexOf(a[i].toUpperCase()) - alphabeticorder.indexOf(b[i].toUpperCase());
if (x != 0) return x;
}
return 0;
}