function createRequestObject()
{
  var http_request = null;
  if(window.XMLHttpRequest) // Mozilla, Safari, IE 7...
  {
    http_request = new XMLHttpRequest();
  }
  else if(window.ActiveXObject)
  {
    try
    {
      http_request = new ActiveXObject("Msxml2.XMLHTTP"); // IE 6
    }
    catch (e)
    {
      try
      {
        http_request = new ActiveXObject("Microsoft.XMLHTTP"); // IE 5
      }
      catch (e)
      {
        /* 使用者的瀏覽器太舊或是太稀有, 提示他換瀏覽器吧 */
      }
    }
  }
  return http_request;
}

function toQueryString(postObject)
{
  var signAND = "&amp;".charAt(0);
  var queryString="";
  for(var key in postObject)
  {
    queryString += signAND;
    queryString += key + "=" + encodeURIComponent(postObject[key]);
  }
  return queryString.substr(signAND.length);
}

function toJSON(unknownObject)
{
  var json = "undefined";
  var typeStr = typeof(unknownObject);
  if("boolean" == typeStr)
  {
    json = unknownObject.toString();
  }
  else if("number" == typeStr)
  {
    json = unknownObject.toString();
  }
  else if("string" == typeStr)
  {
    json = '\"' + encodeURIComponent(unknownObject) + '\"';
  }
  else if(null == unknownObject)
  {
    json = "null";
  }
  else if(Boolean.prototype.isPrototypeOf(unknownObject))
  {
    json = unknownObject.valueOf();
  }
  else if(Number.prototype.isPrototypeOf(unknownObject))
  {
    json = unknownObject.valueOf();
  }
  else if(Date.prototype.isPrototypeOf(unknownObject))
  {
    json = unknownObject.valueOf();
  }
  else if(String.prototype.isPrototypeOf(unknownObject))
  {
    json = '\"' + encodeURIComponent(unknownObject.valueOf()) + '\"';
  }
  else if(Array.prototype.isPrototypeOf(unknownObject))
  {
    var list = [];
    for(var i=0; i<unknownObject.length; ++i)
    {
      list.push(toJSON(unknownObject[i]));
    }
    json = "[";
    if(list.length > 0)
    {
      json += list[0];
      for(var i=1; i<list.length; ++i)
      {
        json += "," + list[i];
      }
    }
    json += "]";
  }
  else if(Object.prototype.isPrototypeOf(unknownObject))
  {
    var list = [];
    for(var key in unknownObject)
    {
      list.push('\"' + encodeURIComponent(key.toString())
                     + '\":' + toJSON(unknownObject[key]));
    }
    json = "{";
    if(list.length > 0)
    {
      json += list[0];
      for(var i=1; i<list.length; ++i)
      {
        json += "," + list[i];
      }
    }
    json += "}";
  }
  return json;
}

function requestJSONXML(url, postObject, jsonHandler, domElement)
{
  var requestObject = createRequestObject();
  requestObject.open("POST", url, true);
  requestObject.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
  requestObject.onreadystatechange = function(){
    try
    {
      if(requestObject.readyState == 4)
      {
        if(requestObject.status == 200)
        {
          if(Function.prototype.isPrototypeOf(jsonHandler))
          {
            var json = "";
            var text = requestObject.responseText;
            if(text.length > 0)
            {
              json = eval("("+ text +")");
            }
            jsonHandler(json, domElement);
          }
        }
        requestObject = null;
      }
    }
    catch(ajax_exception)
    {
      alert(ajax_exception);
      alert(text);
      requestObject = null;
    }
  };
  var postXML = '<?xml version="1.0" encoding="utf-8" ?>';
  postXML += '<json>';
  postXML += toJSON(postObject);
  postXML += '</json>';
  requestObject.send(postXML);
}

function requestQueryString(url, postObject, jsonHandler, domElement)
{
  var requestObject = createRequestObject();
  requestObject.open("POST", url, true);
  requestObject.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded; charset=UTF-8");
  requestObject.onreadystatechange = function(){
    try
    {
      if(requestObject.readyState == 4)
      {
        if(requestObject.status == 200)
        {
          if(Function.prototype.isPrototypeOf(jsonHandler))
          {
            var json = "";
            var text = requestObject.responseText;
            if(text.length > 0)
            {
              json = eval("("+ text +")");
            }
            jsonHandler(json, domElement);
          }
        }
        requestObject = null;
      }
    }
    catch(ajax_exception)
    {
      alert(ajax_exception);
      alert(text);
      requestObject = null;
    }
  };
  requestObject.send(toQueryString(postObject));
}

