// need eventlib.js
// and gridasGridObj = gridObject for changeData()
/////////////////////////////////////////////////////
var actualEdit = new Object();
/////////////////////////////////////////////////////
function prepareEdit(id, row, cell, dataArray){
	actualEdit.id = id;
	actualEdit.row = parseInt(row); //
	actualEdit.cell = parseInt(cell);
	actualEdit.data = dataArray;
	var obj = document.getElementById(id +".data.item:" + actualEdit.row);
	if(document.getElementById("editZone")) endEdit();
	var nX = document.createElement("DIV");
	nX.id="editZone";
	nX.className ="active-edit-mode";
	nX.style.position = "absolute";
	var corrector = (document.all) ? -2 : 0;
	nX.style.top = (_absTop(obj)+ corrector) +"px";
	nX.style.left = _absLeft(obj) + "px";
	nX.style.width = obj.offsetWidth;
	nX.style.height = obj.offsetHeight;

	// first dummy input
	var iX = document.createElement("INPUT");
	iX.id = "upper";
	iX.style.width = "1px";
	iX.style.border = "none";
	addEvent(iX, "focus", moveVertical);
	nX.appendChild(iX);

	// all inputs
	var kids = obj.childNodes;
	for (var i=0; i<kids.length; i++) {
	    var iX = document.createElement("INPUT");
	    iX.id = "ed_"+i;
	    iX.value = dataArray[actualEdit.row][i];
		iX.setAttribute("autocomplete","OFF"); // to avoid 'NS_ERROR_XPC_JS_THREW_STRING'
	    iX.style.width = obj.childNodes[i].offsetWidth;
	    iX.style.height = obj.childNodes[i].offsetHeight;
	    iX.style.border = "inset 1px";
	    iX.className=obj.childNodes[i].className;
	    iX.className = "";
	    iX.setAttribute("row", actualEdit.row);
	    iX.setAttribute("cell", actualEdit.cell);
	    nX.appendChild(iX);
	}
	// last dummy input
	var iX = document.createElement("INPUT");
	iX.id = "downer";
	iX.style.width = "1px";
	iX.style.border = "none";
	addEvent(iX, "focus", moveVertical);
	nX.appendChild(iX);

	var nodeX = document.body.appendChild(nX);
	addEvent(nodeX, "keydown", dKey);
	document.getElementById("ed_"+cell).focus();
	document.getElementById("ed_"+cell).select();
}

/////////////////////////////////////////////////////
function changeData(row){
	for(var i=0; i<actualEdit.data[row].length; i++){
		actualEdit.data[row][i] = document.getElementById("ed_"+i).value;
	}
	gridasGridObj.setProperty("selection/index", -1);
	gridasGridObj.getTemplate("row", row).refresh();
}

/////////////////////////////////////////////////////
function moveVertical(e){
	changeData(actualEdit.row);
	var newRow = 0;
	if(e == 1 || e == -1){
		newRow = actualEdit.row + e;
	}else{
		var obj = (document.all) ? window.event.srcElement : e.target;
		if(obj.id == "downer"){
			newRow = actualEdit.row+1;
			actualEdit.cell = 0;
		}else if(obj.id == "upper"){
			newRow = actualEdit.row-1;
			actualEdit.cell = actualEdit.data[0].length-1;
		}
	}
	newRow = (newRow<0) ? 0 : newRow;
	newRow = (newRow>actualEdit.data.length-1)? newRow-1 : newRow;
	prepareEdit(actualEdit.id, newRow, actualEdit.cell, actualEdit.data);
	return _noBubbling(e);
}

/////////////////////////////////////////////////////
function endEdit(){
	if(document.getElementById("editZone")){
		document.body.removeChild(document.getElementById("editZone"));
		removeEvent(document.body, "keydown", dKey);
	}
}
/////////////////////////////////////////////////////
function dKey(e){
//	alert(e.keyCode);
	switch(e.keyCode){
		case 27: // esc
			_noBubbling(e);
			endEdit();
		break;
		case 113: // ??
		break;
		case 37: // left
		break;
		case 39: // right
		break;
		case 38: // up
			moveVertical(-1);
		break;
		case 13: // enter = down
			//var dir = (e.shiftKey) ? -1 : 1 ;
			var dir = (e.shiftKey) ? -1 : 1 ;
		case 40: // down
			if(typeof(dir)=="undefined")
				var dir=1;
			moveVertical(dir);
		break;
		case 9: // tab = right or (+shift) left
		break;
		default:
		break;
	}
}
/////////////////////////////////////////////////////
// just in case of row move or resize:
attachAllx("endEdit");
