var movable = true;
var time = 0;

var Element = {
    parse: function(target) {
        var input = [];
        jQuery(target).each(function() {
            if (jQuery(this).is("[type='checkbox']")) {
                if (jQuery(this).is(':checked')) {
                    input.push(this.name + '=' + encodeURI(this.value));
                }
            } else {
                input.push(this.name + '=' + encodeURI(this.value));
            }
        })
        return input.join('&');
    },

    checkbox: function(target) {
        jQuery(target + ' .checkbox').each(function(i, e) {
            if (jQuery(e).find('input').is(':checked')) {
                jQuery(e).addClass('checked');
            };
        });
        jQuery(target + ' .checkable').bind('click', function() {
            var input = jQuery(this).parent().find('input');
            var check = jQuery(this).parent().find('.checkbox');
            var message = jQuery(this).parent().find('.message');
            movable = true;
            if (check.hasClass('checked')) {
                check.removeClass('checked');
                input.attr('checked', false);
                if (input.hasClass('required')) {
                    message.addClass('error').show();
                }
            } else {
                check.addClass('checked');
                input.attr('checked', true);
                if (input.hasClass('required')) {
                    message.removeClass('error').show();
                }
            }
            return false;
        });
    }
}

var Engine = {

    start: function() {
        Element.checkbox('form');
        Engine.validation();
        Engine.password();
        Engine.login();
        Engine.windows();
    },

    windows: function() {
        var Flickr = new Windows();
        Flickr.close('.wflickr .terminate');
        Flickr.open('#flickr',
            function() {
                jQuery.ajax({
                    url: '/pomoc/user_window_flickr.html',
                    cache: false,
                    success: function(content){
                        Flickr.init(content);
                    }
                });
            }, function() {
                jQuery('.wflickr .content').jScrollPane({showArrows:true, scrollbarWidth: 7, arrowSize: 12, dragMaxHeight: 15, dragMinHeight: 15, scrollbarMargin: 15});
            }
        );
        var Layer = new Windows();
        Layer.close('.terminate');
        Layer.open('.help',
            function() {
                jQuery.ajax({
                    url: Layer.handler,
                    cache: false,
                    success: function(content){
                        Layer.init(content);
                    }
                });
            }
        );
    },

    login: function() {
        movable = true;
        jQuery('#login .button').click(function() {
            if (movable) {
                submitElement();
            }
            movable = false;
            return false;
        });
        jQuery('#login').submit(function() {
            if (movable) {
                submitElement();
            }
            movable = false;
            return false;
        })
        function submitElement() {
            jQuery.ajax({
                data: inputs = Element.parse('#login input'),
                timeout: 2000,
                type: "POST",
                dataType: "json",
                url: '/ajax/login/',
                cache: false,
                success: function(data) {
                    movable = true;
                    if (data.status == 'true') {
                        window.location = data.redirect;
                    } else {
                        jQuery("#login input[name='data[token]']").val(data.token);
                        jQuery('#login .message').addClass('error').empty().append('<span></span>').append(data.message).show();
                    }
                }
            });
        }
    },

    password: function() {
        var Layer = new Windows();
        Layer.close('');
        Layer.open('#reminder',
            function() {
                jQuery.get('/windows/password.thtml', function(content) {
                    Layer.init(content);
                })
            }, function() {
                movable = true;
                jQuery('#window form .proced').click(function() {
                    if (movable) {
                        submitElement();
                    }
                    movable = false;
                    return false;
                });
                jQuery('#window form').submit(function() {
                    if (movable) {
                        submitElement();
                    }
                    movable = false;
                    return false;
                })
                function submitElement() {
                    jQuery.ajax({
                        data: inputs = Element.parse('#window input'),
                        timeout: 2000,
                        type: "POST",
                        dataType: "json",
                        url: '/ajax/password/',
                        cache: false,
                        success: function(data) {
                            movable = true;
                            if (data.status == 'true') {
                                Layer.terminate();
                            } else {
                                jQuery('#window .message').empty().append(data.message);
                            }
                        }
                    });
                }
            }
        );
    },

    validation: function() {
        movable = true;
        jQuery('#create_account .button').click(function() {
            if (movable) {
                submitElement();
            }
            movable = false;
            return false;
        });
        jQuery('#create_account').submit(function() {
            if (movable) {
                submitElement();
            }
            movable = false;
            return false;
        })

        jQuery("#create_account input[name='data[password]']").bind('keyup click', function() {
            timeRequest(this, 'password', 100)
        });

        jQuery("#create_account input[name='data[username]']").bind('keyup click', function() {
            timeRequest(this, 'username', 100)
        });

        jQuery("#create_account input[name='data[password_confirm]']").bind('keyup click', function() {
            request(this, 'password_confirm')
        });

        jQuery("#create_account input[name='data[email]']").bind('keyup click', function() {
            timeRequest(this, 'email', 100);
        });

        jQuery("#create_account input[name='data[email_confirm]']").bind('keyup click', function() {
            request(this, 'email_confirm');
        });

        var tmpQuery = 'query';

        function timeRequest(element, validate, suspend) {
            clearTimeout(time);
            time = setTimeout( function() {
                request(element, validate);
            }, suspend);
        }

        function request(element, validate) {
            movable = true;
            var query = jQuery(element).val();
            if (element.keyCode === 39 || element.keyCode === 37) {
                return false;
            }
            var results = '';
            switch (validate) {
                case 'username':
                    checkUsername(query);
                    break;
                case 'email':
                    checkEmail(query);
                    break;
                case 'password':
                    checkPassword(query);
                    break;
                case 'email_confirm':
                    confirmEmail(query);
                    break;
                case 'password_confirm':
                    confirmPassword(query);
                    break;
            }
            return false;
        }

        function writeCheck(data) {
            var target = jQuery('#create_account .message_' + data.rowset);
            jQuery(target).empty().prepend('<span></span>');
            if (data.status == false) {
                jQuery(target).addClass('error').append(data.message).show();
            } else {
                jQuery(target).removeClass('error').show();
            }
        }

        function checkUsername(username) {
            var ajaxable = true;
            var data = {
                rowset: 'username',
                status: false,
                message: 'Nazwa użytkownika jest nieprawidłowa.'
            };
            if (username.match(/^[aąbcćdeęfghijklłmnńoópqrsśtuvwxyzżź0123456789]{1}([aąbcćdeęfghijklłmnńoópqrsśtuvwxyzżź0123456789]|([._-](?![._-]))){1,31}$/i)) {
                ajaxable = false;
                jQuery.getJSON('/ajax/usernameRegistered/' + username, function(output) {
                    if (output.status == 'true') {
                        data.status = true;
                    } else {
                        data.message = output.message;
                    }
                    writeCheck(data);
                });
            }
            if (ajaxable) {
                writeCheck(data);
            }
        }

        function checkEmail(email) {
            var ajaxable = true;
            var data = {
                rowset: 'email',
                status: false,
                message: 'E-mail nie może być pusty.'
            };
            if (email != null) {
                if (email.match(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i)) {
                    ajaxable = false;
                    jQuery.getJSON('/ajax/emailRegistered/' + email, function(output) {
                        if (output.status == 'true') {
                            data.status = true;
                        } else {
                            data.message = output.message;
                        }
                        writeCheck(data);
                    });
                } else {
                    data.message = 'Wprowadzony e-mail jest nieprawidłowy.';
                }
            }
            if (ajaxable) {
                writeCheck(data);
            }

        }

        function confirmEmail(email) {
            var confirm = false;
            var data = {
                rowset: 'email',
                status: false,
                message: 'Wprowadzone adresy nie pasują do siebie.'
            };
            if (email) {
                if (email == jQuery("#create_account input[name='data[email]']").val()) {
                    data.status = true;
                    confirm = true;
                }
            }
            writeCheck(data);
            if (confirm)
                checkEmail(email);
            return confirm;
        }

        function checkPassword(password) {
            var data = {
                rowset: 'password',
                status: false,
                message: 'Hasło nie może być puste.'
            };
            if (password.match(/^\ *$/i) || 6 > password.length) {
                data.message = 'Wprowadzone hasło jest za krótkie, minimum 6 znaków.';
            } else {
                data.status = true;
            }
            writeCheck(data);
        }

        function confirmPassword(password) {
            var confirm = false;
            var data = {
                rowset: 'password',
                status: false,
                message: 'Wprowadzone hasła nie pasują do siebie.'
            };
            if (password) {
                if (password == jQuery("#create_account input[name='data[password]']").val()) {
                    data.status = true;
                    confirm = true;
                }
            }
            writeCheck(data);
            if (confirm)
                checkPassword(password);
            return confirm;
        }

        function checkCheckbox(name) {
            var $input = jQuery("form input[name='" + name + "']");
            var $message = $input.parent().parent().find('.message');
            if ($input.is(':checked')) {
                $message.removeClass('error').show();
            } else {
                $message.addClass('error').show();
            }
        }

        function completeform(data) {
            for (key in data) {
                var val = eval('data.' + key);
                jQuery('#preview form').find("[name='"+key+"']").val(decodeURI(val));
            }
        }

        function submitElement() {
            function validate() {
                var data = true;
                jQuery('#create_account .message').each(function(i, e) {
                    if (jQuery(this).hasClass('error')) {
                        data = false;
                    }
                });
                return data;
            }
                movable = false;

                checkCheckbox('data[rule_01]');
                checkCheckbox('data[rule_02]');
                request("#create_account input[name='data[username]']", 'username');
                request("#create_account input[name='data[email_confirm]']", 'email_confirm');
                if (request("#create_account input[name='data[password_confirm]']", 'password_confirm')) {
                    request("#create_account input[name='data[password]']", 'password');
                }
                if (validate()) {
                    var loading = jQuery('#create_account .button');
                    loading.addClass('loading');
                    time = setTimeout( function() {
                        jQuery.ajax({
                            data: inputs = Element.parse('#create_account input'),
                            timeout: 2000,
                            type: "POST",
                            dataType: "json",
                            url: '/ajax/register/',
                            cache: false,
                            success: function(data) {
                                loading.removeClass('loading');
                                movable = true;
                                if (data.status == true) {
                                    var Layer = new Windows();
                                    Layer.close('.proced', function() {
                                        jQuery('#create_account input').each(function() {
                                            var type = this.type;
                                            if (type == 'text' || type == 'password')
                                                jQuery(this).val('');
                                            else if (type == 'checkbox' || type == 'radio')
                                                jQuery(this).attr('checked', false).parent().removeClass('checked');
                                        });
                                        jQuery('#create_account .message').removeClass('error').empty().append('<span></span>').hide();
                                    });
                                    Layer.open('#token', function() {
                                        jQuery.get('/windows/registrations.thtml', function(content) {
                                            Layer.init(content);
                                        });
                                    });
                                    Layer.projection();
                                }
                            }
                        });
                    }, 1000);
                }
                return false;
            }
    }
}
jQuery().ready(function() { Engine.start() })
