// ================================================================ //
// Error Handling Javascript - Dynamic Error Indication                         //
// ================================================================ //

function showError(errorString, errorMsg) {

    var formName = null;
    var section = null;
    var elementName = null;
                
    var idComponents = errorString.split('.');
                
    if (idComponents.length >= 2) formName = idComponents[1];
    if (idComponents.length >= 3) section = idComponents[2];
    if (idComponents.length >= 4) elementName = idComponents[3];
                
    // Make sure form exists
    if (formName != null && document.forms[formName] == null) return;

    // Field Error
    if (elementName != null && document.forms[formName].elements[elementName] != null) {
                                
        var element = document.forms[formName].elements[elementName];
                                
        // Find Element's Label
        var label = getLabelByElementId(elementName);
        var row = null;
        var errorRow = null;

        // Find the Parent "Row"
        var par = (element == null ? label.parentNode : element.parentNode);
        while (par != null) {
            if (par.className == 'form-row' || par.className == 'form-row-related') {
                row = par;
                break;
            }
            par = par.parentNode;
        }

        // Write out icon into start of label
        if (label != null) {
            if (label.className.indexOf('error') == -1) {
                label.style.height = "";
                label.style.paddingTop = '';
                label.className += " error";
                correctLabelHeight(label);
            }
        }

        // Write out error message into an error row
        if (row != null) {

            // Find the error row (as it may exist)
            nextRow = row.nextSibling;
            while (nextRow != null && nextRow.tagName == null)
                nextRow = nextRow.nextSibling;

            if (nextRow != null) {
                if (nextRow.className == 'form-error-row') {
                    errorRow = nextRow;
                }
                else {
                    // Create row as it doesn't exist
                    errorRow = document.createElement('div');
                    nextRow.parentNode.insertBefore(errorRow, nextRow);
                    errorRow.className = 'form-error-row';                                                
                }
            }
            // This row must have been the last one
            else {
                // Create row as it doesn't exist
                errorRow = document.createElement('div');
                row.parentNode.appendChild(errorRow);
                errorRow.className = 'form-error-row';                                                
            }
        
            // Put error message in the row (new or old)
            if (errorRow != null) {
                errorRow.innerHTML = errorRow.innerHTML + '<div class=\'form-error\'>- '+errorMsg+'</div>';
            }
        }
    }
    // Section Error
    else if (section != null && document.getElementById('sect-' + section) != null) {
                                
        var section = idComponents[2];
        var header = document.getElementById('sect-' + section);
        var errorRow = null;
            
        // Write out icon into start of header
        if (header != null) {
            var contents = header.innerHTML;
            if (contents.indexOf('icon_error.gif') == -1) {
                header.innerHTML = "<img src='" + ImageURL + "/diesel/icons/icon_error.gif' alt='' border='0'/>" + contents;
            }
            header.className = 'form';
        }

        // Write out error message
        if (header != null) {
                
            // Find next tag
            nextRow = header.nextSibling;
            while (nextRow != null && nextRow.tagName == null)
                nextRow = nextRow.nextSibling;
                
            if (nextRow != null) {
                if (nextRow.className == 'form-error-row') {
                    errorRow = nextRow;
                }
                else {
                    // Create row
                    errorRow = document.createElement('div');
                    nextRow.parentNode.insertBefore(errorRow, nextRow);
                    errorRow.className = 'form-error-row';                                                
                }
            }
            
            if (errorRow != null) {
                errorRow.innerHTML = errorRow.innerHTML + '<div class=\'form-error\'>- '+errorMsg+'</div>';
            }
        }
        
    }
    // Form Error
    else {
        var formErrorBlock = document.getElementById(formName + '-error-row');
            
        // Write out error message into an error row
        if (formErrorBlock != null) {
            formErrorBlock.innerHTML = formErrorBlock.innerHTML + '<div class=\'form-error\'>- '+errorMsg+'</div>';
        }
    }
}

// Get the label tag for a form element
function getLabelByElementId(ElementId) {
    var label = null;

    var labels = document.getElementsByTagName('label');
    for (i = 0; i < labels.length; i++) {
        var htmlFor = labels[i].htmlFor;
                                
        if (htmlFor == ElementId)
            label = labels[i];
        else if (htmlFor.indexOf(',') > -1) {
            htmlFors = htmlFor.split(',');
                                                
            for (j = 0; j < htmlFors.length; j++) {
                if (htmlFors[j] == ElementId)
                    label = labels[i];
            }
        }
    }
                
    return label;
}

// ================================================================ //
// Error Handling Javascript - Dynamic Error Indication                         //
// ================================================================ //

// Make the label the same width as the element it is for
// this is only done for "norm" labels, and also the bottom
// alignment of text is achieved here

function correctLabelSize() {
    var labels = document.getElementsByTagName('label');
    for (i = 0; i < labels.length; i++) {
        correctIndividualLabelSize(labels[i]);
    }
}

function correctDescendantLabelSize(element) {
    var labels = element.getElementsByTagName('label');
    for (i = 0; i < labels.length; i++) {
        correctIndividualLabelSize(labels[i]);
    }
}

function correctIndividualLabelSize(label) {
    // If label size correction is disabled for this element, don't correct its size
    if (label.className.indexOf('disable-resize') != -1) return;

    if (label.className == 'norm' || label.className == 'norm disabled') {
        
        label.style.height = '';
        label.style.paddingTop = '';
        
        // Correct again
        if (label.htmlFor.length > 0) {
            var element = document.getElementById(label.htmlFor);
            if (element != null) {
                if (label.style.width < element.clientWidth)
                    label.style.width = element.clientWidth + 'px';
            }
        }

        correctLabelHeight(label);
    }
}

function correctLabelHeight(label) {
    if(label.className.indexOf('norm') != -1)
    {
      if (label.clientHeight < 20) {
          label.style.height = '11px';
          if (document.all){
            //Workaround for an IE bug
            label.style.paddingTop = '16px';          
          }else {
            label.style.paddingTop = '18px';
          }
      }
      else {
          label.style.height = '27px';
          label.style.paddingTop = '2px';
      }
    }
    else if(label.className.indexOf('row') != -1)
    {
      label.style.height = '20px';
    }
}

// Make sure the form numbers properly increment
function correctFormNo() {
    var h2s = document.getElementsByTagName('h2');
    var counter = 0;

    for (i = 0; i < h2s.length; i++) {
        h2 = h2s[i];

        if (((h2.className == 'form-no') || (h2.className == 'form-no-low') || (h2.className == 'form-no-less')) 
        	&& isVisible(h2) && h2.clientHeight > 0) {
            h2.innerHTML = ++counter;
        }
    }
}


// Find out if the node or any parent has style "visibility: hidden;" 
function isVisible(el) {

    while (el != null) {

        if (el.tagName == 'HTML')
            return true; 

        if (el.style.visibility == "hidden" || el.style.display == "none")
            return false;

        el = el.parentNode;
    }
    return true;
}
