var Userevents = new Class({

    Implements: Options,

    options: {

        form:                   'userevents_form',
        //Komentavimo submit mygtukas.
        comments_submit_btn:    'userevents_comments_submit',
        //Komentavimo forma.
        comments_form:          'userevents_comments_form',
        //Komentarų konteineris.
        comments_container:     'userevents_comments_container',
        //Nuoroda visų komentarų rodymui.
        comments_showall:       'userevents_comments_showall',

        //Dalyvių forma.
        users_form:             'userevents_adduser_form',
        //Dalyvių konteineris.
        users_container:        'userevents_adduser_container',
        //Dalyvių submit buttonas.
        users_submit_btn:       'userevents_adduser_submit',

        append_name_id:         'user_name',

        append_email_id:        'user_email',

        //Dalyvavimo konteineris.
        attendance_container:   'userevents_attendance',
        //Dalyvavimo informacinių pranešimų konteineris
        attendante_info:        'userevents_attendance_message',

        //Elementų, kuriuos reik disablint klasė
        disable_class:          'form_disable',

        //Datos redagavimas.
        edit_date_btn:          'userevents_edit_date',
        edit_date_container:    'userevents_edit_date_container',
        edit_date_form:         'userevents_edit_date_form',

        //Aprašymo redagavimas.
        edit_desc_btn:          'userevents_edit_desc',
        edit_desc_container:    'userevents_edit_desc_container',
        edit_desc_form:         'userevents_edit_desc_form',

        //Vietos redagavimas.
        edit_place_btn:          'userevents_edit_place',
        edit_place_container:    'userevents_edit_place_container',
        edit_place_form:         'userevents_edit_place_form',
        edit_place_checkmap:     'userevents_check_map',



        //Ar norite informuoti vartotojus apie pakeitimus?
        msg_inform_users:       'Ar norite informuoti vartotojus apie pakeitimus?',

        info_msg_container:     'info_message',
        error_gps_container:    'gps_error',
        error_map_container:    'map_error',

        iterator:               1000,

        tooltips:               null

    },

    initialize: function(options) {
        this.setOptions(options);
    },


    initCreateForm: function() {
        if ($(this.options.form)) {
            $(this.options.form).addEvent('submit', function() {
                if (this.validatePlace() == false) {
                    return false;
                };
            }.bind(this));
        }
    },


    /**
     * Renginio dalyvių valdymas, kuriant renginį.
     */
    initCreateUsers: function() {
        if($(this.options.users_submit_btn)) {
            $(this.options.users_submit_btn).addEvent('click', function() {
                this.appendUser();
                return false;
            }.bind(this));
        }
    },


    appendUser: function() {
        var name = $(this.options.append_name_id);
        var email = $(this.options.append_email_id);

        if (email.value.clean() == "" && email.value.match("^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]{2,100}\.[a-zA-Z]{2,4}") === null) {
            //$(this.options.info_msg_container).setStyle('display', 'none');
            $('error_adduser').set('text', 'Blogas el. pa\u0161to adresas.');
            $('error_adduser').setStyle('display', 'block');
            this.show($('error_adduser'));
            setTimeout(this.hideError.bind(this), 5000);
            return false;
        }
        if (name && email) {
            name.set('disabled', 'disabled');
            email.set('disabled', 'disabled');

            var div = new Element('div', {
                'class' : 'people clearfix',
                'id'    : 'useradd_' + this.options.iterator
            });

            var span = new Element('span', {
                'text'  : name.get('value') + ' ' + email.get('value')
            });

            var img = new Element('img', {
                'src'   : 'images/x_close.gif',
                'alt'   : 'Panaikinti',
                'title' : 'Panaikinti'
            });
            var a = new Element('a', {
                'href'  : '#'
            }).addEvent('click', function() {
                div.destroy();
                return false;
            }.bind(this));

            var inputName = new Element('input', {
                'type'  : 'hidden',
                'name'  : 'users[' + this.options.iterator + '][name]',
                'value' : name.get('value')
            });

            var inputEmail = new Element('input', {
                'type'  : 'hidden',
                'name'  : 'users[' + this.options.iterator + '][email]',
                'value' : email.get('value')
            });

            span.inject(div);
            img.inject(a);
            a.inject(div);
            inputName.inject(div);
            inputEmail.inject(div);
            div.inject($(this.options.users_container), 'top');

            name.set('value', '').erase('disabled').focus();
            email.set('value', '').erase('disabled');
            this.options.iterator++;
        }
        return false;
    },


    /**
     * Renginio dalyvių formos inicijavimas.
     */
    initUsers: function() {
        if($(this.options.users_submit_btn)) {
            $(this.options.users_submit_btn).addEvent('click', function() {
                this.addUser();
                return false;
            }.bind(this));
        }
    },

    addUser: function() {
        var form = $(this.options.users_form);
        var valid = this.validateUserForm(form);
        if (valid == false) {
            return false;
        }

        if (form) {
            var ajax_href = form.get('action');
            var data = form.toQueryString() + '&action=adduser';
            var request = new Request.HTML({
                url: ajax_href,
                method: 'post',
                async: false,
                onRequest: function() {
                    $$('#' + this.options.users_form +' .' + this.options.disable_class).set('disabled', 'disabled');
                }.bind(this),
                onSuccess: function(responseTree, responseElements, responseHTML) {
                    var div = new Element('div');
                    div.innerHTML = responseHTML;
                    div.inject($(this.options.users_container), 'top');
                    $$('#' + this.options.users_form +' .' + this.options.disable_class).each( function(el) {
                        el.erase('disabled').set('value', '');
                    });
                    this.popMessage('Atlikta s\u0117kmingai');
                }.bind(this)
            }).send(data);
        }
    },


    validateUserForm: function(form) {
        $(this.options.info_msg_container).setStyle('display', 'none');
        $('error_adduser').setStyle('display', 'none');
        var valid = true;
        var email = form.getElement('input.validate_email').value;
        if (email.match("^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]{2,100}\.[a-zA-Z]{2,4}") === null) {
            valid = false;
            $('error_adduser').set('text', 'Blogas el. pa\u0161to adresas.');
            $('error_adduser').setStyle('display', 'block');
            this.show($('error_adduser'));
            setTimeout(this.hideError.bind(this), 5000);
        }



        return valid;
    },


    /**
     * Parodo informacinį pranešimą
     */
    popMessage: function(message) {
        var container = $(this.options.info_msg_container);

        if (container) {
            container.setStyle('display', 'block');
            $('error_adduser').setStyle('display', 'none');
            container.set('text', message);
            this.show(container);
            setTimeout(this.hideInfo.bind(this), 5000);
        }
    },


    /**
     * Renginio komentarų formos inicijavimas.
     */
    initComments: function() {

        if($(this.options.comments_submit_btn)) {
            $(this.options.comments_submit_btn).addEvent('click', function() {
                this.addComment();
                return false;
            }.bind(this));
        }
    },

    /**
     * Renginio komentavimas AJAX
     */
    addComment: function() {

        var form = $(this.options.comments_form);
        if (form) {
            var ajax_href = form.get('action');
            var data = form.toQueryString() + '&action=comment';
            
            var request = new Request.HTML({
                url: ajax_href,
                method: 'post',
                async: false,
                onRequest: function() {
                    $$('#' + this.options.comments_form +' .' + this.options.disable_class).set('disabled', 'disabled');
                }.bind(this),
                onSuccess: function(responseTree, responseElements, responseHTML) {
                    var div = new Element('div');
                    div.innerHTML = responseHTML;
                    div.inject($(this.options.comments_container));
                    $$('#' + this.options.comments_form +' .' + this.options.disable_class).each( function(el) {
                        el.erase('disabled').set('value', '');
                    });
                    fb_init();
                }.bind(this)
            }).send(data);
        }
    },


    /**
     * Dalyvavimo renginyje handlerio inicijavimas.
     */
    initAttendance: function(request_url, ukey) {
        if($(this.options.attendance_container)) {

            $$('#' + this.options.attendance_container + ' input').each( function(el) {

                el.addEvent('click', function() {
                    var request = new Request.HTML({
                        url: request_url,
                        method: 'post',
                        async: false,
                        data: {
                            'action': 'approve',
                            'state' : el.get('value'),
                            'ukey'  : ukey
                        },
                        onRequest: function() {
                            $(this.options.attendante_info).setStyle('display', 'none');
                        }.bind(this),
                        onSuccess: function() {
                            var user_cel = $$('#userevents_adduser_container .its_you img').pop();
                            if (user_cel) {
                                user_cel.src = 'images/state_' + el.get('value') + '.gif';
                            }
                            //$$('#userevents_adduser_container .its_you img').pop().src;

                            $(this.options.attendante_info).setStyle('display', 'block');
                        }.bind(this)
                    }).send();

                    return false;
                }.bind(this))
            }.bind(this));
        }
    },


    initEdit: function() {
        //Datos redagavimo iššaukimas
        if ($(this.options.edit_date_btn)) {
            $(this.options.edit_date_btn).addEvent('click', function() {
                var ajax_href = $(this.options.edit_date_btn).get('href');
                this.editDate(ajax_href);
                return false;
            }.bind(this));
        }

        //Datos redagavimo submitinimas
        if ($(this.options.edit_date_form)) {
            $(this.options.edit_date_form).addEvent('submit', function() {
                var ajax_href = $(this.options.edit_date_form).getProperty('action');
                this.editDate(ajax_href);
                return false;
            }.bind(this));
        }


        //Aprašymo redagavimo iššaukimas
        if ($(this.options.edit_desc_btn)) {
            $(this.options.edit_desc_btn).addEvent('click', function() {
                var ajax_href = $(this.options.edit_desc_btn).get('href');
                this.editDesc(ajax_href);
                return false;
            }.bind(this));
        }

        //Aprašymo redagavimo submitinimas
        if ($(this.options.edit_desc_form)) {
            $(this.options.edit_desc_form).addEvent('submit', function() {
                var ajax_href = $(this.options.edit_desc_form).getProperty('action');
                this.editDesc(ajax_href);
                return false;
            }.bind(this));
        }


        //Vietos redagavimo iššaukimas
        if ($(this.options.edit_place_btn)) {
            $(this.options.edit_place_btn).addEvent('click', function() {
                var ajax_href = $(this.options.edit_place_btn).get('href');
                this.editPlace(ajax_href);
                return false;
            }.bind(this));
        }

        //Vietos redagavimo submitinimas
        if ($(this.options.edit_place_form)) {
            $(this.options.edit_place_form).addEvent('submit', function() {
                var place = this.validatePlace(this.options.edit_place_form);

                if (place == true) {
                    var ajax_href = $(this.options.edit_place_form).getProperty('action');
                    this.editPlace(ajax_href);
                }
                return false;
            }.bind(this));
        }

        this.initCheckMap();
    },



    validatePlace: function() {
        var isValid     = true;
        var longitude   = $('userevents_place_longitude');
        var latitude    = $('userevents_place_latitude');

        $(this.options.error_gps_container).setStyle('display', 'none');
        $(this.options.error_map_container).setStyle('display', 'none');

        var val_long = longitude.get('value');
        var val_lat  = latitude.get('value');

        //Jei nors vienas įvestas
        if (val_long.trim() != "" || val_lat.trim() != "") {
            //Jei vienas iš jų neteisingai įvestas
            if (isNaN(val_long.toInt()) || isNaN(val_lat.toInt())) {
                $(this.options.error_gps_container).set('text', 'Teisingai u\u017epildykite abu koordina\u010di\u0173 laukus arba palikite juos tu\u0161\u010dius.');
                $(this.options.error_gps_container).setStyle('display', 'block');
                isValid = false;
            }
        }
        else {
            var city        = $('userevents_place_city');
            var street      = $('userevents_place_street');
            var housenumber = $('userevents_place_housenumber');

            var city_name = city.getSelected().get('text').clean();
            //if (city_name.clean() == "" && city.get('value') > 0) {

            if (val_long.trim() == "" && val_lat.trim() == "" && city.get('value') == ""
                && street.get('value').trim() == "" && housenumber.get('value').trim() == "") {
                $(this.options.error_map_container).set('text', '\u012eveskite adresą arba koordinates.');
                $(this.options.error_map_container).setStyle('display', 'block');
                isValid = false;
            }
        }

        return isValid;
    },
    

    editPlace: function(ajax_href) {
        var data = 'action=editplace';
        if ($(this.options.edit_place_form)) {
            data = data + '&' + $(this.options.edit_place_form).toQueryString();

            if (confirm(this.options.msg_inform_users)) {
                data = data + '&' + 'inform_users=1';
            }
        }

        var request = new Request.HTML({
            url: ajax_href,
            method: 'post',
            async: false,
            data: data,
            onSuccess: function(responseTree, responseElements, responseHTML) {
                if (responseHTML.clean().length != 0) {
                    var div = new Element('div', {
                        'styles' : {
                            'padding' : '0px',
                            'margin'  : '0px'
                        }
                    });
                    div.innerHTML = responseHTML;
                    $(this.options.edit_place_container).empty();
                    div.inject($(this.options.edit_place_container));
                    this.initEdit();
                }
            }.bind(this)

        }).send();
    },


    editDesc: function(ajax_href) {
        var data = 'action=editdesc';
        
        if ($(this.options.edit_desc_form)) {
            data = data + '&' + $(this.options.edit_desc_form).toQueryString();

            if (confirm(this.options.msg_inform_users)) {
                data = data + '&' + 'inform_users=1';
            }
        }
        var request = new Request.HTML({
            url: ajax_href,
            method: 'post',
            async: false,
            data: data,
            onSuccess: function(responseTree, responseElements, responseHTML) {
                if (responseHTML.clean().length != 0) {
                    var div = new Element('div', {
                        'styles' : {
                            'padding' : 0,
                            'margin' : 0
                        }
                    });
                    div.innerHTML = responseHTML;
                    $(this.options.edit_desc_container).empty();
                    div.inject($(this.options.edit_desc_container));
                    this.initEdit();
                }
            }.bind(this)

        }).send();
    },

    editDate: function(ajax_href) {
        var data = 'action=editdate';
        if ($(this.options.edit_date_form)) {
            data = data + '&' + $(this.options.edit_date_form).toQueryString();

            if (confirm(this.options.msg_inform_users)) {
                data = data + '&' + 'inform_users=1';
            }
        }

        var request = new Request.HTML({
            url: ajax_href,
            method: 'post',
            async: false,
            data: data,
            onSuccess: function(responseTree, responseElements, responseHTML) {
                if (responseHTML.clean().length != 0) {
                    var div = new Element('div', {
                        'styles' : {
                            'padding' : '0px',
                            'margin'  : '0px'
                        }
                    });
                    div.innerHTML = responseHTML;
                    $(this.options.edit_date_container).empty();
                    div.inject($(this.options.edit_date_container));
                    this.initEdit();
                }
            }.bind(this)

        }).send();
    },

    requestInformUsers: function(form, input, question) {
        $(form).addEvent('submit', function() {
            if (confirm(question)) {
                $(input).set('value', 1);
                return true;
            }
            else {
                $(input).set('value', 0);
                return false;
            }
        });
        return false;
    },

    initCheckMap: function() {
        if ($(this.options.edit_place_checkmap)) {
            $(this.options.edit_place_checkmap).addEvent('click', function() {
                var city        = $('userevents_place_city');
                var street      = $('userevents_place_street');
                var housenumber = $('userevents_place_housenumber');
                var longitude   = $('userevents_place_longitude');
                var latitude    = $('userevents_place_latitude');
                $(this.options.error_gps_container).setStyle('display', 'none');
                $(this.options.error_map_container).setStyle('display', 'none');

                var validPlace = this.validatePlace();
                if (validPlace == true) {
                    var url = '';
                    if (longitude && latitude) {
                        if (longitude.get('value') > 0 && latitude.get('value') > 0) {
                            url = 'http://maps.google.com/maps?f=q&hl=lt&geocode=&q=' + latitude.get('value') + 'N,' + longitude.get('value') + 'E&ie=UTF8&z=13';
                        }
                    }
                    if (url == "" && city && street && housenumber) {
                        var location = "";
                        var city_name = city.getSelected().get('text').clean();
                        if (city_name.clean() != "" && city.get('value') > 0) {
                            location = city_name;

                            if (street.get('value').clean() != "") {
                                location = location + " " + street.get('value').clean();
                            }

                            if (housenumber.get('value').clean() != "") {
                                location = location + " " + housenumber.get('value').clean();
                            }
                        }

                        url = "http://maps.google.com/maps?f=q&hl=lt&geocode=&q=" + location + ",%20Lietuva&ie=UTF8&z=15"
                    }

                    if (url != "") {
                        window.open(url);
                    }
                }

            }.bind(this));
            return false;
        }
    },

    initShowComments: function() {
        if ($(this.options.comments_showall)) {
            $(this.options.comments_showall).addEvent('click', function() {
                var ajax_href = $(this.options.comments_showall).get('href') + ',action.getcomments';
                var request = new Request.HTML({
                    url: ajax_href,
                    method: 'get',
                    async: false,
                    onSuccess: function(responseTree, responseElements, responseHTML) {
                        if (responseHTML.clean().length != 0) {
                            var div = new Element('div', {
                                'styles' : {
                                    'padding' : '0px',
                                    'margin'  : '0px'
                                }
                            });
                            div.innerHTML = responseHTML;
                            $(this.options.comments_container).empty();
                            div.inject($(this.options.comments_container));
                            fb_init();
                        }
                    }.bind(this)
                }).send();


                return false;
            }.bind(this));
        }
    },

    hideInfo: function() {
        this.hide($(this.options.info_msg_container));
    },

    hideError: function() {
        this.hide($('error_adduser'));
    },

    show: function(element_id) {
        var fx = new Fx.Slide(element_id);
        fx.slideIn('vertical');
    },

    hide: function(element_id) {
        var fx = new Fx.Slide(element_id);
        fx.slideOut('vertical');
    }
});
