var formValidator = new Class({
    initialize: function(formID, errorContainer, validTypes){
        this.form = $(formID);
        this.validTypes = validTypes;
        this.formElms = this.form.elements;
        this.formFields = [];
        this.submitBtn = $$('.submit')[0];
        this.errMsg = [];
        this.isChecked = false;
        this.checkboxCount = 0;
        if($(errorContainer)){
            this.errorContainer = $(errorContainer);
            this.errorsFx = new Fx.Style($(errorContainer), 'opacity', {
                duration: 1500
            } );
            this.errorsFx.set(0);
            if(this.errorContainer.hasClass('close')){
                this.errorContainer.onclick = function(){
                    this.errorsFx.set(0);
                }.bind(this);
            }
        }
		
        for(var i=0; i<this.formElms.length; i++){
            var node = this.formElms[i].nodeName;
            var name = this.formElms[i].name;
            if( node == 'INPUT' || node == 'SELECT' || node == 'TEXTAREA'){
                if(this.formElms[i].type == 'radio'){
                    if(typeof(this.formFields[name]) == 'undefined'){
                        this.formFields[name] = [];
                        this.formFields.push(this.formFields[name]);
                    }
                    this.formFields[name].push(this.formElms[i]);
                }
                else this.formFields.push(this.formElms[i]);
            }
        }

        this.form.onsubmit = function(){
            this.errMsg = [];
            this.checkboxCount = 0;
            if(this.errorContainer) this.errorContainer.getElement('ul').empty();
            for(var i=0; i<this.formFields.length; i++){
                if((typeof(this.formFields[i]) != 'undefined') && $(this.formFields[i].parentNode) && $(this.formFields[i].parentNode).hasClass('error')) $(this.formFields[i].parentNode).removeClass('error');
            }
            
            if(this.validate()) this.form.submit();
            else {
                this.form.Submit.disabled=false;
                document.getElementById('Submit').disabled=false;
                window.location = '#top';
                this.isChecked = false;
               
                return false;
            }
        }.bind(this);
    },
    validate: function(){
        var formFields = this.formFields;
        for(var i=0, fields=this.validTypes; i<fields.length; i++){
            for(var j=0, types=fields[i]; j<types.length; j++){
                switch(types[j]){
                    case 'required':
                        this.required(formFields[i], fields[i][2], i);
                        break;
                    case 'alpha':
                        this.isAlpha(formFields[i], fields[i][2], i);
                        break;
                    case 'email':
                        this.isEmail(formFields[i], fields[i][2], i);
                        break;
                    case 'number':
                        this.isNumeric(formFields[i], fields[i][2], i);
                        break;
                    case 'alphaNumeric':
                        this.isAlphaNumeric(formFields[i], fields[i][2], i);
                        break;
                    case 'select':
                        this.isSelected(formFields[i], fields[i][2], i);
                        break;
                    case 'options':
                        this.isOptions(formFields[i], fields[i][2], i);
                        break;
                    case 'custom':
                        this.isCustom(formFields[i], fields[i][2], i);
                        break;
                }
            }
        }

    
        if(this.errMsg.length != 0 && this.errorContainer){
            for(var i=0; i<this.errMsg.length; i++){
                if(this.errMsg[i]){
                    var li = new Element('li');
                    li.setText(this.errMsg[i]);
                    this.errorContainer.getElement('ul').adopt(li);
                }
            }
        }
        if(this.errMsg.length != 0 && this.errorsFx){
            this.errorContainer.setStyle('display', 'block');
            this.errorsFx.start(0,1);
        } else if(this.errorsFx){
            this.errorsFx.set(0);
            this.errorContainer.setStyle('display', 'none');
        }
        if(this.errMsg.length == 0) return true;
        return false;
    },
    required: function(formField, errMsg, index){
        var re = /[^.*]/;
        if(re.test(formField.value)){
            return true;
        } else {
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }
    },
    isAlpha: function(formField, errMsg, index){
        var re = /[^a-zA-Z- ]/g;
        if(re.test(formField.value)){
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }	else {
            return true;
        }
    },
    isNumeric: function(formField, errMsg, index){
        var re = /[\D]/g;
        if(re.test(formField.value)){
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }	else {
            return true;
        }
    },
    isAlphaNumeric: function(formField, errMsg, index){
        var re = /[^a-zA-Z0-9- ]/g;
        if(re.test(formField.value)){
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }	else {
            return true;
        }
    },
    isEmail: function(formField, errMsg, index){
        if(formField.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1){
            return true;
        } else {
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }
    },
    isSelected: function(formField, errMsg, index){
        if(formField.value && formField.value != 0){
            return true;
        } else {
            if(!$(formField.parentNode).hasClass('error')) $(formField.parentNode).addClass('error');
            if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
            return false;
        }
    },
    isOptions: function(formField, errMsg, index){
        for(var i=0; i<formField.length; i++){
            if(formField[i].checked){
                return true;
            }
        }
        if(errMsg && errMsg != '') this.errMsg[index] = errMsg;
        return false;
    },
    isCustom: function(formField, errMsg, index){
        if(formField.checked || this.isChecked){
           	this.isChecked=true;
            return true;
        }
        this.checkboxCount++;
        if(errMsg && errMsg != '' && this.checkboxCount > 3) this.errMsg[index] = errMsg;
        return false;
    }
});


window.addEvent('domready', function(){
    if($('contact')){
        new formValidator('contact', 'errors',
            [
            ['required','alpha',['First Name']],
            ['required','alpha',['Last Name']],
            ['required','email',['Email Address']],
            ['required','number',['Phone Area Code']], ['required','number',['Phone First 3 Digits']], ['required','number',['Phone Last 4 Digits']]
            ]
            );
    }
    if($('enroll')){
        new formValidator('enroll', 'errors',
            [
            ['required','alpha',['First Name']],
            ['required','alpha',['Last Name']],
            ['required','email',['Email Address']],
            [],[],[],[],[],
            ['required','number',['Phone Area Code']], ['required','number',['Phone First 3 Digits']], ['required','number',['Phone Last 4 Digits']],
            [],[]
            ]
            );
    }
	if($('enroll_short_contact')){
        new formValidator('enroll_short_contact', 'errors',
            [
            ['required','alpha',['First Name']],
            ['required','alpha',['Last Name']],
            ['required','number',['Phone Area Code']], ['required','number',['Phone First 3 Digits']], ['required','number',['Phone Last 4 Digits']],
            ['required','email',['Email Address']],
			[]
            ]
            );
    }
    if($('surveyForm')){
        new formValidator('surveyForm', 'errors',
            [
            ['options','',['Question #1']],
            ['options','',['Question #2']],
            ['options','',['Question #3']], [], [],
            ['options','',['Question #4']],
            ['options','',['Question #5']],
            ['options','',['Question #6']],
            ['options','',['Question #7']],
            ['options','',['Question #8']],
            ['options','',['Question #9']],
            ['options','',['Question #10']]
            ]
            );
    }
    if($('careers')){
        new formValidator('careers', 'errors',
            [
            ['required','alpha',['First Name']],
            ['required','alpha',['Last Name']],
            [],[],[],[],[],[],
            ['required','phone',['Phone Number']],
            [],[],[],[],[],[],
            ['custom','',['Please check which programs you are interested in']],
            ['custom','',['Please check which programs you are interested in']],
            ['custom','',['Please check which programs you are interested in']],
            ['custom','',['Please check which programs you are interested in']]
            ]
            );
    }
});
