/*
    --------------------------------------------------------------
    ValidatorManager
    --------------------------------------------------------------
*/

function ValidatorManager (oErrorHandler)
{
    this.errorHandler	= oErrorHandler;
    this.validators 	= new Array ();

    this.formName		= this.errorHandler.getFormName ();
}

ValidatorManager.prototype.registerValidator = function (oValidator)
{
    this.validators[this.validators.length] = oValidator;
}



ValidatorManager.prototype.getErrorHandler = function ()
{
    return this.errorHandler;
}



ValidatorManager.prototype.execute = function ()
{
    var result = true;
    var errorHandler = this.getErrorHandler ();

    var l = this.validators.length;
    for (var i = 0; i < l; i++) {
        var v = this.validators[i];
        if (!v.execute ()) {
            errorHandler.execute (v.getFieldName(), v.getMessage());
            window.scrollTo(0, 0);
            result = false;
        } else {
		    var field = document.getElementById(v.getFieldName());
		    if (field) {
		      field.className = field.className.replace(/error/, '');
		    }
        }
    }

    return result;
}


/*
    --------------------------------------------------------------
    Validator
    --------------------------------------------------------------
*/

function Validator ()
{
    this.properties = new Array ();
}

Validator.prototype.setPropery = function (sName, sValue)
{
    this.properties[sName] = sValue;
}

Validator.prototype.getPropery = function (sName)
{
    return this.properties[sName];
}

Validator.prototype.getMessage = function ()
{
    return this.message;
}

Validator.prototype.getFieldName = function ()
{
    return this.fieldName;
}

// Override
Validator.prototype.execute = function () {}


/*
    --------------------------------------------------------------
    RequiredValidator
    --------------------------------------------------------------
*/

function RequiredValidator (sFieldName, sMessage)
{
    this.fieldName 	= sFieldName;
    this.message	= sMessage;
}

RequiredValidator.prototype = new Validator ();

RequiredValidator.prototype.execute = function ()
{
    var formField = document.getElementById (this.fieldName);

    // Look if this is a group of radio buttons or checkboxes
    //alert(formField.nodeName);
    if (formField.nodeName.toLowerCase() == 'fieldset' && formField.className.toLowerCase() == 'group') {
        // This is a group of radio buttons or checkboxes

        var cInputs = formField.getElementsByTagName ('input');
        var length = cInputs.length;

        for(var i = 0; i < length; i++) {
            if(cInputs[i].checked) {
                return true;
            }
        }

        return false;
    } else {
        // Just a normal input element
        if (!formField.value) {
            return false;
        } else {
            return true;
        }
    }
}


/*
    --------------------------------------------------------------
    CheckedValidator
    --------------------------------------------------------------
*/

function CheckedValidator (sFieldName, sMessage)
{
    this.fieldName 	= sFieldName;
    this.message	= sMessage;
}

CheckedValidator.prototype = new Validator ();

CheckedValidator.prototype.execute = function ()
{
    var formField = document.getElementById (this.fieldName);
	return formField.checked;
}



/*
    --------------------------------------------------------------
    EmailValidator
    --------------------------------------------------------------
*/

function EmailValidator (sFieldName, sMessage)
{
    this.fieldName 	= sFieldName;
    this.message	= sMessage;
}

EmailValidator.prototype = new Validator ();

EmailValidator.prototype.execute = function ()
{
    var regex = new RegExp ('/^([.0-9a-z_-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,4})$/i');
    var value = document.getElementById (this.fieldName).value;

    if (regex.test (value)) {
        return true;
    } else {
        return false;
    }
}


/*
    --------------------------------------------------------------
    CurrencyValidator
    --------------------------------------------------------------
*/

function CurrencyValidator (sFieldName, sMessage)
{
    this.fieldName 	= sFieldName;
    this.message	= sMessage;
}

CurrencyValidator.prototype = new Validator ();

CurrencyValidator.prototype.execute = function ()
{
    var regex = new RegExp ('^[-]?([1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|\.[0-9]{1,2})$');
    var value = document.getElementById (this.fieldName).value;

    if (value == '' || regex.test (value)) {
        return true;
    } else {
        return false;
    }
}

/*
    --------------------------------------------------------------
    ErrorHandler
    --------------------------------------------------------------
*/

function ErrorHandler (sFormName)
{
    this.formName = sFormName;
}


ErrorHandler.prototype.getFormName = function ()
{
    return this.formName;
}

// Override
ErrorHandler.prototype.execute = function () {}

/*
    --------------------------------------------------------------
    PopupErrorHandler
    --------------------------------------------------------------
*/

function PopupErrorHandler ()
{
    this.isFirstError = true;
}
PopupErrorHandler.prototype = new ErrorHandler ();



PopupErrorHandler.prototype.execute = function (sFieldName, sMessage)
{
    if (this.isFirstError) {
        this.isFirstError = false;
        alert (sMessage);
        document.getElementById (sFieldName).focus ();
    }
}


/*
    --------------------------------------------------------------
    ListErrorHandler
    --------------------------------------------------------------
*/

function ListErrorHandler (sFormName)
{
    this.formName = sFormName;

    // Clean de error list for resubmitting
    var ul = this.getErrorList ();

     while(ul.firstChild)
        ul.removeChild(ul.firstChild);

}
ListErrorHandler.prototype = new ErrorHandler ();


ListErrorHandler.prototype.getErrorList = function ()
{
    var f = document.getElementById (this.formName);
    var lists = f.getElementsByTagName ('ul');

    var l = lists.length;
    if (l) {
        for (var i = 0; i < l; i++) {
            var ul = lists[i];
            if (ul.className == 'errorMessages')
                break;
        }
    } else {
        var ul = document.createElement ('ul');
        ul.className = 'errorMessages';

        var c = f.firstChild;
        while (true) {
            if (c.nodeType == 1)
                break;

            c = c.nextSibling;
        }
        f.insertBefore (ul, c);
    }
    return ul;
}


ListErrorHandler.prototype.execute = function (sFieldName, sMessage)
{
    var ul = this.getErrorList ();

    var li = document.createElement ('li');
    var text = document.createTextNode (sMessage);
    li.appendChild (text);
    ul.appendChild (li);
    
    var field = document.getElementById(sFieldName);
    if (field) {
      field.className = field.className.replace(/error/, '');
      field.className += ' error';
    }
}