/*
ExtIdx, a MediaWiki extension that extends the
page index with the index of (in the headlines) 
referred pages.
Copyright (C) 2008  Markus Szumovski

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Contact author by e-mail: webmaster@wikitimescale.com
Contact author by mail:
Markus Szumovski
Hirtenbergerstrasse 33
2551 Enzesfeld
Austria
*/

/* The following are the signs that are printed out by this extension */
var plusstr="[+]";
var minusstr="[-]";
var gotostr="[>>]";

var http_request=false;
var idxlinkname='';
var extidx_idxnr=0;
var globextidxid;
var extidxarr=new Array();
var pageextidxarr=new Array();
var ie=false;
var dontwork=false;

function addPlus(path, articlepath)
{
   var toc;
   var len;
   var lis; 
   var i;
   var links;
   var sublinks;

   var beforeListElement;
   var beforeListElementText;

   var spans;
   var idxname;
   var linkname;
   var innerlink;
   var u;
   var o;
   var hrefstr;

   var subspans;
   var spanclass;

   toc = document.getElementById("toc");

   if(toc!=null)
   {

   lis=toc.getElementsByTagName("li");
   len=lis.length;

   for(i=0;i<len;i++)
   {
      innerlink=lis[i].getElementsByTagName("a");
      spans=lis[i].getElementsByTagName("span");
      idxname=trimstring(spans[1].firstChild.data);

      linkname=innerlink[0].getAttribute("href");
      linkname=linkname.substr(linkname.indexOf('#')+1);
      links=document.getElementsByName(linkname);      
      subspans=links[0].nextSibling.getElementsByTagName("span");

      spanclass='';
      sublinks=null;
      
      o=0;
      while(spanclass!='mw-headline' && o<subspans.length)
      {
         if(subspans[o].className)
            spanclass=subspans[o].className;
         else
            spanclass=subspans[o].getAttribute("class");
         o++;
      }
      o--;

      if(o>=0 && o<subspans.length && spanclass=='mw-headline')
         sublinks=subspans[o].getElementsByTagName("a");

      if(sublinks!=null && sublinks.length>0)
      {
         u=0;
            hrefstr=sublinks[u].getAttribute("href");

            if(hrefstr.indexOf("action=edit")==-1)
            {
               if(hrefstr.indexOf("title=")==-1)
               {
                  hrefstr=hrefstr.substr(hrefstr.indexOf(articlepath)+articlepath.length);
               }
               else
               {
                  hrefstr=hrefstr.substr(hrefstr.indexOf("title=")+6);
                  if(hrefstr.indexOf("&")!=-1)
                     hrefstr=hrefstr.substring(0,hrefstr.indexOf("&"));
               }

               beforeListElementhref=document.createAttribute("href");
               beforeListElementhref.nodeValue="javascript:readIndex('" + path + "','" + hrefstr + "','" + linkname + "','');";
               beforeListElement=document.createElement("a");
               beforeListElement.setAttributeNode(beforeListElementhref);
               beforeListElementText = document.createTextNode(plusstr);
               beforeListElement.appendChild(beforeListElementText );
 
               innerlinknode=innerlink[0];
               lis[i].insertBefore(beforeListElement, innerlinknode);
               lis[i].insertBefore(document.createTextNode(' '), innerlinknode);

               endListElementhref=document.createAttribute("href");
               endListElementhref.nodeValue=path + "?title=" + hrefstr;
               endListElement=document.createElement("a");
               endListElement.setAttributeNode(endListElementhref);
               endListElementText = document.createTextNode(gotostr);
               endListElement.appendChild(endListElementText);
 
               if(innerlinknode.nextSibling==null)
               {
                  lis[i].appendChild(endListElement);
                  lis[i].insertBefore(document.createTextNode(" "),endListElement);
               }
               else
               {
                  lis[i].insertBefore(endListElement,innerlinknode.nextSibling);
                  lis[i].insertBefore(document.createTextNode(" "),endListElement);
               }
            }
      }
      

   }

   }
}

function trimstring(s) {
  while (s.substring(0,1) == ' ') {
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
    s = s.substring(0,s.length-1);
  }
  return s;
}

