/* utils */
function showElement(element, showFlag) {
    if (element && element.style) element.style.display = showFlag ? '' : 'none';
}
function show() {
    for (var i = 0; i < arguments.length; i++) {
        showElement(arguments[i], true);
    }
}
function hide() {
    for (var i = 0; i < arguments.length; i++) {
        showElement(arguments[i], false);
    }
}

/* check */

var reg_checkers = new Array();
var reg_checker_enabled = false;

function reg_checker(field_id, error_id) {
    var field_obj = document.getElementById(field_id);
    var error_obj = document.getElementById(error_id);
    if (!field_obj || !error_obj) {
        return false;
    }
    this.f = field_obj;
    this.f.checker = this;
    this.e_obj = error_obj;
    this.failed = 0;
    this.e_obj.innerHTML = '';
}
reg_checker.prototype.can_show_error = true;
reg_checker.prototype.failed = false;
reg_checker.prototype._validate = function() {
    return true;
}
reg_checker.prototype.validate = function() {
    this._validate();
    if ((this.e_obj.innerHTML != '') && this.can_show_error) {
        show(this.e_obj);
    } else {
        hide(this.e_obj);
    }
    return this.failed;
}

function _add_event(obj, prop, func) {
    var old = obj[prop];
    if (!old) {
        obj[prop] = function() {
            func.call(obj);
        };
    } else {
        obj[prop] = function() {
            old.call(obj);
            func.call(obj);
        };
    }
}

