if(!window.DHTMLSuite)var DHTMLSuite = new Object();
DHTMLSuite.textEdit = function()
{
var layoutCSS;			// Name of css file
var elements;			// Array of editable elements
var elementsAssociative;	// Associative version of the array above - need two because of conflicts with Prototype library when using for in loops.
var serversideFile;		// Path to file on the server where changes are sent.
var objectIndex;
var inputObjects;		// Array of inputs or select boxes
var escPressed;
this.layoutCSS = 'text-edit.css';
this.elements = new Array();
this.elementsAssociative = new Array();
this.inputObjects = new Array();
this.escPressed = false;
try{
  if(!standardObjectsCreated)DHTMLSuite.createStandardObjects();
}catch(e){
  alert('You need to include the dhtmlSuite-common.js file');
}
this.objectIndex = DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects.length;
DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[this.objectIndex] = this;
}

DHTMLSuite.textEdit.prototype =
{

setLayoutCss:function(layoutCSS)
{
  this.layoutCSS = layoutCSS;
}
,
setServersideFile:function(serversideFile)
{
  this.serversideFile = serversideFile;
}
,
addElement:function(inputArray)
{
var index = this.elements.length;
// Checks if the element already exists
var exists = false;
for(var n = 0; n < index; n++) {
  if(this.elements[n].elementId == inputArray['elementId']) {
    exists = true;
	index = n;
	//alert("Exists: "+ n);
	break;
  }
}
try{
  this.elements[index] = new DHTMLSuite.textEditModel(inputArray);
}catch(e){
  alert('Error: You need to include dhtmlSuite-textEditModel.js in your html file');
  return -1;
}
this.elementsAssociative[inputArray['elementId']] = this.elements[index];
return index;
},

addElementAndInit:function(inputArray)
{
	var no = this.addElement(inputArray);
	if(no >= 0)
	  this.initElement(no);
},

init:function()
{
DHTMLSuite.commonObj.loadCSS(this.layoutCSS);
for(var no=0;no<this.elements.length;no++){
  this.initElement(no);
}
},

initElement:function(no) {
  var index = this.objectIndex;
  var obj = this.elements[no];
  if(typeof(obj.labelId) == "string") {
    var label = document.getElementById(obj.labelId);
	if(label) {
      label.setAttribute('elementId',obj.elementId);
      if(!label.getAttribute('elementId'))
	    label.elementId = obj.elementId;
      if(label.className){
        label.setAttribute('origClassname',label.className);
        label.origClassname = label.className;
      }
      label.onclick = function(e){ DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__clickOnLabel(e); }
      DHTMLSuite.commonObj.__addEventElement(label);
	}
  }
  var el = document.getElementById(obj.elementId);
  
  if(!el)
    return;

  el.setAttribute('keepValue', el.innerHTML.replace(/<br>/gi,"\n"));
  el.setAttribute('origValue', el.innerHTML.replace(/<br>/gi,"\n"));
  
  if(obj.isPassword) {
    var ssp = "";
    for(var n=0; n< el.innerHTML.length; n++)  ssp += "*";
    el.innerHTML = ssp;
  }
  if(typeof(obj.clearElement) == "string") {
    var clearel = document.getElementById(obj.clearElement);
    if(clearel) {
	  clearel.ownwerEditor = obj;
	  clearel.onclick = function (e) {
        var input = document.getElementById("input___"+ obj.elementId);
	    
		if(input.style.display == "none") {
		  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__resetInput(obj.elementId, "", true);
		}
		else {
		  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__resetInput(obj.elementId, "");
		  input.focus();
		}
		clearel.style.display = "none";
	  };
	  clearel.onmouseover = function () {
	    obj.noBlurEvent = true;
	  };
	  clearel.onmouseout = function () {
	    obj.noBlurEvent = false;
	  };
	}
  }

  DHTMLSuite.commonObj.__addEventElement(el);
  if(el){
    el.onclick = function(e) { DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__clickOnElement(e); }
    if(obj.listModel){	/* List model exists - create select box */
	  el.setAttribute('keepIndex', -1);
	  el.setAttribute('keepOptionValue', "");
	  
      this.inputObjects[obj.elementId] = document.createElement('SELECT');
      var selObj = this.inputObjects[obj.elementId];
	  if(obj.editClassName)
	    selObj.className = obj.editClassName;
	  else
        selObj.className = 'DHTMLSuite_textEdit_select';
      for(var no2=0;no2<obj.listModel.options.length;no2++){
        selObj.options[selObj.options.length] = new Option(obj.listModel.options[no2].text,obj.listModel.options[no2].value);
		if(obj.listModel.options[no2].text == el.getAttribute("keepValue")) {
		  el.setAttribute('keepIndex', no2);
	  	  el.setAttribute('keepOptionValue', obj.listModel.options[no2].value);
		}
      }
	  el.setAttribute('origIndex', el.getAttribute("keepIndex"));
      selObj.id = 'input___' + el.id;
	  selObj.ownerEditor = obj;
      selObj.onblur = function(e){
	    //if(DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].noBlurEvent)
		//  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].noBlurEvent = false;
		//else
	      DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__exitEditMode(e);
	  }
      selObj.onkeydown = function(e) {
        var keynum;
        if(window.event) // IE
        {
          e = event;
          keynum = event.keyCode;
        }
        else if(e.which) // Netscape/Firefox/Opera
        {
          keynum = e.which;
        }
        var obj = DHTMLSuite.commonObj.getSrcElement(e);	
        if(keynum == 13) {  // Enter Key
		  //DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].noBlurEvent = true;
          //DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__exitEditMode(e);
		  obj.blur();
        }
        else if(keynum == 27) {  // Esc key
		  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].escPressed = true;
          //DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__exitEditMode(e);
		  obj.blur();
        }
		else if(keynum == 9) {  // Tab key
		  setTimeout("DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects["+ index +"]._doTabElement("+ index +", '"+ obj.id +"')", 0);
		  e.cancelBubble = true;
          return false;
		}
      }

      DHTMLSuite.commonObj.__addEventElement(selObj);
      el.parentNode.insertBefore(selObj,el);
      selObj.style.display='none';
    }else{
	  if(obj.isTextArea)
	    this.inputObjects[obj.elementId] = document.createElement('TEXTAREA');
	  else 
        this.inputObjects[obj.elementId] = document.createElement('INPUT');
      var input = this.inputObjects[obj.elementId];
      input.onblur = function(e){
	    if(window.event) // IE
          e = event;
        var obj = DHTMLSuite.commonObj.getSrcElement(e);
		
	    //if(DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].noBlurEvent)
		//  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].noBlurEvent = false;
		//else
		  if(obj.ownerEditor.noBlurEvent) {
		    obj.focus();
			return false;
		  }
	      DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__exitEditMode(e);
	  }
      input.onkeydown = function(e) {
        var keynum;
        if(window.event) // IE
        {
          e = event;
          keynum = event.keyCode;
        }
        else if(e.which) // Netscape/Firefox/Opera
        {
          keynum = e.which;
        }
        var obj = DHTMLSuite.commonObj.getSrcElement(e);
		
        if(keynum == 13  &&  obj.tagName.toUpperCase() != "TEXTAREA") {  // Enter Key
		  obj.blur();
        }
        else if(keynum == 27) {  // Esc key
		  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].escPressed = true;
		  obj.blur();
        }
		else if(keynum == 9) {  // Tab key
		  setTimeout("DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects["+ index +"]._doTabElement("+ index +", '"+ obj.id +"')", 0);
		  e.cancelBubble = true;
          return false;
		}
      }
	  input.onkeyup = function(e) {
        var keynum;
        if(window.event) // IE
        {
          e = event;
          keynum = event.keyCode;
        }
        else if(e.which) // Netscape/Firefox/Opera
        {
          keynum = e.which;
        }
        var obj = DHTMLSuite.commonObj.getSrcElement(e);
		
		if(obj.tagName.toUpperCase() == "TEXTAREA"  &&  !obj.ownerEditor.fixedHeight) {
		  if(obj.scrollHeight > 20) {
	        if(obj.offsetHeight < obj.scrollHeight) {
			  var h = obj.scrollHeight + 6;
			  if(obj.ownerEditor.minHeight > h)
			    h = obj.ownerEditor.minHeight;
	          obj.style.height = h + "px";
		    }
		  }
	    }
		var elementId = obj.id.replace('input___', '');
		var dataSource = DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].elementsAssociative[elementId];
		
		if(keynum != 27  &&  (keynum != 13  ||  obj.tagName.toUpperCase() != "TEXTAREA") &&
																	dataSource.functionToCallOnType) {
		  dataSource.functionToCallOnType (elementId);
		}
      }
      DHTMLSuite.commonObj.__addEventElement(input);
	  if(obj.editClassName)
	    input.className = obj.editClassName;
	  else
        input.className = 'DHTMLSuite_textEdit_input';
      input.id = 'input___' + el.id;
	  input.ownerEditor = obj;
	  if(obj.isPassword)
	    input.type = "password";
      input.value = el.getAttribute("keepValue"); //el.innerHTML;
      el.parentNode.insertBefore(input,el);
      input.style.display='none';
    }
  }
},

