function DG_RSV_ValidatorRules (Validator) {
    var form_id = Validator.form.id;
    var rules = new Array();
    if (form_id == 'login_form' || form_id == 'login_popup_form') {
        rules.push("required,username,Du skal indtaste dit brugernavn");
        rules.push("required,password,Du skal indtaste din adgangskode");
    } else if (form_id == 'passwordreminder_form') {
        rules.push("required,username,Du skal indtaste dit brugernavn");
    } else if (form_id == 'changepassword_form') {
        rules.push("required,password,Du skal indtaste din ønskede adgangskode");
        rules.push("length=6-30,password,Din adgangskode skal være mellem 6 og 30 tegn");
        rules.push("required,password_2,Du skal indtaste din ønskede adgangskode igen");
        rules.push("same_as,password,password_2,Du har ikke indtastet det samme i begge felter");
    } else if (form_id == 'userform') {
        rules.push("function,DG_RSV_Custom.deliverydatesValid");
        rules.push("function,DG_RSV_Custom.productcountValid");
    } else if (form_id == 'order_form') {
        rules.push("required,name,Du skal indtaste dit navn");
        rules.push("required,address,Du skal indtaste din adresse");
        rules.push("required,city_zip,Du skal indtaste postnummer og by");
        rules.push("required,phone,Du skal indtaste dit telefonnummer");
        rules.push("required,email,Du skal indtaste din e-mail.");
        rules.push("valid_email,email,Din indtastede e-mail er ikke en valid email-adresse.");
        rules.push("required,delivery,Du skal indtaste først mulige leveringsdato");
        rules.push("required,lastdelivery,Du skal sidste mulige leveringsdato");
    }
    
    return rules;
}


var DG_RSV_Custom = {
    deliverydatesValid: function () {
        var strdeliverydate = $('input[name=deliverydate]').val();
        var strlastdeliverydate = $('input[name=lastdeliverydate]').val();
        var deliverydate = GetValidDateFromString (strdeliverydate);
        var lastdeliverydate = GetValidDateFromString (strlastdeliverydate);
        var testdate = new Date();
        var today = new Date(testdate.getYear(), testdate.getMonth(), testdate.getDate(), 0, 0, 0);
       
        if (!strlastdeliverydate) {
            return [[$('input[name=lastdeliverydate]'), "Indtast eller vælg en ønsket seneste leveringsdato (dd-mm-åååå)"]];
        }
        
        if (!strdeliverydate) {
            return [[$('input[name=deliverydate]'), "Indtast eller vælg en ønsket leveringsdato (dd-mm-åååå)"]];
        }
        
        if (!lastdeliverydate) {
            return [[$('input[name=lastdeliverydate]'), "Seneste leveringsdato er ikke en gyldig dato"]];
        }
        
        if (!deliverydate) {
            return [[$('input[name=deliverydate]'), "Leveringsdato er ikke en gyldig dato"]];
        }
        
        if (lastdeliverydate.getTime() < today.getTime()) {
            return [[$('input[name=lastdeliverydate]'), "Indtast eller vælg venligst en fremtidig seneste leveringsdato"]];
        }
        
        if (deliverydate.getTime() < today.getTime()) {
            return [[$('input[name=deliverydate]'), "Indtast eller vælg venligst en fremtidig leveringsdato"]];
        }
        
        if (deliverydate.getTime() > lastdeliverydate.getTime()) {
            return [[$('input[name=lastdeliverydate]'), "Indtast eller vælg venligst en seneste leveringsdato, der ligger efter tidligste leveringsdato"]];
        }
        
        if (deliverydate.getTime() > lastdeliverydate.getTime()) {
            return [[$('input[name=lastdeliverydate]'), "Indtast eller vælg venligst en seneste leveringsdato, der ligger efter tidligste leveringsdato"]];
        }
        
        if (lastdeliverydate.getDay() == 0) {
            return [[$('input[name=lastdeliverydate]'), "Seneste levering kan ikke finde sted på den valgte dato, som er søndag"]];
        }
        if (lastdeliverydate.getDay() == 6) {
            return [[$('input[name=lastdeliverydate]'), "Seneste levering kan ikke finde sted på den valgte dato, som er lørdag"]];
        }
         
        for (var i = 0; i < InvalidDates.length; i++) {
            var arrInvalidate = InvalidDates[i][0].split(" ");
            var dateStr = arrInvalidate[0];
            var dateArray = dateStr.split("-");
            var testdate = new Date(dateArray[2],dateArray[1] - 1,dateArray[0],0,0,0);
            if (testdate.toString() == lastdeliverydate.toString()) {
                var errorStr = InvalidDates[i][1];
                return [[$('input[name=lastdeliverydate]'), "Seneste levering kan ikke finde sted på den valgte dato, som er " + errorStr.toLowerCase()]];
            }
        }
        
        return false;
    },
    productcountValid: function () {
        var valid = false;
        $("#userform input").each(function () {
            if (this.id.match(/^productcount_/i)) {
                if (this.value && parseInt(this.value)) {
                    valid = true;
                } else {
                    this.value = "";
                }
            }
        });
        if (valid) return false;
        return [[$('input[name=lastdeliverydate]'), "Indtast venligst et tal i feltet \"Antal\" ud for mindst et produkt"]]; 
    }
}

