function setText(element, text) {
    
    if (element.nodeName == 'INPUT' || element.nodeName == 'TEXTAREA') {
        element.value = text;
        return;
    }
    
    //alert("ID : " + element.getAttribute('id') + ' / ' + insertText + ' / ' + element.nodeName);
    //    element.innerHTML = '' + text;
    var textNodes = new Array();
    var count = 0;
    for (var i = 0; i < element.childNodes.length; i++) {
        if (element.childNodes[i].nodeType == 3) {
            textNodes[count++] = element.childNodes[i];
        }
    }
    
    for (var i = 0; i < textNodes.length; i++) {
        element.removeChild(textNodes[i]);
    }
    
    var tn = element.ownerDocument.createTextNode(text);
    element.appendChild(tn);
}

function nop(){
// do nothing
}

function setFocus(elementId) {
    //alert('focus : ' + elementId);
    document.getElementById(elementId).focus();
}

InlineEdit = function(fh) {
    this.formHandler = fh;
    this.fieldList = new Array();
    this.editList = new Array();
    this.formList = new Array();
    this.modifiedFlag = false;
    this.editListener = new Array();
    this.enableEdit = false;
    this.editActive = false;
    this.formEdit = false;
}

InlineEdit.prototype.editElementStub = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.editElement(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

InlineEdit.prototype.editElement = function(evt) {
    var elem = (evt.target) ? evt.target : evt.srcElement;
    var elementId = elem.getAttribute('id');
    //alert('editElement : ' + elementId);

    this.edit(elem);
    this.modifiedFlag = true;

    this.fireEditEvent();
}

InlineEdit.prototype.keyHandlerStub = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.keyHandler(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

InlineEdit.prototype.keyHandler = function (evt) {
    var elem = (evt.target) ? evt.target : evt.srcElement;
    var elementId = elem.getAttribute('name');
    
    if (evt.keyCode == 9) {
        if (!this.formEdit) {
            var nextElement = this.formHandler.nextEditElement(elementId);
            var nextElementId = nextElement.getAttribute('id');
            this.editDone(elementId);
            var ef = this.edit(nextElement);
            setTimeout(this.focusElementStub(ef), 500);
        }
    }

    if (evt.keyCode == 13) {
        if (!this.formEdit) {
            this.editDone(elementId);
        }
    }
    
    if (evt.keyCode == 27) {
        if (!this.formEdit) {
            this.editCancel(elementId);
        }
    }
}


InlineEdit.prototype.addEditListener = function(listener) {
    this.editListener.push(listener);
}

InlineEdit.prototype.edit = function(currentField) {
    if (!this.enableEdit)
        return;
    
    if (this.editActive && !this.formEdit)
        return;
    
    this.editActive = true;
    window.focus();
    var id = currentField.getAttribute('id');
    //alert('Id : ' + id);
    this.fieldList[id] = currentField;
    
    var parent = currentField.parentNode;
    //    var form = document.createElement('form');
    //    this.formList[id] = form;
    //form.setAttribute('action', 'javascript:editDone("' + id + '")')
    //    form.setAttribute('action', 'javascript:nop()');
    //    form.setAttribute('name', id + 'Form');
    var editField = document.createElement('input');

    this.editList[id] = editField;
    //    form.appendChild(editField);
    editField.setAttribute('type', 'text');
    editField.setAttribute('name', currentField.getAttribute('id'));

	var fieldid = currentField.getAttribute('id');
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlFirstname' || fieldid == 'formContactManager:ContactDetailsPane:xmlName')
	{
		editField.setAttribute('size', '20');
		editField.setAttribute('maxlength', '20');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlEMail')
	{
		editField.setAttribute('size', '40');
		editField.setAttribute('maxlength', '40');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlZipCode')
	{
		editField.setAttribute('size', '15');
		editField.setAttribute('maxlength', '15');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlCity')
	{
		editField.setAttribute('size', '32');
		editField.setAttribute('maxlength', '32');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlStreet')
	{
		editField.setAttribute('size', '32');
		editField.setAttribute('maxlength', '32');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlCountry')
	{
		editField.setAttribute('size', '20');
		editField.setAttribute('maxlength', '20');
	}
	if(fieldid == 'formContactManager:ContactDetailsPane:xmlPhone__NT_WORK' || fieldid == 'formContactManager:ContactDetailsPane:xmlPhone__NT_MOBILE' || fieldid == 'formContactManager:ContactDetailsPane:xmlPhone__NT_HOME' || fieldid == 'formContactManager:ContactDetailsPane:xmlPhone__NT_OTHER')
	{
		editField.setAttribute('size', '20');
		editField.setAttribute('maxlength', '20');
	}
	
    editField.setAttribute('id', currentField.getAttribute('id') + 'Edit');
    var cls = '';
    if (currentField.className)
        cls = currentField.className;

    editField.className = cls;

    var hint = this.formHandler.getFormHint(id);
    if (hint && hint != null) {
        editField.onfocus = this.focusHintStub(editField, cls, hint);
        editField.onblur = this.blurHintStub(editField, hint);
    } 

    if (currentField.innerHTML == '--') {
        if (hint && hint != null) {
            editField.setAttribute('value', hint);
        } else {
            editField.setAttribute('value', '');
        }
    }
    else
        editField.setAttribute('value', currentField.innerHTML);
    
    var style = currentField.style;//getAttribute('style').toSource();
    
    //alert('Edit : ' + currentField.getAttribute('id') + ' / ' + style + ' / ' + typeof(style));
    //alert('W/H : ' + currentField.style.width + ' / ' + currentField.style.height);
    //editField.setAttribute('style', style);
    
    if (typeof(currentField.style['cssText']) != 'undefined' && currentField.style['cssText'] != null && currentField.style['cssText'] != '') {
        //alert('Property : ' + 'cssText' + ' / ' + currentField.style['cssText']);
        editField.style['cssText'] = currentField.style['cssText'];
    }
    
    // Reduce width and height
    var w = parseInt(currentField.style.width) - 3;
    var h = parseInt(currentField.style.height) - 3;
    editField.style.width = w + 'px';
    editField.style.height = h + 'px';
    //alert('W/H : ' + editField.style.width + ' / ' + editField.style.height + ' / ' + editField.style.top + ' / ' + editField.style.left + ' / ' + editField.style.position);
    
    editField.onkeydown = this.keyHandlerStub();
    
    //editField.setAttribute('onkeydown', 'javascript:editHandler.editDone(' + id + ')');
    currentField.style.display = 'none';
    parent.appendChild(editField);
    
    editField.focus();
    return editField;
//setTimeout('setFocus("' + editField.getAttribute('id') + '")', 250);
}

InlineEdit.prototype.focusHintStub = function (elem, className, h) {
    var element = elem;
    var cls = className;
    var hint = h;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        if (element.value == hint) {
            element.value = '';
            element.className = cls;
        }
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

InlineEdit.prototype.focusElementStub = function (elem) {
    var element = elem;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        element.focus();
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

InlineEdit.prototype.blurHintStub = function (elem, h) {
    var element = elem;
    var hint = h;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        if (element.value == '') {
            element.value = hint;
            element.className = 'FormHint';
        }
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

InlineEdit.prototype.editDone = function(id) {
    //var code = window.event.keyCode;
    //alert('editDone : ' + id);
    var editField = this.editList[id];
    this.editList[id] = null;

    if (!editField || editField == null)
        return;

    var currentField = this.fieldList[id];
    var parent = currentField.parentNode;
    //var form = this.formList[id];
    //    alert('EditField : ' + editField.value);
    var hint = this.formHandler.getFormHint(id);
    if (!hint)
        hint = '';
    
    if (editField.value == '' || editField.value == hint)
        setText(currentField, '--');
    else
        setText(currentField, editField.value);

    editField.blur();

    parent.removeChild(editField);
    //currentField.parentNode.removeChild(form);
    currentField.style.display = 'inline';
    this.modifiedFlag = true;
    
    if (!this.formEdit) {
        this.editActive = false;
    }
}

InlineEdit.prototype.editCancel = function(id) {
    //var code = window.event.keyCode;
    //alert('editDone : ' + id);
    var editField = this.editList[id];
    this.editList[id] = null;
    
    if (!editField || editField == null)
        return;
    
    var currentField = this.fieldList[id];
    var parent = currentField.parentNode;
    //var form = this.formList[id];
    //    alert('EditField : ' + editField.value);

    editField.blur();

    parent.removeChild(editField);
    //currentField.parentNode.removeChild(form);
    currentField.style.display = 'inline';
    if (!this.formEdit) {
        this.editActive = false;
    }
}

InlineEdit.prototype.fireEditEvent = function() {
    for (var i = 0; i < this.editListener.length; i++) {
        if (this.editListener[i].handleEvent) {
            this.editListener[i].handleEvent(this, 'editEvent');
        }
    }
}

InlineEdit.prototype.resetModified = function() {
    this.modifiedFlag = false;
    this.fireEditEvent();
}


InlineEdit.prototype.isModified = function() {
    return this.modifiedFlag;
}

ScrollBar = function(win, sb) {
    //alert('ScrollBar');

    this.scrollWindow = win;
    this.scrollBar = sb;

    // Scrollbar Elements
    this.upArrow = win.findElementById(sb, 'upArrow');
    this.downArrow = win.findElementById(sb, 'downArrow');
    this.slider = win.findElementById(sb, 'slider');
    this.innerArea = win.findElementById(sb, 'innerArea');
    
    //    this.innerArea.style.position = 'absolute';
    //    this.innerArea.style.top = this.upArrow.offsetHeight + 'px';
    //    this.innerArea.style.width = this.upArrow.offsetWidth + 'px';
    //    this.innerArea.style.height = this.scrollAreaSize() + 'px';
    

    this.mouseState = 0;
    this.mousePos = 0;
    
    this.innerArea.onclick = this.scrollBarClickHandler();
    this.upArrow.onclick = this.arrowUpHandler();
    this.downArrow.onclick = this.arrowDownHandler();
    //    this.slider.onmousedown = this.mouseDownHandler();
    //    this.slider.onmouseup = this.mouseUpHandler();
    //    this.slider.onmousemove = this.mouseMoveHandler();
    
    if (window.addEventListener) {
        this.scrollWindow.textView.addEventListener('DOMMouseScroll', this.mouseWheelHandler(), false);
    }
    this.scrollWindow.textView.onmousewheel = this.mouseWheelHandler();
 
}

ScrollBar.prototype.refresh = function () {
    var viewSize = this.scrollWindow.textView.offsetHeight;
    var windowSize = this.scrollWindow.outerFrame.offsetHeight;

    if (viewSize <= windowSize) {
        this.hide();
        return;
    }

    this.show();
    this.redrawSlider();
}

ScrollBar.prototype.hide = function () {
    this.scrollBar.style.display = 'none';
    this.scrollWindow.textView.style.width = this.scrollWindow.outerFrame.offsetWidth + 'px';
}

ScrollBar.prototype.show = function () {
    this.scrollBar.style.display = 'inline';
    
    var w = this.scrollWindow.outerFrame.offsetWidth - this.scrollBar.offsetWidth;
    this.scrollWindow.textView.style.width = w + 'px';
}

/**
 *  Calculate Slider size and position and redraw it 
 */
ScrollBar.prototype.redrawSlider = function () {
    var viewSize = this.scrollWindow.textView.offsetHeight;
    var windowSize = this.scrollWindow.outerFrame.offsetHeight;

    if (viewSize < windowSize) {
        return;
    }

    var percentView = windowSize / viewSize;
    var sliderSize = Math.round((this.scrollAreaSize() * percentView) - 0.5);

    this.slider.style.height = sliderSize + 'px';
    this.slider.style.width = this.scrollBar.offsetWidth + 'px';

    var sliderPos = parseInt(this.scrollWindow.textView.style.top);
    sliderPos = Math.round((Math.abs(sliderPos) * percentView) - 0.5);
    //sliderPos += this.upArrow.offsetHeight;

    if (sliderPos + sliderSize > this.scrollAreaSize()) {
        //sliderPos = this.upArrow.offsetHeight + this.scrollAreaSize() - sliderSize;
        sliderPos = this.scrollAreaSize() - sliderSize;
    }

    this.slider.style.top = sliderPos + 'px';
    this.slider.style.position = 'absolute';
    
    //alert('windowSize : ' + windowSize + ' viewSize : ' + viewSize + ' percentView : ' + percentView + ' scrollAreaSize : ' + this.scrollAreaSize() + ' sliderSize : ' + sliderSize + ' textViewPos : ' + this.scrollWindow.textView.style.top + ' sliderPos : ' + sliderPos);
    return;
}

ScrollBar.prototype.scrollAreaSize = function () {
    var size = this.scrollBar.offsetHeight - (this.upArrow.offsetHeight + this.downArrow.offsetHeight);
    return size;
}

ScrollBar.prototype.arrowUpHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (event) {
        method.scrollUp(15);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.scrollUp = function(pixel) {
    this.scrollWindow.scrollUp(pixel);
}


ScrollBar.prototype.arrowDownHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (event) {
        method.scrollDown(15);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.mouseMoveHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");

        method.mouseMove(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.mouseDownHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.mouseDown(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.mouseUpHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.mouseUp(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.mouseWheelHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.mouseWheel(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.scrollBarClickHandler = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : "");
        method.scrollBarClick(evt);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

ScrollBar.prototype.mouseDown = function(event) {
    this.mousePos = event.clientY;
    this.mouseState = 1;
}

ScrollBar.prototype.mouseUp = function(event) {
    this.mouseState = 0;
}

ScrollBar.prototype.mouseMove = function(event) {
    if (this.mouseState == 0) {
        return;
    }
        
    var diffPos = event.clientY - this.mousePos;
    this.mousePos = event.clientY;
    
    if (diffPos < 0) {
        // scrollUp
        diffPos = Math.abs(diffPos);
        this.scrollWindow.scrollUp(diffPos);
    } else {
        // scrollDown
        this.scrollWindow.scrollDown(diffPos);
    }
}

ScrollBar.prototype.scrollBarClick = function(event) {
       
    var mousePos = (event.offsetY)? event.offsetY : this.mouseY(this.innerArea, event);
    var sliderPos = parseInt(this.slider.style.top);
    var sliderSize = this.slider.offsetHeight;
    var viewSize = this.scrollWindow.textView.offsetHeight;
    var windowSize = this.scrollWindow.outerFrame.offsetHeight;
    var percentView = windowSize / viewSize;
    sliderSize = Math.round(sliderSize / percentView);
    //alert('mousePos : ' + mousePos + ' / sliderPos : ' + sliderPos + ' innerPos : ' + this.innerArea.offsetTop);
    if (mousePos < sliderPos) {
        this.scrollWindow.scrollUp(sliderSize);
    } else {
        // scrollDown
        this.scrollWindow.scrollDown(sliderSize);
    }
}

ScrollBar.prototype.mouseY = function(element, event) {
    if (event.offsetY) {
        return event.offsetY;
    }
    
    var offset = 0;
    do {
        offset += element.offsetTop;
        element = element.offsetParent;
    } while (element != null);
    
    return event.clientY - offset;
}


ScrollBar.prototype.mouseWheel = function(event) {
    var diffPos = event.detail ? event.detail * -1 : event.wheelDelta / 40;
    
    
    if (diffPos < 0) {
        // scrollUp
        diffPos = Math.abs(diffPos);
        this.scrollWindow.scrollDown(diffPos);
    } else {
        // scrollDown
        this.scrollWindow.scrollUp(diffPos);
    }
}



ScrollBar.prototype.scrollDown = function(pixel) {
    this.scrollWindow.scrollDown(pixel);
}

ScrollWindow = function(frame) {
    //    alert('ScrollWindow');
    this.outerFrame = frame;
    this.textView = this.findElementById(frame, 'textView');
    this.vscrollBarElement = this.findElementById(frame, 'vscrollBar');
    this.vscrollBar = new ScrollBar(this, this.vscrollBarElement);
    this.vscrollBar.refresh();

    this.outerFrame.style.overflow = 'hidden';
}

ScrollWindow.prototype.clearText = function() {
    this.textView.innerHTML = '';
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.setTextElement = function(textElement) {
    this.textView.innerHTML = '';
    this.textView.appendChild(textElement);
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.addTextElementNoRefresh = function(textElement) {
    this.textView.appendChild(textElement);
}

ScrollWindow.prototype.addTextElement = function(textElement) {
    this.textView.appendChild(textElement);
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.scrollDown = function(pixel) {
    var viewSize = this.textView.offsetHeight;
    var windowSize = this.outerFrame.offsetHeight;

    if (viewSize <= windowSize) {
        return;
    }

    var maxPos = windowSize - viewSize;
    var currentPos = parseInt(this.textView.style.top);
    currentPos -= pixel;

    //alert('currentPos : ' + currentPos + ' / maxPos : ' + maxPos);
    if (currentPos < maxPos) {
        currentPos = maxPos;
    }

    this.textView.style.top = currentPos + 'px';
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.scrollToBottom = function() {
    var viewSize = this.textView.offsetHeight;
    var windowSize = this.outerFrame.offsetHeight;

    if (viewSize <= windowSize) {
        return;
    }

    var maxPos = windowSize - viewSize;

    this.textView.style.top = maxPos + 'px';
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.scrollUp = function(pixel) {
    var viewSize = this.textView.offsetHeight;
    var windowSize = this.outerFrame.offsetHeight;

    if (viewSize <= windowSize) {
        return;
    }

    var maxPos = windowSize - viewSize;
    var currentPos = parseInt(this.textView.style.top);
    currentPos += pixel;

    if (currentPos > 0) {
        currentPos = 0;
    }

    this.textView.style.top = currentPos + 'px';
    this.vscrollBar.refresh();
}

ScrollWindow.prototype.findElementById = function(elem, id) {
    //alert('NodeName ' + elem.nodeName + " / " + elem.getAttribute('id'));
    
    if (this.matchId(elem, id))
        return elem;
    
    for (var i = 0; i < elem.childNodes.length; i++) {
        if (elem.childNodes[i].nodeType == 1) {
            var node = this.findElementById(elem.childNodes[i], id);
            if (node)
                return node;
        }
    }

    return null;
}

ScrollWindow.prototype.matchId = function(elem, id) {
    var eid = elem.getAttribute('id');
    
    if (!eid || eid == null)
        return false;
    
    if (eid.toString() == id.toString())
        return true;
    
    var idx = eid.indexOf(id);
    if (idx == -1)
        return false;
    
    if (eid.substr(idx) == id.toString())
        return true;
    
    return false;
}


XMLFormHandler = function(form) {
    //alert('XMLFormHandler : ' + form.getAttribute('id'));
    this.formContainer = form;
    this.formElements = new Array();
    this.formHints = new Array();
    this.editHandler = new InlineEdit(this);
    this.formListener = new Array();
    this.actionButtons = new Array();
    this.normalImages = new Array();
    this.selectedImages = new Array();
    
    this.scrollWindows = new Array();
    this.statusFields = new Array();

    this.initFormHandler();
}

XMLFormHandler = function(form, init) {
    //alert('XMLFormHandler : ' + form.getAttribute('id'));
    this.formContainer = form;
    this.formElements = new Array();
    this.formHints = new Array();
    this.editHandler = new InlineEdit(this);
    this.formListener = new Array();
    this.actionButtons = new Array();
    this.normalImages = new Array();
    this.selectedImages = new Array();
    this.scrollWindows = new Array();
    this.statusFields = new Array();

    if (init) {
        this.initFormHandler();
    }
}

XMLFormHandler.prototype.initFormHandler = function () {

    try {
        this.getFormHandlerElements(this.formContainer);
        //        this.getFormElements(this.formContainer);
        //        this.getActionButtons(this.formContainer);
        //        this.getStatusElements(this.formContainer);
        //        this.getScrollWindowElements(this.formContainer);
    
        for (var elementId in this.formElements) {
            var fe  = this.formElements[elementId];
            fe.ondblclick = this.editHandler.editElementStub();
        }

        for (var btnId in this.actionButtons) {
            var btn  = this.actionButtons[btnId];
        
            btn.onclick = this.clickHandler(this, btn, btnId);
        }

        this.editHandler.addEditListener(this);
    } catch (exception) { 
        var msg = '';
        for (var i in exception) {
            msg = msg + exception[i] + ' / ';
        }
        alert('Exception initFormHandler : ' + msg + ' : ' + exception);
  
    }
}

XMLFormHandler.prototype.addFormHint = function(key, value) {
    this.formHints[key] = value;
}

XMLFormHandler.prototype.getFormHint = function(id) {
    var xmlId = this.getXMLName(id);
    //alert('getFormHint : ' + xmlId + " / " + this.formHints[xmlId]);
    return this.formHints[xmlId];
}

XMLFormHandler.prototype.editForm = function() {
    this.editHandler.formEdit = true;
    var firstElement = null;
    for (var id in this.formElements) {
        var elem = this.formElements[id];
        
        var ef = this.editHandler.edit(elem);
        if (firstElement == null)
            firstElement = ef;
    }
    firstElement.focus();
}

XMLFormHandler.prototype.endEditForm = function() {
    for (var id in this.formElements) {
        var elem = this.formElements[id];
        this.editHandler.editDone(elem.getAttribute('id'));
    }
    this.editHandler.formEdit = false;
    this.editHandler.editActive = false;
}

XMLFormHandler.prototype.cancelEditForm = function() {
    for (var id in this.formElements) {
        var elem = this.formElements[id];
        this.editHandler.editCancel(elem.getAttribute('id'));
    }
    this.editHandler.formEdit = false;
    this.editHandler.editActive = false;
}

XMLFormHandler.prototype.setMouseOverImage = function (btnId, image) {
    var btn = this.actionButtons[btnId];
    var imgElement = btn.getElementsByTagName('img')[0];
    var originalImage = imgElement.getAttribute('src');
    
    var idx = originalImage.lastIndexOf('/');
    var mouseOverImage = originalImage.substr(0, idx + 1) + image;
    imgElement.onmouseover = this.mouseOverHandler(imgElement, mouseOverImage);
    imgElement.onmouseout = this.mouseOutHandler(imgElement, originalImage);
    
}

XMLFormHandler.prototype.setSelectedImage = function (btnId, image) {
    this.selectedImages[btnId] = image;    
}

XMLFormHandler.prototype.selectButton = function (btnId, selected) {
    var btn = this.actionButtons[btnId];
    
    if (!btn || btn == null)
        return;
    
    var imgElement = btn.getElementsByTagName('img')[0];
    
    if (selected) {
        var originalImage = this.normalImages[btnId];
    
        var idx = originalImage.lastIndexOf('/');
        var selectedImage = originalImage.substr(0, idx + 1) + this.selectedImages[btnId];

		//IE6 handling
		if(selectedImage.indexOf('theme/') != -1)
		{
			var firstStr = selectedImage.indexOf('theme/');
			var lastStr = selectedImage.lastIndexOf('/')+1;

			var replaceStr = selectedImage.substring(firstStr, lastStr);

			selectedImage = selectedImage.replace(replaceStr, "faces/resources/");
		}

        imgElement.src = selectedImage; // setAttribute('src', selectedImage);
    } else {
        imgElement.src = this.normalImages[btnId];//setAttribute('src', this.normalImages[btnId]);
    }
}

XMLFormHandler.prototype.mouseOverHandler = function (img, image) {
    var imageElement = img;
    var imageFile = image;
    
    var wrapper = function (event) {
        //alert('onmouseover : ' + imageFile);
        imageElement.setAttribute('src', imageFile);
    };
    
    return wrapper;
}

XMLFormHandler.prototype.mouseOutHandler = function (img, image) {
    var imageElement = img;
    var imageFile = image;
    
    var wrapper = function (event) {
        //alert('onmouseout : ' + imageFile);
        imageElement.setAttribute('src', imageFile);
    };
    
    return wrapper;
}

XMLFormHandler.prototype.clickHandler = function (formHandler, btn, btnId) {
    var form = formHandler;
    var button = btn;
    var buttonId = btnId;
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function (event) {
        method.actionBTN(form, button, buttonId);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
};

XMLFormHandler.prototype.addFormListener = function(listener) {
    this.formListener.push(listener);
}


XMLFormHandler.prototype.fireFormEvent = function(eventType) {
    for (var i = 0; i < this.formListener.length; i++) {
        if (this.formListener[i].handleEvent) {
            this.formListener[i].handleEvent(this, eventType, null);
        }
    }

}

XMLFormHandler.prototype.actionBTN = function(formHandler, btn, btnName) {
    if (btn.disabled) {
        return;
    }
    
    for (var i = 0; i < formHandler.formListener.length; i++) {
        if (this.formListener[i].actionBTN) {
            this.formListener[i].actionBTN(btnName, formHandler.formContainer.getAttribute('id'));
        }
    }
}

XMLFormHandler.prototype.handleEvent = function(eventSource, eventType) {
    if (eventType == 'editEvent' && this.editHandler.enableEdit) {
        this.fireFormEvent(eventType);
    }
}

XMLFormHandler.prototype.isModified = function() {
    return this.editHandler.isModified();
}

XMLFormHandler.prototype.nextEditElement = function(currentElement) {
    var xmlName = this.getXMLName(currentElement);
    //alert('nextEditElement : ' + currentElement);
    var lastId = false;
    var test = "test";
    for (var elementId in this.formElements) {
        //alert('elementId = ' + elementId + ' / xmlName : ' + xmlName);
        if (elementId.toString() == xmlName.toString()) {
            //alert('Found elementId = ' + elementId + ' / xmlName : ' + xmlName);
            lastId = true;
            continue;
        }
        
        if (lastId)
            return this.formElements[elementId];
    }

    return null;
}

XMLFormHandler.prototype.showForm = function() {
    this.formContainer.style.display = 'inline';
}

XMLFormHandler.prototype.hideForm = function() {
    this.formContainer.style.display = 'none';
}

XMLFormHandler.prototype.getFormHandlerElements = function(elem) {
    if (elem == null) {
        return;
    }

    var id = elem.getAttribute('id');
    var idx = null;
    var idx2 = null;
    var ename = null;

    if (id && id != null) {
        idx = id.indexOf('xml', 0);
        if (idx != -1 && this.isValidNode(elem)) {
            ename = this.getXMLName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.formElements[ename] = elem;
            return;
        }

        idx = id.indexOf('actionBTN_', 0);
        idx2 = id.indexOf('_', 0);

        if (idx != -1 && idx2 != 0) {
            ename = this.getButtonName(id);
            //alert("Adding XML Form Element : " + btnName);
            this.actionButtons[ename] = elem;

            var imgElement = null;
            if (elem.nodeName == 'img') {
                imgElement = elem;
            } else {
                imgElement = elem.getElementsByTagName('img')[0];
            }

            if (imgElement) {
                //alert('adding Element : ' + imgElement + " / " + btnName);
                var originalImage = imgElement.src;  //getAttribute('src');
                this.normalImages[ename] = originalImage;

            }

            return;
        }

        idx = id.indexOf('statusTXT_', 0);
        if (idx != -1 && id.indexOf('_', 0) != 0) {
            ename = this.getStatusFieldName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.statusFields[ename] = elem;
            return;
        }

        idx = id.indexOf('scrollWIN_', 0);
        if (idx != -1 && id.indexOf('_', 0) != 0) {
            ename = this.getScrollWindowName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.scrollWindows[ename] = new ScrollWindow(elem);
            return;
        }
    }



    var cnode = null;
    for(var i = 0; i < elem.childNodes.length; i++) {
        //alert('ElementId : ' + id + ' / childNode : ' + i + ' / ' + elem.childNodes.length + ' / NT : ' + elem.childNodes[i].nodeType + ' / ' + elem.childNodes[i].nodeName);
        
        cnode = elem.childNodes[i];
        if (cnode.nodeType == 1) {
            this.getFormHandlerElements(cnode);
        }
    }

}

XMLFormHandler.prototype.getFormElements = function(elem) {
    if (elem == null) {
        return;
    }
    
    var id = elem.getAttribute('id');
    if (id && id != null) {
        var idx = id.indexOf('xml', 0);
        if (idx != -1 && this.isValidNode(elem)) {
            var xmlName = this.getXMLName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.formElements[xmlName] = elem;
            return;
        }
    }
    
    
    for(var i = 0; i < elem.childNodes.length; i++) {
        //alert('ElementId : ' + id + ' / childNode : ' + i + ' / ' + elem.childNodes.length + ' / NT : ' + elem.childNodes[i].nodeType + ' / ' + elem.childNodes[i].nodeName);
        if (elem.childNodes[i].nodeType == 1) {
            this.getFormElements(elem.childNodes[i]);
        }
    }
}

XMLFormHandler.prototype.isValidNode = function(elem) {
    if (elem.nodeName != 'SPAN') {
        return true;
    }
    
    var ap = elem.getAttribute('dojoattachpoint');
    if (ap != null && ap == 'domNode')
        return true;
    
    return false;
}

XMLFormHandler.prototype.getActionButtons = function(elem) {
    var id = elem.getAttribute('id');
    var str = 'str';
    if (id && id != null) {
        var idx = id.indexOf('actionBTN_', 0);
        var idx2 = id.indexOf('_', 0);
        //alert("getActionButtons : " + id + " / " + idx + " / " + idx2);

        if (idx != -1 && idx2 != 0) {
            var btnName = this.getButtonName(id);
            //alert("Adding XML Form Element : " + btnName);
            this.actionButtons[btnName] = elem;

            var imgElement = null;
            if (elem.nodeName == 'img') {
                imgElement = elem;
            } else {
                imgElement = elem.getElementsByTagName('img')[0];
            }
            
            if (imgElement) {
                //alert('adding Element : ' + imgElement + " / " + btnName);
                var originalImage = imgElement.getAttribute('src');
                this.normalImages[btnName] = originalImage;
                
            }

            return;
        }
    }
    
    
    for(var i = 0; i < elem.childNodes.length; i++) {
        //alert('ElementId : ' + id + ' / childNode : ' + i + ' / ' + elem.childNodes.length + ' / NT : ' + elem.childNodes[i].nodeType + ' / ' + elem.childNodes[i].nodeName);
        if (elem.childNodes[i].nodeType == 1) {
            this.getActionButtons(elem.childNodes[i]);
        }
    }
}

XMLFormHandler.prototype.getStatusElements = function(elem) {
    var id = elem.getAttribute('id');
    if (id && id != null) {
        var idx = id.indexOf('statusTXT_', 0);
        if (idx != -1 && id.indexOf('_', 0) != 0) {
            var statusField = this.getStatusFieldName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.statusFields[statusField] = elem;
            return;
        }
    }
    
    
    for(var i = 0; i < elem.childNodes.length; i++) {
        //alert('ElementId : ' + id + ' / childNode : ' + i + ' / ' + elem.childNodes.length + ' / NT : ' + elem.childNodes[i].nodeType + ' / ' + elem.childNodes[i].nodeName);
        if (elem.childNodes[i].nodeType == 1) {
            this.getStatusElements(elem.childNodes[i]);
        }
    }
}

XMLFormHandler.prototype.getScrollWindowElements = function(elem) {
    var id = elem.getAttribute('id');
    if (id && id != null) {
        var idx = id.indexOf('scrollWIN_', 0);
        if (idx != -1 && id.indexOf('_', 0) != 0) {
            var field = this.getScrollWindowName(id);
            //alert("Adding XML Form Element : " + xmlName);
            this.scrollWindows[field] = new ScrollWindow(elem);
            return;
        }
    }
    
    for(var i = 0; i < elem.childNodes.length; i++) {
        //alert('ElementId : ' + id + ' / childNode : ' + i + ' / ' + elem.childNodes.length + ' / NT : ' + elem.childNodes[i].nodeType + ' / ' + elem.childNodes[i].nodeName);
        if (elem.childNodes[i].nodeType == 1) {
            this.getScrollWindowElements(elem.childNodes[i]);
        }
    }
}


XMLFormHandler.prototype.getXMLName = function(id) {
    var idx = id.indexOf('xml', 0);
    var xmlName = id.substr(idx + 3);
    //    var endidx = xmlName.indexOf('__', 0);
    //    if (endidx != -1)
    //        xmlName = xmlName.substr(0, endidx);

    return xmlName;
}

XMLFormHandler.prototype.getButtonName = function(id) {
    var idx = id.indexOf('actionBTN_', 0);
    var btnName = id.substr(idx + 10);
    //    var endidx = xmlName.indexOf('__', 0);
    //    if (endidx != -1)
    //        xmlName = xmlName.substr(0, endidx);

    return btnName;
}

XMLFormHandler.prototype.getStatusFieldName = function(id) {
    var idx = id.indexOf('statusTXT_', 0);
    var statusField = id.substr(idx + 10);
    //    var endidx = xmlName.indexOf('__', 0);
    //    if (endidx != -1)
    //        xmlName = xmlName.substr(0, endidx);

    return statusField;
}

XMLFormHandler.prototype.getScrollWindowName = function(id) {
    var idx = id.indexOf('scrollWIN_', 0);
    var field = id.substr(idx + 10);
    //    var endidx = xmlName.indexOf('__', 0);
    //    if (endidx != -1)
    //        xmlName = xmlName.substr(0, endidx);

    return field;
}

XMLFormHandler.prototype.clearForm = function() {
    // Clear Form
    for (var fname in this.formElements) {
        this.setElementValue(this.formElements[fname], "--");
    }
    this.editHandler.resetModified();
}

XMLFormHandler.prototype.setFormValues = function(xmlObject, edit, readonly) {
    this.clearForm();

    if (readonly) {
        //alert('enableEdit = false');
        this.editHandler.enableEdit = false;
    } else {
        //alert('enableEdit = true');
        this.editHandler.enableEdit = true;
    }


    var nodeList = xmlObject.childNodes;

    for (var i = 0; i < nodeList.length; i++) {
        //if (nodeList[i].nodeType == 1) {
        var elementName = nodeList.item(i).nodeName;
        if (elementName == 'Phone')
            elementName += '__' + nodeList.item(i).getAttribute('numberType');
        var formElement = this.formElements[elementName];
        if (formElement != null && nodeList.item(i).firstChild != null) {
            this.setElementValue(formElement, nodeList.item(i).firstChild.nodeValue);
        }
    //}
    }

    if (edit) {
        for (var elemName in this.formElements) {
            this.editHandler.edit(this.formElements[elemName]);
            break;
        }
    }

}

XMLFormHandler.prototype.getFormValues = function(xmlObject) {
    // Clear Phone Records first
    var phoneList = xmlObject.getElementsByTagName('Phone');
    var len = phoneList.length;
    //alert('Removing Phone Records : ' + len);
    while (len > 0) {
        //alert('Remove Phone Child');
        xmlObject.removeChild(phoneList[0]);
        len = phoneList.length;
    }

    for (var elementName in this.formElements) {
        var formElement = this.formElements[elementName];
        var value = this.getElementValue(formElement);
    
        var endidx = elementName.indexOf('__', 0);
        var numberType = null;
        if (endidx != -1) {
            numberType = elementName.substr(endidx + 2);
            elementName = elementName.substr(0, endidx);
            //alert('numberType : ' + numberType);
        }
    
        var nodeList = xmlObject.getElementsByTagName(elementName.toString());
        if (elementName == 'Phone') {
            if (value != '' && value != '--') {
                //alert('create Phone Element : ' + numberType);
                var phone = xmlObject.ownerDocument.createElement('Phone');
                phone.setAttribute('numberType', numberType);
                //setText(phone, formElement.innerHTML);
                phone.appendChild(xmlObject.ownerDocument.createTextNode(value));
                xmlObject.appendChild(phone);
            }
        } else {
            if (nodeList.length == 0) {
                if (value != '' && value != '--') {
                    var elem = xmlObject.ownerDocument.createElement(elementName);
                    //setText(elem, formElement.innerHTML);
                    elem.appendChild(xmlObject.ownerDocument.createTextNode(value));
                    xmlObject.appendChild(elem);
                }
            } else {
                if (value == '' || value == '--') {
                    xmlObject.removeChild(nodeList.item(0));
                    this.setElementValue(formElement, '--');
                } else {
                    //setText(nodeList.item(0), formElement.innerHTML);
                    nodeList.item(0).firstChild.nodeValue = value;
                }
            }
        }
    }
        
    this.editHandler.resetModified();
//    var nodeList = xmlObject.childNodes;
//    for (i = 0; i < nodeList.length; i++) {
//        //if (nodeList[i].nodeType == 1) {
//    
//        var elementName = nodeList.item(i).nodeName;
//        if (elementName == 'Phone')
//            elementName += '__' + nodeList.item(i).getAttribute('numberType');
//            
//        var formElement = this.formElements[elementName];
//
//        if (formElement != null) {
//            nodeList.item(i).getFirstChild().setNodeValue(formElement.innerHTML);
//        }
//        //}
//    }
    
}

XMLFormHandler.prototype.getElementValue = function(elem) {
    
    if (elem.nodeName == 'INPUT' || elem.nodeName == 'TEXTAREA') {
        return elem.value;
    }
    
    return elem.innerHTML;
}

XMLFormHandler.prototype.setElementValue = function(elem, value) {
    
    if (elem.nodeName == 'INPUT' || elem.nodeName == 'TEXTAREA') {
        if (value == '--')
            value = "";
        
        elem.value = value;
    }
    
    setText(elem, value);
}