_doTabElement:function(index, obj)
{
	if(typeof(obj) == "string")
      obj = document.getElementById(obj);
	  
	var els = DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].elements;
	var iini = els.length;
	// Checks if the element already exists
	for(var n = 0; n < iini; n++) {
	  if(els[n].elementId == obj.ownerEditor.elementId) {
	    iini = n;
		break;
	  }
	}
	var nobj, ishidden=false;
	ii = iini;
	do {
	  ++ii;
	  
	  if(ii >=  els.length)
	    ii = 0;
		
	  nobj = document.getElementById(els[ii].elementId);

	  if(nobj) {	  
	    ishidden = (nobj.style.display == "none");
	    while(!ishidden  &&  nobj.parentNode && nobj.tagName.toLowerCase()!='html') {
	      nobj = nobj.parentNode;
	      if(nobj.style.display == "none")
		    ishidden = true;
	    }
	  }
	  else
	    ishidden = true;
	} while (ishidden &&  ii != iini);
		
	if(!ishidden) {
	  DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[index].__editElement(els[ii].elementId);
	}
},

__setLabelClassName:function(obj,state)
{
if(state=='active')
  obj.className = 'DHTMLSuite_textEdit_label';
else{
  var className = '';
  className = obj.getAttribute('origClassname');
  if(!className)className = obj.origClassname;
  obj.className = className;
}
},

