/*--------------------------------------------------------------------------*
 *                                                                          *
 *  (JaCoM) Javascript Communication to MMBase API, version 0.2             *
 *  (c) 2005 Ruud Prein (ruud@submarine.nl)                                 *
 *  The methods are based on the prototype.js library                       *
 *                                                                          *
 *  This file is freely distributable under the terms of LGPL license.      *
 *                                                                          *
 *--------------------------------------------------------------------------*/

if(!MMAjax) var MMAjax = {
  // set node field with html form element newcontent
  setField: function(nodeId,fieldName,newValue,blockElementId) {
    var pars = 'nodeid='+encodeURIComponent(nodeId)+'&field='+encodeURIComponent(fieldName)+'&value='+encodeURIComponent(newValue);
    new Ajax.Updater(
    	blockElementId,
	this.saveUrl,{
	parameters: pars,
	onFailure: showError
	}
    );
    this.editing = false;
  }, // editing flag and urls
  editing: false,
  url:		'/ajax/info/field.jsp',
  saveUrl:	'/ajax/edit/field.jsp',
  // cancel setField
  setFieldCancel: function(blockElementId,pars) {
    new Ajax.Updater(
    	blockElementId,
	this.url,{
	parameters: pars,
	onFailure: showError
	}
    );
    this.editing = false;
  },
  //  Field Info
  fieldInfo: function(blockElementId,pars) {
    new Ajax.Updater(
    	blockElementId,
	this.url,{
	parameters: pars,
	onFailure: showError
	}
    );
    this.editing = false;
  }
};
MMAjax.MMField = Class.create();

MMAjax.MMField.prototype = {
  initialize: function(element, nodeId) {
    // init global params
    this.element = $(element);
    this.nodeId = nodeId;
    this.pars = '';
    this.content = 'Please wait...';
    // init options params, may be overridden by second argument
    this.options = Object.extend({
      name:	'name',
      value:	'empty',
      type:	'input',
      save:	'SAVE',
      cancel:	'CANCEL'
    }, arguments[2] || {});
    // set ajax url params
    this.setParameters();
    // initialize ajax updater
    MMAjax.fieldInfo(this.element,this.pars);
    // assigning method to the event on double click event
    this.element.ondblclick = this.initEdit.bindAsEventListener(this);
  }, // returns current node number
  node: function() {
    return this.nodeId;
  }, // reset node number
  setNode: function(newNumber) {
    this.nodeId = newNumber;
    this.setParameters();
  }, // return current xmlhttprequest parameters
  parameters: function() {
    return this.pars;
  }, // set parameter for xmlhttprequest
  setParameters: function() {
    this.pars = 'nodeid=' + this.nodeId + '&field=' + this.options.name;
    if (this.options.value!='empty') this.pars += '&value='+this.options.value;
  }, // set postbody (multi) part
  setBody: function(name, value, boundary) {
    var newline = "\x0D\x0A";
    var body = '--' + boundary + newline;
    body += 'Content-Disposition: form-data; name="' + name + '"' + newline + newline;
    body += value + newline;
    return body;
  }, // set element content
  setContent: function() {
    this.content = this.element.innerHTML;
  }, // set input html form to modify node field value
  form: function() {
    var formHTML = '<form enctype="multipart/form-data" onsubmit="MMAjax.setField('+this.node()+',\''+this.options.name+'\',this.newcontent.value,\''+this.element.id+'\'); return false;">';
    if (this.options.type=='textarea') {
      formHTML += '<textarea id="newcontent" name="newcontent" style="width: 99%; height: 150px;">' + this.content + '</textarea><br/>';
    } else {
      formHTML += '<input type="text" id="newcontent" name="newcontent" value="' + this.content + '" style="width: 100%"/>';
    }
    formHTML += '<input type="submit" class="button" value="' + this.options.save + '" \/>&nbsp;&nbsp;or&nbsp;&nbsp;<input type="button" class="button" value="' + this.options.cancel + '" onclick="MMAjax.setFieldCancel(\''+this.element.id+'\',\''+this.parameters()+'\');" \/><\/form>';
    formHTML += '</form>';
    return formHTML;
  }, //stop editing node field value
  stopEditing: function(ev) {
    MMAjax.editing = false;
  }, // start editing node field value
  startEditing: function(ev) {
    MMAjax.editing = true;
    this.element.innerHTML = this.form();
  }, // init editing node field value
  initEdit: function(ev) {
    this.setContent();
    MMAjax.editing ? this.stopEditing(ev):this.startEditing(ev);
  }
}
/* globals */
editChildrenUrl = '/ajax/custom/children.jsp';
editChildren2Url = '/ajax/custom/children2.jsp';
// verbose
function showError(e) {
	alert("POST error, your changes are not saved");
}
