maggot.load("query.js");

maggot.form = {};
maggot.form.get = function(form, name) {
  if (typeof (form) == "string")
    form = maggot.query("form[@name='" + form + "']");
  return maggot.query("*[@name='" + name + "']", form);
}
maggot.form.value = function(form, name) {
  return maggot.form.get(form, name).map(function(el) {
    switch (el.tagName.toUpperCase()) {
      case "INPUT":
        switch ((el.getAttribute("type") || "").toLowerCase()) {
          case "checkbox":
          case "radio":
            return (el.checked ? el.value : null);
          default:
            return el.value;
        }
        break;
      case "TEXTAREA":
        return el.value;
      case "SELECT":
        var _value = [];
        for (var i = 0; i < el.options.length; i++)
          if (el.options[i].selected)
          _value[_value.length] = el.options[i].value;
        return (_value.length ? _value : null);
    }
  }).extract().filter(function(v) { return v != null && typeof (v) != "undefined"; });
}
maggot.form.validate = function(form, requires, numbers) {
  requires = requires || {};
  numbers = numbers || {};
  for (var key in requires) {
    if (maggot.form.value(form, key).trim().length == 0) {
      //if(maggot.form.get(form, key).length != maggot.form.value(form, key).trim().length){
      alert(requires[key]);
      maggot.form.get(form, key).map(function(el) { try { el.focus(); } catch (ex) { } });
      return false;
    }
  }
  for (var key in numbers) {
    if (false == /^\d+$/.test(maggot.form.value(form, key).join(""))) {
      alert(numbers[key]);
      maggot.form.get(form, key).map(function(el) { try { el.focus(); } catch (ex) { } });
      return false;
    }
  }
  return true;
}
maggot.form.pack = function(form) {
  if (typeof (form) == "string")
    form = document.forms[form];
  var elements = maggot.query('input', form).concat(maggot.query('textarea', form)).concat(maggot.query('select', form));
  var postdata = {};
  elements.map(function(el) { if (el.name != "") postdata[el.name] = 1; });
  for (var name in postdata) {
    postdata[name] = maggot.form.value(form, name);
  }
  return postdata;
}
maggot.form.request = function(form, async, callback, callbackArg) {
  if (typeof (form) == "string")
    form = document.forms[form];
  var postdata = maggot.form.pack(form);
  maggot.ajax.request((form.method || 'get').toUpperCase(), form.action || location.href.split('#')[0], async, postdata, callback, callbackArg);
}
maggot.ajax = {};
maggot.ajax.utf8 = false;
maggot.ajax.request = function(method, url, async, postdata, callback, callbackArg) {
  function encodeParam(p) {
    if (maggot.ajax.utf8)
      return encodeURIComponent(typeof(p) == "function" ? p() : p);
    else
      return escape(typeof(p) == "function" ? p() : p).replace(/\+/g, "%2B");
  }
  async = async || false;
  var formData = null;
  var x = Function.failover(
     function() { return new XMLHttpRequest(); }
    , function() { return new ActiveXObject("microsoft.xmlhttp"); }
  );
  if (x == null)
    return;
  if (async) {
    x.onreadystatechange = function() {
      switch (x.readyState) {
        case 4:
          if(callback)
            callback.apply(x, callbackArg || []);
          break;
      }
    }
  }
  x.open(method, url, async);
  if (method == "POST") {
    x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + (maggot.ajax.utf8 ? "utf-8" : "euc-kr"));
    var buffer = [];
    for (var key in postdata) {
      if (postdata[key].constructor == Array && postdata[key].length) {
        buffer[buffer.length] = postdata[key].map(function(a) { return key + "=" + encodeParam(a); }).join("&");
      } else {
        buffer[buffer.length] = key + "=" + encodeParam(postdata[key]);
      }
    }
    formData = buffer.join("&");
  }
  x.send(formData);
  if (false == async) {
    if(callback)
      callback.apply(x, callbackArg || []);
  }
}
//set loading flag to true
maggot.loaded['form.js'] = true;
