function validateForm()
{	
    if (arguments.length == 0)
        return false;
 
    var elements = document.getElementById(arguments[0]).elements;
    var errorDiv = new Object();
	errorDiv.messages = '';
    errorDiv.element = (arguments.length > 1) ?  document.getElementById(arguments[1]) :  null;
    errorDiv.addMessage = function (str) {
                if (this.element == null)
				{
					this.messages += ((this.messages != '') ? "\n":"") + str;
					return;
				}
                if (this.element.innerHTML != '') this.element.innerHTML += '<br>';
                this.element.innerHTML += str;
                
                this.element.style['display'] = 'block';
            };
	errorDiv.showErrors = function () {
				if (errorDiv.messages != '')
					alert(errorDiv.messages);
	};
    errorDiv.clearErrors = function () { if (this.element == null) return (this.messages=''); this.element.innerHTML = ''; this.element.style['display'] = 'none'; }
    
    errorDiv.clearErrors();
	
    var formIsValid = true;
    
    for (var x=0; x < elements.length; x++)
    {
        if (elements[x].type == 'hidden')
            continue;
    
        var fieldIsRequired = (elements[x].className.indexOf('required') >= 0);
        if (fieldIsRequired)
        {			
            elements[x].parentNode.className = elements[x].parentNode.className.replace(/^(.* )?error$/, '\1');        
        }
        
        var fieldIsValid = true;
        
        if (elements[x].type.indexOf('select') >= 0)
            fieldIsValid = validateCombo(elements[x], errorDiv);
        
        
        if (elements[x].className.indexOf('email') >= 0)
            fieldIsValid = validateEmail(elements[x], errorDiv);

        
        if (elements[x].className.indexOf('text') >= 0)
        {
            // text field
            fieldIsValid = validateText(elements[x], errorDiv);
        }
        
        if (elements[x].type.toLowerCase() == 'password')
        {
            // password
            fieldIsValid = validateText(elements[x], errorDiv);
        }
        
        
        
        if ( fieldIsValid == false )
        {
            elements[x].parentNode.className += " error";
            formIsValid = false;
        }
    }
    
	errorDiv.showErrors();
	
    return formIsValid;
}
function validateCombo(elem, errorDiv)
{
    if (elem.value == "")
    {
        errorDiv.addMessage(getLabel(elem.id) + ' is required.');
        return false;
    }
    return true;
}
function validateEmail(elem, errorDiv)
{
    if (elem.value.match(/[^@]+[@][^.]+\.[^.]+/) == null)
    {
        errorDiv.addMessage(getLabel(elem.id, 'Email') + ' is required.');
        return false;
    }
    return true;
}
function validateText(elem, errorDiv)
{
    // trim leading and tailing spaces
    elem.value = elem.value.replace(/^[ ]+/gm, '');
    elem.value = elem.value.replace(/[ ]+$/gm, '');
    
    //return !(elem.value.length < textMinLength(elem) || elem.value.length > textMaxLength(elem));
    
    if (elem.value.length < textMinLength(elem) || elem.value.length > textMaxLength(elem))
    {
        var errMsg = getLabel(elem.id) + ' is required';
        var minLength = textMinLength(elem);
        
        if (minLength > 0)
            errMsg += ' and must be at least ' + minLength + ' characters long';
        
        errMsg += '.';
        
        errorDiv.addMessage(errMsg);
        
        return false;
    }
    
    return true;
}
function textMinLength(elem)
{
    var minLength = document.getElementById(elem.id + '_minlength');
    if (minLength == null)
        minLength = 0;
    else
        minLength = minLength.value;
    
    return minLength;
}
function textMaxLength(elem)
{
    var maxLength = elem.maxlength;
    if (maxLength == 0 || maxLength == undefined || maxLength == null)
        maxLength = 255;
    return maxLength;
}
function getLabel(elem_id, defaultValue)
{
    var label = document.getElementById(elem_id + '_label');
    if (label != null)
        return label.value;
        
    if (defaultValue == null || defaultValue == '')
        return elem_id;
    
    return defaultValue;
} 