function _reg_required_input(f_id) {
    var c_obj = new reg_checker(f_id, f_id + '_error');
    if (c_obj.f) {
        c_obj._validate = function() {
            if (this.f.value == '') {
                this.failed = 1;
                this.e_obj.innerHTML = "This field is required.";
            } else {
                this.failed = 0;
                this.e_obj.innerHTML = '';
            }
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

function _additional_emails_checker_init() {
	for (var i = 0; i < 5; i++) {
		var c_obj = new reg_checker('emails[' + i + ']', 'email_errors[' + i + ']');
    	if (c_obj.f) {
    		c_obj._validate = function() {
    			var email = this.f.value;
    			var r = /^[\w!.%+-]+@[\w-]+(?:\.[\w-]+)+$/;
    			if (email != '' && !r.test(email)) {
    				this.failed = 1;
    				this.e_obj.innerHTML = "Please enter a valid e-mail address.";
    			} else {
    				this.failed = 0;
    				this.e_obj.innerHTML = '';
    			}
    		};
    		_add_event(c_obj.f, 'onchange', function() {
    			this.checker.validate();
    		});
    		reg_checkers.push(c_obj);
    	}   	
    }
}

function _req_email_checker_init() {
	var c_obj = new reg_checker('email', 'email_error');
    if (c_obj.f) {
        c_obj._validate = function() {
            var email = this.f.value;
            var r = /^[\w!.%+-]+@[\w-]+(?:\.[\w-]+)+$/;
            if (email == '') {
                this.failed = 1;
                this.e_obj.innerHTML = "This field is required.";
            } else if (!(r.test(email))) {
                this.failed = 1;
                this.e_obj.innerHTML = "Please enter a valid e-mail address.";
            } else {
                this.failed = 0;
                this.e_obj.innerHTML = '';
            }
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

function _reg_older_checker_init() {
	var c_obj = new reg_checker('is_older', 'is_older_error');
    if (c_obj.f) {
        c_obj._validate = function() {
            var checked = this.f.checked;
            if (checked) {
           	   this.failed = 0;
               this.e_obj.innerHTML = '';
            } else {
           	   this.failed = 1;
               this.e_obj.innerHTML = 'This field should be checked';
            }
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

function _reg_sum_checker_init() {
    var c_obj = new reg_checker('sum', 'sum_error');
    if (c_obj.f) {
        c_obj._validate = function() {
            var sum = this.f.value;
            var answ = document.getElementsByName('answ')[0].value;
            if (sum == ''){
                this.failed = 1;
                this.e_obj.innerHTML = "This field is required.";
            } else if (sum != answ) {
                this.failed = 1;
                this.e_obj.innerHTML = "Wrong sum. Try again, please.";
            } else {
                this.failed = 0;
                this.e_obj.innerHTML = '';
            }
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

function _req_pswd_checker_init(required) {
	var c_obj = new reg_checker('password', 'password_error');
    if (c_obj.f && (c_obj.first_name = document.getElementById('first_name')) && (c_obj.last_name = document.getElementById('last_name'))) {
        c_obj._validate = function() {
            function is_password_weak(password, name) {
                if (password == 'meadmap' || password == 'password' || password == '123456') {
                    return true;
                }
                if (name) {
                    var name_elements = name.toLowerCase().split(" ");
                    for (var i = 0; i < name_elements.length; i++) {
                        var elt = name_elements[i];
                        if (elt == password) {
                            return true;
                        }
                    }
                }
                return false;
            }
            var r = new RegExp("[\<|\>|\"|\'|\%|\;|\(|\)|\&|\+]", "i");
            var pw = this.f.value.toLowerCase();
            if (pw == '' && !required) {
				this.failed = 0;
                this.e_obj.innerHTML = '';
			} else if (pw == '') {
			    this.failed = 1;
                this.e_obj.innerHTML = "This field is required.";
            } else if (pw.length < 1) {
                this.failed = 1;
                this.e_obj.innerHTML = "Your password must be at least 1 character long.";
            } else if (is_password_weak(pw, this.first_name.value + " " + this.last_name.value)) {
                this.failed = 1;
                this.e_obj.innerHTML = "Please choose a more secure password.";
            } else if (r.exec(pw)) {
                this.failed = 1;
                this.e_obj.innerHTML = "Your password must contain letters and digits only.";
            } else {
                this.failed = 0;
                this.e_obj.innerHTML = '';
            }
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

function _reg_verify_pswd_checker_init(required){
	_req_pswd_checker_init(required);
	var c_obj = new reg_checker('verify_pass', 'verify_pass_error');
    if (c_obj.f && (c_obj.password = document.getElementById('password'))) {
        c_obj._validate = function() {
            var pw = this.f.value;
			if (pw != this.password.value) {
                this.failed = 1;
                this.e_obj.innerHTML = "Password and verification do not match.";
            } else if (pw == '' && required) {
				this.failed = 1;
                this.e_obj.innerHTML = "This field is required.";
			} else {
				this.failed = 0;
                this.e_obj.innerHTML = '';
			}
        };
        _add_event(c_obj.f, 'onchange', function() {
            this.checker.validate()
        });
        reg_checkers.push(c_obj);
    }
}

/*function _reg_country_checker_init(f_id, error_id) {
	var c_obj = new reg_checker(f_id, error_id);
	if (c_obj.f) {
		c_obj._validate = function() {
			var selectedCountry = (this.f.options != null) ? this.f.options[this.f.selectedIndex] : this.f;
			var country = selectedCountry.value;
			if (country == '') {
				this.failed = 1;
				this.e_obj.innerHTML = "This field is required.";
			} else {
				this.failed = 0;
				this.e_obj.innerHTML = '';
			}
		}
		_add_event(c_obj.f, 'onchange', function() {
			this.checker.validate()
		});
		reg_checkers.push(c_obj);
	}
}*/

function _reg_checker_init() {
	_reg_required_input('first_name');
    _reg_required_input('last_name');
    _reg_older_checker_init();
    _req_email_checker_init();
    _req_pswd_checker_init(true);
    //_reg_country_checker_init('params[country]', 'country_error');
    _reg_sum_checker_init();
}

function _edit_details_checker_init() {
	_reg_required_input('first_name');
    //_reg_required_input('last_name');
	_req_email_checker_init();
	_additional_emails_checker_init();
	_reg_verify_pswd_checker_init(false);
	//_reg_country_checker_init('params[country]', 'country_error');
}

function _reg_submit_check() {
	var failures = new Array();
    for (var i = 0; i < reg_checkers.length; i++) {
        var c_obj = reg_checkers[i];
        c_obj.can_show_error = true;
        c_obj.validate();
        if (c_obj.failed) {
            failures.push(c_obj.field);
        }
    }
    return failures;
}
function reg_submit_check() {
    var failures = _reg_submit_check();
    return !failures.length;
}
function reg_checker_init() {
    _reg_checker_init();
    /* TODO:
     _add_event(document.getElementById('email'), 'onchange', function() {
         check_username(this.value);
     });
     */
    reg_checker_enabled = true;
}

function details_checker_init() {
	_edit_details_checker_init();
	reg_checker_enabled = true;
}