function getExtIdxXmlDoc(xmltext)
{
   xmlarr=xmltext.split("\n");

   newhl=false;
   hli=0;
   hd=new Array();

   for(i=0;i<xmlarr.length;i++)
   {
      if(xmlarr[i]!='?')
      {
         if(xmlarr[i]=='!' && newhl==false)
         {
            hd[hli]=new Array();
            newhl=true;
            u=0;
         }
         else if(xmlarr[i]=='!' && newhl==true)
         {
            newhl=false;
            hli++;
         }
         else if(xmlarr[i]!='!' && newhl==true)
         {
            hd[hli][u]=xmlarr[i];
            u++;
         }
      }
   }
   
   return hd;
}

function extidx_load()
{
   var toc;
   var xmltext;
   var len;
   var xmldoc;
   var xmlroot;
   var hdl;
   var liselm;
   var innerlink;
   var firstinnerlink;
   var secondinnerlink;
   var addnumberspans;
   var addnumber;
   var caseextidxarr;
   var lis;
   var lislen;
   var u;
   var i;
   var o;
   var addnewlist;
   var lisclass;
   var lislevel;
   var linkparent;
   var minuslinkhref;
   var minuslink;
   var newul;
   var newil;
   var pointlevel;
   var updownlevel;
   var newpointlevel;
   var hdnumber;
   var hdtext;
   var hdanchor;
   var hdidxlnktag;
   var hdidxlnk;
   var beforeListElement;
   var beforeListElementText;
   var endListElement;
   var endListElementText;
   var classatt;
   var idatt;
   var lilinkhref;
   var lilink;
   var spannrclass;
   var spannr;
   var nrstr;
   var newpointlevel;
   var pointlevel;
   var spantextclass;
   var spantext;
   var lastli;
   var tmpul;


   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
         if(ie==false)
         {
            xmldoc=http_request.responseXML;
            xmlroot=xmldoc.getElementsByTagName("extidx");
            hdl=xmlroot[0].getElementsByTagName("headline");
            len=hdl.length;
            xmltext='';
         }
         else
         {
            xmltext=http_request.responseText;
            hdl=getExtIdxXmlDoc(xmltext);
            len=hdl.length;

         }

   liselm=null;
        if(globextidxid!='' && document.getElementById(globextidxid)!=null)
         {
            liselm=document.getElementById(globextidxid);

               innerlink=liselm.getElementsByTagName("a");

               if(innerlink.length>1)
               {
                  firstinnerlink=innerlink[0];
                  secondinnerlink=innerlink[1];
                  linkname=innerlink[1].getAttribute("href");
                  linkname=linkname.substr(linkname.indexOf('#')+1);
                  addnumberspans=innerlink[1].getElementsByTagName("span");
                  if(addnumberspans.length>0)
                     addnumber=addnumberspans[0].firstChild.data;
               }
               else
                  linkname='';

            caseextidxarr=true;
         }
         else
         {
            toc = document.getElementById('toc');
            lis=toc.getElementsByTagName("li");
            lislen=lis.length;

            u=0;
            do
            {
              
               innerlink=lis[u].getElementsByTagName("a");
               if(innerlink.length>1)
               {
                  firstinnerlink=innerlink[0];
                  secondinnerlink=innerlink[1];
                  linkname=innerlink[1].getAttribute("href");
                  linkname=linkname.substr(linkname.indexOf('#')+1);
                  addnumberspans=innerlink[1].getElementsByTagName("span");
                  if(addnumberspans.length>0)
                     addnumber=addnumberspans[0].firstChild.data;
               }
               else
                  linkname='';

               u++;
            }
            while(u<lislen && (linkname=='' || linkname!=idxlinkname));

            if(linkname!='' && linkname==idxlinkname)
            {
               u--;
               liselm=lis[u];
            }

            caseextidxarr=false;
         }

         if(liselm!=null)
         {
             if(liselm.className)
                lisclass=liselm.className;
             else
                lisclass=liselm.getAttribute("class");
             lisclass=lisclass.substr(9);
             lislevel=parseInt(lisclass)+1;

             linkparent=firstinnerlink.parentNode;
             linkparent.removeChild(firstinnerlink);

             while(typeof(linkparent.firstChild.nodeValue)=="string" && linkparent.firstChild.nodeValue==" ")
             {
                linkparent.removeChild(linkparent.firstChild);
             }

            if(len>0)
            {

             minuslinkhref=document.createAttribute("href");
             minuslinkhref.nodeValue="javascript:destroyChildren('" + globpath + "','" + globhrefstr + "','" + linkname + "','" + globextidxid + "');";
             minuslink=document.createElement("a");
             minuslink.appendChild(document.createTextNode(minusstr));
             minuslink.setAttributeNode(minuslinkhref);

             linkparent.insertBefore(minuslink, secondinnerlink);
             linkparent.insertBefore(document.createTextNode(' '), secondinnerlink);

             addnewlist=true;

             if(caseextidxarr==true)
             {
                if(typeof(pageextidxarr[globextidxid])!="undefined")
                {
                   tmpul=liselm.getElementsByTagName("ul");
                   if(tmpul.length>0)
                   {
                      liselm.insertBefore(pageextidxarr[globextidxid],tmpul[0]);
                   }
                   else
                      liselm.appendChild(pageextidxarr[globextidxid]);
                   addnewlist=false;
                }
             }
             else
             {
                if(typeof(extidxarr[linkname])!="undefined")
                {
                   tmpul=liselm.getElementsByTagName("ul");
                   if(tmpul.length>0)
                   {
                      liselm.insertBefore(extidxarr[linkname],tmpul[0]);
                   }
                   else
                      liselm.appendChild(extidxarr[linkname]);
                   addnewlist=false;
                }
             }
             
            if(addnewlist)
            {
             newul=new Array();
             newul[0]=document.createElement("ul");

             pointlevel=0;
             updownlevel=0;
             newpointlevel=0;

             for(i=0;i<len;i++)
             {
               if(ie==false)
               {
                  hdnumber=hdl[i].getElementsByTagName("number")[0].firstChild.data;
                  hdtext=hdl[i].getElementsByTagName("text")[0].firstChild.data;
                  hdanchor=hdl[i].getElementsByTagName("anchor")[0].firstChild.data;
                  hdidxlnktag=hdl[i].getElementsByTagName("indexlink");
                  if(hdidxlnktag.length>0)
                     hdidxlnk=hdidxlnktag[0].firstChild.data;
                  else
                     hdidxlnk='';
               }
               else
               {
                  hdnumber=hdl[i][0];
                  hdtext=hdl[i][1];
                  hdanchor=hdl[i][2];
                  if(hdl[i].length>3)
                     hdidxlnk=hdl[i][3];  
                  else
                     hdidxlnk='';             
               }

               if(hdidxlnk!='')
               {
                  beforeListElement=document.createElement("a");
                  beforeListElement.setAttribute("href","javascript:readIndex('" + globpath + "','" + hdidxlnk + "','" + hdtext + "','extidxid-" + extidx_idxnr + "');");
                  beforeListElementText = document.createTextNode(plusstr);
                  beforeListElement.appendChild(beforeListElementText );
 
                  endListElement=document.createElement("a");
                  endListElement.setAttribute("href",globpath + "?title=" + hdidxlnk);
                  endListElementText = document.createTextNode(gotostr);
                  endListElement.appendChild(endListElementText);
               }  

               classatt=document.createAttribute("class");
               classatt.nodeValue="toclevel-" + lislevel;
               idatt=document.createAttribute("id");
               idatt.nodeValue="extidxid-" + extidx_idxnr;
               newli=document.createElement("li");
               newli.setAttributeNode(classatt);
               newli.setAttributeNode(idatt);
               extidx_idxnr=extidx_idxnr+1;

               lilinkhref=document.createAttribute("href");
               lilinkhref.nodeValue=hdanchor;
               lilink=document.createElement("a");
               lilink.setAttributeNode(lilinkhref);

               spannrclass=document.createAttribute("class");
               spannrclass.nodeValue="tocnumber";
               spannr=document.createElement("span");
               spannr.setAttributeNode(spannrclass);
               nrstr=addnumber + '.' + hdnumber;
               spannr.appendChild(document.createTextNode(nrstr));

               newpointlevel=nrstr.split('.').length;
               if(pointlevel==0)
                  pointlevel=newpointlevel;

               spantextclass=document.createAttribute("class");
               spantextclass.nodeValue="toctext";
               spantext=document.createElement("span");
               spantext.setAttributeNode(spantextclass);
               spantext.appendChild(document.createTextNode(hdtext));

               lilink.appendChild(spannr);
               lilink.appendChild(document.createTextNode(' '));
               lilink.appendChild(spantext);

               if(hdidxlnk!='')
               {
                  newli.appendChild(beforeListElement);
                  newli.appendChild(document.createTextNode(' '));
               }
               newli.appendChild(lilink);

               if(pointlevel<newpointlevel)
               {
                  updownlevel++;
                  newul[updownlevel]=document.createElement("ul");
                  lastli.appendChild(newul[updownlevel]);
               }
               else if(pointlevel>newpointlevel && updownlevel!=0)
                  updownlevel--;

               newul[updownlevel].appendChild(newli);

               if(hdidxlnk!='')
               {
                  newli.appendChild(endListElement);
                  newli.insertBefore(document.createTextNode(" "),endListElement);
               }               

               lastli=newli;
               pointlevel=newpointlevel;

            }

             tmpul=liselm.getElementsByTagName("ul");
             if(tmpul.length>0)
             {
                liselm.insertBefore(newul[0],tmpul[0]);
             }
             else
                liselm.appendChild(newul[0]);

            }

           }
         }

         dontwork=false;
      } else {
          //Error
      }
   } else {
    // not yet ready
   }
}