__clickOnLabel:function(e)
{
if(document.all)e = event;
var obj = DHTMLSuite.commonObj.getSrcElement(e);	// Reference to element triggering the event.
while(obj != null  &&  obj.tagName.toLowerCase() != "label"  &&  obj.tagName.toLowerCase() != 'html') {
    obj = obj.parentNode;
}
if(obj == null  ||  obj.tagName.toLowerCase() != "label")
  return;
this.__setLabelClassName(obj,'active');
var elementId = obj.getAttribute('elementId');
this.__clickOnElement(false,document.getElementById(elementId));
},

__clickOnElement:function(e,obj)
{
if(document.all)e = event;
if(!obj)var obj = DHTMLSuite.commonObj.getSrcElement(e);	// Reference to element triggering the event.

while(obj != null  &&  obj.tagName.toLowerCase() != "div"  &&  obj.tagName.toLowerCase() != 'html') {
    obj = obj.parentNode;
}
if(obj == null  ||  obj.tagName.toLowerCase() != "div")
  return;

this.__editElement(obj);
},

__editElement:function(obj) {
if(typeof(obj) == "string")
  obj = document.getElementById(obj);
var id = obj.id;

var dataSource = this.elementsAssociative[id];

if(dataSource.functionToValidateEdit) {
  if(!dataSource.functionToValidateEdit (dataSource.elementId)) {
    if(dataSource.labelId)this.__setLabelClassName(document.getElementById(dataSource.labelId),'inactive');
    return;
  }
}

if(dataSource.listModel) {
  this.__setSelectBoxValue(id,obj.innerHTML);
}
else {
  if(dataSource.isTextArea) {
    this.inputObjects[id].value = obj.innerHTML.replace(/<br>/gi,"\n"); 
  }
  else
    this.inputObjects[id].value = obj.getAttribute("keepValue"); //obj.innerHTML; 
}
if(dataSource.labelId)this.__setLabelClassName(document.getElementById(dataSource.labelId),'active');
var ww = obj.offsetWidth;
var hh = obj.offsetHeight;
this.inputObjects[id].style.display='';

this.escPressed = false;
obj.style.display='none';
this.inputObjects[id].style.width = (ww) + "px";
if(dataSource.isTextArea) {
  if(DHTMLSuite.clientInfoObj.isMSIE  || DHTMLSuite.clientInfoObj.isOldMSIE) {
    if(dataSource.fixedHeight) {
	  this.inputObjects[id].style.height = dataSource.fixedHeight + "px";
	}
	else if(dataSource.minHeight) {
	  var h = this.inputObjects[id].scrollHeight + 6;
	  if(dataSource.minHeight > h)
	    h = dataSource.minHeight;
	  this.inputObjects[id].style.height = h+"px";
	}
	else {
      this.inputObjects[id].style.height = "auto";
      this.inputObjects[id].style.overflow = "visible";
	}
  }
  else
    this.inputObjects[id].style.height = (hh) + "px";
}
this.inputObjects[id].focus();

if(!dataSource.listModel)this.inputObjects[id].select();
if(dataSource.functionToCallOnEdit) {
  dataSource.functionToCallOnEdit (dataSource.elementId);
}
},

