/*
 * ajaxtree.js - Expand and collapse a tree menu using Ajax
 *
 * Web page:
 *   http://www.revulo.com/PukiWiki/Plugin/AjaxTree.html
 *
 * Copyright (c) 2007-2008 revulo
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

var pukiwiki_ajaxtree = {
  baseUrl: "html/ajaxtree/",

  init: function() {
    var tree   = document.getElementById("ajaxtree");
    var isMSIE = /*@cc_on!@*/false;

    tree.onclick     = this.toggle;
    tree.onmousedown = function() {return false;};
    if (isMSIE) {
      tree.ondblclick    = this.toggle;
      tree.onselectstart = function() {return false;};
    }
    tree = null;
  },

  toggle: function(event) {
    var element = event ? event.target : window.event.srcElement;

    if (element.nodeName == "LI") {
      var li = element;
      var ul = li.getElementsByTagName("ul")[0];

      if (li.className == "expanded") {
        li.className = "collapsed";
        ul.style.display = "none";
      } else if (li.className == "collapsed") {
        if (ul) {
          li.className = "expanded";
          ul.style.display = "block";
        } else {
          pukiwiki_ajaxtree.ajax(li);
        }
      }
    }
  },

  ajax: function(li) {
    var req = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

    if (req) {
      var a    = li.getElementsByTagName("a")[0];
      var name = this.rawurlencode(a.title).replace(/%/g, "%25");
      var url  = this.baseUrl + name + ".html";

      req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
          var ul = document.createElement("ul");
          ul.innerHTML = req.responseText;
          li.className = "expanded";
          li.appendChild(ul);
          req = null;
        }
      };
      req.open("GET", url, true);
      req.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
      req.send("");
    }
  },

  rawurlencode: function(str) {
    try {
      return encodeURIComponent(str)
            .replace(/!/g,  "%21")
            .replace(/'/g,  "%27")
            .replace(/\(/g, "%28")
            .replace(/\)/g, "%29")
            .replace(/\*/g, "%2A")
            .replace(/~/g,  "%7E");
    } catch(e) {
      return escape(str)
            .replace(/\+/g, "%2B")
            .replace(/\//g, "%2F")
            .replace(/@/g,  "%40");
    }
  }
};

pukiwiki_ajaxtree.init();
