﻿// JScript

// Create object
var Form = new FormControl();

// Object control
function FormControl() {

    // Class Private Variables
    
    // Form Elements Arrays
    this.inputs = [];
    this.labels = [];
    this.labelslength = 0;

    this.required = [];
    this.requirederror = [];

    this.groupnames = [];
    this.groupmembers = [];
    this.groupmemberslength = 0;
    this.groupnameserror = [];

    this.numbers = [];
    this.numberserror = [];

    this.emails = [];
    this.emailserror = [];

    this.dates = [];
    this.datemembers = [];
    this.datememberslength = 0;
    this.dateserror = [];
    
    // Stores attribute name value not id
    this.radiosets = [];
    this.radiosetserror = [];
    
    this.checklists = [];


    // Creator Functions -------------------------------------------------------------
    // Public Functions 
    // Add Input - Public
    this.addInput = function(id, label, GrouporRequired, specialtype) {

        if ($(id) && String($(id).type).indexOf('radio') < 0 && String($(id).type).indexOf('checklist') < 0) {
            
            this.inputs[this.inputs.length] = id;
            this.labels[id] = label;
            this.labelslength++;

            // If GrouporRequired is Bool-True then add to required
            // If GrouporRequired String then add a group
            if (GrouporRequired != null && GrouporRequired != '') {

                if (GrouporRequired.split) {
                    this.addGroupmember(GrouporRequired, id);
                }
                else if (GrouporRequired) {
                    this.required[this.required.length] = id;
                }
            }

            if (String(specialtype).indexOf('number') > -1) {
                this.addNumber(id);
            }
            if (String(specialtype).indexOf('email') > -1) {
                this.addEmail(id);
            }
        }
        else if (document.getElementsByName(id).length > 0) {

            this.inputs[this.inputs.length] = id;
            this.labels[id] = label;
            this.labelslength++;

            if (String(document.getElementsByName(id)[0].type).indexOf('radio') > -1) {
                this.radiosets[this.radiosets.length] = id;
            }
            if (String(document.getElementsByName(id)[0].type).indexOf('checklist') > -1) {
                this.checklists[this.checklists.length] = id;
            }
        }
    };

    // Add Date - Public
    this.addDate = function(DateName, label, DayID, MonthID, YearID) {

        if ($(DayID) && $(MonthID) && $(YearID)) {
            this.dates[this.dates.length] = DateName;
            this.inputs[this.inputs.length] = DateName;
            this.labels[DateName] = label;
            this.labelslength++;
            this.datemembers[DateName + 'day'] = DayID;
            this.datemembers[DateName + 'month'] = MonthID;
            this.datemembers[DateName + 'year'] = YearID;
            this.datememberslength = this.datememberslength + 3;

            // Add on blur to date elements
            $(DayID).onblur = function() {
                onblurDate(DateName);
            }
            $(MonthID).onblur = function() {
                onblurDate(DateName);
            }
            $(YearID).onblur = function() {
                onblurDate(DateName);
            }   
        }
    };
    
    // Private Functions
    // Add GroupMember - Private
    this.addGroupmember = function(Groupname, Memberid) {

        var exists = false;
        var groupmembers;

        // Check if Group already exists
        for (var i = 0; i < this.groupnames.length; i++) {
            if (this.groupnames[i] === Groupname) {
                exists = true;
            }
        }

        if (!exists) {
            this.groupnames[this.groupnames.length] = Groupname;
            this.groupnames[Groupname] = 1;
        }
        else {
            this.groupnames[Groupname]++;
        }

        this.groupmembers[Groupname + this.groupnames[Groupname]] = Memberid;
        this.groupmemberslength++;
    };

    // Add Number - Private
    this.addNumber = function(id) {
        // Array Record
        this.numbers[this.numbers.length] = id;
        // Element Events
        $(id).onkeyup = function() {
            onkeyupNumbers(this.id);
        };
    };
    
    // Add Email - Private
    this.addEmail = function(id) {
        // Array Record
        this.emails[this.emails.length] = id;
        // Element Events
        $(id).onblur = function() {
            onblurEmail(this.id);
        }
    };


    // Checking Functions ----------------------------------------------------------------

    this.allValidateRequired = function() {
        this.errorReset('required');
        var testobject;
        for (var i = 0; i < this.required.length; i++) {
            testobject = $(this.required[i]);
            if (this.validateValue(testobject.value)) {
                this.requirederror[this.requirederror.length] = testobject.id;
            }
        }
    };

    this.allValidateRadiosets = function() {
        this.errorReset('radiosets');
        var testarray = [];
        var value;
        for (var i = 0; i < this.radiosets.length; i++) {
            value = '';
            testarray = document.getElementsByName(this.radiosets[i]);
            for (var a = 0; a < testarray.length; a++) {
                if (testarray[a].checked) {
                    value += testarray[a].value;
                }
            }
            if (this.validateValue(value)) {
                this.radiosetserror[this.radiosetserror.length] = this.radiosets[i];
            }
        }
    };

    this.allValidateGroups = function() {
        this.errorReset('groups');
        var value;
        for (var i = 0; i < this.groupnames.length; i++) {
            var members = this.groupnames[this.groupnames[i]];
            value = '';
            for (var a = 1; a <= members; a++) {
                value += $(this.groupmembers[this.groupnames[i] + a]).value;
            }
            if (this.validateValue(value)) {
                this.groupnameserror[this.groupnameserror.length] = this.groupnames[i];
            }
        }
    };

    this.allValidateNumbers = function() {
        this.errorReset('numbers');
        var testobject;
        for (var i = 0; i < this.numbers.length; i++) {
            testobject = $(this.numbers[i]);
            if (this.validateNumber(testobject.value)) {
                this.numberserror[this.numberserror.length] = testobject.id;

            }
        }
    };

    this.allValidateEmail = function() {
        this.errorReset('emails');
        var testobject;
        for (var i = 0; i < this.emails.length; i++) {
            testobject = $(this.emails[i]);
            if (this.validateEmail(testobject.value)) {
                this.emailserror[this.emailserror.length] = testobject.id;
            }
        }
    };

    this.allValidateDates = function() {
        this.errorReset('dates');
        var day, month, year;

        for (var i = 0; i < this.dates.length; i++) {
            day = $(this.datemembers[this.dates[i] + 'day']).value;
            month = $(this.datemembers[this.dates[i] + 'month']).value;
            year = $(this.datemembers[this.dates[i] + 'year']).value;
            month--;

            if (this.validateDate(day, month, year)) {
                this.dateserror[this.dateserror.length] = this.dates[i];
            }
        }
    };
    
    // Validation on Value Functions -----------------------------------------

    this.validateDate = function(day, month, year) {
        return (32 - new Date(year, month, 32).getDate()) < day;   
    };
    
    this.validateNumber = function(value) {
        var bool = false;
        var valid = '0123456789+ ';
        var testchar;
        // Check characters in string
        for (var a = 0; a < value.length; a++) {
            testchar = value.charAt(a);
            if (valid.indexOf(testchar) < 0) {
                bool = true;
            }
        }
        return bool;
    };

    this.validateEmail = function(value) {
        var bool = false;
        var valid = '@.';
        if (value.length > 0) {
            // Check characters exist in string
            for (var a = 0; a < valid.length; a++) {
                testchar = valid.charAt(a);
                if (value.indexOf(testchar) < 0) {
                    bool = true;
                }
            }
        }
        return bool;
    };

    this.validateValue = function(value) {
        return String(value).indexOf('defaultselect') > -1 ? true : String(value).length < 1 ? true : false;
    };


    // Display Error Functions --------------------------------------------------------------
    this.showError = function(id, message) {
        var label = $(this.labels[id]);
        var current = $(label).innerHTML;
        if (String(current).indexOf('formerror') < 0) {
            $(label).update(current + '<br><span class="formerror">- ' + message + '</span>');
        }
    };

    this.removeError = function(id) {
        var label = $(this.labels[id]);
        var current = $(label).innerHTML;
        if (String(current).indexOf('formerror') > 0) {
            current = String(current).split("<br><span", 1);
            current = String(current).split("<BR><SPAN", 1);
            $(label).update(current);
        }
    };
    
    // Reset Errors Functions --------------------------------------------------------------

    this.errorReset = function(array) {

        switch (array) {
            case 'required':
                this.requirederror.clear();
                break;

            case 'radiosets':
                this.radiosetserror.clear();
                break;

            case 'numbers':
                this.numberserror.clear();
                break;

            case 'emails':
                this.emailserror.clear();
                break;

            case 'dates':
                this.dateserror.clear();
                break;

            case 'groups':
                this.groupnameserror.clear();
                break;

            default:
                this.requirederror.clear();
                this.radiosetserror.clear();
                this.numberserror.clear();
                this.emailserror.clear();
                this.dateserror.clear();
                this.groupnameserror.clear();
                break;
        }
    };

    // Submission Functions --------------------------------------------------------------
    this.validate = function() {

        // Validation Functions
        this.allValidateRequired();
        this.allValidateRadiosets();
        this.allValidateNumbers();
        this.allValidateEmail();
        this.allValidateDates();
        this.allValidateGroups();

        var x = this.requirederror.length + this.radiosetserror.length + this.numberserror.length + this.emailserror.length + this.dateserror.length + this.groupnameserror.length;

        if (x > 0) {
            // Required
            for (var a = 0; a < this.requirederror.length; a++) {
                this.showError(this.requirederror[a], 'required');
                $(this.requirederror[a]).onfocus = function() {
                    onfocusRequired(this.id);
                }
            }

            // Radio
            for (a = 0; a < this.radiosetserror.length; a++) {
                this.showError(this.radiosetserror[a], 'required');
                var testarray = [];
                testarray = document.getElementsByName(this.radiosetserror[a]);
                ($(testarray[0].id).getOffsetParent()).onclick = function() {
                    onclickRadio(this.id);
                }
            }

            // Email - displays automatically as well
            for (a = 0; a < this.emailserror.length; a++) {
                this.showError(this.emailserror[a], 'not a valid email');
            }

            // Number - displays automatically as well
            for (a = 0; a < this.numberserror.length; a++) {
                this.showError(this.numberserror[a], 'must be a number');
            }
            // Date - displays automatically
            // Group
            for (a = 0; a < this.groupnameserror.length; a++) {
                var groupname = this.groupnameserror[a];
                var members = this.groupnames[groupname];
                for (var i = 1; i <= members; i++) {
                    memberid = this.groupmembers[groupname + i];
                    this.showError(memberid, 'Please enter a ' + groupname);
                    $(memberid).onfocus = function() {
                        onfocusGroupMember(groupname);
                    }
                }
            }
            return false;
        }
        else {
            return true;
        }
    };
}

// Functions added

function onkeyupNumbers(id) {
    var value = $(id).value;
    if (Form.validateNumber(value)) {
        Form.showError(id, 'must be a number');
    }
    else {
        Form.removeError(id);
    }
}

function onblurEmail(id) {
    var value = $(id).value;
    if (Form.validateEmail(value)) {
        Form.showError(id, 'not a valid email');
    }
    else {
        Form.removeError(id);
    }
}

function onblurDate(datename) {
    var iday = $(Form.datemembers[datename + 'day']).value;
    var imonth = ($(Form.datemembers[datename + 'month']).value) - 1;
    var iyear = $(Form.datemembers[datename + 'year']).value;
    if (Form.validateDate(iday, imonth, iyear)) {
        Form.showError(datename, 'not a valid date');
    }
    else {
        Form.removeError(datename);
    }
}

function onfocusRequired(id) {
    Form.removeError(id);
}

function onfocusGroupMember(groupname) {
    var members = Form.groupnames[groupname];
    for (var i = 1; i <= members; i++) {
        Form.removeError(Form.groupmembers[groupname + i]);            
    }
}

function onclickRadio(id) {
    var x = $(id).firstDescendant().name;
    try {
        Form.removeError(x);
    }
    catch (err) {
    }
}
