Utilisateur:TiChou/wpfunctions.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 * Bibliothèque de fonctions et de prototypes JavaScript
 *
 * auteur : [[:fr:User:TiChou]]
 * date : 14 juin 2007
 * revision : 19 août 2007
 */

// indexOf
if (!Array.indexOf) {
  Array.prototype.indexOf = function(obj,idx) {
    var len = this.length;
    if (len == 0) return -1;
    if (!idx) idx = 0;
    while (idx < 0) idx = len + idx;
    for (var i = 0; i < len; i++)
      if (this[i] == obj)
        return i;
    return -1;
  }
}

// map
if (!Array.map) {
  Array.prototype.map = function(fn, obj){
    var result = new Array();
    for (var i = 0, len = this.length; i < len; i++)
      result[i] = fn.call(obj, this[i], i, this);
    return result
  }
}

// getElementsByClassName
if (!document.getElementsByClassName) {
  document.getElementsByClassName = function() {
    var nodes;
    var elements = new Array();
    elements.item = function(index) { return elements[index]; }

    if (this.getElementsByTagNameNS)
      nodes = this.getElementsByTagNameNS("*", "*");
    else if (this.getElementsByTagName)
      nodes = this.getElementsByTagName("*");
    else
      return null;

    var element;
    var match, regex;

    for (var i = 0, leni = nodes.length; i < leni; i++) {
      element = nodes[i];
      match = true;
      for (var j = 0, lenj = arguments.length; j < lenj && match; j++) {
        regex = new RegExp("(^|\\s)" + arguments[j] + "(\\s|$)");
        if (!regex.test(element.className)) match = false;
      }
      if (match) elements.push(element);
    }
    return elements;
  }
}
if (typeof(HTMLElement) != 'undefined') {
  HTMLElement.prototype.getElementsByClassName = document.getElementsByClassName;
}

// getElementById
if (typeof(getElementById) == "undefined") {
  getElementById = function(id) {
    var element = null;
    if (this.id == id) {
      element = this;
      element.getElementsByClassName = document.getElementsByClassName;
    }
    for (var child = this.firstChild; !element && child; child = child.nextSibling)
      if (child.nodeType == 1) {
        child.getElementById = getElementById;
        element = child.getElementById(id);
      }
    return element;
  }
}

// URL encode
if (typeof(wpURLEncode) == "undefined") {
  wpURLEncode = function(string) {
    if (!string) return "";
    return string.replace(/ /g, "_").replace(/[\x00-\x2C\x3B-\x40\x5B-\x5E\x60\x7B-\uFFFF]/g,
      function (match) {
        var c = match.charCodeAt(0);
        var s = new Array();
        if (c < 0x80) s.push(c);
        else if (c < 0x0800) s.push(c >>  6 | 0xC0, c & 0x3F | 0x80);
        else if (c < 0x010000) s.push(c >> 12 | 0xE0, c >>  6 & 0x3F | 0x80, c & 0x3F | 0x80);
        else if (c < 0x110000) s.push(c >> 18 | 0xF0, c >> 12 & 0x3F | 0x80, c >>  6 & 0x3F | 0x80, c & 0x3F | 0x80);
        for (var i = 0, len = s.length; i < len; i++)
          s[i] = (s[i] < 16 ? "%0" : "%") + s[i].toString(16).toUpperCase();
        return s.join("");
      });
  }
}

// HTMLize
if (typeof(encodeEntities) == "undefined") {
  encodeEntities = function(string) {
    var chars = new Array('&', '<', '>', '"', "'");
    var entities = new Array('amp', 'lt', 'gt', 'quot', 'apos');
    for (var i = 0, len = chars.length; i < len; i++)
      string = string.replace(new RegExp(chars[i], 'g'), '&' + entities[i] + ';');
    return string;
  }
}

if (typeof(decodeEntities) == "undefined") {
  decodeEntities = function(string) {
    var chars = new Array('&', '<', '>', '"', "'");
    var entities = new Array('amp', 'lt', 'gt', 'quot', 'apos');
    for (var i = 0, len = entities.length; i < len; i++)
      string = string.replace(new RegExp('&' + entities[i] + ';', 'g'), chars[i]);
    return string;
  }
}

