/*
 * Компонент Validator, проверяет поля заданной формы
 * Поля помечаются классами:
 * v_required - обязательное поле
 * v_email - email
 * v_password - пароль
 * v_double - сравнивает с полем {name}_double, должно совпадать
 * 
 * Название поля хранится в свойствах alt или title 
 */
Lang = {
    'email':{'ru':'Введите корректный E-mail',
             'eng':'Please enter a valid email address.'},
    'password':{'ru':'Пароль должен содержать не меньше 6 символов',
                'eng':'The password you provided must have at least 6 characters.'},
    'doublepass':{'ru':' должны совпадать',
                  'eng':' should match'},
    'phone':{'ru':'Введите корректный телефонный номер',
             'eng':'Please enter a valid telephone number.'},
    'field':{'ru':'Поле',
             'eng':'Field'},
    'not_empty':{'ru':'должно быть заполнено',
                'eng':"can't be blank"},
    'correct_price':{'ru':'Укажите корректную цену',
                     'eng':'Please enter a valid price.'},
    'choise':{'ru':'Выберите',
        'eng':'Choose'},
    'incorr_date':{'ru':'содержит неверную дату',
        'eng':'has invalid date'},
    'incorr_chapter':{'ru':'Неверное указан номер главы в поле',
        'eng':'Please enter a valid chapter number.'},
    'incorr_filetype': {'ru':'Неверный формат файла.',
        'eng':'Invalid file format'}
}


Validator = {
    validate: function(form_el, validate_one) {
        this.lang = (j$.cookie('lang'))? j$.cookie('lang') : 'ru';
        if (validate_one) {
            this.validate_one = true;
        }
        else {
            this.validate_one = false;
        }
        this.form_el = form_el;
        this.status = true;
        this.messages = [];
        form_el.select('[class*="v_"]').invoke('removeClassName', 'wrong');
        form_el.select('[class*="v_"]').each(this.check.bind(this));
        
        this.error_message = this.messages.join('<br />');

        return this.status;
    },
    
    check: function(el) {
        this.status &= this.check_el(el);
    },
    
    check_el: function(el) {
        if (el.hasClassName('ignore')) return true;
        
        var value = el.value;
        var field = '';
        if (el.alt) field = el.alt; else field = el.title;

        if (el.hasClassName('v_email') && !(/^[a-z\d](?:[\w\.-]*[a-z\d])*@(?:[a-z\d](?:[a-z\d-]*[a-z\d])*\.)+[a-z]{2,4}$/i.test(value))) {
            return this.wrong(el, Lang.email[this.lang]);
        }  
        
        if (el.hasClassName('v_password') && !(value.length > 5)) {
            return this.wrong(el, Lang.password[this.lang]);
        }  

        if (el.hasClassName('v_phone') && (!value.blank())&&!(/[+,(,)]{0,1}[0-9]$/.test(value))) {
            return this.wrong(el, Lang.phone[this.lang]);
        }
        
        if (el.hasClassName('v_smsphone') && (!value.blank())&&!(/^[7]{1}[0-9]{10}$/.test(value))) {
            return this.wrong(el, 'Некорректный формат номера, обратите внимание на пример');
        }        
        
        if (el.hasClassName('v_double')) {
            var doubl = this.form_el[el.name + '_double'];
            if (doubl.value != el.value) {
                return this.wrong(doubl, doubl.alt + Lang.doublepass[this.lang]);
            }
        }
           
        if (el.hasClassName('v_required') && !(!value.blank())) {
            return this.wrong(el, Lang.field[this.lang] + ' «' + field + '» ' + Lang.not_empty[this.lang]);
        }
		
		if (el.hasClassName('v_price') && (!value.blank())&&!(/^[0-9]{0,6}$/.test(value))) {
            return this.wrong(el, Lang.correct_price[this.lang]);
        }
		
		if(el.hasClassName('v_num')&&(!value.blank())&&!(/[1-9]/.test(value))) {
			return this.wrong(el, Lang.incorr_chapter[this.lang] + ' «' + field+ '»');
		}

        if (el.hasClassName('v_date') || el.hasClassName('v_date_0') || el.hasClassName('v_date_1')) {
            if (!this.correct_date(value)) {
                return this.wrong(el, Lang.field[this.lang] + ' «' + field+ '» ' + Lang.incorr_date[this.lang]);
            }
        }

        if (el.hasClassName('v_date_0')) {
            var end = this.form_el.select('.v_date_1');
            if (this.correct_date(end[0].value) && this.correct_date(value)) {
                var arrD1 = value.split(".");
                var arrD2 = end[0].value.split(".");
                arrD1[1] -= 1;
                arrD2[1] -= 1;
                var d1 = new Date(arrD1[2], arrD1[1], arrD1[0]);
                var d2 = new Date(arrD2[2], arrD2[1], arrD2[0]);
                if (d1.valueOf() > d2.valueOf()) { 
                    return this.wrong(el, 'Указан неверный интервал дат');
                }
            }
        }
        
        if (el.hasClassName('v_required_radio')) {          
            return this.wrong(el, Lang.choise[this.lang] + ' ' + field+'!');
        }
        
        if (el.hasClassName('v_file_extension')&&value==-1) {      
            return this.wrong(el, Lang.incorr_filetype[this.lang]);
        }
        
        return true;
    },
    
    correct_date: function(value) {
        var arrD = value.split(".");
        arrD[1] -= 1;
        var d = new Date(arrD[2], arrD[1], arrD[0]);
        if (!((d.getFullYear() == arrD[2]) && (d.getMonth() == arrD[1]) && (d.getDate() == arrD[0]))) {
            return false;
        }
        else {
            return true;
        }
    },    
    
    wrong: function(el, message) {
        if (!this.validate_one || this.messages.length == 0) {
            el.addClassName('wrong');
            this.messages.push(message);
        }        
        return false;
    },
    
    clear: function() {
        this.form_el.select('[class*="v_"]').invoke('removeClassName', 'wrong');
    }
    
    
}
