var mwCustomEditButtons = [];
 
 // Grundfunktion für weitere Editbuttons über dem Bearbeitungsfenster (aus [[q:bs:MediaWiki:Monobook.js]])
 
 function addEditButton(imageFile, tagOpen, sampleText, tagClose, speedTip)
    {
        mwCustomEditButtons[mwCustomEditButtons.length] = {
         "imageFile": "//upload.wikimedia.org/wikipedia/" + 
                        imageFile,
                "tagOpen": tagOpen,
                "sampleText": sampleText,
                "tagClose": tagClose,
                "speedTip": speedTip
        };
    }

 // Weitere Editbuttons (teils aus [[q:bs:MediaWiki:Monobook.js]], teils nach [[w:en:MediaWiki:Common.js]])
 
 addEditButton( 'commons/8/88/Btn_toolbar_enum.png', 
        '# ', '1', '\n# 2\n# 3', 'Nummerierung');
 
 addEditButton( 'commons/1/11/Btn_toolbar_liste.png', 
        '* ', 'A', '\n* B\n* C', 'Aufzählung');
 
 addEditButton( 'en/c/c8/Button_redirect.png', 
        '#REDIRECT [[', '{{PAGENAME}}', 
        ']]', 'Weiterleitung');
 
 addEditButton( 'en/5/58/Button_small.png', '<small>', 
        'kleingeschriebener Text', '</small>', 'klein');
 
 addEditButton( 'en/8/80/Button_upper_letter.png', '<sup>', 
        'hochgestellter Text', '</sup>', 'hochgestellt');
 
 addEditButton( 'en/7/70/Button_lower_letter.png', '<sub>', 
        'tiefgestellter Text', '</sub>', 'tiefgestellt');
 
 addEditButton( 'en/1/13/Button_enter.png', 
        '<br />', '', 'Absatz');

 // Auswahl Charsubset
 
 function chooseCharSubset(ss,options) {
    s = parseInt( ss );
    if ( isNaN(s) ) s = 0;
        if (SpecCharsAccesskeys.length===0) {
                /* if (is_opera) SpecCharsAccesskeys = new  Array("!","\"","§","$","%","&","/","(",")","=");
                else */ SpecCharsAccesskeys = new  Array("1","2","3","4","5","6","7","8","9","0","!","\"","§","$","%","&","/","(",")","=");
        }
        if (s>=0) {
                var l = document.getElementById('specialchars').getElementsByTagName('p');
                for (var i = 0; i < options ; i++) {
                        if (i==s) {
                                l[i].style.display = 'inline';  
                                  SetArrayAccessKeys(l[i].getElementsByTagName('a'),SpecCharsAccesskeys);
                        } else l[i].style.display =  'none';
                }
   //       $.cookie('CharSubset', s);
        } 
 }


 function setDefault() {
   var l = document.getElementById('specialchars').getElementsByTagName('select');
   var c = '';
   for (var i = 0; i < l.length; i++) {
     c += l[i].selectedIndex + '|';
   }
   mw.cookie.set('Specialchars', c, { expires: 86400 * 365 });
 }


 function getDefault1() {
   if (mw.cookie.get("Specialchars")) {
     var ca = mw.cookie.get("Specialchars").split('|');
     return parseInt( ca[0] );
   }
   return 0;
 }

 function setupDefault() {
   if (mw.cookie.get("Specialchars")) {
     var ca = mw.cookie.get("Specialchars").split('|');
     for (var i = 1; i < ca.length - 1; i++) {
       var option = parseInt( ca[i] );
       newSelect(document.getElementById("specialchars"),option);
     }
   }
 }


 function chooseCharSubset2(ss) {
   s = parseInt( ss );
   if ( isNaN(s) ) s = 0;
   if (SpecCharsAccesskeys.length == 0) {
     /* if (is_opera) SpecCharsAccesskeys = new  Array("!","\"","§","$","%","&","/","(",")","=");
        else */
          SpecCharsAccesskeys = new  Array("1","2","3","4","5","6","7","8","9","0","!","\"","§","$","%","&","/","(",")","=");
   }
   if (s >= 0) {
     var l = document.getElementById('specialchars').getElementsByTagName('p');
     //var cl = l[s].cloneNode(true);  pures Javascript klont keine Events; jQuery aber schon
     var cl = $(l[s]).clone(true).get(0);
     cl.style.display = 'inline';
     return cl;
   }
 }

 // Accesskeys
 
 function SetArrayAccessKeys(elements, keys) {
        for (var i =0; i < elements.length;i++) {
                if (i < keys.length) {
                        elements[i].setAttribute("accessKey",keys[i]);
                        elements[i].setAttribute("title","alt-"+keys[i]);
                } else {
                        elements[i].setAttribute("accessKey","");
                        elements[i].setAttribute("title","");
                }
        }
 }
  
 // Combined cross-browser features of [[:zh:MediaWiki:Monobook.js]]...
 
 SpecCharsAccesskeys = []; 
 
 function addCharSubsetMenu() {
   var SpecCharsMove = true;
   var edittools = document.getElementById('specialchars');
   if (edittools) {
     var name;
     var menu = document.createElement("select");
     menu.style.display = "inline";

     var line = edittools.getElementsByTagName('p');
     for (var i = 0; i < line.length ; i++) {
       if (line[i].className == "specialbasic" || line[i].className == "speciallang") {
         if (line[i].title) {
           name = line[i].title;
         } else {
           name = line[i].id;
         }
         menu.options[menu.options.length] = new Option(name);
       }
     }

     menu.onchange = function() {
       chooseCharSubset(this.selectedIndex,menu.options.length);
       setDefault();
     } ;
     if (SpecCharsMove) {
       edittools.insertBefore(menu,edittools.firstChild);
     } else {
       edittools.insertAfter(menu,edittools.firstChild);
     }
 
     var stdsubset = getDefault1();
     menu.options[stdsubset].selected = true;
     chooseCharSubset(stdsubset,menu.options.length);

 // Gleicher Tabindex für alle Elemente der Toolbar
     var charlinks = document.getElementById('specialchars').getElementsByTagName('a');
     for (var i=0; i < charlinks.length; i++) {
       charlinks[i].setAttribute("tabindex",8);
     }
   } //end if (edittools)
 }

 $(addCharSubsetMenu);
 
 function newSelect(node,option) {
   var ns = (node.firstChild.nextSibling).cloneNode(true);
   node.appendChild(document.createElement("br"));

   var anc = document.createElement("a");
   anc.appendChild(document.createTextNode("×"));
   anc.style.borderStyle = "outset";
   anc.style.paddingLeft = "3px";
   anc.style.paddingRight = "3px";
   anc.style.marginLeft = "2px";
   anc.style.marginRight = "4px";

   anc.onclick = function() {   // the famous self destroy button
     this.parentNode.removeChild(this.nextSibling);
     this.parentNode.removeChild(this.nextSibling);
     this.parentNode.removeChild(this.previousSibling);
     this.parentNode.removeChild(this);
     setDefault();
     return false;
   };

   node.appendChild(anc);
   ns.options[option].selected = true;

   ns.onchange = function() {
     var newChild = chooseCharSubset2(this.selectedIndex);
     this.parentNode.replaceChild(newChild, this.nextSibling);
     setDefault();
     return false;
   };

   node.appendChild(ns);
   node.appendChild(chooseCharSubset2(option));
   setDefault();
 }


 // Move to
 
 function elementMoveto(node, refNode, pos) {
   if (node && refNode) {
     var anc = document.createElement("a");
     anc.appendChild(document.createTextNode("+"));
     anc.style.borderStyle = "outset";
     anc.style.paddingLeft = "3px";
     anc.style.paddingRight = "3px";
     anc.style.marginLeft = "2px";
     anc.style.marginRight = "4px";

     anc.onclick = function() {
       newSelect(node,1);   // option 1 default
       return false;
     } ;

     node.insertBefore(anc, node.firstChild);

     var parent = refNode.parentNode;
     if (pos && pos == 'after') {refNode = refNode.nextSibling;}
     try {
       parent.insertBefore(node, refNode);
     } catch (DOMException) {};
     setupDefault();
   }
 }


 // Fix für Toolbar
 // übergangslösung. die bisherige implementation (siehe vorversion) ging mit umstellung auf 1.17 nicht mehr
 function fixToolbara(){
     var editspecialchars = document.getElementById("specialchars");
     var oben = document.getElementById("editingStatsId");
     elementMoveto( editspecialchars , oben, 'after' );
 }
 $(fixToolbara);