__setSelectBoxValue:function(id,value)
{
var selObj = this.inputObjects[id];
for(var no=0;no<selObj.options.length;no++){
  if(selObj.options[no].text==value){
    selObj.selectedIndex = no;
    return;
  }
}
},

__exitEditMode:function(e)
{
if(document.all  &&  !e) {
  e = event;
}
var obj = DHTMLSuite.commonObj.getSrcElement(e);	// Reference to element triggering the event.
var elementId = obj.id.replace('input___','');
var dataSource = this.elementsAssociative[elementId];
var newValue = undefined;
var valueToSendToAjax;
if(dataSource.listModel){
  newValue = obj.options[obj.options.selectedIndex].text;
  valueToSendToAjax = obj.options[obj.options.selectedIndex].value;
}else{
  newValue = obj.value;
  valueToSendToAjax = newValue;
  if(dataSource.isTextArea)
	newValue = newValue.replace(/\n/g,"<br>");
}

var keynum = 0;
if(e.keyCode) // IE
   keynum = e.keyCode;
else if(e.which) // Netscape/Firefox/Opera
   keynum = e.which;
if(this.escPressed) {
  this.escPressed = false;
  keynum = 27;
}

if(keynum  &&  keynum==27) {
  newValue = document.getElementById(dataSource.elementId).getAttribute("keepValue"); //innerHTML;
  if(dataSource.listModel) {
	this.__setSelectBoxValue(elementId, newValue);
  }
  else {
	if(dataSource.isTextArea)
	  obj.value = newValue.replace(/<br>/gi, "\n"); 
	else
	  obj.value = newValue;
  }
}
var callfunc = false;
if(newValue != undefined  &&  newValue != document.getElementById(dataSource.elementId).getAttribute("keepValue")) { //innerHTML) {
  this.__sendRequest(dataSource.elementId, valueToSendToAjax);	// Send ajax request when changes has been made.
  callfunc = true;
}


document.getElementById(dataSource.elementId).setAttribute("keepValue", newValue); //innerHTML = newValue;

if(dataSource.listModel) {
  document.getElementById(dataSource.elementId).setAttribute("keepIndex", obj.options.selectedIndex);
  document.getElementById(dataSource.elementId).setAttribute("keepOptionValue", obj.options[obj.options.selectedIndex].value);
}
if(dataSource.isPassword) {
  var ssp = "";
  for(var n=0; n< newValue.length; n++)  ssp += "*";
  document.getElementById(dataSource.elementId).innerHTML = ssp;
}
else {
  document.getElementById(dataSource.elementId).innerHTML = newValue;
}
document.getElementById(dataSource.elementId).style.display='';
if(dataSource.isTextArea) {
  var h = document.getElementById(dataSource.elementId).scrollHeight;
  if(h < 16) h = 16;
  if(dataSource.minHeight  &&  h < dataSource.minHeight)
    h = dataSource.minHeight;
  document.getElementById(dataSource.elementId).style.height = h+"px";
}
obj.style.display='none';

if(dataSource.labelId)this.__setLabelClassName(document.getElementById(dataSource.labelId),'inactive');

if(callfunc &&  dataSource.functionToCallOnChange) {
  dataSource.functionToCallOnChange (dataSource.elementId, valueToSendToAjax);
}

if(!callfunc &&  dataSource.functionToCallOnCancel) {
  dataSource.functionToCallOnCancel (dataSource.elementId);
}

},

