var ServiceForm = (function(){
    var _registration_number_input;
    var _registration_number_error;
    var _mileage_input;
    var _mileage_error;
    var _callback_fn;

    return {
        init: function(form,
                       registration_number_input, registration_number_error,
                       mileage_input, mileage_error)
        {
            _registration_number_input = registration_number_input;
            _registration_number_error = registration_number_error;
            _mileage_input = mileage_input;
            _mileage_error = mileage_error;


            var self = this;

            form.submit(function(){
                return _callback_fn(self.validate_registration_number() &&
                                    self.validate_mileage());
            });

            _registration_number_input.blur(function(){
                var value = self.format_registration_number(
                    _registration_number_input.val());

                if (value == null) {
                    _registration_number_error.show();
                }
                else {
                    _registration_number_error.hide();
                    _registration_number_input.val(value);
                }
            });

            _mileage_input.blur(function(){
                if (self.validate_mileage() == false) {
                    _mileage_error.show();
                }
                else {
                    var value = self.format_mileage(_mileage_input.val());
                    _mileage_error.hide();
                    _mileage_input.val(value);
                }
            });

        },

        submit: function(fn)
        {
            _callback_fn = fn;
        },

        validate_registration_number: function()
        {
            value = _registration_number_input.val();
            if (value == "" || value == _registration_number_input.attr('title') ||
                this.format_registration_number(value) == null) {
                return false;
            }
            return true;
        },

        validate_mileage: function()
        {
            value = _mileage_input.val();
            if (value == "" || value == _mileage_input.attr('title')) {
                return false;
            }

            if (/([\d\.])+/.test(value)) {
                value = parseInt(value.replace(/\./g, ''), 10);
                if (isNaN(value) || value <= 0)  {
                    return false;
                }
                return true;
            }
            return false;
        },

        format_registration_number: function(value)
        {
            value = value.replace(/^\s+|\s+$/g, '');
            value = value.replace(/-/g, '');
            if (value.length != 6) {
                return null;
            }

            var isdigit = function(c) {
                return ((c >= "0") && (c <= "9"))
            }

            var new_value = '';
            var num_digits = 0;
            for(var i=0; i < 6; i++) {
                if (isdigit(value.charAt(i))) { num_digits += 1; }
            }

            if (num_digits == 2 || num_digits == 4) {
                new_value = value.charAt(0) + value.charAt(1) + '-' +
                            value.charAt(2) + value.charAt(3) + '-' +
                            value.charAt(4) + value.charAt(5);
            }
            else {
                var prev_char = null;
                var curr_char;
                for (var i=0; i < 6; i++) {
                    curr_char = value.charAt(i);
                    if (prev_char != null && isdigit(curr_char) != isdigit(prev_char)) {
                        new_value += '-';
                    }
                    new_value += curr_char;
                    prev_char = curr_char;
                }
            }

            if (new_value.length != 8) {
                return null;
            }
            return new_value;
        },

        format_mileage: function(value)
        {
            if (/([\d\.])+/.test(value)) {
                value = parseInt(value.replace(/\./g, ''), 10);
                if (isNaN(value))  {
                    return null;
                }
                value = new String(value);
                var new_value = '';
                for (var j = 0, i = value.length -1; i >= 0; j++, i--) {
                    if (j > 0 && j % 3 == 0) {
                        new_value = '.' + new_value;
                    }
                    new_value = value.charAt(i) + new_value;
                }
                return new_value;
            }
            return null;
        }
    }
}());