// depends on common.js: QQ,addEvent,ajaxRequest,obj,removeEvent,toggleOn and String.js
QQ.InPlaceEditor = function(settings){

	var dispatcherID = settings.dispatcherID;	// obligatory
	var elementID = settings.elementID;
	var url = settings.url;	// obligatory
	var cols = settings.cols;
	var rows = settings.rows;
	var className = settings.className;
	var okButtonID = settings.okButtonID;	// when given also cancelButtonID necessary
	var cancelButtonID = settings.cancelButtonID; // when given also okButtonID necessary
	var selectInput = settings.selectInput;	// select all input
	var secure = settings.secure;
	
	//// handle defaults
	if (elementID === undefined) elementID = dispatcherID;
	if (cols === undefined) cols = 50;	
	if (rows === undefined) rows = 5;
	if (rows == 1 && className === undefined) className = "qqInputField";
	if (selectInput === undefined) selectInput = true;
	if (secure === undefined) secure = false;
	
	// function declarations
  var makeEditable;
  var saveChanges;
  var cancel;
  var makeNotEditable;
	
	var oldContent;
	
	makeEditable = function(){
		removeEvent(obj(dispatcherID),"click",makeEditable);
		
		if (dispatcherID != elementID)
			addEvent(obj(dispatcherID),"click",cancel);		
		
		var textarea;
		if (rows == 1){
			textarea = document.createElement("input");
		  if (secure) textarea.type = "password";
			else textarea.type = "text";
		}else{
			textarea = document.createElement("textarea");	    
	    textarea.cols = cols;
	    textarea.rows = rows;
		}
		textarea.id = elementID + "_editable";
    if (className != "") textarea.className = className;
		textarea.value = QQ.String.br2nl(QQ.String.trim(obj(elementID).innerHTML));
    oldContent = obj(elementID).innerHTML;

    var okButton;
    var cancelButton;
    
    if (okButtonID === undefined && cancelButtonID === undefined){
	    okButton = document.createElement("div");
	    okButton.innerHTML = "OK";
	    
	    cancelButton = document.createElement("div");
	    cancelButton.innerHTML = "Cancel";
	    
	    obj(elementID).appendChild(okButton);
		  obj(elementID).appendChild(cancelButton);

    }else{
    	okButton = obj(okButtonID);
    	cancelButton = obj(cancelButtonID);
    	toggleOn(okButton,true);
    	toggleOn(cancelButton,true);
    }
    
		addEvent(textarea,"keydown",function(evt){if (evt.keyCode == 13) saveChanges();}); // save on enter
    addEvent(okButton,"click",saveChanges);
    addEvent(cancelButton,"click",cancel);		    
    
    obj(elementID).innerHTML = "";
		obj(elementID).appendChild(textarea);
		if (selectInput) obj(textarea.id).select();	
	};	
		
	addEvent(obj(dispatcherID),"click",makeEditable);	
		
	saveChanges = function(){
		var newData = QQ.String.nl2br(QQ.String.trim(obj(elementID + "_editable").value));
		var data = "data=" + newData;
		QQ.Ajax.request(url,{data:data,method:"post"});
		if (secure) obj(elementID).innerHTML = oldContent;
		else obj(elementID).innerHTML = newData;
		makeNotEditable();
	};
	
	cancel = function(){
		obj(elementID).innerHTML = oldContent;
		makeNotEditable();		
	};
	
	makeNotEditable = function(){			
		removeEvent(obj(dispatcherID),"click",cancel);
		addEvent(obj(dispatcherID),"click",makeEditable);
		
		if (okButtonID !== undefined || cancelButtonID !== undefined){
			toggleOn(obj(okButtonID),false);
			toggleOn(obj(cancelButtonID),false);
		}
	}; 	
};
