// If you include this file, add reset_error();
// It will help reset error modification made to the page;
// If the value is empty (even for minlength and minlen), it will be valid, you need to use required (require, req).

function Validator(frmname)
{
    this.formobj = document.forms[frmname];
    if (!this.formobj)
    {
        alert("BUG: couldnot get Form object " + frmname);
        return;
    }
    if (this.formobj.onsubmit)
    {
        this.formobj.old_onsubmit = this.formobj.onsubmit;
        this.formobj.onsubmit = null;
    }
    else
    {
        this.formobj.old_onsubmit = null;
    }

    this.formobj.onsubmit = function ()
    {
        var return_val = true;
        reset_error();
        for (var itr = 0; itr < this.elements.length;itr++)
        {
            if (this.elements[itr].validationset && !this.elements[itr].validationset.validate())
            {
                return_val = false;
            }
        }

        if (this.addnlvalidation)
        {
            str = " var ret = " + this.addnlvalidation + "()";
            eval(str);
            if (return_val)
            {
                return ret;
            }
        }
        return return_val;
    };

    this.addValidation = function (itemname, descriptor, errstr)
    {
        if (!this.formobj)
        {
            alert("BUG: the form object is not set properly");
            return;
        }//if
        var itemobj = this.formobj[itemname];
        if (!itemobj)
        {
            alert("BUG: Couldnot get the input object named: " + itemname);
            return;
        }
        if (!itemobj.validationset)
        {
            itemobj.validationset = new ValidationSet(itemobj);
        }
        itemobj.validationset.add(descriptor, errstr);
    };

    this.setAddnlValidationFunction = function (functionname)
    {
        this.formobj.addnlvalidation = functionname;
    };

    this.clearAllValidations = function ()
    {
        for (var itr = 0; itr < this.formobj.elements.length; itr++)
        {
            this.formobj.elements[itr].validationset = null;
        }
    };

    this.clearLastValidation = function ()
    {
        var itr = this.formobj.elements.length - 1;
        this.formobj.elements[itr].validationset = null;
    };
}


function ValidationDesc(inputitem, desc, error)
{
    this.desc = desc;
    this.error = error;
    this.itemobj = inputitem;
    this.validate = function ()
    {
        if (!validate_data(this.desc, this.itemobj, this.error))
        {
            //this.itemobj.focus();
            return false;
        }
        return true;
    };
}

function ValidationSet(inputitem)
{
    this.vSet = [];
    this.itemobj = inputitem;

    this.add = function (desc, error)
    {
        this.vSet[this.vSet.length] = new ValidationDesc(this.itemobj, desc, error);
    };

    this.validate = function ()
    {
        var retour_val = true;
        for (var itr = 0; itr < this.vSet.length; itr++)
        {
            if (!this.vSet[itr].validate())
            {
                retour_val = false;
            }
        }
        return retour_val;
    };
}


function validate_email(email)
{
// a very simple email validation checking. you can add more complex email checking if it helps
    if (email.length <= 0)
    {
        return true;
    }
    email = email.toLowerCase();
    regex = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi|tel)$/;

    var regularexpression = new RegExp(regex);
    return regularexpression.test(email);
}


