svnwikiInlineEdit = new Object();

svnwikiInlineEdit.copyContent = function (src, dst) {
  while (src.hasChildNodes()) {
    dst.appendChild(document.importNode(src.firstChild, true));
    src.removeChild(src.firstChild);
  }
}

svnwikiInlineEdit.container = null;
svnwikiInlineEdit.path = null;

svnwikiInlineEdit.loadForm = function (container, section, path, create) {
  svnwikiInlineEdit.container = document.getElementById(container);
  svnwikiInlineEdit.path = path;
  var meta = document.getElementById('inline-edit-form');
  if (!meta)
    return false;
  svnwikiJavascript.cleanContent(meta);
  meta.appendChild(svnwikiJavascript.makeElement('p', document.createTextNode('Loading edit form...')));
  svnwikiInlineEdit.showWithCover('inline-edit-form');
  var url = svnwikiData.URLHTTP + "/" + path;
  url += "?action=edit&lightweight=y&section=" + section;
  if (create)
    url += "&create=true";
  svnwikiJavascript.loadXml(url, svnwikiInlineEdit.showResults);
  return true;
}

svnwikiInlineEdit.sendForm = function () {
  var meta = document.getElementById('inline-edit-form');
  var form = svnwikiInlineEdit.findForm(meta);
  var url = form.getAttribute('action');
  var data = svnwikiInlineEdit.getFormData(form) + 'lightweight=y';

  try {
    svnwikiJavascript.loadXml(url, svnwikiInlineEdit.showResults, data);
  }
  catch (e) {
    // Probably a violation of the same-origin policy:
    return false;
  }

  // Must do this after calling loadXml in case loadXml fails:
  svnwikiJavascript.cleanContent(meta);
  meta.appendChild(svnwikiJavascript.makeElement('p', document.createTextNode('Sending data...')));
  svnwikiInlineEdit.updatePosition('inline-edit-form');
  return true;
}

svnwikiInlineEdit.showResults = function (xmlDoc) {
  var meta = document.getElementById('inline-edit-form');
  if (!meta)
    return false;
  svnwikiJavascript.cleanContent(meta);

  if (!xmlDoc) {
    meta.appendChild(svnwikiJavascript.makeElement('p', document.createTextNode('There was a problem saving your changes (failed to parse response from server).')));
    return false;
  }

  var body = xmlDoc.getElementById('edit-body');
  if (body) {
    svnwikiJavascript.cleanContent(svnwikiInlineEdit.container);
    svnwikiInlineEdit.copyContent(body, svnwikiInlineEdit.container);
  }

  var metaSource = xmlDoc.getElementById('edit-meta');
  if (!metaSource) {
    svnwikiInlineEdit.hideCover();
    return true;
  }
  svnwikiInlineEdit.copyContent(metaSource, meta);
  form = svnwikiInlineEdit.findForm(meta);
  if (form)
    svnwikiSwitchIdentityAuthenticate(false, form.id, svnwikiInlineEdit.path);
  svnwikiInlineEdit.updatePosition('inline-edit-form');
}

svnwikiInlineEdit.findForm = function(meta) {
  var forms = meta.getElementsByTagName("form");
  if (forms.length < 1)
    return null;
  return forms[0];
}

svnwikiInlineEdit.getFormData = function (form) {
  var postStr = "";
  var elements = form.getElementsByTagName("input");
  for (i = 0; i < elements.length; i++) {
    var x = elements[i];
    if (x.type == "text" || x.type == "hidden") {
      postStr += x.name + "=" + encodeURIComponent(x.value) + "&";
      continue;
    }
    if (x.type == "checkbox") {
      postStr += x.name + "=";
      if (x.checked) {
        postStr += encodeURIComponent(x.value);
      }
      postStr += "&";
      continue;
    }
    if (x.type == "radio") {
      if (x.checked) {
        postStr += x.name + "=" + encodeURIComponent(x.value) + "&";
      }
      continue;
    }
  }
  var elements = form.getElementsByTagName("select");
  for (i = 0; i < elements.length; i++) {
    var x = elements[i];
    postStr += x.name + "=" + encodeURIComponent(x.options[x.selectedIndex].value) + "&";
  }
  var elements = form.getElementsByTagName("textarea");
  for (i = 0; i < elements.length; i++) {
    var x = elements[i];
    postStr += x.name + "=" + encodeURIComponent(x.value) + "&";
  }
  postStr += document.pressedName + "=" + encodeURIComponent(document.pressedValue) + "&";
  return postStr;
}

svnwikiInlineEdit.hideCoverData = []

svnwikiInlineEdit.hideCover = function () {
  for (i = 0; i < svnwikiInlineEdit.hideCoverData.length; i++) {
    svnwikiInlineEdit.hideCoverData[i].style.display = 'none';
    svnwikiJavascript.cleanContent(svnwikiInlineEdit.hideCoverData[i]);
  }
  svnwikiInlineEdit.hideCoverData = []
}

svnwikiInlineEdit.showWithCover = function (id) {
  svnwikiInlineEdit.updatePosition(id);
  var names = [id, 'cover']
  for (var i in names) {
    var obj = document.getElementById(names[i]);
    if (obj) {
      obj.style.display = '';
      svnwikiInlineEdit.hideCoverData.push(obj);
    }
  }
}

svnwikiInlineEdit.updatePosition = function (id) {
  var obj = document.getElementById(id);
  if (!obj)
    return;
  offset=window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
  obj.style.top=40+offset+'px';
}