// Escape single quote
if (typeof(escQuote) == "undefined") {
  escQuote = function(string) {
    return string.replace(new RegExp(/'/g), '\\\'');
  }
}

// HTTP
if (typeof(httpRequest) == "undefined") {
  httpRequest = function(url, options, data) {
    // options.async
    // options.method
    // options.headers
    // options.content
    // options.onSuccess(request,data)
    // options.onFailure(request,data)
    var request;
    try {
      request = new XMLHttpRequest();
    } catch(e) {
      try {
        request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
        try {
          request = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
          request = false;
        }
      }
    }

    if (request) {
      request.onreadystatechange = function() {
        if (request.readyState == 4)
          httpComplete(request, options, data);
      };
      request.open(options.method ? options.method : "GET", url, options.async == false ? false : true);
      if (options.headers) {
        for (var field in options.headers)
          request.setRequestHeader(field, options.headers[field]);
      }
      request.send(options.content ? options.content : null);
    }
    return request;
  }
}

if (typeof(httpComplete) == "undefined") {
  httpComplete = function(request, options, data) {
    if (request.status >= 200 && request.status < 300) {
      if (options.onSuccess) {
        var contentType = request.getResponseHeader("Content-Type");
        var regex = new RegExp(/^([^\/]+\/[^;]+).*/);
        contentType = contentType.replace(regex, "$1");
        if (contentType == "text/html") {
          var doc = document.createElement("div");
          doc.innerHTML = request.responseText;
          doc.getElementsByClassName = document.getElementsByClassName;
          doc.getElementById = getElementById;
          options.onSuccess(doc, data);
        } else if (contentType == "text/xml") {
          var xml = null;
          if (navigator.appName == "Microsoft Internet Explorer") {
            xml = new ActiveXObject("Microsoft.XMLDOM");
            xml.async = false;
            xml.loadXML(request.responseText);
          } else if (window.DOMParser) {
            xml = new DOMParser();
            xml = xml.parseFromString(request.responseText, 'text/xml');
          }
          options.onSuccess(xml, data);
        } else {
          options.onSuccess(request, data);
        }
      }
    } else if (options.onFailure) {
      options.onFailure(request, data);
    } else {
      alert(request.statusText);
    }
  }
}

// Edit WP page
if (typeof(wpEditPage) == "undefined") {
  wpEditPage = function(title, params, editFunction, saveFunction, data) {
    var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + wpURLEncode(title)
            + '&action=edit';

    for (var name in params)
      url += '&' + name + '=' + wpURLEncode(params[name]);

    var options = { onSuccess: wpSavePage };

    data.title = title;
    data.editFunction = editFunction;
    data.saveFunction = saveFunction;

    httpRequest(url, options, data);
  }
}

// Save WP page
if (typeof(wpSavePage) == "undefined") {
  wpSavePage = function(doc, data) {
    var inputs = doc.getElementById('editform').getElementsByTagName('input');
    var editform = new Array();
    for (var i = 0, len = inputs.length; i < len; i++) {
      editform[inputs[i].name] = inputs[i].value;
    }
    var wpTextbox1 = doc.getElementById('wpTextbox1').value;
    var wpSummary = editform['wpSummary'];

    var regex = new RegExp(/var mw.config.get('wgArticleId') = "(\d+)";(?:\n.*)*var mw.config.get('wgCurRevisionId') = "(\d+)";/m);
    var match = regex.exec(doc.textContent);
    if (match) {
      data.pageId = match[1];
      data.curRevId = match[2];
    }

    var edit = data.editFunction(wpTextbox1, wpSummary, doc, data);

    if (typeof(edit.error) == "undefined") { 
      editform['wpTextbox1'] = edit.wpTextbox1;
      editform['wpSummary'] = edit.wpSummary;

      var params = [ 'wpTextbox1', 'wpSummary', 'wpSection', 'wpWatchthis',
                     'wpStarttime', 'wpEdittime', 'wpEditToken', 'wpSave' ];
      var content = params.map(function(name) { return name + '=' + encodeURIComponent(editform[name]); }).join("&");

      var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + wpURLEncode(data.title)
              + '&action=submit';

      var headers = new Array();
      headers['Content-Type'] = 'application/x-www-form-urlencoded';

      var options = { method: 'POST', headers: headers, content: content, onSuccess: data.saveFunction };

      data = edit.data;

      httpRequest(url, options, data);
    } else {
      edit.error(edit.data);
    }
  }
}

var wpfunctions = 1;