function textCounter(sourceField, elementToShowCountId, maxlimit) {
    if (sourceField.value.length > maxlimit)
    sourceField.value = sourceField.value.substring(0, maxlimit);
    else{
    document.getElementById(elementToShowCountId).innerHTML = maxlimit - sourceField.value.length;    
    }
}

function enableCounterForElement(elemenToCountId, elementToShowCountId, maxlimit) {
    var elemenToCount= document.getElementById(elemenToCountId);
    elemenToCount.onkeyup= function () {textCounter(elemenToCount,elementToShowCountId,maxlimit)};
    elemenToCount.onkeydown= function () {textCounter(elemenToCount,elementToShowCountId,maxlimit)};
}

function toggleElementDisplay(elementId) {
    var element = document.getElementById(elementId);
    element.style.display = element.style.display != 'none' ? 'none' : '';
}

function addToggleLinkBeforeElement(elementToToggleId, linktext){
    var elementToToggle = document.getElementById(elementToToggleId);    
    var parentElement = elementToToggle.parentNode;
    var newlink = document.createElement('a');
    newlink.setAttribute('href','#');
    newlink.onclick= function () {toggleElementDisplay(elementToToggleId); return false};
    newlink.innerHTML = linktext;
    parentElement.insertBefore(newlink, elementToToggle);
}

function addMandatoryValidationToElement(elementToValidateId){
    var elementToValidate = document.getElementById(elementToValidateId);
        
    var validationFunction = function(e){
        if(elementToValidate.value.length < 1){           
            showValidationError(elementToValidate);                        
            preventReturn(e);
        }
    };
    
    addEventListener(elementToValidate.form, 'submit', validationFunction);
}

function addEmailValidationToElement(elementToValidate){
    re = new RegExp('^[a-zA-Z0-9_\\.]+@[a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\-\\.]+$'); 
    
    var validationFunction = function(e){
        if(!re.test(elementToValidate.value)){           
            showValidationError(elementToValidate);                        
            preventReturn(e);
        }
    };
    
    addEventListener(elementToValidate.form, 'submit', validationFunction);
}

function showValidationError(element) {	
	if (element.hasError) return;
	
        var errorspan = getNextSibling(element);
        getNextSibling(element).style.display = '';
        element.hasError = errorspan;
         
        element.className += ' error';
        element.onfocus = hideValidationError;	
}

function hideValidationError()
{
	this.className = this.className.substring(0,this.className.lastIndexOf(' '));
	this.hasError.style.display = 'none';
	this.hasError = null;
	this.onchange = null;
}

function insertAfter(node, referenceNode) {
  referenceNode.parentNode.insertBefore(node, referenceNode.nextSibling);
}

//Due to a bug in FF you can't get nextSibling if there is a newline in between
function getNextSibling(startBrother){
  endBrother=startBrother.nextSibling;
  while(endBrother.nodeType!=1){
    endBrother = endBrother.nextSibling;
  }
  return endBrother;
}

//Since IE doesn't support addEventListener
function addEventListener(element, event, referenceToFunction){
    if(element.addEventListener) {
        element.addEventListener(event, referenceToFunction, false);
    }
    else if(document.attachEvent){    
        element.attachEvent('on' + event, referenceToFunction);
    }
}

//Since IE doesn't support preventDefault
function preventReturn(event){    
    if( event.preventDefault ) {         
        event.preventDefault();         
    }
    event.returnValue = false;
}