function ErrorRenderer () {

    var header;

/*  Displays the errors */
    ErrorRenderer.prototype.displayErrors = function (theForm, err) {

       clear(); // Clears any previous errors

        // If at least 1 error, display the error header
        if (err.length > 0) {
            // No header set, use default
            if (!this.getHeader()) {
                this.setHeader('En eller flera uppgifter är felaktiga i formuläret nedan.');
            }
            displayErrorHeader(this.getHeader());

            // Scroll to the top
            window.scrollTo(0, 0);
            
        } else {
            // No errors, leave method
            return true;
        }

        for (i = 0; i < err.length; i++) {
            field = err[i];

            var column = 1;

            // To handle extra divs for radio-buttons and checboxes
            if (field.getField().parentNode.className.toLowerCase() == 'choice') {
                rowInput = field.getField().parentNode.parentNode;
            } else {
                rowInput = field.getField().parentNode;
            }

            // Gets the row node
            var row = rowInput.parentNode;

            // Get DIV´s in current row
            var rowdivs = row.getElementsByTagName("div");

			// Checks if there's some divs
			if( rowdivs.length > 0 ){

				// Check if there is a previous rowInput sibling to the field (Skipping all but nodes of ELEMENT_NODE_TYPE)
				tmpRowInput = rowInput;

				while (tmpRowInput.previousSibling) {
					if (tmpRowInput.previousSibling.nodeType == 1) {
						if (tmpRowInput.previousSibling.className.toLowerCase().indexOf("rowinput") != -1) {
							column = 2;
						}
						break;
					}
					tmpRowInput = tmpRowInput.previousSibling;
				}

				// Check if row error container allready exists
				if (rowdivs[0].className.toLowerCase() != 'rowerror') {
					// Creates new "container" node for error message
					rowErrorNode = document.createElement("div");
					rowErrorNode.className = "rowError";
					// Adds the "container" node to the row
					row.insertBefore(rowErrorNode,row.firstChild);
				} else if (rowdivs[0].className.toLowerCase() == 'rowerror') {
					// rowErrorNode exist, use it to add errormessage
					rowErrorNode = rowdivs[0];
				}

				// Gets the dialogrow node
				var dialogrow = row.parentNode;
                // Make sure the dialogrow is found (fix for ODR) /FH 2006-09-01
                if (dialogrow.className == 'row') {
                    dialogrow = dialogrow.parentNode;
                }

                // Changes CSS-class to dialogrow node
				//if (dialogrow.className.toLowerCase() == 'dialogrow') {

                // This is a fix that makes the errorhandling work for layers that
                // have more classes defined than just 'dialogRow' /FH 2006-07-25
                if (dialogrow.className.toLowerCase().indexOf("dialogrow") != -1) {
                    dialogrow.className = dialogrow.className + " errorArea";
				}

				// Creates new node for errormessage
				newNode = document.createElement("div");
				newNode.className = "errorMessage";

				// Creates new text node for error message
				newNodeText = document.createTextNode(field.getMessage());

				// Adds the text node to the "container" node
				newNode.appendChild(newNodeText);

				// Messages for radiobuttons should always be displayed in single colum design because radiobuttons are "grouped"
				if (field.getField().type != 'radio') {
					// Check if two column design
					if (rowInput.className.toLowerCase().indexOf("twocols") != -1) {
						newNode.className += " twocols";
					}

					if (column == 2) {
						newNode.className += " right";
					}
				}

				// Adds the new node to the rowErrorNode
				rowErrorNode.appendChild(newNode);

            }
        }
        return false;
    }


/*  Shows the "errorheader"
    Type:   Private  */
    function displayErrorHeader (msg) {
        var errorHtml = "<div class=\"errorMessage\">";
        errorHtml += msg;
        errorHtml += "</div>"

        if (document.getElementById("clientErrorMessageArea")) {
            document.getElementById("clientErrorMessageArea").innerHTML = errorHtml;
        } else {
            divs = document.getElementsByTagName("div");
            for (i = 0; i < divs.length; i++) {
                if (divs[i].className.toLowerCase() == "servicehead") {
                    newDiv = document.createElement("div");
                    newDiv.id = "clientErrorMessageArea";

                    beforeNode = divs[i];

                    while (beforeNode.nextSibling) {
                        if (beforeNode.nextSibling.nodeType == 1) {
                            beforeNode = beforeNode.nextSibling;
                            break;
                        }
                        beforeNode = beforeNode.nextSibling;
                    }
                    divs[i].parentNode.insertBefore(newDiv,beforeNode);
                    document.getElementById("clientErrorMessageArea").innerHTML = errorHtml;
                    break;
                }
            }
        }
    }

/*  Clears any error markings from the form
    Type:   Private  */
     function clear() {

         if (document.getElementById("clientErrorMessageArea")) {
             document.getElementById("clientErrorMessageArea").innerHTML = "";
         }
         //divs = theForm.getElementsByTagName("div");
         divs = document.getElementsByTagName("div");  // Needed to clear servervalidation errors correctly

         for (i = 0; i < divs.length; i++) {
             //if (divs[i].className.toLowerCase() == "dialogrow errorarea") {
             // This is a fix that makes the errorhandling work for layers that
             // have more classes defined than just 'dialogRow' /FH 2006-07-25
             if (divs[i].className.toLowerCase().indexOf("dialogrow") != -1 && divs[i].className.toLowerCase().indexOf("errorarea") != -1) {
                 divs[i].className = divs[i].className.replace(/\s?errorarea/gi,"");
             }

             if (divs[i].className.toLowerCase() == "rowerror") {
                 divs[i].parentNode.removeChild(divs[i]);
             }

             // Remove servervalidation-errors
             if (divs[i].className.toLowerCase() == "errormessage") {
                 divs[i].parentNode.removeChild(divs[i]);
             }
         }
     }
/*  Getters */
    ErrorRenderer.prototype.getHeader = function() {
        return this.header;
    }

/*  Setters */
    ErrorRenderer.prototype.setHeader = function (header) {
        this.header = header;
    }
/*	Deprecated */
    ErrorRenderer.prototype.clearAll = function() {
        clear();
    }
}



