/*
================================================================
  paella.js ---- cross-browser ponpon Ajax Engine
  Copyright 2005 ponpon <ponpon@ponpon-village.net>
  URL http://ponpon-village.net/
================================================================
  v0.01  2005/09/26  first release
  v0.02  2005/09/27  xslt, cache 機能を追加してみた
  v0.03  2005/12/07  $ 機能を追加してみた
================================================================
*/

function PonponNamespace() {

  function pXmlHttpProcesser() {
      this.create = XMLHttp.create();
      this.method = "GET";
  };

  pXmlHttpProcesser.xmlhttp = function() { return XMLHttp.create(); };

  pXmlHttpProcesser.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

  pXmlHttpProcesser.prototype = {
    setMethod: function(method) {
      var a = method.toUpperCase();
      if(a == "GET" || a == "POST" || a == "PUT" || a == "PROPFIND") {
        this.method = a;
      }
    },

    getMethod: function() {
      return this.method;
    },

    load: function(url, query, func) {
      var xmlhttp = this.create;

      xmlhttp.open(this.method, url);

      var proc = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
          func(xmlhttp);
        } else if (xmlhttp.readyState == 4 && xmlhttp.status != 200) {
          func(null);
        }
      };

      xmlhttp.onreadystatechange = proc;
      if(query != null) {
        xmlhttp.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
      } else {
        xmlhttp.setRequestHeader("Content-Type" , "text/html; charset=utf-8");
      }
      xmlhttp.send( query );
    },

    getText: function(url, fnc) {
      var proc = function(xmlhttp) {
        if(xmlhttp != null) {
          fnc(xmlhttp.responseText);
        } else {
          fnc(null);
        }
      };

      this.load(url, null, proc);
    },

    getHtml: function(url, div) {
      var proc = function(xmlhttp) {
        var disp = $(div);
        disp.innerHTML = xmlhttp.responseText;
      };

      this.load(url, null, proc);
    },

    getHtmltoText: function(url, div) {
      var reg;

      var proc = function(xmlhttp) {
        var disp = $(div);
        var txt = xmlhttp.responseText;
        txt = txt.replace(/</g, "&lt;");
        txt = txt.replace(/>/g, "&gt;");
        txt = txt.replace(/ /g, "&nbsp;");
        reg = new RegExp("\r\n|\r|\n", "g");
        txt = txt.replace(reg, "<br />");
        disp.innerHTML = txt;
        disp.style.display = "block";
      };

      this.load(url, null, proc);
    },

    getXml: function(url, fnc) {
      var proc = function(xmlhttp) {
        if(xmlhttp != null) {
          fnc(xmlhttp.responseXML);
        } else {
          fnc(null);
        }
      };

      this.load(url, null, proc);
    },

    getResponse: function(url, fnc) {
      var proc = function(xmlhttp) {
        if(xmlhttp != null) {
          (fnc || function(){})(xmlhttp);
        }
      };

      this.load(url, null, proc);
    },

    send: function(url, frm, div) {
      this.check(this.create);

      var postdata = this.dataset(frm);
      if(postdata.length = 0){
        window.alert("送信するデータがありません。");
        return false;
      }

      var proc = function(xmlhttp) {
        var disp = $(div);
        disp.innerHTML = xmlhttp.responseText;
      };

      this.load(url, postdata, proc);
    },

    sendOnly: function(url, frm) {
      this.check(this.create);

      var postdata = this.dataset(frm);
      if(postdata.length = 0){
        window.alert("送信するデータがありません。");
        return false;
      }

      this.load(url, postdata, null);
    },

    check: function(xmlhttp) {
      if (xmlhttp) {
        if(xmlhttp.readyState == 1 || xmlhttp.readyState == 2 || xmlhttp.readyState == 3){
          window.alert("通信中です。");
          return false;
        }
      }
    },

    dataset: function(frm) {
      var postdata = new String();
      for(var i = 0 ; i < frm.elements.length ; i++){
        if(!frm.elements[i].disabled){
          postdata += "&";
          postdata += frm.elements[i].name;
          postdata += "=";
          postdata += frm.elements[i].value;
        }
      }
      if(postdata.length > 0){
        return postdata.substring(1);
      }
    }
  }

  function XMLHttp(){};

  XMLHttp.create = function(){
    if(typeof ActiveXObject != "undefined"){
//      var ms = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
      var ms = new Array('Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.5.0');
      for (var x = 0; x < ms.length; x++) {
        try{
          return new ActiveXObject(ms[x]);
        }catch(e){}
      }
    }
    if(typeof XMLHttpRequest != "undefined"){
      return new XMLHttpRequest();
    }
    return null;
  };

  function pXsltProcesser() {};

  pXsltProcesser.prototype = {
    load: function(a) {
      try{
        if(typeof ActiveXObject != "undefined" && typeof GetObject != "undefined"){
          var b = new ActiveXObject("Microsoft.XMLDOM");
          b.async = false;
          b.load(a);
          return b;
        }else if(typeof XSLTProcessor != "undefined" && typeof XSLTProcessor.prototype.importStylesheet != "undefined"){
          var b =  document.implementation.createDocument("", "", null);
          b.async = false;
          b.load(a);
          return b;
        }
      }catch(c){}
    },

    Parser: function(a) {
      try{
        if(typeof ActiveXObject != "undefined" && typeof GetObject != "undefined"){
          var b = new ActiveXObject("Microsoft.XMLDOM");
          b.loadXML(a);
          return b;
        }else if(typeof DOMParser != "undefined"){
          return(new DOMParser()).parseFromString(a, "text/xml");
        }
      }catch(c){}
    },

    transformToHTML: function(xmlDoc, div, xslt){
      if(typeof xmlDoc.transformNode != "undefined"){
        div.innerHTML = xmlDoc.transformNode(xslt);
      }else if(typeof XSLTProcessor != "undefined" && typeof XSLTProcessor.prototype.importStylesheet != "undefined"){
        var c = new XSLTProcessor();
        c.importStylesheet(xslt);
        var d = c.transformToFragment(xmlDoc, window.document);
        div.innerHTML = "";
        div.appendChild(d);
      }else{
        var e = of(xmlDoc, xslt);
        div.innerHTML = e;
      }
    },

    asynchronousTransform: function(xmlDoc, div, xsltDoc) {
      if(xmlDoc == null) {
        $(div).innerHTML = "";
        return;
      }
      if(typeof xsltDoc == "string"){
        var xslt = this.Parser(xsltDoc);
      } else {
        var xslt = xsltDoc;
      }
      this.transformToHTML(xmlDoc, $(div), xslt);
    }
}

  function pCacheProcesser() {
    this.cache_ = new Array();
  };

  //pCacheProcesser.cache_ = new Object();

  pCacheProcesser.prototype = {
    getCached: function(a) {
      return this.cache_[a];
    },

    cache: function(a, b) {
      this.cache_[a] = b;
    }
}

  function $() {
    var elements = new Array();

    for (var i = 0; i < arguments.length; i++) {
      var element = arguments[i];
      if (typeof element == 'string') {
        element = document.getElementById(element);
      }

      if (arguments.length == 1) {
        return element;
      }

      elements.push(element);
    }

    return elements;
  }

  function pConst() {
    var w = window;
    w.pXmlHttp = pXmlHttpProcesser;
    w.pXslt = pXsltProcesser;
    w.pCache = pCacheProcesser;
    w.$ = $;
  };

  pConst();

}; PonponNamespace();
