// Odeslani formulare a nasledne provedeni akci podle odpovedi.
// Vyzaduje jQuery 1.4 (http://jquery.com/)
var SubmitAjaxForm = function(formId, url, successText) {
    // id formulare, napr. 'inline-form'
    this.formId = null;
    // url pro odeslani formulare
    this.url = null;
    // text zobrazeny po uspesnem odeslani formulare
    // - nepovinne pri definovani vlastni funkce 'success'
    this.successText = null;
    // zabraneni vicenasobneho odeslani formulare
    this.submited = false;

    // constructor
    this.init = function(formId, url, successText) {
        this.formId = formId;
        this.url = url;
        this.successText = successText;

        this.initAjax();
    }

    // inicializace AJAXu
    this.initAjax = function() {
        var that = this;

        $('#'+this.formId).submit(function(event) {
            event.preventDefault();

            var fields = $('#'+that.formId+' :input').serializeArray();

            $.ajax({
                type: "POST",
                url: that.url,
                data: fields,
                beforeSend: function(request) {
                    if(that.submited == true) {
                        return false;
                    }
                    that.ajaxBeforeSend(request);
                },
                success: function(data, textStatus, request) {
                    // decode JSON
                    data = eval("(" + data + ")");

                    if(data == true) {
                        that.success(textStatus, request);
                    } else {
                        that.errors(data, textStatus, request);
                    }
                },
                error: function(request, textStatus, error) {
                    that.ajaxError(request, textStatus);
                },
                complete: function(request, textStatus) {
                    that.ajaxComplete(request, textStatus);
                }
            });
        });
    }

    // pred odeslanim pozadavku
    this.ajaxBeforeSend = function(request) {
        var submit = $('#'+this.formId+' :submit').first();
        this.submited = true;
        $(submit).attr('disabled', 'disabled');
    }

    // uspesne zpracovani formulare
    this.success = function(textStatus, request) {
        $('#'+this.formId).hide('slow');
        var id = this.formId+'-success';
        $('#'+this.formId).before('<div id="'+id+'" class="success">'+this.successText+'</div>');
    }

    // nevalidni formular
    this.errors = function(data, textStatus, request) {
        this.clearFormErrors();
        this.showErrors(data);
    }

    // chyba pri AJAX komunikaci
    this.ajaxError = function(request, textStatus) {
        var id = this.formId+'-'+$(this).attr('id')+'-error-ajax';
        var text;
        try{
            text = 'Ajax error ('+textStatus+': '+request.status+': '+request.statusText+')!';
        } catch(e) {
            text = 'Ajax error ('+textStatus+')!';
        }
        if($('#'+id).attr('id') == null) {
            $('#'+this.formId).after('<div id="'+id+'" class="errors">'+text+'</div>');
        } else {
            $('#'+id).html(text);
        }
    }

    // po vraceni odpovedi (pro success i error)
    this.ajaxComplete = function(request, textStatus) {
        var submit = $('#'+this.formId+' :submit').first();
        $(submit).removeAttr('disabled');
        this.submited = false;
        this.ajaxCompleteAfter(request, textStatus);
    }

    // po provedeni ajaxComplete()
    this.ajaxCompleteAfter = function(request, textStatus) {
    }

    // pridani a vymazani chybovych DIVu
    this.clearFormErrors = function() {
        elems = $('#'+this.formId+' :input');
        var that = this;
        elems.each(function(i) {
            if($(this).is(':visible')) {
                var id = that.formId+'-'+$(this).attr('id')+'-error';
                if($('#'+id).attr('id') == null) {
                    $(this).parent().append('<div id="'+id+'"></div>');
                } else {
                    $('#'+id).html('');
                    $('#'+id).removeClass('errors').hide();
                }
            }
        });
    }

    // zobrazeni chyb v DIVech
    this.showErrors = function(data) {
        for(elem in data) {
            var id = '#'+this.formId+'-'+elem+'-error';
            if(data[elem] != '') {
                $(id).html(data[elem].toString());
                $(id).addClass('errors').slideDown('fast').delay(1000);
            }
        }
    }

    // call constuctor
    this.init(formId, url, successText)
};

// Zobrazeni formulare v samostatnem okne pomoci Colorboxu
// Vyzaduje jQuery 1.4 (http://jquery.com/), Colorbox 1.3.6 (http://colorpowered.com/colorbox/)
var ColorboxInlineForm = function(inlineId, formId) {
    // inline form ID
    this.inlineId = null;
    // form ID
    this.formId = null;

    // constructor
    this.init = function(inlineId, formId) {
        var that = this;

        this.inlineId = inlineId;
        this.formId = formId;

        // init Colorbox
        $(document).ready(function() {
            $("a[rel='inlineForm["+that.formId+"]']").colorbox({
                inline:true,
                href:"#"+that.inlineId,
                scrolling:false,
                onOpen: function() {
                    // hide Object, Embed, Iframe when gallery open
                    $("object").css("visibility", "hidden");
                    $("embed").css("visibility", "hidden");
                    $("iframe").css("visibility", "hidden");
                },
                onClosed:function() {
                    // clean the form after popup close
                    $("#"+that.formId+"-success").remove();
                    $("#"+that.formId+" .errors").remove();
                    $("#"+that.formId)[0].reset();
                    $("#"+that.formId).show(0);
                    // show Object, Embed, Iframe when gallery closed
                    $("object").css("visibility", "visible");
                    $("embed").css("visibility", "visible");
                    $("iframe").css("visibility", "visible");
                }
            });
        });
    }

    // call constructor
    this.init(inlineId, formId)
};