function destroyChildren(path, hrefstr, lname, extidxid)
{
   var liselm;
   var toc;
   var firstinnerlink;
   var secondinnerlink;
   var linkname;
   var caseextidxid;
   var lis;
   var lislen;
   var u;
   var i;
   var o;
   var ulchild;
   var linkparent;
   var pluslinkhref;
   var pluslink;


   liselm=null;
         if(extidxid!='' && document.getElementById(extidxid)!=null)
         {
            liselm=document.getElementById(extidxid);

               innerlink=liselm.getElementsByTagName("a");

               if(innerlink.length>1)
               {
                  firstinnerlink=innerlink[0];
                  secondinnerlink=innerlink[1];
                  linkname=innerlink[1].getAttribute("href");
                  linkname=linkname.substr(linkname.indexOf('#')+1);
               }
               else
                  linkname='';

            caseextidxid=true;
         }
         else
         {
            toc = document.getElementById("toc");
            lis=toc.getElementsByTagName("li");
            lislen=lis.length;

            u=0;
            do
            {
              
               innerlink=lis[u].getElementsByTagName("a");
               if(innerlink.length>1)
               {
                  firstinnerlink=innerlink[0];
                  secondinnerlink=innerlink[1];
                  linkname=innerlink[1].getAttribute("href");
                  linkname=linkname.substr(linkname.indexOf('#')+1);
               }
               else
                  linkname='';

               u++;
            }
            while(u<lislen && (linkname=='' || linkname!=lname));

            if(linkname!='' && linkname==lname)
            {
               u--;
               liselm=lis[u];

               caseextidxid=false;
            }

         }

         if(liselm!=null)
         {
                ulchild=liselm.getElementsByTagName("ul")[0];
                if(caseextidxid==true)
                   pageextidxarr[extidxid]=liselm.removeChild(ulchild);
                else
                   extidxarr[lname]=liselm.removeChild(ulchild);

                linkparent=firstinnerlink.parentNode;
                linkparent.removeChild(firstinnerlink);

                while(typeof(linkparent.firstChild.nodeValue)=="string" && linkparent.firstChild.nodeValue==" ")
                {
                   linkparent.removeChild(linkparent.firstChild);
                }
  
                pluslinkhref=document.createAttribute("href");
                pluslinkhref.nodeValue="javascript:readIndex('" + path + "','" + hrefstr + "','" + lname + "','" + extidxid + "');";
                pluslink=document.createElement("a");
                pluslink.appendChild(document.createTextNode(plusstr));
                pluslink.setAttributeNode(pluslinkhref);

                linkparent.insertBefore(pluslink, secondinnerlink);
                linkparent.insertBefore(document.createTextNode(' '), secondinnerlink);
         }

}

function readIndex(path, page, iln, extidxid)
{
   idxlinkname=iln;
   globpath=path;
   globhrefstr=page;
   globextidxid=extidxid; 

   
  if(dontwork==false)
  {
   dontwork=true;
   
   if (window.XMLHttpRequest) { // Mozilla, Safari, ...
       http_request = new XMLHttpRequest();
   } else if (window.ActiveXObject) { // IE
       http_request = new ActiveXObject("Microsoft.XMLHTTP");
   }

   if(http_request.overrideMimeType)
   {
      http_request.overrideMimeType('text/xml');
      ie=false;
   }
   else
      ie=true;

   if(ie==false)
      loc=path + '?title=' + page + '&action=extidx';
   else
      loc=path + '?title=' + page + '&action=extidxtext';

   http_request.onreadystatechange = extidx_load;

   http_request.open('GET',loc, true);
   http_request.send(null);
  }
}