__resetInput:function(elementId, whichvalue, callevent)
{
	var dataSource = this.elementsAssociative[elementId];
	var obj = document.getElementById(dataSource.elementId);
	var value = obj.getAttribute("origValue");
	var ind = obj.origIndex;
	if(whichvalue != undefined  &&  whichvalue != null) {
	  if(dataSource.listModel) {
	    for(var n = 0; n < dataSource.listModel.options.length; n++) {
		  //alert(dataSource.listModel.options[n].value +" = "+ whichvalue );
		  if(dataSource.listModel.options[n].value+0 == whichvalue+0) {
		    ind = n;
			break;
		  }
		}
		//alert(elementId + ": "+ ind);
		if(ind >= 0)
	      value = dataSource.listModel.options[ind].text;
	  }
	  else
	    value = whichvalue;
	}
	obj.innerHTML = value;
	obj.setAttribute("keepValue", value);

	if(dataSource.listModel) {
	  this.__setSelectBoxValue(elementId, value);
	  this.inputObjects[elementId].selectedIndex = ind;
	  obj.setAttribute("keepIndex", ind);
	  if(ind >= 0)
	    obj.setAttribute("keepOptionValue", dataSource.listModel.options[ind].value);
	  else
	    obj.setAttribute("keepOptionValue", "");
    }
	else {
	  this.inputObjects[elementId].value = value;
	}
	if(callevent == true  &&  dataSource.functionToCallOnChange) {
      dataSource.functionToCallOnChange (dataSource.elementId, value);
	}
},

__sendRequest:function(elementId,value)
{
var index = DHTMLSuite.variableStorage.ajaxObjects.length;
var ind = this.objectIndex;
var url;
if(this.elementsAssociative[elementId].serverFile)
  url = this.elementsAssociative[elementId].serverFile;
else
  url = this.serversideFile;
if(!url)
  return;

try{
  DHTMLSuite.variableStorage.ajaxObjects[index] = new sack();
}catch(e){	// Unable to create ajax object - send alert message and return from sort method.
  alert('Unable to create ajax object. Please make sure that the sack js file is included on your page');
  return;
}

if(url.indexOf('?')>=0)url=url+'&'; else url=url+'?';
url = url + 'saveTextEdit=1&textEditElementId=' + elementId + '&textEditValue='+escape(value);
DHTMLSuite.variableStorage.ajaxObjects[index].requestFile = url;	// Specifying which file to get
DHTMLSuite.variableStorage.ajaxObjects[index].onCompletion = function(){ DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[ind].__handleServerSideResponse(index,url); };	// Specify function that will be executed after file has been found
DHTMLSuite.variableStorage.ajaxObjects[index].onError = function(){ DHTMLSuite.variableStorage.arrayOfDhtmlSuiteObjects[ind].__handleAjaxError(index,url); };	// Specify function that will be executed after file has been found
DHTMLSuite.variableStorage.ajaxObjects[index].runAJAX();		// Execute AJAX function
},

__handleServerSideResponse:function(ajaxIndex,url)
{
if(DHTMLSuite.variableStorage.ajaxObjects[ajaxIndex].response!='OK'){
  alert('An error occured in the textEdit widget when calling the url\n' + url);
}
DHTMLSuite.variableStorage.ajaxObjects[ajaxIndex] = null;
},

__handleAjaxError:function(ajaxIndex,url)
{
alert('Error when calling the url:\n' + url);
DHTMLSuite.variableStorage.ajaxObjects[ajaxIndex] = null;
}

}