function validate_data(strValidateStr, objValue, strError)
{
    var epos = strValidateStr.search("=");
    var command  = "";
    var cmdvalue = "";
    var charpos = 0;
    var regex = "";
    var gmail = "";

    if (epos >= 0)
    {
        command  = strValidateStr.substring(0, epos);
        cmdvalue = strValidateStr.substr(epos + 1);
    }
    else
    {
        command = strValidateStr;
    }

    switch (command)
    {
    case "req":
    case "require":
    case "required":
        if (objValue.length)
        {
            myOption = -1;
            for (i = objValue.length - 1; i > -1; i--)
            {
                if (objValue[i].checked)
                {
                    myOption = i;
                    i = -1;
                }
            }
            if (myOption === -1)
            {
                eval(strError);
                return false;
            }
        }
        else
        {
            if (objValue.value.length === 0)
            {
                eval(strError);
                return false;
            }//if
        }
        break;
    case "maxlength":
    case "maxlen":
        if (objValue.value.length > cmdvalue)
        {
            eval(strError);
            return false;
        }//if
        break;
    case "minlength":
    case "minlen":
        if (objValue.value.length > 0 && objValue.value.length < cmdvalue)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "alnum":
    case "alphanum":
    case "alphanumeric":
        charpos = objValue.value.search("[^A-Za-z0-9\uff10-\uff19]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "num":
    case "numeric":
        charpos = objValue.value.search("[^0-9\uff10-\uff19]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "alphabetic":
    case "alpha":
        charpos = objValue.value.search("[^A-Za-z]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "alnumhyphen":
        charpos = objValue.value.search("[^A-Za-z0-9\uff10-\uff19_-]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "alnumhyphenonly":
        charpos = objValue.value.search("[^A-Za-z0-9\uff10-\uff19-]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
        break;

        
    case"name":
        // lowercase and uppercase characters, accentued characters ' - and space (composed names)
        // O'Connor
        // pierre-olivier
        // François
        // Giscard d'estaing
        charpos = objValue.value.search("[^a-záéíóúàèìòùäëïöüâêîôûñçþæðA-ZÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÑÇÞÆÐ\\-'\\s]");
        if (objValue.value.length > 0 && charpos >= 0)
        {
            eval(strError);
            return false;
        }//if
                
        break;

        
    case "email":
        if (!validate_email(objValue.value))
        {
            eval(strError);
            return false;
        }//if
        break;

    case "lt":
    case "lessthan":
        if (isNaN(objValue.value))
        {
            eval(strError);
            return false;
        }//if

        if (objValue.value >= cmdvalue)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "gt":
    case "greaterthan":
        if (isNaN(objValue.value))
        {
            eval(strError);
            return false;
        }//if

        if (objValue.value <= cmdvalue)
        {
            eval(strError);
            return false;
        }//if
        break;

    case "regexp":
        if (objValue.value.length > 0)
        {
            regex = new RegExp(cmdvalue);
            if (!regex.test(objValue.value))
            {
                eval(strError);
                return false;
            }//if
        }
        break;

    case "skype":
        if (objValue.value.length > 0)
        {
            if (!objValue.value.match("^([A-Za-z])([A-Za-z0-9\.,_\-]){5,31}$"))
            {
                eval(strError);
                return false;
            }//if
        }
        break;

    case "country":
        if (objValue.value.length > 0)
        {
            if (objValue.value === "??*XX" || objValue.value === "??")
            {
                eval(strError);
                return false;
            }//if
        }
        break;

    case "yim":
        if (objValue.value.length > 0)
        {
            if (!objValue.value.match("^([A-Za-z])([A-Za-z0-9\._]){0,30}([A-Za-z0-9])$"))
            {
                eval(strError);
                return false;
            }//if
            if (objValue.value.indexOf('.') !== objValue.value.lastIndexOf('.'))
            {
                eval(strError);
                return false;
            }//if
        }
        break;

    case "googletalk":
        if (objValue.value.length > 0)
        {
            if (!validate_email(objValue.value))
            {
                eval(strError);
                return false;
            }//if
            gmail = /@gmail\.com$/i;

            if (!objValue.value.match(gmail))
            {
                eval(strError);
                return false;
            }//if
        }
        break;

    case "phone":
    case "phonenumber":
    	var len = objValue.value.length;
        objValue.value = objValue.value.gsub("[^0-9\uff10-\uff19]", "");
        var newlen = objValue.value.length;
        charpos = objValue.value.search("[^0-9\uff10-\uff19]");
        if ((objValue.value.length > 0 && charpos >= 0) || (newlen == 0 && len > 0))
        {
            eval(strError);
            return false;
        }//if
        break;

    case "dontselect":
        if (objValue.selectedIndex === null)
        {
            alert("BUG: dontselect command for non-select Item");
            return false;
        }

        if (objValue.selectedIndex === parseInt(cmdvalue, 10))
        {
            eval(strError);
            return false;
        }
        break;

    }//switch
    return true;
}