function GetValidDateFromString (str) {
    var dateArray = str.split('-');
    var testdate = new Date(dateArray[2],dateArray[1] - 1,dateArray[0],0,0,0);
    var validdate = testdate;
    var date = parseFloat(dateArray[0]) || -1;
    var month = parseFloat(dateArray[1]) || -1;
    var year = parseFloat(dateArray[2]) || -1;
    if (testdate.getDate() != date ||
        testdate.getMonth() != month - 1 ||
        testdate.getFullYear() != year) {
        validdate = false;
    }
    return validdate;
}

var use_DG_Validator = 'RSV';

if (use_DG_Validator == 'RSV') {
    $(document).ready(
        function() {
            for (i in document.forms) {
                if (document.forms[i].id) {
                    var DG_Validator = new DG_RSV_Validator (document.forms[i]);
                    if (DG_Validator) {
                        if (!DG_Validator.config) {
                            DG_Validator.config = {
                                displayType: 'alert-one',
                                rules: DG_Validator.rules
                            }
                        }
                        document.forms[i].validator = DG_Validator;
                        $("#" + DG_Validator.form.id).RSV(DG_Validator.config);
                    }
                }
            }
            
        }
    );
}

function DG_RSV_Validator (f) {
    this.form = f;
    this.rules = new Array();
    this.config = (window.DG_RSV_ValidatorConfig_callback) ? new DG_RSV_ValidatorConfig_callback(this) : null;
    
    this.addRule = function() {
        var strRule = arguments[0];
        if (this.fieldExists(strRule)) this.rules.push(arguments[0]);
    }
    
    this.fieldExists = function() {
        var arrRule = (('' + arguments[0]).indexOf(",") > 0) ? arguments[0].split(",") : null;
        if (arrRule && arrRule.length >= 2) {
            var arrFieldNames = new Array(), requirement;
            for (var i = 0; i < arrRule.length; i++) {
                if (arrRule[i].indexOf('if:') == -1) {
                    requirement = arrRule[i]
                    arrFieldNames.push(arrRule[i + 1]);
                    if (requirement == 'same_as' || requirement == 'valid_date') arrFieldNames.push(arrRule[i + 2]);
                    if (requirement == 'valid_date') arrFieldNames.push(arrRule[i + 3]);
                    break;
                }
            }
            var valid = true;
            for (var i = 0; i < arrFieldNames.length; i++) {
                valid = (valid && !!this.form[arrFieldNames[i]]);
            }
            if (arrRule[0] == 'function') valid = true;
            return valid;
        } else {
            return false;
        }
    }
    
    ruledefinitions = new Array();
    if (window.DG_RSV_ValidatorRules_callback) ruledefinitions = DG_RSV_ValidatorRules_callback(this);
    if (!ruledefinitions.length) ruledefinitions = DG_RSV_ValidatorRules(this);
    for (var i = 0; i < ruledefinitions.length; i++) {
        this.addRule(ruledefinitions[i]);
    }
    
    return this;
}



