﻿var registerControl = function() {
    var $mainPanel, $contentPanel, $updatePanel, $updateMsgPanel;
    var $form, $firstNameText, $surnameText, $usernameText, $passwordText, $confirmPasswordText,
        $sexSelect, $cityNameText, $cityIDHidden, $daySelect, $monthSelect, $yearSelect,
        $emailText, $cancelButton, $closeButton, $errorMessageDiv;
    var $input1, $input2, $input3;
    var _msg, _cities;

    function showPopup() {
        $form.get(0).reset();
        $form.validate().resetForm();

        $.blockUI({ message: $($mainPanel), css: { 'top': '80px', 'width': '450px'} });

        if ($input1.length > 0 && $input2.length > 0 && $input3.length > 0) {
            $firstNameText.val($input1.val());
            $surnameText.val($input2.val());
            $emailText.val($input3.val());
        }
    };

    function initCityCountry(cityName, countryID) {
        $cityNameHidden = $(cityName);
        $countryIDHidden = $(countryID);
    };

    function closePopup(callback) {
        $.unblockUI({
            onUnblock: callback
        });
        return false;
    };

    function closePopupError(e) {
        closePopup(function() {
            $contentPanel.show();
            $updatePanel.hide();
        });
    };

    function saveData() {
        var data = {
            'firstName': $firstNameText.val(),
            'surname': $surnameText.val(),
            'username': $usernameText.val(),
            'password': $passwordText.val(),
            'email': $emailText.val(),
            'sex': $sexSelect.val(),
            'cityID': $cityIDHidden.val(),
            'day': $daySelect.val(),
            'month': $monthSelect.val(),
            'year': $yearSelect.val()
        };

        var minDate = new Date();
        minDate.setFullYear(minDate.getFullYear() - 12);
        var dob = new Date($yearSelect.val(), $monthSelect.val(), $daySelect.val(), 0, 0, 0, 0);

        if ((minDate - dob) < 0) {
            $errorMessageDiv.show();
        }
        else {
            $contentPanel.hide();
            $updatePanel.show();
            $updateMsgPanel.html(_msg.RegisteringMsg);

            var regUrl = resolveUrl('~/Public/Handlers/Registration.ashx?type=register' +
            (($.query.get('refCode')) ? '&refCode=' + $.query.get('refCode') : ''));

            $.ajax({
                type: 'POST',
                url: regUrl,
                data: data,
                success: function(o) {
                    if (o.length != 0) {
                        $updateMsgPanel.html(_msg.RegisteredMsg);
                        $closeButton.bind('click', function(e) {
                            location = o;
                        }).show();
                    } else {
                        $updateMsgPanel.html('Error occur.');
                        $closeButton.bind('click', closePopupError).show();
                    }
                },
                error: function(r, s) {
                    $updateMsgPanel.html('Error occur.');
                    $closeButton.bind('click', closePopupError).show();
                }
            });
        }
    };

    function setValidation() {
        $form.validate({
            rules: {
                'control_register_firstNameText': 'required',
                'control_register_surnameText': 'required',
                'control_register_usernameText': {
                    'required': true,
                    'remote': {
                        url: resolveUrl('~/Public/Handlers/Registration.ashx?type=existsUsername')
                    }
                },
                'control_register_passwordText': 'required',
                'control_register_confirmPasswordText': {
                    'required': true,
                    'equalTo': '#control_register_passwordText'
                },
                'control_register_cityIDHidden': 'required',
                'control_register_emailText': {
                    'required': true,
                    'email': true,
                    'remote': {
                        url: resolveUrl('~/Public/Handlers/Registration.ashx?type=existsEmail')
                    }
                }
            },
            messages: {
                'control_register_firstNameText': '*',
                'control_register_surnameText': '*',
                'control_register_usernameText': {
                    'required': '*',
                    'remote': _msg.UsernameNotAvailableMsg
                },
                'control_register_passwordText': '*',
                'control_register_confirmPasswordText': {
                    'required': '*',
                    'equalTo': _msg.PasswordDontMatchMsg
                },
                'control_register_cityIDHidden': '*',
                'control_register_emailText': {
                    'required': '*',
                    'email': _msg.InvalidEmailMsg,
                    'remote': _msg.EmailAlreadyRegisteredMsg
                }
            },
            submitHandler: saveData
        });
    };

    function fillYear() {
        var year = new Date().getFullYear();

        var s = [];
        for (var i = year - 10; i >= year - 80; i--) {
            s.push('<option value=\"' + i + '\">' + i + '</option>');
        }

        $yearSelect.html(s.join(''));
    };

    function fillDay(month, year, cDay) {
        var cMonth = new Date(year, month);
        var daysInMonth = 28;
        var dateFound = false;

        while (!dateFound) {
            cMonth.setDate(daysInMonth + 1);
            var intNewMonth = cMonth.getMonth();

            if (intNewMonth != month) {
                dateFound = true;
            } else {
                daysInMonth++;
            }
        }

        var s = [];
        for (var i = 1; i <= daysInMonth; i++) {
            s.push('<option value=\"' + i + '\">' + i + '</option>');
        }

        $daySelect.html(s.join(''));
        $daySelect.find('option[value=' + cDay + ']').attr({ 'selected': true });
    };

    function setAgeDropDownList() {
        var month = parseInt($monthSelect.val());
        var year = parseInt($yearSelect.val());
        var day = parseInt($daySelect.val());

        fillDay(month - 1, year, day);
    };

    function getCityList() {
        $cityNameText.autocomplete(_cities, {
            formatItem: function(c) {
                return c.Name;
            }
        }).flushCache().trigger('blur');
    };

    return {
        init: function(msg, cities) {
            _msg = msg;
            _cities = cities;

            $mainPanel = $('#control_register_mainPanel');
            $contentPanel = $('#control_register_contentPanel');
            $updatePanel = $('#control_register_updatePanel');
            $updateMsgPanel = $('#control_register_updateMsgPanel');
            $form = $('#registrationForm');

            $firstNameText = $('#control_register_firstNameText');
            $surnameText = $('#control_register_surnameText');
            $usernameText = $('#control_register_usernameText');
            $passwordText = $('#control_register_passwordText');
            $confirmPasswordText = $('#control_register_confirmPasswordText');
            $sexSelect = $('#control_register_sexSelect');
            $cityNameText = $('#control_register_cityNameText');
            $cityIDHidden = $('#control_register_cityIDHidden');
            $daySelect = $('#control_register_daySelect');
            $monthSelect = $('#control_register_monthSelect');
            $yearSelect = $('#control_register_yearSelect');
            $emailText = $('#control_register_emailText');
            $cancelButton = $('#control_register_cancelButton');
            $closeButton = $('#control_register_closeButton');
            $errorMessageDiv = $('#errorMessageDiv');

            $input1 = $('#input1');
            $input2 = $('#input2');
            $input3 = $('#input3');

            setValidation();
            fillYear();
            setAgeDropDownList();
            getCityList();

            $monthSelect.bind('change', setAgeDropDownList);
            $yearSelect.bind('change', setAgeDropDownList);

            $cityNameText.result(function(e, data, formatted) {
                $cityIDHidden.val((data) ? data.ID : '');
            }).bind('blur', function(e) {
                $(this).search();
            });

            $cancelButton.bind('click', function(e) {
                closePopup();
            });
        },
        showPopup: showPopup,
        initCityCountry: initCityCountry
    };
} ();
